C语言笔记1.0.0(专升本)
第一章 C语言与程序的算法(~5%)
语言分类:机器语言 ,汇编语言,高级语言
C语言特点,灵活,移植能力高,编译质量高
C语言程序设计包含三个方面的因素:语法,语义,语用
void main() { //main主函数主管道的意思,读程序要从main开始读{}里面是函数体,一个函数分成两个部分函数头跟函数体,void是空的意思;()在这表示函数以及调用函数
double r, s, L;//定义了3个双精度浮点型 double的字节是八位 在32位机中是八位,一字节8比特
printf("输入圆的半径:");//输出
scanf("%lf" ,&r);
L= 2*PI * r;
s =PI* r * r;
printf("该圆的周长是%lf",s);
}
C 程序的基本结构
1)C 程序有且仅有一个 main() 函数;main()函数是 C 程序处理的起点;程序的执行总是从 main 函数开始,在 main 函数结束,读C语言的时候先找main(),
2)C 程序中的一个语句可以跨越多行,并且用分号(语句分隔符)通知编译器该语句已结束。 一个;表示一句.;单独的分号表示空语句
3) 函数是 C 程序的基本构成单位
4) /*...*/表示多行注释不可以嵌套使用,//表示单行注释可以嵌套使用
1 |
)编译过程: |
2)源程序:是用户创建的文件,以“.c”为文件扩展名保存
3)目标文件:是编译器的输出结果。这类文件的常见扩展名为“.o”或“.obj” 里面的写的注释会去掉
4)可执行文件:是连接器的输出结果。可执行文件的扩展名为“.exe”。
5)头文件:含有函数的声明和预处理语句,用于帮助访问外部定义的函数。头文件的扩展名为“.h”。
6)计算机不能直接执行用C语言编写的源程序
7).obj 和.exe 的文件都是一个二进制文件。.exe 可以直接运行,但.obj 文件不能直接运行
3.算法的特征:算法:解决问题的具体方法和步骤 1)有穷性——算法必须在执行有穷步之后结束,而且每一步都可在有穷时间内完成
1)确定性——每条指令无二义性。并且,相同的输入只能得到相同的输出;
2)可行性(有效性)——对需要执行的每一步操作,必须给出清楚、严格的规定。
3)健壮性
4)输入——算法有零至多个输入。
5)输出——算法有一个至多个输出
算法的表示方法
i. 自然语言
ii. 程序流程图
iii. N-s合成图
iv. 伪代码
v. 计算机语言
4.流程图
开始/结束判断/分支
处理连接符
输入/输出
流程线
语句:简单语句,复合语句,包括:控制语句,表达式语句,函数调用语句,空语句,
第二章 数据类型、运算符与表达式(~10%)
1. 数据类型 变量名=常量;
2. 0开头是八进制 0x开头是16进制
3. 变量的命名规则
1)组成:52 个字母(A-Z, a-z),10个数字(0-9),下划线(_)
2)开头:字母或下划线
3)注意:不能是关键字,C 语言区分大小写,数字不能开头
4. 数据类型
1)基本数据类型:整型,实型(浮点型),字符型int,char,float,double,void
2)整型
整型:int (32位机中占 4字节)
无符号整型:unsigned (VC++中占 4字节)
短整型:short(VC++中占 2字节)
无符号短整型: unsigned short(VC++中占 2 字节)
长整型:long(VC++中占 4字节)
无符号长整型:unsigned long(VC++中占4 字节)
字符型 char (1个字节)
3)整型常量
十进制:0~9 的数字,前面可添加”+“或”-“,不能以 0 开始
八进制:0~7 的数字,以 0为前缀
十六进制:0~9 的数字和 A~F 的字母(大小写均可),以 0X 或 0x 为前缀
数字后加L 或 l 表示长整数
数字后加U 或 u 表示无符号数
4)单精度浮点型:float(VC++中占 4字节)
5)双精度浮点型:double (VC++中占 8字节)
6)实型常量
定点数:0~9 数字和小数点组成
指数形式:形式为:aEn(a为十进制数,E 大小写均可,n为十进制整数,值为 a*10n
7)字符型:char(内存中以 ASCII 码存放,在其取值饭范围内和整数可以相互通用)如:char c='A'+10;后,c 为 K
常见的字符相应的 ASCII 码:’0’:48,’A’:65 ,‘a’:97
小字字母的ASCII 码和大字字母的 ASCII 码相差32。
小字字母-32=对应的大字字母;大字字母+32=对应的小字字母
转义序列:’\’后的字符和’\’一起表示另外一个字符。
\n:换行,\0:空字符,\':单引号,\":双引号,\\:反斜线,
\ddd:ASCII 码为 ddd 的一个字符(ddd为 8 进制数)
8) 字符型常量:用单引号引起来的一个字符
指针四个字节
3. 变量定义:
允许在一个类型说明符后声明多个类型相同的变量,各变量名之间用逗号隔开;
类型说明符与变量间有一个空格
后一个变量名后有一个分号
变量使用前必须定义
可以在定义变量的同时赋初值,也可在定义后,使用前赋初值。
4. 算术运算符:熟悉常用算术运算符的使用:+,-,*,\,%,++,--
两个整数相除的结果是整数(小数部分被自动切断),如果运算量有一个中实型,结果为双精度实型。如:7/4 结果是 1。
%操作两边必须是整数,结果等于两数相除后的余数。如 7%4结果是 3
前置++:先加后用,后置++:先用后加(--也是一样)
5. 赋值运算符:熟悉常用赋值运算符的使用:= ,+= ,*=, /=, %=, -=
a=b=c=5(从右向左计算)如:intx=10,y,z;执行 y=z=x;后,x,y,z的值都为 10。
变量+=表达式表示:变量=变量+表达式(如 a+=5 表示:a=a+5)
6. 逗号运算符和逗号表达式逗号运算法优先级别最低,所以取最后一个
从左向右计算表达式的值为 后一个表达式的值。a=3*5,a*4,计算结果为a=15,整数个表达式的值为 60。
如:inta,b,c;a=(b=c=3,c++,b+=c);则 a 的值是 7。
7. 关系运算符:熟悉常用关系运算符的使用:>,<,>=,<= ,== ,!=
计算结果是真(1)或假(0)。如 intx=5,y=4;表达式 x==y+1 的结果 1。
int y=10,z=9;执行 x=y==z后,变量 x 的结果是 0
二元操作符,从左向右计算,如a>b>c 是先计算 a>b 的值(1 或 0),再用 1或
0和 c 进行比较。
8. 逻辑运算符:熟悉常用关系运算符的使用:&&(一假及假), ||(一真及真),!
计算结果是真(1)或假(0)。
二元操作符,从左向右计算,如a>b&&a<c,如果 a>b为假,不会计算 a<c。因为&&为真的条件是两个操作数同为真,相似的有||,如果||左边的值为真,也不会计算右边的结果,因为||真的条件是只要一个真就为真。
9. sizeof 运算符
使用 sizeof 运算符可以获得数据类型占用内存空间的大小。其一般形式为:sizeof(type_name)
sizeof 运算符的结果以字节为单位显示。sizeof(int);将会返回值4
10. 三元运算符:表达式1?表达式2:表达式3 唯一一个三目运算符
该运算表达式是先全判断表达 1是否是真,如为真,表达式的值是表达式 2 的值,否则是表达式 3的值。
11. 运算符优先级
运算符 |
描述 |
结合性 |
() |
圆括号 |
自左向右 |
!, ++, --, sizeof |
逻辑非,递增, 递减,求数据类型的大小 |
自右向左 |
*, /, % |
乘法,除法,取余 |
自左向右 |
+, - |
加法,减法 |
自左向右 |
<, <=, >, >= |
小于,小于等于,大于,大于等于 |
自左向右 |
= =, != |
等于,不等于 |
自左向右 |
&& |
逻辑与 |
自左向右 |
|| |
逻辑或 |
自左向右 |
=,+=, *=, /=, %= ,-= |
赋值运算符,复合赋值运算符 |
自右向左 |
12. 类型转换
1)自动转换:不同类型数据混合运算时,由编译器自动完成转换规则:
Double ß--float
Long
Unsigncd
intß-----Short Char
强制类型装换(int)a
浮点型直接把小数点后去掉,不是四舍五入
数据溢出每个类型都有大小的
第三章输入输出与顺序程序设计(~5%)
1. printf 函数
1)格式:printf(“格式控制串”,参数 1,数 2,...);
2)格式控制串中除格式控制字符外,其余内容会原样输出。
3)常见格式控制字符:
%d:将参数按整数形式转换输出,对应参数应是 int类型
%c :输出一个字符,对应参数应该是一个字符如:a=’A’;printf("%c,%d\n",a,a);输出:A,65
%s:输出一个字符串,对应参数应该是一个字符串
%f :将参数按带小数点数形式输出,对应参数应是 double类型,默认情况下精确到 6 位小数
%md:输出数据占 m 个位宽,数据长度将左补空格。如果实际数据长度超出 m,将原样输出
%m.nf:m 同上,n表示小数位数
H表示按照短整型输出
L表示按照长整型输出
-+左对齐与左对齐
-5d 21□□□
+5d □1234
2. scanf 函数
2)格式控制串中除格式控制字符外,其余内容要求原样输入。
3)常见格式控制字符:
%d:将参数按整数形式转换输出,对应参数应是 int类型
%o:将参数按 8 进制形式转换输出,对应参数应是 int 类型
%x:将参数按 16 进制形式转换输出,对应参数应是 int 类型
%c :输出一个字符,对应参数应该是一个字符
%s:输出一个字符串,对应参数应该是一个字符串
%f :将参数按带小数点数形式输出,对应参数应是 double类型,默认情况下精确到 6 位小数
4)数据输入结束:空格、回车、非法输入
5)字符输入:任何输入都是字符,包括空格、回车等。
3. putchar(),向终端输出一个字符,语法:putchar(ch);
4. getchar(),从终端输入一个字符,语法:ch=getchar();
注意:只能接收一个字符
第四章选择结构程序设计(~15%)
1. 程序的三种基本结构:顺序结构、分支结构、循环结构
2. 复合语句:用{}括起来的一个或多个C语句。
3. 熟悉if,if..else,多重 if..else,嵌套if..else,switch..case 的用法
1)C 语言以 0 表示假,非 0整数值表示真。
2)为避免嵌套的if-else 语句的二义性,C 语言规定else 总是与在其之前未配对的 近的 if组成配对关系。提倡使用大括号括起来以避免看起来有二义性
3)switch 括号中要求数据类型为:整型或字符表达式。case后要求为常量或常量表达式。
如果需要每个 case执行完后跳出,在每个 case 后不要忘记写 break;
Break与continue与goto语句与return
Break跳出循环 countinue跳出本次循环 ,goto跳出深层循环 goto al;
()al: ,return语句返回语句
Return返回函数
第五章循环控制(~15%)
1. 熟悉while,do...while,for ,continue,break的用法
2. while ( 循环条件 ) { 循环操作
}
特点:先判断,再执行
循环条件以 0 表示假,非 0整数值表示真
3. do {
循环操作
} while ( 循环条件 ); 特点:先执行,再判断
4. 初始情况不满足循环条件时while循环一次都不会执行,do-while循环不管任何情况都至少执行一次
5. for(参数初始化; 条件判断; 更新循环变量)
条件判断 |
参数初始化 |
更新循环变量 |
循环操作 |
真 |
假 |
{循环操作}
6. for语句的三个表达式都可以省略,但分号不能省。
1)表达式1省略,循环变量的初始值在for语句之前由赋值语句取得
2)表达式 2省略,编译正确,但是缺少循环条件,造成死循环
3)省略表达式 3,在循环体内应设法改变循环变量的值以结束循环
4)表达式全省略,无条件判断,循环变量无改变,应在循环体内设法结束循环,否则会造成死循环
7. break:改变程序控制流。用于do-while、while、for中时,可跳出循环而执行循环后面的语句。break语句可以用于switch和循环语句体中
8. continue :只能用在循环里。作用:跳过循环体中剩余的语句而执行下一次循环
9. 注意:
1)在循环中,需要修改循环变量的值以改变循环条件,否则有可能形成死循环
2)循环嵌套必须将内层循环完整的包含在外层循环中
第六章数组(~15%)
1. 数组是可以在内存中连续存储多个元素的结构
2. 数组的大小是固定的,所有数组元素的类型必须相同
3. 数组的定义
1)一维数组:数据类型数组名[常量表达式:数组大小];
2)一维数组的初始化:
int arr[10]= {10,9,8,7,6,5,4,3,2,1};
int arr[10] = {10,9,8,7,6,5,4,3,2,1,0}; //错误!越界了
int arr[10] = {9,8,7,5}; //正确,后面的 6个元素未初始化,默认为 0
int arr[] = {9,8,7}; //正确:元素个数为 3
int arr[]={}; //错误,到底是几个元素?
3)二维数组:数据类型数组名[常量表达式:行大小][常量表达式:列大小];
4)二维数组的初始化:
int arr[2][3] = { {1,2,3}, {4,5,6} };//2 行 3 列数组
int arr[ ][3] = { {1,2,3}, {4,5,6} };//2 行 3 列数组
int arr[2][ ] = { {1,2,3}, {4,5,6} }; //错误,不能省略第二维长度
int arr[2][3]= {1,2,3,4,5,6}; //正确:先为第 1行赋值,再为第 2 行赋值
int arr[ ][3]= {1,2,3,4,5}; //正确:先为第 1 行赋值,再为第 2 行赋值,不够默认为 0
4. 数组的使用
1)索引从零开始数,数组画内存格子
2)一维数组:数组名[索引号],可以取出数组中一个元素;//索引号从 0 开始
3)二维数组:数组名[行索引号] [列索引号];可以取出数组中一个元素;//行、列索引号从0开始
5. 字符串
1)字符串常量是双引号括起的任意字符序列
2)在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串
3)字符数组和字符串的区别是:字符串的末尾有一个空字符 ‘\0’
4)使用 puts 函数输出字符串:puts(字符串名);
puts 函数完全可以由 printf 函数取代。当需要按一定格式输出时,通常使用 printf 函数。
5)使用 gets 函数字符串:gets(字符串名)
从键盘上读入一个完整的行,存入字符数组。并用空字符'\0'取代行尾的换行符
'\n'。
gets 允许输入空格,scanf 不允许输入空格(以空格做为输入结束标识)
6)字符串处理函数
strlen()、strcpy()、strcat()、strcmp() 和 strlen()
strlen()求字符串长度时就是字符串的长度
sizeof()还要加1因为有\0字符串最后
第七章 函数(~15%)
1.函数定义:
返回值类型函数名(参数数据类型参数名,参数数据类型参数名,...)
{}
1)C 语言中规定函数返回值的类型是由在定义该函数时所指定的函数类型所决定,即返回值类型决定函数的类型,如果没有返回值,需要使用void。如果没有指定返回值类型,系统将默认返值类型为 int。
2)参数可以没有,但()不可少,
3){}内为函数体,{}不可少
4)函数返回值:(return)
C 语言中的函数至多可以返回一个值,不能返回多个值;
返回值的数据类型必须与函数原型中返回值的数据类型匹配;
当遇到return 语句时,函数执行将终止。程序控制流将立即返回调用函数;
2. 函数原型:
形式:返回值类型 函数名(形式参数数据类型,新参,...);
1)函数原型说明在形式上与函数头部类似,后加一个分号。原型说明中参数表里的参数名可以不写(只写参数类型)。
2)如果在调用函数前没有出现函数的定义,必须先做函数申明,及先写出函数原型。
3)函数原型中没有函数体({}部分),分号不可少。
3. 函数调用:
1)函数调用时,主调函数中的参数称为实参,表示实际要传入的值。定义函数时定义的参数称为形参,表示实现由主调函数传入值。主调函数sum(12,3)
2)函数可以嵌套调用但不能嵌套定义函数,即在一个函数内部定义一个函数。 可以加指针函数,因为指针是数据类型
3)在一个函数体内调用自身称为函数的递归调用
4)递归的算法:先递推,在往回回
4. 函数传参:
1)函数默认传参方式为值传参,实参将值赋值给形参,实参和形参占用不同的内存空间,形参值的改变不会改变实参的值。
3)当形参定义为数组时(如:int a[]),实参应为数组名(如 a);
5. 变量的作用域
1)程序中变量有不同的使用范围,称为变量的作用域。变量的作用域决定变量的可访问性
2)在函数内或语句块中申明的变量为局部变量,作用域为函数内部或语句块内部
3)在函数外申明的变量为全局变量,作用域为定义开始部分到程序结束部分
6. 变量的生存期
1)变量的存储方式可分为“静态存储”和“动态存储”两种
2)静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。这种由于变量存储方式不同而产生的特性称为变量的生存期。生存期表示了变量存在的时间
3)auto:自动变量:局部变量在缺省存储类型的情况下归为自动变量。其生存期和作用域相同
4)static :静态变量:在程序执行时存在,并且只要整个程序在运行,就可以继续访问该变量。静态局部变量生存期为整个源程序
静态局部变量作用域与自动变量相同,即只能在定义该变量的函数内使用该变量
对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予 0 值
函数被调用时,其中的静态局部变量的值将保留前次被调用的结果
第八章指针、结构型与联合型(~15%)
1. 指针相关概念
3)由于指针值是数据,指针变量可以赋值,所以一个指针的指向在程序执行中可以改变。指针p 在执行中某时刻指向变量 x,在另一时刻也可以指向变量y
3)指针变量的命名规则和其他变量的命名规则一样
4)指针不能与现有变量同名
6)Void可以存放其他数据类型
7)数组指针,减法是中间数组的个数
2. 声明并初始化指针变量
1)指针变量类型 *指针变量名(如 int *p;)
3. 与指针相关的运算符
4. 指针运算
数组第 i+1个元素的值:*(a+i),*(p+i),a[i],p[i]
2)指针算术运算:++,--,-
使用递增/递减运算符(++ 和--)将指针递增或递减,每做一次++ 或--,指针将移动一个单位,一个类型为 T 的指针的移动,
将指针加上或者减去某个整数值:指针将移动n 个单位,
两个指针相减,将得到一个整数值,该值为两个指针相隔的单位。
如:inta[5]; int *p=a;int *q=&a[3];q-p 的值为 3。
3)指针关系运算
5. 指针变量作为函数参数
6. 多位指针,指向指针的指针,用法int (*p1[5])(int,int)函数指针数据
7. 指向字符串的指针
1)在 C 语言中,可以将字符指针指向字符串
2)被指向的字符串可以是一个常量字符串,也可以是一个存储着字符串的字符数组
如:char *ptr = "C Language";
如:char str[30];char *p;p=str;
8. typedef: typedef 类型名 标识符
1)typedef 只是将已存在的类型用一个新的名字来代表
2).用 typedef 可以为各种类型说明一个新名,但不能用来为变量说明一个新名
3).用 typedef 为类型说明一个新名,通常可以增加程序的可读性
9. 枚举:enum 枚举名{符号1,符号2...}
1)枚举类型为一组在逻辑上密不可分的整数提供便于记忆的符号
2)默认情况下,将 0 值赋给枚举的第一个元素,然后对每个后续的枚举元素按1 递增
10. 结构
1)“结构” 是一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。
2)定义结构:struct structurename
{ datatype variable1; datatype variable2;
...
};
结构定义并不预留内存
结构定义放置在程序的开始部分,位于头文件声明之后
结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。
3)声明结构变量struct 结构名 结构变量名;
先定义结构,再声明结构变量 struct student
{ int num; char name[20]; char sex; float score;
};
structstudent student1,student2
在定义结构类型的同时声明结构变量 struct student
{ int num; char name[20]; char sex; float score;
}student1,student2;
声明一个类型为 student 结构的变量,将会为该变量分配内存,大小是大于或等于其所有成员变量的大小之和。 4)表示结构变量成员的一般形式是:结构变量名.成员名
如:student1.num、student2.sex、student1.birthday.month5)结构变量初始化:struct student student3={3,"YaoMing ",'M',90.5};
赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。
6)元素为结构类型的数组称为结构数组。
structstudent
{
int num; char* name; char sex; float score;
}stu[30];
访问数组元素的成员:stu[i].num,stu[i]. name
7)结构指针变量
一个指针当用来指向一个结构时,称之为结构指针变量。
结构指针变量声明的一般形式为:struct 结构名 *结构指针变量名
通过结构指针可以访问该结构变量的成员,一般形式为:
(*结构指针变量).成员名 或者 结构指针变量->成员名如:structstu *pstu; (*pstu).num 或者:pstu->num
8)结构作为函数参数
将整个结构作为参数值传递给函数。值传递,形参将产生一个和实参的结构变量值一样的副本
第九章文件
文件分类:文本文件与二进制文件
文件缓存区
文件指针FILE*fp
打开文件:文件指针名=fopen(“文件名”,”文件使用方式”)
R只读
W只写 没有的话在建立一个 覆盖原来的
A追加 在文件末尾写入数据
B二进制文件
T文本文件
+读和写
注意上面应该都是小写word问题
Fread()读 fwrite()写入一个文件
第九章预处理命令(~5%)
1. 宏定义
1)#define标识符字符串:在编译时,将用字符串替换程序中出现的所有标识符如:#definePi 3.1415926
2. ”文件包含“处理
1)#include”文件名”:“”系统将先在用户当前目录从查找文件,找不到将在系统目录中查找
2)#include<文件名>:<>系统只在系统目录中查找文件
3)#endif #if