---2019/2/22·
用一周时间重新复习了一下C语言,今天把笔记部分记录在这里,方便日后查看。
【第一章】 计算机与程序设计概述
“工艺的乐趣”:一,因为制造自己设计的东西而快乐;二,因为制造了对他人有用或受他人尊敬的东西而快乐;三,因为用迷宫一样复杂的对象构建系统并使之正常运行而快乐;四,因为工作非重复性的本质可以不断学习而充满乐趣;五,因为能够自如驾驭自己手中的工具工作而快乐。
- 计算机硬件包括:
- 主存储器(主存)
- 辅助存储器(外存),包括硬盘、CD、DVD和U盘等存储设备。
- 中央处理器。
- 输入设备,例如键盘、鼠标、触摸板、扫描仪、操纵杆。
- 输出设备,例如显示器、打印机和扬声器。
·存储器
存储单元:存储器中的单个存储位置。
存储单元地址:存储单元在计算机主存中的相对位置。
存储单元由字节构成。字节(byte)是存储单个字符(如H)所需要的空间,每个存储单元的字节数因计算机而异。字节由位(bit)构成,它是计算机能够处理的最小单元。每一位为0或者为1,通常8位构成一个字节。
·主存储器
RAM(随机存储器):它可以暂时存储程序与数据。
ROM(只读存储器):主存中能永久储存程序或数据的部分。
·中央处理器(CPU)
两个作用:1.协调所有计算机操作;2.实现数据的算术与逻辑运算。
CPU的当前指令和数据由成为寄存器的高速存储区暂时存储在CPU内部。
一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
区别:
内部总线实现CPU内部各个器件之间的联系。
外部总线实现CPU和主板上其它器件的联系。
CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间。
我们将这个唯一的地址称为物理地址。
·计算机网络
局域网(LAN):计算机、打印机、扫描仪和外存设备为了相互通信而通过电缆连接就构成局域网(LAN)。
文件服务器:网络中控制对辅助存储器(如硬盘)存取的计算器。
广域网(WAN):像因特网这样的网络,在很大地域范围内连接计算机和局域网。
万维网(WWW):因特网的一部分,它的图形用户界面使得网络资源变得容易存取并可在其间漫游。
图形用户界面(GUI): 为了让用户选择命令和数据而显示的图片和菜单。
如果为计算机配备一个调制解调器,那么就可以通过电话线、电视或光缆连接信息高速公路。调制解调器可以将计算机的二进制数据转换为音频信号,然后通过普通的电话电路传递到另一台计算机。
DSL连接:一种使用电话线的高速因特网连接,不会影响同一线路上同时进行的声音交流。
电缆因特网接入 通过同轴电缆上的两条信道进行双向高速因特网数据传输,该同轴电缆具有数百个信道,可以传输有线电视信号。
·计算机软件
操作系统(OS) 控制用户和计算机硬件交互,并管理计算机资源分配的软件。
通常操作系统的一部分永久储存在只读存储器(ROM)芯片中,因此只要计算机一启动,这部分操作系统就运行了,计算机可以读取只读存储器中的数据,但是不能向芯片中写数据。操作系统中基于ROM的一部分包含了将其余操作系统代码(这部分驻留在硬盘上)载入内存所需要的指令。将操作系统载入内存的过程称为BOOT(booting a computer)
·计算机语言
机器语言 能被具体的CPU理解的二进制数代码。
汇编语言 机器语言指令对应的助记码。
高级语言 将代数表达式和英语符号组合在一起的独立于机器的编程语言。
·高级语言程序的执行过程
编译器(compiler) 将高级语言程序翻译为机器语言的软件。
源文件(source file) 包含一个用高级语言编写的程序的文件,是编译器的输入。
语法(syntax) 一种编程语言的语法规则。
目标文件(object file) 从编译器输出的机器语言指令文件。
链接器(linker) 链接器程序将预制的函数和目标文件结合在一起,产生完整的可运行的机器语言程序,即产生.exe文件。
运行程序时,加载器将可执行文件的所有指令从硬盘复制到内存中,并指示CPU从第一条指令开始执行。
集成开发环境(IDE) 结合字处理器、编译器、链接器、加载器和查错工具的软件包。
【第二章】C语言概述:
·预处理指令 以#开始的为预处理器提供指令的C程序行。
预处理器 在C程序编译前对其进行修改的系统程序
库(library) 可以被程序访问的一些实用函数和符号的集合。每个库都拥有一个文件名以符号.h结尾的标准头文件。
预处理指令语法:
·定义常量宏语法:
·主函数(main函数)定义
·void关键字使用规则:
一,函数没有返回值,则应声明为void类型
因为在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。
二,如果函数无参数,那么应声明其参数为void。
如int main(void)表示主函数在开始执行前不从操作系统接收数据。
·C数据类型
·C的数值常量被认为是非负数值。尽管在程序里可以使用一个像-10500这样的数字,但是C会将负数符号看做是取反运算符。
int,整数,但由于一个存储单元的大小有限,但由于一个存储单元的大小是有限的,故其范围在-32767和32767之间。
double,实数,实数有一个整数部分和一个小数部分,并由小数点分隔开。
科学计数法表示实数实例:1.23e5 或 1.23E5;0.34e-4(0.000034),科学计数法的double型常量可以没有小数点,如12e+5。
char,表示一个字符值——字母、数字或专用符号。每个char值必须包含在撇号(单引号)内。
·用户定义标识符原则
- 标识符只能由字母、数字和下划线组成。
- 标识符不能以数字开始。
- C保留字不能用作标识符。
- 在C标准库中定义的标识符不能被重新定义。
建议使用标识符风格:如dollars_per_hour或lbs_per_sq_in
·变量声明语法:
·赋值语句语法:
·printf函数
格式字符串占位符
格式字符串:调用printf时,包含在引号内的字符串,用于指定函数输出格式。
占位符:在格式字符串中以%开始的符号,用于表明显示输出值的位置。
换行符转义序列:\n
·scanf函数
调用scanf时,每个待赋值的变量名前都有一个&符号。&是C中的取地址运算符。在该输入操作中,&告诉scanf函数到哪里寻找要存储新值的每个变量。如果省略&符号,scanf将只知道变量的当前值,而不是它在内存中的位置,因此scanf将不能再该变量中保存新值。
scanf中使用的输入字符的数目依赖于当前的格式占位符,占位符还可以反映存储数据的变量的类型。一个%c(char型变量)对应一个输入字符。对于%lf或%d(double型或int型变量)来说,程序首先跳过所有的空格,然后开始扫描多个字符,直到遇见一个不可能是该数值的一部分字符才结束。
·return语句
0被认为是主函数的执行结果,该值表明执行的程序没有错误。
混合类型赋值时,首先求出表达式的值,这一过程中,表达式: ace 算术运算符 bandage在两者全为int型的情况下为int型,否则就为double型,之后将该值赋给赋值运算符(=)左边的变量。
如:
int m = 3;
int n = 2;
double y;
y = m/n;
结果y = 1.0
将double型表达式赋给int型变量,会使得表达式的小数部分丢失。
·强制类型转换:将希望的类型写在表达式前的圆括号内,从而转换表达式的类型。
·单目运算符
单目运算符在同一个子表达式中以及相同优先级内(如+和-)按从右向左进行运算。
·格式化数值
在占位符%d的%与d之间加一个数指定域宽——显示一个数值所需的列数。
当域宽大于数值列数时,会在数值之前用空格补齐。
负号也占一个列。
例:
double类型的格式化还需指明小数位的数目,格式为%n.mf,n为表示整个域宽的数,m是希望的小数位的数目。显示的数值会被四舍五入为m位小数。
例:
如果使用类似%.mf的占位符只指明小数位的个数,那么显示的值中将不会有前导空白。
例:
·常见编程错误
- (syntax error)语法错误:在程序翻译(编译)过程中检测到违反C语言语法规则的错误。
- (run-time error) 运行时错误:试图执行一个非法操作,在执行过程中被检测到(如除以0)
·输入与输出重定向
函数fopen用法:
- FILE *fopen(const char *path, const char *mode);
- FILE *inp;
Inp = fopen(const char *path, const char *mode);
path包含文件路径及文件名,参数mode字符串则代表着流形态。
C语言中如果文件与源文件在同一个文件夹内,则不需指明路径。
数据流:以规定顺序被读取一次的数据序列。
又如:
FILE *fphzk
fphzk=("c:\\hzk16',"rb")
其意义是打开C驱动器磁盘的根目录下的文件hzk16, 这是一个二进制文件,只允许按二进制方式进行读操作。
两个反斜线“\\ ”中的第一个表示转义字符,第二个表示根目录。使用文件的方式共有12种,下面给出了它们的符号和意义
函数fclose用法:
int fclose(FILE *stream); 该函数返回一个整数,当文件关闭成功时,返回0,否则返回一个非0值。
函数fprintf用法:
int fprintf (FILE* stream, const char*format, [argument])
FILE*stream:文件指针
const char* format:输出格式
[argument]:附加参数列表
例:基本用法同printf。
函数fscanf用法:
int fscanf(FILE * stream, const char * format, [argument...]);
其功能为根据数据格式(format)从输入流(stream)中读入数据(存储到argument);
例:
【第三章】函数自顶而下设计
步骤一:分析问题,将问题分开成为若干的子问题,按照先后或并列的逻辑组织这些问题。
步骤二:制定顶层函数设计,用框图的形式表达,写出每一个函数的具体作用,用注释的方式列出函数的数据需求,其中包括:1.问题常量 2.问题输入 3.问题输出 4.相关数据结构与公式
步骤三:根据每一个函数的数据需求细化地编写每一个函数。
·库函数:
用#include <math.h> 语句引入数学库函数
定义与调用无参函数
function prototype
定义:void draw_circle(void);
调用:draw_circle();
·双反斜杠\\在格式字符串中表示单反斜杠\
·带输入参数的函数
实参:在函数调用括号内的表达式,它的值被传入函数并和函数的对应形参关联。
形参:在函数定义中表示对应实参的标识符。
一:带输入参数和单一结果的函数
函数接口注释实例:
/* Pre: n is defined. 此为前置条件,即函数调用前为真的条件。
二,带多个参数的函数
通常要保证参数表的一致性,要求函数调用中实参的数目必须与函数原型中形参的数目一致,保证不会有信息丢失。
为了检验函数编写的正确性,可以使用驱动测试函数,即通过定义函数参数、调用函数并显示返回值才测试函数的一个小程序。
【第四章】 选择结构
关系运算符:
逻辑运算符:&&(与)、||(或)、!(非)
逻辑运算符可以作用于数上,C语言对逻辑表达式求值的结果总是为0或1。但C语言认为任何非0值代表true。
注:&&(与)的优先级高于||(或)
C语言中存在短路求值现象,要注意。
短路求值:只要逻辑表达式的值能够确定就停止对表达式求值。
ex:
·C语言中也可以使用关系运算符和判等运算符来比较字符。例:
if语句:
风格参考:
if (条件) {
条件为true时的任务
}
else {
条件为false时的任务
}
内聚函数:执行单个特定操作,在程序中可被复用的函数。
编写内聚函数是一种良好的编程风格。
在进行顶层设计的时候,可以考虑采用数据流的形式,对问题进行分析与设计。
数据流信息是系统文档很重要的一部分,因为它表明了每个算法步骤处理的程序变量,以及处理这些变量的方式。
如:
·嵌套if语句结构
·多选项if语句结构
注:C语言会将else和最近一个不完整的if相关联。
switch语句:
条件表达式只能是int或者char类型,不可是double类型。包含double类型或字符串值的case标签是不允许的。
如果没有break语句,程序执行将“贯穿”到下一个选项。
·使用switch语句时,为了防止整个switch语句被跳过,可添加default标签默认执行回显语句,方便后期进行查错。
注if(!x) 语句1; 指:当x为0时,执行语句1。