《c语言程序设计》读书笔记
2022-05-22 10:18:28 0 举报
AI智能生成
c语言程序设计这本书前5章复习全解
作者其他创作
大纲/内容
第一章:程序设计与C语言
程序与程序设计语言
程序设计语言的发展
机器语言
冯•诺依曼原理,利用0和1的二进制码
特点:与人类语言差别太大,难学、难写、难记、难修改
汇编语言
采用符号表示程序设计语言
特点:容易被人读懂,依赖硬件,可移植性不好,符号较少,不够用
高级语言
非结构化语言
早期高级语言,没有形成编程规范,难以阅读和维护,软件越来越多容易出现正确性难以保证
结构化语言
1970年,第一个结构化程序设计语言Pascal出现,确定了程序的良好特性,流程不允许随意跳转,程序由上而下执行。结构化易于阅读和维护,结构清晰。比如C语言
面向对象语言
之前的高级语言为面向过程的语言,程序的执行为流水式的,不易重复使用。所以诞生了能面向一个个对象的语言。比如C++、JAVA、Python
程序设计语言的功能
数据表达
数据是计算机处理的对象,而数据表达即变量定义
流程控制
顺序结构
按顺序执行
分支结构
按不同条件执行不同的语句
循环结构
重复执行相同语句
程序算法的表示
软件的主体是程序,程序的核心是算法
算法的特征
确定性:每条指令有明确含义,没有二义性
有穷性:执行完步骤后,算法将结束,每一步都在合理的时间内完成
可行性:算法指定操作都能有限次后实现
有零个或多个输入:算法是用来处理对象的,大多数情况下,数据对象需要通过输入来得到
有一个或多个输出:算法的目的是为了求解,解只有通过输出才能得到
算法的表示
用文字描述算法
用流程图描述算法
用伪代码表示
用程序设计语言表示
C语言程序设计的特点
C语言的特点
C语言的语句简洁紧凑,使用方便灵活
ANSI C 中有32个关键字和9种控制语句
运算符丰富,表达能力强
C语言提供了34种运算符
C语言程序可移植性好
没有直接依赖硬件的语句
生成的目标代码质量高,运行效率高
主要用途之一是编写“嵌入式系统程序”
语言处理能力强
C语言是一种结构化语言
缺点:语法检查不严格,要程序员自己保证程序的正确,初学者很难掌握优先级和结合性
C语言的约定
C语言中的约定
标识符:C语言标识符由字母、数字和下划线组成,其中第一个字符必须是字母或下划线,还要避免和关键字重合
关键字:C语言规定的,赋予特定含义和专门用途的标识符
用户自定义标识符:变量名、数据类型名、函数名和符号常量名
预定义标识符:头文件、库函数等
分隔符:逗号、空格
C语言的语法成分
常量:不变的量
变量:会变得量
运算符,算数运算符:+(加)、— (减)、 *(乘)、/(除)、%(求余)
关系运算符:>(大于)、>=(大于等于)、==(等于)、<(小于)、<=(小于等于)
关系运算符:>(大于)、>=(大于等于)、==(等于)、<(小于)、<=(小于等于)
表达式:先乘除后加减,从左往右,算数运算优先于关系符
语句:C语言中最基本执行单位,分号结尾
函数定义与调用:C语言中包含若干个函数,复杂的任务通过调用这些函数来完成
C语言的编辑、编译、链接和运行
编辑
将C语言编写的源程序输入到计算机中以文件形式保存起来,扩展名.c
编译
通过词法分析和语法分析,在确认所有的指令都符合语法规则之和,将其翻译成二进制目标程序文件,扩展名.obj
链接
将目标程序与系统提供的库函数或是其他目标程序链接,得到最终的二进制可执行文件,扩展名.exe
运行
可执行文件运行后,要验证程序的运行结果,结果不相符,说明程序设计思路或算法有问题,需检查修改,并重新编译,链接运行得到结果
第二章:数据类型,运算符和表达式
C语言的数据类型
基本类型
整型:short,int,long
字符型:char
实型(浮点型):float,double
构造类型
数组类型
结构体类型
共用体类型
枚举类型
指针类型:*
空类型:void
C语言的常量
直接常量
整型常量:可以用十进制,八进制和十六进制表示
即整数,包括正整数,负数和零
12l和12L表示long int
246u表示unsigned int型
实型常量:只能用十进制表示
小数形式
由整数部分,小数点和小数部分组成,当整数部分或小数部分为0时,可以省略不写,但是小数点不可省略
小数点前后至少一边要有数字
指数形式
由尾数部分,字母E或e和指数部分组成,格式为:加减和尾数E指数
字母E(或e)的前后必须由数字,并且指数部分只能是整数
c语言默认double型的实数,数的后面加F或f则认为float型实数
字符型常量
字符常量
每个字符占用一个字节,用于存储它的ASCII码值
字符常量是单个字符,不是字符串
字符常量只能用2或其他括号单引号,不能用
字符型常量指单个字符,用一对单引号及其括号所括起来的字符表示
转义字符
对于控制符(如回车,换行等)与不可见字符,用转义字符表示
‘\'开头后面加上一个字符或用八进制十六进制的ASCII码值表示
是字符常量的一种,只代表一个字符
字符串常量
由一个双括号括起来的零个或多个字符序列,如“HelloWorld”
字符串中可以使用空格字符,转义字符和其他字符,也可以使用汉字等文字符号
系统自动在结尾加‘\0’表示字符串结束
可使用sizeof运算符来计算字符串占用内存空间大小
字符串占用两个字节,加上\0,赋值只能用字符数组
符号常量
用一个边师傅来表示一个常量,称为符号常量,用(#define 标识符 常量值)表示
好处
增加程序的可读性
提高程序的可维修性
简化程序代码
方便数组的定义
C语言的变量
变量的定义与使用:所有的变量必须先定义后使用
变量的定义(类型说明符 变量名表;)
初始化时=左右的变量类型要一致,如果不一致,系统会自动赋值转换
定义变量后就能在程序中使用
整型变量
short int 短整型 2字节
int 整型 4字节
long int 长整型 4字节
unsigned short 无符号短整型 2字节
unsigned int 无符号整型 4字节
unsigned long 无符号长整型 4字节
实型变量
单精度(float型)
4字节 保留7位有效数字
双精度(double型)
8字节 保留16位有效数字
Visual C++2010双精度都小数后最多保留小数后6位,其余部分四舍五入
字符型变量
占用一个字节,可以用字符变量按整型输出也可以把整型量按字符量输出
运算符合表达式
赋值运算符和赋值表达式
简单赋值运算符,如=
符合赋值运算符,如+=,-+,*=,/=,%=
赋值表达式由赋值运算符将一个变量给一个表达式连接起来的式子(变量=表达式)
算术运算符和算术表达式
基本算术运算符,+,-,*,/,%
自增自减运算符,++和--
++,前缀,先计算后使用
++,后缀,先使用后计算
--,前缀,先计算后使用
--,后缀,先使用后计算
算术运算符的优先级和结合性
单目运算符是有结合,双目算术运算符是左结合
双目高于单目
算术表达式
由算术运算符,运算对象和括号连接起来的式子
表达式所有字符都在同一行上,只能用(),注意括号的配合
逗号运算符和逗号表达式
功能是把一个或多个表达式连接组成一个表达式
逗号表达式从左往右计算每个表达式的值,并把最后一个逗号表达式算整个逗号表达式的值
逗号表达式是双目运算符,其优先级最低,左结合
在变量中出现为变量分隔符
求字节数运算符
运算符sizeof,一个单目运算符,计算数据类型所占字节数
优先级高于双目运算符,格式:sizeof 表达式。。。。
数据类型转换
自动类型转换
不同类型的数据运算时,编译系统会自动进行类型转换
规则:占用内存空间少(低级)向占用空间多(高级)类型转换,保证运算的精度
强制类型转换
形式(类型说明符)(表达式)
需要强制类型转换表达式一定要用括号括起来
强制类型转换是一种不安全的转换,从高级类型转换成低级类型,则会影响数据的精度
第三章:顺序结构程序设计
C语言的语句
说明语句
用于定义程序使用的变量与类型
表达式语句
表达式语句由表达式加上分号“;”
分支语句
根据条件的成立与否执行不同的语句
循环语句
实现循环控制的语句有3种,即for语句,while语句和do-while语句
转向语句
转向语句有break语句,goto语句,continue语句,return语句
复合语句
用一对大括号{}将若干个语句顺序组合在一起所形成的语句称为复合语句
除复合语句外,其他语句都以分号结尾
空语句
空语句只有一个分号;构成
不执行任何操作,用于循环体,有延时的功能
函数定义与调用
函数是完成特定功能的小模块
输入与输出
所有的输入与输出都是通过有关函数(如scanf()和printf()函数)来实现的
数据的输入和输出
输出函数(printf())和输入函数(scanf())
printf()函数
格式:printf(“格式控制字符串”,输出项表列)
格式控制字符串用双引号括起来,表示输出的格式
输出项表列可以是常量,变量或表达式
格式控制字符串包含两种信息,格式控制说明和普通字符
格式控制说明:以%开头,说明数据的类型,形式,长度,小数位数等
普通字符:原样输出的字符
注意
格式字符与输出项类型要一一对应,不同类型的数据所使用的格式字符不同
格式字符与输出项的个数应相同
格式字符多于输出项格式,多于的格式将输出不确定的值
格式字符少于输出项的个数,多于输出项不能输出
printf()函数可以没有输出项,此时就是输出字符串
多个输出项之间使用逗号进行分隔,从右至左的顺序计算出值后输出
输出字符%,要连续使用两个%
scanf()函数
格式:scanf(“格式控制字符串”,输出项表列)
格式控制说明和普通字符差不多
输入的参数必须和格式控制字符串中的格式说明相对应,类型个数和位置都要一一对应
程序中有多个scanf()函数时,程序会等待用户输入
注意
输入项必须是地址,不能是变量名
格式字符可以指定输入数据所占的列数,系统会截取相应的数据
输入数据时遇到以下情况则认为输入结束:空格,Tab键,回车键,非法输入,指定宽度
用户也可以自己指定其他字符作为输入的间隔
整型数据的输入和输出
printf(),scanf()函数格式字符【整型数据】
d
以十进制形式输入/输出带符号整数
o
以八进制形式输入/输出无符号整数
x,X
以十六进制形式输入/输出无符号整数
u
以十进制形式输入/输出无符号整数
printf()函数中的格式修饰符
|
用于长整型
-
输出结果左对齐,右边补空格
+
输出符合(正号或负号)
#
对d,u格式无影响,对o格式字符,在输出时加前缀0,对x格式字符,在输出时加前缀0x
m
指定数据的输出宽度
scanf()函数中的格式修饰符
|
用于输入长整型
m
指定输入数据所占宽度
*
表示本输入项不会赋值给相应变量
实型数据的输入和输出
printf()
子主题
以小数形式输出单精度或双精度数(保留6位小数)
E,e
以指数形式输出单精度或双精度数
g
以%f,%e中较短的输出宽度输出单精度或双精度数
scanf()
f
以小数形式输入单精度数
E,e
以指数形式输入单精度数
lf
以小数形式输入双精度数
le
以指数形式输入双精度数
说明
输出实型数据时,还可以指定输出精度,即在格式字符串的%和格式字符之间加入“m.n”,其中m指明输出的总位数,n指明小数后的位数
实际输出大于n,四舍五入,实际输出位数小于n,则不足部分后补0
scanf()函数不能指明宽度
字符型数据的输入和输出
使用scanf()函数和printf()函数对字符型数据进行输入输出
使用getchar()函数和putchar()函数对字符型数据输入输出
getchar()函数
格式:ch=getchar()
输入单个字符,需要输入多个字符,一般采用循环调用
putchar()函数
格式:putchar(输出参数)
输出一个字符,输出参数是字符型变量或字符型常量
数学库函数
指数函数 exp(x)
如exp(2.3)的值为9.974182
绝对值函数fabs(x)
如fabs(-2.8)的值为2.8
以e为底的对数函数log(x)
计算Inx,如log(123.45)的值为4.815836
幂函数pow(x,y)
如pow(1.3,2)的值为1.69
平方根函数sqrt(x)
如sqrt(4.0)的值为2.0
用户在调用数学库函数时,一定要在程序开头使用#include<math.h>
第四章:分支结构程序设计
关系运算符、逻辑运算符、条件运算符
关系运算符合关系表达式
关系运算符
> ,>= ,< ,<= ,== ,!=
注意
关系运算符都是双目运算符,其结合是左结合
关系运算符优先级低于算术运算符,但是高于赋值运算符
>,<,>=,<=的优先级相同,==,!=,优先级相同
前者优先级高于后者
关系表达式
用关系运算符将两个式子连接在一起的式子称为关系表达式
格式:表达式1 关系运算符 表达式2
功能:比较两个表达式的大小,返回一个逻辑值
注意
注意区分=和==的区别,前者为赋值运算符,后者为关系运算符
对实数进行相等判断可能得到不正确的结果
关系运算符可以出现赋值运算符,但是要用括号括起来。因为关系运算符的优先级高于赋值运算符,如果赋值运算符左边不是变量,会出现编译错误
关系表达式注意用于分支结构的条件判断
逻辑运算符和逻辑表达式
逻辑运算符
关系表达式只能描述单一的条件,所有需要逻辑运算符来连接起来
!逻辑非 右结合 优先级最高
&& 逻辑与 左结合 优先级其次
|| 逻辑或 左结合 优先级最低
注意:&&和||都是双目运算符,!为单目运算符
逻辑表达式
连接两个逻辑运算符的式子为逻辑表达式
格式:表达式1 逻辑运算符 表达式2 或者 逻辑运算符 表达式1
逻辑运算真值表
说明
逻辑运算的数据用非0和0来表示真和假
逻辑运算符优先级高于赋值运算符,使用时要用括号,否则赋值运算符的左边不是变量,会出现编译错误
逻辑运算造成短路时的情况
逻辑与(&&)
逻辑与(&&)左边的表达式为假,整个表达式为假,右边的表达式不在计算
逻辑与(&&)左边的表达式为真,才计算右边的表达式
逻辑或(||)
逻辑或(||)左边的表达式为真,则整个表达式为真,逻辑或(||)右边的表达式不进行计算
逻辑或(||)左边的表达式为假时,才计算右边的表达式
各种运算符的优先级从高到低的顺序
! 右结合 最高
算术运算符 左结合 其次
关系运算符 左结合 再其次
逻辑与(&&)和逻辑或(||) 左结合 再其次
赋值运算符 右结合 最后
条件运算符和条件表达式
条件运算符
条件运算符由(?)和(:)两个符合组成,用于条件求值
条件运算符是三目操作符,需要三个操作数
条件运算符优先级低于逻辑运算符,高于赋值运算符,右结合
条件表达式
格式:表达式1?表达式2:表达式3
执行顺序
先计算表达式1的值,若为非0,表达式为真,表达式2的值为整个条件表达式的值
否则,将整个表达式3作为整个表达式的值
说明
条件表达式中的表达式1的类型可以和表达式2和3不同,表达式2和3也可不同,系统自动转换,结果为表达式2和表达式3中级别较高的作为条件表达式的类型
条件表达式2和3不仅可以可以是数值表达式,也可以是赋值表达式,但是要加在条件表达式3中加括号,因为优先级的不同,可能会出现编译错误
条件表达式允许嵌套
使用if-else实现分支结构
if-else语句
双分支if语句
格式:if(表达式) 语句1;else 语句2;
表达式为真执行语句1,否则执行语句2
双分支if语句可以用条件表达式替换
单分支if语句
格式:if(表达式)语句;
双分支if语句缺少语句2时构成单分支if语句
语义是计算表达式,判断为真执行语句,为假不执行语句,直接执行if语句下一语句
无论是双还是单,表达式都是判断语句,语句可以是任意类型的表达式
无论是双还是单,被执行的都是单语句,如果想执行一组(多于一个)语句时,必须用大括号{}括起来形成复合语句
大括号{}后不能再加括号,注意,复合语句中的语句会被全部执行
if语句的嵌套
一个if语句中包含一个或多个语句时,叫if语句的嵌套
语句1和语句2都可以嵌套另一个if语句,缺省else的if语句也可以嵌套另一个if语句
if语句书写采用缩进格式,尽管不采用不会报错,但是采用缩进,可以使程序结构更清晰,更易读
为避免二义性,c语言原则是:else总是与它前面最近的一个未匹配的if相匹配
多分支if语句
利用else if语句进行多分支判断
使用switch语句实现分支结构
格式:switch(表达式){case 常量表达式1:语句1;break; case常量表达式2:语句2;break; ... case常量表达式n:语句n;break; default:语句n+1;break;}
执行过程
首先计算switch后面括号内的表达式
然后从上到下按顺序执行各个case后面常量表达式的值进行比较
若某个常量表达式相等,就执行该常量表达式后的语句,再执行brake语句,跳出switch语句,switch语句执行结束
如果表达式的值与任何一个常量表达式的值都不相等,则执行default语句,在结束switch语句的执行
说明
switch后的表达式可以是任何表达式,其值为整型,字符型和枚举型之一
各个case后面的常量表达式互不相同,否则会出现互相矛盾的现象
各个case和default的出现次序不影响执行结果
可以让多个共用一组执行语句
switch语句允许嵌套使用
switch语句中不使用break语句时,会按顺序执行相应语句,不会跳出switch语句
第五章:循环结构程序设计
使用for语句实现循环结构
for语句的基本语法
格式:for(表达式1;表达式2;表达式3)循环体语句;
执行过程
首先执行计算表达式1
判断表达式2,若其值为真(非0),则执行循环体语句,然后执行表达式3,再判断
若表达式2,其值为假(0),结束循环,执行for语句下条语句
注意:表达式1只是在进入循环之前计算一次,表达式2,循环体语句和表达式3将重复执行
可以应用于计数型的循环
格式:for(循环变量赋初值;循环条件;循环变量增量)循环体语句;
说明
循环变量赋初值是赋值语句,给循环变量赋初值
循环条件是一个关系表达式,决定可是终止循环(即确定循环的终值)
循环变量增量决定循环变量在完成一次循环后如何变化
三部分以分号(;)分开
for语句的一般形式中省略表达式1
格式:for( ;表达式2;表达式3)循环体语句;
省略表达式1时,可以将循环体变量赋初值放在for之前,此时不能省略第一个分号(;)
for语句的一般形式中省略表达式2
格式:for(表达式1; ;表达式3)循环体语句;
省略表达式2时,表达不对循环进行控制,这时如果没有其他处理的话,会形成死循环,应避免这样使用for结构
for语句的一般形式中省略表达式3
格式:for(表达式1;表达式2;)循环体语句;
省略表达式3时,可以在循环体语句中加入修改循环变量的值得语句
for语句的一般形式中表达式1和表达式3也可以是逗号表达式
for语句的一般形式中表达式2的值只要非0,就执行循环体
for语句的一般形式中循环体语句可以省略
使用while语句实现循环结构
while语句的基本语法
格式:while(表达式)循环体;
while语句使用时,先判断一个条件,所以可以用while循环实现”当型“循环
执行流程
计算表达式的值,为真执行第二步,否则为假,不执行,执行下个语句
执行循环体,再返回第一步再判断,直至为假为止
while语句的特点是先判断循环条件,后执行循环体
注意
while后面的括号()不能省略
语句中可以是任意表达式,表达式为真,执行循环体,为假不执行,直接执行下个语句
循环语句可以是复合语句,当循环体有多条语句构成时,必须用大括号{}括起来,形成复合语句
为使循环能正常结束,循环体中应对表达式修正,使表达式趋近于假,避免出现死循环
使用do-while语句实现循环结构
do-while语句的基本语法
格式:do 循环体 while(表达式);
执行过程
执行循环体语句
计算表达式的值,为真返回第一步,为假执行执行下一步
结束循环,执行do-while语句下一条语句
注意
do-while语句特点是先执行循环体,再判断循环条件
do-while循环至少要执行一次循环体
do之和不能有分号:,因为该语句还没有结束
while(表达式)之和必须由语句结束符分号:,表示do-while语句到此结束
循环体中必须有改变循环条件的语句,否则会出现死循环
改变循环结构的跳转语句
brake语句
格式:break;
break语句用于循环语句中时,可使程序终止循环而转去循环语句的后继语句
通常break总与if语句一起配合使用,满足条件跳出循环
continue语句
格式:continue;
continue语句的作用是跳过循环体中continue后面的语句,继续下次循环
continue语句只能用在循环语句中,常与if语句一起使用
注意
continue语句与break语句有着本质区别,continue语句只是结束本次循环不终止整个循环执行,而break语句的作用是强制终止整个循环程序
goto语句
格式:goto 语句标号;
说明
语句标号是一个有效的标识符,使用时,在语句标号后面跟一个“:”
执行goto语句时,会控制跳转到该语句标号处,达到控制循环的目的
注意
语句标号必须与goto语句处于同一个函数中
通常goto语句与if语句连用实现循环控制
大型程序中由于goto语句可能存在不合理的使用,会使程序结构变坏
所以在结构化程序设计中,不建议使用goto语句
循环嵌套
当一个循环的循环体内又包含另一个完整的循环结构时,称为循环的嵌套或者二重循环
for与,while语句及do-while语句相互嵌套
for语句中嵌套for语句
for语句中嵌套while语句
while语句中嵌套while语句
do-while语句中嵌套for语句
do-while语句中嵌套do-while语句
while语句中嵌套do-while语句
注意
外循环执行一次,内循环要执行一轮
即外循环执行一次,内循环一直要执行到条件不满足时为一轮;再执行外循环一次,内循环又一直执行到条件不满足为第二轮;如此重复执行,直到外循环条件不满足时,整个循环嵌套结束
循环嵌套格式中的内外循环体不允许出现交叉,即外循环要完全包含内循环
循环嵌套时,内循环体中使用break语句和continue语句时,只影响包含它们内循环,与外循环无关
典型算法举例
递推法
解题思路
后项可由前项推出(称为前推)
前项可由后项推出(称为后推)
迭代法
牛顿迭代法又称为牛顿切线法
穷举法
解题思路
在一个集合内每个元素一 一测试
集合即取值范围,首先确定问题的取值范围,然后对所有值逐个进行判断
用人工做这项工作即单调而又繁琐,可以用计算机的高速运算来处理重复的工作
收藏
收藏
0 条评论
下一页