当前位置:蚂蚁文档网 > 作文范文 > C语言程序设计案例教程习题参考答案人大版

C语言程序设计案例教程习题参考答案人大版

时间:2022-07-10 16:50:09 浏览次数:

 第 第 1 1 章

 C C 语言概述

 训练习题 参考答案

 一、选择题

 1.C

  2.C

  3.C

  4.B

  5.B

 6.D

 7.B

  8.C

  9.B

  10.A

 11.C

 12.A

 13.A

 二、填空题

  1、Noname.c

  2、

 main()函数

 3、/*和*/

  4、scanf()和 printf()

  5、源文件.c

 目标文件.obj

 可执行文件.exe

 6、分号; 7、语句

  8、ALT+F5

  9、编译

  连接

 10、函数首部和函数体

  第二章 数据的表现形式 训练题参考答案 一、选择题 1.D)

  2.D)

  3.D)

  4.A)

 5.B)

  6.B)

  7.B)

  8.D)

  9.B)

 10.B)

  11.A)

 12.C)

  13.A)

 14.A)

  15.D)

 16.C)

 17.A)

 18.D)

 19.D)

  20.C)

 21.B)

 22.C) 二、填空题

  1、单引号 1

 双引号

 由 0 个或若干个字符

  字符串结束标志‘\0’

 2、0x4b

  0113

 0165

  117

 61

  0x3d 3、32

 4、7

  8 5、自动转换

  强制转换

  6、6、3

  7、%d

 %u

 %f

 %e

 %c

 %s

  8、字母

  数字

 下划线 9、4

 8

  10、65

  B 11 单引号

 双引号

  12、优先级 结合性 13、256

  -2

  14、33 15、0

 16、-1 17、65535

 18、3 19、FFCC

  20、-128~127

  正整数

 负整数

 第 第 3 3 章

 运算符与表达式

 训练习题参考答案

 一、选择题 1.C

  2.A

  3.B

  4.A

  5.B

  6.B

  7.B

  8.A

  9.D

  10. D 11.A

 12.C

 13.C

 14.C

 15.C

 16.C

 17.A

 18.B

 19.D

 20.C 21.A

 22.A

 23.D

 24.A

 25.C

 26.B

 27.B

 28.A

 29.C

 30.A 31.A

 32.D

 33.D

 34.D

 35.A

 36.A

 37.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. 2

 11.10

 6

 12.(x>20&&x<30)||x<-100

 13. 1

 14. 10 15. -16

  16. 语法错误

  17. 1

 18.

 0

  19. 0

 0

  20. 36

  1E

 011110

 21. 5

 第 第 4 4 章

 数据的输入和输出

 训练习题参考答案

 一、选择题

 1、C

 2、A

 3、A

 4、B

  5、C

 6、C

 7、B

 8、A

 9、D

 10、B

 11、B

  12、B

  13、D

 14、A

 15、B

  16、D

  17、C

  18、A

 19、D

 20、C

 21、C

  22、B

  23、C

 24、A

 25、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、D

 2、A

 3、A

  4、B

 5、C

  6、D

 7、B

 8、C

 9、B

 10、B

 11、A

  12、C

  13、B

  14、B

 15、D

 16、D

  17、A

  18、B

  19、A

 20、D 21、A

  22、A

  23、B

  24、B

 25、C

 26、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 2

 14、 6 15、 -f fun(10)

 三、编程题

 1. 输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。

 解题思路:

 1、针对题意,可设如下计数变量:

  nl 为键入字母个数;(包含两种情况一是大写字母其范围是A~Z;二是小写字母其范围是 a~z; nd 为键入数字个数;其范围是 0~9; nwhite 为键入空格键个数;no 为键入其它字符个数。

 2、根据各字符的范围及表现形式,就可以推断该字符属于某一范围,并在对应的计数器上加 1。计数器的初始状态应为 0 值。

 3、键盘输入字符常采用键盘输入函数 getchar( )进行取值。由于该函数每次只能取一个字符,故要多次使用,于是可以利用循环方式进行,其判断条件只要没读到文件尾就有数据可取,直到遇到文件结束标志符’\0’为止。

 #include <stdio.h> void main ( ) {

  int

 nl, nd, nw, no, c;

  nl = nd = nw = no = 0;

  while

 ((c=getchar( ))!=’\0’)

  if ( "a"<=c&&c<="z"||"A"<=c&&c<="Z" )

 nl++;

  else if ( "0"<=c&&c<="9" )

  nd++;

 else if ( c==" ")

 nw++;

  else

 no++;

  printf( "nletter=%d, ndigit=%d\n", nl, nd );

  printf( "nwhite=%d, nother=%d\n", 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 s[80];gets(s)*/ for( i=0;i<strlen(s);i++) {

 w=s[i];

 if(w==32)

 {word=0;continue;}

 else

 if(word==0)

  {word=1;

  num=num+1;}

 } printf("%d",num); } 4.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第十天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

 算法分析:根据题意可设当日(第 n 天)猴子吃桃前,树上有桃子 x 个,则后一天(第n+1)树上桃子个数为 x/2-1 个,则也可推出前一天的桃子数目为 2(x+1)个。根据这个关系式可以推出后一天与前一天的关系是倍数关系,依此类推可以推出树上总的桃子数(1534)。于是可以借助数组下标的特点可以推出:a[i+1]=a[i]*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 %d\n",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 %d\n",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 %d\n",x); } 5.中国余数定理:

 "有物不知几何,三三数余二,五五数余三,七七数余二,问物几何?"编程求 1000 内所有解。

 #include ″stdio.h″ main()

 for(x=0;x<1000

  printf(″This number is %d\n″,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 %d\n",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 章

 用数组处理批量数据

 训练习题参考答案

  一、选择题

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

 11.B) 12.B) 13.A)

 14.D) 15.A)

 16.A)

 17. B) 18. D) 19. B)

 20.A)

 二、填空题 1.67 G

 2.A,B

 65,66

 3. [

 123]*/

 [0000000123]*/

 [123

  ]*/

 4.107,322.000000,107,B

 5.1B

 6. string

 hello

 7. 3, D

 8. 3 2 2 3

 9.

 75/9=8„„3

 10. 12 三、编程题 1.统计子字符串 substr 在母字符串 str 中出现的次数。例如,若字符串“string student stdiostop”,子字符串为“st”,则应输出出现的次数为 4 次的信息。

 #include "stdio.h" void main() { char str[100],substr[20]; int j,i,k,count=0;

 gets(str);

  gets(substr);

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

  j=i;k=0;

 while(str[j]==substr[k]&&substr[k]) {

 j++;

 k++; } if(substr[k]==’\0’)

  count++;

  }

 printf("%d\n",count); } 2、从键盘上输入一串字符,统计其中包含的大写字母、小写字母、数字字符的个数。

 #include <stdio.h> main ( ) { int

 n1, n2, n3, ch;

  n1=n2=n3=0;

  while

 ((ch=getchar( ))!=’\0’)

  { if ( "a"<=ch&&ch<="z")

 n1++;

  else if ("A"<=ch&&ch<="Z" )

  n2++;

 else if ( "0"<=ch&&ch<="9" )

  n3++;

 }

  printf( " capital letters=%d, Lowercase letters=%d\nr",n1,n2);

  printf( "ndigit=%d\n", n3);

 } 3、从字符串中删除所指定的字符。

 #include "stdio.h" void main() { char w[100],x; int i,j=0;

 gets(w);

 printf("please print a char:");

 x=getchar();

 for(i=0;w[i];i++)

  if(w[i]!=x)

 {w[j]=w[i];j++;}

  w[j]="\0";

  puts(w); }

 4、统计任意一段英文句子中的单词个数。

 #include<stdio.h> void main() {

 int num=0,word=0,i;

 char ch;

 char s[80];

 gets(s);

 for( i=0;(ch=s[i])!="\0";i++)

  {

  if(ch==32)

 word=0;

  else

 if(word==0)

 {

 word=1;

 num++;

 }

  }

 printf("%d",num); }

 第 第 7 7 章

 指针

 训练习题参考答案

 一、选择题

 1、A

 2、B

  3、D

 4、C

  5、 C

 6、C

 7、B

  8、C

 9、D

  10、D

 11、D

 12、C

 13、B

  14、C

  15、A 二、填空题

 1、

  *(++p) 2、

 10 3、

 0

 ,

 7 4、

  9876 5、

  efgh 三、编程题

 1、利用指针编写一个求字符串长度的程序。程序代码如下:

  #include<stdio.h> int main() {

  char s[20];

  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 %d\n",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(name[k],name[j])>0)

 k=j;

  if(k!=i)

  {

  p=name[i];

  name[i]=name[k];

  name[k]=p;

 }

  }

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

  puts(name[i]);

  getch(); } 3、任意输入一串字符,删除相同的所有字符。例如,输入 wweellcooommmeee,输出为:welcome,程序代码如下:

  #include "stdio.h" void main() {

 char a[100],*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 a[100],*pa=a;

 long sum=0;

 gets(a);

 for(pa=a;*pa;pa++)

 sum=10*sum+(*pa)-"0";

 printf("%ld ",sum); }

  第 第 8 8 章

 函数训练习题

 参考答案

 一、选择题

 1、C

 2、B

 3、C

 4、D

  5、A

  6、B

 7、A

 8、C

 9、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;

 x[i][p]

  lineMax(x); 10、

 1 2 6 24 120

 11、

  x 12、

 a[i-1]

 a[9-i] 13、

  i 或 *1.0/i 或 *1/i

 *(1.0/i) 或 /(double)I

 第 第 9 9 章

 预处理命令

 训练习题参考答案

 一、选择题

 1、B

 2、B

 3、C

  4、A

 5、B

  6、D 7、5

 8、hello

 world

 二、 填空题

 1 1、 、 C

 2 、

 7 7

 第 第 0 10 章

 用户自定义的数据类型

 参考答案

 一、选择题 1、B

 2、C

 3、D

 4、B

  5、B

  6、A

  7、C

 8、C

 9、D

  10、C

 11、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 name[20]; 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 %c\n",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 Employee{

 char id[20];

 char name[20];

 int year;

 char sex;

 char pos[20];

 int salary; }mem[10]; 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+=mem[i].salary;

  printf("%d,%f",sum,(float)sum/N); } 第 第 1 11 章

 文件

 训练习题参考答案

 一、选择题 1)C

  2)C

  3)D

 二、判断题(略)

 三、填空题 1、"w"或"w+"或"wt"或"w+t"或"""wt+"

 str[i]-32 或 str[i]-("a"-"A"或 str[i]-"a"+"A" fputc(str[i],fp); "r"或"r+"或"r+t "或"rt+" 2、FILE *f

 sizeof(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 score[10],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(score[min]>score[j])

  min=j;

 if(min!=j)

 { t=score[min]; score[min]=score[i]; score[i]=t; }

 }

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

  fputc(score[i],fp);

 fclose(fp); } 2、将 100~1000 之间的回文数存入文件 k.dat 中。

 #include<stdio.h> #include<string.h> int huiwen(int m)

 {

 int s[20];

 int w,i=0;

 while(m>0)

 {

  w=m%10;

  s[i++]=w;

  m=m/10;

 }

 w=i;

 i=0;

 while(i<w/2)

  {

  if(s[i]!=s[w-i-1])

 return 0;

  i++;

 }

 return 1;

 }

  int main()

  {

  FILE *fp;

  int m,i=0,j;

 int

 a[20];

 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 ", &a[i]); i++; }

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

  printf("%d ",a[j]);

  }

推荐访问:习题 参考答案 人大

猜你喜欢