C语言数组试题

更新时间:2024-05-07 13:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第4章 数组

4.1内容概述

本章主要介绍了数值数组和字符数组的定义、初始化、元素引用和数组数据的输入与输出,字符数组实现字符串、字符串函数的实现与调用。指针数组与数组指针定义、元素引用。利用一维数组实现如挑数、排序、求和等实际应用问题。利用二维数组实现矩阵的应用问题。利用字符数组实现字符串的各种操作。本章知识结构如图4.1所示。

定义

初始化

数值数组

元素引用

数组元素输入和输出

定义

初始化 数组 字符数组

元素引用

数组元素输入和输出

定义

指针数组 初始化

应用

图4.1 第4章知识结构图

考核要求:掌握一维数组、二维数组、字符数组和指针数组的定义和初始化;掌握数组元素存储地址计算;掌握数组元素的下标法、指针法引用;掌握字符数组与字符串的区别与联系;掌握有关字符串处理函数的使用方法;能利用一维数组、二维数组解决向量、矩阵等实际应用问题。

重点难点:本章的重点是一维数组、二维数组和字符数组的定义、初始化、元素引用,字符串处理函数的使用。本章的难点是字符串与字符数组的区别,指针数组和数组元素的指针法引用。

核心考点:数组的定义、初始化和数组元素的引用方法,一维数组、二维数组和字符数组的实际应用,字符串的处理方法。

4.2 典型题解析

【例4.1】以下对一维数组a的定义中正确的是( )。 A. char a(10); B. int a[0..100];

C. int a[5]; D. int k=10;int a[k]; 解析:一维数组定义的一般形式为:

类型标识符 数组名[常量表达式]

其中,常量表达式可以是任意类型,一般为算术表达式,其值表示数组元素的个数,即数组长度。

答案:C

【例4.2】以下对一维数组的定义中不正确的是( )。 A. double x[5]={2.0,4.0,6.0,8.0,10.0};

62

B. int y[5]={0,1,3,5,7,9};

C. char ch1[ ]={'1', '2', '3', '4', '5'}; D. char ch2[ ]={'\\x10', '\\xa', '\\x8'};

解析:可以对一维数组的全部元素或部分元素赋初值。在对全部数组元素初始化时,数组长度可以省略。若数组长度没有省略,则初始化列表中值的个数不能超过数组的长度。

答案:B

【例4.3】以下对二维数组的定义中正确的是( )。

A.int a[4][]={1,2,3,4,5,6}; B. int a[][3];

C.int a[][3]= {1,2,3,4,5,6}; D. int a[][]={{1,2,3},{4,5,6}};

解析:定义二维数组时,若按一维格式初始化,则第一维的长度可以省略,此时,系统可根据初始化列表中值的个数及第二维的长度计算出省略的第一维长度,但无论如何,第二维的长度不能省略。没有初始化时,每一维的长度都不能省略。

答案:C

【例4.4】假定一个int型变量占用两个字节,若有定义:int x[10]={0,2,4}; 则数组x在内存中所占字节数是( )。

A. 3 B. 6 C. 10 D. 20

解析:一维数组在内存中所占的字节数为:数组长度×sizeof(元素类型)。 答案:D

【例4.5】以下程序的输出结果是( )。 main()

{ int a[4][4]={{1,3,5},{2,4,6},{3,5,7}};

printf(\}

A. 0650 B. 1470 C. 5430 D. 输出值不定

解析:定义的数组a为4行4列,且前三行三列元素已初始化,根据C语法规定,未初始化的元素值为0。

答案:A

【例4.6】以下程序的输出结果是( )。 main()

{ int m[][3]={1,4,7,2,5,8,3,6,9};int i,j,k=2; for(i=0;i<3;i++){ printf(\}

A. 4 5 6 B. 2 5 8 C. 3 6 9 D. 7 8 9

解析:根据初始化列表中值的个数和第二维的长度,可求得第一维长度为3。第一行的元素值依次为1,4,7;第二行元素值依次为2,5,8;第三行元素值依次为3,6,9。循环执行三次,依次输出行标为2的三个元素,即第三行的3个元素。

答案:C

【例4.7】以下程序的输出结果是( )。 main()

{ int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=0; for(i=0;i<3;i++) for(j=i;j<=i;j++) t=t+b[i][b[j][j]]; printf(\

63

}

A. 3 B. 4 C. 1 D. 9

解析:程序中,引用的b数组元素的行下标为循环变量i,列下标为数组元素b[j][j]。外层循环共进行3次,对于每次外循环,内层循环只执行一次(即j=i),所以变量t 的值为元素b[0][b[0][0]]、b[1][b[1][1]]、b[2][b[2][2]]的和。由于数组元素b[0][0]、b[1][1]、b[2][2]的值分别为0、1、2,所以t的值为:0+0+1+2=3。

答案:A

【例4.8】若有定义:int a[2][4];,则引用数组元素正确的是( )。 A. a[0][3] B. a[0][4] C. a[2][2] D. a[2][2+1]

解析:引用二维数组元素时,行下标范围为0~行数-1,列下标范围为0~列数-1。 答案:A

【例4.9】若有定义:int aa[8];,则不能代表数组元素aa[1]地址的是( ) 。 A. &aa[0]+1 B. &aa[1] C. &aa[0]++ D. aa+1

解析: &aa[1]、&aa[0]+1和aa+1都是数组元素aa[1]的地址。由于&aa[0]是地址值常量,不能进行自加、自减运算,所以选项C不能代表aa[1]地址。

答案:C

【例4.10】下列程序执行后的输出结果是( ) 。 main()

{ int a[3][3], *p,i;p=&a[0][0]; for(i=0;i<9;i++) p[i]=i+1; printf(\}

A. 3 B. 6 C. 9 D. 随机数

解析:二维数组的物理存储结构为一维,即按行序顺序存储在连续存储空间中。

本题中,p为指向数组元素的指针变量,初始时,p指向a[0][0]。通过指针p实现对对二维数组元素按行依次赋值。a[1][2]即p[5],其值6。

答案:B

【例4.11】下列程序的输出结果是( )。 main()

{ char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5; printf(\}

A. 运行出错 B. a[4]的地址 C. 5 D. 3

解析:初始时,p指向a[5]。由于单目运算符的结合方向为右结合,所以,*--p等价于*(--p),即先执行--p,p指向a[4],再输出a[4]的值(5)。

答案:C

【例4.12】若有如下定义,则b的值是( )。

int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b=p[5];

A. 5 B. 6 C. 8 D. 9

解析:p指向a[3],即p=a+3;b=p[5],即b=*(p+5)。因此,b=*(a+8)=a[8]=9。 答案:D

【例4.13】若二维数组y有m列,则排在y[i][j]前的元素个数为( ) A.j*m+i B.i*m+j C.i*m+j-1 D.i*m+j+1 解析:C语言中的二维数组按行存储。行标为i的元素前共有i行元素,元素个数为i*m,

64

每行列标为j的元素前共有j个元素。因此,y[i][j]前的元素个数为i*m+j。

答案:B

【例4.14】若有定义:char a[10],*b=a;,则不能给数组a输入字符串”This is a book”的语句是( )。

A. gets(a) B. scanf(\

解析: gets为字符串输入函数,调用该函数时需给出字符串的存储地址,以回车作为字符串输入的结束,并将回车符转换成为’\\0’。而scanf函数则以回车、空格或跳格作为串输入结束,因此scanf不能输入有空格的字符串。

答案:B

【例4.15】以下程序执行后的输出结果是( )。

A. 2 B. 3 C. 4 D. 5 #include \main( )

{ char *p[10]={ \ printf(\} 解析:定义了一个含有10个元素的字符指针数组p,并对前5个元素初始化,其中p[4]指向字符串\,其串长为2。

答案:A 【例4.16】若定义一个名为s且初值为\的字符数组,则下列定义错误的是( )。 A.char s[]={’1','2','3','\\0 '}; B.char s[]={\

C.char s[]={\.char s[4]={'1','2','3'}; 解析:字符数组中所存字符中有’\\0’时,字符数组才能作为字符串使用。选项A是用字符常量对字符数组初始化,且最后一个元素的值为字符串结束标记(’\\0’),所以数组s中存放的就是字符串\;选项D是用字符常量对部分元素初始化,根据 C语言的规定,系统为第四个元素赋初值为空值,即'\\0',所以数组s中存放的也是字符串\123\。选项B是直接使用字符串\对字符数组初始化;选项C也是使用字符串初始化,但是字符串不是\,而是\\n\,数组长度为5。

答案:C

【例4.17】下列程序的功能是输入N个实数,然后依次输出前l个实数和、前2个实数和、…、前N个实数和。填写程序中缺少的语句。

#define N 10 main()

{ float f[N],x=0.0;int i; for(i=0;i

{ ① ;

printf(\ } }

解析:分析程序可知,第一个循环实现数据的输入,第二个循环实现求和并输出,程序中缺少的是计算前i个实数和并存入变量x的语句。由于每次循环的x值都是在前一次循环的基础上作累加,即前i个实数和(x)等于前i-1个实数和(x)加上第i个实数f[i-1],

65

因此,①处应填写:x=x+f[i-1];。

答案:x=x+f[i-l]; 或 x+=f[i-l]; 【例4.18】下面程序的功能是检查一个N×N矩阵是否对称(即判断是否所有的a[i][j]等于a[j][i])。请填空。 #define N 4

main()

{ int a[N][N]={1,2,3,4,2,2,5,6,3,5,3,7,4,6,7,4}; int i,j,found=0; for(j=0;j

for( ① ;i

if(found) printf(\ else printf(\}

解析:设置判断标志found,初始值为0。对于主对角线以上每个元素,分别与对称元素比较,若不相等,则将found置为1并结束比较。循环结束后,根据found的值确定是否对称。

答案:① i=j+1 ② found=1

【例4.19】编写程序,从一整型数组a的第一个元素开始,每三个元素求和并将和值存入到另一数组中(最后一组可以不足3个元素),最后输出所求的所有和值且每行输出5个值。

解析:用于存储和值的数组设为b,所有元素都初始化为0。从数组a的第一个元素开始,进行累加操作b[j]+=a[i],累加过程中,数组a的下标每自加3次,数组b的下标自加1次。重复此操作,直到数组a的所有元素累加完为止。输出时,每输出5个元素输出一次换行符\。

#define N 20 #define M N/3+1 main()

{ int a[N],i,j,b[M]={0};

for(i=0;i

if((i+1)%3==0) j++; }

if(N%3==0) j--; for(i=0;i<=j;i++) { printf(\

if((i+1)%5==0) printf(\ } }

【例4.20】已知数组b中存放N个人的年龄,编写程序,统计各年龄段的人数并存入数

66

for(j=i+2;j

{t=a[i];a[i]=a[j];a[j]=t;} puts(a);printf(\}

(2)下列程序的功能是在字符串s中找出与字符串t相同的子串的个数。请填空。 #include main()

{ char s[]=\ n=0;q=s; while(*q) { p=q;r=t; while(*r)

if( ③ ) { r++; p++;} else break;

if( ④ ) n++; q++; }

printf(\} (3)下面程序的功能是把给定的字符按其矩阵格式读入数组str中,并输出行号与列号之和为3的数组元素。请填空。

main( )

{ char str[4][3]={'A','b','C','d','E','f','G','h','I','j','K','l'}; int x,y,z;

for(x=0;x<4;x++)

for (y=0; ⑤ ;y++) { z=x+y;

if( ⑥ )

printf(\ } } (4)下面程序的功能是输入一个3×3的实数矩阵,求两条对角线元素中各自的最大值。请填空。

main()

{ float s[3][3],max1,max2,x; int i,j;

for(i=0;i<3;i++) for(j=0;j<3;j++)

{ scanf(\ max1= ⑦ ; for(i=1;i<3;i++)

if(max1

72

max2= ⑧ ;

if(max2

main()

{ long int a[40]={1,1}; int i;

for(i=2;i<40;i++)

a[i]= ⑨ ; for(i=0;i<40;i++)

{ if( ⑩ ) printf(\ printf(\ } }

4. 程序设计题

(1)给定一维整型数组,输入数据并求第一个值为奇数元素之前的元素和。

(2)给定一维整型数组,输入数据并对前一半元素升序排序,对后一半元素降序排序。 (3)输入字符串并统计各数字字符出现的次数。

(4)给定N×N矩阵,输入矩阵元素并互换主次对角线元素值。

(5)给定二维数组a[M][N],输入数据并将元素按照行序存入到一维数组b中。

4.4 实验题目

(1)数组a中存放N个非0整数,编写程序,将数组a中的所有正数存放在数组的前面,负数存放在数组的后面。

(2)将数组a中的N个元素后移m位,移出的m位顺序存放在数组的前m位。

(3)有5名学生,每名学生有语文、数学、物理和外语四门课的考试成绩,编程统计各学生的总分和平均分,以及所有学生各科的总分和平均分。 (4)将整型N×N矩阵主对角线元素进行升序排序。

(5)将4×4阶矩阵的4个最小值按升序存放在主对角线上。 (6)求N×N矩阵每行最大值的和。

(7)由键盘输入一个字符串,按照ASCII码由小到大的顺序排序,要求删除所输入的重复字符。如输入\,则应输出\。

(8)从键盘输入一个字符串,去掉所有非十六进制字符后转换成十进制数输出。要求如输入\,输出值为:10431。

4.5 思考题

(1)定义二维数组时是否可以省略第一维长度?省略时系统如何计算长度? (2)定义一维数组与引用一维数组元素时,“[]”内数据的含义是什么?

73

(3)若有定义:int a[3][4],(*q)[4]=a;,则如何利用指针变量q引用数组a的元素? (4)若有如下定义和语句:

int a[3][4],*p[3];

p[0]=&a[0][0];p[1]=&a[1][0];p[2]=&a[2][0]; 则如何利用指针数组名p引用数组a的元素? (5)试说明下列两种定义方式的区别。

char a[3][8]={\ char *a[3]={\

4.6 习题解答

1. 单项选择题(下列每小题有4个备选答案,将其中一个正确答案填到其后的括号内) (1)设有定义:int a[10],*p=a;,对数组元素的正确引用是( )。

① a[p] ② p[a] ③ *(p+2) ④ p+2

解答:a和p是地址,不可以用作数组元素的下标,所以①②错误,选项④为p之后两个元素的地址即等价于&a[2],选项③为元素a[2]。

答案:③

(2)若有如下定义,则不能表示数组a元素的表达式是( )。 int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;

① *p ② a[10] ③ *a ④ a[p-a] 解答:因为p初值为a,所以选项①为元素a[0],选项③也为元素a[0],选项④为a[0],选项②元素下标超出下标界限(0~9)。

答案:②

(3)若有如下定义,则值为3的表达式是( )。 int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;

① p+=2,*(p++) ② p+=2,*++p ③ p+=3,*p++ ④ p+=2,++*p

解答:四个表达式都是逗号表达式,表达式的值为第二个式子的值,选项①的p从指向a[0]改变为指向a[2],因此表达式值为3,选项②的p指向a[2],计算*++p时指针指向a[3],表达式值为4,选项③的p指向a[3],表达式值为4,选项④的p指向a[2],计算++*p后a[2]元素值变为4。

答案:①

(4)设有定义:char a[10]=\,则*(p+4)的值是( )。

① \② ’D’ ③ ’\\0’ ④ 不确定 解答:数组所赋初值为串,数组a[4]及其后的六个元素值都为'\\0',*(p+4)等价于*(a+4)即a[4]。

答案:③

(5)将p定义为指向含4个元素的一维数组的指针变量,正确语句为( )。

① int (*p)[4]; ② int *p[4]; ③ int p[4]; ④ int **p[4]; 解答:①定义p为指向含4个整型元素的一维数组的指针变量。②定义了一个有四个元素的指针数组,数组名为p,数组中的每一个元素都是指向整型变量的指针变量。③定义了一个有四个元素的整型数组,数组名为p。④定义了一个有四个元素的二级指针数组,数组名为p,数组中的每一个元素都是指向整型指针变量的指针变量。

答案:①

(6)若有定义int a[3][4];,则输入其3行2列元素的正确语句为( )。

74

① scanf(\② scanf(\③ scanf(\④ scanf(\

解答:输入3行2列元素的值,应使用其地址,即&a[2][1],或*(a+2)+1,或a[2]+1,所以③是正确的。

答案:③

(7)下面对指针变量的叙述,正确的是( )。

① 指针变量可以加上一个指针变量。 ② 可以把一个整形数赋给指针变量。 ③ 指针变量的值可以赋给指针变量。

④ 指针变量不可以有空值,即该指针变量必须指向某一变量。

解答:指针变量加上一个指针变量没有意义,所以①是错误的。不能把一个整型数直接赋给指针变量,因为类型不匹配,所以②是错误的。指针变量可以有空值(NULL),即不指向任何变量,所以④是错误的。指针变量的值可以赋给指针变量,同类型可以直接赋值,不同类型可通过强制类型转换,所以③是正确的。

答案:③

(8)设有定义:int a[10],*p=a+6,*q=a;,则下列运算哪种是错误的( )。

① p-q ② p+3 ③ p+q ④ p>q

解答:指向同一个数组的两个指针变量可以相减,其值是两个指针之间的元素个数。指向同一个数组的两个指针变量也可以比较,指向前面元素的指针“小于”指向后面元素的指针。指向数组元素的指针变量可以加减一个整型数c,加c后指向其后面的第c个元素,减c后指向其前面的第c个元素。但指向同一个数组的两个指针变量进行加法运算没有意义。

答案:③

(9)C语言中,数组名代表( )。

① 数组全部元素的值 ② 数组首地址 ③ 数组第一个元素的值 ④ 数组元素的个数 解答:C语言规定,数组名代表数组的首地址。 答案:②

(10)若有如下定义,则值为4的表达式是( )。

int a[12]={1,2,3,4,5,6,7,8,9,10,11,12}; char c=’a’,d,g;

① a[g-c] ② a[4] ③ a[’d’-’c’] ④ a[’d’-c]

解答:值为4的数组元素的下标为3,所以②是错误的,g-c的值不确定,’d’-’c’的值为1,只有’d’-c的值为3,所以④是正确的。

答案:④ (11)设有定义:char s[12]=\则printf(\的输出结果是( )。

① 6 ② 7 ③ 11 ④ 12

解答:函数strlen()的功能是返回字符串中第一个’\\0’之前的字符个数,所以输出结果为6。

答案:①

(12)语句printf(\的输出结果是( )。

① 11 ② 10 ③ 9 ④ 8 解答:字符串中的“\\n”、“\\1”和“\\\\”都是转义字符,都表示一个字符,所以字符串中的字符个数为9。

答案:③

75

(13)设有定义:int t[3][2];,能正确表示t数组元素地址的表达式是( )。

① &t[3][2] ② t[3] ③ t[1] ④ *t[2]

解答:C语言中,数组元素的下标从0开始,所以①和②是错误的,④表示数组元素a[2][0],③表示第二行的首地址,所以③是正确的。

答案:③

(14)语句strcat(strcpy(str1,str2),str3);的功能是( )。

① 将字符串str1复制到字符串str2中后再连接到字符串str3之后。 ② 将字符串str1连接到字符串str2中后再复制到字符串str3之后。

③ 将字符串str2复制到字符串str1后再将字符串str3连接到字符串str1之后。 ④ 将字符串str2连接到字符串str1后再将字符串str1复制到字符串str3中。 解答:先执行strcpy(str1,str2),即将字符串str2复制到字符串str1中,再执行strcat(str1,str3),即将字符串str3连接到字符串str1之后。

答案:③

(15)若有如下定义,则正确的叙述为( )。

char x[]=\

char y[]={’a’,’b’,’c’,’d’,’e’,’f’,’g’};

① 数组x和数组y等价 ② 数组x和数组y的长度相同

③ 数组x的长度大于数组y的长度 ④ 数组y的长度大于数组x的长度

解答:char y[]={’a’,’b’,’c’,’d’,’e’,’f’,’g’, ’\\0’};等价于:char x[]=\,所以③是正确的。

答案:③

2.程序分析题

(1)下列程序的运行结果是 main()

{ int a[3][3]={{1,2},{3,4},{5,6}}; int i,j,s=0; for(i=0;i<3;i++) for(j=0;j<=i;j++) s+=a[i][j]; printf(\ }

解答:此程序完成的功能是计算3×3矩阵的下三角阵(包括主对角线元素)元素和,运行结果是1+3+4+5+6,即19。

答案:19

(2)下列程序的运行结果是 main()

{ int i,j,k,n[3];

for(i=0;i<3;i++) n[i]=0; k=2;

for(i=0;i

printf(\

解答:当i=0时,n[0]=n[0]+1=1,n[1]=n[0]+1=2。

76

当i=1时,n[0]=n[1]+1=3,n[1]=n[1]+1=3。 答案:3

(3)下列程序的运行结果是 main()

{ int a[]={2,4,6,8,10}; int y=1,x,*p; p=&a[1];

for(x=0;x<3;x++) y+=*(p+x);

printf(\

解答:程序的功能是把数组a中下标为1、2和3的元素值累加到变量y上,即: y=1+4+6+8=19。 答案:19

(4)下列程序的运行结果是 main() { int i,c;

char num[][4]={\ for(i=0;i<4;i++)

{ c=num[0][i]+num[1][i]-2*’A’; printf(\ } } 解答:程序的功能是从左向右依次输出两个字符串对应字符的ASCII码之和与130的差值。

答案:2 5 5 8

(5)下列程序的运行结果是 main()

{ char a[]=\ int i,j,k;

for(i=0;i<5;i++) { printf(\

for(j=0;j

解答:此程序的功能是输出5行“*”号,每行有5个“*”,且从上到下每行向右挫一列。

答案: ***** ***** ***** ***** *****

(6)下列程序的功能是

77

main()

{ int i,a[10],*p=&a[9];

for(i=0;i<10;i++) scanf(\ for(;p>=a;p--) printf(\ }

答案:该程序把从键盘输入的10个整型数按相反的顺序输出。 (7)下列程序的运行结果是 main()

{ char ch[2][5]={\ int i,j,s;

for(i=0;i<2;i++) p[i]=ch[i]; for(i=0;i<2;i++) { s=0;

for(j=0;ch[i][j]!=’\\0’;j++) s=s*10+ch[i][j]-’0’; printf(\ } }

解答:程序的功能是把数字串转换成对应的数值。 答案:6937 8254

(8)下列程序的运行结果是 #include \ main()

{ int i,k,a[10],p[3]; k=5;

for ( i=0;i<10;i++) a[i]=i;

for(i=0;i<3;i++) p[i]=a[i*(i+1)]; for( i=0;i<3;i++) k+=p[i]*2;

printf(\ }

解答:由于k=5+(p[0]+p[1]+p[2])*2,且p[i]=a[i*(i+1)]=i*(i+1),所以k的值为 5+(0+2+6)*2=21。 答案:21

(9)下列程序的运行结果是 #include \ main( )

{ int a=2,*p,**pp; pp=&p; p=&a; a++;

printf(\ }

78

解答:由于p指向a,pp又指向p,所以a、*p和**pp等价,其值都为3。 答案:3,3,3

(10)下列程序的运行结果是 main( )

{ int a[6],i;

for(i=0;i<6;i++)

{ a[i]=9*(i-2+4*(i>3))%5; printf(\ } }

解答:程序的功能是:i的值从0到5,依次输出表达式9*(i-2+4*(i>3))%5的值。 答案:-3 –4 0 4 4 3

3. 程序填空题(在下列程序的 处填上正确的内容,使程序完整) (1)下列程序的功能是输出数组s中最大元素的下标。 main() { int k,i;

int s[]={3,-8,7,2,-1,4}; for(i=0,k=i;i<6;i++)

if(s[i]>s[k]) ① ; printf(\ }

解答:程序输出的是最大元素的下标,所以,应将i值赋给k,即k=i。 答案:① k=i

(2)下列程序的功能是将一个字符串str的内容颠倒过来。 #include \ main()

{ int i,j,k;

char str[]=\

for(i=0,j= ② ;i

解答:由于C语言中数组元素的下标从0开始,所以j的值应为字符串长度减1,即strlen(str)-1。

答案:② strlen(str)-1

(3)下列程序的功能是把输入的十进制长整型数以十六进制数的形式输出。 main()

{ char b[]=\ int c[64],d,i=0,base=16; long n;

scanf(\ do

{c[i]= ③ ;i++;n=n/base; }while(n!=0); for(--i;i>=0;--i)

{ d=c[i];printf(\

79

}

解答:进制转换的算法是除以基数取余,所以应填nose。 答案:③ nose (4)下列程序的功能是从键盘输入若干个字符(以回车键作为结束)组成一个字符串存入一个字符数组,然后输出该数组中的字符串。

#include \ main()

{ char str[81],*ptr; int i;

for(i=0;i<80;i++) { str[i]=getchar();

if(str[i]==’\\n’) break; }

str[i]= ④ ; ptr=str;

while(*ptr) putchar( ⑤ ); }

解答:根据while(*ptr)可知,字符串末尾应有’\\0’,所以第一个空应填’\\0’。当ptr所指向的字符不为’\\0’时,将其输出,并且使ptr指向下一个字符,所以第二个空应填*ptr++。

答案:④ ’\\0’ ⑤ *ptr++

(5)下列程序的功能是将数组a的元素按行求和并存储到数组s中。 main()

{ int s[3]={0};

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int i,j;

for(i=0;i<3;i++) { for(j=0;j<4;j++)

⑥ ; printf(\ } }

解答:根据题意,应将第i行累加到数组元素s[i]中。程序中的外循环次数是行数,内循环次数是列数,所以应填s[i]+=a[i][j](或s[i]=s[i]+a[i][j])。

答案:⑥ s[i]+=a[i][j](或s[i]=s[i]+a[i][j]) 4. 程序改错题(下列每小题有一个错误,找出并改正) (1)下列程序的功能是输入一个字符串,然后再输出。 main()

{ char a[20]; int i=0;

scanf(\

while(a[i]) printf(\ }

解答:使用scanf()函数时,输入项是地址,数组名本身就是地址,对数组名进行取地址运算没有意义。

80

答案:错误行:scanf(\修改为:scanf(\

(2)下列程序的功能是复制字符串a 到b中。 main()

{ char *str1=a,*str2,a[20]=\ str2=b;

while(*str2++=*str1++); } 解答:程序中用数组名a初始化指针变量str1,但此时数组a还没有定义,C语言规定,变量或数组必须先定义后使用,所以,必须先定义数组a,然后再定义指针变量str1,并用a对其初始化。

答案:

错误行:char *str1=a,*str2,a[20]=\修改为:char a[20]=\(3)下列程序的功能是统计字符串中空格数。 #include \ main()

{ int num=0;

char a[81],*str=a,ch; gets(a);

while((ch=*str++)!=’\\0’) if(ch=’ ’) num++; printf(\ } 解答:“=”是赋值运算符,程序中进行条件判断应使用关系运算符“==”。 答案:错误行:if(ch=’ ’) num++; 修改为:if(ch==’ ’) num++; (4)下列程序的功能是将字符串str中小写字母的个数、大写字母的个数和数字字符的个数分别存入a[0]、a[1]和a[2]中。

#include \ main()

{ char str[80]; int a[3],i=0; gets(str);

for(;str[i]!=’\\0’;i++)

if(str[i]>= ’a’&&str[i]<=’z’) a[0]++;

else if(str[i]>= ’A’&&str[i]<= ’Z’) a[1]++; else if(str[i]>= ’0’&&str[i]<= ’9’) a[2]++; for(i=0;i<3;i++)

printf(\ }

解答:数组a在定义时没有初始化,所以数组元素的初始值是随机的,因此,得到的统计结果不正确。

答案:错误行:int a[3],i=0; 修改为:int a[3]={0},i=0; (5)下列程序的功能是计算3×3矩阵的主对角线元素之和。 main()

81

{ int i,a[3][3]={1,2,3,4,5,6,7,8,9},sum=0; for(i=1;i<=3;i++) sum+=a[i][i]; printf(\ }

解答:C语言中数组元素的下标是从0开始的,所以循环变量i的取值应该是0到2。 答案:

错误行:将语句for(i=1;i<=3;i++) sum+=a[i][i]; 修改为:for(i=0;i<3;i++) sum+=a[i][i]; 5. 程序设计题

(1)输入10个整型数存入一维数组,输出值和下标都为奇数的元素个数。 解答: main()

{ int a[10],i,num=0;

printf(\ for(i=0;i<10;i++) scanf(\ for(i=0;i<10;i++)

if(i%2==1&&a[i]%2==1) num++; printf(\ }

(2)从键盘输入任意10个数并存放到数组中,然后计算它们的平均值,找出其中的最大数和最小数,并显示结果。

解答: main()

{ float a[10],ave=0,max,min; int i;

printf(\ for(i=0;i<10;i++) scanf(\ max=a[0];min=a[0]; for(i=0;i<10;i++) { ave+=a[i];

if(maxa[i]) min=a[i]; }

ave/=10;

printf(\}

(3)有5个学生,每个学生有四门课程,将有不及格课程的学生成绩输出。 解答: main()

{ int a[5][4]={{78,87,93,65}, {66,57,70,86}, {69,99,76,76},

82

{78,59,87,90}, {90,67,97,87}}; int i,j,k;

for(i=0;i<5;i++) for(j=0;j<4;j++) if(a[i][j]<60)

{ printf(\ for(k=0;k<4;k++)

printf(\ printf(\ break; } }

(4)已知两个升序序列,将它们合并成一个升序序列并输出。

解答:用数组a、b分别存放两个已知的升序序列,然后用下列方法将数组a、b中的元素逐个插入到数组c中。

?a[i]c[k]???b[j]a[i]?b[j]a[i]?b[j]

其中i、j、k的初值都为0,插入后k的值加1,i或j的值加1。 main()

{ int a[4]={1,3,5,7}; int b[5]={2,4,6,8,10}; int c[20],i=0,j=0,k=0; while(i<4&&j<5)

if(a[i]

printf(\ printf(\}

(5)从键盘上输入一个字符串,统计字符串中的字符个数。不许使用求字符串长度函数strlen()。 解答:

#include \main()

{ char str[81],*p=str; int num=0;

printf(\ gets(str);

while(*p++) num++;

printf(\

83

}

(6)输入一个字符串存入数组a,对字符串中的每个字符用加3的方法加密并存入数组b,再对b中的字符串解密存入数组c,最后依次输出数组a、b、c中的字符串。

解答:

#include \main()

{ char a[81],b[81],c[81]; char *pa=a,*pb=b,*pc=c; printf(\ gets(a);

while(*pa) {*pb=*pa+3; pa++;pb++;} *pb='\\0'; pb=b;

while(*pb) {*pc=*pb-3; pb++;pc++;} *pc='\\0';

printf(\ printf(\ printf(\}

(7)输入一个字符串,输出每个大写英文字母出现的次数。

解答:定义一个有26个元素的一维整型数组num,依次用来存放各个大写英文字母出现的个数。由于各大写英文字母的ASCII码与'A'的ASCII码的差,正好是用来存放该大写英文字母个数的数组元素的下标,所以,若当前字符*p为大写英文字母,则执行num[*p-'A']++即可使指定的数组元素值加1。

#include \main()

{ char str[81],*p=str; int num[26]={0},i;

printf(\ gets(str); while(*p)

{ if(*p>='A'&&*p<='Z') num[*p-'A']++; p++; }

for(i='A';i<='Z';i++) printf(\ printf(\ for(i=0;i<26;i++)

printf(\ printf(\}

(8)把从键盘输入的字符串逆置存放并输出。

解答:定义两个字符指针变量p和q,分别指向第一个字符和最后一个字符,交换p和q指向的字符,然后 p指向下一个字符,q指向前一个字符,再交换p和q指向的字符,如

84

此下去,直到p>=q为止。

#include \main()

{ char str[81],*p,*q,ch;

printf(\ gets(str); p=str;q=p; while(*q) q++; q--;

while(p

(9)输出4×4阶矩阵的主次对角线元素之和。

解答:矩阵主对角线上的元素,其行标和列标相等,矩阵次对角线上的元素,其行标与列标之和为3,用二维数组a[4][4]来表示4×4阶矩,所以,对满足行标和列标相等或行标与列标之和为3的二维数组元素求和即可。

main()

{ int a[4][4],i,j,sum=0;

printf(\ for(i=0;i<4;i++) for(j=0;j<4;j++)

scanf(\ for(i=0;i<4;i++) for(j=0;j<4;j++) if(i==j||i+j==3) sum+=a[i][j];

printf(\}

(10)统计一个英文句子中含有英文单词的个数,单词之间用空格隔开。

解答:单词的个数可以由空格出现的次数决定(连续的若干空格作为出现一次空格,一行开头的空格不统计在内)。如果当前字符不是空格,而它前面的字符是空格,则表示新单词开始,此时计数器加1。如果当前字符和它前面的字符都不是空格,则意味着仍然是原来单词的继续,计数器不能加1。前一个字符是否为空格,可以用一个变量word来标识,若word=0,则表示前一个字符为空格,若word=1,则表示前一个字符不为空格。

#include \main()

{ char str[81],*p=str; int num=0,word=0;

printf(\ gets(str); while(*p)

{ if(*p==' ') word=0; else if(word==0)

{ num++; word=1;}

85

p++; }

printf(\}

(11)从键盘上输入四个字符串(长度小于80),对其进行升序排序并输出。

解答:利用选择排序法进行排序,用strcmp()函数进行比较,用strcpy()函数进行交换。

#include \#include \main()

{ char str[4][81],temp[81]; int i,j;

printf(\ for(i=0;i<4;i++) gets(str[i]); for(i=0;i<3;i++) for(j=i+1;j<4;j++)

if(strcmp(str[i],str[j])>0) { strcpy(temp,str[i]); strcpy(str[i],str[j]); strcpy(str[j],temp); }

printf(\ for(i=0;i<4;i++) puts(str[i]); }

(12)已知一个排好序的数组,输入一个数,要求按原来排序的规律将它插入到数组中。 解答:从数组的最后一个元素开始,逐个进行输入数和数组元素值的比较,若输入数小于数组元素值(假设原来升序排序),则数组元素值后移一个位置,否则将输入数存入当前数组元素的后一个元素。

main()

{ int a[10]={1,3,5,7,9,11},n=6,i,num; printf(\ scanf(\ i=n-1;

while(a[i]>num&&i>=0) {a[i+1]=a[i];i--;} a[i+1]=num;

printf(\ for(i=0;i<=n;i++) printf(\ printf(\}

(13)编写程序,实现两个字符串的比较。不许使用字符串比较函数strcmp()。

86

解答:

#include \main()

{ char str1[81],str2[81],*p1=str1,*p2=str2; printf(\ gets(str1);

printf(\ gets(str2); while(*p1&&*p2)

if(*p1==*p2) {p1++;p2++;} else break;

printf(\}

(14)已知A是一个4×3阶矩阵,B是一个3×5阶矩阵,计算A和B的乘积。

解答:用二维数组a[4][3]、b[3][5]、c[4][5]来表示矩阵A、B、C,根据数学知识可知,c[i][j]=a[i][0]*b[0][j]+ a[i][1]*b[1][j]+ a[i][2]*b[2][j],所以用一个三重循环就可以求出数组c中全部元素。

main()

{ int a[4][3],b[3][5],c[4][5],i,j,k; printf(\ for(i=0;i<4;i++) for(j=0;j<3;j++)

scanf(\

printf(\ for(i=0;i<3;i++) for(j=0;j<5;j++)

scanf(\ for(i=0;i<4;i++) for(j=0;j<5;j++) { c[i][j]=0;

for(k=0;k<3;k++)

c[i][j]+=a[i][k]*b[k][j]; }

printf(\ for(i=0;i<4;i++) { for(j=0;j<5;j++)

printf(\ printf(\ } }

(15)输入10个数,将其中最小数与第一个数交换,将最大数与最后一个数交换。 解答:用一维数组a存放输入的10个数,在数组中找出最小元素和最大元素的下标maxi和mini,若maxi=0且mini=9,则[0]和a[9]交换即可,若maxi=0且mini≠9,则先交换a[0]和a[mini],然后再交换a[9]和a[mini],否则,先交换a[0]和a[mini],然后再交换a[9]

87

和a[maxi]。

main()

{ int a[10],i,maxi,mini,max,min; printf(\ for(i=0;i<10;i++) scanf(\ maxi=0;mini=0; max=a[0];min=a[0]; for(i=1;i<10;i++)

{ if(a[i]>max) {max=a[i];maxi=i;} if(a[i]

i=a[0];a[0]=a[mini],a[mini]=i; if(maxi==0) maxi=mini;

i=a[9];a[9]=a[maxi],a[maxi]=i; printf(\ for(i=0;i<10;i++) printf(\}

(16)有n个人围成一个圈子,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号。

解答:将此问题转化为一维数组来处理,先将数组a中的n个元素分别赋初值1到n,然后从a[0]开始,顺序查找第三个值不为0数组元素,若到a[n-1]还没找到,再从a[0]开始,找到后将其值赋为0;再从刚赋0元素的下一个元素开始按上述方法查找第三个值不为0数组元素,并将其值赋为0,依此下去,直到数组a中只有一个不为0的元素为止,其元素值不为0的下标就是所求。

#define N 10 main()

{ int a[N],m,i,k;

for(i=0;i<10;i++) a[i]=i; i=0; m=0;k=0; while(m<9)

{ if(a[i]!=0) k+=1;

if(k==3) { a[i]=0;k=0;m+=1;} i++;

if(i==10) i=0; }

for(i=0;i<10;i++)

if(a[i]!=0) printf(\}

(17)给定一个一维数组,任意输入6个数,假设为1、2、3、4、5、6。建立一个具有以下内容的方阵存入二维数组中。

1 2 3 4 5 6 2 3 4 5 6 1

88

3 4 5 6 1 2 4 5 6 1 2 3 5 6 1 2 3 4 6 1 2 3 4 5

解答:把一维数组元素存入二维数组的第一行,然后将一维数组的所有元素右移一位,移出去的元素存入第一位;再把一维数组元素存入二维数组的第二行,然后将一维数组的所有元素右移一位,移出去的元素存入第一位;依次下去,执行六次为止。

main()

{ int a[6],b[6][6],i,j,t;

printf(\ for(i=0;i<6;i++) scanf(\ for(i=0;i<6;i++)

{ for(j=0;j<6;j++) b[i][j]=a[j]; t=a[0];

for(j=0;j<5;j++) a[j]=a[j+1]; a[5]=t; }

for(i=0;i<6;i++) { for(j=0;j<6;j++)

printf(\ printf(\ } } (18)数组a中存放10个四位十进制整数,统计千位和十位之和与百位和个位之和相等的数据个数,并将满足条件的数据存入数组b中。

解答:依次取出数组a中每一个元素的个位、十位、百位和千位,并判断是否满足条件,若满足,则存入数组b,否则不存。

main()

{ int a[]={1221,2234,2343,2323,2112,2224,8987,4567,4455,8877}; int b[10],i,gw,sw,bw,qw,k,num=0; k=0;

for(i=0;i<10;i++) { gw=a[i]; sw=a[i]0/10; bw=a[i]00/100; qw=a[i]/1000; if(qw+sw==bw+gw)

{ num++;b[k++]=a[i];} }

printf(\ for(i=0;i

89

(19)将一个英文句子中的前后单词逆置(单词之间用空格隔开)。 如:how old are you

逆置后为:you are old how

解答:先将整个英文句子逆置,然后再将每个单词逆置。 #include \main()

{ char str[81],*p1,*p2,*p,ch;

printf(\ gets(str); p1=str;p2=str; while(*p2) p2++; p2--;

while(p1

{ ch=*p1;*p1++=*p2;*p2--=ch;} p=str; while(*p) { p1=p;

while(*p1==' ') p1++; p2=p1;

while(*p2&&*p2!=' ') p2++; p=p2; p2--;

while(p1

{ch=*p1;*p1++=*p2;*p2--=ch;} }

printf(\ puts(str); } (20)将一个小写英文字符串重新排列,按字符出现的顺序将所有相同字符存放在一起。 如:acbabca

排列后为:aaaccbb

解答:新开辟一个数组,从字符串的第一个非空格字符开始,把该字符和与该字符相同的字符都存入该数组,同时用空格代替原串中的相应字符;再从字符串的第一个非空格字符开始,把该字符和与该字符相同的字符都存入该数组,同时用空格代替原串中的相应字符,依次下去,直到原字符串变为空格串为止。

#include \#include \main()

{ char str1[81],str2[81],*p1,*p2,*p,ch; printf(\ gets(str1); p=str1;p2=str2; while(*p)

{ while(*p==' ') p++;

90

p1=p; ch=*p; while(*p1)

if(*p1==ch) {*p2=ch;*p1=' ';p1++;p2++;} else p1++; }

*p2='\\0';

printf(\ strcpy(str1,str2); puts(str2); }

4.7 自测试题参考答案

1. 单项选择题

(1) D (2) B (3) C (4) B (5) A (6) C (7) B (8)B (9) B (10) D 2. 程序分析题

(1) 1 1 1 0 (2) 1 3 7 15 (3) 4 (4) 5 (5) 8 3. 程序填空题

(1)① j+=2或j=j+2 或j++,j++ ② a[i]>a[j] (2)③ *r==*p ④ *r=='\\0' (3)⑤ y<3或y<=2 ⑥ z==3 (4)⑦ s[0][0] ⑧ s[0][2] (5)⑨ a[i-l]+a[i-2] ⑩ i%4==0 4. 程序设计题 (1)

#define N 10 main()

{ int a[N],i,s=0;

for(i=0;i

#define N 11 main()

{ int a[N],i,j,t;

for(i=0;i

if(a[i]>a[j]) {t=a[i];a[i]=a[j];a[j]=t;} for(i=N/2;i

if(a[i]

91

本文来源:https://www.bwwdw.com/article/imxg.html

Top