20 C程序设计基础习题集
习 题 七
1. 单项选择题
⑴ 下列数组声明语句中,正确的是【C】
A、int a[]={1,2,,4,5}; B、char a[5]={A,B,C,D,E}; C、int a[5]={1,2}; D、char a[5]=\
⑵ 数组声明语句为“int a[6];”,输入数组所有元素的语句应为【B】 A、scanf(\
B、for(int i=0;i<6;i++) scanf(\ C、for(int i=0;i<6;i++) scanf(\ D、for(int i=0;i<6;i++) scanf(\
⑶ 数组声明语句为“float a[3][4];”,引用第3行第1列的元素写作【A】 A、**(a+2) B、*(*a+2) C、a[3][1] D、*(a[3]+1) ⑷ 初始化多维数组的语句中,可以缺省的是【B】
A、最后1个下标界 B、第1个下标界 C、第2个下标界 D、以上都不对 ⑸ 数组声明为“int y[4][3];”,表达式“*(y+2)+2-*y”的值为【D】 A、10 B、20 C、16 D、8 ⑹ 数组声明为“char str1[20]=\”, 调用函数“strcpy(str1,str2);”后,字符串str1的串长是【C】 A、13 B、15 C、6 D、7 ⑺ 数组声明为“char str1[20]=\”, 调用函数“strcat(str1,str2);”后,字符串str1的串长是【A】 A、13 B、15 C、6 D、7 ⑻ 表达式“strcmp(\”的值为【C】 A、0 B、3 C、1 D、-3
2. 填空题。
⑴ 未初始化的int类型数组,其各元素的值是 0 。
⑵ 初始化时没有被赋值的字符类型数组元素,它们的值为 '\\0' 。 ⑶ 数组声明为“int a[6];”,数组元素a[1]是否又可以写作“*(a++)”? 原因是 不可以,数组名(地址常量)不可改变 。
⑷ 引用二维数组a第i行、j 列的元素(i、j为0表示第1行、第1列),可以写 作 *(*(a+i-1)+j-1) 或 a[i-1][j-1] 。
⑸ 数组声明为“int a[6][6];”,表达式“*a+i”是指 第1行第i+1个元素的地址、 “*(a+i)”是指 第i+1行第1个元素的地址、“**a”又是指a[0][0]。 ⑹ 数组声明为“float x[7][5];”,若x[6][4]是内存中从x[0][0]数起的第35个 元素,则x[4][4]是第 25 个元素。
⑺ 声明“char str1[20]=\后,使字符串str1为\的赋 值表达式,应为 str1[7]='\\0' 。
⑻ 将包括空格在内的6个字符串输入到字符数组a[6][20]中,输入语句可以写作 for(i=0;i<6;i++) gets(a[i]); 。
程序设计基础习题集 21 3. 按照下列各题题意编程。
⑴ 输入平面上凸10边形各点x、y坐标,计算并输出各点之间距离之和。 解答: #include
{ float x[10],y[10],s=0; int i;
for(i=0;i<10;i++) scanf(\ for(i=0;i<9;i++)
for(j=i+1;j<10;j++)
s+=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); printf(\ }
⑵ 编程,计算多项式 a0+a1x+a2x+a3x+...+ an-1x的和(n≤30)。 解答: #include
{ float a[30],x,y; int i,n,t; scanf(\
for(i=0;i for(i=1;i ⑶ 输入n(n≤20)个数,按绝对值从小到大排序后输出。 解答: #include { float a[20],temp; int i,j,k; for(i=0;i<20;i++)scanf(\ for(i=0;i<19;i++) { k=i; for(j=i+1;j<20;j++)if(fabs(a[j]) for(i=0;i<20;i++)printf(\ printf(\ } ⑷ 输入一个5行、6列的数组,先以5行6列的格式输出该数组,然后找出该数组中值最小的元素、输出该元素及其两个下标值。 解答: #include { float a[5][6],min; int i,j,k,l; for(i=0;i<5;i++) for(j=0;j<6;j++)scanf(\ 2 3 n-1 22 C程序设计基础习题集 for(i=0;i<5;i++) { for(j=0;j<6;j++) printf(\ } min=a[0][0];k=0;l=0; for(i=0;i<5;i++) for(j=0;j<6;j++) if(a[i][j] ⑸ 输入一个5行、6列的数组,将每1行的所有元素都除以该行上绝对值最大的元素,然后输出该数组。 解答: #include { float a[5][6],max; int i,j; for(i=0;i<5;i++) for(j=0;j<6;j++) scanf(\ for(i=0;i<5;i++) { max=a[i][0]; for(j=1;j<6;j++) if(fabs(a[i][j])>fabs(max))max=a[i][j]; for(j=0;j<6;j++)a[i][j]/=max; } for(i=0;i<5;i++) { for(j=0;j<6;j++)printf(\ printf(\ } } ⑹ 输入一个字符串(串长不超过60),删除字符串中所有的空格符。如输入字符串为 \x1 + y ; \,处理后的字符串为 \。 解答: #include { char s[61]; int i,n,k; gets(s); while(1){ k=0; n=strlen(s); while(s[k++]!=' ' && k if(k printf(\ } ⑺ 输入20个字符串到字符数组str[20][30],统计其中相同字符串个数的最大数。 解: #include 程序设计基础习题集 23 { char str[20][30]; int i,j,k=0,k1; for(i=0;i<20;i++) gets(str[i]); for(i=0;i<20;i++) { k1=0; for(j=i+1;j<20;j++) if(strcmp(str[i],str[j])==0) k1++; if(k1>k)k=k1; } printf(\ } 4. 写出下列程序的输出结果 程序⑴ #include { int m[]={1,2,3,4,5,6,7,8,9},i,j,k; for(i=0;i<4;i++) { k=m[i]; m[i]=m[8-i]; m[8-i]=k; for(j=0;j<9;j++) printf(\ putchar('\\n'); } } 输出结果为 9 2 3 4 5 6 7 8 1 9 8 3 4 5 6 7 2 1 9 8 7 4 5 6 3 2 1 9 8 7 6 5 4 3 2 1 程序⑵ #include { int x[4][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8},{7,8,9,10}},i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) *(*(x+i)+j)/=*(*(x+i)+i); for(i=0;i<4;i++) { for(j=0;j<4;j++) printf(\ putchar('\\n'); } } 输出结果为 1 2 3 4 0 1 5 6 0 9 1 8 0 0 0 1 程序⑶ #include { char line[]=\ 24 C程序设计基础习题集 int i,k=strlen(line); for(i=0;i<4;i++) { line[k-i]='\\0'; puts(line+i);} } 输出结果为 123456789 2345678 34567 46 5. 根据下列各题题意填空,将程序补充完整。 ⑴ 输入10个数,输出其中与平均值之差的绝对值为最小的数。 #include { float a[10],s,d,x; int i; for(i=0;i<10;i++) scanf(\ s=0; for(i=0;i<10;i++) s+=a[i]; s/=10; d=fabs(a[0]-s); x=a[0] ; for(i=1;i<10;i++) if(fabs(a[i]-s) d= fabs(a[i]-s) ; x=a[i]; } printf(\ } ⑵ 输出如下形式的二项式系数表(以6行为例)。要求表的行数在运行时输入,若小于1或者大于10则重新输入。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 程序如下: #include { int a[10][10]={{0}},i,j,n; while( scanf(\ for(i=0;i for(j=1;j for(j=0;j<=i;j++) printf(\