完整C语言 谭浩强学习笔记.docx
- 文档编号:16649722
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:46
- 大小:994.28KB
完整C语言 谭浩强学习笔记.docx
《完整C语言 谭浩强学习笔记.docx》由会员分享,可在线阅读,更多相关《完整C语言 谭浩强学习笔记.docx(46页珍藏版)》请在冰点文库上搜索。
完整C语言谭浩强学习笔记
C语言谭浩强版笔记
第一章程序设计和C语言
1、计算机能直接识别和接受的二进制代码称为机器指令,机器指令的集合就是该计算机的机器语言。
2、语言的发展历史:
①机器语言②符号语言③高级语言
3、高级语言的发展:
①非结构化语言②结构化语言③面向对象的语言
4、C语言的祖先是BCPL语言
5、在字符串中的//和/*都不作为注释的开始。
而是作为字符串的一部分。
【但是在vc++6.0中//显示编译错误】
6、不要以为在max函数中求出最大值z后就会自动地作为函数值返回调用处,必须用return语句指定将哪个值作为函数值。
也不要不加分析地在所有函数后面都写上return0
7、一个程序由一个或多个源程序文件组成
8、全局声明:
即在函数之外进行的数据声明,在函数外面声明的变量称为全局变量。
例如把inta,b,sum;放到main函数的前面
9、函数是C程序的主要组成部分,编写C程序的工作主要就是编写一个个函数
10、一个C语言程序是由一个或多个函数组成的,其中必须有且只有一个main函数
11、一个小程序只包含一个源程序文件,在一个源程序文件中包含若干个函数(其中一个为main函数),若程序规模太大,可以使一个程序包含若干个源程序文件,每个源程序文件又包含若干个函数【一个源程序文件就是一个程序模块,一个程序分成若干个程序模块】
12、在进行编译时是以源程序文件为对象进行的【分别对各源程序文件进行编译得到相应的目标程序,然后再将这些目标程序连接成为一个统一的二进制可执行程序】
13、C语言的这种特点使得容易实现程序的模块化
14、一个函数名后面必须跟一对圆括号,括号内写函数的参数名及其类型。
如果函数没有参数,可以写void或空括号【如intmain(void)或intmain()】
15、voiddump(){}它是一个空函数,但是是合法的
16、程序总是从mian函数开始执行的,不管位置在哪儿
17、程序中对计算机的操作是由函数中的C语句完成的
18、二进制目标程序在visualC++中的后缀为.obj
19、可执行程序在visualC++中的后缀为.exe
20、一个源程序经过编译后得到的目标程序要经过连接阶段与函数库进行连接才能生成可执行文件
21、程序设计的任务:
①问题分析②设计算法③编写程序④对源程序进行编辑、编译和连接⑤运行程序,分析结果⑥编写程序文档
第二章算法
1、对数据的描述:
在程序中要指定用到哪些数据类型以及这些数据类型和数据的组织形式,这就是数据结构。
2、对操作的描述:
即要求计算机进行操作的步骤,也就是算法。
3、算法+数据结构=程序
4、算法是灵魂,数据结构是加工对象,语言是工具,编程需要采用合适的方法。
5、算法的概念:
为解决一个问题而采取的方法和步骤。
6、计算机算法可分为两大类:
数值运算算法和非数值运算算法【数值运算用于求数值解,非数值运算用于事务管理领域】
7、算法的特性:
①有穷性②确定性③有零个或多个输入④有一个或多个输出⑤有效性
8、怎样表示一个算法:
自然语言、传统流程图、结构化流程图、伪代码等
9、连接点就是将画在不同地方的流程图连起来,流程图别忘记画箭头。
基本结构的特点:
①只有一个入口②只有一个出口③结构内的每一部分都有机会被执行到④结构内不存在死循环
10、区分当型和直到型:
前者先判断条件成不成立,再执行下一步,后者先执行,再判断条件
11、用N-S图表示的算法都是结构化的算法,如果一个算法不能分解为若干个基本结构,则它必然不是一个结构化的算法【N-S图又称盒图】
12、结构化设计方法的基本思路:
把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。
13、方法:
①自顶向下②逐步细化③模块化设计④结构化编码
14、程序中的子模块一般不超过50行
15、模块的独立性:
使用一个模块完成一项功能,耦合性越少越好
16、结构化程序设计方法用来解决人脑思维能力的局限性和被处理问题的复杂性之间的矛盾
第三章最简单的C程序设计
1、vc++把所有实数都作为双精度数处理。
因此提醒用户:
把双精度常量赋给float型变量会造成精度损失,知道怎么回事就行了
2、数据有两种表现形式:
常量和变量
3、常量分为:
①整型常量(1000)
②实型常量(十进制小数形式和指数形式【12.34E3,E后面必须是整数】)
③字符常量(普通字符、转义字符)
④字符串常量
⑤符号常量(#definePI3.1416)
4、基本字符集中的每个字符必须用一个字节表示,空字符也占一个字节,它的所有二进制位都是0
5、一个tab位置为8列
6、’\101’代表八进制数101的ASCII字符,即’A’(十进制65),’\x41’代表十六进制数41的ASCII字符,也是’A’,’\0’或者’\000’是代表ASCII码为0的控制字符,即空操作字符
7、单撇号内只能包含一个字符,双撇号内可以包含一个字符串
8、符号常量不占内存,只是一个临时符号,在预编译后这个符号就不存在了,故不能对符号常量赋以新值
9、变量必须先定义后使用
10、常变量constinta=3,表示a被定义为一个整型变量,指定其值为3,而且在变量存在期间其值不能改变,常变量不能出现在赋值号的左边。
例如上面一行不能写成:
constinta;
a=3;
可以用表达式对常变量初始化,如
constintb=3+6,c=3*cos(1.5);
11、标识符只能由字母、数字和下划线组成,且第一个字符必须是字母或下划线
12、①基本类型和枚举类型变量的值都是数值,统称为算数类型
②算数类型和指针类型统称为纯量类型(因为其变量的值是以数字来表示的)
③枚举类型是程序中用户定义的整数类型
④数组类型和结构体类型统称为组合类型(共用体类型不属于组合类型,因为在同一时间内只有一个成员具有值
13、TC2.0为每个整型数据分配2个字节(16个二进位);VC++为每个整型数据分配4个字节(32位)
14、求负数的补码的方法:
先将此数的绝对值写成二进制形式,然后对其后面所有各二进位按位取反,再加1
15、取值范围
16、如果既未指定为signed也未指定为unsigned类型,默认为有符号类型
17、只有整型(包括字符型)数据可以加signed或unsigned修饰符,实型数据不能加
18、实型数据取值范围:
19、在一个整数末尾加大写字母L或小写字母l,表示它是长整型
20、浮点型常量(小数或指数)在内存中都以指数形式储存
21、C程序中的实型常量都是双精度浮点型常量
floata=3.14159;
在进行编译时,对float变量分配4个字节,但对于浮点型常量3.14159,则按照双精度处理,分配8个字符
22、如果除数或被除数中有一个是负值,则舍入的方向不固定,一般采取“向零取整”的方法,即-5/3=-1
23、%运算符要求参加运算的对象是整数,除%以外的运算符的操作数都可以是任何算数类型
24、++i是先执行i=i+1后,再使用i的值;而i++是先使用i的值后,再执行i=i+1。
设已作声明:
inti=6,a;
25、算数表达式和运算符的优先级与结合性
26、不同类型数据间的混合运算规律为:
(取精度较高的)
①+,—,*,/运算的两个数中有一个为float或double型,结果是double型,因为系统将所有float型数据都先转换为double型,然后进行运算。
②如果int型与float或double型数据进行运算,先把int型和float型数据转换为double型,然后进行运算,结果是double型。
③字符(char)型数据与整型数据进行运算,就是把字符的ASCII代码与整型数据进行运算。
字符型可以直接与整型数据进行运算。
如果字符型数据与实型数据进行运算,则将字符的ASCII代码转换为double型数据,然后进行运算。
27、强制类型转换:
一般形式为(类型名)(表达式),在强制类型转换时,得到一个所需类型的中间数据,而原来的变量的类型未发生变化
28、左值都可以作为右值,但算数表达式(a+b)或常量不能为左值
29、a=(a=b)=3*4;//报错,左侧的操作数必须是左值
30、C语言的截断
i=2890000000100100001
c=3300100001
31、在if条件中可以包含赋值表达式,但不能包含赋值语句
32、一般变量初始化不是在编译阶段完成的【只有在静态储存变量和外部变量的初始化是在编译阶段完成的】,而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句。
33、在scanf函数中,输入的数字可以用空格分开
34、在printf函数中,例如%7.2f代表在输出时,指定数据占7列,其中小数占2列
35、C语言本身不提供输入输出语句(printf和scanf不是C语言的关键字。
而只是库函数的名字)
36、如果在源程序中有printf函数,在编译时并不把它翻译成目标指令,而是在连接阶段与系统函数库相连接后,在执行阶段中调用库函数中的printf函数
37、头文件<>称为标准模式,””编译系统先在用户的当前目录查找
38、由于printf是函数,因此,“格式控制字符串”和“输出表列”实际上都是函数的参数
39、float型数据的存储单元只能保证6位有效数字,double是15位
40、%-m.nf,输出的数据向左对齐
41、e格式符是以指数形式输出实数,默认小数部分6位,指数部分5列
42、格式字符含义(注意大小写):
43、m.n中的n对实数表示输出n位小数,对字符串表示截取的字符个数
44、如果想输出字符%,在“”中用连续2个%%表示:
(经检测只输一个不显示)
45、在scanf函数中,如果两个%f间有2个空格,在输入时,两个数据之间应有2个或更多的空格
46、用%c格式声明输入字符时,空格字符和转义字符中的字符都作为有效字符输入
47、putchar函数是输出字符的函数,而不是整数,例如putchar(66)输出字符B,putchar可以是字符常量,字符变量,整型常量,整型变量(ASCII码范围内)
48、putchar(getchar());将接收到的字符输出
49、printf(“%c”,getchar());先从键盘输入一个字符,然后用%c的格式输出
第四章选择结构程序设计
1、if复合语句应当用花括号括起来
2、所谓关系运算就是比较运算
3、关系运算符中等于与不等于优先级最低
4、算术高于关系高于赋值,关系表达式的值是一个逻辑值,真或假【d=a>b;如果a大于b为真,则a>b的值为1,所以d为1】
5、逻辑运算符中,非运算符(!
)和单目的算术运算符同级,高于双目的算术运算符,优先于关系运算符,优先于逻辑运算符与(&&)和或(||)。
逻辑运算符中,非运算符(!
)的结合性为右结合;与运算(&&)和或运算(||)的结合性为左结合。
6、0为假,非0为真
7、逻辑表达式注意“短路”现象
8、逻辑型变量(C99,参考):
在头文件stdbool.h中,将bool定义为_Bool的同义词,同时定义了两个符号常量true代表1,false代表2(作用是将关系运算和逻辑运算的结果存到一个逻辑型变量中,以便于分析和运算,定义逻辑变量用类型符_Bool)
9、条件运算符由?
和:
组成,是C语言中唯一的一个三目运算符
10、条件与是哪U老虎的优先级别比关系运算符和算术运算符低,所以括号可以不要。
例如:
max=(a>b)?
a:
b+1;可以写成max=a>b?
a:
b+1;
11、if语句的嵌套:
else总是与它上面的最近的未配对的if配对
12、switch语句中break语句的作用是使流程转到switch语句的末尾(即由花括号处)
13、switch语句:
①switch后面括号内的表达式,其值的类型应当是整数类型(包括字符型)
②case后面跟一个常量(或常量表达式)
③语句体内包含多个以关键字case开头的语句行和最多一个以default开头的行
④case出现次序不影响执行结果,可以先出现default标号
⑤在执行switch语句中,根据switch表达式的值找到匹配的入口标号,并不在此进行条件检查,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断!
⑥最后一个case子句可不加break
⑦多个case标号可以共用一组执行语句,例如:
case‘a’:
case‘b’:
case‘c’:
printf(“>60\n”);break;
如果条件满足,不管是abc,都输出>60
第五章循环结构程序设计
1、while语句中循环体只能是一个语句,特点是先判断条件表达式,然后执行循环体语句【while(表达式)语句】
2、do…while语句的特点是:
先执行,再判断【do语句while(表达式);】
3、循环语句中不要忘记给变量赋初始值
4、当while后面的表达式的第1次的值为“真”时,两种循环得到的结果相同;否则,两者结果不相同(指两者具有相同的循环体的情况)
5、for语句与while语句两者无条件等价
6、for语句若没有表达式2或表达式3,循环体会无止境地执行下去
7、表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式for(sum=0;i<=100;i++)
8、表达式2可以是数值表达式或字符表达式,只有其值为非零,就执行循环体for(i=0;(c=getchar()!
=’\n’;i+=c)
9、C99允许在for语句的“表达式1”中定义变量并赋初始值
10、凡用while循环能完成的,用for循环都能实现
11、while、do…while、for都可以用break语句跳出循环,用continue语句结束本次循环
12、break语句的作用是使流程跳到循环体之外。
但其只能用于循环语句和switch语句之中,而不能单独使用
13、continue语句的作用是结束本次循环,跳过循环体尚未执行的语句,转到循环体结束点之前,接着执行for语句中的表达式3,然后进行下一轮循环判定
14、如果是双重循环,里面有break或continue,结束的是内循环,而不是整个循环
15、在C库函数中,有两个求绝对值的函数:
abs(x),求整数x的绝对值,结果是整型;fabs(x),x是双精度数,得到的结果是双精度型
16、例5.7扩展,如果求出循环体执行多少次:
17、字符串的结尾只能'是'\0','\n'是回车不能用来判断结束,一个字符串中可以有若干个回车
第六章利用数组处理批量数据
1、数组是一组有序数据的集合,数组中的每一个元素都属于同一个数据类型
2、数组的下标是从0开始的,数组的常量表达式可以包括常量和符号常量
3、数组的大小不依赖于程序运行过程中变量的值
4、如果在被调用函数(不包括主函数)中定义数组,其长度可以是变量或非常量表达式voidfunc(intc){inta[2*n];…}合法,n的值从实参传来,叫可变长数组。
但是在执行函数时,n的值是不变的,数组的长度是固定的。
如果指定数组为静态存储方式,不可用,如:
staticinta[2*n];
5、inta[10];表示定义数组时指定数组包含10个元素
t=a[6];表示引用a数组中序号为6的元素
6、可以只给数组中的一部分元素赋值,系统自动给后5个元素赋初值为0
7、在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。
但如果数组长度与提供初值的个数不相同,则方括号中的数组长度不能省略
8、未被“初始化列表”指定初始化的数组元素,系统会自动把他们初始化为0(如果是字符型数组,则初始化为‘\0’,如果是指针型数组,则初始化为NULL,即空指针
9、冒泡法排序:
如果有n个数,则要进行n-1趟比较。
在第一趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较
Forforifforprint【重点】
10、用矩阵形式表示二维数组,是逻辑上的概念,能形象地表示出行列关系。
而在内存中,各元素是连续存放的,不是二维的,是线性的
11、注意区分定义数组和数组元素,后者行列序号从0起算
12、数组元素可以出现在表达式中,也可以被赋值:
b[1][2]=a[2][3]/2;
13、二维数据初始化,对中间行不赋初值的方法:
inta[3][4]={{1},{},{9}};
14、如果对全部元素赋初值,则定义二维数组时对第1维的长度可以不指定,但第2维的长度必须要有,系统会自动判断多少行
15、在定义时也可以只对部分元素赋初值而省略第一维的长度,但应当分行赋初值
16、数组遍历:
17、C99标准中,把字符类型归纳为整型类型中的一种,C语言没有字符串类型,字符串是存放在字符型数组中的
18、字符数组中,初值个数大于数组长度,出现语法错误;初值个数小于数组长度,其余元素自动定义为空字符’\0’
19、’\0’作为字符串结束标志,在遇到’\0’时,表示字符串结束,把它前面的字符组成一个字符串
20、字符数组并不要求它的最后一个字符为’\0’,甚至可以不包括’\0’,系统会自动添加,但是加上便于测定字符串的实际长度
21、将整个字符串一次输入或输出,用%s格式符,当用%s输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名
22、如果一个字符数组包含多个’\0’,则遇到第一个结束
23、可以用scanf函数输入一个字符串scanf(“%s”,c),如果利用一个scanf函数输入多个字符串,以空格分隔【在C语言中,数组名代表该数组的起始地址,不要再加地址符&】
24、注意空格以及如何输出该数组的起始地址:
(注意区分)
25、用puts函数输出可以包含转义字符:
(在输出时将字符串结束标志\0转换成\n,即输完字符串后换行)
26、gets函数返回的函数值是字符数组的起始地址
27、strcat函数:
把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到的函数值是字符数组1的地址,要求字符数组1必须足够大,连接时字符串1后面的\0取消,只在新串最后保留\0【格式:
strcat(字符数组1,字符数组2)】
28、strcpy函数:
作用是将字符串2复制到字符数组1中去,字符数组1必须写成数组名形式,字符串2可以是字符数组名,也可以是一个字符串常量,如果复制前未对str1初始化,其内容无法预知。
不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组,但是可以将字符赋给一个字符型变量或字符数组元素
【格式:
strcpy(字符数组1,字符串2)】
29、strncpy(str1,str2,2);作用是将str2最前面2个字符复制到str1中,取代str1原有的最前面2个字符
30、strcmp函数:
作用是比较2个字符串,规则是自左向右逐个字符相比(按ASCII码大小),直到出现不同的字符或遇到\0为止;若字符都相同,则认为两个字符串相等,若不同,以第一对不相同的字符串比较结果为准。
比较的结果由函数值带回,相等为0,字符串1大于字符串2为正整数,否则为负整数。
格式:
格式:
strcmp(字符串1,字符串2)
例:
if(strcmp(str1,str2)>0);
printf(“yes”);
31、strlen函数:
测字符串实际长度,不包括\0,也可以直接测试字符串常量的长度
32、strlwr函数:
将字符串中大写字母转换为小写字母
strupr函数:
将字符串中小写字母转换为大写字母
33、在使用字符串处理函数时,头文件应加入#include
第7章用函数实现模块化程序设计
1、一个C程序可由一个主函数和若干个其他函数构成,由主函数调用其他函数,其他函数也可互相调用,同一个函数可以被一个或多个函数调用任意多次
2、函数声明的作用是让系统中编译时知道它们是函数而不是变量或其他对象
3、一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。
由若干个源程序文件组成一个C程序,一个源程序文件可以为多个C程序共用
4、一个源程序文件由一个或多个函数以及其他有关内容组成。
一个源程序文件是一个编译单位,在编译时以源程序文件为单位进行编译,而不是以函数为单位
5、从main开始,从main结束
6、一个函数并不从属于另一个函数,函数不能嵌套定义(可以嵌套调用)。
函数间可以互相调用,但不能调用主函数,mian函数是被操作系统调用的
7、无参函数可以带回或不带回函数值,但一般不带回,有参函数应定义为与返回值相同的类型
8、定义函数,函数体可以包括声明部分和语句部分
9、调用函数并不一定要求包括分号,只有作为函数调用语句才需要有分号。
如果作为函数表达式或函数参数,函数调用本身是不必有分号的
10、定义函数时函数名后面括号中的变量名称为形式参数;在主调函数中调用一个函数时,函数名后面括号中的参数称为实际参数,实参可以是常量、变量或表达式
11、系统会把实参的值传递给被调用函数的形参
12、如果实参与形参类型不同,则按不同类型数值的赋值规则进行转换
13、在定义函数中指定的形参,在未出现函数调用时,他们并不占内存中的存储单元。
在发生函数调用时,函数max的形参被临时分配内存单元
14、应当注意返回值的类型与函数类型一致
15、形参与实参是两个不同的存储单元
16、实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,实参无法得到形参的值
17、函数的返回值是通过函数中return语句获得的
18、一个函数可以有一个已上的return语句,执行到哪一个return语句,哪一个return语句就起作用。
return语句后面的括号可以不要,return语句后面的值可以是一个表达式
19、如果函数值的类型和return语句中的表达式不一致,则已函数类型为准(不指定函数类型,编译系统默认为int型)
20、对于不带回值的函数,应当用定义函数为“void类型”,或空类型
21、用户定义的函数在调用它的函数的后面(同一文件内),应该在主调函数中对被调用函数作声明
22、函数声明比函数定义中的首行多一个分号
23、函数声明中的形参名可以省写,而只写形参的类型。
(函数定义应该不能省略)
24、如果在文件的开头,对本文件所调用函数进行了声明,则在各函数中不必对其所调用的函数再做声明
25、一个函数内不能再定义另一个函数,也就是不能嵌套定义,但可以嵌套调用函数
26、凡是变量可以出现的地方,都可以用数组元素代替
27、数组名可以作实参和形参,传递的是数组第一个元素的地址。
数组元素可以用作函数的实参,不能用作形参。
28、数组元素采用的是值传递的方式,方向是从实参传到形参,单向传递
29、用数组元素作实参时,向形参变量传递的是数组元素的值,而用数组名作函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址
30、实参数组与形参数组类型应一致,如不一致,结果将出错
31、C语言编译系统并不检查形参数组的大小,只是将实参数组的首元素的地址传给形参数组名,这样两个数组就共占用一段内存单元
32、因此形参数组中各元素的值如果发生变化会使实参数组元素的值同时发生变化
33、多维数组中,在被调用函数中对形参数组定义时可以指定每一维的大小,也可以省略第一维的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整C语言 谭浩强学习笔记 完整 语言 谭浩强 学习 笔记
![提示](https://static.bingdoc.com/images/bang_tan.gif)