C语言讲义.docx
- 文档编号:23827792
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:23
- 大小:209.77KB
C语言讲义.docx
《C语言讲义.docx》由会员分享,可在线阅读,更多相关《C语言讲义.docx(23页珍藏版)》请在冰豆网上搜索。
C语言讲义
ACM协会C语言讲义
知识点1:
C语言的数据类型
所谓数据类型是按被定义变量的性质,表示形式,占据存储空间的多少,构造特点来划分的。
在C语言中,数据类型可分为:
基本数据类型,构造数据类型,指针类型,空类型四大类。
知识点2:
常量
对于基本数据类型量,按其取值是否可改变又分为常量和变量两种。
在程序执行过程中,其值不能被改变的量称为常量。
整型常量:
12,0,-3
实型常量:
0.25,12.345,-3.4
字符常量:
’a’,’b’
知识点3:
符号常量
符号常量:
用标示符代表一个常量。
在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。
符号常量在使用之前必须先定义,其一般形式为:
#define标识符常量
习惯上,符号常量名用大写,变量名用小写,以示区别
例
#definePRICE30
#include
voidmain()
{
intnum,total;
num=10;
total=num*PRICE;
printf("total=%d\n",total);
}
程序中,用#define命令行定义PRICE代表常量30,此后凡在本程序中出现的PRICE都代表30,可以和常量一样进行运算,程序运行结果为
total=300
用标识符代表一个常量,称为符号常量。
符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。
符号常量的好处是:
含义清楚;
能做到“一改全改”。
知识点4:
标识符
在C语言中用来对变量、符号常量、函数、数组、类型等数据对象命名的有效字符序列统称为标识符。
简单的说,标识符就是一个名字。
C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。
知识点5:
字符串常量
字符换常量是一对双撇号括起来的字符序列。
“Helloworld”
C规定:
在每一个字符串常量的结尾加一个“字符串结束标志”,以便系统据此判断字符串是否结束。
C规定以字符’\0’作为字符串结束标志。
知识点6:
强制类型转换
(double)a(将a转换成double类型)
(int)(x+y)(将x+y的值转换成整形)
(float)(5%3)(将5%3的值转换成float型)
其一般形式为
(类型名)(表达式)
知识点7:
自增、自减运算符
++i,--I(在使用i之前,先使用i的值加(减)1)
i++,i--(在使用i之后,使用i的值加(减)1)
例
i=3;
printf("%d",++i);
输出“4”,若改为
printf("%d",i++);
则输出“3”。
知识点8:
复合的赋值运算符
a+=3等价于a=a+3
a-=b等价于a=a-b
常用的复合赋值运算符有+=,-=,*=,/=,%=
知识点9:
格式输入与输出
1、printf函数
作用是向终端输出若干个任意类型的数据
printf的一般格式为
printf(格式控制,输出表列)
例
printf(“%d%c”,a,b);
printf格式字符
格式字符
说明
d
以带符号的十进制形式输出整数
x,X
以十六进制无符号形式输出整数
c
以自负刑事输出,只输出一个字符
s
输出字符串
2、scanf函数
一般形式
scanf(格式控制,地址表列)
例
scanf("%d%d",&a,&b);
知识点10:
关系运算符
<,<=,>,>=,==,!
=
关系运算符的优先级低于算术运算符
关系运算符的优先级高于赋值运算符
知识点11:
逻辑运算符
(1)&&逻辑与
(2)||逻辑或
(3)!
逻辑非
知识点12:
if语句
1、if(表达式)语句
例:
if(a>b)printf("%d",a);
2、if(表达式)
语句1
else
语句2
例:
#include
voidmain()
{
inta,b;
scanf("%d%d",&a,&b);
if(a>b)
printf("max=%d\n",a);
else
printf("max=%d\n",b);
}
3、if(表达式1)语句1
elseif(表达式2)语句2
elseif(表达式3)语句3
……
elseif(表达式m)语句m
else语句n
例:
if(number>500)cost=0.15;
elseif(number>300)cost=0.10;
elseif(number>100)cost=0.075;
elseif(number>50)cost=0.05;
elsecost=0;
知识点13:
if语句的嵌套
if()
if()
else()
else
if()
else()
知识点14:
条件运算符
一般形式:
表达式1?
表达式2:
表达式3
max=(a>b)?
a:
b;
其中“(a>b)?
a:
b”是一个条件表达式。
它是这样执行的:
如果(a>b)条件为真,则条件表达式取值为a;否则为b。
知识点15:
switch语句
C语言还提供了另一种用于多分支选择的switch语句,其一般形式为:
switch(表达式){
case常量表达式1:
语句1;
case常量表达式2:
语句2;
…
case常量表达式n:
语句n;
default:
语句n+1;
}
例:
#include
voidmain()
{
inta;
printf("inputintegernumber:
");
scanf("%d",&a);
switch(a){
case1:
printf("Monday\n");break;
case2:
printf("Tuesday\n");break;
case3:
printf("Wednesday\n");break;
case4:
printf("Thursday\n");break;
case5:
printf("Friday\n");break;
case6:
printf("Saturday\n");break;
case7:
printf("Sunday\n");break;
default:
printf("error\n");
}
}
知识点16:
while语句循环
一般形式:
while(表达式)语句
例:
#include
voidmain()
{
inti,sum=0;
i=1;
while(i<=100)
{
sum+=i;
i++;
}
printf("%d\n",sum);
}
知识点17:
for语句循环
一般形式:
for(表达式1;表达式2;表达式3)语句
它的执行过程如下:
1)先求解表达式1。
2)求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面第3)步;若其值为假(0),则结束循环,转到第5)步。
3)求解表达式3。
4)转回上面第2)步继续执行。
5)循环结束,执行for语句下面的一个语句。
for语句最简单的应用形式也是最容易理解的形式如下:
for(循环变量赋初值;循环条件;循环变量增量)语句
例:
for(i=1;i<=100;i++)sum+=i;
注意:
for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项,即可以缺省,但“;”不能缺省。
知识点18:
循环的嵌套
例:
#include
voidmain()
{
inti,j,k;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
for(k=0;k<2;k++)
printf("%d%d%d\n",i,j,k);
}
知识点19:
break语句与continue语句
执行break语句,提前结束循环,即不再继续执行其余的几次循环。
break语句不能用于循环语句和switch语句之外的任何其他语句。
例:
floatpi=3.14159;
for(r=1;r<=10;r++)
{
area=pi*r*r;
if(area>100)
break;
printf("r=%f,area=%f\n",r,area);
}
程序的作用是计算r=1到r=10时的圆面积,直到面积大于100为止。
continue作用是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。
●break语句与continue语句的区别是:
continue语句只结束本次循环,而break语句则是结束整个循环过程。
知识点20:
一维数组
一维数组的定义
类型说明符数组名[常量表达式];
例如:
Inta[10];
说明:
数组下标是从0开始的,按上面的定义,不存在数组元素a[10]。
一维数组的引用
数组必须先定义,然后使用。
数组元素的表示形式为:
数组名[下标]
例如:
#include
voidmain()
{
inti,a[10];
for(i=0;i<10;i++)
a[i]=i;
for(i=0;i<10;i++)
printf("%d",a[i]);
}
运行结果如下:
0123456789
一维数组初始化
(1)在定义数组时对数组元素赋予初值。
例如:
Inta[10]={0,1,2,3,4,5,6,7,8,9};
(2)也可以只给一部分元素赋值
inta[10]={0,1,2,3,4};
这表示只给前面5个元素赋值。
(3)如果想使一个数组中全部元素值为0;
inta[10]={0,0,0,0,0,0,0,0,0,0};
或
inta[10]={0};
(4)在对全部数组元素赋初值时,由于数据的个数已经确定。
因此可以不指定数组长度,例如:
Inta[]={0,1,2,3,4,5};
知识点21:
冒泡算法
#include
voidmain()
{
inti,j,t;
inta[10];
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)/*进行9次循环,实现9趟比较*/
for(j=0;j<9-i;j++)/*在每一趟中进行9-i次比较*/
if(a[j]>a[j+1])/*相邻两个数比较*/
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=0;i<10;i++)
printf("%d",a[i]);
}
知识点22:
二维数组
二维数组的定义:
类型说明符数组名[常量表达式][常量表达式];
例如:
inta[3][4];
二维数组的初始化
(1)分行给二维数组赋初值
inta[3][4]={(1,2,3,4),(5,6,7,8),(9,10,11,12)};
(2)按数组排列的顺序对各个元素赋初值
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(3)可以对部分元素赋初值
inta[3][4]={
(1),(5),(9)};
它的作用是只对各行第一列赋初值
1000.
5000
9000
也可以对各行某一元素赋初值
inta[3][4]={
(1),(0,6),(0,0,11)};
初始化后的数组元素如下:
1000
0600
00110
(4)如果对全部元素赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
等价于
inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
二维数组的输入
inti,j;
inta[3][4]
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
输出同输入
【知识点23】:
字符数组
形式与前面介绍的数值数组相同。
例如:
charc[10];
(字符串,就是一串字符,其实就是上面的字符数组)
一维数组初始化:
charc[5]=“china”;//错误
因为”china”存储的时候,会在最后加上’\0’,其实是有6个字符,c数组只有能存5个字符,所以会出错
charc[6]=“china”;//正确
charc[6]=“good”;//正确
charc[]=“weareChinese”;//正确用于不知道字符串的长度的情况
可以改变某个字符数组下标的字符:
charc[6]=“china”;(前面已经讲过,下标从0开始)
c[0]=‘h’;
c[4]=‘b’;
最后c数组里存的是“hhinb”;
字符数组也可以是二维或多维数组。
例如:
charc[5][10];
和【知识点22】二维数组类似
【知识点24】:
函数
C源程序是由函数构成的,像我们熟悉的main(),也是一个函数,我们叫它主函数。
函数可以让我们省去很多重复的代码。
看如下一段代码:
intf(intx){
return3*x+1;//一旦到return语句,这个函数就退出
}
intmain(){
intresult=f(3);//这句话是调用f(x)这个函数,让上面的x等于3//带入f(x),然后求出结果,给result;
printf("%d\n",result);
return0;
}
就像高中数学的f(x)=3x+1,f(x)是一个函数,有一个参数x,我们让x等于特定的值,这样就得到了f(x)的值。
上面我们讲到的那个f(x)的值是函数的返回值,x是形式参数,通常简称形参,我们让x等于3,这个3就是实参,通常简称实参。
当然函数也可以不用带形参,所以我们调用的也是也可以不用给它实参。
函数也可以没有返回值,前面加个void。
比如voidf();这个就是没有参数的没有返回值的函数。
上面那段代码我们是把intf(intx)这个函数写在main()函数上面,所以可以直接调用。
如果写在main()函数下面的话,我们在用这个函数之前要在main()函数声明下这个函数、
声明是这样的:
intf(intx);或者intf(int);这样就对f这个函数进行了声明。
函数可以嵌套调用:
可以再定义一个函数intg(intx);可以把这个函数写在intf(intx)这个函数里。
也可以把intf(intx)这个函数写在自身里面,这样就形成了递归调用。
如果你函数里面没有写好终止条件的话,这个函数可能会无止境的运行下去。
联系上面讲的数组,inta[10]={0};
回到最前面的几个知识点讲的变量,当我们定义一个整形变量的时候,系统会随机给这个变量一块整形大小的内存空间,比如intx;这样x就在一个地址为随机值的内存空间上,&x是这个地址的值。
如果我们定义的类型不同,比如doublex;这样开辟的内存空间也不一样大。
同理当我们定义数组的时候,我们会在内存中开辟连续的空间给这个数组,比如这个a数组,里面存的是int型变量内存中就会开始10*int大小的空间。
这个a其实有两层含义:
①数组名
a(地址)a+2②这个数组在内存中开辟的连续空间的首地址
0123456789
(上面每块都一样大的,画图误差)
再回到【知识点9】的格式输入的scanf()函数
如果要输入一个数给a这个数组的第3个元素,我们可以用scanf(“%d”,&a[2]);
因为scanf函数第2个参数&a[2]是个地址,那由a的第②层含义可知,
我们也可以这样输入:
scanf(“%d”,a+2);(a+2所指的位置如上图)
现在回到本知识点,函数。
函数的参数其实可以用数组
比如:
voidf(inta[10]){
for(inti=0;i<10;i++){
printf("%d",a[i]);
}
}
这个函数的形参是数组,那我们调用这个函数的时候,实参给的是什么呢?
可能已经有人想到了,是用a,也就是数组名,同样也是这个数组的首地址。
下面是main()函数中的调用方法:
intmain()
{
intnum[10]={0};
f(num);//这句话就是调用f函数,num这里是实参
return0;
}
【知识点25】变量的作用域
当我们在某个函数里定义了一个变量之后,在另一个函数中是否还能用呢?
#include
intall;//这个变量的作用域是所有函数都可以用,因为他写在所有函数外面
voidf1(){
intx;这2个变量的作用域只在这个函数里,其他函数不能用,下面同理
inty;
}
voidf2(){
intx;
inty2;
}
voidf3(){
intx;
inty3;
}
intmain(){
intx;这2个也一样,把main()函数也是一个函数。
inty4;
return0;
}
有一种用static修饰的变量
看下面一段递归调用的代码(函数调用自己本身)
voidf(){
staticintx=5;//这个语句只运行一次,下次再用这个函数的时候就不执行这个语句
if(10==x){//终止条件,不然就无止境的调用本身了。
return;
}
x=x+1;
f();
}
【知识点26】预处理
C语言很很多预处理功能,如宏定义,文件包含,条件编译,一般都写在源代码的最前面。
条件编译我们暂时不讲。
文件包含就是我们常见的#include;#include用于包含一些文件,这些文件中有我们需要用到的东西。
比如#include
我们也可以把自己写的函数放到文件里,然后#include这个文件,这样就能调用我们自己写的函数了。
宏定义是#define
比如#definePI3.14当我们在源代码中遇到PI的时候,我们就用3.14代替
试着理解下面这段程序
//求圆的面积
#include
#definePI3.14
intmain(){
doubler=3.0;//定义圆的半径为3.0
doubles=PI*r*r;//圆的面积为πr^2
printf("圆的面积为:
%lf\n",s);
return0;
}
仔细看会发现,用宏定义#define能提高程序的可读性,当程序中突然出现一个莫名的数字的时候,我们会不会很郁闷?
所以用一个单词代替数字,不失为一个很好的选择,比如用PI代替3.14。
用Sunday代替数字7,如果这里的7代表的是星期,可以用July代替数字7,如果这里的7代表的是月份。
【知识点27】指针
指针是C语言很重要的一个内容,也是难点。
(因为涉及到的内容太多,这里只是很简单的描述下,具体的可以去看C语言书本,还要多加实践才能深刻理解)
一个指针就是一个地址,是一个常量,而一个指针常量可以被赋予不同的指针值。
我们可以这样定义一个指向整形变量的指针变量:
int*p;
如果有个intx;可以对指针变量p这样赋值:
p=&x,这样p就指向了x。
如果我们这样操作:
*p=5;这样x的值就变成5了。
看如下一段程序:
#include
intmain(){
intx;
int*p=&x;//p指向x的地址
scanf("%d",p);//这里输入123,其实是在x的地址输入123,所以x的值变成3
printf("%d\n",x);//输出123
return0;
}
【知识点28】结构体
定义结构体的一般形式为:
struct结构名
{
一些成员
}
比如定义一个学生结构体类型
structstudent
{
intnum;
charname[20];
charsex;
floatscore;
};
这样我们就可以用student这个类型来描述一个学生,当然,里面的成员可以自己随意改。
这样student就变成一个类型了,相当于int,float。
如果要定义一个student类型的变量,可以这样:
studentstu;stu就是一个student类型的变量
如果要用到stu变量中sex这个成员,可以用stu.sex;即结构变量名.成员名
变量初始化可以这样:
studentstu={1,“张三”,‘男’,95.0};这样初始化之后
stu里面的num,name,sex,score的值就分别为1,”张三”,‘男’,95.0。
结构体类型也可以定义数组,和普通数组类似。
如果有一个指向student类型的指针student*p;p=&stu;//即p指向上面的stu变量
用指针p调用stu里面的成员应该用->操作符,和上面的.不一样,
即p->sex,p->score。
【知识点29】位运算
C语言提供了六种位运算符:
(1)&按位与
(2)|按位或
按位或运算符“|”是双目运算符。
其功能是参与运算的两数各对应的二进位相或。
只要对应的二个二进位有一个为1时,结果位就为1。
参与运算的两个数均以补码出现。
例如:
9|5可写算式如下:
^按位异或
~取反
<<左移
左移运算符“<<”是双目运算符。
功能是把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
例如:
a<<4指把a的各二进位向左移动4位。
如a=00000011(十进制3),左移4位后为00110000(十进制48)。
>>右移
右移运算符“>>”是双目运算符。
其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:
设a=15,a>>2表示把000001111右移为00000011(十进制3)。
应该说明的是,对于有符号数,在右移时,符号位将随同移动。
当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1取决于编
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 讲义