c语言章节总结
第1章.程序设计和C语言
1.机器语言:计算机工作基于二进制,只能识别和接受由0和1组成的指令。
2.c程序的格式
#include<stdio.h>
int main()
{
printf("");
return 0;
}
3.注释格式
//为单行注释,如果注释内容一行写不下,可以在下一行重新使用‘//’继续写注释。
/ ……/ 为段落注释,在开头使用/,在末尾使用*/即可整个内容进行注释。(即多行注释)
4.变量类型
整型变量(int) 对应使用%d
浮点型变量(float) 对应使用%f 小数点后跟4位
双精度变量(double) 对应使用%lf 小数点后跟8位
5.C语言的结构
预处理指令 #include<stdio.h>
全局声明:在函数外声明的变量为全局变量,如果在程序开头声明的变量,在整个程序中有效;在函数中声明的变量是局部变量,只在函数范围有效。
程序总是由main函数开始执行。
在每个数据声明和语句的最后必须有一个分号。a=b+c;
6.运行c程序的步骤:先生成源程序文件f.c,再通过编译将源程序转换为二进制形式的目标程序f.obj,最后将所有编译后的目标程序连接配起来,形成可执行程序f.exe。
第2章.算法
1.算法+数据结构=程序。
2.三种基本结构
顺序结构 选择结构 循环结构
第3章.最简单的c程序设计–顺序程序设计
1.常量:
整型常量:如1000,1111,-1
实型变量:由数字和小数点组成 如12.11,0.241,-55.1
字符常量:用单撇号括起来的一个字符,如’A’,‘b’;转义字符’\n’为换行,’\t’为将输出的位置跳到下一个tab位置
字符串常量:用双撇号把若干字符括起来,如"AAS",“boy”(注意不能用单撇号)
2.变量:如 int a; 则a为变量,在运行是其值可发生改变。
常变量:如const int a=3;a在变量存在期间其值不能发生改变
3.标识符:用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列,简单说就是一个对象的名字,如p1,c,PI,printf.
C语言规定标识符只能由字母、数字和下划线组成,且第1个字符必须为字母或下划线。
4.数据类型
5.字节数
int 4 short 2 long 4 float 4 double 8
6.字符变量:字符变量是用类型符插入定义字符变量 ,如char c=‘a’;
7.ASCII:ASCII表
8.运算符
% 取余 a%b a除以b的余数
++i,–i (在使用i之前,先使i的值加(减)1)
i++,i–(在使用i之后,使i的值加(减)1)
自增自减只能用于变量,不能用于常量,如5++是错误的。
以下是运算的优先级表 :
9.强制类型转换运算符
(double)a (将a转换成double类型)
(int)(x+y) (将x+y的值转换为int型)
10.(?:)条件运算符 例如1>5?1:2=2; 如果前面条件正确,结果为:前面那个数,反之;
(,)逗号运算符 例如a=(2,3);则a为3;
(!&&||)逻辑运算符 非 且 或
11.复合的赋值运算符
a+=3等价于a=a+3;
x=y+8等价于x=x(y+8);
其他运算符也是如此
12.赋值语句 int a=3;
13.数据的输入 scanf("%d",&a);&a是指变量a在内存中的地址;*变量前面一定要有地址符!
数据的输出 printf("%d",a);
putchar(输出字符) getchar(输入字符) printf(格式输出) puts(输出字符串) gets(输入字符串)
putchar(a); a=getchar();
14.长度限制 %m.nf m为数据宽度,n为小数位数
第4章.选择结构设计
1.结构
if(表达式)语句1
[else 语句2]
2.
if(表达式1)语句1
else if(表达式2)语句2 表达式== 必须为双=
else if(表达式3)语句3
…… ……
else if(表达式m)语句m
else 语句m+1
符合哪个表达式就执行哪个语句
3.关系运算符:
*关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符
4.关系表达式
a>b (a=3)>(b=5) 如果表达式为真,则值为1,否则为0;
算的时候要注意优先级 其结合方向
5.逻辑运算符 真为1,假为0
&&与 a&&b 如果ab都为真,则为真,否则为假
|| 或 a||b 如果ab有一个以上为真时结果为真,二者 都为假时结果为假
!非 !a 如果a为假,则!a为真;反之
优先次序:!->||->|| 即!为最高
6.选择结构的嵌套
if()
{
if() 语句1
}
else 语句2
7.switch选择
switch(表达式)
{
case 常量1:语句1
case 常量2:语句2
……
case 常量m:语句m
default:语句n+1
}
常量写的顺序没有规定,可以随意写
第5章.循环结构
1.while(表达式)
{
语句;
}
只要循环条件表达式为真,就执行循环体语句。
先判断,后执行
2.do
{
语句;
}while(表达式);
先执行,后判断
3.for语句循环
for(表达式1;表达式2;表达式3)
for(循环变量赋值;循环条件;循环变量增值)
语句
例如 for(i=1;i<=11;i++)
{
j=1+i;
}
4.循环的嵌套
3种循环可以解决同一个问题,凡是能用while循环解决的,用for循环都能解决。
break 是终止循环的标志,作用是使流程跳到循环体之外,接着执行循环体下面的语句。
continue是跳出本次循环的标志,作用是结束本次循环,转到循环体结束点之前。(不是终止整个循环)
第6章.利用数组处理批量数据
1.一维数组
结构:类型符 数组名[常量表达式] 如:int a[10];表示a数组有10个元素,这10个元素分别是a[0]、a[1]……a[9].每个元素都是一个整数值 切记常量表达式不能是变量如a[n]是错误的
用for循环可以将数组赋值 for(i=0;i<10;i++) a[i]=i;
也可以这样:a[10]={0,1,2,3,4,5,6,7,8,9}; 记住里面的元素个数不能超过数组名后面的数,如果个数少,系统自动默认为0; 如果元素的个数不确定,可以写成a[]={0,1,2,3};
2.二维数组
结构:类型说明符 数组名[常量表达式][常量表达式];如:int a[3][4];表示a为3*4(3行4列)的数组;其实二维数组就是特殊的一维数组,可以把a看作是一个一维数组,它有3个元素a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组a[0][0],a[0][1],a[0][2],a[0][3]……也可以把a[0]、a[1]、a[2]看作是一维数组的名字。
赋值:用两个for循环 for(i=0;i<3;i++) for(j=0;j<4;j++){scanf(%d,a[i][j])};
也可以这样:a[3][4]={{1},{2,3},{4,5,6}};少的元素默认为0;
3.字符数组
结构:char 数组名[常量表达式] 如char a[2]={‘a’,‘A’};应在字符两边加上单撇号,对应输出是%c 如printf("%c",a[1]);
char 数组名[常量表达式][常量表达式];如char a[2][3];(与二维数组一样)
遇到’\0’表示字符串结束,把它前面的字符组成一个字符串。如果常量表达式未知,则字符串长度还需加上’\0’。
字符串的输出printf("%s",a);
4.使用字符串处理函数
puts 输出数组 char a[]={“i am a”}; puts(a);
gets 输入数组 gets(a);
*puts和gets函数只能输出或输入一个字符串
strcat(a,b) 字符串连接函数 把b放在a后面
strlen(a) 表示a的实际长度(不包括’\0’)
strcpy(a,b) 把b复制到a
strcmp(a,b) 比较字符串a和b,如果全部字符相同,则两个字符串相等,结果为0;如果字符串a>字符串b,则结果为1;如果字符串a<字符串b,则结果为- 1;(在英文字典中位置在后的为‘大’)
第7章.用函数实现模块化程序设计
1.函数分为有参函数和无参函数 ,有参函数在被调用时会得到一个函数值。
无参函数:类型名 函数名() { 函数体 };
有参函数:类型名 函数名(形式参数表列){ 函数体 };
2.在设计一个较大程序时,往往把它分为若干程序模块,每个模块包含一个或多个函数,每个函数实现一个特定的功能。有主函数调用其他函数,其他函数也可以相互调用。同一个函数可以被一个或多个函数调用任意多次。
3. 在定义函数时函数名后面括号中的变量名称为"形式参数"(简称形参)。
在主调函数中调用一个函数时,函数名后面一个括号中的参数称为"实际参数"(简称实参)。实际参数可以是常量、变量、表达式。
*在调用函数过程中,系统会把时参的值传递给被调用的形参。或者说,形参从实参得到一个值。
4.函数的返回值是通过函数中的return语句获得的。
在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。
对于不带返回值的函数,应当用定义函数为void类型,此时在函数体中不得出现return语句。
4. 函数原型:函数类型 函数名(参数类型1 参数名1,参数类型 2 参数名2,……,参数类型n 参数名n);
函数类型 函数名(参数类型1,参数类型2,……,参数类型n);
5. 直接或间接地调用该函数本身,称为函数的递归调用。
如 int f(int x){ int x,y; z=f(y);return(z); }
6.数组元素可以作为函数实参,不能用作形参。因为形参是在函数被调用时临时分配存储单元,不可能为一个数组元素单独分配存储单元。在用数组元素作为函数实参时,把实参的值传给形参,是“值传递”方式。数据传递的方向是从实参传到形参,单向传递。
7.也可以用数组名作函数参数,但用数组元素作实参时,向形参变量传递的是数组元素的值,而用数组名作为函数实参时,向形参传递的是数组首元素的地址。
8.函数中的形参和在函数中定义的局部变量都是动态地分配存储空间,在调用该函数时,系统会给这些变量分配存储空间,在函数调用结束时就自动释放这些空间。
静态局部变量:含有关键词static时,函数的局部变量的值在函数调用结束后不消失而继续保留原值。
第8章.善于利用指针
1.指针:一个变量的地址就是该变量的指针。指针变量:用来存放另一变量的地址。
指针是一个地址,而指针变量是存放地址的变量。
2.不要把整个数值赋给指针变量。如p=100; 错误
给指针变量赋值 p=&a;把a的地址赋给指针变量p;
& 取地址运算符 &a是变量a的地址。
- 指针运算符,p代表指针变量p指向的对象。
3.函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用将一个变量的地址传送到另一个函数中。
4.数组元素的指针:其实相当于数组元素的地址。
引用数组元素可以用下标法a[0],也可用指针法 (a+0)。
p=&a[0]; p的值是a[0]的地址。(数组名不代表整个数组,只代表数组首元素的地址)
定义:int p=a;将a数组首元素的地址赋给指针变量p,而不是赋给p。
5.当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求为指针变量。
实参数组名代表一个固定的地址,或者说是指针常量,但形参数组名并不是一个固定的地址,而是按指针变量处理。
如果用指针变量作实参,必须使指针变量有确定值,指向一个已定义的对象。
6.多维数组:
a[1][2] 相当于((a+1)+2)或(a[1]+2) 其实a[1]和*(a+1)是等价的。a[1]是一维数组名,它指向a[1][2];
7.一维数组名可以作为函数参数,多维数组名也可作函数参数。用指针变量作形参,已接受参数组名传递来的地址。可以有两种方法:用指针变量的指针变量、用指向一维数组的指针变量。如void add(int *p,int n); void ser(int (*p)[1],int n);
8.字符指针:char *string;string=“i am a”; 也可以为char *string=“i am a”; %s是输出字符串的格式 printf("%s",string);
*字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址,而不是将字符串放到字符指针变量中。
9.指向函数的指针变量
结构:类型名 (指针变量名)(函数参数列) 如int(p)(int,int);
由于优先级的关系,指针变量名要用圆括号括起来。
10.动态内存
申请内存要用到malloc 如:**(类型名)malloc(sizeof(类型名))**; p=(int)malloc(sizeof(int));
释放内存要用到free 如需要释放p,则为free(p);
第9章.用户自己建立数据类型
1.结构体
struct 结构体名 { 成员表列 };
如struct Date { int day;int year ;};
struct 结构体名 { 成员表列 }变量名表列;
如 struct Date{int day;int year;}date1; 切记末尾一定要加个分号。
引用结构体变量成员的值方式为:结构体变量名.成员名 date1.year=10;可以将date1.year作为一个整体看待,相当于一个变量;对结构体变量的成员可以像普通变量一样进行各种运算。
第10章.文件
1.文件包括文件路径、文件名主干、文件后缀3部分。
D:\CC\temp \ file .dat
文件缓冲区:系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区,从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。
2.用fopen函数打开数据文件
fopen(文件名,使用文件方式); 如FILE *fp;fp=fopen(“a1”,“r”);
以下为使用文件方式表:
3.用fclose函数关闭数据文件
fclose(文件指针); 如 fclose(fp);
前面曾把打开文件(用fopen函数)时函数返回的指针赋给了fp,现在把fp指向的文件关闭,此后fp不再指向该文件。
fclose函数也带回一个值,当成功地执行了关闭操作,则返回值为0;否则返回EOF(-1)。
4.向文件读写字符
fgetc(fp)从fp指向的文件读入一个字符 | 读成功,带回所读的字符,失败则返回文件结束标志EOF(-1) |
---|---|
fputc(ch,fp) 把字符ch写到文件指针变量fp所指向的文件中 | 输出成功,返回值就是输出的字符,输出失败则返回EOF(-1) |
5.用格式化的方式读写文件
fprintf(文件指针,格式字符串,输出表列);
fscanf(文件指针,格式字符串,输入表列);
如fprintf(fp,"%d",i);
6.用二进制方式读写一组数据
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer:是一个地址; size是要读写的字节数; count是要读写多少个数据项; fp是FILE类型指针;
如fread(f,4,10,fp);