C语言讲义.docx
《C语言讲义.docx》由会员分享,可在线阅读,更多相关《C语言讲义.docx(29页珍藏版)》请在冰豆网上搜索。
C语言讲义
第一章新手上路
第一课HelloWorld
简单的小程序
输出HelloWorld:
//头文件
#include
//主函数
main()
{
printf("helloworld\n");〃函数体
}
1.C语言属于编译型语言
2.—个程序必须有主函数,而且只能有一个
3.C语言源文件的扩展名是.c
4.C语言中语句结束的标志是分号
第二课格式化输出函数
格式化输出函数:
printf()
1.不属于c语言基本语法
2.C语言并非必须包含头文件
3.printf()函数是在头文件<stdio.h>中定义的
4.用什么库函数,包含什么头文件
程序执行
1编译:
.c->.obj(二进制文件)
2.组建:
.obj->.eGe可执行文件)
3.运行:
在程序结束后不会关闭窗口
调用dos系统命令:
sPstem()
使用sPstem(函数要引入头文件
转义符
1.\n:
换行
:
反斜杠\
3.\':
单引号'
4.\":
双引号"
5.\t:
缩进
第三课变量
定义变量
1.定义变量:
a.定义一个整数型变量
int变量名
b.定义多个整数型变量
int变量名1,变量名2,...
输出变量
printf("%d",变量名);其中%d是格式控制符
printf输出的是双引号中的内容
输入变量
a.scanf("%d",&变量名);变量名前要加&
b.scanf("%d%d",&变量名1,&变量名2);
其中,%d%d之间没有空格,输入顺序与变量顺序一致间隔符:
回车、空格、制表符
第四课变量的赋值
变量的赋值
1.%%相当于百分号字符%
2.顺序结构:
从上往下依次执行
3.变量:
变量值可在程序中变化
4.
inta=5;a=a+1;
变量初始化:
将定义域赋值合并在一起,比如
5.赋值:
将等号右边的值赋值给左边,比如:
运算符
1.算术运算符:
+、-、G、/、%
2.赋值运算符:
=
3.复合运算符:
+=、-=、G=、/=、%=
4.自增自减运算符:
++、--
第五课变量的交换
借助第三方变量交换的实例
#includemain()
{I
inta,b,temp;
printf("请输入两个整数:
");
scanf("%d%d",&a,&b);
printf("a=%d,b=%d\n",a,b);
temp=a;
a=b;
b=temp;
printf("a=%d,b=%d\n",a,b);
}
不借助第三方变量交换的实例
#includemain()
{
inta,b;
printf("请输入两个整数:
");seanf("%d%d",&a,&b);
printf("a=%d,b=%d\n",a,b);a=a+b;
b=a_b;
a=a-b;
printf("a=%d,b=%d\n",a,b);
}
第六课变量修饰符
变量修饰符知识点
1.sizeof()计算变量在内存中所占大小
2.字符变量只占1字节
3.bit:
最小存储单位,只能存储0或1
4.int:
整型,占4字节,取值范围:
-2A31~2A31-1,格式控制符:
%d
5.short:
短整型,占2个字节,格式控制符:
%hd
6.long:
长整型,占4个字节,格式控制符:
%ld
7.signed:
有符号
8.unsigned:
无符号,格式控制符:
%u
第七课浮点类型
普通浮点类型
a.定义:
floata;
b.赋值:
floata=3.5f;
双精度浮点类型
a.定义:
doublea;
b.赋值:
doublea=3.5;
变量、常量都占内存空间
浮点型的常量:
doublea=.3相当于doublea=0.3
格式控制符
a.float控制符:
%e:
科学计数法形式,最常考,实数E整数(整数、0、负数)%f:
保留6位小数,不足部分以0补位
%g:
原样输出,最常用
b.double控制符:
%le%lf、%lg
汪意:
1.浮点数和整数运算,结果为浮点数
2.整数和整数运算,结果为整数
3.实数不可以参与余数运算
第八课格式化输入输出
C语言中三种进制
1•八进制
a.逢8进一
b.表示八进制:
0、1、2、3、4、5、6、7
c.格式控制符:
%o
d.赋值:
以0作为开头,例如:
inta=010;
2.十进制匚
a.逢10进一
b.表示十进制:
0、1、2、3、4、5、6、7、8、9
c.格式控制符:
%d
3.十六进制
a.逢16进一
b.表示十六进制:
0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F
c.格式控制符:
%G
d.赋值:
以0G作为开头,例如:
inta=0G10
格式控制符
1.%md:
空格补位,一共占m位若m<变量长度,不加空格,正常输出
2.%m.nf:
—共占m位,小数点占n位
第二章选择结构
第一课if语句
if语句的一般格式:
if(逻辑条件)
{
满足条件时,执行的语句
}
else
{
不满足条件时,执行的语句
}
省略形式:
if(逻辑条件){执行语句}
第二课关系运算符
6中关系运算符
1.>:
大于
2.<:
小于
3.==:
等于
4.>=:
大于等于
5.<=:
小于等于
6.!
=:
不等于
关系表达式:
计算结果为真或假
C语言中,0表示假,非0表示真
判断奇偶
偶数:
能被2整除
奇数:
不能被2整数
第三课语句的概念
表达式语句
表达式;
函数调用语句
函数名(参数);
复合语句
{
语句1;
语句2;
语句3;
}
控制语句
.if语句
通用写法:
if(逻辑条件)
语句1
else
语句2
其中,语句可以为表达式语句、函数调用语句、复合语句、控制语句和空语句
.switch语句
.for语句
.while语句
.do语句
.break语句
.continue语句.return语句.goto语句
5.空语句不执行任何内容
第四课逻辑运算符
逻辑非⑴
!
真假
!
假真
逻辑与(&&)
真&&真真真&&假假假&&真假假&&假假
逻辑或(||)
直||直直真II假真假II真真假II假假
第五课嵌套的if语句
嵌套的if语句格式
if(逻辑表达式1)
语句1
elseif(逻辑表达式2)
语句2
elseif(逻辑表达式3)
语句3
else
语句n
else匹配:
遵循就近原则else与离自己最近的未匹配if匹配
第六课switch语句
switch语句一般格式
switch(表达式)
{
case情况1:
语句1
break;
case情况2:
语句2
break;
case情况n:
语句n
break;
default:
默认语句
break;
}
其中,break是跳出switch语句,default不一定放在最后
注意:
switch不能检查实数,case后面也不能判断实数
第七课条件运算符
格式
表达式1?
表达式2:
表达式3
用法1
if(表达式1)
表达式2;
else
{
表达式3;
}
用法2
if(表达式1)
{
表达式=表达式2;
}
else
{
表达式=表达式3;
}
嵌套格式
表达式1?
表达式2:
(表达式3?
表达式4:
表达式5)单目运算符:
只对一个表达式进行运算
双目运算符:
对两个表达式进行运算
三目运算符:
对三个表达式进行运算
第八课注释
按用途可分为
1•序言性注释
2.功能性注释
格式
/G注释内容G/
第九课a++和++a
自增
a++:
后缀表达式
++a:
前缀表达式
执行过程中:
a++=a,++a=a+1
第十课逻辑短路
逻辑短路
1•逻辑或:
只要前面逻辑表达式为真了,整个式子结果就为真,后面的就不需要执行了
2.逻辑与:
只要前面逻辑表达式为假了,整个式子结果就为假,后面的就不需要执行了
第三章循环结构
第一课for循环
for循环一般格式
for(初始化表达式;判定条件;自增表达式)
{I
循环体
}
第三课质数
质数(素数)
质数(素数):
只能分解成1和自己
判断质数的方法:
排除法
求平方根:
sqrt()
第四课while循环和do循环
while循环格式
while(判断条件)
{
循环体
}
do循环格式
do
循环体
}while(判定条件);
第五课break和continue
Break
break:
结束整个循环
Continue
continue:
结束本次循环,进入下次循环
控制语句
1•选择结构
a.if()else{}
b.switch(){}
2.循环结构
a.for(){}
b.while(){}
c.do{}while{}
3.流程控制
a.break;
b.continue;
c.goto;
第六课随机数
随机数知识点
1.生成随机数:
rand()
2.伪随机数:
数字虽然随机,但每次生成结果都相同
3.与时间有关的头文件:
time.h
4.控制随机数范围:
|
rand()%1O0任何整数%100,范围都是0-99
100+rand()%100范围是100-199
第七课水仙花数
判断规则
1.是一个三位数(100-999)
2.设百位a,十位b,个位c,则aA3+bA3+cA=abc
第四章函数
第一课函数
函数的一般格式
函数类型函数名(参数)
{
函数体
return函数返回值;
}
其中:
1.参数可以省略
2.return;返回函数调用位置
除void类型外,所有函数都应有返回值返回值类型:
应与函数类型一致
函数类型
intfloatdoublevoid(空类型)
函数的调用格式:
函数名();
函数声明:
类型函数名(参数);全局变量:
作用范围为整个源文件局部变量:
作用范围为函数f内部
第二课标识符
标识符包括
关键字和自定义标识符
自定义标识符三大规则
1•由字母、数字、下划线组成
2.只能以字母、下划线开头
3.不能与关键字重复
第三课形参和实参
本课知识点
形参:
函数定义时的参数实参:
函数调用时的参数
第十四课递归函数
递归函数
自己调用自己
经典递归
1•阶乘
终止条件:
n=1
递推公式:
f(n)=nGf(n-1)
2.斐波那契数列
终止条件:
n=1或n=2递推公式:
f(n)=f(n-1)+f(n-2)
第十七课主函数的几种形式
主函数的几种形式
1.intmain(void){
函数体
return。
;
}
2.intmain(intargc,charGargv[]){
函数体
return。
;
}
3.main()
函数体
}
return。
:
成功
returnl:
错误1
return2:
错误2eGit():
成功
eGit(0):
成功,直接结束程序
eGit
(1):
错误1
eGit
(2):
错误2
第十八课宏
宏有两种
1•不带参数的宏
#define宏的名称
2.带参数的宏
注意:
宏定义的后面是没有分号的
C语言中3种常量
1.普通常量
2.符号常量:
不带参数的宏
3.const常量:
使用方法类似变量
第五章数组
第一课数组的定义
本课知识点
1.数组定义
int数组名[数组大小];
inta[n],则最大的角标为n-1
2.可以根据初始化确定数组大小
3.初始化数量不能大于数组大小
4.使用宏来定义数组大小
#defineNIO
inta[N];
5.不可以使用变量定义数组
第二课数组和函数
本课知识点
1.数组可以作为函数的参数
2.函数中的数组参数可以省略大小voidf(intG[],intn)
{
函数体
}
第十一课质数
质数的两种算法
不用数组的质数算法:
1.若n不是质数,则必然存在一个不大于vn勺因数
2.只要找到一个因数,则n就必然不是质数,退出循环
用数组求质数的算法:
筛法
第十二课冒泡排序
排序原理
1.最大的元素放在右边
2.每次比上次至少循环一次
3.最坏次数:
(n-1)Gn/2
第十四课二分查找
查找算法
1•顺序查找
从前往后,按顺序依次查找
2.二分查找(折半查找)前提:
数组必须按序排好
中位数:
Mid=(Left+Right)\2,对于奇数、偶数都适应其中Left表示数组下界,Right表示数组上界
第二十课杨辉三角
本课知识点
1规则1:
最左列和斜边,均为1
2.规则2:
当前数字=上方数字+左上数字生成杨辉三角的步骤:
1.二维数组全部初始化为0
2.第一列全部初始化为1
3.从a(2,2)开始进行计算
4.从a(1,1)开始输出
第六章字符串
第一课字符类型
本课知识点
1•字符类型只接受单个字符的赋值
2.字符类型定义
chare;
c='w';
3.字符类型格式控制符:
%c
4.输入字符:
getchar()
输出字符:
putchar()
5.字符运算:
就是对它的ASCI码进行运算
第二课字符数组
常见转义符
1.'\n':
换行符
2.'\t':
缩进
3.'\'':
单引号
4.'\\':
反斜杠
5.'\"':
双引号
6.'\0':
字符串结尾
数字转义
八进制ASCI码
2.\G十六进制ASCI码
第三课字符串
本课知识点
1.以'\0'结尾的一串字符
2.其本质仍然是字符数组
3.字符串格式控制符:
%s
4输入字符串:
gets()
5.输出字符串:
puts(),结尾换行
6.库函数:
String.h
第十P五课字符串函数
本课知识点
1.strlen():
计算字符串长度,第一个’\0'前有几个字符sizeof():
计算数组占几字节
2.strcpP(目标数组,原字符串):
复制字符串
3.strcmp():
比较字符串大小
0:
两个字符串完全相等
1:
字符串1>字符串2
-1:
字符串1<字符串2
4.strcat():
连接字符串
第七章指针
第一课指针变量
本课知识点
1.定义:
使用G说明符进行定义intGp;intGp;
floatGp;floatGp
2.赋值:
指针变量,用于存储变量地址
只有指针变量指向一个变量时才可以为指针变量赋值
第二课指针和函数
指针和函数
1•按值传递:
实参的值不受形参影响
2.按地址传递:
实参的值可以受到形参影响
3.scanf():
变量以地址传递
4.函数地址:
每一个函数也都有内存地址
5.函数指针:
intGp();声明一个函数,返回值类型为intGint(Gp)();定义一个指针,用于指向一个函数
第五课指针和数组
本课知识点
1.p=a和p=&a[0]等价
2.1ntf(intG[])
所有数组形式的形参intG[]实质上都是指针类型intGG
3.G[i]和G(G+i)等价
&G[i]和G+i等价
4.1nta[10];a++;
错误,数组不能改变其他地址
第九课指针和字符串
本课知识点
1•字符串的本质是一个字符数组
2.字符指针:
可以指向字符串的指针
3.字符数组和字符指针对比:
字符数组不能修改其内存地址,可以修改其元素的值字符指针不能修改其元素的值,可以修改其内存地址
第十六课指针和二维数组
本课知识点
1.二维数组,每
予一个元素相当于一个变量
inta[2][3];a[0]->&a[0][0]a[1]->&a[1][0]
2.二维数组指针的定义
int(Gp)():
指向函数的指针
int(Gp)[3]:
指向列数为3的二维数组的指针
3.两种形式
数组形式:
inta[6],Gp=a;
P[0]->Gpp[1]->G(p+1)p[2]->G(p+2)p[i]->G(p+i)
p[i][j]->(G(p+i))[j]
指针形式:
p[i][j]->G(G(p+i)+j)p[O][O]->G(G(p+O)+O)->GGpp[0][1]->G(G(p+0)+1)->G(Gp+1)p[1][0]->G(G(p+1)+0)->GG(p+1)p[1][1]->G(G(p+1)+1)
4.对应赋值:
层次不同的指针不能相互赋值
第八章线性列表和其他
第一课结构体和共用体
结构体
1.定义
struct结构体类型名
{
成员属性
};//以分号结束
2.定义变量
struct结构体类型名变量名
struct结构体类型名
{
成员属性
}变量名;
3.赋值
变量名•属性名
4初始化(定义时)
struct结构体类型名变量名={依次初始化各成员}
5.定义类型别名
tPpedef原类型名新类型名
共用体
union共用体类型名
成员属性
}变量名;
第二课结构体和指针
结构体指针基本用法
main()
{
RectG={3,5},Gp;
p=&G;
printf("%d\n",p->width);//p所指向的结构体的属性}
优先级:
++p->G等价于++(p->G)
第五课malloc函数
本课知识点
1.malloc函数所在的头文件:
2.malloc函数使用格式:
malloc(空间大小)
3.malloc函数返回值类型:
voidG
4.malloc申请的空间并不会自动消失
5.释放空间:
free(p);
第六课线性链表
定义
#include
#includestructNode{intdata;
structNodeGneGt;
};
main()
{
structNodeGheader=NULL;
}
创建
structNodeGcreate(intn)
{
structNodeGp;
p=(structNodeG)malloc(sizeof(structNode));p->data=n;
p->neGt=nuII;
returnp;
}
输出
voidoutput(structNodeGp){while(p){
printf("%d\n",p->data);p=p->neGt;
}
}
修改
插入
voidinsert(structNodeGp,intn,intk)
{
structNodeGpNew;
inti;
for(i=0;ip=p->neGt
}
pNew=(structNodeG)malloc(sizeof(structNode));pNew->data=k;
pNew->neGt=p->neGt;
p->neGt=pNew;
}
删除
voiddel(structNodeGp,intn)
structNodeGpDel;
inti;
for(i=0;ip=p->neGt;
}
pDel=p->neGt;
p->neGt=pDel->neGt;free(pDel);
}
优质参考文档
第十课文件的打开和关闭
定义文件指针
FILEGfp
打开文件
fp=fopen("文件名","打开方式")
12种打开方式
文本文件:
r:
只读w:
新建写入
a:
追加
叶:
读写
w+:
新建读写
a+:
读写
二进制文件:
rb:
只读
wb:
新建写入
ab:
追加rb+:
读写wb+:
新建读写ab+:
读写
关闭文件
fclose()
第十一课文件的输入和输出
字符的写入和读取
fputc(字符,文件指针):
像文件中写入单个字符
putchar():
在控制台打印一个字符
fgetc(文件指针):
从文件中读取单个字符
getchar():
从控制台读条一个字符
feof(文件指针):
对文件进行遍历
rewind(文件指针):
将文件指针重新指回文件头部
字符串的写入和读取
fputs(字符串,文件指针):
像文件中输入字符串
puts(数组名):
向控制台输出字符串
fgets(数组名,数组大小,文件指针):
从文件中读取字符串gets(数组名):
从控制台读取字符串
普通变量的写入和读取
fprintf(文件指针,"%d",5):
向文件中写入printf("%d",5):
向控制台输出
fscanf文件指针,"%d",&a):
从文件中读取scanf("%d",&a):
从控制台输入
数组的写入和读取
数组的写入:
fwrite(数组名,单个元素大小,数组大小,fp)数组的输出:
fread(数组名,单个元素大小,数组大小,fp)
第十二课进制的转换
二/八/十六进制->十进制
数码乘以相应权之和
十进制->二/八/十六进制
连续除以基,直至商为0,从低到高记录余数
二进制<-->八/十六进制
二进制转换成八进制:
从右像左,每3位一组(不足3位补0),转换成八进制八进制转换成二进制:
用3位二进制数代替每一位八进制数
二进制转换成十六进制:
从右像左,每4位一组(不足4位补0),转换成十六进制
十六进制转换成二进制:
用4位二进制数代替每一位十六进制数
其中:
数码:
表示数的符号
基:
数码的个数
权:
每一位所具有的值
第十三课位运算
按位与(&)
如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
按位或(|)
两个相应的二进制位中只要有一个为1,该位的结果值为1
按位取反(~)
用来对一个二进制数按位取反,即将0变1,将1变0
按位异或(A)
若参加运算的两个二进制位值相同则为0,否则为1
左移(<<)
用来将一个数的各二进制位全部左移N位,右补0
右移(>>)
将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高
位补0