《高级语言程序设计》教案.docx
《《高级语言程序设计》教案.docx》由会员分享,可在线阅读,更多相关《《高级语言程序设计》教案.docx(80页珍藏版)》请在冰豆网上搜索。
《高级语言程序设计》教案
《高级语言程序设计》教案
第1章
C语言程序设计概述
教学目标:
了解程序设计语言的发展历史及其支持环境;熟悉C语言程序上机实验操作步骤;了解C语言程序的基本结构以及学会使用库函数和用户自定义函数组装C程序。
教学重点:
C语言程序上机实验操作步骤;用库函数和用户自定义函数组装C程序。
教学难点:
用用户自定义函数组装C程序。
§1.1程序与程序设计语言
程序设计语言是人与计算机进行信息交流的工具。
程序设计是一种编写计算机程序的活动。
由于计算机是一种专门用程序来解决特定问题的通用工具,因而程序设计是为解决某一特定问题而构造一种专用工具的活动。
程序是实体在计算机内部的表示。
实体具有一个名字,一组表示该实体特征的数据以及若干作用在这些数据上的行为。
实体具有的数据表示它的状态,而这些状态可由实体的行为来改变。
例如,银行帐户是实体,存款和取款是该实体的行为。
1.1.1程序设计语言的发展
程序设计语言伴随着计算机技术的进步而不断升级换代,通常人们将程序设计语言的发展分为以下四个阶段。
(1)机器语言
机器语言是一种CPU的指令系统,它是该CPU可以识别的一组由0和1序列构成的指令代码。
下面是某CPU指令系统中的两条指令:
10000000加
10010000减
用机器语言编写程序,就是从所使用的CPU的指令系统中挑选合适的指令,组成一个指令系列。
这种程序虽然可以被机器直接理解和执行,但是由于它们不直观、难记、难认、难理解、不易查错,只能被少数专业人员掌握,同时程序的生产效率很低,质量难以保证。
这种繁重的手工方式与高速、自动的计算机极不相称。
(2)汇编语言
为减轻人们在编程中的劳动强度,20世纪50年代中期人们开始用一些“助记符”代表0,1编程。
例如,前面的两条机器指令可以定成:
ADDA,B
SUBA,B
这种用助记符号描述的指令系统,称为符号语言或汇编语言。
用汇编语言编程,程序的生产率及质量都有所提高。
但是汇编语言指令是机器不能直接识别、理解和执行的。
用它编写的程序经检查无误后,要先翻译成机器语言程序才能被机器理解、执行。
这个翻译过程称为“代真”。
代真之后得到的机器语言程序称目标程序,代真之前的程序称为源程序。
机器语言和汇编语言都依赖于具体的计算机,是一种面向机器的程序设计语言。
面向机器的语言可以编制出效率极高的程序,但是需要程序员熟悉机器的内部结构,并且要“手工”地进行存储器分配。
这种编程劳动强度很大,给计算机的普及推广造成很大的障碍。
(3)高级语言
机器语言和汇编语言是面向机器的,随机器而异。
1954出现的FORTRAN语言以及随后相继再现的其它高级语言,使人们开始摆脱进行程序设计必须先熟悉机器的桎梏,把精力集中于解题思路和方法,使程序设计语言开始与解题方法相结合。
其中一种方法是把解题过程看作是数据被加工的过程。
基于这种方法的程序设计语言称为面向过程的程序设计语言。
C语言就是一种面向过程的程序设计语言。
使用高级语言编程可以大大地降低编程过程的劳动强度,提高编程效率。
高级语言的诞生是计算机技术发展史上的一个里程碑。
它使人们能摆脱具体机器指令系统的束缚,用接近人们习惯的语言来构思解题过程,从而大大提高了编程效率,使人们能够编制出越来越大的程序,以满足日益广泛而深入的应用需求。
实际上,程序是对现实世界的动态状态的模拟。
面向过程的程序设计认为,每个程序都要完成一些规定的功能。
每个功能的实现是通过对数据进行一系列的加工的过程而实现的。
因而程序设计包括组织数据—设计数据结构,以及设计对数据结构进行加工的过程—设计算法两个部分。
N.wirth给出一个著名的公式:
程序=数据结构+算法。
(4)面向对象的程序设计语言
面向对象的程序设计是一种结构模拟方法,它把现实世界看成是由许多对象组成。
对象与对象之间通过相互发送和接收消息进行联系。
消息激发对象本身的运动,形成对象状态的变化。
从程序结构的角度来看,每个对象都是一个数据和方法的封装体—抽象数据类型。
从分类学的观点来看,客观世界中的对象都是可以分类的。
也就是说,所有的对象都属于特定的类,或者说每一个对象都是类的一个实例。
因而,面向对象的程序设计的一个关键是定义类,并由类生成对象。
面向对象的程序比面向过程的程序更清晰、易懂,更适宜编写更大规模的程序,已为成为当代程序设计的主流。
面向对象的程序设计语言很多,其中广泛使用的一种语言是C++。
C++语言是一种多范型程序设计语言,不仅可以用它编写面向对象的程序,还可以用它编写面向过程的程序。
1.1.2程序设计语言的支持环境
操作系统是各种软件中最重要的一种,它是各种软件的核心与基础,所有其它软件的运行都要在操作系统的控制下进行。
操作系统的作用是有效地组织和利用计算机的软、硬件资源,使各种程序都能在操作系统的管理下协调工作。
P3图1.2表示用高级语言书写的源程序必须经过高级语言编译系统处理(编译),然后在操作系统控制下才能被计算机执行。
操作系统的主要功能包括CPU管理、存储器管理、设备管理、文件管理和作业管理等。
不同操作系统的功能和工作方式是不同的。
目前,广泛流行的操作系统有WINDOWS和UNIX。
源程序的编辑、编译、连接与执行
C语言采用编译方式将源程序转换成二进制的目标代码。
编写好一个C程序到完成运行一般经过以下几个步骤:
(1)编辑:
编辑包括以下内容:
将源程序中的字符逐个输入到计算机内存;修改源程序;将修改好的源程序保存在磁盘文件中。
编辑的对象是源程序,它是以ASCII代码的形式输入和存储的,不能被计算机执行。
(2)编译:
编译就是将已编辑好的源程序翻译成二进制的目标代码。
在编译时,还要对源程序进行语法(用来刻划什么样的符号串可组成一个有效的程序)检查,如果发现有错,则在屏幕上显示出错提示信息,此时应重新进入编辑状态,对源程序进行修改后再重新编译,直到通过编译为止。
应当指出,经过编译之后得到的二进制代码还不能直接执行,因为每一个模块往往是单独编译的,必须把经过编译的各个模块的目标代码与系统提供的标准模块(例如,C语言中的标准函数)连接后才能执行。
(3)连接:
将各模块的二进制目标代码与系统标准模块经过连接处理后,得到具有绝对地址的可执行文件,它是计算机能够直接执行的文件。
(4)执行:
执行一个经过编译和连接的可执行的目标文件。
只有在操作系统的支持和管理下才能执行可执行的目标文件。
集成化的工具环境已将编辑、编译、连接、调试工具集于一身(例如,TURBOC2.0),用户可以很方便地在窗口下连续进行编辑、编辑、连接、调试、运行的全过程。
§1.2C语言的历史和特点
1.2.1C语言的历史
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.Kernigha和DennisM.Ritchie合著了影响深远的《TheCProgrammingLanguage》,书中介绍的C语言称为标准C。
1983年,美国国家标准化协会(ANSI)制定了新的标准,称为ANSIC。
现在微机上常用的C语言编译系统有MicrosoftC,TurboC,QuickC。
我们的教材选用的是TurboC2.0版本。
1.2.2C语言的特点
1.语言简洁,表达能力强
语言简洁、紧凑,使用方便、灵活。
一共只有32个关键字,9种控制语句;
运算符丰富。
共有34种运算符;
数据结构丰富,便于数据的描述与存储;
具有结构化的控制语句;
强大的库函数,用函数作为程序模块以实现程序的模块化;
语法限制不太严格,程序设计自由度大。
2.融合高、低级语言的中级语言
具有高级语言基本结构;
可直接对硬件进行操作,允许直接访问物理地址;
生成的代码质量高,生成目标程序运行速度高,占有内存少,程序执行效率高。
3.可移植性好:
独立于具体机器。
§1.3用库函数组装C程序
从语言学的角度来看,通常语言都具有如下的体系结构:
符号=>字=>词=>短语=>句子=>段落=>篇章
计算机语言属于语言范畴,当然满足这种普遍规律。
但是与自然语言相比,由于其受到使用环境的约束,计算机语言在语义(描述的是用这种语言编写程序的含义)上要简单得多。
例如,单词词汇相对较少,句子类型相对较少等等。
但是麻雀虽小,五脏俱全。
C语言的体系结构如下:
字符=>标识符、常量、运算符、分界符=>表达式=>语句=>函数(库函数和用户自定义函数)=>程序
可见C语言的结构和自然语言的结构基本保持一致。
C语言本身提供的语句很少,许多功能都是通过函数来实现的。
例如输入输出功能并不是C语言本身提供的,而是C的库函数所提供的。
这样做的目的是使C语言的核心部分规模较小,而外围(函数)可以做得丰富,并且可以根据需要增加新的函数,使C语言具有较大的灵活性和多方面的功能。
在编写C程序时应尽量使用C的库函数所提供的函数功能来实现自己的目的。
例1.1:
显示“Programisfun”信息。
main()
{
printf(“Programisfun\n”);
}
说明:
(1)C程序是由函数组成的,每一个函数完成相对独立的功能。
main是函数名,函数名后面一对圆括号是写参数的,本程序中main函数没有参数故不写,但是一对圆括号不能省略。
一个完整的C程序必须有一个称为主函数的main函数,main函数在程序中的位置可以改变,但是程序总是从main函数开始执行。
main函数后面有一对花括号,花括号中的内容称为函数体。
函数体通常由变量说明部分和语句执行部分组成。
变量说明部分的作用是定义数据类型,语句执行部分给出操作指令以便实现函数功能。
语句执行部分又由若干条语句组成。
C语言中规定每条语句以分号结束,分号是语句不可缺少的组成部分。
(2)printf是C库函数中的一个函数,它的功能是按照指定的输出格式在显示器上显示指定的内容。
字符串末尾的字符‘\n’是C语言中的一个转义字符,其作用是“回车换行”。
注意:
printf在输出时实际上是将字符‘\n’转换成“回车”符和“换行”符后再进行输出的。
(3)函数printf由主函数main调用。
例1.2计算一个数的正弦值。
#include"math.h"
main()
{
floatx;
x=sin(0.19199);/*调用sin函数*/
printf("%f\n",x);
}
说明:
(1)语句“floatx;”的作用是声明x是一个实型变量。
(2)语句“x=sin(0.19199);”的作用是执行一次函数调用,求出0.19199弧度的正弦值,并送给左边的实型变量x。
sin是C系统的库函数,在调用数学库函数时,要用到一些系统提供的信息,这些信息包含在math.h头文件中。
编译命令#include“math.h”的作用是将math.h文件的内容代替这行#include命令,也就是使该文件的内容被整个地调到main的前面。
printf函数和scanf函数的定义在头文件“stdio.h”中,在TC2.0中使用printf函数和scanf函数时可以不需要使用#include“stdio.h”命令将该文件显式地包含进来,但在BC3.1中使用printf函数和scanf函数时必须使用#include“stdio.h”命令将该文件显式地包含进来。
(3)printf函数括号中的内容分为两部分:
双引号内的部分是格式字符串,用它指定输出时的打印格式,双引号外的部分是输出项列表。
(4)符号“/*”与“*/”之间的内容为注释信息。
注释信息对程序的运行结果不发生任何影响,只是为了帮助人们更好地理解程序中有关部分的功能。
§1.4用自己设计的C函数组装C程序
用库函数组装C程序是程序设计的一条捷径和重要方法。
但是任何函数库都不可能是包罗万象的,当我们在函数库中找不到所需功能的函数时,便要动手设计自己所需要的函数。
设计的基本方法是从主函数开始,按调用关系,自上而下地进行。
例1.3求三个数的平均值。
main()
{
floata,b,c,ave;
a=3.5;b=4.6;c=7.9;
ave=average(a,b,c);
printf("average=%f",ave);
}
说明:
语句“ave=average(a,b,c);”定义了一个复合操作。
它的执行过程是首先调用一个函数average,该函数的实在参数是a,b,c,然后再把函数average的计算结果赋给变量ave。
那么究竟函数average要进行怎样的运算呢?
这要根据average的定义来确定。
这个定义可以由系统预先定义好放在函数库中,也可以由程序员自己定义。
这里我们需要一个求三个数平均值的函数,但从库函数中找不到求三个数平均值的函数,因此就需要自己设计一个average函数来实现上述功能。
函数average的定义如下所示:
floataverage(floata,floatb,floatc)
{
floataver;
aver=(a+b+b)/3;
return(aver);
}
说明:
“floataverage(floatx,floaty,floatz)”称为函数首部,用于说明函数的名称,返回值的类型,以及对什么样的数据进行操作。
函数体中的return语句的作用是将运算结果aver的值返回主调函数。
函数定义中所使用的参数称为形式参数(例如,average函数中的a,b,c)。
注意:
形式参数只用于描述被加工的数据是一种什么样的角色,以及如何对它们进行加工,并不说明也不可能说明哪些具体的数据被加工,具体的数据由函数调用语句在调用时从对应的实在参数传递给形式参数。
例1.4求任意三个数的平均值。
上面的例子是求三个固定数的平均值,这三个数是在main函数中用赋值语句确定的。
本例中不用赋值语句确定三个变量的值,而从键盘上输入三个实数,以增加程序的灵活性。
只要将上例main函数中的第四行赋值语句改写成以下输入语句就可满足本题的要求:
scanf(“%f,%f,%f”,&a,&b,&c);
说明:
scanf函数是C语言提供的库函数,它的功能是从键盘上输入所需要的数据并赋给有关变量。
在定义变量a,b,c后,系统编译时给变量a,b,c在内存中分配固定的存储单元。
&a,&b,&c分别表示变量a,b,c所对应的存储单元的地址。
语句:
scanf(“%f,%f,%f”,&a,&b,&c);
的含义是把从键盘输入的三个数送到地址&a,&b,&c的单元中去。
例1.5求两个数中的最大数。
main()
{
floata,b;
scanf("%f%f",&a,&b);
if(a>b)printf("%f\n",a);elseprintf("%f\n",b);
}
说明:
if语句的功能是通过对变量a和b的值进行比较,决定输出变量a的值还是输出变量b的值。
也可以定义一个求两个数中最大数的函数max2。
在主函数main中调用max2求出变量a和b中最大的数,并把此数赋给变量max,最后通过printf函数输出变量max的值。
floatmax2(floatx,floaty)
{
floatz;
if(x>y)z=x;elsez=y;
return(z);
}
main()
{
floata,b,max;
scanf("%f%f",&a,&b);
max=max2(a,b);
printf("maxis%f\n",max);
}
例1.6求1+2+3+…+10的值。
main()
{
intsum,i;sum=0;i=1;
while(i<=10){sum=sum+i;i=i+1;}
printf("%d\n",sum);
}
说明:
while语句是循环语句,它的范围是其后由一对花括号括起来的一个复合语句,它的作用是使sum在原来零的基础上加1、加2、…、直到加到10为止。
While后面的一对花括号是循环体,包含一条或若条个语句,当i>10时就不再执行循环体。
也可以将1+2+3+…+n定义成一个函数sigma。
通过在main中调用sigma函数完成求1+2+3+…+10的和。
sigma函数定义如下所示:
intsigma(intn)
{
inti,sum;
i=1;sum=0;
while(ireturn(sum);
}
小结:
本章主要介绍了程序设计语言的发展及其支持环境;C语言程序上机操作步骤;C语言程序的基本结构以及用库函数和用户自定义函数组装C程序。
第2章
C语言的基本数据类型与表达式
教学目标:
了解数据类型的概念以及数据类型的分类;了解数值型数据和字符型数据在内存中的存储形式;掌握整型常量、实型常量、字符型常量和字符串常量的书写格式;掌握变量的概念、声明、初始化和对变量的赋值;掌握标识符的命名规则及其分类;掌握算术运算符、关系运算符、逻辑运算符、条件运算符以及由这些运算符构成的表达式;了解不同数据类型的隐式转换和显式转换;掌握标准输入输出函数的正确使用。
教学重点:
整型常量、实型常量、字符型常量和字符串常量的书写格式;变量的概念、声明、初始化和对变量的赋值;算术运算符、关系运算符、逻辑运算符、条件运算符以及由这些运算符构成的表达式;标准输入输出函数的正确使用。
教学难点:
数据类型的概念;数值型数据的定点表示和浮点表示;自加自减算术运算符;逻辑运算符产生的短路现象;不同类型数据之间的转换;标准输入和输出函数的正确使用。
§2.1C语言的基本数据类型
面向过程的程序设计认为解题过程是对数据的加工过程,因此数据和操作是构成程序的两个基本要素。
本章主要介绍C语言描述数据的形式以及对数据的基本操作。
数据是程序的必要组成部分,也是程序的处理对象。
高级语言中广泛使用“数据类型”这一概念。
数据类型是对程序中被处理数据的抽象。
C语言规定在程序中使用的每个数据都属于一种数据类型。
C语言提供了丰富的数据类型,这些类型分为以下几类:
(1)基本数据类型(简单数据类型):
整型(短整型short、整型int和长整型long)、实型(单精度实型float和双精度实型double)、字符型char和枚举类型enum。
(2)构造数据类型(组合数据类型):
数组类型、结构体类型struct、共用体类型union和文件类型FILE。
(3)指针类型
(4)空类型(void)
构造类型数据是由基本类型数据按一定的规律构造而成的。
本节只介绍基本数据类型(枚举类型除外),其它类型在后续各章中陆续介绍。
2.1.1数值的定点表示形式与浮点表示形式
(1)浮点数:
浮点数由尾数和指数两部分构成。
由于指数的存在以及它的大小不同而使尾数部分的小数点位置不同,即小数点的位置是浮动的,这种形式称为浮点数形式。
在计算机内部,凡实数都以浮点形式存储,一个实数用4个字节存储,其中3个字节用来存放尾数,1个字节用来存放指数。
(2)定点数:
凡是不带指数部分的数称为定点数。
在计算机内部整数用简单的不带指数部分的若干个0和1的序列表示。
例如,整数10的16位二进制存储形式是0000000000001010。
2.1.2字符类型数据的表示和存储形式
字符类型数据在计算机内部以相应的ASCII码存放。
ASCII码规定用一个字节(8位)来存储字符型数据,故可以表示256种不同的字符,字符编号为0~255。
例如,字符‘a’的ASCII码为97,在内存中用01100001来表示。
在C语言中,字符型数据在内存中是以其对应的ASCII码存储的,因此字符型数据和整型数据在一定的范围(ASCII码表示的范围)内是互相通用的。
例如,字符型数据可以作为整数参加运算以及字符型数据可以用数值形式输出。
例2.1分析下列程序运行结果。
main()
{
charch;inti;
ch=‘A’;ch=ch+32;i=ch;
printf(“%dis%c\n”,i,ch);
printf(“%cis%d\n”,ch,ch);
}
2.1.3数据的存储空间长度及取值范围
C语言对不同数据类型的数据分配不同长度的存储空间。
其中char类型数据分配1个字节,表示范围为0~255;int类型数据分配2个字节,表示范围为-32768~32767;long类型数据分配4个字节,表示范围为-231~231-1;float类型数据分配4个字节,表示范围的绝对值在3.4E10-38~3.4E1038;double类型数据分配8个字节,表示范围的绝对值在1.7E10-308~1.7E10308。
C语言提供了一个测定某一种类型数据所占存储空间长度的运算符sizeof,它的语法格式为:
sizeof(类型标识符)
例2.2用sizeof测试各种基本数据类型的长度。
main()
{
printf("%d\n",sizeof(char));printf("%d\n",sizeof(short));
printf("%d\n",sizeof(int));printf("%d\n",sizeof(long));
printf("%d\n",sizeof(float));printf("%d\n",sizeof(double));
}
2.1.4带符号的数据类型和无符号的数据类型
在计算机内存中存储整数时,一般用其最高位表示数的符号,用0表示正,1表示负。
数值是以补码形式存放的,一个正数的补码就是该数的二进制数,一个负数的补码就是该数绝对值的补码取反加1。
例如,整数14的8位补码为00001110,整数-14的8位补码为11110010。
显然,所有负数的二进制补码的最高位必然是1。
整型数据(short,int,long)都是带符号的。
C语言中还允许使用无符号整数,它将二进制形式的最高位不作为符号位,而与右面的各位一起用来表示数值。
例如,8位二进制位表示11110010表示242,8位二进制位00001110表示14。
无符号整数与同样长度的有符号整数相比,它所能表示的数的最大值相当于扩大了