1.请编写一个程序,从键盘输入若干单词(每个单词一行),找出最长的单词
问题分析: 根据题意要求,需要两个数组str[80],maxstr[80],一个用来保存每次输入的单词str[80],另一个用来保存最长的单词maxstr[80],每次从键盘输入一个新单词,我们就把这个新单词和目前已知最长的单词比较,如果发现新单词更长,就把这个新单词拷贝到用来保存最长的单词的数组中maxstr[80].
解决这个问题的基本步骤如下:
1、 定义两个数组char str[80],maxstr[80];定义目前已知最长的单词的长度,定义每次输
入的单词的长度int max=0,len=0.
2、 从键盘取得单词(使用函数),获得长度len,判断max小于len,如真,拷贝,如
假,再取下一个.
3、 查看获得长度len是否大于0,如真,转到步骤2,如假,转到步骤4
4、 把这个最大字符maxstr[80]输出来.
答案:
#include
#include
main()
{ char str[80],maxstr[80];
int max=0,len;
do{
printf("Enter a string:");
gets(str);
len=strlen(str);
if(len>max){
strcpy(maxstr,str);
max=len;
}
}while(len>0);
printf("The max string is %s\n",maxstr);
}
2.请编写一个程序,输入一个文本行,其中包含多个单词,请计算其中最长的单词长度。
问题分析:根据题意要求,首先需要一个数组来保存文本行str[256],两个数组,maxword[256],一个用来保存要考察的每个单词word[256],另一个用来保存最长的单词maxword[256],从文本行里遍历每个单词,并把它放到数组word[256]中,下面的就和上一题相同了,我们就把这个新单词和目前已知最长的单词比较,如果发现新单词更长,就把这个新单词拷贝到用来保存最长的单词的数组中maxword[256],注意每次把新单词拷贝到数组中maxword[256]前,要先对它清零.
答案:
#include
#include
void main( )
{ char str[256],word[256],maxword[256];
int k=0,wordlen,maxlen=0,n;
gets(str);
while(str[k]!='\0'){
wordlen=0; n=0;
while(str[k]==' ') k++;
while(str[k]!='\0' && str[k]!=' '){
wordlen++; word[n++]=str[k++];
}
word[n]='\0';
if(maxlen
maxlen=wordlen; strcpy(maxword,word);
}
}
printf("The max word is %s, len=%d\n",maxword,maxlen);
}
3.请编写一个程序,判断通过键盘输入的字符串是否表示一个合法的标识符。标识符的命名规则是:第一个字符必须是字母或下划线(_),后面可以跟随字母、数字或下划线。
问题分析: 这个题目的关键是对每个字母进行判断,
1、 第一个字符必须是字母或下划线(_)使用if(str[0]!='_' && !isalpha(str[0]) )判
断.
2、 后面跟随的必须是字母、数字或下划线,我们考虑使用一个for循环.
3、 另外,为了标示这个字母是否合法,要用一个标记位valid=1来进行标记.
答案:
#include
#include
main( )
{
char str[81];
int k, valid=1;
gets(str);
if(str[0]!='_' && !isalpha(str[0]) )
valid=0;
else
for(k=1;str[k]!='\0';k++)
if(str[k]!='_' && !isalnum(str[k]) ){
valid=0;
break;
}
if(valid)
printf("%s is valid\n", str);
else
printf("%s is invalid\n", str);
}
4.请编写一个程序,其功能为转换日期的表示形式。例如,将输入的字符串形式表示的日期格式10/25/1990转换成Oct,25,1990格式。
问题分析: 这是一个日期表示形式的转换题,用数学角度分析,实际上这个题目我们只要对字符串形式10/25/1990截取,再用对应的形式输出即可,其中月份的转换稍稍有点麻烦,考虑使用switch(…) { case 1:…;break;}语法就可。
解决这个问题的基本步骤如下:
1、 声明定义必要的变量,如date[11]表示字符串形式表示的日期格式,mm[3] 表
示要输出的月份如Oct,month,day,yea表示要输出的数字月日年.
2、 字符串形式表示的日期格式截取计算相应的数字月日年.
3、 switch(…) { case 1:…;break;}语法转换相应的字符月份.
答案:
#include
#include
main()
{ char
char mm[3];
int month,day,year;
printf("input date(mm/dd/yyyy)?");
gets(date);
month=(date[0]-'0')*10+date[1]-'0';
day=(date[3]-'0')*10+date[4]-'0';
year=(date[6]-'0')*1000+(date[7]-'0')*100+(date[8]-'0')*10+date[9]-'0';
switch(month)
{ case 1:strcpy(mm,"Jan");break;
case 2:strcpy(mm,"Feb");break;
case 3:strcpy(mm,"Mar");break;
case 4:strcpy(mm,"Apr");break;
case 5:strcpy(mm,"May");break;
case 6:strcpy(mm,"Jun");break;
case 7:strcpy(mm,"Jul");break;
case 8:strcpy(mm,"Aug");break;
case 9:strcpy(mm,"Sep");break;
case 10:strcpy(mm,"Oct");break;
case 11:strcpy(mm,"Nov");break;
case 12:strcpy(mm,"Dec");break;
}
printf("%s,%d,%d\n",mm,day,year);
getch();
}
5.请编写一个程序,其功能为从一个字符串中删除指定字符。
问题分析: 按照题目的要求,我们要在一个字符串中删除指定字符,可以对这个字符串遍历,当发现字符串中有指定字符时,就用它的下个字符把这个字符替换掉,并依次扫描,扫描结束,最后在末尾加上'\0',表示结束了。
答案:
#include
main( )
{ char s[ ]="My name is Jia Zhongning";
char c= 'n';
int i,j;
printf("\nThe string is %s\n", s);
for(i=j=0; s[i]!='\0'; i++)
if(s[i]!=c)
s[j++]=s[i];
s[j]='\0';
if(i==j)
printf("Not found %c\n",c);
else
printf("The string is %s\n",s);
}
6.请编写一个程序,把一个字符串拷贝到另一个字符数组中去。
问题分析: 这个题目很简单,用个while循环就可,在循环里,把数组中每个字符都遍历一遍,要注意遍历结束的条件s[k]) != '\0'
答案:
#include
main( )
{
char s[]="My name is Jia Zhongning",d[40];
int k=0;
while ((d[k]=s[k]) != '\0')
k++;
printf("%s\n",d);
}
7.请编写一个程序,比较两个从键盘输入的字符串根据比较结果输出相应信息。
问题分析: 根据题意要求,两个字符串中字符的比较,对每个字符比较有四种情况,1、
字符串1字符结束了,2、字符串2字符结束了,3、字符串1字符大于字符串2字符,4、字符串1字符小于字符串2字符。
根据各种情况给出相应的输出
答案:
#include
main( )
{ char str1[40],str2[40];
int k;
printf("Enter 2 strings:");
gets(str1);
gets(str2);
for(k=0; str1[k]==str2[k]; k++)
if(str1[k]=='\0'){
printf("%s equals %s\n",str1,str2);
break;
}
if(str1[k]>str2[k])
printf("%s is bigger\n",str1);
else
if(str1[k]
printf("%s is bigger\n",str2);
}
8.请编写一个程序,从键盘输入两个字符串,然后把第2个字符串接到第1个字符串之后,成为一个字符串。
问题分析:根据题意要求,把第2个字符串接到第1个字符串之后,成为一个字符串,我们需要两个数组str1[80],str2[40],str1[80]表示第1个字符串,str2[40] 表示第2个字符串;先对第1个字符串遍历到字符串末尾,第2个字符串从开头开始,第1个字符串从末尾开始,第2个字符串对第1个字符串依次赋值,直到第2个字符串结束,要注意对第1个字符串末尾赋值'\0'
答案:
#include
main( )
{ char str1[80],str2[40];
int k,j;
printf("Enter 2 strings:");
gets(str1);
gets(str2);
k=0;
while(str1[k]!='\0')
k++;
j=0;
while((str1[k++]=str2[j++])!='\0') ;
printf("%s\n",str1);
}
1.请编写一个程序,从键盘输入若干单词(每个单词一行),找出最长的单词
问题分析: 根据题意要求,需要两个数组str[80],maxstr[80],一个用来保存每次输入的单词str[80],另一个用来保存最长的单词maxstr[80],每次从键盘输入一个新单词,我们就把这个新单词和目前已知最长的单词比较,如果发现新单词更长,就把这个新单词拷贝到用来保存最长的单词的数组中maxstr[80].
解决这个问题的基本步骤如下:
1、 定义两个数组char str[80],maxstr[80];定义目前已知最长的单词的长度,定义每次输
入的单词的长度int max=0,len=0.
2、 从键盘取得单词(使用函数),获得长度len,判断max小于len,如真,拷贝,如
假,再取下一个.
3、 查看获得长度len是否大于0,如真,转到步骤2,如假,转到步骤4
4、 把这个最大字符maxstr[80]输出来.
答案:
#include
#include
main()
{ char str[80],maxstr[80];
int max=0,len;
do{
printf("Enter a string:");
gets(str);
len=strlen(str);
if(len>max){
strcpy(maxstr,str);
max=len;
}
}while(len>0);
printf("The max string is %s\n",maxstr);
}
2.请编写一个程序,输入一个文本行,其中包含多个单词,请计算其中最长的单词长度。
问题分析:根据题意要求,首先需要一个数组来保存文本行str[256],两个数组,maxword[256],一个用来保存要考察的每个单词word[256],另一个用来保存最长的单词maxword[256],从文本行里遍历每个单词,并把它放到数组word[256]中,下面的就和上一题相同了,我们就把这个新单词和目前已知最长的单词比较,如果发现新单词更长,就把这个新单词拷贝到用来保存最长的单词的数组中maxword[256],注意每次把新单词拷贝到数组中maxword[256]前,要先对它清零.
答案:
#include
#include
void main( )
{ char str[256],word[256],maxword[256];
int k=0,wordlen,maxlen=0,n;
gets(str);
while(str[k]!='\0'){
wordlen=0; n=0;
while(str[k]==' ') k++;
while(str[k]!='\0' && str[k]!=' '){
wordlen++; word[n++]=str[k++];
}
word[n]='\0';
if(maxlen
maxlen=wordlen; strcpy(maxword,word);
}
}
printf("The max word is %s, len=%d\n",maxword,maxlen);
}
3.请编写一个程序,判断通过键盘输入的字符串是否表示一个合法的标识符。标识符的命名规则是:第一个字符必须是字母或下划线(_),后面可以跟随字母、数字或下划线。
问题分析: 这个题目的关键是对每个字母进行判断,
1、 第一个字符必须是字母或下划线(_)使用if(str[0]!='_' && !isalpha(str[0]) )判
断.
2、 后面跟随的必须是字母、数字或下划线,我们考虑使用一个for循环.
3、 另外,为了标示这个字母是否合法,要用一个标记位valid=1来进行标记.
答案:
#include
#include
main( )
{
char str[81];
int k, valid=1;
gets(str);
if(str[0]!='_' && !isalpha(str[0]) )
valid=0;
else
for(k=1;str[k]!='\0';k++)
if(str[k]!='_' && !isalnum(str[k]) ){
valid=0;
break;
}
if(valid)
printf("%s is valid\n", str);
else
printf("%s is invalid\n", str);
}
4.请编写一个程序,其功能为转换日期的表示形式。例如,将输入的字符串形式表示的日期格式10/25/1990转换成Oct,25,1990格式。
问题分析: 这是一个日期表示形式的转换题,用数学角度分析,实际上这个题目我们只要对字符串形式10/25/1990截取,再用对应的形式输出即可,其中月份的转换稍稍有点麻烦,考虑使用switch(…) { case 1:…;break;}语法就可。
解决这个问题的基本步骤如下:
1、 声明定义必要的变量,如date[11]表示字符串形式表示的日期格式,mm[3] 表
示要输出的月份如Oct,month,day,yea表示要输出的数字月日年.
2、 字符串形式表示的日期格式截取计算相应的数字月日年.
3、 switch(…) { case 1:…;break;}语法转换相应的字符月份.
答案:
#include
#include
main()
{ char
char mm[3];
int month,day,year;
printf("input date(mm/dd/yyyy)?");
gets(date);
month=(date[0]-'0')*10+date[1]-'0';
day=(date[3]-'0')*10+date[4]-'0';
year=(date[6]-'0')*1000+(date[7]-'0')*100+(date[8]-'0')*10+date[9]-'0';
switch(month)
{ case 1:strcpy(mm,"Jan");break;
case 2:strcpy(mm,"Feb");break;
case 3:strcpy(mm,"Mar");break;
case 4:strcpy(mm,"Apr");break;
case 5:strcpy(mm,"May");break;
case 6:strcpy(mm,"Jun");break;
case 7:strcpy(mm,"Jul");break;
case 8:strcpy(mm,"Aug");break;
case 9:strcpy(mm,"Sep");break;
case 10:strcpy(mm,"Oct");break;
case 11:strcpy(mm,"Nov");break;
case 12:strcpy(mm,"Dec");break;
}
printf("%s,%d,%d\n",mm,day,year);
getch();
}
5.请编写一个程序,其功能为从一个字符串中删除指定字符。
问题分析: 按照题目的要求,我们要在一个字符串中删除指定字符,可以对这个字符串遍历,当发现字符串中有指定字符时,就用它的下个字符把这个字符替换掉,并依次扫描,扫描结束,最后在末尾加上'\0',表示结束了。
答案:
#include
main( )
{ char s[ ]="My name is Jia Zhongning";
char c= 'n';
int i,j;
printf("\nThe string is %s\n", s);
for(i=j=0; s[i]!='\0'; i++)
if(s[i]!=c)
s[j++]=s[i];
s[j]='\0';
if(i==j)
printf("Not found %c\n",c);
else
printf("The string is %s\n",s);
}
6.请编写一个程序,把一个字符串拷贝到另一个字符数组中去。
问题分析: 这个题目很简单,用个while循环就可,在循环里,把数组中每个字符都遍历一遍,要注意遍历结束的条件s[k]) != '\0'
答案:
#include
main( )
{
char s[]="My name is Jia Zhongning",d[40];
int k=0;
while ((d[k]=s[k]) != '\0')
k++;
printf("%s\n",d);
}
7.请编写一个程序,比较两个从键盘输入的字符串根据比较结果输出相应信息。
问题分析: 根据题意要求,两个字符串中字符的比较,对每个字符比较有四种情况,1、
字符串1字符结束了,2、字符串2字符结束了,3、字符串1字符大于字符串2字符,4、字符串1字符小于字符串2字符。
根据各种情况给出相应的输出
答案:
#include
main( )
{ char str1[40],str2[40];
int k;
printf("Enter 2 strings:");
gets(str1);
gets(str2);
for(k=0; str1[k]==str2[k]; k++)
if(str1[k]=='\0'){
printf("%s equals %s\n",str1,str2);
break;
}
if(str1[k]>str2[k])
printf("%s is bigger\n",str1);
else
if(str1[k]
printf("%s is bigger\n",str2);
}
8.请编写一个程序,从键盘输入两个字符串,然后把第2个字符串接到第1个字符串之后,成为一个字符串。
问题分析:根据题意要求,把第2个字符串接到第1个字符串之后,成为一个字符串,我们需要两个数组str1[80],str2[40],str1[80]表示第1个字符串,str2[40] 表示第2个字符串;先对第1个字符串遍历到字符串末尾,第2个字符串从开头开始,第1个字符串从末尾开始,第2个字符串对第1个字符串依次赋值,直到第2个字符串结束,要注意对第1个字符串末尾赋值'\0'
答案:
#include
main( )
{ char str1[80],str2[40];
int k,j;
printf("Enter 2 strings:");
gets(str1);
gets(str2);
k=0;
while(str1[k]!='\0')
k++;
j=0;
while((str1[k++]=str2[j++])!='\0') ;
printf("%s\n",str1);
}