一、单项选择题
1.以下对一维整型数组a 的正确说明是【 】。
A) int a(10); B) int n=10,a[n]; C) int a[ ];
D) #define SINE 10 int a[SIZE]; 【答案】D
2.以下对二维数组a 的正确说明是【 】。
A) int a[3][ ] ; C) double a[3][4];
【答案】C
B) float a[ ][4]; D) float a(3)(4);
3.若有定义int a[10]; 则对a数组元素的正确引用是【 】。
A) a[10]
【答案】C
B) a(10)
C) a[0]
D) a[10.0]
【解析】四个选项中a[10] 下标越界;a(10) 不是数组元素的引用形式;a[10.0] 是错误的,因为下标不允许是实型常量。只有C正确,下标从0开始。
4.以下能对二维数组a进行正确初始化的语句是【 】。 A) int a[2][ ]={{1,0,1},{5,2,3}}; B) int a[ ][3]={{1,2,3},{3,2,1}};
C) int a[2][4]={1,2,3},{4,5},{6}}; 【答案】B
D) int a[ ][ ]={1,2,3,4,5,6,7}
5.若有定义int s[ ][3]={1,2,3,4,5,6,7}; 则s数组第一维的大小是________ 。
A) 2 B) 3 C) 4 D) 不确定 【答案】B 6.若有定义char array[ ]=\"Child\"; 则数组array的长度为【 】。
A) 4 B) 5 C) 6 D) 7 【答案】C
【解析】因为给array数组初始化是用字符串\"Child\",array数组中最后一个字符是 '\\0',因此,数组长度为6。
7.以下选项中,不能正确赋值的是【 】。
A) char s1[10]; s1=\"China\"; C) char s3[10]=\"China\";
【答案】A
1
B) char s2[ ]={'C','h','i','n','a'}; D) char s3[10]={\"China\
【解析】因为s1 是数组名,代表数组的首地址,是常量,常量不能被赋值。
8.若有定义:char x[ ]=\"abcdefg\"; char y[ ]={'a','b','c','d','e','f','g'};则正确的叙述为【 】。
A) 数组x和数组y等价 B) 数组x和数组y的长度相同 C) 数组x的长度大于数组y的长度 D) 数组x的长度小于数组y的长度
【答案】C
【解析】因为x数组初始化是用字符串\"abcdefg\",x数组的长度为8,y数组初始化是用7个字符,y数组的长度为7,所以,数组x的长度大于数组y的长度。 9.函数调用:strcat(strcpy(str1,str2),str3)的功能是【 】。
A) 将串str1复制到串str2中后再连接到串str3之后
B) 将串str1连接到串str2之后再复制到串str3之后
C) 将串str2复制到串str1中后再将串str3连接到串str1之后 D) 将串str2连接到串str1之后再将串str1复制到串str3中 【答案】C
10.下列程序的输出结果是___________。
#include \"stdio.h\" #include \"string.h\" void main( )
{ char st[20]=\"\\\"hello\\\"\"; printf(\"%d\\n\}
A) 6 【答案】B
B) 7
C) 11
D) 12
二、填空题
1.若有以下定义:double m[20]; 则m数组元素的最小下标是______,最大下标是______。
【答案】0和19
2.在C语言中,二维数组元素在内存中的存放顺序是按_________ 存放的。
【答案】行
3.若有以下定义:int a[3][5]={{0,1,2,3,4},{3,2,1,0},{0}}; 则初始化后a[1][[2]的值是________,a[2][1]的值是_________ 。 【答案】1和0 4.若有以下定义:char s[100],d[100];int j=0,i=0; 且s 中已赋字符串,请填空以实现字符串复制。(注意:不得使用逗号表达式) while (s[i]) { d[j]= _________ ;j++;} d[j]=0;
【答案】s[i++]
2
5.下列程序的输出结果是_____________。
#include \"stdio.h\" void main( ) { int k,a[2]; k=a[1]*10; printf(\"%d\\n\}
A) 0 【答案】D
B) 1
C) 10
D)不定值
【解析】定义a数组时没有赋初值,初值不定,因此,a[1]*10是个不定值。 6.下列程序的输出结果是____________。
#include \"stdio.h\"
void main( ) { int i,a[10];
for (i=9; i>=0; i--) a[i]=10-i;
printf(\"%d%d%d\\n\}
A) 258 【答案】C
B) 741
C) 852
D) 369
7.下面程序的功能是:从键盘上输入若干个学生的成绩,当输入负数时表示输入结束,计算每位学生的平均成绩,并输出低于平均分的学生成绩。请填空。
#include \"stdio.h\" void main( )
{ float x[1000],sum=0,ave,a; int n=0,i;
printf(\"Enter mark:\\n\"); scanf(\"%f\
while (a>=0 && n<=100) { sum+=【1】_________; x[n]=【2】_________; n++;
scanf(\"%f\ }
ave=【3】_________; printf(\"Output:\\n\"); printf(\"ave=%f\\n\ for (i=0; i if (x[i] 【答案】【1】a 【2】a 【3】sum/n 8.输入一个字符串,判断其是否回文,是输出“Yes!”,不是输出“No!”。 请填空。(所谓回文就是正着读反着读相同。例如:ABCDCBA、madam是回文;ABCDE、China不是回文) #include \"stdio.h\" void main( ) { char s[100];int i,j,k; printf(\"\\nPlease enter string:\\n\"); gets(【1】_________); k=strlen(s)-1; for (i=0,j=k; 【2】_________; i++,j--) if(s[i]【3】_________s[j]) break; if (i>=j) printf(\"Yes!\\n\"); else printf(\"No!\\n\"); } 【答案】【1】s 【2】i { int a[M][N],i,j,sum=0; for (i=0; i 4 } for (i=1; i printf(\"sum=%d\\n\} 【答案】【1】&a[i][j] 【2】a[M-1][i] 或a[3][i] 【3】a[i][N-1] 或a[i][4] 10.以下程序用来对从键盘上输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码值之差。例如:输入的两个字符串分别为abcdefg和abceef,则输出为-1。请填空。 #include \"stdio.h\" #include \"string.h\" void main( ) { char str1[80], str2[80],c; int i=0,s; gets (str1); gets (【1】_________); while ((str1[i]==str2[i]) && (str1[i]!= 【2】_________)) i++; s=【3】_________; printf(\"%d\\n\ } 【答案】【1】str2 【2】'\\0' 【3】str1[i]-str2[i] 三、阅读下面的程序,写出程序输出结果 1. #include \"stdio.h\" void main( ) { int n[3],i,j,k; for (i=0; i<3; i++) n[i]=0; k=2; for (i=0; i 【答案】3 【解析】第一个for循环给n数组中各元素赋0值,第二个for循环是循环嵌套,当i等于0时,j等于0求出n[0]等于1,j等于1时求得n[1]等于2,因为此时n[0]=1而不是0了。当i等于1时,j等于0求出n[0]等于3,j等于1时求得n[1]等于3。 2. #include \"stdio.h\" 5 void main( ) { int a[2][3],i,j,n=1; for (i=0; i<2; i++) for (j=0; j<3; j++) a[i][j]=n++; for (i=0; i<2; i++) { for (j=0; j<3; j++) printf(\"%4d\ printf(\"\\n\"); } } 【答案】1 2 3 4 5 6 3.#include \"stdio.h\" void main( ) { char ch[7]={\"652ab31\ int i,s=0; for (i=0; ch[i]>='0' && ch[i]<='9'; i+=2) s=10*s+ch[i]-'0'; printf(\"%d\\n\} 【答案】62 4. #include \"stdio.h\" #include \"string.h\" void main( ) { char ss[10]=\"12345\"; strcat(ss,\"6789\"); gets(ss); printf(\"%s\\n\ } 运行时输入:ABC,写出输出结果。 【答案】ABC 5.(1)程序的功能是什么?(2)写出程序运行的输出结果。 #define N 8 #include \"stdio.h\" void main() { int i,j,t,min,a[N]={60,67,90,84,40,70,57,78}; for (j=0; j if (a[j]>a[i]) { t=a[j];a[j]=a[i];a[i]=t; } for(i=0;i } 【答案】(1)用选择法将N个数从小到大排序 (2)输出结果是: 40 57 60 67 70 78 84 90 四、编程题 1.编程序求Fibonacci数列的前20项,Fibonacci数列的定义为: fn= 1 (n=1) 1 (n=2) fn-1+fn-2 (n>2) 要求将数列存放在数组中,并按每行5个数的格式输出该数列。 程序: #include \"stdio.h\" void main( ) { int i; long f[30]={1,1}; for (i=2; i<30; i++) f[i]=f[i-2]+f[i-1]; for (i=0; i<30; i++) { if(i%5==0) printf(\"\\n\"); printf(\"%12ld\ } printf(\"\\n\"); } 输出结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 2.用“冒泡法”将输入的10个字符按从小到大顺序排序并输出结果。 程序: #include \"stdio.h\" 7 void main( ) { int i,j,t; char str[10]; for (i=0; i<10; i++) scanf(\"%c\ for (j=1; j<10; j++) for (i=0; i<10-j; i++) if (str[i]>str[i+1]) { t=str[i]; str[i]=str[i+1]; str[i+1]=t; } for (i=0; i<10; i++) printf(\"%c\ printf(\"\\n\"); } 运行情况如下: eifjsacrop acefijoprs 3.已知a数组中的数据已按升序排序,要求从键盘输入一个数后将其插入a数组中,并使该数组中的数据仍然有序。 思路: 这是一个“插入法排序”问题。若a数组中的数已经按由小到大排好序,现在要将输入的数n按顺序插入到a数组中。从a[0]开始,将a数组中的每个数与n比较大小,当找到第一个比n大的数时,该位置i就是n要插入的位置,然后将a[i]开始的所有数依次后移一个位置,最后将n插入到a[i]中。 方法1算法如图5-1所示。 程序: #include \"stdio.h\" void main( ) { int a[11]={2,4,5,6,8,10,23,36,47,68}, n,i,j; printf(\"array a:\\n\"); for (i=0; i<10; i++) printf(\"%5d\ printf(\"\\nInsert data:\"); scanf(\"%d\ if (n>a[9]) a[10]=n; else { for (i=0; i<10; i++) if (a[i]>n) { for (j=9; j>=i; j--) 8 输入待插入的数n n>末尾元素 T F 将n插在 for (i=0; i<10; i++) 数组尾 a[i]>n T F 从a[9]~a[i]依次 后移一个位置 将n插入到a[i]处 输出结果 图5-1 插入法排序方法1 a[j+1]=a[j]; a[i]=n; break; } } printf(\"Now,array a:\\n\"); for (i=0; i<11; i++) printf(\"%5d\ printf(\"\\n\"); } 运行结果: array a: 2 4 5 6 8 10 23 Insert data:7 Now,array a: 2 4 5 6 7 8 10 方法2算法如图5-2所示。 程序: #include \"stdio.h\" void main( ) { int a[11]={2,4,5,6,8,10,23,36,47,68}; int t1,t2,n,i,j; printf(\"\\narray a:\\n\"); for (i=0; i<10; i++) printf(\"%5d\ printf(\"\\nInsert data:\"); scanf(\"%d\ if (n>a[9]) a[10]=n; else { for (i=0; i<10; i++) { if (a[i]>n) { t1=a[i]; a[i]=n; for (j=i+1; j<11; j++) { t2=a[j]; a[j]=t1; t1=t2; } break; } 36 47 68 23 36 47 68 输入待插入的数n n>末尾元素 T F 将n插在 for(i=0;i<10;i++) 数组尾 a[i]>n T F 将n插入到a[i]处 从a[i]~a[9]依次 后移一个位置 输出结果 图5-2插入法排序方法2 9 } } printf(\"Now,array a:\\n\"); for (i=0; i<11; i++) printf(\"%5d\ printf(\"\\n\"); } 4.分别求N阶方阵的两条对角线上元素之和。 思路: N阶方阵就是N行N列的矩阵,矩阵左对角线上的元素是a[i][i](i=0~N-1),右对角线上的元素是a[i][j](其中:i=0~N-1,j=N-1-i)。由于j的值取决于i,因此只要一个for循环即可。例如三阶方阵 1 2 3 1 3 5 2 4 6 a= 左对角线元素之和是:1+3+6=10,右对角线上元素之和是3+3+2=8。 程序: #include \"stdio.h\" void main( ) { int a[3][3]={1,2,3,1,3,5,2,4,6},sum1,sum2,i; sum1=sum2=0; for (i=0; i<3; i++) { sum1=sum1+a[i][i]; sum2=sum2+a[i][3-1-i]; } printf(\"sum1=%d sum2=%d\\n\} 运行结果: sum1=10 sum2=8 5.打印出以下的杨辉三角形(要求打印出6行)。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 10 算法:如图5-3所示 程序: #define N 7 #include \"stdio.h\" void main( ) { int a[N][N],i,j; for (i=1; i 思路: 设:变量word作为标志变量,初值为0;当读到非空格时,word置1,读到空格时,word置0;变量num作为单词记数变量,读到第一个非空格时,num加1。 因此,当读到非空格字符时首先判断是否是新单词开始,如果word为0即为新单词开始,单词记数变量num加1,单词标志变量word置1,接下来若还是非空格字符,只要word为1就不是新单词开始,接着判断下一字符,当读到空格时,将word置0。 算法:如图5-4所示。 程序: #include \"stdio.h\" void main( ) { int i,num=0,word=0; char str[80]; gets(str); for (i=0; str[i]!='\\0'; i++) if (str[i]==' ') word=0; else if (word==0) { word=1; num++; 11 使数组第一列和对角线元素值为1 其他各元素:a[i][j]=a[i-1][j-1]+a[i-1][j] (用双重for循环控制i和j的变化) 输出结果 图5-3 输出杨辉三角形 输入一字符串给str数组 i=0,num=0,word=0 当 str[i]≠'\\0' str[i]= ' ' T F word=0 word=0 T F word=1 num=num+1 i=i+1 输出:num 图5-4 统计单词 } printf(\"%d\\n\} 运行情况如下: Chinese Materials Research Society 4 12 因篇幅问题不能全部显示,请点此查看更多更全内容