C语言程序设计习题5.docx
《C语言程序设计习题5.docx》由会员分享,可在线阅读,更多相关《C语言程序设计习题5.docx(18页珍藏版)》请在冰豆网上搜索。
C语言程序设计习题5
盛年不重来,一日难再晨。
及时宜自勉,岁月不待人。
习题5参考解答
1.数组是相同数据类型的集合,分为一维数组、二维数组及多维数组。
在什么情况下使用数组?
在什么情况下使用一维数组?
解:
当需要处理的数据为相同类型的数据的集合时,可以使用数组。
如果这些数据的描述用一个量就可以,这时就用一维数组。
例如,一组学生的学号,就可以使用一维数组。
2.数组元素又称为下标变量,数组元素的下标有何意义?
解:
下标的意义是对数组的各个数组元素进行标识和区分。
由数组名和下标结合起来形成数组元素的名字。
3.使用字符数组来存储字符串应注意什么问题?
解:
需要注意的问题是字符数组在存储字符串时是以'\0'作为结束标记的。
这个'\0'是系统自动加上的。
所以字符数组的长度需要比它要存储的字符串的长度至少多1。
例如,要存储字符串"abcd",因为它的长度为4,所以存储它的字符数组的长度至少为5。
4.常用的字符处理函数有哪些?
解:
常用的字符处理函数有以下8个。
(1)puts(字符串):
作用为将一个字符串输出到终端。
(2)gets(字符数组):
作用为从终端输入一个字符串到字符数组,并且得一个函数值。
(3)strcat(字符串1,字符串2):
作用为进行字符串的连接。
(4)strcpy(字符串1,字符串2):
作用为进行字符串的复制。
(5)strcmp(字符串1,字符串2):
作用为进行字符串的比较。
(6)strlen(字符串):
作用为求字符串的长度。
(7)strlwr(字符串):
作用为将字符串中的大写字母转换成小写字母。
(8)strupr(字符串):
作用为将字符串中的小写字母转换成大写字母。
5.随机产生10个两位整数存储到一个一维数组中,找出其中的最大数。
解:
#include
#include
#definerandom(x)(rand()%x)
intmain()
{
inta[10],max;
intx;
for(x=0;x<10;x++)
a[x]=random(100);
max=a[0];
for(x=0;x<10;x++)
{
if(a[x]>max)
max=a[x];
printf("%4d",a[x]);
}
printf("\nmax=%d\n",max);
return0;
}
程序运行结果如下:
4167340692478586264
max=78
6.输入10个整数,要求按照从小到大的顺序输出。
解:
#include
voidmain()
{
inti,j,min,t,a[10];
printf("请输入10个数:
\n");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<10-1;i++)
{
min=i;
for(j=i;j<10;j++)
if(a[min]>a[j])min=j;
t=a[i];
a[i]=a[min];
a[min]=t;
}
printf("\n排序结果如下:
\n");
for(i=0;i<10;i++)
printf("%5d",a[i]);
}
程序运行情况如下:
请输入10个数:
6904556115447858101
排序结果如下:
1615444556587890101
7.输入10个字符,并将它们的顺序颠倒后输出。
解:
#include
#defineN10
voidmain()
{
chara[N],t;
inti;
/*输入10个字符并输出*/
printf("请输入10个字符:
\n");
for(i=0;i<10;i++)
{
scanf("%c",&a[i]);
}
/*顺序颠倒*/
for(i=0;i{
t=a[i];
a[i]=a[N-i-1];
a[N-i-1]=t;
}
printf("顺序颠倒后的字符:
\n");
for(i=0;iprintf("%c",a[i]);
}
程序运行情况如下:
请输入10个字符:
0123456789↙
顺序颠倒后的字符:
9876543210
8.写出下列程序的运行结果。
(1)#include
voidfun(intb[])
{
inti=0;
while(b[i]<=10)
{
b[i]+=2;
i++;
}
}
intmain()
{
inti,a[]={1,5,7,9,11,13,15};
fun(a+2);
for(i=0;i<7;i++)
printf("%5d",a[i]);
return0;
}
解:
15911111315
(2)#include
intmain()
{
inta[3][3],i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
a[i][j]=i;
for(i=0;i<3;i++)
printf("%5d",a[1][i]);
return0;
}
解:
111
(3)#include
intmain()
{
intk;
inta[3][3]={1,2,3,4,5,6,7,8,9};
for(k=0;k<3;k++)
printf("%d",a[k][2-k]);
return0;
}
解:
357
(4)#include
#include
intmain()
{
charp[20]={'a','b','c','d'},q[]="abc",r[]="abcde";
strcpy(p+strlen(q),r);strcat(p,q);
printf("%d\n%d\n",sizeof(p),strlen(p));
return0;
}
解:
20
11
(5)#include
#include
voidf(charp[][10],intn)/*字符串从小到大排序*/
{
chart[10];
inti,j;
for(i=0;ifor(j=i+1;jif(strcmp(p[i],p[j])>0)
{strcpy(t,p[i]);strcpy(p[i],p[j]);strcpy(p[i],t);}
}
intmain()
{
charp[5][10]={"abc","aabdfg","abbd","dcdbe","cd"};
f(p,5);
printf("%d\n",strlen(p[0]));
return0;
}
解:
3
9.求一个3×3矩阵对角线元素之和。
解:
#include
main()
{
floata[3][3],sum=0;
inti,j;
printf("请输入矩阵元素:
\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%f",&a[i][j]);
for(i=0;i<3;i++)
sum=sum+a[i][i];
printf("对角线元素之和=%.2f\n",sum);
}
程序运行情况如下:
请输入矩阵元素:
123456789↙
对角线元素之和=15.00
10.找出一个二维数组中的鞍点,所谓鞍点是指该位置上的数在该行最大,在该列最小。
需要注意的是,并不是所有的二维数组都有鞍点。
解:
#defineN10
#defineM10
#include
voidmain()
{
inti,j,k,m,n,flag1,flag2,a[N][M],max,maxj;
printf("\n输入行数n:
");
scanf("%d",&n);
printf("\n输入列数m:
");
scanf("%d",&m);
for(i=0;i{
printf("第%d行?
\n",i);
for(j=0;jscanf("%d",&a[i][j]);
}
for(i=0;i{
for(j=0;jprintf("%5d",a[i][j]);
printf("\n");
}
flag2=0;
for(i=0;i{
max=a[i][0];
maxj=0;
for(j=0;jif(a[i][j]>max)
{
max=a[i][j];
maxj=j;
}
for(k=0,flag1=1;kif(max>a[k][maxj])
flag1=0;
if(flag1)
{
printf("\n第%d行,第%d列的%d是鞍点\n",i,maxj,max);
flag2=1;
}
}
if(!
flag2)
printf("\n矩阵中无鞍点!
\n");
}
矩阵中有鞍点,运行情况如下:
输入行数n:
2↙
输入列数m:
2↙
第0行?
4↙
5↙
第1行?
4↙
6↙
45
46
第0行,第1列的5是鞍点
矩阵中无鞍点,运行情况如下:
输入行数n:
2↙
输入列数m:
2↙
第0行?
90↙
7↙
第1行?
5↙
8↙
907
58
矩阵中无鞍点!
11.某班有30个学生,每个学生参加了5门课程的考试,请编程显示该班的期末成绩单,并求出每个学生的所有课程的总分。
解:
#include
voidmain()
{
intscore[31][7];
inti,j;
for(i=1;i<=30;i++)
score[i][0]=i;
printf("请依次输入30个学生的五门课的成绩\n");
for(i=1;i<=30;i++)
{
printf("请依次输入第%d个学生的五门课的成绩\n",i);
for(j=1;j<=5;j++)
scanf("%d",&score[i][j]);
}
for(i=1;i<=30;i++)
{
score[i][6]=0;
for(j=1;j<=5;j++)
score[i][6]+=score[i][j];
}
printf("期末成绩单\n");
printf("%10s%10s%10s%10s%10s%10s%10s\n","学号","课程1","课程2","课程3","课程4","课程5","总分");
for(i=1;i<=30;i++)
{
for(j=0;j<=6;j++)
printf("%10d",score[i][j]);
printf("\n");
}
}
程序运行情况如下:
请依次输入30个学生的五门课的成绩
请依次输入第1个学生的五门课的成绩
7889989698↙
请依次输入第2个学生的五门课的成绩
8995989796↙
请依次输入第3个学生的五门课的成绩
7879747875↙
按照上面示例自行输入27个学生的五门课的成绩。
期末成绩单
学号课程1课程2课程3课程4课程5总分
17889989698459
28995989796475
37879747875384
程序将在此处依次打印出另外27个学生的成绩。
12.打印出如下方阵:
13141516
9101112
5678
1234
解:
#include
voidmain()
{
intarray[4][4];
inti,j;
for(i=0;i<=3;i++)
for(j=0;j<=3;j++)
array[i][j]=(3-i)*4+(j+1);
for(i=0;i<=3;i++)
{
for(j=0;j<=3;j++)
printf("%10d",array[i][j]);
printf("\n");
}
}
13.打印出以下的杨辉三角形(要求打印出10行):
解:
#include
#defineN11
voidmain()
{
inti,j,a[N][N];
for(i=1;i{
a[i][i]=1;
a[i][1]=1;
}
for(i=3;ifor(j=2;j<=i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=1;i{
for(j=1;j<=i;j++)
printf("%6d",a[i][j]);
printf("\n");
}
printf("\n");
}
程序运行结果如下:
1
11
121
1331
14641
15101051
1615201561
172135352171
18285670562881
193684126126843691
14.输入5个字符串,按照ASCII码值由小到大顺序输出。
解:
#include
#include
voidmain()
{
inti,j,min;
chart[20],str[5][20];
printf("请输入5个字符串:
\n");
for(i=0;i<5;i++)
{
gets(str[i]);
}
for(i=0;i<5-1;i++)
{
min=i;
for(j=i;j<5;j++)
if(strcmp(str[min],str[j])>0)min=j;
strcpy(t,str[i]);
strcpy(str[i],str[min]);
strcpy(str[min],t);
}
printf("\n排序结果如下:
\n");
for(i=0;i<5;i++)
puts(str[i]);
}
程序运行情况如下:
请输入5个字符串:
flash↙
action↙
photo↙
dream↙
weaver↙
排序结果如下:
action
dream
flash
photo
weaver
15.有一篇文章,共有5行文字,每行有80个字符。
要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
解:
#include
voidmain()
{
inti,j,uppn,lown,dign,span,othn;
chartext[5][80];
uppn=lown=dign=span=othn=0;
for(i=0;i<5;i++)
{
printf("\n请输入第%d行:
\n",i);
gets(text[i]);
for(j=0;j<80&&text[i][j]!
='\0';j++)
{
if(text[i][j]>='A'&&text[i][j]<='Z')
uppn+=1;
elseif(text[i][j]>='a'&&text[i][j]<='z')
lown+=1;
elseif(text[i][j]>='0'&&text[i][j]<='9')
dign+=1;
elseif(text[i][j]=='')
span+=1;
else
othn+=1;
}
}
for(i=0;i<5;i++)
printf("%s\n",text[i]);
printf("大写字母的个数:
%d\n",uppn);
printf("小写字母的个数:
%d\n",lown);
printf("数字的个数:
%d\n",dign);
printf("空格的个数:
%d\n",span);
printf("其他字符的个数:
%d\n",othn);
}
程序运行情况如下:
请输入第0行:
abc
请输入第1行:
+++
请输入第2行:
ABC
请输入第3行:
123
请输入第4行:
***
大写字母的个数:
3
小写字母的个数:
3
数字的个数:
3
空格的个数:
0
其他字符的个数:
6
16.有一行电文,已按下面规律译成密码:
A→Za→z
B→Yb→y
C→Xc→x
……
即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。
非字母字符不变。
要求编写程序将密码译回原文,并打印出密码和原文。
解:
#include
main()
{
inti,n;
charch[80],tran[80];
printf("请输入字符:
");
gets(ch);
printf("\n密码是:
%s",ch);
i=0;
while(ch[i]!
='\0')
{
if((ch[i]>='A')&&(ch[i]<='Z'))
tran[i]=26+64-ch[i]+1+64;
elseif((ch[i]>='a')&&(ch[i]<='z'))
tran[i]=26+96-ch[i]+1+96;
else
tran[i]=ch[i];
i++;
}
n=i;
printf("\n原文是:
");
for(i=0;iputchar(tran[i]);
}
程序运行情况如下:
请输入字符:
ZYXzyx↙
密码是:
ZYXzyx
原文是:
ABCabc
17.编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中。
要求不使用strcpy函数。
复制时,'\0'也要复制过去。
'\0'后面的字符不复制。
解:
#include
#include
intmain()
{
charfrom[80],to[80];
inti;
printf("请输入字符串:
");
scanf("%s",from);
for(i=0;i<=strlen(from);i++)
to[i]=from[i];
printf("复制字符串为:
%s\n",to);
return0;
}
程序运行情况如下:
请输入字符串:
hello↙
复制字符串为:
hello