《C语言》讲义.docx
- 文档编号:7152435
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:33
- 大小:84.38KB
《C语言》讲义.docx
《《C语言》讲义.docx》由会员分享,可在线阅读,更多相关《《C语言》讲义.docx(33页珍藏版)》请在冰豆网上搜索。
《C语言》讲义
《C语言》讲义
第一章C语言程序设计初步
一、程序设计思想的发展
面向机器———》面向过程———》面向对象———》面向问题
机器语言—》汇编语言—》高级语言—》面向对象语言—》软件制造工厂
二、各种典型程序设计语言
asm汇编语言
masm宏汇编语言
Basic语言(basicaqbasic等)
Pascal语言语法严谨,作为教学语言
Fortran语言有强大的科学计算能力
C语言灵活、高效、移植性好
Foxpro主要用于开发数据库应用程序
PowerBuilder主要用于开发数据库应用程序
C++(BorlandC++MicroSoftC++等)面向对象设计语言
ObjectPascalPascal的面向对象版本
VisualC++C++可视化语言
C++Builder
DelphiPascal可视化设计语言
VisualBasic简单易学
Java在C语言发展起来,移植性好,“一处编程,处处运行”
VBScript和JavaScript:
脚本语言,可以嵌入到网页中
SQL语言数据库操作语言
三、C语言的使用环境
1、编程的过程
编辑编译连接
------》源程序(*.c)------》目标文件(*.obj)------》可执行文件(*.exe或*.com)
2、使用TurboC2.0版本
TurboC2.0提供了集成环境,这些步骤可以透明完成。
文件操作
编译
连接
运行
四、C语言程序的结构
例:
#include
main()
{/*主程序开始*/
intx;/*声明变量x*/
printf(“3+5=?
”);/*提问*/
scanf(“%d”,&x);/*输入*/
if(x!
=8)/*评判*/
printf(“笨蛋!
”);
else
printf(“聪明!
”);
}/*主程序结束*/
1、包括头文件用#include<>
或#include””
2、main()函数:
main是函数名()是函数的标志,里面放着参数
函数体用{}括起来
3、各种语句
练习1:
输入一个整,判断是否自然数。
练习2:
输入两个数,求各自的绝对值。
五、函数初步
1、使用系统提供的函数
必须在程序开头加上#include
2、使用自己实现制作好或第三方制作商提供的函数
必须在程序开头加上#include
3、自己设计函数
函数命名:
能够望文生义
函数参数:
要处理、加工的数据
返回值:
函数运算后的结果(可以没有返回值用void),在函数体中用return语句带出。
第二章数据描述与基本操作
一、数据类型
1、计算机中数的表示
采用二进制,存储器(内存和外存)是以字节为单位的,一个字节8位。
表示字符:
用8位
表示整数:
用两个字节即16位
表示小数:
用4个字节即32位
这些数的表示范围P21表
这些数可以是有符号数、也可以是无符号数
2、C语言有丰富的数据类型P16
带符号和不带符号
各种类型长度的测试P21
二、常量和变量
1、量是指在程序执行期间值不能发生变化、具有固定值的量。
分为直接常量和符号常量
直接常量:
正数:
十进制、八进制(以0打头)、十六进制(以0x打头)
实数:
字符:
以单引号标识、一些特殊符号的表示P24
字符串:
以双引号标识,可以有0个、一个或多个字符,结束的标志
符号常量:
定义常量的方法#define
符号常量的作用
2、变量
使用前要先声明(预先为该变量分配存储空间、可以一次声明多个、可以在声明的同时赋初值)
命名方法(以字母或下划线开头的字符序列、不能是关键字、长度无规定、大小写敏感)
变量的赋值
三、运算符
1、分类P29
算术运算符:
+、-、*、/、%、++、--
关系运算符:
>、<、==、>=、<=、!
=
逻辑运算符:
!
、&&、||
位运算符:
<<、>>、~、|、^、&
赋值运算符:
=
条件运算符:
(?
:
)
逗号运算符:
指针运算符:
*、&
求字节运算符:
sizeof
强制类型转换运算符:
(类型)
分量运算符:
.、->
下标运算符:
[下标]
2、操作数个数(单目、双目运算)
3、优先级
4、结合方向:
左结合、右结合,看运算的先后顺序是先左到右(左结合)还是先右到左(右结合)
5、算术运算:
*/+-%、+=、-=
自加和自减
6、关系运算、逻辑运算与条件运算
关系运算:
大小比较(大于>、小于<、等于==、不等于!
=、大于等于>=、小于等于<=),其值只有两个:
真1、假0
逻辑运算:
与&&、或||、非!
P34
&&并且的意思,在A&&B中,如果A为假,则不用判断B
||或者的意思,在A||B中,如果A为真,则不用判断B
条件运算:
在两个表达式中的值选择一个的操作。
e1?
e2:
e3
相当于:
x=e1?
e2:
e3;
ife1==1
x=e2;
else
x=e3;
p36例2.9、2.10
练习:
求下列表达式的值
1<4&&4<7
!
(2<=5)
!
(1<3)||(2<5)
!
(4<=6)&&(3<=7)
四、类型转换
1、转换形式
短变长:
无符号数则用零扩展,有符号为则用符号位扩展,能够使数值保持不变。
长变短:
小数变整数---》截取整数部分、如果整数部分超出整数的表示范围则截去高位。
double变float----》四舍五入
相同长度转变:
有符号—》无符号
无符号—》有符号
数据存储形式不变,理解上的不同。
2、隐式转换
(1)、一般算术转换:
当运算符两边的数据类型不一致时,运算结果向长看齐
例P41
(2)、赋值转换:
等于号左右边的类型不同,自动转换为左边的类型
(3)、输出转换:
在输出语句中指定输出的类型。
3、显式转换
强制类型转换
(类型名)要转换的数
五、数据的输入输出
1、标准的输入输出函数的函数原型放在stdio.h中
输入输出都跟外设打交道,可以是数据文件,也可以是外围设备(设备文件,例如可以把输出重定向“>”到打印机、文件中)
2、printf函数
格式(函数原型):
printf(格式化控制参数,输出项1,输出项2,…);
格式化控制参数中,用%引出的格式:
%-0m.nl或h格式字符
其中%为格式化串的标志
-为左对齐
0填0标志
m.n为域宽及精度,m指总长度,包括小数点;n指小数位数,默认为6位
l:
长整数、双精度
h:
短整数
格式字符见P44表
比较常用的是%d%ld%lf%10.3f等形式
3、scanf函数
格式:
scanf(格式控制参数,地址1,地址2,…);
(1)、多个变量的分隔问题
i、自动分隔。
当输入流中数据类型与格式字符要求不符时,就认为这一数据项结束,如:
scanf(“%d%c%f”,&a,&b,&c);
输入:
1234r1234.567
则a=1234b=rc=1234.567
ii、指定宽度
如:
scanf(“%2d%3f%4f”,&a,&b,&c);
输入:
12345678987654321
则:
a=12b=345.000000c=6789.000000
iii、指定分隔符
例如:
scanf(“%d,%d,%d”,&a,&b,&c);
输入:
12,34,56
iv、虚读
scanf(“%3d%*4d%f”,&a,&f);
输入:
12345678765.43
则a=123虚读4个字符后(4567),f=8765.43
(2)、scanf()函数的返回值是成功匹配的项数。
例如P49
(3)、关于输入缓冲区
输入结束后,按回车键scanf函数才能接收数据,如果输入的数据太多,则余下的数据保存在缓冲区中,下一个scanf函数可以接着使用。
4、其他输入输出函数
(1)、getchar()从键盘获得一个字符,并把该字符返回,按回车才有效
putchar(charch)把字符ch显示出来
(2)、getch()无回显输入,不用按回车就可以接收,包含在conio.h中。
作业:
(1)、输入角度A,判断并输出角A是第几象限的角。
(2)、输入三角形三条边的长度a、b、c,判断该三角形的类型,并计算该三角形的面积。
(3)、输入一坐标值,按照(x,y)的格式输入,计算该坐标值到原点的距离、并计算该点到原点的连线与X轴夹角a的sin(a)、cos(a)、tg(a)、ctg(a)值。
实验存在的问题:
1、编程环境
几个热键:
编译后,在源程序目录下生成目标文件、可执行文件
2、注意一些书写
例如scanf、printf
3、程序中计算表达式的表示
例如:
应表示为:
1/2*(a+b)
4、scanf(“格式化串”,参数1,参数2,…)
参数必须用地址,要注意输入的格式
而printf(“格式化串”,参数1,参数2,…)
参数不必用地址,主要看格式化串中的类型
5、函数
一般要在main函数前面声明一下自编函数的原型
#include
intfnMax(intx,inty)
{
if(x>y)
return(x);
else
return(y);
}
main()
{
inta,b,c,iMax;
printf(“\nPleaseinput3integer:
”);
scanf(“%d,%d,%d”,&a,&b,&c);
iMax=fnMax(a,b);
iMax=fnMax(iMax,c);
printf(“\nThemaxof%d,%d,%dis:
%d”,a,b,c,iMax);
}
第三章C语言的流程设计
一、算法
算法+数据结构=程序
算法的基本结构有:
顺序、选择、循环
算法的描述方法有:
流程图、N-S图、PAD图、伪代码
二、选择型语句
1、if…else结构
格式:
if(条件表达式){
语句组1
}
else{
语句组2
}
else部分可选
P69例3.3
2、if…else结构的嵌套
上例中的语句组也可以是一个if语句
要注意if和else的匹配
例如:
if(条件表达式1){
其他语句
if(条件表达式2){
}
else{
语句组
}
其他语句
}
elseif(条件表达式3){
其他语句
if(条件表达式4){
语句组
}
其他语句
}
else{
语句组
}
p97练习3.3
例子:
求一元二次方程ax2+bx+c=0的根。
a=0{
a!
=0求判别式d{
d=0有一根
d>0有二根
d<0有虚根
{
C=0解为x=0
C!
=0解为x=c/b
C=0无数解
C!
=0无解
b=0{
b!
=0{
分析:
例子:
全班100个同学,求《C语言程序设计》的平均分,并求每个分数段的人数。
分析:
不及格1—59:
:
i0
60—69:
:
i6
70—79:
i7
80—89:
i8
90—99:
i9
100:
i10
总人数:
iCount
总分:
iSum;
平均分:
fAvg;
算法:
输入—》合法性检查—》分数加入总分,判断该分数所属分数段,该分数段变量+1,
3、switch结构
注意break和default
三、循环语句
1、for(初始化语句;条件表达式;修正语句){
循环体
}
一般用在循环次数比较固定的情况
特点:
循环体有可能没有执行到
break:
退出循环
continue:
例如:
求1+2+…+100
死循环:
for(;;)
2、while(条件表达式){
循环体
后面的语句
假
真
循环体
条件表达式
}
特点:
循环体有可能没有运行到
P85例3.18搬砖问题
P87例3.19阶梯问题
例3.20最大公约数问题
例3.21牛顿迭代求平方根问题
关键是推导出迭代关系式、循环条件的设置
3、do{
循环体
}(不能加分号)
真
条件表达式
循环体
while(条件表达式);
假
后面的语句
特点:
循环体最少运行一次
4、循环的嵌套
循环体中出现循环语句。
for语句的嵌套、循环体中也可以出现for语句
例如:
打印乘法口诀九九表P91
1
2
3
4
5
6
7
8
9
1
1
2
3
4
5
6
7
8
9
2
2
4
6
8
10
12
14
16
18
3
3
6
9
12
15
18
21
24
27
4
4
8
12
16
20
24
28
32
36
5
5
10
15
20
25
30
35
40
45
6
6
12
18
24
30
36
42
48
54
7
7
14
21
28
35
42
49
56
63
8
8
16
24
32
40
48
56
64
72
9
9
18
27
36
45
54
63
72
81
P87阶梯问题
求三个符合条件的阶梯
main()
{
intladders=7;
while(ladders%3!
=2||ladders%5!
=4||ladders%6!
=5)
ladders+=14;
printf(“flightofstairs=%d\n”,ladders);
}
编程输出下面形状
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
编程输出下面形状
*
**
***
****
*****
编程输出下面形状
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
第四章
模块化程序设计
一、思想
把复杂的问题分而治之,分为一些小问题,小问题解决了,复杂的问题也就解决了,我们只要把精力集中在每个小问题的解决
模块化的必要性
二、C语言中的函数
C语言是函数驱动的,main()函数就是一个主控函数,调用其它函数
软件系统中的菜单(弹出式、下拉式)、按钮
P102例4.1
1、函数的概念
功能较独立的程序块,独立出来,用一个名字来表示,使用该功能时,用该名字就可以了。
减少程序长度、便于修改
函数名字起得好,可以增加程序的可读性,使程序的结构清晰。
fnMax()、fnMin()、fnSetValue()、fnPrint()等
2、自定义函数
C语言中有些函数是系统提供的,只要知道其功能(用在什么地方)和调用形式(怎么用),就可以直接使用
也可以自己设计函数
(1)、函数声明
对函数的特征(返回值、参数类型、参数个数)进行说明
函数参数:
要处理的数据,可以是0个、1个或者多个(参数间用逗号)
返回值:
处理后的结果或者操作后的状态,可以没有返回值(要用void说明)
例如:
sin(x)
函数的声明可以放在所有函数外面、也可以放在main()函数内。
求整数绝对值的函数:
intfnIntAbsolute(inta);
制作函数求1+2+…+n
intfnSum(intn);
打印n个空格的函数:
voidfnPrintSpace(intn);
打印n个“*”号的函数:
voidfnPrintStar(intn);
这两个函数可以合并:
(2)、函数的定义
编写函数的代码
返回值用return()语句
例如:
上面各个函数的实现
(3)、函数的使用
注意调用时的形式要跟声明的形式一致。
关于实参和形参
实参是定义在调用者中的变量
形参是实参的一个替身
函数调用示意图:
3、函数的嵌套和递归
嵌套:
函数中可以调用别的函数
递归:
直接递归:
函数中可以调用自己(名字与调用者一样的函数)
间接递归:
A调用B,B调用A
例如:
P111例4.9
练习:
P1364.14.24.34.4
三、变量的作用域
变量的有效范围
1、全局变量:
定义在所有函数之外的变量,所有的函数都可以访问到,其默认初值为0
例如:
#include
intx;
voidfnPrint();
main()
{
for(x=0;x<5;x++)
printf(“%d”,x);
fnPrint();
}
voidfnPrint()
{
printf(“%d”,x);
}
2、局部变量:
定义在函数里面,只有函数内部可以访问到,没有默认初值。
把intx定义函数内。
注意:
i)在一个函数内,相同名字的变量名不能声明两次
ii)系统碰到一个变量名时,先在函数内部查找,找不到就在全局变量里查找。
3、关于寄存器变量(用register关键字说明):
为了提高运算速度,把变量放在CPU的寄存器中
4、静态变量(用static说明):
默认初值为0,提供了一种函数共享局部变量的方法。
例如:
(2)中前面再加上static
例如:
P1204.15
例1:
交换两个变量的值。
例2:
利用随机数生成函数random(),(在stdlib.h中),随机得到两个0到99之间的整数,输入这两个数的和,让计算机判断。
例3:
用菜单显示加、减、乘、除功能,让用户选择,并完成相应功能。
四、宏定义
1、用
#define宏名宏体
的格式,编译时,在程序中碰到该宏名时就用宏体代替。
P1274.20
好处:
增加程序的可读性、便于修改
2、带参数的宏
P1304.22
P1314.25
3、定义宏的注意事项
P1346点
练习P1404.144.174.18
作业:
1、编程求1!
+2!
+3!
+…+n!
n从键盘输入。
2、编程求水仙花数。
水仙花数指一个三位数,其各个数字立方和等于该数。
例如:
153=13+53+33
3、编程输出下面图形:
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
#
第五章数组
一、基本概念
1、关于内存地址
内存编排是线性连续的,是以字节(8个二进制位)为单位的,每个字节都有一个编号,这个编号就是地址编号。
这些地址并不能随便使用,必须由系统分配后(声明变量或动态申请)才能使用。
如果使用了一个不经分配的地址空间,可能会有灾难性的后果。
2
1
0
内存的表示图
2、数组是指一组同类型数据组成的序列,每个数据称为数组的元素。
这些数据在内存中是一片连续的空间。
这片空间的最前面一个的内存编号叫做数组的首地址。
数组中用下标来表示该元素与首地址的位置关系。
二、一维数组
只有一个下标的数组
1、格式
数据类型数组名[数组元素个数];
例如:
inta[5];
charc[10];
longx[5];
doubled[100];
unsignedu[20];
元素个数必须是常整数
intn=10;
charc[n];
#definen10
charc[n];
下标是从0开始到个数-1
讨论各个数组所占的空间
首地址:
(1)用数组名表示
(2)最前面元素的地址
输出地址值用格式化参数“%p”
2、数组赋值
(1)、声明后,程序中赋值
注意不要超出范围
inta[10];
a[0]=34;
a[1]=45;
a[10]=90;
for(x=0;x<=9;x++)a[x]=x*8;
(2)、在声明时赋初值
inta[5]={1,3,5,7,9};
charc[11]={‘H’,’e’,’l’,’l’,’o’,’‘,’w’,’o’,’r’,’l’,’d’};
元素个数可以省略
3、数组作为函数参数
(1)、数组元素作为参数
例如:
3个数求平均
(2)、数组名作为参数(传地址)
例如:
交换两个数的值
4、应用
(1)、P146例5.1
(2)、统计各个分数段的成绩
(3)、对n个数排序
冒泡法
有n个数,下标值从0到n-1,即a[0]..a[n-1]
扫描一趟找出一个最大数,则扫描的趟数:
n-1
即外循环:
for(i=0;i 每趟扫描都要从0..n-i-1中交换出最大值: for(j=0;j<=n-i-1;j++){ if(a[j]>a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } (4)、查找 顺序查找: 从0到n-1按照顺序查找,效率低 二分查找: 对有序表 上机作业: 用数组保存班里同学的成绩,完成的功能: 录入成绩,修改成绩,输出最高分,最低分,平均分, 进行各个分数段人数的统计,成绩排序,显示输出全班成绩。 用菜单实现。 三、二维数组 有两个下标的数组 1、定义格式 类型数组名[下标1][下标2] 2、存放顺序: 下标1表示行,下标二表示列 例如: a[3][4] a[0][0]a[0][1]a[0][2]a[0][3] a[1][0]a[1][1]a[1][2]a[1][3] a[2][0]a[2][1]a[2][2]a[2][3] 3、赋值 (1)、定义时赋值 (2)、程序中赋值 例如: P157例5.4 4、举例 P160例5.5 四、字符数组和字符串 1、定义字符数组 charstr[12]; 2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言 语言 讲义