杭电2024 2025 2026(关于while,gets循环的一些技巧)

对于初学者来说poj或者是杭电上的题目经常要用到while()循环。
根据下面两道题可以一谈。
杭电2024:
Problem Description
输入一个字符串,判断其是否是C的合法标识符。
Input
输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串。

Output
对于每组输入数据,输出一行。如果输入数据是C的合法标识符,则输出”yes”,否则,输出“no”。

Sample Input
3
12ajf
fi8x_a
ff ai_2

Sample Output
no
yes
no

看题很简单,关键在于输入与输出。对于输入不能用scanf()函数,因为输入包括了空格,所以要用gets()函数,gets函数可以把空格也保存进数组。但是对于gets函数要注意回车键。下面有两种处理方式。
1:

#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
    char a[55];
    int n;
    scanf("%d",&n);
    getchar();//可以消除回车键对gets的影响
    while(n--)
    {
        int t,flag = 1;
        gets(a);
        if(!isalpha(a[0]) && a[0]!='_')//函数isalpha判断a[0]是否为字母,是返回1,否返回0,头文件是<ctype.h>
        {
            printf("no\n");
            continue;
        }
        t = strlen(a);
        for(int i = 1;i < t; i++)
        {
            if(!isalnum(a[i]) && a[i]!='_') //作用和isalpha类似,判断是否为字母或数字
                flag = 0;
        }
        if(flag == 1)
            printf("yes\n");
        else if(flag == 0)
            printf("no\n");
    }
 // getchar(); 在电脑上可以暂停以便看答案
    return 0;
}

2:

#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
    char a[55];
    int n;
    scanf("%d\n",&n);  //可以在scanf()里面加入\n,表示为回车
    while(n--)
    {
        int t,flag = 1;
        gets(a);
        if(!isalpha(a[0]) && a[0]!='_')
        {
            printf("no\n");
            continue;
        }
        t = strlen(a);
        for(int i = 1;i < t; i++)
        {
            if(!isalnum(a[i]) && a[i]!='_')
                flag = 0;
        }
        if(flag == 1)
            printf("yes\n");
        else if(flag == 0)
            printf("no\n");
    }
 // getchar();
    return 0;
}

杭电 2025

while()函数对于scanf(“%d”,&a) != EOF经常用的但是局限于数对于字符则有。
~scanf()函数的返回值是成功读取变量的个数,这里可能返回是1或0,当返回0时,~0为真,则继续循环,所以该循环的意思是,直到成功读取一个字符串时,才结束循环。

Problem Description
对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”。
Input
输入数据包括多个测试实例,每个实例由一行长度不超过100的字符串组成,字符串仅由大小写字母构成。
Output
对于每个测试实例输出一行字符串,输出的结果是插入字符串“(max)”后的结果,如果存在多个最大的字母,就在每一个最大字母后面都插入”(max)”。

Sample Input

abcdefgfedcba
xxxxx

Sample Output

abcdefg(max)fedcba
x(max)x(max)x(max)x(max)x(max)

#include<stdio.h>
#include<string.h>
int main()
{
    char a[105];
    while(~scanf("%s",a))  //若没有~则会一直输入
    {
        int i,j;
        char max;
        j = strlen(a);
        max = a[0];
        for(i = 0;i < j; i++)
        {
            if(a[i] > max)
                max = a[i];
        }
        for(i = 0;i < j; i++)
        {
            if(a[i] == max )
                printf("%c(max)",a[i]);
            else
                printf("%c",a[i]);
        }
        printf("\n");
    }
    return 0;
}

杭电 2026
Problem Description
输入一个英文句子,将每个单词的第一个字母改成大写字母。

Input
输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行。

Output
请输出按照要求改写后的英文句子。
Sample Input

i like acm
i want to get an accepted

Sample Output

I Like Acm
I Want To Get An Accepted

对于gets注意回车即可。

#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
    char a[100];
    while(gets(a))// 除了输入字符串和回车没有其它操作。
    {
        int j = strlen(a);
        int i,t = 1;
        for(i = 0;i < j; i++)
        {
            if(t == 1)
                {
                    a[i] = a[i] - 32;
                    t = 0;
                }
            if(!isalpha(a[i]))
                t = 1;
        }
        puts(a);
    }
    return 0;
}

你可能感兴趣的:(C语言,杭电)