全国计算机等级考试二级教程——C语言程序设计(年版)
编程题答案(第9章):
[9.27]
输入一行数字字符,请用数组元素作为计数器来统计每个数字字符的个数。用下标为0的元素统计字符’0’的个数,用下标为1的元素统计字符’1’的个数……
#includestdio.h
#includectype.h
main()
{charc;
intk,a[10]={0};
while((c=getchar())!=\n)
if(isdigit(c))a[c-0]+=1;
/*isdigit见附录6*/
for(k=0;k10;k++)
printf("%d的个数:%d\n",k,a[k]);
}
[9.28]
编写函数,对具有10个整数的数组进行如下操作:从下标为n的元素开始直到最后一个元素,依次向前移动一个位置。输出移动后的结果。
#includestdio.h
voidfun(inta[],intn)
{inti,t;
for(i=n;i10;i++)
a[i-1]=a;
}
main()
{inta[10]={0,1,2,3,4,5,6,7,8,9},n,i;
scanf("%d",n);
fun(a,n);
for(i=0;i9;i++)
printf("a[%d]=%d\n",i,a);
}
[9.29]
编写函数,把数组中所有奇数放在另一个数组中返回。
#includestdio.h
#defineN10/*用10替换N*/
intfun(inta[],intb[])
{inti,k=0;
for(i=0;iN;i++)
if(a%2)/*判断奇数*/
{b[k]=a;
k++;
}
returnk;/*k是b[]实际大小*/
}
main()
{inta[N]={0,1,2,3,4,5,6,7,8,9};
intb[N],k,i;
k=fun(a,b);
for(i=0;ik;i++)
printf("b[%d]=%d\n",i,b);
}
[9.30]
编写函数,对字符数组中的字母按由大到小的字母顺序进行排序。
#includestdio.h
#includectype.h
intfun(chara[],charb[])
{inti,j,n,k=0;
charm;
for(i=0;i9;i++)
{if(isalpha(a))/*判断字母*/
b[k]=a,k++;
}/*将是字母的a[]赋值给b[]*/
for(j=0;jk;j++)
{for(n=j+1;nk;n++)
{if(b[j]b[n])
m=b[j],b[j]=b[n],b[n]=m;
}
}/*b[]大小排序*/
returnk;
}
main()
{charb[9],a[9]={a,9,d,8,g,h,j,k,6};
intn,k;
k=fun(a,b);
for(n=0;nk;n++)
printf("b[%d]=%c\n",n,b[n]);
}
[9.31]
输入若干有序数放在数组中。然后输入一个数,插入到此有序数列中,插入后,数组中的数仍然有序。请对插在最前,插在最后,插在中间三种情况运行程序,以便验证程序是否正确。
#includestdio.h
voidfun(int[],int);
main()
{inti,x,k,a[10];
printf("请输入9个有序数:");/*留一个位置*/
for(i=0;i9;i++)
scanf("%d",a);/*a[]赋值*/
for(k=0;k9;k++)
printf("a[%d]=%d\n",k,a[k]);
printf("请输入一个数:");
scanf("%d",x);
fun(a,x);
for(k=0;k10;k++)
printf("a[%d]=%d\n",k,a[k]);
}
/*只考虑了从小到大的情况*/
voidfun(inta[],intx)
{inti,j=0,k;
for(i=0;i9;i++)
{if(xa)j++;/*判断插入位置*/
}
for(k=8;k=j;k--)
a[k+1]=a[k];/*后移*/
a[j]=x;
}
[9.32]
编写函数,把任意十进制正整数转换成二进制数。提示:把十进制数不断被2除的余数放在一个一维数组中,直到商数为零。在主函数中进行输出,要求不得按逆序输出。
#includestdio.h
intfun(int,int[]);
main()
{intx,n,k,a[35];
printf("十进制数:");
scanf("%d",x);
n=fun(x,a);
printf("二进制数:");
for(k=0;kn;k++)
printf("%d",a[k]);
}
intfun(intx,inta[])
{inti,j,k,t;
for(i=0,j=x;j!=0;j/=2)
a=j%2,i++;
for(k=0;ki/2;k++)
t=a[k],a[k]=a[i-k-1],a[i-k-1]=t;
returni;
}
[9.33]
编写函数,调用随机函数产生0到19之间的随机数,在数组中存入15个互不重复的整数。要求在主函数中进行输出结果。若已定义x为int类型,调用随机函数步骤如下:
#includestdlib.h
x=rand()%20;/*产生0到19的随机数*/
#includestdio.h
#includestdlib.h
voidfun(inta[])
{inti,j,k,x;
for(i=0;i15;)
{for(j=0,k=0,x=rand()%20;ji;j++)
{if(x!=a[j])k++;}
if(k==j)a=x,i++;
}
}
main()
{inti,a[15]={0};
fun(a);
for(i=0;i15;i++)
printf("a[%d]=%d\n",i,a);
}
[9.34]
求任意方阵每行,每列,两对角线上元素之和。
#includestdio.h
#definen3
voidfun1(inta[][n])
{inti,j,s=0;
for(i=0;in;i++,s=0)
for(j=0;jn;j++)
{s+=a[j];
if(j==2)printf("第%d行的和:%d\n",i+1,s);
}
}
voidfun2(inta[][n])
{inti,j,s=0;
for(i=0;in;i++,s=0)
for(j=0;jn;j++)
{s+=a[j];
if(j==2)printf("第%d列的和:%d\n",i+1,s);
}
}
voidfun3(inta[][n])
{inti,j,s;
for(i=0,j=0,s=0;in;i++,j++)
{s+=a[j];
if(i==2)printf("正对角线的和:%d\n",s);
}
for(i=0,j=2,s=0;in;i++,j--)
{s+=a[j];
if(i==2)printf("副对角线的和:%d\n",s);
}
}
main()
{inti,j,a[n][n];
printf("a[3][3]:\n");
for(i=0;in;i++)
for(j=0;jn;j++)
scanf("%d",a[j]);
for(i=0;in;i++)
for(j=0;jn;j++)
{printf("a[%d][%d]=%d",i,j,a[j]);
if(j==n-1)printf("\n");
}
fun1(a);
fun2(a);
fun3(a);
}
[9.35]
求两个矩阵的和。
#includestdio.h
#definen3
voidfun(inta[][n],intb[][n],intc[][n])
{inti,j;
for(i=0;in;i++)
for(j=0;jn;j++)
c[j]=a[j]+b[j];
printf("a[3][3]+b[3][3]=\n");
for(i=0;in;i++)
for(j=0;jn;j++)
{printf("%-5d",c[j]);
if(j==n-1)printf("\n");
}
}
main()
{inta[n][n],b[n][n],c[n][n],i,j;
printf("a[3][3]:\n");
for(i=0;in;i++)
for(j=0;jn;j++)
scanf("%d",a[j]);
printf("b[3][3]:\n");
for(i=0;in;i++)
for(j=0;jn;j++)
scanf("%d",b[j]);
fun(a,b,c);
}
#includestdio.h
#definen9
main()
{inti,j,a[n][n];
printf("**AMULTIPLICATIONTABLE**\n");
for(i=1;i10;i++)
printf("(%d)",i);
printf("\n----------------------------------------\n");
for(i=0;i9;i++)
for(j=0;j9;j++)
a[j]=(i+1)*(j+1);
for(i=0;i9;i++)
{printf("(%d)",i+1);
for(j=0;j9;j++)
printf("%-4d",a[j]);
printf("\n");
}
}
[9.37]
调用随机函数为5×4的矩阵置以内的整数,输出该矩阵,求出每行元素之和,并把和值最大的那一行与第一行上的元素对调。若以定义x为int类型,请参考习题9.33调用随机函数。
#includestdio.h
#includestdlib.h
#definem5
#definen4
main()
{inta[m][n],s[m]={0},b,i,j,k;
for(i=0;im;i++)/*矩阵赋值*/
for(j=0;jn;j++)
a[j]=rand()%;
for(i=0;im;i++)/*矩阵输出*/
{for(j=0;jn;j++)
printf("%-2d",a[j]);
printf("\n");
}
for(i=0;im;i++)/*每行求和*/
for(j=0;jn;j++)
{s+=a[j];
if(j==3)printf("第%d行的和:%d\n",i+1,s);
}
for(i=1,k=0;im;i++)/*找最大行*/
if(ss[k])k=i;
for(i=0;in;i++)/*行替换*/
{b=a[0];
a[0]=a[k];
a[k]=b;
}
for(i=0;im;i++)/*输出矩阵*/
{for(j=0;jn;j++)
printf("%-2d",a[j]);
printf("\n");
}
}
[9.38]
调用随机函数为5×5的矩阵置以内的整数,输出该矩阵,然后逆置该矩阵,即将第一列的元素放到第一行上,将第二列的元素放到第二行上,其他以此类推。
#includestdio.h
#includestdlib.h
#definem5
#definen5
main()
{inta[m][n],i,j,k;
for(i=0;im;i++)
for(j=0;jn;j++)
a[j]=rand()%;
for(i=0;im;i++)
{for(j=0;jn;j++)
printf("%-2d",a[j]);
printf("\n");
}
for(i=0;im;i++)
for(j=i;jn;j++)
{k=a[j];
a[j]=a[j];
a[j]=k;
}
printf("逆置\n");
for(i=0;im;i++)
{for(j=0;jn;j++)
printf("%-2d",a[j]);
printf("\n");
}
}