第八章 C语言习题及答案第八章Word文档格式.docx
《第八章 C语言习题及答案第八章Word文档格式.docx》由会员分享,可在线阅读,更多相关《第八章 C语言习题及答案第八章Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
max=%d,a[%d]\n"
max,d_max);
min=%d,a[%d]\n"
min,d_min);
运行结果:
max=93,a[9]
Min=3,a[1]
数组a[i]中i的变化意味着什么?
8-3编写程序,从键盘读入50个数存放于一数组中,求出该数组中最大值、最小值及所在位置。
解:
floata[50],max,min;
inti,d_max,d_min;
50;
scanf("
%f"
&
a[i]);
}
思考:
此题中不用数组也可以处理吗?
如果可以,区别之处在哪里?
8-4将存放于上题数组中的50个数分别按升序,降序排序。
#defineN3
floata[N],t;
inti,j;
for(i=0;
N;
/*按升序排序*/
{
for(j=i;
j<
j++)
if(a[i]>
a[j]){t=a[i];
a[i]=a[j];
a[j]=t;
%8.2f"
a[i]);
\n"
);
/*按升序排序*/
此题中可以不用数组进行处理吗?
(进一步理解数组的特点。
)
8-5编写程序,从键盘输入某班学生C语言课程考试成绩,评定每个学生C语言成绩等级。
如果高于平均分10分,则等级为优秀;
如果低于平均分10分,则等级为一般;
否则等级为中等。
inti,j;
floataverage,a[N],sum=0;
scanf("
a[i]);
sum=sum+a[i];
average=sum/N;
average+10)printf("
a[%d]优秀\n"
i);
elseif(a[i]<
average-10)printf("
a[%d]一般\n"
elseprintf("
a[%d]中等\n"
表示数组元素的a[i]一般称为什么变量?
它与一般变量有何区别?
8-6某班期终考试有六门课程,编写程序计算每门课程的平均成绩。
进一步考虑全年级10个班的情况。
#defineN30
#defineM6
inti,j;
floataverage[M],a[N][M],sum=0;
for(j=0;
M;
a[i][j]);
sum=0;
sum=sum+s[i][j];
average[j]=sum/N;
6门课程的平均成绩分别为:
%f"
average[i]);
}
);
在此题中定义的数组a[N][M]中,N表示什么?
M表示什么?
若考虑全年级10个班的情况,程序应做哪些改进?
8-7编写程序,将一个一维数组进行逆制。
例如,原来顺序为1,3,5,7,则逆置后的顺序为7,3,5,1.
#defineN4
voidfun(inta[])
inti,t;
N/2;
t=a[i];
a[i]=a[N-1-i];
a[N-1-i]=t;
}
for(i=0;
%d"
a[i]);
inti,a[N];
请输入一维数组各元素的值:
fun(a);
如果要对7个元素的数组进行逆置操作,只需要修改什么地方?
数组的元素的可以是算术表达式吗?
有何要求?
8-8编写程序,打印如下的杨辉三角形。
1
11
121
1331
14641
#defineN6
inti,j,a[N][N]={1},k;
for(j=1;
if(j==1||i==j)a[i][j]=a[0][0];
elsea[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=1;
for(k=1;
k<
=N-i;
k++)/*每行前面的空格*/
"
for(j=1;
=i;
%4d"
a[i][j]);
}
在此题中定义一个a[N][N]的方阵数组显然有些浪费(有些元素闲置,却占用存储空间),可否考虑用一维数组进行处理?
8-9编写程序,用筛选法求100-1000之间的素数。
#defineN1000
inti,a[N],n=0,db;
a[i]=1;
for(i=2;
if(a[i]==0)continue;
db=i*2;
while(db<
N)
a[db]=0;
db=db+1;
for(i=100;
if(a[i==1])
n++;
if(n%18==0)printf("
在程序实际已求出了什么范围之间的所有素数?
在while循环中的“a[db]=0;
”语句的作用是什么了?
8-10编写程序,利用数组实现大整数的加减运算。
假定大整数不超过10位数字。
string.h"
#defineN10
inta[N],b[N],c[N],d[N],jw=0;
intflag=1;
/*标志两个大整数的大小关系*/
voidchag0(inta[],intn)
for(inti=0;
=n;
a[i]=0;
voidadd()/*求两个大整数的和*/
inti;
c[i]=(a[i]+b[i]+jw)%10;
jw=(a[i]+b[i]+jw)/10;
//计算进位
}
jw=0;
printf("
两数和为:
"
);
for(i=N-1;
i>
=0;
i--)
if(!
c[i]&
&
!
jw)
continue;
else
c[i]);
jw=1;
}
voidmus()/*求两个大整数的差*/
jw=0;
if(a[i]-jw>
=b[i])
d[i]=a[i]-b[i]-jw;
//表示无借位
//表示有借位
两数差为:
flag)printf("
-"
d[i]&
jw)continue;
else{printf("
d[i]);
jw=1;
inti,n1,n2;
chg0(a,N);
chg0(b,N);
chg0(c,N);
chg0(d,N);
chars1[N],s2[N];
请输入加数(减数):
scanf("
%s"
s1);
请输入被加数(被减数):
s2);
n=strlen(s1);
n=strlen(s2);
if(n1>
n2||(n1==n2&
strcmp(s1,s2)>
=0))
=n1;
a[i]=s1[n1-i-1]-48;
=n2;
a[i]=s2[n2-i-1]-48;
b[i]=s1[n1-i-1]-48;
b[i]=s2[n2-i-1]-48;
flag=0;
add();
mus();
此程序中变量的jw的作用什么?
他在函数add()与mus()中的作用一样吗?
判断式“if(!
jw)”为真时是什么情况?
将大整数以字符串的形式进行输入的好处是什么?
8-11编写程序,从键盘输入两个4x4的矩阵A和B,求出它们的和、差、积,并按矩阵的形式输出。
inta[4][4],b[4][4],c[4][4],i,j;
=4;
for(j=0;
4;
b[i][j]);
c[i][j]=a[i][j]+b[i][j];
c[i][j]);
此程序只完成了矩阵A与B的求和计算过程(求差的过程略),求A与B的乘积应对上面四个二重循环中哪个进行处理?
二重循环是否能满足矩阵乘积计算过程的需要?
8-12编写程序,将一个二维数组的行列互换,并考虑用函数实现。
#defineM4
inta[M][N],at[N][M],i,j;
请输入二维数组(%d行%d列):
M,N);
at[i][j]=a[j][i];
输出行列互换后的二维数组(%d行%d列):
N,M);
at[i][j]);
此程序中的关键语句是什么?
若考虑用函数实现,哪些内容放到函数中的通用性比较好?
8-13编写程序,找出一个二维数组中的鞍点,即该位置上的元素在该行上的最大、在该列上最小。
#defineN3/*设二维数组为3行3列*/
#defineM3
inti,j,a[N][M],max_min,k,flag=0;
请输入数组的个元素值:
a[i][j]);
i++)/*显示数组*/
k=0;
max_min=a[i][0];
if(max_min<
a[i][j]){max_min=a[i][j];
k=j;
if(max_min>
a[j][k])break;
if(j==M)
flag=1;
\n满足条件的元素为第%d行第%d列的:
%d\n"
i+1,k+1,max_min);
if(flag!
=1)printf("
\n没有满足条件的元素!
此题是否会出现两个以上同时满足条件的元素?
为什么?
8-14编写程序,输入一行字符,统计其中共有多少个单词,单词之间用空格分隔开。
#defineN100
chara[N],i,num=0;
请输入一行字符串(不超过100个):
gets(a);
a[i]!
='
\0'
;
if(a[i]=='
'
num++;
while(a[i++]=='
/*处理连续空格的情况*/
该行字符串有%d个单词:
num+1);
对语句“while(a[i++]==‘’);
”你是如何理解的?
它的循环体是什么?
是否还可以出其它形式?
8-15有一篇文章,共10行,每行有80个字符。
编写程序,统计其中大写字母、小写字母、数字、空格及其它字符各有多少个。
chara[10][80],i,j,num[5]={0,0,0,0,0};
请输入各行字符(每行不超过80个):
gets(a[i++]));
a[i][j]!
j++)
if(a[i][j]>
A'
a[i][j]<
Z'
)num[0]++;
elseif(a[i][j]>
a'
z'
)num[1]++;
0'
9'
)num[2]++;
elseif(a[i][j]=='
)num[3]++;
elsenum[4]++;
给文有大写字母%d个\n"
num[0]);
给文有小写字母%d个\n"
num[1]);
给文有数字字符%d个\n"
num[2]);
给文有空格%d个\n"
num[3]);
其它字符有%d个\n"
num[4]);
在循环结构中嵌套if结构时应该注意哪些问题?
if结构中是否也可以嵌套循环结构。
8-16编写程序,分别实现字符串复制函数strcpy()、字符串比较函数strcmp()的功能。
voidMy_strcpy(charx[],chary[])
inti=0;
while(x[i]!
y[i]=x[i];
i++;
y[i]='
;
intMy_strcmp(charx[],chary[])
inti=0;
||y[i]!
if(y[i]!
=x[i])return0;
i++;
if(x[i]!
)return0;
return1;
chara[N],b[N];
请输入源字符串a(<
100个字符):
gets(a);
My_strcpy(a,b);
目标字符串b为:
%s\n"
b);
请输入比较字符串a(<
gets(b);
if(My_strcmp(a,b))printf("
a,b两字符串相等!
elseprintf("
a,b两字符串不相等!
C语言在字符串的处理过程中,“\0”的作用是什么?
是如何
8-17有一行电文,已按下面的规律译成密码:
A→Za→zB→Yb→yC→Xc→x,.....
即第一个字母变成第26个字母,第i个字母变成第26-i+1个字母。
非字母字符不变。
编写程序将密码译回原文,并输出密码和原文。
#include"
#defineN50
#defineM20
inti,j,n=0;
charcname[N][M],tran[N];
请输入国家名称(<
50个且每个名称不超过20个字符,当第一个字符为空格是结束):
gets(cname[i]);
if(cname[i][0]=='
)break;
n++;
n-1;
for(j=i+1;
n;
if((strmp(cname[i],cname[j]))>
0)
strcpy(tran,cname[i]);
strcpy(cname[i],cname[j]);
strcpy(cname[j],tran);
按字典顺序排序后为:
puts(cname[i]);
语句“if(cname[i][0]==‘‘)break;
”的作用是什么?
若无此语句,程序运行将会出现什么状况。
8-19若A为nxn对称方阵,将A压缩存放到一维数组B中,使B具有n(n+1)/2个元素,且A中信息可全部在B中找到。
#defineN5
#defineMN*(N+1)/2/*用宏处理一维数组的动态小标,内容参见第12章*/
inta[N][N],b[M],i,j,k;
请输入方阵A的值:
for(i=1;
i++)/*为了易于方阵小标的对应理解,此处弃掉0行0列*/
for(j<
1;
%