您的位置:首页 > 编程语言 > C语言/C++

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

2016-04-25 17:28 639 查看
对于初学者来说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 =
4000
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语言