C语言程序设计案例教程习题参考答案人大版.docx
C语言程序设计案例教程习题参考答案人大版第 第 1 1 章C C 语言概述训练习题 参考答案一、选择题1.C 2.C 3.C 4.B 5.B6.D7.B 8.C 9.B 10.A11.C12.A13.A二、填空题 1、Noname.c 2、main()函数3、/*和*/ 4、scanf()和 printf() 5、源文件.c目标文件.obj可执行文件.exe6、分号; 7、语句 8、ALT+F5 9、编译 连接10、函数首部和函数体 其次章 数据的表现形式 训练题参考答案 一、选择题 1D) 2D) 3D) 4A)5.B) 6B) 7B) 8D) 9B)10.B) 11A)12.C) 13A)14A) 15D)16C)17A)18D)19D) 20C)21B)22C) 二、填空题 1、单引号 1双引号由 0 个或若干个字符 字符串结束标记0’2、0x4b 01130165 11761 0x3d 3、324、7 8 5、自动转换 强制转换 6、6、3 7、%d%u%f%e%c%s 8、字母 数字下划线 9、48 10、65 B 11 单引号双引号 12、优先级 结合性 13、256 -2 14、33 15、016、-1 17、6553518、3 19、FFCC 20、-128127 正整数负整数第 第 3 3 章运算符与表达式训练习题参考答案一、选择题 1.C 2.A 3.B 4.A 5.B 6.B 7.B 8.A 9.D 10. D 11.A12.C13.C14.C15.C16.C17.A18.B19.D20.C 21.A22.A23.D24.A25.C26.B27.B28.A29.C30.A 31.A32.D33.D34.D35.A36.A37.D 二、填空题 1.a=4,i=5 2.p=15,q=24,i=8,j=8 3.a=-6i=6b=-5j=6 4.12353514 5. a=2,b=2,k=2 6.a=4,b=1 7.100 8.1 9.a=97 b=98 c=97 d=98 10 21110612.(x>20x<30)|x<-10013. 114. 10 15. -16 16. 语法错误 17. 118.0 19. 00 20. 36 1E01111021. 5第 第 4 4 章数据的输入和输出训练习题参考答案一、选择题1、C2、A3、A4、B 5、C6、C7、B8、A9、D10、B11、B 12、B 13、D14、A15、B 16、D 17、C 18、A19、D20、C21、C 22、B 23、C24、A25、C 26、A 27、B 28、A 29、D 30、C 31、C 二、填空题1、a=1,b=2 2、5.0,4,c=3 3、0 4、3 5、2.1 6、6.6 7、x+=1; 8、261 9、16 10、-3 11、i=10,j=20 12、b 13、6第 第 5 章 程序流程的限制 训练习题参考答案 一、 选择题1、D2、A3、A 4、B5、C 6、D7、B8、C9、B10、B11、A 12、C 13、B 14、B15、D16、D 17、A 18、B 19、A20、D 21、A 22、A 23、B 24、B25、C26、C二、填空题1、b = i + 1 2、 i<10 i % 3 != 0 3、18 4、1.0/(i*i) 5、0 6、52 7、8921 8、x 9、5 10、 17 11、 X 12、 /i 或 *1.0/i 或 *1/i*(1.0/i) 或 /(double)I 13、 1 3 214、 6 15、 -f fun(10)三、编程题1. 输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。解题思路:1、针对题意,可设如下计数变量: nl 为键入字母个数;(包含两种状况一是大写字母其范围是;二是小写字母其范围是 az; nd 为键入数字个数;其范围是 09; nwhite 为键入空格键个数;no 为键入其它字符个数。2、依据各字符的范围及表现形式,就可以推断该字符属于某一范围,并在对应的计数器上加 1。计数器的初始状态应为 0 值。3、键盘输入字符常采纳键盘输入函数 getchar( )进行取值。由于该函数每次只能取一个字符,故要多次运用,于是可以利用循环方式进行,其推断条件只要没读到文件尾就有数据可取,直到遇到文件结束标记符’0’为止。#include <stdio.h> void main ( ) intnl, nd, nw, no, c; nl = nd = nw = no = 0; while(c=getchar( )!=’0’) if ( "a"<=cc<="z"|"A"<=cc<="Z" )nl+; else if ( "0"<=cc<="9" ) nd+;else if ( c=" ")nw+; elseno+; printf( nletter=%d, ndigit=%dn, nl, nd ); printf( nwhite=%d, nother=%dn, nw, no ); 2.一辆卡车违反交通规则,撞人逃跑。现场 3 人目击,但没记住车号,只登记车的特征。* 甲说:牌照前两位数相同,乙说:牌照后两位数相同。* 丙是位数学家,他说:四位的车号刚好是一个整数的平方。请依据以上线索求出车号。#include<stdio.h> int main() int i,j,k,c; for(i=1;i<=9;i+) /*i:车号前二位的取值*/ for(j=0;j<=9;j+) /*j:车号后二位的取值*/ if(i!=j) /*推断二位数字是否相异*/ k=i*1000+i*100+j*10+j; /*计算出可能的整数*/ for(c=31;c*c<k;c+); /*推断该数是否为另一整数的平方*/if(c*c=k)printf(Lorry-No. is %d.n,k); /*若是,打印结果*/ 运行结果:Lorry _No.is 7744 3.随意输入一行英文句子统计单词的个数,单词间用空格分隔开。解题思路:(1)从文本(字符串)的左边起先,仿效取出字符,且设置变量 i 作为循环变量,num 统计单词个数,word 作为判别是否出现单词的标记,word=0 表示未出现单词,假如出现 word 就置为 1,单词的数目可以由空格出现的次数确定(连续的若干个空格作为出现一次空格;一行开头的空格不在内)。(2)假如测出某一个字符为非空格,即是新的单词起先,此时 num(单词数)加 1。(3)再依次取字符进行推断,假如当前字符为非空格则是原来那个单词的接着,num 不应再累加 1。#include<stdio.h> void main() int num=0,word=0;int i; char s =welcme to you ,w;/* 此处可以运用 int s80;gets(s)*/ for( i=0;i<strlen(s);i+) w=si;if(w=32)word=0;continue;elseif(word=0) word=1; num=num+1; printf(%d,num); 4.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,其次天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。算法分析:依据题意可设当日(第 n 天)猴子吃桃前,树上有桃子 x 个,则后一天(第n+1)树上桃子个数为 x/2-1 个,则也可推出前一天的桃子数目为 2(x+1)个。依据这个关系式可以推出后一天与前一天的关系是倍数关系,依此类推可以推出树上总的桃子数(1534)。于是可以借助数组下标的特点可以推出:ai+1=ai*2+1 的表达式。方法一:反推法 1.程序分析:实行逆向思维的方法,从后往前推断。2.程序源代码:格式 1:采纳 while 结构形式void main() int day,x1,x2;day=9;x2=1;while(day>0) x1=(x2+1)*2;x2=x1;day-;printf(the total is %dn,x1); 格式 2:采纳 for 结构形式#include<stdio.h> main() int x=1,day;for(day=1;day<=9;day+) x=(x+1)*2; printf(the total is %dn,x); 方法二:(正推法)累试法 main() int x,m,day; for(x=1;x+) m=x; for(day=0;day<9;day+)m=m/2-1; if(m=1) break; printf(the total is %dn,x); 5.中国余数定理:有物不知几何,三三数余二,五五数余三,七七数余二,问物几何?编程求 1000 内全部解。#include ″stdio.h″ main()for(x=0;x<1000 printf(″This number is %dn″,x); 6.求 100 以内的孪生素数 孪生素数的含义:是指若 A 为素数,且 A+2 也为素数,则素数 A 和 A+2 称为孪生素数!#include <stdio.h>main()int i;for(i=2;i<=1000;i+)if(prime_number(i)if(prime_number(i+2)printf(%d %dn,i,i+2);int prime_number(int num)int i;for(i=2;i<num;i+)if(num%i=0)return 0;return 1;第 第 6 6 章用数组处理批量数据训练习题参考答案 一、选择题1D) 2B) 3A) 4D) 5D) 6B) 7B) 8C) 9B) 10A)11B) 12B) 13A)14D) 15A)16A)17. B) 18. D) 19. B)20.A)二、填空题 167 G2A,B65,663 123*/0000000123*/123 */4107,322.000000,107,B51B6 stringhello7 3, D8 3 2 2 39.75/9=8„„310. 12 三、编程题 1.统计子字符串 substr 在母字符串 str 中出现的次数。例如,若字符串string student stdiostop,子字符串为st,则应输出出现的次数为 4 次的信息。#include stdio.h void main() char str100,substr20; int j,i,k,count=0;gets(str); gets(substr);for(i=0;stri;i+) j=i;k=0;while(strj=substrksubstrk) j+;k+; if(substrk=’0’) count+; printf(%dn,count); 2、从键盘上输入一串字符,统计其中包含的大写字母、小写字母、数字字符的个数。#include <stdio.h> main ( ) intn1, n2, n3, ch; n1=n2=n3=0; while(ch=getchar( )!=’0’) if ( "a"<=chch<="z")n1+; else if ("A"<=chch<="Z" ) n2+;else if ( "0"<=chch<="9" ) n3+; printf( capital letters=%d, Lowercase letters=%dnr,n1,n2); printf( ndigit=%dn, n3); 3、从字符串中删除所指定的字符。#include stdio.h void main() char w100,x; int i,j=0;gets(w);printf(please print a char:);x=getchar();for(i=0;wi;i+) if(wi!=x)wj=wi;j+; wj="0" puts(w); 4、统计随意一段英文句子中的单词个数。#include<stdio.h> void main() int num=0,word=0,i;char ch;char s80;gets(s);for( i=0;(ch=si)!="0"i+) if(ch=32)word=0; elseif(word=0)word=1;num+; printf(%d,num); 第 第 7 7 章指针训练习题参考答案一、选择题1、A2、B 3、D4、C 5、 C6、C7、B 8、C9、D 10、D11、D12、C13、B 14、C 15、A 二、填空题1、 *(+p) 2、10 3、0,7 4、 9876 5、 efgh 三、编程题1、利用指针编写一个求字符串长度的程序。程序代码如下: #include<stdio.h> int main() char s20; char *p; printf(please input a string(less than 20 character):n); gets(s); p=s; while(*p!="0") p+; printf(The string lenth is %dn,p-s); 2、随意输入 5 个国家的英文名称,按字母依次进行排列。程序代码如下:#include<stdio.h> int main() char *name=CHINA,AUSTRALIA,AMERICA,JAPAN,FRANCE; char *p; int i,j,k,n=5; for(i=0;i<n-1;i+) k=i; for(j=i+1;j<n;j+) if(strcmp(namek,namej)>0)k=j; if(k!=i) p=namei; namei=namek; namek=p; for(i=0;i<n;i+) puts(namei); getch(); 3、随意输入一串字符,删除相同的全部字符。例如,输入 wweellcooommmeee,输出为:welcome,程序代码如下: #include stdio.h void main() char a100,*pa,*pb,*m,*q,t; printf(please input a string(less than 20 character):n);gets(a);for(pa=pb=a+1;*pa;pa+) if(*pa!=*(pa-1) *(pb+)=*pa;*pb="0"puts(a);getch(); 4、把数字型字符转换成数字,例如:1234转换为 1234。程序代码如下:#include stdio.h void main() char a100,*pa=a;long sum=0;gets(a);for(pa=a;*pa;pa+)sum=10*sum+(*pa)-"0"printf(%ld ,sum); 第 第 8 8 章函数训练习题参考答案一、选择题1、C2、B3、C4、D 5、A 6、B7、A8、C9、A 10、A 11、C 二、填空题1、k=p; 2、7 3、Itis 4、9 5、k-1 6、 8,17 7、246 8、high=mid-1;low=mid+1; 9、p=j;xip lineMax(x); 10、1 2 6 24 12011、 x 12、ai-1a9-i 13、 i 或 *1.0/i 或 *1/i*(1.0/i) 或 /(double)I第 第 9 9 章预处理吩咐训练习题参考答案一、选择题1、B2、B3、C 4、A5、B 6、D 7、58、helloworld二、 填空题1 1、 、 C2 、7 7第 第 0 10 章用户自定义的数据类型参考答案一、选择题 1、B2、C3、D4、B 5、B 6、A 7、C8、C9、D 10、C11、B 二、填空题1、 s= p+3 2 2、 22 3、 struct list *next(14)int data 4、80 5、 x.link=z 或 x.link=y.ink 6、 struct link *next 7、 34 三、程序填空题1.(1)p1=head1; (2)p2=head2; (3)pcurrent=pcurrent->next;(4)pcurrent=pcurrent->next; (5)pcurrent->next=p1; 2.(1)while(c=getchar()!="n") (2)top=p; (3)putchar(p->value); 四、编程题 (1)建立一个包含有学号、姓名、性别、年龄等信息的链表。查找并删除指定年龄的结点信息。#include <stdio.h> #include <stdlib.h> #define LEN sizeof(struct student) int n=0; struct student int age; long num; char name20; unsigned char sex; struct student *next; ; struct student *creat() /*创建链表*/ struct student *head,*p1,*p2; head=0; p1=p2=(struct student *)malloc(LEN); scanf(%d %ld %s %c,p1->age,p1->num,p1->name,p1->sex);while(p1->num!=0) n+; if(n=1) head=p1; else p2->next=p1; p2=p1; p1=(struct student *)malloc(LEN); scanf(%d %ld %s %c,p1->age,p1->num,p1->name,p1->sex); p2->next=0; return head; struct student *deldate(struct student *p) /*删除特定链表元素函数*/ int dnum; printf(请输入要删除的学生的年龄:n); scanf(%d,dnum); struct student *head,*p1,*p2; head=p1=p2=p; while(p1!=0) if(p1->age=dnum) if(head=p1) head=p1->next;else p2->next=p1->next;p1=p1->next; else p2=p1; p1=p1->next; return head; void print(struct student *p1) /*打印链表函数*/ while(p1!=0) printf(%d %ld %s %cn,p1->age,p1->num,p1->name,p1->sex);p1=p1->next; int main() struct student *head=creat(); struct student *head1=deldate(head); print(head1);return 0; (2)定义一个有 N 名职工的结构体数组,其成员包括工作证号、姓名、工龄、性别、职务、工资。然后通过键盘输入数据,再计算这 N 名职工的总工资和平均工资。 #include stdio.h #define N 10 struct Employeechar id20;char name20;int year;char sex;char pos20;int salary; mem10; void main() int i,sum=0;for(i=0;i<N;i+) scanf(%s%s%d%c%s%d,mem.id,mem.name,mem.year,mem.sex,mem.pos,mem.salary); for(i=0;i<N;i+)sum+=memi.salary; printf(%d,%f,sum,(float)sum/N); 第 第 1 11 章文件训练习题参考答案一、选择题 1)C 2)C 3)D二、推断题(略)三、填空题 1、w或w+或wt或w+t或wt+stri-32 或 stri-("a"-"A"或 stri-"a"+"A" fputc(stri,fp); r或r+或r+t 或rt+ 2、FILE *fsizeof(r)r.num, r.total 3、 r!feof(fp) fgetc(fp); 四、编程题 1、从键盘上输入 10 个实数,把它们排序后存入文件 c.dat 中。#include stdio.h #define N 10 void main( ) FILE *fp;int i,j;float score10,min,t;fp=fopen(c.dat,w);for(i=0;i<N;i+) scanf(%f,score+i);for(i=0;i<N-1;i+) min=i; for(j=i;j<N;j+) if(scoremin>scorej) min=j;if(min!=j) t=scoremin; scoremin=scorei; scorei=t; for(i=0;i<N;i+) fputc(scorei,fp);fclose(fp); 2、将 1001000 之间的回文数存入文件 k.dat 中。#include<stdio.h> #include<string.h> int huiwen(int m)int s20;int w,i=0;while(m>0) w=m%10; si+=w; m=m/10;w=i;i=0;while(i<w/2) if(si!=sw-i-1)return 0; i+;return 1; int main() FILE *fp; int m,i=0,j;inta20;fp=fopen(k.dat,w); for(m=100;m<1000;m+) if(huiwen(m) fprintf(fp,%d ,m); fclose(fp); fp=fopen(k.dat,r); while(!feof(fp) fscanf(fp,%d , ai); i+; for(j=0;j<i;j+) printf(%d ,aj);