C语言程序设计教程清华大学出版社陈明主编第5章答案_第1页
C语言程序设计教程清华大学出版社陈明主编第5章答案_第2页
C语言程序设计教程清华大学出版社陈明主编第5章答案_第3页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章习题解答、选择题i以下叙述中错误的是。A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出B)数组名代表的是数组所占存储区的首地址,其值不可改变C)在程序执行中,当数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息D )可以通过赋初值的方式确定数组元素的个数解析:对于double类型数组,不能直接用数组名对数组进行整体输入或输出。所以选项A的说法是正确的。数组名代表数组所占内存区的首地址,是一个固定指针,其值不可改变,因此选项B也是正确的。在C语言一维数组定义时可以不指定数组长度,由赋初值的初值个数决定数组的长度。因此选项D也是正确的。C语言程序在

2、执行时,不检查数组元素的下标是否越界,如果出现越界,可能会引起系统死机,因此选项C不正确。答案:C2有以下程序:/* 文件路径名:ex5_1_2main.c */ #include <stdio.h>int main(void)char s = "abcde"s += 2;printf("%dn", s0); return 0;/*标准输入/出头文件*/* 主函数 main() */*定义字符数组*/* s自加2 */* 输出 s0 */*返回值0,返回操作系统*/执行后的结果是。A)输出字符a的ASCII码C)输出字符cB)输出字符c的AS

3、CII码D)程序出错解析:数组s的首地址值s是不可改变的,故该程序编译时会出错。答案:D3有以下程序:/* 文件路径名:ex5_1_3main.c */#include <stdio.h>/* 标准输入/出头文件 */int main(void)/* 主函数 main() */int a10 = 1,2, 3, 4, 5, 6, 7, 8, 9, 10, *p = &a3, *q = p + 2; /* 定义数组及变量*/printf("%dn", *p + *q);/* 输出 *p + *q 之值 */return 0;/*返回值0,返回操作系统*/程

4、序运行后的输出结果是 。A) 16B) 10C) 8D) 6解析:数组a各元素a0-a9的值依次为110,语句“ *p=&a3 ”把指针变量p初始化为&a3,即*p的值为4,指针变量q初始化为“ *q=p+2 ”,所以*q的值为6,从而*p+*q=l0。 答案:B4.有以下程序:/* 文件路径名:ex5_1_4main.c */#include <stdio.h>void Sort(int a, int n)int i, j, t;for (i = 0; i < n - 1; i+)for (j = i + 1; j < n; j+)if (ai <

5、; aj) t = ai; ai = aj; aj = t; int main(void)/*标准输入/出头文件*/*将a中元素从大到小进行排序*/*定义变量*/* 主函数 main() */int a10 = 1,2, 3, 4, 5, 6, 7, 8, 9, 10, i; /* 定义数组及变量*/Sort(a + 2, 5);/* 输出 ai */*换行*/*返回值0,返回操作系统*/for (i = 0; i < 10; i+) printf("%d,", ai);printf("n");return 0;程序运行后的输出结果是 。A) 1,

6、2,3,4,5,6,7,8,9,10B) 1,2,7,6,3,4,5,8,9, 10,C) 1,2,7,6,5,4,3,8,9,10D) 1,2,9,8,7,6,5,4,3, 10,解析:函数Sort()的功能是将数组a中的元素按照从大到小的顺序排列。但主函数调用Sort()时,实参是a+2和5,即是将数组a中a2-a6共5个元素进行从大到小的排序。所以得 至曲勺输出结果应该是1,2,7,6,5,4,3,8,9,10答案:C5以下数组定义中错误的是 。A) int x3 = 0;B) int x23 = 1,2, 3, 4, 5, 6;C) int x3 = 1,2, 3, 4, 5, 6;

7、D ) int x23 = 1,2, 3, 4, 5, 6;解析:二维数组赋初值时,第一个维数,即行数可以省略,但是列数不能省略。因此选 项A, C正确。选项D是按数据在二维数组中的顺序初始化。在选项 B中,行维数的初始化 格式跟定义的维数不一致,为错误选项。答案:B6. 有以下程序:/* 文件路径名:ex5_1_6main.c */*标准输入/出头文件*/* 主函数 main() */定义变量及数组*/*输岀元素值*/*换行*/*返回值0,返回操作系统*/#include <stdio.h>int main(void)int i, t3 = 9, 8, 7, 6, 5, 4, 3

8、, 2, 1; /* for (i = 0; i < 3; i+)printf("%d", t2 - ii);printf("n");return 0;程序的执行后的输出结果是 。A) 753B) 357C) 369D) 751解析:定义二维数组时第一维的长度可以不指定,该程序中t3通过赋初值等价于t33,并且其数组按行进行赋值,通过for循环输出的分别是t20、t11和t02。答案:B7. 若有语句"char *line5;”,以下叙述中正确的是 。A) 定义line是一个数组,每个数组元素是一个基类型为char的指针变量B) 定义li

9、ne是一个指针变量,该变量可以指向一个长度为5的字符型数组C) 定义line是一个指针数组,语句中的*号称为取址运算符D) 定义line是一个指向字符型函数的指针解析:在语句"char *line5;”中,遵照运算符的优先级,的优先级高于*号,因此line 先与结合,构成一个数组,数组的基类型为"char *”,所以line为指针数组,它的每个元素都是基类型为char的指针。所以选项 A叙述正确。答案:A8有以下程序:/* 文件路径名:ex5_1_8main.c */ #include <stdio.h>int main(void)int a33, *p, i;

10、p = & a00;for (i = 0; i < 9; i+)pi = i;for (i = 0; i < 3; i+) printf("%d ", a1i); printf("n");return 0;/*标准输入/出头文件*/* 主函数 main() */*定义数组及变量*/* p指向数组a的首元素*/*为pi赋值*/* 输出 a1i */*换行*/*返回值0,返回操作系统*/程序运行后的输出结果是 。A) 0 1 2 B) 1 2 3C) 2 3 4 D) 3 4 5解析:p指向二维数组a的首元素,而二维数组是按行存放的。因此

11、"for(i=0;i<9;i+)pi=i; ”的结果是等价于 a33=0,1,2,3,4,5,6,7,&,也就是 a33=10,1,2,3,4,5 , 16.7,8。 因此 a1i(i=0,1,2)的结果是 3, 4, 5。答案:D9. 若有定义语句“ int a23, *p3;”,则以下语句中正确的是 。A) p0=a;B) p0=a;C) p0=&a12;D) p1=&a解析:因为*p3定义成指针数组,指针数组中的任何元素都是基类型为int的指针,只有选项B是正确的。答案:B10. 设已有定义“ float x;”,则以下对指针变量p进行定义且赋初值

12、的语句中正确的A) float *p=1024;B) int *p=(float)x;C) float p=&x;D ) float *p=&x;解析:指针的值是变量的地址而不能是数值常量,所以选项A错;选项B同样是将float类型的值赋给指针而不是地址,所以选项B也错。定义指针变量前面必须有星号(*),所以选项C不正确。答案:D11. 若有定义“ short int a=10,20,30, *p=&a; ”,当执行“ p+; ”后,下列说法错误的A) p向高地址移了一个字节B) p向高地址移了一个存储单元C) p向高地址移了两个字节D) p与a+l等价解析:“ *p=

13、&a ”将数组a的首地址赋给指针 p,通过对指针变量加上一个整数可以移动 指针,移动的单位为存储单元,short int型变量在存储器中占两个字节。答案:A12. 有以下程序:/* 文件路径名:e5_1_12main.c */#include <stdio.h>int main(void)int a = 1, b = 3, c = 5;int *p1 = & a, *p2 = & b, *p = &c;*p = *p1 * (*p2);printf("%dn", c);return 0;/*标准输入/输岀头文件*/* 主函数 ma

14、in() */*定义变量*/*为指针变量赋值*/*修改p2指向的变量的值*/*输岀c */*返回值0,返回操作系统*/执行后的输出结果是。A) 1B) 2C) 3D) 4解析:指针pl指向变量a,指针p2指向变量b,指针p指向变量c, “ *p = *p1 * (*p2); ” 等价于“ c=a*b ”,故正确选项为 C。答案:C13. 己定义以下函数:f()函数返回值是 。A)不确定的值C)形参p中存放的值 解析:p中存放的是地址值,int f(int *p) return *p; B )一个整数D )形参p的地址值*p间接引用了 p指向的整数值。因此返回一个整数。答案:B14. 己有定义“

15、 char a = "xyz", b = 'x', 'y', 'z' ”,以下叙述中正确的是A)数组a和b的长度相同B) a数组长度小于b数组长度C) a数组长度大于b数组长度D )上述说法都不对解析:对于定义“ char a = "xyz", b = 'x', 'y', 'z' ”,由于字符串"xyz"串长为3,连同隐 含的结束符'0 ',占4个字节,所以a数组的长度为4。而b数组由单个字符赋初值,个数是 3,因此b数组长

16、度为3。答案:C15. 有以下程序:/* 文件路径名:ex5_1_15main.c */ #include <stdio.h>int main(void)char ch = "uvwxyz", *pc;pc = ch;printf("%cn", *(pc + 5); return 0;/*标准输入/输岀头文件*/* 主函数 main() */*定义字符数组与字符指针*/* pc指向字符数组ch的首字符*/* 输出 *(pc+5) */*返回值0,返回操作系统*/程序运行后的输出结果是 。A) zB) 0C)元素ch5地址D)字符y的地址解析:

17、字符指针pc指向字符串数组ch的的首字符,*(pc+5)就是pc的值。 答案:A16. 有以下程序:/*标准输入/输岀头文件*/* 主函数 main() */*定义数组与指针*/* 文件路径名:ex5_1_16main.c */ #include <stdio.h>int main(void)char s = "159", *p;p = s;printf("%c", *p+); printf("%cn", *p+); return 0;/* p指向s的首字符*/* 输出 *p+ */* 输出 *p+ */*返回值0,返回操

18、作系统*/程序运行后的输出结果是 D)59A)15B)16C) 12解析:数组s中存放字符串"159", p指向s的首字符。因此语句"printf("%c",*p+); ”输出 的是字符'1',输出后p加1指向下一个字符'5',下一个“peintf(.1%c",*p+); ”输出的是字符5'。答案:A17. 若要求从键盘读入含有空格字符的字符串,应使用函数 。A) puts()B) gets()C) getchar() D) scanf()解析:函数puts()是从屏幕输出一个字符。getcha

19、r(从键盘读入一个字符。scanf(是格式 化输入函数,空格字符被用于多个数据输入的分隔符,含有空格的字符串会被截断。gets(用于字符串的输入,并且以回车键为结束符。答案:B*18.对于长度为n的查找表进行顺序查找,在最坏情况下所需要的比较次数为 A) log2nB) n/2C) nD) n+l解析:如果查找表中的第一个元素就是要查找元素,则只需做一次比较就查找成功;如 果被查找的元素是查找表中的最后一个元素,或者被查找的元素根本就不在查找表中,则需 要与查找表中所有的元素进行比较,可知对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次。答案:C*19.冒泡排序在最坏情况下的比较次数是

20、 。A) n(n+l )/2B) nlogznC) n(n-1)/2D) n/2解析:如果查找表的长度为n ,则在最坏情况下,冒泡排序需要经过n-1趟从前往后扫描,每趟扫描需要的比较次数依次是n-1, n-2,,1,需要总比较次数为n(n-1)/ 2。答案:C 二、填空题1.设有定义语句“ int a3 = 0, 1, 2;”,则数组元素a12的值为。解析:二维数组中当某行一对花括号内的初值个数小于该行中元素的个数时,系统将自 动给该行后面的元素补初值0,由此可见数组a12=0。答案:02以下程序中,Lin eMax ()函数的功能是求3行4列二维数组每行元素中的最大值,请 填空。/* 文件路

21、径名:ex5_2_2main.c */#include <stdio.h>/*标准输入/输出头文件 */void LineMax(int m, int n, int a4, int *bar) int i, j, x;for (i = 0; i < m; i+)x = a【i【0;for (j = 0; j < n; j+)if (x < aij)x = aij; = x;int main(void)/*定义变量*/*第i行的首元素*/*如果x小于第i行的j号元素aij */*则将aij赋给x */* x为第i行的最大值*/* 主函数 main() */int a

22、34 = 12, 41,36, 28, 19, 33, 15, 27, 3, 27, 19, 1, b3, i;LineMax(3, 4, a, b); for (i = 0; i < 3; i+) printf("%4d", bi);printf("n");return 0;/if (*pmax < *py)*pmax = *py;if (*pmax < *pz) pmax = *pz; printf("max=%dn", max); return 0;调用LineMax()函数求每行的最大值*/*输岀每行的最大值

23、*/*换行*/*返回值0,返回操作系统*/解析:函数LineMax()的功能是求出二维数组每行元素中的最大值。对于3行4列的二维数组将有3个最大值存放到数组 bar中。x存放的是每行的最大值,求出每行的最大值x后,应该将x赋值给bari。因此此处填空应该是:bari。答案:bari3. 己知 “ int a = 3; ”,a 的地址为 1001, &a=。解析:变量的地址可以通过运算符&来得到,而a的存储单元地址是1001,所以&a=1001。答案:10014. 以下程序的功能是:利用指针指向三个整型变量,并通过指针运算找出三个数中的 最大值,输出到屏幕,请填空。/*

24、文件路径名:ex5_2_4main.c */#include <stdio.h>int main(void)int x, y, z, max, *px = &x, *py = &y, *pz scanf("%d%d%d", &x, &y, &z);/*标准输入/输岀头文件*/* 主函数 main() */&z, *pmax = &max; /* 定义变量 */* 输入 x,y,z */*如果*py更大*/* 则将*py赋给*pmax */*如果*pz更大*/* 则将*pz赋给*pmax */*输岀最大值*/

25、*返回值0,返回操作系统*/解析:程序中定义了 4个指针变量,px指向x, py指向y, pz指向乙pmax指向max, if 语句将pmax指向的存储单元的值与*py与*pz两个数值比较,可知*px代表x的值,可知初始 时假设x中的值最大,就让 pmax指向X。答案:*pmax = *px 或 *pmax = x 或 max = *px 或 max = x5以下程序的输出结果是。/* 文件路径名:ex5_2_5main.c */*标准输入/输岀头文件*/*字符串头文件 */* 主函数 main() */*输岀字符串的长度 */*返回值0,返回操作系统*/#include <stdio.

26、h>#include <string.h>int main(void)printf("%dn", strlen("IBMnO121"); return 0;解析:转义符'n'、1'和''都会别只算一个字符,所以"IBMn0121"的字符数为9。答案:96以下程序的输出结果是。/* 文件路径名:e5_2_6main.c */#include <stdio.h>#include <string.h>int main(void)char a = '1&

27、#39;, '2', '3', '4', '0' printf("%d,%dn", sizeof(a), strlen(a); return 0;/*标准输入/输岀头文件*/*字符串头文件 */* 主函数 main() */*定义字符数组*/*输岀字符串所占空间大小与长度 */*返回值0,返回操作系统*/解析:strlen()求字符串的实际长度,不包括'0' , sizeof(是求数组a所占的字节,包括'0'。答案:5,4*7 .对长度为10的查找表表进行冒泡排序,最坏情况下需要

28、比较的次数为 。解析:如果查找表的长度为10 ,则在最坏情况下,冒泡排序需要经过n-1趟从前往后扫描, 每趟扫描需要的比较次数依次是9, 8,1,需要总比较次数为 36。答案:45 三、编程题1.求一个4X 4整型矩阵对角线元素之和。 参考程序:/* 文件路径名:ex5_3_1main.c */*包含库函数printf()所需要的信息*/*包含库函数system(所需要的信息*/#include <stdio.h>#include <stdlib.h>int Sum(int a44)/* 返回二维数组a对角线元素之和*/int s = 0, i;for (i = 0;

29、i < 4; i+) /* 求对角线元素之和 */ s = s + aii;s = s + ai3 - i;/* 定义变量 */* 累加主对角线 */* 累加副对角线 */return s;/* 返回对角线元素之和 */int main(void)int a44 = 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12, 13,14,15,16 ;printf(" 对角线元素之和为 %dn", Sum(a);/* 主函数 main() */* 定义二维数组 */*输出二维数组a对角线元素之和*/system("PAUSE"); re

30、turn 0;/* 调用库函数 system( ),输出系统提示信息*/* 返回值 0, 返回操作系统 */2将一个数组中的值按逆序重新存放,例如,原来的顺序为6, 8,5,2,9。要求重排为 9, 2, 5,8,6。参考程序:/* 文件路径名 :ex5_3_2main.c */#include <stdio.h>#include <stdlib.h>void Reverse(int a, int n)int i, j, tem;for (i = 0, j = n - 1; i < j; i+, j-)/* 交换 ai与 aj */tem = ai; ai = a

31、j; aj = tem;int main(void)int a = 6, 8, 5, 2, 9, n = 5, i; printf(" 原数组 :");for (i = 0; i < n; i+) printf("%d ", ai);/* 包含库函数 printf() 所需要的信息 */*包含库函数system(所需要的信息*/*将数组a中的值按逆序重新存放*/* 定义变量 */*循环赋值交换ai与 aj */* 主函数 main() */* 定义数组及变量 */* 依次输出各元素之值 */printf("n");Reverse

32、(a, n);printf(" 逆序后 :");for (i = 0; i < n; i+)printf("%d ", ai);printf("n");/* 换行 */* 将数组 a 中的值按逆序重新存放 */* 依次输出各元素之值 */* 换行 */system("PAUSE"); return 0;/* 调用库函数 system( ),输出系统提示信息 */* 返回值 0, 返回操作系统 */3从键盘上输入三行文字,每行文字最多有80 个字符,要求分别统计其中的英文大写字母、小写字母、数字、空格和其它字符

33、的个数。参考程序:/* 文件路径名 :ex5_3_3main.c */#include <stdio.h>#include <stdlib.h>#include <string.h>/* 包含库函数 printf() 所需要的信息 */ /*包含库函数system(所需要的信息*/ /* 包含字符串库函数的信息 */int main(void)/* 主函数 main() */char str81;/* 存储一行字符 */unsigned int i, j, n1 = 0, n2 = 0, n3 = 0, n4 = 0, n5 = 0;/* 定义变量 */fo

34、r (i = 0; i < 3; i+) /* 输入并处理三行字符 */gets(str);for (j = 0; j < strlen(str); j+) /* 统计字符 */if (strj >= 'A' && strj <= 'Z') /* 大字字母 */n1+;else if (strj >= 'a' && strj <= 'z') /* 小字字母 */ n2+;else if (strj >= '0' && strj

35、 <= '9')/* 数字 */n3+;else if (strj = ' ') /* 空格 */n4+;else /* 其它字符 */n5+;/* 输入一行字符 str */* 对大写字母进行记数/* 对小写字母进行记数/* 对数字进行记数 */* 对空格进行记数 */* 对其它字符进行记数*/*/*/* 输出大写字母个数 */ /* 输出小写字母个数 */ /* 输出数字个数 */* 输出空格个数 */* 输出其它字符个数 */system("PAUSE"); return 0;/* 文件路径名 :ex5_3_4main.c */#

36、include <stdio.h>#include <stdlib.h>void StringCopy(char s1, char s2)/* 将字符数组 int i = 0;while (s1i = s2i) != '0') i+; int main(void)char s180, s2 = "this is a test!" StringCopy(s1, s2);puts(s1);system("PAUSE"); return 0;/* 包含库函数 printf() 所需要的信息 */*包含库函数system(

37、所需要的信息*/s2中全部字符复制到字符数组 si中,'0'也要复制过*/* 定义变量 */* 逐个复制字符 */* 主函数 main() */* 定义字符数组 */*将s2复制到si */* 输出 si */* 调用库函数 system( ),输出系统提示信息*/* 返回值 0, 返回操作系统 */5编写一个程序将两个字符串连接起来,要求不用strcat(函数。参考程序:/* 文件路径名 :ex5_3_5main.c */#include <stdio.h>#include <stdlib.h>char *StrCat(char si, char s2

38、)int i = 0, j = 0;while (sii != '0') i+;while (sii + j = s2j) != '0') j+;/* 包含库函数 printf() 所需要的信息 */*包含库函数system(所需要的信息*/*将s2中的字符串连接到si中字符串的后面*/* 定义变量 */* 使 sii = '0' */*将s2字符串连接到si中字符串的后面*/printf(" 含 %u 个大写字母 n", n1); printf(" 含 %u 个小写字母 n", n2); printf(&

39、quot; 含 %u 个数字 n", n3);printf(" 含 %u 个空格 n", n4); printf(" 含 %u 个其它字符 n", n5);/* 调用库函数 system( ),输出系统提示信息 */* 返回值 0, 返回操作系统 */4编写一个程序,将字符数组s2中全部字符复制到字符数组si中,要求不使用strcpy()函数,在复制时, '0' 也要复制过, '0' 后面的字符不再复制。参考程序:return s1;int main(void)char s180 = "This &qu

40、ot;, s2 = "is a test!" StrCat(s1, s2);puts(s1);system("PAUSE");return 0;6编写一个程序求字符串的长度,要求不使用 参考程序:/* 返回字符 s1 的首地址 */* 主函数 main() */* 定义字符数组 */* 将 s2 连接到 s1 */* 输出 s1 */* 调用库函数 system( ),输出系统提示信息 */ /* 返回值 0, 返回操作系统 */strle n()函数。/* 文件路径名 :ex5_3_6main.c */ #include <stdio.h>

41、#include <stdlib.h>unsigned int StrLen(char s)int i = 0;while (si != '0') i+; return i;int main(void)char s = "This is a test!" printf(""%s" 的长度是 %un", s, StrLen(s);system("PAUSE"); return 0;/* 包含库函数 printf() 所需要的信息 */*包含库函数system(所需要的信息*/* 返回将 s 中的字符串的长度 */* 定义变量 */*使si = '0' , i的值即为s的长度*/* 返回 i */* 主函数 main() */* 定义字符数组 */* 输出结果 */* 调用库函数 system( ),输出系统提示信息*/* 返回值 0, 返回操作系统 */7编写一个函数, 对含 n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论