C程序设计(第四版)课后习题完整版 谭浩强编著

  • 2019 年 10 月 4 日
  • 笔记

第一章:程序设计和C语言

习题

1、什么是程序?什么是程序设计?

答:程序就是一组计算机能识别和执行的指令。 程序设计是指从确定任务到得到结果,写出文档的全过程。(一般经历6个阶段:①问题分析;②设计算法;③编写程序;④对源程序进行编辑,编译和连接;⑤运行程序,分析结果;⑥编写程序文档;)

2、为什么需要计算机语言?高级语言的特点?

答:如同和人类交流一样,和哪个国家的人交流就需要哪个国家的语言来作为桥梁,想要和计算机进行交流沟通也就需要计算机语言,沟通以后就能用计算机做很多事情,更好的控制计算机 更好的用计算机完成我们的目的。高级语言同自然语言相近,便于人类理解和记忆,从人类的逻辑思维角度出发的计算机语言,抽象程度大大提高,需要经过编译成特定机器上的目标代码才能执行,一条高级语言的语句往往需要若干条机器指令来完成。

3、正确理解以下名词及其含义

(1)源程序 目标程序 可执行程序

答:用高级语言编写的代码程序即为源程序。

(2)程序编辑 程序编译 程序连接

答:

(3)程序 程序模块 程序文件

答:程序就是一组计算机能识别和执行的指令。

(4)函数 主函数 被调用函数 库函数

答:

(5)程序调试 程序测试

答:

4、 自学本书复录A,熟悉上级运行C程序的方法,上级运行本章3个例题。

5、请参照本章列题,编写一个C程序,输出以下信息:

*******************************

Very good !

*******************************

 1  #include<stdio.h>   2  int main()   3 {   4        for(int i=1;i<8;i++)   5         {   6               printf("**");   7         }   8         printf("n");   9         printf("Very Good ! n");  10  11         for(int i=1;i<8;i++)  12         {  13               printf("**");  14         }  15  16         return 0;  17  18 }   

6、编写一个C程序,输入a,b,c三个值,输出其中最大者。

 1 #include <stdio.h>   2   3 int main () {   4     int max(int a,int b,int c);   5     int x=92,y=100,z=70;   6     int c=max(x,y,z);   7     printf("%dn",c);   8     return 0;   9 }  10  11 int max(int a,int b ,int c)  12 {  13     if(a>b)  14     {  15         if(a>c)  16             return a;  17         else  18             return c;  19     }  20     else if(b>c)  21     {  22         return b;  23     }else  24         return c;  25  26 }

第二章:算法—–程序的灵魂

读书笔记:

1、一个程序主要包括数据结构和算法。在程序中指定用到哪些数据以及这些数据的类型和数据的组织形式就是数据结构。对操作的描述即为算法。

2、算法的特性:有穷性;确定性;有零个或多个输入、输出;有效性。

3、表示算法的方法:自然语言表示;程序流程图表示;N-S流程图表示;伪代码表示;计算机语言表示。

4、程序流程图的基本结构:顺序结构;选择结构;循环结构(当型循环、直到型循环)。

习题:

1、什么是算法?试从日常生活中找三个列子,描述他们的算法。

答:算法是对一个程序涉及到的操作的描述。eg1:机场过安检:安检口验证登机人信息是否一致,验证通过将自己的行李放到行李安检区,此时安检人员检查登机者,都通过允许进入候机厅。

2、什么叫结构化的算法?为什么要提倡结构化的算法?

答:由顺序结构,选择结构,循环结构构成的算法即为结构化的算法。结构化的算法不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。不会出现死循环,使算法的质量得到保证和提高,所以,要提倡结构化的算法。

3、试述3种基本结构的特点,请另外设计一种基本结构。

答:顺序结构可以保证代码从上到下一个总的编写逻辑结构。选择结构能够灵活的进行分支判断,增强代码的健壮性。循环结构有效提高简单重复率高程序的运行效率。 do{语句} while(条件);

4、

5、

6、

7、

8、用自顶向下,逐步细化的方法进行以下算法的设计:

(1)输出1900~2000年中是闰年的年份,符合下面两个条件之一的年份是闰年:①能被4整除但不能被100整除 ②能被100整除且能被400整除

 1 #include <stdio.h>   2   3 int checkYear(int year){   4     if(year%100==0 && year%400==0)   5         return year;   6     else if(year%4==0 && year%100!=0)   7         return year;   8     return 0;   9 }  10  11 int main () {  12     //printf("%d",checkYear(2000));  13     int i,result;  14     for(i=1900 ;i<2001 ;i++){  15         result=checkYear(i);  16         if(result==0)  17             continue;  18         else  19             printf("%dn",result);  20     }  21 }

(2)求ax2+bx+c=0的根,分别考虑d=b2-4ac大于0、等于0和小于0这三种情况。

(3)输入10个数,输出其中最大的一个数。

第三章 最简单的C程序设计—–顺序程序设计

读书笔记:

1、常量的分类:

  1. 整形常量:即常见的整数
  2. 实型常量:十进制小数形式和指数形式。指数的表达形式举例:12.34*103 –>12.34e3 0.14E-25—->0.14*10-25
  3. 字符常量:普通字符范围在Ascii表中、转义字符即有特殊含义的字符:常以作为开始符号
  4. 字符串常量:用双引号括起来的字符串,严格区分单引号,单引号只能表示单字符
  5. 符号常量:宏定义、#define 系列

2、变量必须先定义再使用

3、常变量用const'进行命名 eg:const float a=3.14 与符号常量#define a 3.14 的区别是:符号常量是预编译指令,在预编译时进行字符替换,预编译完成后,符号常量就不存在了。常变量是占用存储单元,有值的,只是不可变更。

4、标识符的命名标准:只能由字母数字下划线三种组成。数字不能作为变量名的开始。

5、数据类型:vc6.0下的变量

不同类型的数据在内存中占用的存储单元长度是不同的。使用sizeoif()函数测量类型或者变量的长度的运算符。

常见数据类型长度:short 2个字节16位。long 4个字节32位 。int 4个字节32位 。一个指针 4位。

6、字符变量的输出:当输出值大于128时,减去128输出对应的ASCII码的字符。

习题:

第四章选择结构程序设计:

读书笔记:

习题:

1、什么是算数运算?什么是关系运算?什么是逻辑运算?

答:算数运算就是数字与数字之间的加减乘除等基本算数运算。关系运算为 > 、< 、>= 、<= 、==之间的关系运算。逻辑运算为以与或非进行排列组后以后的逻辑运算。

2、C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?

答:C语言中用非零表示真,用0表示假;也可用bool类型的true和false 进行真假的表示,依赖于c的编译器是否支持bool类型数据。在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”

3、写出下面各逻辑表达式的值。设a=3,b=4,c=5: 1. a+b>c && b==c 2. a || b+c && b-c 3. !(a>b)&&!c || 1 4. !(x=a)&&(y=b)&&0 5. !(a+b)+c-1&&b+c/2

答:如下:

  1. 0因为a+b=7是大于c的,这个式子得1,b==c是不成立的,得0.1&&0得0。
  2. 因为&&的优先级高于||所以,a的得值为1,||后面的那个式子不管是多少都不会影响整个式子的结果了,所以结果为1;
  3. 结果为1.原因跟上面一样。
  4. x=a的值为1,只有当a=0时,赋值表达式的结果才为0.其他状态都为1.所以!(a>b)为0.整个式子是由&&组成的,结果就为0了。
  5. !(a+b)+c-1=0+5-1=4!=0,所以结果为1.b+c/2 =4+5/2=6!=0,根据整数整除是向下取整的原则,所以式子结果也为1。1&&1的结果为1.

4、有三个整数a,b,c由键盘输入,输出其中最大的数:

 1 #include<stdio.h>   2 //查找输入值的最大值   3 int findMax(int a,int b,int c){   4     if(a>b){   5         if(a>c){   6             return a;   7         }else   8             return c;   9     }else if(b>c)  10         return b;  11     else  12         return c;  13 }  14  15 void main(){  16  17     int a,b,c;//定义三个变量 a,b,c  18     printf("请输入三个整数,并以逗号隔开!!!n");  19     scanf("%d,%d,%d",&a,&b,&c);  20     int result=findMax(a,b,c);  21     printf("最大的数为:%dn",result);  22 }

5、从键盘输入一个小于1000的正数,输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后检查是否为小于1000的正数,若不是则要求重新输入。

 1 #include<stdio.h>   2 #include<math.h>//平方根调用math类库中的sqrt方法   3   4 void main(){   5   6     int a;   7     printf("请输一个小于1000的正数!!!n");   8     scanf("%d",&a);   9     if(a<1000 && a>0){  10         int result=sqrt(a);  11         printf("该数的平方根为%dn",result);  12     }else  13     {  14         printf("输入错误,请重新输一个小于1000的正数!!!n");  15         main();//输出错误,继续输入。  16     }  17  18  19 }

6、有一个函数:

写程序,输入x的值,输出y相应的值。

 1 #include <stdio.h>   2 #include <math.h>   3 int main()   4 {   5     int x, y;   6     printf("Please enter x: ");   7     scanf("%d", &x);   8     if (x < 1)   9         y = x;  10     else if (x >= 1 && x <10)  11         y = 2 * x - 1;  12     else  13         y = 3 * x - 11;  14     printf("y = %dn", y);  15     return 0;  16 }

8、习题 4.8 给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为’E‘。

 1 #include <stdio.h>   2   3 int main()   4 {   5     int score, g;   6     scanf("%d", &score);   7     while (score < 0 || score > 100){   8         printf("Error! Retry!n");   9         scanf("%d", &score);  10     }  11     g = score / 10; //成绩除以10的商进行判断  12     if (g >= 9)  13         printf("Grade is A!n");  14     switch(g){  15     case 0:  16     case 1:  17     case 2:  18     case 3:  19     case 4:  20     case 5: printf("Grade is E!n"); break;//成绩为60以下都会执行到这里  21     case 6: printf("Grade is D!n"); break;  22     case 7: printf("Grade is C!n"); break;  23     case 8: printf("Grade is B!n"); break;  24     }  25     return 0;  26 }

9、给一个不多于5位的正整数,要求:1. 求出它是几位数;2. 分别输出每一位数字;3. 按逆序输出各位数字,例如原数为321,应输出123。

 1 #include <stdio.h>   2   3 //计算数字的位数   4 int calcSize(int x){   5     int count=1;//cout定义为数字的位数,初始值为0   6     while(x>10){   7         x=x/10;   8         count++;   9     }  10     return count;  11 }  12  13 //判断数字是否合法  14 bool isLeagl(int x){  15     bool flag=false;  16     if(x<0)  17         return flag;  18     if(calcSize(x)>5)  19         return flag;  20     flag=true;  21     return flag;  22 }  23  24  25 //按位输出每一位数字(从个位开始输出)  26 void printNumOneByOne(int x){  27     int temp;  28     int xx;  29     printf("按位输出每一位数字(从个位开始输出):");  30     while(x>0){  31         temp=x;  32         temp=temp%10;  33         printf("%d,",temp);  34         x=x/10;  35     }  36     printf("n");  37 }  38  39  40 //逆序输出该数字  41 void reverseNum(int x){  42     int y;  43     for(y=0;x!=0;x=x/10 ){  44         y=y*10+x%10;  45     }  46     printf("%dn",y);  47  48 }  49 int main()  50 {  51     int x;  52     puts("请输入一位不多于5位的正整数!!!");  53     scanf("%d",&x);  54     if(isLeagl(x)==false){  55         puts("输入错误,请重新输入一位不多于5位的正整数!!!");  56         return 0;  57     }  58     int s=calcSize(x);  59     printf("该数位数为:%dn",s);  60     printNumOneByOne(x);  61     printf("逆序后的该数字:");  62     reverseNum(x);  63 }