C语言课程教案b.docx
《C语言课程教案b.docx》由会员分享,可在线阅读,更多相关《C语言课程教案b.docx(173页珍藏版)》请在冰豆网上搜索。
![C语言课程教案b.docx](https://file1.bdocx.com/fileroot1/2022-11/21/d0094034-0087-4e68-a9e3-fb456b8ae403/d0094034-0087-4e68-a9e3-fb456b8ae4031.gif)
C语言课程教案b
第一章C语言程序设计概述
1.1程序与程序设计语言
1.1.1程序的基本概念
所谓程序,实际上是用计算机语言描述的某一问题的解决步骤,是符合一定语法规则的符号序列。
1.1.2程序设计语言
1.机器语言与汇编语言
由0和1组成的序列所表示的数据和指令。
所谓机器语言,就是指该机器能够识别的指令的集合,即指令系统。
特点:
机器懂,人难懂。
例如,以下是某计算机的两条机器指令:
加法指令:
10000000
减法指令:
10010000
采用一些“助记符号”来表示机器语言中的机器指令,形成了汇编语言。
两条指令用汇编语言描述如下:
ADDA,B
SUBA,B
特点是:
人记住了,机器不懂了。
计算机不能直接执行用汇编语言编写的程序,它必须经过一个叫汇编程序的系统软件翻译成机器语言程序后才能执行。
我们称前者为源程序,后者为目标程序。
3.算法语言
近似于自然语言的形式,以语句作为程序的基本组成,算法语言的一条语句相当于多条汇编语言指令或机器语言指令,表达能力强。
算法语言程序(源程序)也必须先经过编译程序(或解释程序)翻译成机器语言程序(目标程序)后,才能由计算机执行。
1.2算法及其描述
有人这样说过:
“计算机科学就是研究算法的科学”,足见算法在程序设计中的重要性了。
下面从算法的概念和描述方法两方面,对算法的问题进行讨论。
1.2.1算法的概念
著名的瑞士计算机科学家、PASCAL语言发明者N·沃思(NiklausWirth)教授提出了程序定义的著名公式:
程序=算法+数据结构
算法是数据操作,数据结构是数据的描述,算法是对特定问题求解步骤的一种描述。
算法应当具备以下几个方面的特点:
(1)有穷性
(2)确定性(3)可行性(4)必输出
2、算法的描述方法
(1)自然语言
(2)流程图
(3)改进的流程图(三种基本结构)
①顺序结构②选择结构
③循环结构:
a当型循环b直到型循环
(4)N-S图
3、简单算法举例
例1.1求1×2×3×4×5
S1:
1→P
S2:
2→i
S3:
P×i→P
S4:
i+1→i
S5:
如果i不大于5,返回S3,否则,结束。
1.4C语言程序的基本结构
例1.1已知三个整型数8、12、6,按公式s=a+b×c计算,并显示结果。
#include〈stdio.h〉/*标准输入输出头文件*/
main()
{
inta,b,c,s;/*定义四个整型变量*/
a=8;b=12;c=6;/*变量赋值*/
s=a+b*c;/*算术运算并赋值*/
printf(″s=%d\n″,s);/*输出结果*/
}
从例1.1可以看出:
(1)C语言程序由函数构成。
(2)“/*”与“*/”之间的内容构成C语言程序的注释部分。
(3)用预处理命令#include可以包含有关文件的信息。
(4)大小写字母在C语言中是有区别的。
(5)语句用;号结束
1.5C语言字符集、标识符与关键字
1.5.1C语言字符集
基本字符集包括有英文字母、阿拉伯数字以及其他一些符号。
具体归纳如下:
(1)英文字母:
大小写各26个,共计52个;
(2)阿拉伯数字:
0到9,共计10个;
(3)下划线:
_;
(4)其他特殊符号:
主要指运算符
1.5.2标识符与关键字
1.标识符
标识符用来表示函数、类型及变量的名称,它是字母、下划线和数字的排列,但必须用字母或下划线_开头。
下面给出一些合法与不合法命名的标识符:
合法标识符:
_22A,lea_1,avg3,day,ABCde43xyw8
不合法标识符:
M.J.YORK,$_238,#xy,a*b,8Tea
2.关键字
关键字是一种语言中规定具有特定含义的标识符。
关键字不能作为变量或函数名来使用常用的关键字如下:
charcontinuedefaultdodoubleelsefloatforifintlongreturnswitchtypedefwhile
1.6C语言程序的开发环境
编写好的C语言程序要经过编辑(输入)、编译和连接后才能形成可执行的程序。
图1.2表示了C语言程序设计上机过程。
图1.2C语言程序上机过程
C语言的编译系统有多种,本书采用TurboC2.0集成开发环境。
第2章C语言的基本数据类型与表达式
2.1C语言的基本数据类型
2.1.1数据类型概述
1)描述的数据性质不同,所以要用不同类型的数据来表示。
数学集合论中将数据分成自然数,整数,实数,复数等,同样的在C语言中也会利用不同类型的数据表示不同的数据类型。
2)占用的存储空间的长度不同,不同类型的数据所能表示的数值范围也不同。
字符类型(char)
整型(short,int,long,unsigned)
基本类型单精度型(float)
实型(浮点型)
双精度型(double)
2.1.2整数类型
整型数据可分为:
基本型、短整型、长整型。
(1)基本型,以int表示;
(2)短整型,以shortint表示;
(3)长整型,以longint表示;
以上的每一种又都分成有符号和无符号的两种。
2.1.3实数类型
1、实型数据的分类
(1)float(占32位)
(2)double(占64位)
2、实型数据的表示方法
(1)十进制小数形式(必须有小数点)
(2)指数形式(字母E或e前面必须有数字,且e后面的指数必须为整数)
2.1.4字符类型
1、字符(占8位):
由单撇号扩起来的单个字符。
如'a','?
'
转义字符:
'\n','\t','\b','\r','\\','\'','\''','\ddd','\xhh'
2、字符串:
由双撇号扩起来的字符序列。
※'a'与"a"的区别:
注意,′a′和″a″是不同的。
前者是字符量′a′,后者是字符串量″a″。
′e′和′E′是不同的字符量。
2.2常量与变量
2.2.1常量与符号常量
C语言的数据有常量和变量之分。
常量是指在程序运行中,其数值不能被改变的量。
1.整型常量
合法:
256,-75,0(十进制)0237,045(八进制)0x28AF(十六进制)
不合法:
096(非八进制数码)48EA(缺0x)0xK(K非十六进制字符)
2、实型常量(只能用十进制表示)
合法:
28.763.4E+815.78E-2
不合法:
6.4E+4.8E-7
3、字符常量
合法:
'a''\n''\101'
4、字符串常量
″changsha″,″centralsouthuniversity″,″+++\\?
ab″都是合法的字符串常量。
※'ab'不是字符常量,也不是字符串常量。
5、符号常量:
用一个标识符代表一个常量。
#define标识符常量数据
优点:
a.含义清楚;b.一改全改;
例如:
#defineMAX1000
#defineMIX10+10
#defineENDMIX*MIX
2.2.2变量与变量定义
变量是以某标识符为名字,其值是可以改变的量。
1.变量定义语句
变量定义(或叫说明、声明)语句的一般格式为:
类型标识符变量名1,变量名2……
例如:
inti,j,k;/*定义三个整型变量i,j,k*/
floatx1,y1;/*定义两个单精度型变量x1,y1*/
charprofit,loss;/*定义了两个字符型变量profit,loss*/
※在同一程序中变量名不允许被重复定义,如:
※大写字母和小写字母被认为是两个不同的字符。
因此,sum和SUM是两个不同的变量名。
习惯上变量名定义时多用小写字母表示。
※在C语言中,要求对所有的变量作强制定义,即“先定义,后使用”,并尽量做到“见名知义”。
变量的属性三要素:
变量名a,变量的地址&a,变量的值3;我们能过变量的名修改变量的值。
变量的地址就是图中的存储单元。
2、变量赋初值
即在定义变量的同时使变量初始化。
例:
inta=3;
※inta=b=c=3是不合法的。
三、例题
十进制数10在内存中的存放形式:
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
0
负数在内存中以补码形式存放
方法:
将该数的绝对值的二进制形式按位取反再加1。
例:
求-10的补码
10的原码:
取反:
1
1
1
1
1
1
1
1
1
1
1
1
0
1
0
1
再加1:
1
1
1
1
1
1
1
1
1
1
1
1
0
1
1
0
例2.1:
有符号的意义和无符号数的(整型数据的溢出)
main()
{inta,b;
a=32767;
b=a+1;
printf("%d,%d",a,b);
}
运行结果为:
32767,-32768
a:
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
b:
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
例2.2:
转义字符的使用
main()
{printf("└┚ab└┚c\t└┚de\rf\tg\n");
printf("h\ti\b\bj└┚k");}
在打印机上的结果:
fab└┚c└┚└┚└┚gde
h└┚└┚└┚└┚└┚└┚jik
在显示屏上的结果:
f└┚└┚└┚└┚└┚└┚└┚gde
h└┚└┚└┚└┚└┚└┚j└┚k
2.3运算符与表达式
一、算术运算符和算术表达式
1、基本的算术运算符(左结合)
+、-、*、/、%
说明:
(1)两个整数相除结果为整数:
例:
5/3=1
(2)%两个操作数必须为整数
(3)字符型数据在计算机内部是用一个整型数表示的。
2.变量赋初值
变量使用“=”赋初值,但必须保证“=”右边的常量与“=”左边的变量类型一致。
例2.1
main()
{intx,y,z,w;/*定义x,y,z,w为整型变量*/
unsignedintk;/*定义k为无符号整型变量*/
x=10;y=-20;k=30;
z=x+k;w=y+k;/*不同类型的整型变量x、y、k可运算*/
printf(″x+k=%d,y+k=%d\n″,z,w);
}
程序上机运行结果为:
x+k=40,y+k=10
例2.2
main()
{charc1,c2;/*定义字符型变量c1,c2*/;
c1=′a′;c2=′b′;/*c1、c2赋初值*/
c1=c1-32;c2=c2-32;/*c1=c1-32和c2=c2-32是ASCII码相减,c1的ASCII码为97,c2的ASCII码为98*/
printf(″%c%c″,c1,c2);
}
运行结果为:
AB
2.3.1算术运算符与算术表达式
1.运算符
C语言基本的算术运算符共有5种:
+(加)、-(减)、*(乘)、/(除)、%(取余,模运算)
它们都是双目运算符,即运算符要求有两个操作数。
如运算:
x+y、x-y、x*y、x/y、x%y都采用双目运算。
(1)要求%运算左右两数必须为整型数据,如7%4的值为3。
(2)两个整数/相除,结果为整数,舍去小数部分。
如5/3=1,-5/3=-1,采取“向零取整”的方法,即取整后向零靠拢(即向实数轴的原点靠拢)。
2.算术表达式
(1)算术表达式定义
用算术运算符和括号将运算对象(也称操作数)连接起来,符合C语言规则的式子,称为算术表达式。
运算对象包括常量、变量、函数等。
如:
a*b+c/d
46+2*PI*R
a*sin(x)+b*cos(x)
都是合法的算术表达式。
(2)运算符的优先级与结合性
(3)类型转换
如果一个运算符两侧的数据类型不同,先自动进行类型转换,使两者具有同一种类型,然后再进行运算。
(4)取负值运算符
运算顺序应为:
①→⑤
y=-a-b*c+a/c
①②③
④
⑤
(5)自增与自减运算符
C语言的自增运算符为++,自减运算符为--,其操作对象只能是变量。
作用是使变量的值增1或减1,如:
++i,--i(在使用i之前,i值先加(减)1)
i++,i--(在使用i之后,i值再加(减)1)
后缀形式i++(先使用,后增值)
例:
i=3;
printf("%d",++i);
输出结果为4;
若改为:
pritnf("%d",i++);
则输出结果为3。
printf("%d",-i++);
输出结果为:
-3。
(i增值为4)
(6)自增与自减运算符优先级高于算术运算符优先级,而与负值(-)运算符同级。
如i=2;
j=-i++;
“++”和“-”是同级优先关系。
结果:
j=-2,i=3。
2.3.2赋值运算符与赋值表达式
1.赋值运算符
C语言的赋值运算符为“=”,它的作用是将一个数据赋给一个变量。
例如:
x=10/*将10赋给变量x*/
y=3*x+5*a/*将表达式之值赋给变量y*/〖ZK〗〗
2.赋值表达式
(1)赋值表达式的构成
由赋值运算符将一个变量和一个表达式连接起来的式子称作“赋值表达式”。
它的一般形式为:
〈变量〉〈赋值运算符〉〈表达式〉
赋值表达式当中的“表达式”,又可以是一个赋值表达式。
如:
a=(b=10)
b=10是一个赋值表达式,整个赋值表达式a的值也是10。
a=(b=10)和a=b=10等价。
x=y=z=8(赋值表达式之值为8,x,y,z值均为8)
x=10+(y=5)(表达式值为15,x值为15,y值为5)
a=(b=10)/(c=2)(表达式值为5,a值为5,b值为10,c值为2)
(2)优先级
赋值运算符优先级低于算术运算符、关系运算符和逻辑运算符,如:
x=6先求关系表达式6
(3)结合律
赋值表达式按照自右至左的顺序结合。
例如:
x=y=3*z/w
运算顺序为:
x=(y=3*z/w)
又:
a=b=20/4
运算时先计算20/4,结果为5,将5赋给b,再将5赋给a。
自右至左运算。
3.复合赋值运算符
在赋值符“=”之前加上其他运算符,可以构成复合的运算符。
C语言可使用的复合赋值运算符有10种。
它们是:
+=、-=、*=、/=、%(与算术运算符组合)
<<=、>>=(与位移运算符组合)
&=、∧=、|=(与位逻辑运算符组合)
复合赋值表达式的格式为:
〈变量名〉〈复合赋值运算符〉〈表达式〉
例如:
x+=a+y*3等价于x=x+(a+y*3)
若a的初值为12,则a+=a-=a*a的求解步骤是怎样的呢?
这是一个复合的赋值运算过程,其求解过程为:
①先进行a-=a*a的运算,它相当于a=a-a*a=12-144=-132。
②再进行a+=-132的运算,它相当于a=a+(-132)=-132-132=-264。
2.3.3逗号运算符和求字节运算符
1.逗号运算符和逗号表达式
逗号表达式的一般形式为:
表达式1,表达式2
逗号表达式的求解过程是:
先求解表达式1,再求解表达式2。
整个逗号表达式的值是表达式2的值。
如:
x=(y=3,y+1)
首先将3赋给y,然后执行y+1的运算,将结果4赋给x。
整个x赋值右边的表达式要用括号括起来。
因为逗号运算符的优先级别低于赋值运算符。
逗号表达式的一般形式可以扩展为:
表达式1,表达式2……表达式n
它的值为表达式n的值。
2.求字节运算符sizeof
C语言的sizeof是一个单目编译状态运算符,它返回变量或括号中的类型修饰符的字节长度。
它的一般形式为:
sizeof(变量名)
sizeof(类型名)
如:
floatf;
printf(″%d″,sizeof(f));
printf(″%d″,sizeof(int));
其输出显示字节数为4和2。
2.3.4条件运算符
条件运算符要求有三个操作对象,称三目(元)运算符。
它由两个符号?
和:
组成。
其一般形式为:
〈表达式1〉?
〈表达式2〉:
〈表达式3〉
它的运算顺序是:
先求表达式1的值,如果它的值为真(非0值),则求表达式2的值并把它作为整个表达式的值;如果表达式1的值为假(0值),则求表达式3的值并把它作为整个表达式的值。
如:
y=x>10?
100:
200
此式求值取决于x的值:
(1)若x>10为真,则y=100;
(2)若x>10为假,则y=200;
C语言中条件运算符的优先级高于赋值运算符。
条件运算符的结合方向为“自右至左”。
如条件表达:
y=x>10?
x/10:
x>0?
x:
-x;
从右至左结合,等价于:
y=x>10?
x/10:
(x>0?
x:
-x);
它的功能是:
当x>10时,y的值为x/10。
当x<10时,y的值取决于表达式x>0?
x:
-x的值(当x>0时,表达式的值是x;当x<0时,表达式的值是-x)。
2.4数据类型转换
C语言中,整型、单精度型、双精度型和字符型数据可以进行混合运算。
字符型数据可以与整型通用。
例如:
100+′A′+8.65-2456.75*′a′
是一个合法的运算表达式。
在进行运算时,不同类型的数据要先转换成同一类型,然后再进行运算。
C语言数据类型转换可以归纳成3种转换方式:
自动转换、赋值转换和强制转换。
2.4.1类型自动转换
在进行运算时,不同类型的数据要转换成同一类型。
自动转换的规则如图2.1所示。
由低级向高级型转换。
(1)float型数据自动转换成double型;
(2)char、short数据自动转换成int型;
(3)int型与double型数据运算,直接将int型转换成double型;
(4)int型与unsigned型数据,直接将int型转换成unsigned型;
(5)int型与long型数据,直接将int型转换成long型。
例如:
charch=′a′;inti=13;floatx=3.65;doubley=7.528e-6;
若表达式为:
i+ch+x*y
则表达式的类型转换是这样进行的:
先将ch转换成int型,计算i+ch,由于ch=′a′,而′a′的ASCII码值为97,故计算结果为110,类型为int型。
再将x转换成double型,计算x*y,结果为double类型。
最后将i+ch的值110转换成double型,表达式的值最后为double类型。
2.4.2赋值转换
如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值过程中就要进行类型转换。
转换的基本原则为:
(1)将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。
(2)将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。
如x为整型变量,执行“x=4.25”时,取值为x=4。
(3)字符型数据赋给整型变量,字符型数据只占一个字节,而整型变量占2个字节,因此将字符数据放入到整型变量低8位中,整型变量高8位视机器系统处理有符号量或无符号量两种不同情况,分别在高8位补上1或补上0。
如图2.2所示。
图2.2字符型数据转换成整型数据示意图
(4)带符号的整型数据(int)赋给longint型数据变量,要进行符号扩展。
如果int型数据为正值,则longint型变量的高16位补0,反之,则补1。
(5)unsignedint型数据赋给longint型数据变量时,不存在符号扩展,只需将高位补0即可。
例如:
inta,b;
floatx1=2.5,x2;
doubley1=2.2,y2;
a=x1;/*x1的值转换成整数2赋给a,小数截去了*/
x2=3.14159*y1*y1;/*右边表达式为双精度型,先转换成单精度再赋给x2*/
b=′a′;/*将′a′的一字节ASCII码转换成两个字节的整数,再赋给b,b的值为97*/
精度高的数据类型向精度低的数据类型转换时,数据的精度有可能降低。
2.4.3强制类型转换
可以利用强制类型转换运算符将一个表达式转换成所需类型。
如:
(int)(a+b)(强制将a+b的值转换成整型)
(double)x(将x转换成double型)
(float)(10%3)(将10%3的值转换成float型)
强制类型转换的一般形式为:
(类型名)(表达式)
注意:
(int)(x+y)和(int)x+y强制类型转换的对象是不同的。
(int)(x+y)是对x+y进行强制类型转换;而(int)x+y则只对x进行强制类型转换。
第3章顺序程序设计
简单程序的流程一般分为顺序结构、选择结构和循环结构。
顺序结构是程序设计语言最基本的结构,其包含的语句是按照书写的顺序执行的,且每条语句都将被执行。
其他的结构可以包含顺序结构,也可以作为顺序结构的组成部分。
3.1C语言的基本语句
C语言的语句可分为以下四类:
简单语句(包括输入/输出语句)、空语句、复合语句和流程控制语句。
简单语句
空语句(;)
复合语句({一条或多条语句})
条件语句(if语句,switch语句)
C语言数据操作语句结构化语句
循环语句
流程控制语句
非结构化语句
非限定转向语句
顺序结构程序由简单语句组成,程序流程如图3.1所示,语句按书写顺序执行。
先执行A,再执行B。
A
B
图3.1顺序结构执行流程
本节主要介绍简单语句、空语句和复合语句的有关内容,对于函数调用语句中的“输入/输出语句”将在3.2节中再作详细的介绍。
3.1.1简单语句
1.表达式语句
由表达式组成的语句称为表达式语句。
表达式语句很简单,表达式加上分号就是一个表达式语句。
表达式也能构成语句,这是C语言的一个重要特色。
表达式语句的一般