C语言教案.docx
《C语言教案.docx》由会员分享,可在线阅读,更多相关《C语言教案.docx(123页珍藏版)》请在冰豆网上搜索。
C语言教案
《高级语言(C语言)程序设计》教案
第一章C语言概述
§1.1C语言的历史和特点
一、C语言的历史
Algol60→CPL→BCPL→B→C→旧标准C→ANSIC→C++→VisualC++
┆┆┆┆┆┆(新标准C)
┆┆┆┆┆┆┆
1960196319671970197219781983
C语言的诞生与发展:
在C语言诞生以前,系统软件主要是用汇编语言编写的。
由于汇编语言程序依赖于计算机硬件,其可读性和可移植性都很差;但一般的高级语言又难以实现对计算机硬件的直接操作(这正是汇编语言的优势),于是人们盼望有一种兼有汇编语言和高级语言特性的新语言。
C语言是贝尔实验室于70年代初研制出来的,后来又被多次改进,并出现了多种版本。
80年代初,美国国家标准化协会(ANSI),根据C语言问世以来各种版本对C语言的发展和扩充,制定了ANSIC标准(1989年再次做了修订)。
·ALGOL60(1960,面向问题的高级语言,不宜用来编写系统程序)
·CPL(1963,英国剑桥大学,规模较大)
·BCPL(1967,剑桥大学MatinRichards,作了简化)
·B(1970,美国贝尔实验室KenThompson,进一步简化,又过于简单,功能有限)
·C(1972-1973,贝尔实验室D.M.Ritchie,保持了精练,接近硬件的优点,克服了B语言过于简单的缺点)
·1973年,K.Thompson和D.M.Ritchie合作用C改写UNIX(第5版)。
·1975年出的的UNIX第6版使人们普遍注意C语言。
·以1978年发表的UNIX第7版中的C编译程序为基础,BrianW.Kernighan和DennisM.Ritchie合著了影响深远的《TheCProgrammingLanguage》,书中介绍的C语言称为标准C。
·1983年,美国国家标准化协会(ANSI)制定了新的标准,称为ANSIC。
·现在微机上常用的C语言编译系统有MicrosoftC,TurboC,QuickC。
·我们的教材选用的是TurboC2.0版本。
二、C语言的特点
1.语言简洁,表达能力强
·语言简洁、紧凑,使用方便、灵活。
一共只有32个关键字,9种控制语句;
·运算符丰富。
共有34种运算符;
·数据结构丰富,便于数据的描述与存储;
·具有结构化的控制语句;
·强大的库函数,用函数作为程序模块以实现程序的模块化;
·语法限制不太严格,程序设计自由度大。
2.融合高、低级语言的中级语言
·具有高级语言基本结构;
·可直接对硬件进行操作,允许直接访问物理地址;
·生成的代码质量高,生成目标程序运行速度高,占有内存少,程序执行效率高。
3.可移植性好:
独立于具体机器。
§1.2C语言的一般介绍
1、举例说明C程序的结构组成:
一个完整的C语言程序,是由一个main()函数(又称主函数)和若干个其它函数结合而成的,或仅由一个main()函数构成。
例1、一个最简单的C程序:
向显示器输出一行ThisisaCprogram.文本信息。
main()
{printf(“ThisisaCprogram.\n”);
}
程序运行结果:
ThisisaCprogram.
例2、求三个整数之和。
main()
{inta,b,c,sum;/*变量先说明后使用*/
a=1;b=2;c=3;
sum=a+b+c;
printf(“sumis%d\n”,sum);
}
程序由函数构成(函数为程序的基本单位),每个程序都必须有一个main主函数,程序运行从其开始。
一个程序可以包含多个函数,函数之间通过“调用”而互相联系在一起。
函数可以分为库函数和用户自定义函数。
所有语句都必须以分号“;”结束,函数的最后一个语句也不例外。
C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上。
C语言本身没有输入输出语句。
可以用/*…*/对C程序中的任何部分作注释,它可增加程序的可读性。
C语言没有输入输出语句,只有输入输出库函数。
例3、前面例题采用两个函数完成(即,该题的程序由两个用户自定义函数构成)
main()
{intthreesum();
inta,b,c,sum;
scanf(“%d,%d,%d”,&a,&b,&c);
sum=threesum(a,b,c);
printf(”sumis%d\n”,sum);
}
intthreesum(x,y,z)
intx,y,z;
{intw;
w=x+y+z;
return(w);
}
说明:
(1)本程序包括两个函数:
主函数main和被调用函数threesum。
threesum函数的作用是将x、y和z的求和结果赋给变量w,函数体由大括号{}括起来。
(2)return语句的作用是将w的值返回给主调用函数main,返回值将通过函数名threesum带回到main函数的调用处。
(3)scanf和printf都是C语言提供的标准输入输出函数,scanf函数的作用是输入a、b和c的值;printf函数的作用是按设置的格式输出有关量的值。
2、C程序的基本结构
(1)C程序是由函数组成的。
一个C源程序至少包括一个主函数(main函数),也可以包括一个main函数和若干个其它函数。
(2)任何函数(包括主函数main())都是由函数说明和函数体两部分组成。
其一般结构如下:
①函数说明:
函数类型函数名(函数形参)
形参类型形参;
②函数体:
{数据类型说明
执行语句
}
函数的说明部分:
包括函数名、函数类型、函数属性、函数参数(形参)名、形式参数类型。
一个函数名后面必须跟一对圆括号(),函数参数可以没有。
如main()。
函数体即函数说明部分下面的大括号{......}内的部分,如果一个函数内有多个大括号,则最外面的一对{}为函数体的范围。
函数体一般由说明语句和可执行语句两部分构成:
说明语句部分由变量定义、自定义类型定义、自定义函数说明、外部变量说明等组成;可执行语句部分一般由若干条可执行语句构成。
函数体中的说明语句部分必须在所有可执行语句之前。
§1.3C程序的编译和运行
一、程序的运行步骤
编辑
源程序文件.C
编译
目标程序文件.OBJ库函数的文件和
链接 其它目标程序文件
←───────────┘
可执行程序文件.EXE
运行
源程序就是用程序设计语言写成的解决各种问题的方法步骤。
程序设计语言与自然语言十分接近,同时它又便于转换(编译)成机器指令(即可执行文件)。
程序设计语言象自然语言一样,有很多种,常用的有BASIC,COBOL,C,C++,FORTRAN,PASCAL,汇编语言等,就象自然语言有汉语,英语,法语一样。
机器语言(machinelanguage):
计算机直接使用的二进制形式的程序语言或机器代码。
汇编语言(assemblerlanguage):
一种面向机器的用符号表示的低级程序设计语言。
相当于机器指令的助记符号,与机器语言很接近。
高级语言(high-levellanguage):
是易为人们所理解的完全符号化的程序设计语言。
源程序:
用户用高级语言编写的程序称为,C源程序文件名字后缀一般必须为".c“。
程序加工:
高级语言编写的程序,计算机不能直接执行,需要把这个程序转换成二进制代码的机器语言程序。
这种转换过程称为程序加工。
汇编程序(assembler):
将汇编语言程序翻译成机器语言程序的程序。
编译程序(compiler):
把用高级语言写的源程序转换为相应的机器语言目标模块(objectmodule)的程序。
编译:
目标模块包括程序及连接程序的控制信息。
目标程序文件名字后缀".obj"。
连接(linker):
将目标模块和其它一些必要的功能模块装配在一起,生成可执行文件,执行程序文件后缀为".exe"。
二、程序与源程序
一个程序可以包含一个或若干个源程序,一个源程序可以包含多个函数,一个程序可以包含多个函数,每个程序都必须有一个主函数,程序运行从其开始,在其结束。
三、TC集成环境的使用
用程序设计语言写出源程序,它并不为计算机处理器所识别并运行,必须把源程序编译成机器指令序列。
这个过程由专门的编译程序完成。
这里,我们选择TurboC2.0软件。
如何运行TurboC2.0软件?
进入Tc的目录,键入tc就可以进入TurboC集成开发环境了。
如果是初次运行,还必须做一些设置才能够使用。
用F10,光标移动键和回车键,按照下图打开设置菜单,
先设置Directories,第一行是include文件目录,在这里设成c:
\tc20\include;第二行是library目录,设成c:
\tc20\lib第三行为输出.EXE和.OBJ文件的目录,如果为空则输出到c:
\tc20目录下;第四行为Tc的目录,这里设为c:
\tc20;第五行是建立PICK文件,默认是TCPICK.TCP。
然后别忘了执行Option下面的菜单项:
SaveOptions,保存刚才设置的结果,否则下次运行还必须重新设置。
先输入一个简单的C程序,并保存为hello.c。
然后编译生成可执行文件。
编译成功后,屏幕如下。
来看看我们的程序执行的样子,先执行它:
程序执行很快,来不及看清运行结果,我们可以用Alt+F5组合键查看运行结果。
下面就是执行的结果啦。
随便按一个键返回蓝色的编辑窗口。
第二章程序的灵魂--算法
一、算法(algorithm):
是对特定问题求解步骤的一种描述。
1.什么是算法
为解决一个问题而采取的方法和步骤,就称为“算法”。
对同一个问题,可以有不同的解题方法和步骤,也就有不同的算法。
例如求可采用矩形法、梯形法、辛普生法(即抛物线法)等。
为了有效地解题,不仅需要保证算法正确,还要考虑算法的质量,选择较好的算法,或进行算法的优化。
2.算法的特点
一个算法,必须具有以下特点:
(1)仅有有限的操作步骤,即“有穷性”(无死循环)。
(2)算法的每一个步骤应当是确定的,即无“二义性”。
(3)有适当的输入,即有确定的条件。
(4)有输出结果。
没有输出的算法是无意义的。
(5)算法中的每一个步骤都应当有效执行(无死语句)。
3.算法的重要性
掌握最基本的、常用的算法是很重要的,算法设计是整个程序设计的核心。
著名计算机科学家沃思(Wirth)曾提出一个公式:
程序=算法+数据结构。
对初学者而言,数据结构即是语言提供的各种数据类型,无大难点。
这样编程的任务主要是考虑算法问题,当然还要学会基本的语句和语法。
算法要求:
正确性、可读性、健壮性、效率。
4.算法的表示方法
1)用自然语言表示
2)
用流程图表示
图2.1传统流程图常用符号
例1求,用传统流程图表示如下图2.2。
。
图2.2图2.3
例2求,用N-S结构化流程图表示如上图2.3
3)用伪代码表示
例3求,用伪代码来表示。
开始(BEGIN)
输入(Input)a,b,n
(b-a)/n→h
0→s
1→i
当(while)i<=n执行(do)
s+h*f(a+(i-1)*h)→s
i+1→i
循环到此结束(Enddo)
输出(Print)a,b,n,s
算法结束(END)
4)用计算机语言表示
二、
结构化程序的三种基本结构:
顺序结构、选择结构、循环结构
⒈顺序结构:
一条一条语句顺序往下执行
main()
{inta,b,c;
a=9;
b=-a--;
c=(a--)-b;
printf("a=%d,b=%d,c=%d\n",a,b,c);
}
⒉选择结构:
又叫分支结构
例、main()
{inta=2,b,c;
if(a)
{b=a;
c=a+b*b;
}
else例、main()
{b=3;{intx=0;
c=b*b;if(!
x)x=10;
a=c+b;}printf(“%d\n”,x);
}}.
⒊循环结构:
有两种
第三章数据类型、运算符与表达式
§3.1数据类型
C的数据类型有:
1、基本类型:
整型、字符型、实型(浮点型)、枚举型
2、构造类型:
数组类型、结构体类型、共用体类型
3、指针类型
4、空类型
§补:
数据的机器码表示
•内存由若干存储单元构成,一存储单元由若干字节构成。
若,一字节存放一个数据:
例、00000110(一字节有八位二进制位构成)
最高位最低位
若,两字节存放一个数据:
例、0000100000010001
最高位最低位
•表示有符号数时,最高位作为符号位0──正、1──负
例1、无符号数10000001,值=27+20=129
有符号数10000001,值=?
与采用的机器码有关
一、数的定点与浮点表示
计算机处理的数据可能既有整数部分又有小数部分,必须约定小数位置,可以有两种约定:
定点和浮点
例、(1011.10)2=(10111.0×2-1)2=(1.01110×211)2
对于二进制数N:
N=±S×2±J
尾符(或数符)尾数S底阶符阶码J
J固定不变──定点表示
J可变──浮点表示
⒈定点表示
一般取J=0,则N=±S“符号”占一位,0表示正、1表示负.
.
例、+11010100110101.
符号尾数小数点
+0.00100010000
符号小数点尾数
•小数点不占用二进制位,隐含在某固定位置上。
隐含在数的最低位之后,称定点整数;隐含在符号位之后、数的最高位之前,称定点小数。
•定点数表示范围受限。
⒉浮点表示
•基本思想:
把数的有效数字和数的表示范围分开表示
阶符阶码尾符尾数
表示范围有效数字
(或有效数字在前、表示范围在后)
例、x=(+101101)2=(+0.101101×2110)2
表示为01100101101
•浮点数的底不出现在浮点数中,一般隐含为2。
小数点也不出现在浮点数中,约定
尾数一定是纯小数
阶码一定是纯整数.
二、数据的机器码表示
机器码常用的有原码、反码、补码。
真值:
一般书写表示的数值,或者说机器所代表的实际值.
机器数:
表示一个数值数据的机内编码.一般采用补码形式。
⒈原码:
真值为:
x=±x1x2…xn
原码:
[x]原=0x1x2…xn,x≥0
1x1x2…xn,x≤0
例、(-5)10=(-0000101)2/*以下例子均以一字节存一个数为例*/
[+5]原=00000101
[-5]原=10000101
[+0]原=000000000的正负有区别
[-0]原=10000000
前例1、∵(10000001)原=-1
∴若10000001为原码,则其真值=-1
⒉反码:
真值:
x=±x1x2…xn
若xi=1,则xi=0(xi取反)
xi=0,则xi=1或[x]原=x0x1x2…xn
[x]反=0x1x2…xn,x≥0[x]反=[x]原,x≥0
1x1x2…xn,x≤0x0x1x2…xn,x≤0
例、[+5]反=00000101
[-5]反=11111010
[+0]反=000000000的正负有区别
[-0]反=11111111
前例1、∵(10000001)反=(11111110)原=(-1111110)2=(-126)10
∴若10000001为反码,则其真值=-126
⒊补码
⑴模:
例、16mod12=4(16点为下午4点),12就称为模数或称模12
·在模n下的意义:
x=n+x
例x=4时,4+12=4
例x=-5时,-5+12=-5即7=-5(mod12)
7和-5对于12互为补码
·若x<0时,正数“加上负数”可用“加上该负数对应的补码(正数)”实现:
例9+(-5)=9+7(mod12)
·在计算机中,n位二进制数的模为2n
⑵补码
真值:
x=±x1x2…xn[x]反=x0x1x2…xn
[x]补=0x1x2…xn,x≥0或[x]补=[x]反,x≥0
M+x,x≤0(M为模)[x]反+1,x≤0
(即末位加1)
例、[+5]补=00000101
[-5]补=11111010+1=11111011
[+0]补=000000000的补码是唯一的
[-0]补=11111111+1=00000000
前例1、∵(10000001)补=(10000000)反=(11111111)原=-127
∴10000001为原码,则其真值=-127
·但补码比反码、原码表示的数据多
例、[-128]补=10000000
∵八位二进制数的模M=28,而[x]补=M+x,x≤0(M为模)
∴[-128]补=[-10000000]补=28+(-10000000)=10000000
§3.2常量和变量
一、标识符、关键字、保留字
标识符:
程序设计过程用到的各类元素的名字,叫标识符。
C语言规定标识符只能由字母、数字、下划线组成,并且只能由字母、下划线开头。
如:
abc,a12,x是合法的标识符,abc$,12a,x+y不是合法的标识符。
关键字:
一些标识符被赋于特定的含义,如main,int等,叫关键字。
保留字:
一些关键字,被明文规定不许挪作它用,叫保留字。
C语言中,所有的关键字都是保留字,所以这两个词可以混用。
二、常量与变量
常量 在程序运行时,其值不能被改变的量叫常量。
如5,3.14159,3.618等。
符号常量 可以使用一个标识符表示常量,如:
PI表示3.14159,RETIREMENT表示退休年龄60等(C语言中写作#definePI3.14159,#defineRETIREMENT60),这样的标识符叫符号常量,一般大写。
符号常量使程序易于阅读和修改。
例如,一个程序中多处用到退休年龄60,当有一天退休年龄改为65岁时,修改这个程序很困难。
而使用符号常量,只要将#defineRETIREMENT60改为#defineRETIREMENT65,就可以了。
变量 在程序运行时,其值能被改变的量叫变量。
程序运行时,计算机给每个变量分配一定量的存储空间。
每个变量必须有一个类型,如整型、浮点型等,它指明给这个变量分配多大量的存储空间;每个变量还必须有一个名字,如x,y等,它指明是哪个变量;一般,一个变量还要有值,值放在变量的存储空间内。
三.整型与实型
int:
整型,整型变量表示整数。
在MSDOS上,每个整型变量分配16bit存储空间。
整型又分成两类,一类表示有符号整数,用1bit表示符号,15bit表示数值,可表示数值范围为-32768至32767。
一类表示无符号整数,16bit都表示数值,可表示数值范围为0至65535。
数值都用二进制存储。
例如:
inta;unsignedintdate;等。
十进制整型常量直接写数字,如:
5,100等;八进制整型常量数字前加0,如:
05,0100等;十六进制整型常量数字加0X,如:
0X5,0X100等。
short:
短整型,也可写成shortint,在MSDOS上,与整型相同。
long:
长整型,也可写成longint,表示较大的整数,在MSDOS上,每个长整型变量分配32bit存储空间。
长整型也分成两类,一类表示有符号整数,用1bit表示符号,31bit表示数值,可表示数值范围为-231至231-1。
一类表示无符号整数,32bit都表示数值,可表示数值范围为0至232-1。
数值都用二进制存储。
例如:
longinta;unsignedlongdate;等。
整型常量的值若超过了整型数范围,会自动被认为是长整型常量;整型常量也可以后加'L',强制置为长整型,如:
5L,100L等。
float:
浮点型,近似表示实数,在MSDOS上,每个浮点型变量分配32bit存储空间。
浮点型都是有符号的,可表示数值范围分为三段:
-1038至-10-38,0,10-38至1038。
数值都先化成指数,再用二进制存储。
7位有效数字。
例如:
floatx,y;等。
浮点型常量可以写成小数形式,如3.14159,也可以写成指数形式:
1.2E12(表示1.2*1012)。
double:
双精度型,近似表示更大实数,在MSDOS上,每个浮点型变量分配64bit存储空间。
双精度型都是有符号的,可表示数值范围分为三段:
-10308至-10-308,0,10-308至10308。
数值都先化成指数,再用二进制存储。
7位有效数字。
例如:
doublex,y;等。
双精度型常量可以写成小数形式,如3.14159,也可以写成指数形式:
1.2E12(表示1.2*1012)。
四、字符常量
字符型常量写成'A','@','\t','\65'等形式。
有一些特殊字符用转义符表示:
字符形式
功能
\n
换行
\t
横向跳格
\v
竖向跳格
\b
退格
\r
回车
\f
走纸换页
\\
反斜杠字符
\'
单引号
\ddd
8进制数表示的对应ASCII码字符
\xhh
16进制数表示的对应ASCII码字符
五、字符变量
char:
字符型,表示一个字符,如'A'-'Z','0'-'9','!
','%'等。
在MSDOS上,每个字符型变量分配8bit(1byte)存储空间。
字符型变量用二进制存储字符的ASCII码值。
例如:
一个变量存储字符'A',实际上是存储'A'的ASCII值:
65。
六、字符数据的存储与输入输出
字符型也分成两类,一类有符号,用1bit表示符号,7bit表示数值,可表示数值范围为-128至127。
一类无符号,8bit都表示数值,可表示数值范围为0至255。
main()
{charc;
unsignedchard;
c