




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 习题解答一、选择题1以下叙述中错误的是 。A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出B)数组名代表的是数组所占存储区的首地址,其值不可改变C)在程序执行中,当数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息D)可以通过赋初值的方式确定数组元素的个数解析:对于double类型数组,不能直接用数组名对数组进行整体输入或输出。所以选项A的说法是正确的。数组名代表数组所占内存区的首地址,是一个固定指针,其值不可改变,因此选项B也是正确的。在C语言一维数组定义时可以不指定数组长度,由赋初值的初值个数决定数组的长度。因此选项D也是正确的。C语言程序在执行时,不检查数组元素的下标是否越界,如果出现越界,可能会引起系统死机,因此选项C不正确。答案:C2有以下程序:/* 文件路径名:ex5_1_2main.c */#include /* 标准输入/出头文件 */int main(void)/* 主函数main() */char s = abcde;/* 定义字符数组 */s += 2;/* s自加2 */printf(%dn, s0);/* 输出s0 */return 0; /* 返回值0, 返回操作系统 */执行后的结果是 。A)输出字符a的ASCII码B)输出字符c的ASCII码C)输出字符c D)程序出错解析:数组s的首地址值s是不可改变的,故该程序编译时会出错。答案:D3有以下程序:/* 文件路径名:ex5_1_3main.c */#include /* 标准输入/出头文件 */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, 返回操作系统 */程序运行后的输出结果是 。A)16 B)10 C)8 D)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 /* 标准输入/出头文件 */void Sort(int a, int n)/* 将a中元素从大到小进行排序 */int i, j, t;/* 定义变量 */for (i = 0; i n - 1; i+)for (j = i + 1; j n; j+)if (ai aj) t = ai; ai = aj; aj = t; int main(void)/* 主函数main() */int a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, i; /* 定义数组及变量 */Sort(a + 2, 5);for (i = 0; i 10; i+)printf(%d, ai);/* 输出ai */printf(n);/* 换行 */return 0; /* 返回值0, 返回操作系统 */程序运行后的输出结果是 。A)1,2,3,4,5,6,7,8,9,10 B)1,2,7,6,3,4,5,8,9, 10,C)1,2,7,6,5,4,3,8,9,10 D)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;D)int x23 = 1, 2, 3, 4, 5, 6;解析:二维数组赋初值时,第一个维数,即行数可以省略,但是列数不能省略。因此选项A, C正确。选项D是按数据在二维数组中的顺序初始化。在选项B中,行维数的初始化格式跟定义的维数不一致,为错误选项。答案:B6有以下程序:/* 文件路径名:ex5_1_6main.c */#include /* 标准输入/出头文件 */int main(void)/* 主函数main() */int i, t3 = 9, 8, 7, 6, 5, 4, 3, 2, 1;/* 定义变量及数组 */for (i = 0; i 3; i+)printf(%d, t2 - ii);/* 输出元素值 */printf(n);/* 换行 */return 0; /* 返回值0, 返回操作系统 */程序的执行后的输出结果是 。A)753 B)357 C)369 D)751解析:定义二维数组时第一维的长度可以不指定,该程序中t3通过赋初值等价于t33,并且其数组按行进行赋值,通过for循环输出的分别是t20、t11和t02。答案:B7若有语句“char *line5;”,以下叙述中正确的是 。A)定义line是一个数组,每个数组元素是一个基类型为char的指针变量B)定义line是一个指针变量,该变量可以指向一个长度为5的字符型数组C)定义line是一个指针数组,语句中的*号称为取址运算符D)定义line是一个指向字符型函数的指针解析:在语句“char *line5;”中,遵照运算符的优先级,的优先级高于*号,因此line先与结合,构成一个数组,数组的基类型为“char *”,所以line为指针数组,它的每个元素都是基类型为char的指针。所以选项A叙述正确。答案:A8有以下程序:/* 文件路径名:ex5_1_8main.c */#include /* 标准输入/出头文件 */int main(void)/* 主函数main() */int a33, *p, i;/* 定义数组及变量 */p = &a00;/* p指向数组a的首元素 */for (i = 0; i 9; i+)pi = i;/* 为pi赋值 */for (i = 0; i 3; i+)printf(%d , a1i);/* 输出a1i */printf(n);/* 换行 */return 0; /* 返回值0, 返回操作系统 */程序运行后的输出结果是 。A)0 1 2 B)1 2 3 C)2 3 4 D)3 4 5解析: p指向二维数组a的首元素,而二维数组是按行存放的。因此“for(i=0;i9;i+) pi=i;”的结果是等价于a33=0,1,2,3,4,5,6,7,8,也就是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进行定义且赋初值的语句中正确的是 。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=&a”将数组a的首地址赋给指针p,通过对指针变量加上一个整数可以移动指针,移动的单位为存储单元,short int型变量在存储器中占两个字节。答案:A12有以下程序:/* 文件路径名:e5_1_12main.c */#include /* 标准输入/输出头文件 */int main(void)/* 主函数main() */int a = 1, b = 3, c = 5;/* 定义变量 */int *p1 = &a, *p2 = &b, *p = &c;/* 为指针变量赋值 */*p = *p1 * (*p2);/* 修改p2指向的变量的值 */printf(%dn, c);/* 输出c */return 0; /* 返回值0, 返回操作系统 */执行后的输出结果是 。A)1 B)2 C)3 D)4解析:指针p1指向变量a,指针p2指向变量b,指针p指向变量c,“*p = *p1 * (*p2);”等价于“c=a*b”,故正确选项为C。答案:C13己定义以下函数:int f(int *p) return *p; f()函数返回值是 。A)不确定的值B)一个整数C)形参p中存放的值D)形参p的地址值解析:p中存放的是地址值,*p间接引用了p指向的整数值。因此返回一个整数。答案:B14己有定义“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数组长度为3。答案:C15有以下程序:/* 文件路径名:ex5_1_15main.c */#include /* 标准输入/输出头文件 */int main(void)/* 主函数main() */char ch = uvwxyz, *pc;/* 定义字符数组与字符指针 */pc = ch;/* pc指向字符数组ch的首字符 */printf(%cn, *(pc + 5);/* 输出*(pc+5) */return 0; /* 返回值0, 返回操作系统 */程序运行后的输出结果是 。A)z B)0 C)元素ch5地址D)字符y的地址解析:字符指针pc指向字符串数组ch的的首字符,*(pc+5)就是pcI5l的值。答案:A16有以下程序:/* 文件路径名:ex5_1_16main.c */#include /* 标准输入/输出头文件 */int main(void)/* 主函数main() */char s = 159, *p;/* 定义数组与指针 */p = s;/* p指向s的首字符 */printf(%c, *p+);/* 输出*p+ */printf(%cn, *p+);/* 输出*p+ */return 0; /* 返回值0, 返回操作系统 */程序运行后的输出结果是 。A)15 B)16 C)12 D)59解析:数组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()是从屏幕输出一个字符。getchar()从键盘读入一个字符。scanf()是格式化输入函数,空格字符被用于多个数据输入的分隔符,含有空格的字符串会被截断。gets()用于字符串的输入,并且以回车键为结束符。答案:B*18对于长度为n的查找表进行顺序查找,在最坏情况下所需要的比较次数为 。A)log2n B)n/2 C)n D)n+l解析:如果查找表中的第一个元素就是要查找元素,则只需做一次比较就查找成功;如果被查找的元素是查找表中的最后一个元素,或者被查找的元素根本就不在查找表中,则需要与查找表中所有的元素进行比较,可知对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次。答案:C*19冒泡排序在最坏情况下的比较次数是 。A)n(n+l )/2 B)nlog2n C)n(n-1)/2 D)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以下程序中,LineMax ()函数的功能是求3行4列二维数组每行元素中的最大值,请填空。/* 文件路径名:ex5_2_2main.c */#include /* 标准输入/输出头文件 */void LineMax(int m, int n, int a4, int *bar)int i, j, x;/* 定义变量 */for (i = 0; i m; i+)x = ai0;/* 第i行的首元素 */for (j = 0; j n; j+)if (x aij)/* 如果x小于第i行的j号元素aij */x = aij;/* 则将aij赋给x */ = x;/* x为第i行的最大值 */int main(void)/* 主函数main() */int a34 = 12, 41, 36, 28, 19, 33, 15, 27, 3, 27, 19, 1, b3, i;LineMax(3, 4, a, b);/* 调用LineMax()函数求每行的最大值 */for (i = 0; i 3; i+)printf(%4d, bi);/* 输出每行的最大值 */printf(n);/* 换行 */return 0; /* 返回值0, 返回操作系统 */解析:函数LineMax()的功能是求出二维数组每行元素中的最大值。对于3行4列的二维数组将有3个最大值存放到数组bar中。x存放的是每行的最大值,求出每行的最大值x后,应该将x赋值给bari。因此此处填空应该是:bari。答案:bari3己知“int a = 3;”,a的地址为1001,&a= 。解析:变量的地址可以通过运算符来得到,而a的存储单元地址是1001,所以&a=1001。答案:10014以下程序的功能是:利用指针指向三个整型变量,并通过指针运算找出三个数中的最大值,输出到屏幕,请填空。/* 文件路径名:ex5_2_4main.c */#include /* 标准输入/输出头文件 */int main(void)/* 主函数main() */int x, y, z, max, *px = &x, *py = &y, *pz = &z, *pmax = &max;/* 定义变量 */scanf(%d%d%d, &x, &y, &z);/* 输入x,y,z */ ;if (*pmax *py)/* 如果*py更大 */*pmax = *py;/* 则将*py赋给*pmax */if (*pmax *pz)/* 如果*pz更大 */*pmax = *pz;/* 则将*pz赋给*pmax */printf(max=%dn, max);/* 输出最大值 */return 0; /* 返回值0, 返回操作系统 */解析:程序中定义了4个指针变量,px指向x,py指向y,pz指向z,pmax指向max, if语句将pmax指向的存储单元的值与*py与*pz两个数值比较,可知*px代表x的值,可知初始时假设x中的值最大,就让pmax指向x。答案:*pmax = *px或*pmax = x或max = *px或max = x5以下程序的输出结果是 。/* 文件路径名:ex5_2_5main.c */#include /* 标准输入/输出头文件 */#include /* 字符串头文件 */int main(void)/* 主函数main() */printf(%dn, strlen(IBMn0121);/* 输出字符串的长度 */return 0; /* 返回值0, 返回操作系统 */解析:转义符n、1和都会别只算一个字符,所以IBMn0121的字符数为9。答案:96以下程序的输出结果是 。/* 文件路径名:e5_2_6main.c */#include /* 标准输入/输出头文件 */#include /* 字符串头文件 */int main(void)/* 主函数main() */char a = 1, 2, 3, 4, 0;/* 定义字符数组 */printf(%d,%dn, sizeof(a), strlen(a);/* 输出字符串所占空间大小与长度 */return 0; /* 返回值0, 返回操作系统 */解析:strlen()求字符串的实际长度,不包括0,sizeof()是求数组a所占的字节,包括0。答案:5,4*7对长度为10的查找表表进行冒泡排序,最坏情况下需要比较的次数为 。解析:如果查找表的长度为10 ,则在最坏情况下,冒泡排序需要经过n-1趟从前往后扫描,每趟扫描需要的比较次数依次是9,8,1,需要总比较次数为36。答案:45三、编程题1求一个44整型矩阵对角线元素之和。参考程序:/* 文件路径名:ex5_3_1main.c */#include /* 包含库函数printf()所需要的信息 */#include /* 包含库函数system()所需要的信息 */int Sum(int a44)/* 返回二维数组a对角线元素之和 */int s = 0, i;/* 定义变量 */for (i = 0; i 4; i+)/* 求对角线元素之和 */s = s + aii;/* 累加主对角线 */s = s + ai3 - i;/* 累加副对角线 */return s;/* 返回对角线元素之和 */int main(void)/* 主函数main() */int a44 = 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16;/* 定义二维数组 */printf(对角线元素之和为%dn, Sum(a);/* 输出二维数组a对角线元素之和 */system(PAUSE);/* 调用库函数system( ),输出系统提示信息 */return 0;/* 返回值0, 返回操作系统 */2将一个数组中的值按逆序重新存放,例如,原来的顺序为6,8,5,2,9。要求重排为9,2,5,8,6。参考程序:/* 文件路径名:ex5_3_2main.c */#include /* 包含库函数printf()所需要的信息 */#include /* 包含库函数system()所需要的信息 */void Reverse(int a, int n)/* 将数组a中的值按逆序重新存放 */int i, j, tem;/* 定义变量 */for (i = 0, j = n - 1; i j; i+, j-)/* 交换ai与aj */tem = ai; ai = aj; aj = tem;/* 循环赋值交换ai与aj */int main(void)/* 主函数main() */int a = 6, 8, 5, 2, 9, n = 5, i;/* 定义数组及变量 */printf(原数组:);for (i = 0; i n; i+)printf(%d , ai);/* 依次输出各元素之值 */printf(n);/* 换行 */Reverse(a, n);/* 将数组a中的值按逆序重新存放 */printf(逆序后:);for (i = 0; i n; i+)printf(%d , ai);/* 依次输出各元素之值 */printf(n);/* 换行 */system(PAUSE);/* 调用库函数system( ),输出系统提示信息 */return 0;/* 返回值0, 返回操作系统 */3从键盘上输入三行文字,每行文字最多有80个字符,要求分别统计其中的英文大写字母、小写字母、数字、空格和其它字符的个数。参考程序:/* 文件路径名:ex5_3_3main.c */#include /* 包含库函数printf()所需要的信息 */#include /* 包含库函数system()所需要的信息 */#include /* 包含字符串库函数的信息 */int main(void)/* 主函数main() */char str81;/* 存储一行字符 */unsigned int i, j, n1 = 0, n2 = 0, n3 = 0, n4 = 0, n5 = 0;/* 定义变量 */for (i = 0; i 3; i+)/* 输入并处理三行字符 */gets(str);/* 输入一行字符str */for (j = 0; j = A & strj = a & strj = 0 & strj = 9)/* 数字 */n3+;/* 对数字进行记数 */else if (strj = )/* 空格 */n4+;/* 对空格进行记数 */else/* 其它字符 */n5+;/* 对其它字符进行记数 */printf(含%u个大写字母n, n1);/* 输出大写字母个数 */printf(含%u个小写字母n, n2);/* 输出小写字母个数 */printf(含%u个数字n, n3);/* 输出数字个数 */printf(含%u个空格n, n4);/* 输出空格个数 */printf(含%u个其它字符n, n5);/* 输出其它字符个数 */system(PAUSE);/* 调用库函数system( ),输出系统提示信息 */return 0;/* 返回值0, 返回操作系统 */4编写一个程序,将字符数组s2中全部字符复制到字符数组s1中,要求不使用strcpy()函数,在复制时,0也要复制过,0后面的字符不再复制。参考程序:/* 文件路径名:ex5_3_4main.c */#include /* 包含库函数printf()所需要的信息 */#include /* 包含库函数system()所需要的信息 */void StringCopy(char s1, char s2)/* 将字符数组s2中全部字符复制到字符数组s1中,0也要复制过 */int i = 0;/* 定义变量 */while (s1i = s2i) != 0) i+;/* 逐个复制字符 */int main(void)/* 主函数main() */char s180, s2 = this is a test!;/* 定义字符数组 */StringCopy(s1, s2);/* 将s2复制到s1 */puts(s1);/* 输出s1 */system(PAUSE);/* 调用库函数system( ),输出系统提示信息 */return 0;/* 返回值0, 返回操作系统 */5编写一个程序将两个字符串连接起来,要求不用strcat()函数。参考程序:/* 文件路径名:ex5_3_5main.c */#include /* 包含库函数printf()所需要的信息 */#include /* 包含库函数system()所需要的信息 */char *StrCat(char s1, char s2)/* 将s2中的字符串连接到s1 中字符串的后面 */int i = 0, j = 0;/* 定义变量 */while (s1i != 0) i+;/* 使s1i = 0 */while (s1i + j = s2j) != 0) j+;/* 将s2字符串连接到s1中字符串的后面 */return s1;/* 返回字符s1的首地址 */int main(void)/* 主函数main() */char s180 = This , s2 = is a test!;/* 定义字符数组 */StrCat(s1, s2);/* 将s2连接到s1 */puts(s1);/* 输出s1 */system(PAUSE);/* 调用库函数system( ),输出系统提示信息 */return 0;/* 返回值0, 返回操作系统 */6编写一个程序求字符串的长度,要求不使用strlen()函数。参考程序:/* 文件路径名:ex5_3_6main.c */#include /* 包含库函数printf()所需要的信息 */#include /* 包含库函数system()所需要的信息 */unsigned int StrLen(char s)/* 返回将s中的字符串的长度 */int i = 0;/* 定义变量 */while (si != 0) i+;/* 使si = 0,i的值即为s的长度 */return i;/* 返回i */int main(void)/* 主函数main() */char s = This is a test!;/* 定义字符数组 */printf(%s的长度是%un, s, StrLen(s);/* 输出结果 */system(PAUSE);/* 调用库函数system( ),输出系统提示信息 */return 0;/* 返回值0, 返回操
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 跨公路吊车架梁专项建筑施工组织设计及对策
- 选煤厂生产线自动化控制安全防护方案
- 基础桩基施工技术实施方案
- 保障性住房工程造价与招标管理方案
- 智算中心扩建项目建设工程方案
- 建设工程项目施工合同中的合同备案与行政管理
- 探索货物运输合同中的环保责任与可持续发展战略
- 无共同财产且有子女抚养协议的离婚协议书
- 钢结构设计优化与分析
- 信息技术在护理教学模式创新中的应用研究
- 任务1 混合动力汽车动力系统基本组成与原理
- 农产品跨境电商运营实战指南
- DB34-T 4860-2024 农贸市场建设规范
- 《除得尽吗》课件
- DB53∕T 1269-2024 改性磷石膏用于矿山废弃地生态修复回填技术规范
- 2024-2025学年北京市西城区三年级数学第一学期期末学业水平测试试题含解析
- 北师大版小学数学四年级上册第3单元 乘法《有多少名观众》公开教学课件
- 2024年版教育培训机构加盟合同范本
- DL∕T 976-2017 带电作业工具、装置和设备预防性试验规程
- 新突破大学英语综合教程1全套教学课件
- 光伏电站的运维项目方案
评论
0/150
提交评论