《C语言编程基础(第2版)》习题答案
前 言
《C语言编程基础(第2版)》每章后面都安排了一定数量的习题,这有利
于读者理解、消化和掌握各单元的学习内容。习题中,除了有填空题、选择题、回答问题等适合掌握基本概念的题型外,大部分是分析程序运行结果和要求编写实用程序,这有利于读者训练编程技巧和增强编程能力。应广大读者要求,特别是一线教学老师的要求,我们给出全部习题答案,供读者参考。编程答案只是实现题目算法要求的一种,并不一定是最好的。希望读者自己多做思考,利用多种方法进行编程,用以提高自己的程序设计水平和锻炼自己的创新能力。由于作者水平所限,错误和不当之处在所难免,恳请批评指正。
习题一
1、填空题。
⑴ C语言程序由__函数__组成,其中必须有且只能有一个名为_main__的函数。C程序的执行从___名为main的主__函数开始。
⑵ 每个C语句必须以__分__号结束。 ⑶ 标识符只能由_英文字母_、__数字_和_下划线__三类符号构成,而且标识符的第一个字符必须是__英文字母__或__下划线__。
⑷ 关键字是指___C语言编译系统所固有的、具有专门意义的标识符___。 ⑸ C程序中,注释的内容应放在__/*_和_*/__符号之间。 2、选择题。
⑴ 下面合法的C语言标识符是___ C ___。 ⑵ C语言中主函数的个数是___ A______。
⑶ 以下有关注释的描述中,错误的是___ C ___。 ⑷ C程序中,main函数的位置____ D___。 3、指出并改正下面程序中的错误。
⑴ main 应为 main()
⑵ 应在本程序最后加上大括号 }。 ⑶ 语句结束应有分号。如:
int a,b; a=1;b=2;
printf(\"%d\; 4、分析下列程序,写出运行结果。
1
⑴ 该程序是计算两个整数a和b的乘积并赋值给c,运行结果为: c=30
⑵ 该程序输出一个字符串和一排星号,运行结果为:
Hello!
*****************
5、编程题。
⑴ 按题目要求,编写输出固定信息的程序如下:
main() {
pt();
printf(\" Welcome!\"); pt();
} pt() {
printf(\"*****************\");
}
⑵ 按题目要求,编写输入数据输出其表达式的程序如下: main() {
int a,b,c;
scanf(\"%d\scanf(\"%d\ c=a*b+10;
printf(\"c=%d\}
习题二
1、单项选择题。
⑴ C语言中的变量名只能由字母、数字和下划线组成,且第一个字符_ C _。
⑵ 合法的常量是__ D ___。
⑶ C语言中的基本数据类型所占存储空间长度的顺序是__ D___。 ⑷ 下列符号串中与123.0相同的合法常量是__ C___。
2、填空。
⑴ C语言中的基本数据类型包括____整型(int)_、____浮点型(flot)__ 和_字符型(char)_三种。
⑵ 整型常数有_十进制整数_、_八进制整数_和_十六进制整数_三种表示形式; 整型变量可分为四类: _一般整型(int)_、_短整型(short)_、_长整型
2
(long)_、_无符号型_。其中_无符号型_又可分为_无符号整型(unsigned int)、_无符号短整型(unsigned short)和_无符号长整型(unsigned long)_3种。
⑶ 有10个用指数形式表示的符点常数: 请指出合法的有___③④⑥⑧⑩___。
⑷ 在C中,没有专为存贮字符串的变量,但可以用__字符型数组__ 或__字符型指针变量_存贮字符串。其定义格式为_ char str[6];_和_ char *a;_。
⑸ 数据类型混合运算时, 要进行同型转换, 转换方式分为__自动转换(隐式转换)__和__强制转换(显式转换)__两种。 3、写出下列程序运行结果。
⑴ 215/9=23…8
⑵ 97 b ⑶ 4.000000
4、编写程序。
⑴ 按题目要求编写求三个已知数的乘积,程序如下: main() {
int a,b,c; a=19; b=22; c=650;
printf(\"a*b*c=%d\\n\}
⑵ 按题目要求,编写将值整数化后赋值的程序如下: main() {
int a1,a2; float b,c; b=35.425; c=52.954;
a1=(int)(b*c); a2=(int)c%(int)b;
printf(\"a1=%d;a2=%d\\n\}
⑶ 按题目要求,编写计算圆周长、面积和圆柱体积的程序如下:
main() {
int r,h,c,s,v; r=15; h=3;
c=2*3.14*15; s=3.14*r*r; v=s*h;
printf(\"c=%d, s=%d , v=%d\\n\
3
}
习题三
1、填空题。
⑴ 设有int x=11;则表达式(x++*1/3)的值是_____3____。
⑵ 已知数学表达式y=x²-2x+5,写出对应的C语言表达式_y=x*x-2*x+5_。 ⑶ 已知a=10,则表达式x=(a=a+b,a-b)的值为__x=10__。
2、选择题。
⑴ 在C语言中,下列运算符的操作数必须是int类型的运算符是( D )。 ⑵ 假设所有变量均为整型,则表达式(a=2,b=5,a++,b++,a+b)的值为( A )。 ⑶ 已定义int m=6,n=5;,则执行m%=n-1;之后,m的值是( B )。
⑷ 已有int a=1,b=1;则执行b=(a=2*3,a*5),a+7之后,a,b的值是( B )。 ⑸ 已有int x=2,y=1;则执行x++==y--;的结果是( D )。 3、求下面算术表达式的值。 ⑴ 2.500000 ⑵ 3.500000 4、分析下列程序,写出运行结果。
⑴ 注意,在C语言中,因为函数调用中参数按从右到左的顺序求值,因此该程序执行打印输出的结果为:
3 1 1
⑵ 该程序在计算条件表达式的值赋给a时,其x值已为6,y值已为7,因此运行结果为:
a=7,b=0,c=6
⑶ 该程序利用运算符与结合性的优先级不同,而取得a与b的值。(因为该题使用了逻辑运算符,可在学了第5章以后再详细分析)运行结果如下:
a=2,b=1
⑷ 该程序应用复合的赋值运算符和从右至左结合性的运算规则,求取n的值,运行结果如下:
n=28
⑸ 该程序在执行语句“y=x++-1;”时,y为0而x在执行后变为2;在执行语句“z=--y+1;”时,z为0而y便成了-1。运行结果如下:
4
x=2,y=-1,z=0
5、编程题。
⑴ 用符号常量编写简单计算程序如下(复杂应用应在第9章学习后再做):
#define N 12
#define M 25 main() {
float c;
printf(\"N+M=%d\\n\printf(\"N-M=%d\\n\printf(\"N*M=%d\\n\c=(float)N/M;
printf(\"N/M=%f\\n\}
⑵ 查看i++与++j运算结果差异的程序,编写如下: main() {
int i=20,j=20;
printf(\"i++:%d\\n++j:%d\\n\}
⑶ 查看m--与--n运算结果差异的程序,编写如下: main() {
int m=20,n=20;
printf(\"m--:%d\\n--n:%d\\n\}
习题四
1、单项选择题。
⑴ 下列叙述不正确的是__B__。
⑵ 当输入数据为12345678时,下面程序运行的结果是__C___。 ⑶ putchar函数可以向终端输出一个__D___。 ⑷ 按格式输出的格式符__ C__。 2、回答问题。
5
⑴ 在键盘上输入数据格式如下:
12,24,Aa□2.58□-2.58□1□68.5↙
(□代表空格,其中数据1是为了对付%*f占位,↙代表回车)
⑵ 该题是求输入任意两个整数a与b的和。若读入a=b=5,其运行结果为: type a number please!a=? 5↙
type another please!b=? 5↙
a sum b is 10 3、写出下列程序的执行结果。
⑴ 执行结果:
32767,-32768
21474837,-21474838 65535,0 ⑵ 执行结果:
yes,I am computer. ⑶ 执行结果:
a\\b’□□□□□tw 123
⑷ 执行结果:
58.887299,555.677979
58.887299□□□,555.677979
□□58.887, □555.678,58.887,555.678,58.887299,555.677979 5.88873e+01, □□□5.6e+02 B,66,102,42
75670,34675022,7a12 11232,25740,2be0,11232 COMPUTER, □□ABC
4、编写程序。
⑴ 对输入的大写字母改用小写输出的程序,编写如下:
#include char c; printf(\"输入一个大写字母:\\n\"); c=getchar(); putchar(c+32); 6 } ⑵ 计算三门课总成绩等数据的程序,编写如下: #include float a,b,c,sum,ave,mod; printf(\"输入三门课程的成绩:\\n\"); scanf(\"%f%f%f\sum=a+b+c; ave=(a+b+c)/3; mod=fmod(sum,3); printf(\"总成绩=%5.1f,平均成绩=%5.1f,总成绩除3的余值 =%3.1f\\n\ } ⑶ 已知数据,按输出结果的要求编写输出程序如下: main() { int a=1,b=2,c=3,g=12345; float d=7.2,e=-5.5,f=1.56; long h=123456; char i='o',j='p'; printf(\"a=%d b=%d c=%d\\n\ printf(\"d=%f,e=%f,f=%f\\n\ printf(\"d+e=%4.2f e+f=%4.2f d+f=%5.3f\\n\ printf(\"g=%7d h=%ld\\n\ printf(\"i=%c or %d\\nj=%c or %d\\n\ } 习题五 1、单项选择题。 ⑴ C语言用__C__表示逻辑量为“假” ⑵ 要求当A的值为奇数时,表达式的值为“真”;A的值为偶数时,表达式的值为“假”。以下不满足要求的表达式是__D__。 ⑶ 在if语句的嵌套中,else总是与__C__配对。 ⑷ 下面对for循环概念描述正确的是__D__。 7 2、填空题。 ⑴ switch后面的“表达式”,通常为_整_型或_字符_型表达式;每个case的常量表达式的值__不能相同__。 ⑵ 如果不算goto语句构成的循环结构,那么C语言可以构建循环的语句一共有_3_种,分别是__for循环、while循环、do-while循环__。 ⑶ continue语句与break语句在使用时,有两点主要的不同:①它不适用于_switch_语句;②它跳转时是__跳过循环体中下面的语句从下一次循环开始__。 ⑷ 把下面的两条if分支语句合并成一条if分支语句应该写成: if(x>=y) printf(”m=%d\\n”, m=2); else printf(”n=%d\\n”, n=1); 3、指出以下程序的打印结果。 该程序运行结果如下: x=11 y=10 x=55 y=10 x=8 y=10 z=10 x=2 y=2 x=3 y=3 x=4 y=4 x=5 y=5 x=6 y=6 x=7 y=7 x=8 y=8 x=9 y=9 x=2 y=2 x=1 y=1000 x=2 y=100 x=3 y=10 4、编写程序。 ⑴ 按要求,用两种循环方式编写相关程序如下: ⑴-①的for循环 #include 8 int r; float v; for (r=1;r<=100;r+=2) { v=4/3*3.14*pow(r,3); printf(\"r=%d,v=%f\\n\} } ⑴-①的while循环 #include int r; float v; r=1; while (r<=100) { v=4/3*3.14*pow(r,3); printf(\"r=%d,v=%f\\n\r+=2; } } ⑴-②的for循环 main() { int s,i; s=0; for (i=13;i<=103;i+=10) s=s+i; printf(\"s=%d\\n\} ⑴-②的while循环 main() { int s,i; s=0; i=13; while (i<=103) { s+=i; i+=10; } 9 printf(\"s=%d\\n\} ⑵ 找出学生成绩中的最高分和最低分的程序,编写如下: main() { int max,min,n; printf(\"请输入成绩,-1结束:\"); scanf(\"%d\max=min=n; while (n!=-1) { if (n>max) max=n; if (n ⑶ 输出“水仙花数”的程序,编写如下: #include int n,a,b,c; for (n=100;n<=999;n++) { a=n/100; b=n%10; c=(n%100-b)/10; if (pow(a,3)+pow(b,3)+pow(c,3)==n) printf(\"%d\\n\} } 习题六 1、填空题。 ⑴ 数组是一组具有相同___类型__的数据的集合。 ⑵ 如果一个数组的长度为10,则该数组中数组元素下标的最小值为_0_,最大值为_9_。 ⑶ 若有 int a[]={10,20,30,40}; 则数组a的长度为__4__。 ⑷ 在C语言中,没有字符串变量,字符串的存储是通过__字符数组__来实现的。 ⑸ strlen函数的功能是__测试字符串的长度__,strcmp函数的功能是__ 10 比较两个字符串的大小__。 2、选择题。 ⑴ 定义一个有100个元素的int型数组,下面正确的语句是__D__。 ⑵ 下面正确的对数组b进行初始化的语句是__C__。 ⑶ 在C程序中,引用一个数组元素时,其下标的数据类型允许是__D__。 ⑷ 下面语句中正确的是___A__。 ⑸ 若有定义:char str[]=\"Hello\" ; 则数组str所占的空间为___B__。 3、分析下列程序,写出运行结果。 ⑴ 该程序通过for循环为数组元素自动赋值,然后输出。运行结果如下: a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5 a[5]=6 a[6]=7 a[7]=8 a[8]=9 a[9]=10 ⑵ 该程序定义并初始化了a、b、c三个数组,然后分别输出各数组的各个元素,用来验证初始化的结果。运行结果如下: 数组a:10 20 30 40 50 数组b: 1 2 3 0 0 数组c: 0 1 2 3 ⑶ 该程序通过gets()函数为字符数组接收字符,然后输出各元素。运行结果如下: abc↙(输入的字符) str[0]=a str[1]=b str[2]=c 4、编写程序。 ⑴ 对输入一组数进行相关统计的程序,编写如下: main() { int i,num[10]; int max,min,sum=0; float average; 11 clrscr(); printf(\"输入10个数:\\n\"); for(i=0,i<10;i++) { scanf(\"%d\输入数值 */ sum+=num[i]; /* 累加求和 */ } average=(float)sum/10;/* 求平均值 */ max=min=num[0]; for(i=1;i<10;i++) if(num[i]>max)max=num[i]; /*求最大值*/ else if(num[i] ⑵ 求素数的程序编写如下: main() { int i,j,k,m=0; clrscr(); for(i=2;i<=100;i++) { k=0; for(j=2;j<=i-1;j++) if(i%j==0) { k=1;break;} if(k==0) { printf(\"%4d\ m=m+1; if(m%8==0) printf(\"\\n\"); } } } ⑶ 判断一个浮点数是否在一个浮点型数组中的程序,编写如下: main() 12 { int i,exist; float a[4],n; printf(\"输入浮点型数组:\\n\"); for (i=0;i<4;i++) { printf(\"a[%d]=\ scanf(\"%f\printf(\"\\n\"); } printf(\"输入一个浮点数:\"); exist=0; scanf(\"%f\for (i=0;i<4;i++) { printf(\"a[%d]=%f;\\n\ if (a[i]==n) exist=1; } if (exist==1) printf(\"%f在数组中。\\n\else printf(\"%f不在数组中!\\n”,n); } 此题前面的浮点型数组的值,也可通过初始化直接赋值的办法得到。 ⑷ 输出二维数组中最大值及位置的程序,编写如下: main() { int i,j,row=0,col=0,max; int a[4][6]; for(i=0;i<4;i++) for(j=0;j<6;j++) scanf(“%d”,&a[i][j]); max=a[0][0]; for(i=0;i<4;i++) for(j=0;j<6;j++) if(a[i][j]>max) {max=a[i][j];row=i;col=j;} printf(“max=%d,row=%d,col=%d\\n”,max,row,col); } ⑸ 在字符串中的指定位置插入字符串的程序,编写如下: 13 main() { char ch1[10],ch2[3],ch3[13]; int i=0,n; printf(\"输入字符串1(长度为10):\\n\"); scanf(\"%s\ printf(\"输入字符串2(长度为3):\\n\"); scanf(\"%s\ printf(\"插入位置n(n<10):\\n\"); scanf(\"%d\n--; for (i=0;i 1、填空题。 ⑴ C语言函数分成__系统提供的库函数__和__用户自定义函数_两大类。 ⑵ 一个C程序由主函数和若干__个自定义函数__组成,各个函数在程序中的定义是__相互__的。 ⑶ 函数的递归调用是指__函数直接或间接地调用自己__。 ⑷ 当__用数组名__作函数参数时,实参与形参的传递为“地址传递”。 ⑸ 根据变量的作用范围的不同,可将变量分为_局部_变量和_全局_变量。根据变量生存期的不同,可以将变量分为__动态存储__变量和__静态存储__变量。 ⑹ static变量的特点是__其值始终存在__。 2、选择题。 ⑴ 如果一个函数有返回值,那么这个函数只有__A__个返回值。 ⑵ 下面关于空函数的定义,正确的是___B___。 ⑶ 以下错误的描述是__C___。 ⑷ 调用一个不含return语句的函数,以下正确的说法是___D___。 ⑸ 下面函数调用语句中含有实参的个数为___C___。 ⑹ 数组名作函数参数时,实参传递给形参的是__B___。 3、指出并改正下面程序在函数定义或调用中的错误。 14 ⑴ 被调函数f(x)定义时对形式参数x未做参数说明。应改为: f(int x) 或: f(x) int x; ⑵ 函数调用时,实际参数的类型应与被调函数形式参数的类型相一致。本题在主函数中的整型变量a应改为浮点型: int a; 改为 float a; ⑶ 被调函数f( )定义时不需要加分号,f( ); 应改为:f( ) ⑷ 在C程序中,不能在一个函数的函数体内定义另一个函数。该题在主函数中定义f( )为空值类型且作为一个语句是错误的。应去掉 void f( ); 4、分析下列程序,写出运行结果。 ⑴ 主函数以a=2为实参调用f(x)函数,f(x)通过 return语句向主函数返回y的值赋给b,结果应为: b=4 ⑵ 在该程序中实参变量a、b和形参变量x、y分别占用不同的存储单元,虽然在swap函数中x、y的值发生了交换,但主函数中a、b的值却没有改变。运行结果应为: a=1↙ b=2↙ x=2,y=1 a=1,b=2 ⑶ 全局变量x初始化为1,调用被调函数f( ) 执行一次x++ ,然后再执行x++ 后输出x值应为: x=3 ⑷ x为定义在整个函数体和复合语句内的同名自动变量,其作用域不同。int x=20;定义在复合语句中,只在复合语句中有效。运行结果如下: x=20 x=11 ⑸ 执行被调函数,将原数组元素初值分别加1,因此输出结果为: num[0]=2 num[1]=3 num[2]=4 num[3]=5 num[4]=6 5、编写程序。 ⑴ 该题目要求使用判断奇偶数函数,编写程序如下: main() { 15 int n; printf(\"输入一个整数:\"); scanf(\"%d\a(n); } a(int n) { if (n%2==0) printf(\"%d是偶数\\n\else printf(\"%d 是奇数\\n\} ⑵ 编写一个将3个数从小到大顺序输出的函数如下: sort(x,y,z) int x,y,z; { int t; if (x>y) {t=x; x=y; y=t;} if (x>z) {t=x; x=z; z=t;} if (y>z) {t=y; y=z; z=t;} Printf(\"%d %d %d\} ⑶ 将输入的秒数值,转换为时:分:秒输出,编程如下: int hou=0,min=0; main() { int sec,sec2; clrscr(); printf(\"请输入秒数:\\n\"); scanf(\"%d\sec2=change(sec); printf(\"%d 个小时:%d 分钟:%d 秒\} int change(sec1) int sec1; { if(sec1>3600) {hou=sec1/3600; min=(sec1%3600)/60; sec1=sec1%60;} 16 else if(sec1>60) {hou=0; min=sec1/60; sec1=(sec1%60);} return(sec1); } ⑷ 求一组学生成绩的总分、平均分、最高分和最低分的程序,编写如下: main() { float s,ave,score[100]; int I,m; clrscr(); printf(\"输入学生人数:\") ; scanf(\"%d\ printf(\"输入%d个学生的成绩:\\n\for (i=0 ; i printf(\"总成绩=%.2f\\n\ave=average(score,m); printf(\"最高分=%d\\n\printf(\"最低分=%d\\n\printf(\"平均成绩=%.2f\} float max=0,min=0; float average(array,n) float array[];int n; { int i; float aver,sum=array[0]; max=min=array[0]; for(i=1;i 17 } ⑸ 显示菜单并实现相应选择功能的程序,编写如下: #include int i; while (i!=3) { clrscr( ); printf(\"********************\\n\"); printf(\"1.求整数n的立方\\n\"); printf(\"2.求整数n的立方根\\n\"); printf(\"3.结束程序\\n\"); printf(\"********************\\n\"); scanf(\"%d\if (i==1) lifang(); else if (i==2) lifanggen(); } } lifang() { int n; long s; printf(\"input n:\\n\"); scanf(\"%d\s=pow(n,3); printf(\"%d 的立方为:%ld\\n\\n\} lifanggen() { int n; double s; printf(\"input n:\\n\"); scanf(\"%d\s=(double)1/3; s=pow(n,s); printf(\"%d 的立方根为:%f\\n\\n\} ⑹ 用递归法求n!的程序,编写如下: main() 18 { long f(),t; int n; printf(\"input number:\\n\"); scanf(\"%d=f(n); printf(\"%d 的阶乘为:%ld\} long f(int n) { static long s=1; if (n>1) f(n-1); s*=n; } 习题八 1、填空。 (1) 文件是存贮在外部存贮设备上的_信息集合_。一般分为_程序_文件和_数据_文件。 (2) C 语言文件存贮在磁盘上有两种形式 , 一种是按_ASCII码存储_, 另一种是按_二进制码存储_。 (3) 定义文件指针变量的格式为__FILE *fp__ 。 (4) feof()函数是_文件尾_ 检测函数,当文件位置指针处于_文件尾_ 时,它返回一个__非0_ 值。 (5) 对流式文件可以进行顺序读写,也可以进行随机读写,关键是_如何控制文件的位置指针_ 。 2、回答问题。 ⑴ 有三大好处:①保存运算的中间结果或最终结果,方便使用;②将数据于程序之外,便于多处、多人共享;③事先录入保存所需数据,可以提高程序运行时的效率。 ⑵ 在ASCII码文件中,一个字节代表一个字符,便于字符的输入输出处理,但占用存储空间较大;二进制文件占用的存储空间较小,但在文件中,一个字节并不代表一个字符。 ⑶ w: 创建一个ASCII码文件只写; r: 打开一个ASCII码文件只读; a: 打开一个ASCII码文件添加; wb: 创建一个二进制文件只写; rb+:打开一个二进制文件读/写。 19 ⑷ 文件操作完以后及时关闭,可将文件指针脱离该文件,并将内存缓冲区中的数据写入磁盘,用以保证写入文件的数据完整。 ⑸ EOF在stdio.h中定义为-1,它也是一个合法的二进制整数,用fgetc()函数检查文件尾容易发生错判。 3、程序改错。 ⑴ 该程序是要求将键盘上输入的一些字符写入磁盘文件xt1.txt中,程序中有两处错误: ① (检查文件是否存在且要向文件写,注意文件名和打开方式) fp=fopen(\"xt.txt\应改为:fp=fopen(\"xt1.txt\w\") ② (向文件中写而不是读) fgetc(fp); 应改为:fputc(c,fp); ⑵ 该程序是要求从文件中读并统计其正数、负数和零的个数,在屏幕上显示。程序中有两处错误: ① (当不是文件尾时才读取并统计) while(feof(p)==1) 应改为: while(feof(p)==0) ②(f为存储负数的变量应取i<0) else if(i=0)f++; 应改为:else if(i<0)f++; 4、编写程序。 ⑴ 将字符串写入文件的程序,编写如下: #include char a[2][8]={\"Turbo C\fp=fopen(\"lx1.txt\fputs(a[0],fp); fputs(a[1],fp); fclose(fp); } ⑵ 将字符串从文件中读出的程序,编写如下: #include char *a; if((fp=fopen(\"lx1.txt\{ printf(\"cannot open file\\n\"); exit(1);} fgets(a,13,fp); clrscr(); 20 printf(\"%s\\n\fclose(fp); } ⑶ 将三个数写入文件的程序,编写如下: #include int a,b,c; fp=fopen(\"lx2.txt\ fprintf(fp,\"%d\\n%d\\n%d\fclose(fp); } ⑷ 将数值从文件中读出并求其和的程序,编写如下: #include int a,b,c; if (!(fp=fopen(\"lx2.txt\{ printf(\"cannot open file!\\n\"); exit(1);} fscanf(fp,\"%d%d%d\ printf(\"%d+%d+%d=%d\\n\fclose(fp); } ⑸ 将10个整数写入文件的程序,编写如下: #include int i,a[10]={8,2,6,4,5,9,1,3,7,4}; fp=fopen(\"lx3.txt\for (i=0;i<10;i++) { fwrite(&a[i],2,1,fp); } fclose(fp); } ⑹ 将指定位置的整数从文件中读出的程序,编写如下: 21 #include int n,i,num; if (!(fp=fopen(\"lx3.txt\ {printf(\"cannot open file\\n\"); exit(1);} printf(\"输入数值i:\"); scanf(\"%d\n=2*(i-1); fseek(fp,n,SEEK_SET); fread(&num,2,1,fp); printf(\"第%d号数据是:%d\\n\fclose(fp); } 习题九 1.选择题。 ⑴ 将C的库函数中数学函数库的头文件包含到程序中,应在程序的头部加上( C )。 ⑵ 欲将一个文件file.c包含到程序中,应该在程序的头部加上( A )。 ⑶ “文件包含”预处理语句的使用形式中,当#include后面的文件名用“ ”括起时,寻找被包含的文件的方式为( B )。 ⑷ 在C语言中,编译预处理命令都是以( B )符号开头的。 2、分析下列程序,写出运行结果。 ⑴ 该程序是定义了一个带参数的宏:S(x),在程序运行时它的置换内容是x*x,用实参代替形参后计算(3+1)的平方。其运行结果为: a=16 ⑵ 该程序是定义了一个带两个参数的宏:MIN(x,y),在程序运行时它的置换内容是条件表达式(x)<(y)?(x):(y),用实参代替形参后其运行结果为: 500 ⑶ 该程序运行时,先执行宏PRINT1,输出A*B的值,然后执行宏PRINT,输出回车换行;最后执行宏PRINT2,输出(A+1)*(B+1)的值,运行结果为: 15 24 ⑷ 在该程序中,定义宏时用了宏嵌套,控制循环终值的宏NUM,其值应为: (M+1)*M/2=(N+1+1)*[(N+1)/2]=(2+1+1)*[(2+1)/2]=4*2=8 运行结果为: 22 12345678 3、编程题。 ⑴ 用带参数的宏实现求两个整数相除取余的程序,编写如下: #define DIV(x,y) x%y main() { int a,b,d; scanf(\"%d%d\ d=DIV(a,b); printf(\"%d\\n\} ⑵ 利用宏按从大到小顺序输出3个整数的程序,编写如下: #define chag(x,y) (x=x+y,y=x-y,x=x-y) main() { int a,b,c; printf(\"输入3个整数:\\n\"); scanf(\"%d%d%d\if (aprintf(\"%d,%d,%d\} ⑶ 按题目要求,利用条件编译方法编写程序如下: #include char *a; printf(\"输入字符串:\\n\"); scanf(\"%s\#if LOWCASE a=strlwr(a); #else a=strupr(a); #endif printf(\"%s\\n\} 习题十 23 1.选择题。 ⑴ 若已定义“int *p,a;”,则语句“p=&a”中的运算符“&”的含义是( D )。 ⑵ 执行该程序断后,a的值为( B )。 ⑶ 该程序段的运行结果是( A )。 ⑷ 若有定义int a[3][5],i,j;(且0≤i<3,0≤j<5),则a[i][j]的地址不正确的是( D )。 ⑸ 设有语句“int (*p)()”,则p是一个( B )。 ⑹ 给出程序的输出结果为( A )。 2.填空题。 ⑴ 以下程序用来输出字符串。 printf(“%s\\n”, *p ); ⑵ exchange函数的调用语句为“exchange(&a,&b,&c);”。他将3个数按由小到大的顺序调整后依次放入a,b,c三个变量中,a中放最大值,请填空。 if(*q3>*q2) swap( q2,q3 ); if(*q1<*q3) swap( q1,q3 ); if(*q1<*q2) swap( q1,q2 ); ⑶ 以下程序段完成给数组所有元素输入数据。 while(j<10) scanf(“%d”, &a[j] ); ⑷ 以下函数用来求出两整数之和,并通过形参将结果传回,请填空。 void func(int x,int y, _int *_ z) { *z=x+y; } ⑸ 该程序的输出结果是__7__。 3.分析下列程序,写出运行结果。 ⑴ 该程序用指针变量取得a、b的地址,用来比较哪个地址中变量的值更大并输出。运行结果如下: max=33 ⑵ 该程序用指针变量做循环控制变量,控制输出字符的个数。运行结果如下: ABCDE BCDE CDE DE E ⑶ 利用指针做函数参数,在执行子函数时,将a+b的值赋给了c,a-b的值赋给了d。输出c、d,运行结果如下: 7,1 24 ⑷ 利用指针做函数参数,在执行子函数时,用两个指针变量指向a数组的首地址和尾地址,通过循环控制指针,交换不同位置的数组元素达到反序排列。运行结果如下: GFEDCBA 4、编程题。 ⑴ 输入三个数后,按由小到大的顺序输出。编程如下: main() { int a,b,c,*p1,*p2,*p3; printf(\"输入3个数:\\n\"); scanf(\"%d%d%d\if (a>=b) p1=&b,p3=&a; else p1=&a,p3=&b; if (c>=*p3) p2=p3,p3=&c; else if (c<=*p1) p2=p1,p1=&c; else p2=&c; printf(\"%d,%d,%d\\n\} ⑵ 按题目要求,编写排序函数及程序如下: int *sort(int a[],int n) { int i,j,t; for (i=0;i } return a; } main() { int *b,i,a[10]; printf(\"输入10个数:\"); for (i=0;i<10;i++) scanf(\"%d\ 25 b=sort(a,10); for (i=0;i<10;i++) printf(\"%d \printf(\"\\n\"); } ⑶ 按题目要求,编写统计输入字符串中大小写字母个数的函数及程序如下: #include int u=0,l=0; while (*p) { if (islower(*p)) l++; if (isupper(*p)) u++; p++; } printf(\"大写字母个数:%d;小写字母个数:%d\} main() { char *a; printf(\"输入字符串:\\n\"); scanf(\"%s\count(a); } ⑷ 按题目要求,编写连接字符串的函数及程序如下: main() { char *strcat(),*str1,*str2,*p; printf(\"输入字符串1:\\n\"); scanf(\"%s\ printf(\"输入字符串2:\\n\"); scanf(\"%s\p=strcat(str1,str2); printf(\"%s\\n\ } char *strcat(char *s1,char *s2) 26 { char *p; p=s1; while (*p) p++; while (*s2) *p=*s2,p++,s2++; return s1; } ⑸ 按题目要求,编写查找字符所在位置的函数及程序如下: char *index(char *str,char ch) { char *p; int c=0; p=str; while (*p) { if (*p==ch) return p; p++; } p=&c; return p; } main() { char *a,*b,ch; long n; printf(\"输入字符串:\\n\"); scanf(\"%s\ printf(\"输入一个字符:\\n\"); ch=getch(); b=index(a,ch); if (*b==0) printf(\"找不到字符%c!\\n\else { n=b-a+1; printf(\"字符 %c 在字符串%s的第 :%ld个位置\\n\} 27
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务