第一章 编程的基本概念
程序:为了让计算机执行某些操作或解决某个问题编写的一系列有序指令的集合。
C语言源程序的结构特点:
1. 可以由一个或多个源文件组成。
2. 每个源文件可由一个或多个函数组成。
3. 一个源程序不论由多少个文件组成,有且只有一个main函数,即主函数。
4. 源程序中可有预处理命令(include命令仅为其中一种),预处理命令通常应放在源文件或源程序的的最前面。
5. 每一个说明,每一个语句都必须以分号结尾,但预处理命令,函数头和花括号“{”后不能加分号。
6. 关键字之间至少加一个空格以示间隔。
C语言程序:
以·h为后缀文件成文头文件。
main():主函数的入口,一个函数只能有一个main函数。
void:表示没有任何返回值。
执行程序用ctrl+F5。
流程图采用的符号:
起止用圆角矩形,输入输出用平行四边形,判断用菱形,处理用长方形,连接点用圆。
第二章 常量、变量和数据类型
常量:值不能改变的量。程序中可用#define命令定义常量。
变量:具有名称的一块内存空间,用来储存可变的数据。
变量命名规则:
1. 变量名只能由字符、数字和下划线组成。
2. 变量名不能以数字开头。
3. C语言保留字不可用作变量名。
C语言分为三大类:整型,浮点型,字符型。
数据在内存中是以二进制形式存放的。
整型变量的分类:
1. 基本整型 int
2. 短整型 short int或short
3. 长整型 long int 或 long
浮点型的分类:
1. 单精度浮点数。float
2. 双精度浮点数。double
字符型的分类:
1. 字符常量
(1)。字符常量只能用单引号括起来。
(2)。字符常量只能是单个字符。
2.字符变量:用来储存字符常量,类型说明符是char
字符型与整数型可以互相转换,与小数型不可以转换。
fflush(stdin)输入字符时要清空缓存
占位符的分类:
%d整数占位符,%c单个字符占位符,%f小数占位符,%s字符串占位符
\n换行符,\t水平制表符
第三章 运算符与表达式
算术运算符:%表示两个整数相除的余数,如果是两个小数相除后的余数就调用fmod函数,形式是fmod(第一个小数,第二个小数),但是必须用头文件<math.h>
关系运算符:比较两个数的大小关系,!=表示不等于,==表示等于,非0代表真,0代表假
逻辑运算符:&&表示并且,||表示或者,!表示非
赋值运算符:=表示赋值,其作用是将赋值运算符的右侧表达式的值赋给其左侧的变量,赋值运算对象中的左侧对象一定是变量,赋值号“=”的运算方向自右向左,即先算右边表达式的值,然后再将其值赋给左边的变量,a+=b表示a=a+b
自增/自减运算符:单独存在时,a++与++a是相同的,但是参与运算时就有很大的区别。
比如:b=a++中的a是先自增再参与运算,b=++a中的a是先参与运算
再自增
eg: int a=5
printf(“%d”,a++);输出结果是:5
printf(“%d”,a);输出结果是:6
条件运算符:形式为exp1?exp2:exp3,表示如果exp1为真,则运算exp2,整个条件表达式的值为exp2的值;反之,则运算exp3,整个条件表达式的值为exp3的值。
逗号运算符:将两个表达式连接起来。
运算符强制性转换用(),例如:int i=(int)1.1+(int)2.2,但是强制性转换会丢失精度,1.1和2.2就变成了1和2。
第四章 输入输出语句
printf()函数是格式化输出函数,形式:printf(“占位符”,参量表);
scanf()函数是格式化输入函数,形式:scanf(“占位符”,地址表);
使用scanf()函数必须的注意点:
1. scanf()函数中没有精度控制。如:scanf(“%5.2f”,&a);是非法的。
2. scanf()中要求给出变量地址,如果给出变量则会出错。
getchar()函数是标准输入设备上读入一个字符,形式:变量
名=getchar();
putchar()函数是标准输出设备上输出一个字符,形式:putchar(变量名);
使用getchar()函数必须的注意点:
1. getchar()函数只能接收单个字符,输入数字时也按字符处理。
2. 使用本函数必须包含头文件“stdio.h”
第五章 条件语句1
if语句用于两者选一的情况,而switch用于多者选一的情形。
if语句的表达式: if-else-if语句多重表达式:
if(表达式) if(表达式1)
{ {
语句部分; 语句1;
} }
当if的判断条件成立时,就执行if块 else if(表达式2)
中的语句,如果不成立,自会执行else {
块中的语句。 语句2;
}………
第六章 条件语句2
switch(表达式)
{
case 常量表达式1:语句1;break; 如果表达式的值与case中
case 常量表达式2:语句2;break;的那个表达式值匹配,就
…… 执行那个语句,如果都
case 常量表达式n:语句n;break; 不匹配,则执行 defalut后的语句。
default:语句n+1;break;
} break是跳出switch语句。
1. switch后面的括号内的表达式必须是整型、字符型或者枚举类型。
2. 每一个case的常量表达式的值必须互不相同,否则会出现矛盾现象。
第七章 循环语句1
while循环的形式: while循环的特点:
while(条件表达式) 先判断,后执行,若条件不成立,
{ 有可能一次也不执行。
语句块或循环体;
}
do-while循环的形式: do-while循环的特点:
do 先执行循环体中的语句,然后再判
{ 判断循环条件是否为真,如果为真,
语句块或循环体; 则继续循环,如果为假,则终止循
}while(条件表达式); 环,循环至少执行一次。
break语句:
再多层循环中,一个break语句只能跳出一层。
break:跳出当前循环,执行循环外面的其它语句。
continue:结束本次循环进入下一次循环,并不跳出循环。
return:结束全部程序,后面的程序都不会执行。
第八章 循环语句2
for循环的一般形式:
for(表达式1:表达式2;表达式3)
{
语句块或循环体;
}
表达式1:初始化循环表量,仅仅在循环开始时执行一次。
表达式2:判断循环条件是否成立。
表达式3:更新循环变量。
使用for时的注意点:
1.表达式1可以省略,但要在for语句之前给变量赋初值,省略表达
式1时,其后的分号不能省略。
2.如果表达式2省略,循环将成为死循环。
3.表达式3可以省略,但要在循环中为循环变量更新。
第九章 一维数组
数组:数组是一组有序的、类型相同的数据的集合。
数组元素中的下标是从0开始的。
1.数组中的元素的类型必须相同。
2.数组的长度一旦指定,就不能改变。
3.数组中的值通过数组名和下标组合起来进行访问。
一维数组的定义方式:
类型说明符 数组名[常量表达式];
方括号中的常量表达式表示数组元素的个数,也称为数组的长度。
数组名不能与其它变量名相同。
不能在方括号中用变量来表示元素的个数。
在C语言中只能逐个地使用数组元素,而不能一次应用整个数组。
数组名始终代表数组的首地址,是一个常量。
第十章 二维数组与冒泡排序
二维数组定义的一般形式:
类型说明符 数组名[常量表达式1][常量表达式2];
引用二维数组:
数组名[下标][下标];第一个下标代表行,第二个下标代表列。
冒泡排序原理:
根据轻气泡不能再重气泡之下的原则,从上往下扫描数组,凡扫描到违反本原则的轻气泡,就使其向上漂浮。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
冒泡排序法口诀:
N个数字来排队,两两相比小靠前,外层循环N-1,内层循环N-1-i.
第十一章 指针
指针是一个特殊的数据类型,指针变量储存的是内存的一个地址,因此指针变量也称地址变量。
指针的特点:
1.指针是有类型的,有什么样的数据类型就有什么样的指针。
2.什么样类型的指针只能指向什么类型的变量。
3.指针加1的含义:使指针指向下一个元素。
指针定义的一般形式:
类型说明符 *变量名;
1.类型说明符表示本指针变量所指向的变量的数据类型。
2.“*”符号表明这定义的是一个指针变量。
3.变量名即为定义的指针变量。
指针变量使用之前不仅要定义说明,而且必须赋予具体的值。
指针变量的赋值只能赋予地址,决不能赋予任何其它数据。
不允许把一个数赋给指针变量。
指针与数组的关系:用指针储存数组的首地址,就说指针指向了首地址。
若parr指向了一个一维数组arr[n]:
1.parr+n与arr+n表示的数组元素arr[n]的地址,即&arr[n].
2.*(parr+n)和*(arr+n)表示数组的各元素,相当于arr[n]。
3.指向数组的指针变量也可用作数组的下标形式表示为parr[n],相当于*(parr+n).
动态内存的分配:
好处:不需要预先分配存储空间,分配的空间可以根据程序的需要扩
或缩小。
动态内存的分配需要用到函数malloc,这个函数存在于头文件stdlib.h中。
Eg: array=(int *)malloc(num*sizeof(int));
1.分配num个整型的连续存储空间,并返回一个指向其起始地
址的整型指针。
2.把此整型指针地址赋给array。
第十二章 函数1
函数的定义:函数是一个独立的子程序,由相关代码组成,能完成一
定的功能,能重复多次使用。
有返回值函数:被调用执行完后将向调用者返回一个执行结果,称为
函数返回值。
无返回值函数:用于完成某项特定的处理任务,执行完成后不向调用
者返回函数值,此类函数指定为:void。
无参函数:主调函数和被调函数间不进行参数传递,可返回或不返回
函数值。
有参函数:进行函数调用时,主调函数把实参传给形参,供被调函数
使用。
函数调用的一般形式:函数名(参数值1,参数值2····参数值n);
接收返回值的函数调用形式:变量名=函数名(参数值1,··参数值n);
嵌套调用:从一个函数中调用另一个函数。
递归调用:在一个函数体内调用自身。
形参:定义函数时函数的参数,在整个函数体内都可以使用,离开函
数则不能使用。
实参:调用函数时,传递给函数的参数,实参出现在主调函数中,进
入被调函数,实参变量也不能使用,必须具有确定的值。
实参和形参在数量上、类型上、顺序上应严格一致。
return语句的功能:
1.计算表达式的值,并返回给主调函数。
2.跳出函数,在函数中尽管允许有多个return语句,但每次调用只会
有一个return语句被执行,因此只能返回一个函数值。
按值传递:被调函数对形参的任何操作都是作为局部变量进行,不会
影响主调函数的实参变量的值。
按地址传递:被调函数对形参的任何操作都会影响主调函数中的实参
变量。
第十三章 函数2
数组用作函数参数:
1. 把数组元素(下标变量)作为实参使用。(按值传递)
2. 把数组名作为函数的形参和实参使用。(按地址传递)
向函数传递一个数组要传递数组的首地址和数组的长度。
数组名作为 函数参数应注意的问题:
1.形参数组和实参数组的类型必须匹配,否则将引起错误。
2.数组名作为函数参数时,传递的是数组的首地址。
3.形参数组和实参数组的长度应该相同。
形参和实参对应的关系:
1.形参和实参都用数组名。
2.实参用数组名时,形参可以用指针变量。
3实参和形参都用指针变量。
4.实参用指针变量时,形参可以用数组名。
局部变量:不能再函数之外使用,每次函数调用时分配储存空间,每次函数返回时释放储存空间。
全局变量:可以在整个程序中使用,整个程序开始之前分配空间,在
程序结束时释放储存空间。
静态储存方式:在程序运行期间分配固定的存储空间。
动态储存方式:在程序运行期间根据需要进行动态的分配存储空间。
auto(自动)变量:
只能用于定义局部变量,存储在内存中的动态存储区。
auto <数据类型><变量名表>;
static(静态)变量:
static可定义全局变量和局部变量。
static<数据类型><变量名表>;
(1)静态局部变量是在编译时赋初值的,以后每次调用函数时不再重新赋初值而只引用上次函数调用结束时的值。
(2)静态局部变量没有赋初值,编译时自动赋0或空字符。
第十四章 字符串
字符串的定义方式:
char 字符数组名[长度];
字符串的特点:
(1)字符串在内存中以字符数组形式进行储存
(2)字符串必须以’\0’结尾
Eg:char ch1[]=”hello”等价于
char ch2[]={‘H’,’e’,’l’,’l’,’o’,’\0’};
‘\0’不占实际长度,但要占内存空间
【注意】:
字符串常量只能在定义字符数组时赋初值给字符数组,而不能在执行语句中将字符串常量直接赋给字符数组。
gets函数专门用于输入字符串
gets(字符数组名);
puts函数专门用于输出字符串
puts(字符串);
当多种类型的混合输入输出时,选用scanf和printf;当大量文字信息输入输出时,选用gets和puts
strlen函数用于计算字符串的长度;strlen(字符串);
strcpy函数用于实现两个字符串的拷贝;strcpy(字符串1,字符串2);
字符串1必须是字符串变量,而不能是字符串常量
strcat函数用于将两个字符串连接起来;strcat(字符数组1,字符串2); 将字符串2连接到字符数组1的字符串后面。
strcmp函数用于两个字符串的比较;strcmp(字符串1,字符串2);
如果字符串1和字符串2相等,函数返回0,如果字符串1大于字符串2,函数返回一个正整数,如果字符串1小于字符串2,函数返回一个负整数。
第十五章 结构
结构是一种构造类型,它是有若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。
在说明和使用之前必须先定义,也就是构造 。
先定义结构,再声明结构变量 在定义结构类型的同时声明
struct 结构体类型名 结构变量
{ struct 结构体类型名
成员列表 {
};特别注意:分号不能少 成员列表
struct 结构体类型名 变量名表; }变量名表;
一个指针变量当用来指向一个结构变量时,称之为结构指针变量。
结构指针变量中的值是所指向的结构变量的首地址。
结构名 *指针变量名;eg(*p).age
指针变量—>成员名;eg p—>age
三种访问结构成员的方法:
1.结构变量.成员名;
2.(*结构指针变量).成员名;
3.结构指针变量—>成员名;
结构数组的每一个元素都是具有相同结构类型的结构变量。
第十六章 文件
文件是存储在外部磁盘设备上数据的集合,操作系统是以文件为单位对数据进行管理。
fprintf返回的是实际的字节数。
fread 返回的是数组的实际长度
文件的作用:用来永久保存数据。
读取文件时,文件必须存在。
文件操作完后要关闭文件。
二进制文件是按二进制的编码方式来存放文件的。
文件的的基本操作:
1.创建文件指针变量 FILE *fp;
2.打开文件 fp=fopen();
3.读写文件(读文件 fscanf(),fread()) 写文件(fprintf(),fwrite()).
4.关闭文件 fclose(fp).
rt 对文本文件进行读取 wt 对文本文件进行写入
at 向文本文件进行追加数据 ab 向二进制文件进行追加数据
rb 向二进制文件进行读取 wb 创建二进制文件进行写入
feof():判断文件是否达到结束,到文件末尾返回非0。Eg:feof(fp);
rewind:使文件的位置指针重新返回文件的开头。Eg:rewind(fp);
remove():删除一个文件。Eg:remove(“C:\\sec.txt”).
文件指针:指向文件在内存中的用来存储文件状态和信息的FILE结构体变量。
文件的开始标志:BOF 文件结束标志:EOF