21:最长最短单词
总时间限制:1000ms 内存限制:65536kB
描述
输入1行句子(不多于200个单词,每个单词长度不超过100),
只包含字母、空格和逗号。单词由至少一个连续的字母构成,
空格和逗号都是单词间的间隔。
试输出第1个最长的单词和第1个最短单词。
输入
一行句子。
输出
两行输出:
第1行,第一个最长的单词。
第2行,第一个最短的单词。
样例输入
I am studying Programming language C in Peking University
样例输出
Programming
I
提示
如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。
分析:
这个题目思路是这样:先用gets函数输入整行字符串a,然后扫描a串分割出各个单词,依次比较新分割的单词的长度是否比已经发现的单词中最长、最短单词还要长或短,若是有需要在更新一经发现的最长、最短单词并更新最长、最短单词的长度。
这里关键是扫描、分割单词。由于空格和逗号都是单词的分隔符号,所以可以把他们两种符号一起处理。扫描分割的过程需要用标志性变量f。f=0表示当前遇到的分隔符(空格或逗号)是新单词之前的分隔符; f=1表示当前遇到的分隔符前面有一个刚刚扫描形成的单词,也就是已经扫描分割出一个单词,需要对该单词做处理(求长度newLen,用newLen和max、min比较)。注意:在处理完一个单词后需要把f重新设为0.
还要注意:输入的串的开头、结尾可能有分隔符,也可能没有分隔符。所以末尾单词不一定被拿来跟max和min作比较。需要在循环后单独处理。
代码如下:
1 #include<stdio.h> 2 #include<string.h> 3 int main(int argc, char *argv[]) 4 { 5 char a[20005],b[105],maxT[105]="",minT[105]=""; 6 int i,j; 7 int max=-1,min=105,newLen;//表示当前已经发现的最长、最短单词的长度 8 int f; 9 10 freopen("21.in","r",stdin); 11 gets(a); 12 i=0; 13 j=0; 14 f=0; // f=0表示当前遇到的分隔符(空格或逗号)是新单词之前的分隔符 15 while(a[i]!='\0')//扫描a串生成一个新的单词,然后测其长度,再与max、min对比 16 { 17 if(a[i]==' '||a[i]==',') 18 { 19 if(f==1)// f=1表示当前遇到的分隔符前面有一个刚刚扫描形成的单词 20 { 21 b[j]='\0'; 22 newLen=strlen(b); 23 if(newLen>max) { max=newLen; strcpy(maxT,b); } 24 if(newLen<min) { min=newLen; strcpy(minT,b); } 25 f=0; 26 j=0; 27 } 28 } 29 else 30 { 31 b[j]=a[i]; 32 j++; 33 f=1;//开始或是正在构造一个单词 34 } 35 i++; 36 } 37 38 //处理末尾单词 39 b[j]='\0'; 40 newLen=strlen(b); 41 if(newLen>max) { max=newLen; strcpy(maxT,b); } 42 if(newLen<min) { min=newLen; strcpy(minT,b); } 43 44 printf("%s\n%s\n",maxT,minT); 45 return 0; 46 }
输入案例:
,,,,,,,,,,,,,,,,,,,,,, I am studying Programming,,,,,, languagefff C in Peking Universityddddddd
输出案例:
Universityddddddd
I