C语言程序设计谭浩强(第四版)期末复习重点

更新时间:2024-07-04 19:13:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章 程序设计和C语言

1.1.什么是计算机程序

程序:一组计算机能识别和执行的指令。只要让计算机执行这个程序,计算机就会自动地、有条不紊地进行工作 ..

计算机的一切操作都是由程序控制的,离开程序,计算机将一事无成。

1.2什么是计算机语言

计算机语言:人和计算机交流信息的、计算机和人都能识别的语言。 计算机语言发展阶段:机器语言(由0和1组成的指令)

符号语言(用英文字母和数字表示指令) 高级语言(接近于人的自然语言和数学语言)

面向过程的语言(非结构化的语言、结构化语言);面向对象的语言

1.3C语言的发展及其特点

C语言是一种用途广泛、功能强大、使用灵活的过程性编程语言,既可用于编写应用软件,又能用于编写系统软件。因此C语言问世以后得到迅速推广。 C语言主要特点:

语言简洁、紧凑,使用方便、灵活。(只有37个关键字、9种控制语句;程序书写形式自由,源程序短) 运算符丰富。(34种运算符;把括号、赋值、强制类型转换等都作为运算符处理;表达式类型多样化) 数据类型丰富。(包括:整型、浮点型、字符型、数组类型、指针类型、结构体类型、共用体类型;C99又扩充了复数浮点类型、超长整型、布尔类型;指针类型数据,能用来实现各种复杂的数据结构的运算。) 具有结构化的控制语句。(如if?else语句、while语句、do?while语句、switch语句、for语句用函数作为程序的模块单位,便于实现程序的模块化;C语言是完全模块化和结构化的语言) 语法限制不太严格,程序设计自由度大。(对数组下标越界不做检查;对变量的类型使用比较灵活,例如,整型量与字符型数据可以通用;C语言允许程序编写者有较大的自由度,因此放宽了语法检查) 允许直接访问物理地址,能进行位操作,可以直接对硬件进行操作。(C语言具有高级语言的功能和低级语言的许多功能,可用来编写系统软件;这种双重性,使它既是成功的系统描述语言,又是通用的程序设计语言) 用C语言编写的程序可移植性好。(C的编译系统简洁,很容易移植到新系统;在新系统上运行时,可直接编译“标准链接库”中的大部分功能,不需要修改源代码;几乎所有计算机系统都可以使用C语言) 生成目标代码质量高,程序执行效率高。

1.4.1最简单的C语言程序举例

C语言允许用两种注释方式://:单行注释,可单独占一行,可出现在一行中其他内容的右侧。 /*??*/:块式注释,可包含多行。

1.4.2 C语言程序的结构

C语言程序的结构特点:

1、一个程序由一个或多个源程序文件组成(小程序往往只包括一个源程序文件,一个源程序文件中可以包括三个部分:预处理指令、全局声明、函数定义。)

2、函数是C程序的主要组成部分(一个C程序是由一个或多个函数组成的;必须包含一个main函数(只能有一个);每个函数都用来实现一个或几个特定功能;被调用的函数可以是库函数,也可以是自己编制设计的函数。) 3、一个函数包括两个部分(函数首部、函数体(声明部分、执行部分)) 4、程序总是从main函数开始执行

5、C程序对计算机的操作由C语句完成(C程序书写格式是比较自由的:一行内可以写几个语句;一个语句可以分写在多行上。)

6、数据声明和语句最后必须有分号 7、C语言本身不提供输入输出语句 8、程序应当包含注释,增加可读性

1.6 程序设计的任务

1.问题分析 2.设计算法 3.编写程序 4.对源程序进行编辑、编译和连接 5.运行程序,分析结 6.编写程序文档

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

一个程序主要包括以下两方面的信息:

(1) 对数据的描述。在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式,这就是数据结构。 (2) 对操作的描述。即要求计算机进行操作的步骤,也就是算法。

数据是操作的对象,操作的目的是对数据进行加工处理,以得到期望的结果。 著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式:算法 + 数据结构 = 程序

一个程序除了算法和数据结构这主要要素外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。

算法、数据结构、程序设计方法和语言工具是一个程序设计人员应具备的知识。

2.1什么是算法

广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。计算机算法可分为两大类别:数值运算算法(目的是求数值解);非数值运算算法(包括面十分广泛,常见的是用于事务管理领域)

2.3 算法的特性

一个有效算法应该具有以下特点:

(1) 有穷性。一个算法应包含有限的操作步骤,而不能是无限的。

(2) 确定性。算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。 (3) 有零个或多个输入。所谓输入是指在执行算法时需要从外界取得必要的信息。 (4) 有一个或多个输出。算法的目的是为了求解,“解” 就是输出。没有输出的算法是没有意义的。 (5) 有效性。算法中的每一个步骤都应当能有效地执行,并得到确定的结果。 流程图是表示算法的较好的工具。

2.4.3 三种基本结构和改进的流程图

三种基本结构:(1)顺序结构 (2)选择结构 (3)循环结构 ①当型循环结构 ②直到型循环结构

2.4.5用伪代码表示算法 伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。用伪代码写算法并无固定的、严格的语法规则,可以用英文,也可以中英文混用。

2.4.6 用计算机语言表示算法 要完成一项工作,包括设计算法和实现算法两个部分。设计算法的目的是为了实现算法。

11111例2.19 将例2.17表示的算法(求多项式 的值)用C语言表示。 1???????23499100 #include int main( ) { int sign=1;

double deno = 2.0,sum = 1.0, term; while (deno <= 100) { sign = -sign; term = sign/deno; sum = sum+term; deno = deno+1; }

printf (\ return 0; }

2.5 结构化程序设计方法 采取以下方法保证得到结构化的程序:(1)自顶向下;(2)逐步细化;(3)模块化设计;(4)结构化编码。

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

3.1 顺序程序设计举例 例3.1 有人用温度计测量出用华氏法表示的温度(如 F,今要求把它转换为以摄氏法表示的温度(如 C) 。

5c?(f?32) 解题思路:找到二者间的转换公式 f代表华氏温度,c代表摄氏温度

9c? 算法:

5(f?32)9(N-S图)

#include int main ( ) {

float f,c; 定义f和c为单精度浮点型变量 f=64.0; 指定f的值 c=(5.0/9)*(f-32); 计算c的值

printf(\ 输出f和c的值 return 0; }

例3.2 计算存款利息。有1000元,想存一年。有三种方法可选:(1)活期,年利率为r1 (2)一年期定期,年利

率为r2 (3)存两次半年定期,年利率为r3,请分别计算出一年后按三种方法所得到的本息和。

解题思路:确定计算本息和的公式。从数学知识可知:若存款额为p0,则:活期存款一年后本息和为: p1=p0(1+r1);一年期定期存款,一年后本息和为:p2=p0(1+r2);两次半年定期存款,一年后

本息和为:p3=p0(1+r3/2)(1+r3/2)

算法:

#include

int main ( )

{float p0=1000, r1=0.0036,r2=0.0225,r3=0.0198, p1, p2, p3; p1 = p0 * (1 + r1); p2 = p0 * (1 + r2);

p3 = p0 * (1 + r3/2) * (1 + r3/2); printf(”%f\\n%f\\n%f\\n”,p1, p2, p3); return 0; }

3.2.1 常量与变量

1.常量:在程序运行过程中,其值不能被改变的量。整型常量:如1000,12345,0,-345;实型常量:十进制小

数形式:如0.34 -56.79 0.0,指数形式:如12.34e3 (代表12.34103);字符常量:如’?’,转义字符:如’\\n’;字符串常量:如”boy”;符号常量:#define PI 3.1416

2.变量:在程序运行期间,变量的值是可以改变的。变量必须先定义,后使用,定义变量时指定该变量的名字和

类型。变量名和变量值是两个不同的概念,变量名实际上是以一个名字代表的一个存储地址。

从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。 3.常变量:const int a=3;

4.标识符:一个对象的名字。C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为

字母或下划线

合法的标识符:如sum,average, _total, Class, day, BASIC, li_ling 不合法的标识符:M.D.John,¥123,#33,3D64,a>b

3.2.2 数据类型

所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。 C语言允许使用的数据类型:

整型类型:基本整型(int型):占2个或4个字节

短整型(short int):VC++6.0中占2个字节 长整型(long int):VC++6.0中占4个字节 基本类型 双长整型(long long int):C99新增的 字符型 布尔型

浮点类型(单精度浮点型、双精度浮点型、复数浮点型) 枚举类型 空类型

派生类型(指针类型、数组类型、结构体类型、共用体类型、函数类型)

3.2.3 整型数据

整型变量的符号属性:整型变量的值的范围包括负数到正数;可以将变量定义为“无符号”类型; 扩充的整形类型:

有符号基本整型 [signed] int; 无符号基本整型 unsigned int;

有符号短整型 [signed] short [int]; 无符号短整型 unsigned short [int]; 有符号长整型 [signed] long [int]; 无符号长整型 unsigned long [int] 有符号双长整型 [signed] long long [int]; 无符号双长整型 unsigned long long [int]

3.2.3 字符数据类型

字符是按其代码(整数)形式存储的,C99把字符型数据作为整数类型的一种。 1.字符与字符代码:大多数系统采用ASCII字符集 字母:A ~Z,a ~z 数字:0~9

专门符号:29个:! ” # & ‘ ( ) *等 空格符:空格、水平制表符、换行等

不能显示的字符:空(null)字符(以‘\\0’表示)、警告(以‘\\a’表示)、退格(以‘\\b’表

示)、回车(以‘\\r’表示)等

字符’1’和整数1是不同的概念:

字符’1’只是代表一个形状为’1’的符号,在需要时按原样输出,在内存中以ASCII码形式存储,占1个

字节[0 0 1 1 0 0 0 1];

整数1是以整数存储方式(二进制补码方式)存储的,占2个或4个字节[0 0 0 0 0 0 0 0 |0 0 0 0 0 0 0 1] 2.字符变量:用类型符char定义字符变量

3.2.5 浮点型数据 浮点型数据是用来表示具有小数点的实数。

float型(单精度浮点型):编译系统为float型变量分配4个字节;数值以规范化的二进制数指数形式存放。 double型(双精度浮点型):编译系统为double型变量分配8个字节;15位有效数字 long double(长双精度)型

3.2.6 怎样确定常量的类型 字符常量:由单撇号括起来的单个字符或转义字符。

整型常量:不带小数点的数值。系统根据数值的大小确定int型还是long型等。

浮点型常量:凡以小数形式或指数形式出现的实数。C编译系统把浮点型常量都按双精度处理;分配8个字节

3.2.7 运算符和表达式 3、算术表达式和运算符的优先级与结合性:

用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C算术表达式 运算对象包括常量、变量、函数等

C语言规定了运算符的优先级和结合性 4、不同类型数据间的混合运算:

(1)+、-、*、/ 运算的两个数中有一个数为float或double型,结果是double型。系统将float型数据都先

转换为double型,然后进行运算

(2)如果int型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后进行

运算,结果是double型

(3)字符型数据与整型数据进行运算,就是把字符的ASCII代码与整型数据进行运算 例3.3 给定一个大写字母,要求用小写字母输出。 #include int main ( ) {

char c1,c2; c1=’A’;

c2=c1+32; printf(\ printf(”%d\\n”,c2); return 0; }

5、强制类型转换运算符

强制类型转换运算符的一般形式为:(类型名)(表达式) (double)a (将a转换成double类型) (int) (x+y) (将x+y的值转换成int型) (float)(5%3)(将5%3的值转换成float型)

有两种类型转换:系统自动进行的类型转换;强制类型转换

3.3.1 C语句的作用与分类 C语句分为以下5类:

(1) 控制语句: if、switch、for、while、do?while、continue、break、return、goto等 (2) 函数调用语句 (3)表达式语句 (4)空语句 (5)复合语句

同,分析其处理方法。

解题思路:如果函数返回值的类型与指定的函数类型不同,按照赋值规则处理。

#include int main()

{ int max(float x,float y); float a,b; int c; scanf(\ c=max(a,b);

printf(\ return 0; }

int max(float x,float y)

{ float z; z=x>y?x:y; return( z ) ; }

7.4对被调用函数的声明和函数原型 在一个函数中调用另一个函数需要具备如下条件:

(1) 被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数) (2) 如果使用库函数,应该在本文件开头加相应的#include指令

(3) 如果使用自己定义的函数,而该函数的位置在调用它的函数后面,应该声明 例7.4 输入两个实数,用一个函数求出它们之和。

解题思路:用add函数实现。首先要定义add函数,它为float型,它应有两个参数,也应为float型。特

别要注意的是:要对add函数进行声明。

#include int main()

{ float add(float x, float y);

float a,b,c;

printf(\ scanf(\ c=add(a,b); printf(\ return 0; }

float add(float x,float y)

{ float z; z=x+y;

return(z); }

函数原型的一般形式有两种:

如 float add(float x, float y); float add(float, float);

原型说明可以放在文件的开头,这时所有函数都可以使用此函数

7.5 函数的嵌套调用 C语言的函数定义是互相平行、独立的,即函数不能嵌套定义,但可以嵌套调用函数,即调用一个函数的过程中,又可以调用另一个函数。

main函数 a函数 b函数 ① ② ③ ④ 调用a函数 调用b函数 ⑤ ⑨ ⑦

⑧ ⑥ 结束

例7.5 输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。 解题思路:main中调用max4函数,找4个数中最大者 max4中再调用max2,找两个数中的大者

max4中多次调用max2,可找4个数中的大者,然后把它作为函数值返回main函数 main函数中输出结果 主函数

#include int main()

{ int max4(int a,int b,int c,int d);

int a,b,c,d,max;

printf(“4 interger numbers:\

scanf(\ max=max4(a,b,c,d);

printf(\ return 0; }

max4函数 max2函数

int max4(int a,int b,int c,int d) int max2(int a,int b) { int max2(int a,int b); { if(a>=b)

int m; return a; m=max2(a,b); else

m=max2(m,c); return b; m=max2(m,d); } return(m); }

int max2(int a,int b) { return(a>b?a:b); }

7.6 函数的递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 C语言的特点之一就在于允许函数的递归调用。

例7.6 有5个学生坐在一起。问第5个学生多少岁?他说比第4个学生大2岁;问第4个学生岁数,他说比第3个学生大2岁;问第3个学生,又说比第2个学生大2岁;问第2个学生,说比第1个学生大2岁;最后问第1个学生,他说是10岁。请问第5个学生多大? #include int main()

{ int age(int n);

printf(\ return 0; }

int age(int n)

{ int c; if(n==1) c=10;

else c=age(n-1)+2; return(c); }

例7.7 用递归方法求n!。

解题思路:求n!可以用递推方法:即从1开始,乘2,再乘3……一直乘到n。

递推法的特点是从一个已知的事实(如1!=1)出发,按一定规律推出下一个事实(如2!=1!*2),

再从这个新的已知的事实出发,再向下推出一个新的事实(3!=3*2!)。n!=n*(n-1)!。

求n!也可以用递归方法,即5!等于4!×5,而4!=3!×4…,1!=1 可用下面的递归公式表示:

#include int fac(int n) int main() {

{int fac(int n); int f; int n; int y; if(n<0)

printf(\ printf(\ scanf(\ else if(n==0 | | n==1) y=fac(n); f=1;

printf(\ else f=fac(n-1)*n; return 0; return(f); } }

例7.8 Hanoi(汉诺)塔问题。古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程序输出移动一盘子的步骤。

#include int main()

{ void hanoi(int n,char one,char two,char three); int m;

printf(“the number of diskes:\ scanf(\

printf(\ hanoi(m,'A','B','C'); }

void hanoi(int n,char one,char two,char three) { void move(char x,char y); if(n==1)

move(one,three); else

{ hanoi(n-1,one,three,two); move(one,three);

hanoi(n-1,two,one,three); } }

void move(char x,char y) {

(n?0,1)?n!?1n!???n?(n?1)(n?1) printf(\ }

7.7.1数组元素作函数实参 例7.9 输入10个数,要求输出其中值最大的元素和该数是第几个数。

#include int main()

{ int max(int x,int y); int max(int x,int y) int a[10],m,n,i; { return(x>y?x:y); } printf(“10 integer numbers:\\n\ for(i=0;i<10;i++)

scanf(\

printf(\

for(i=1,m=a[0],n=0;i<10;i++) { if (max(m,a[i])>m) { m=max(m,a[i]); n=i; } }

printf(“largest number is %d\\n\ printf(“%dth number.\\n“,n+1); }

7.7.2数组名作函数参数 除了可以用数组元素作为函数参数外,还可以用数组名作函数参数(包括实参和形参)。用数组元素作实参时,向形参变量传递的是数组元素的值;用数组名作函数实参时,向形参传递的是数组首元素的地址。 例7.10 有一个一维数组score,内放10个学生成绩,求平均成绩。 #include int main()

{ float average(float array[10]); float score[10],aver; int i; printf(\ for(i=0;i<10;i++)

scanf(\ printf(\

aver=average(score); printf(\ return 0; }

float average(float array[10]) { int i;

float aver,sum=array[0]; for(i=1;i<10;i++)

sum=sum+array[i]; aver=sum/10; return(aver);

本文来源:https://www.bwwdw.com/article/0rl.html

Top