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