1、高级语言程序设计教案湖北师范学院计算机科学系高级语言程序设计 湖北师范学院计算机科学系 - 2 -第 1 章 C 语言程序设计概述教学目标:了解程序设计语言的发展历史及其支持环境;熟悉 C 语言程序上机实验操作步骤;了解 C 语言程序的基本结构以及学会使用库函数和用户自定义函数组装 C 程序。教学重点:C 语言程序上机实验操作步骤;用库函数和用户自定义函数组装 C 程序。教学难点:用用户自定义函数组装 C 程序。1.1 程序与程序设计语言程序设计语言是人与计算机进行信息交流的工具。程序设计是一种编写计算机程序的活动。由于计算机是一种专门用程序来解决特定问题的通用工具,因而程序设计是为解决某一特
2、定问题而构造一种专用工具的活动。程序是实体在计算机内部的表示。实体具有一个名字,一组表示该实体特征的数据以及若干作用在这些数据上的行为。实体具有的数据表示它的状态,而这些状态可由实体的行为来改变。例如,银行帐户是实体,存款和取款是该实体的行为。1.1.1 程序设计语言的发展程序设计语言伴随着计算机技术的进步而不断升级换代,通常人们将程序设计语言的发展分为以下四个阶段。(1) 机器语言机器语言是一种 CPU 的指令系统,它是该 CPU 可以识别的一组由 0 和 1 序列构成的指令代码。下面是某 CPU 指令系统中的两条指令:10000000 加10010000 减用机器语言编写程序,就是从所使用
3、的 CPU 的指令系统中挑选合适的指令,组成一个指令系列。这种程序虽然可以被机器直接理解和执行,但是由于它们不直观、难记、难认、难理解、不易查错,只能被少数专业人员掌握,同时程序的生产效率很低,质量难以保证。这种繁重的手工方式与高速、自动的计算机极不相称。(2) 汇编语言为减轻人们在编程中的劳动强度,20 世纪 50 年代中期人们开始用一些“助记符”代表 0,1 编程。例如,前面的两条机器指令可以定成:ADD A,BSUB A,B这种用助记符号描述的指令系统,称为符号语言或汇编语言。用汇编语言编程,程序的生产率及质量都有所提高。但是汇编语言指令是机器不能直接识别、理解和执行的。用它编写的程序经
4、检查无误后,要先翻译成机器语言程序才能被机器理解、执行。这个翻译过程称为“代真” 。代真之后得到的机器语言程序称目标程序,代真之前的程序称为源程序。机器语言和汇编语言都依赖于具体的计算机,是一种面向机器的程序设计语言。面向机器的语言可以编制出效率极高的程序,但是需要程序员熟悉机器的内高级语言程序设计 湖北师范学院计算机科学系 - 3 -部结构,并且要“ 手工” 地进行存储器分配。这种编程劳动强度很大,给计算机的普及推广造成很大的障碍。(3) 高级语言机器语言和汇编语言是面向机器的,随机器而异。1954 出现的 FORTRAN 语言以及随后相继再现的其它高级语言,使人们开始摆脱进行程序设计必须先
5、熟悉机器的桎梏,把精力集中于解题思路和方法,使程序设计语言开始与解题方法相结合。其中一种方法是把解题过程看作是数据被加工的过程。基于这种方法的程序设计语言称为面向过程的程序设计语言。C 语言就是一种面向过程的程序设计语言。使用高级语言编程可以大大地降低编程过程的劳动强度,提高编程效率。高级语言的诞生是计算机技术发展史上的一个里程碑。它使人们能摆脱具体机器指令系统的束缚,用接近人们习惯的语言来构思解题过程,从而大大提高了编程效率,使人们能够编制出越来越大的程序,以满足日益广泛而深入的应用需求。实际上,程序是对现实世界的动态状态的模拟。面向过程的程序设计认为,每个程序都要完成一些规定的功能。每个功
6、能的实现是通过对数据进行一系列的加工的过程而实现的。因而程序设计包括组织数据设计数据结构,以及设计对数据结构进行加工的过程设计算法两个部分。N.wirth 给出一个著名的公式:程序= 数据结构+ 算法。(4) 面向对象的程序设计语言面向对象的程序设计是一种结构模拟方法,它把现实世界看成是由许多对象组成。对象与对象之间通过相互发送和接收消息进行联系。消息激发对象本身的运动,形成对象状态的变化。从程序结构的角度来看,每个对象都是一个数据和方法的封装体抽象数据类型。从分类学的观点来看,客观世界中的对象都是可以分类的。也就是说,所有的对象都属于特定的类,或者说每一个对象都是类的一个实例。因而,面向对象
7、的程序设计的一个关键是定义类,并由类生成对象。面向对象的程序比面向过程的程序更清晰、易懂,更适宜编写更大规模的程序,已为成为当代程序设计的主流。面向对象的程序设计语言很多,其中广泛使用的一种语言是 C+。C+语言是一种多范型程序设计语言,不仅可以用它编写面向对象的程序,还可以用它编写面向过程的程序。1.1.2 程序设计语言的支持环境操作系统是各种软件中最重要的一种,它是各种软件的核心与基础,所有其它软件的运行都要在操作系统的控制下进行。操作系统的作用是有效地组织和利用计算机的软、硬件资源,使各种程序都能在操作系统的管理下协调工作。P3图 1.2 表示用高级语言书写的源程序必须经过高级语言编译系
8、统处理(编译) ,然后在操作系统控制下才能被计算机执行。操作系统的主要功能包括 CPU 管理、存储器管理、设备管理、文件管理和作业管理等。不同操作系统的功能和工作方式是不同的。目前,广泛流行的操作系统有 WINDOWS 和 UNIX。源程序的编辑、编译、连接与执行C 语言采用编译方式将源程序转换成二进制的目标代码。编写好一个 C 程序到完成运行一般经过以下几个步骤:高级语言程序设计 湖北师范学院计算机科学系 - 4 -(1) 编辑:编辑包括以下内容:将源程序中的字符逐个输入到计算机内存;修改源程序;将修改好的源程序保存在磁盘文件中。编辑的对象是源程序,它是以 ASCII 代码的形式输入和存储的
9、,不能被计算机执行。(2) 编译:编译就是将已编辑好的源程序翻译成二进制的目标代码。在编译时,还要对源程序进行语法(用来刻划什么样的符号串可组成一个有效的程序)检查,如果发现有错,则在屏幕上显示出错提示信息,此时应重新进入编辑状态,对源程序进行修改后再重新编译,直到通过编译为止。应当指出,经过编译之后得到的二进制代码还不能直接执行,因为每一个模块往往是单独编译的,必须把经过编译的各个模块的目标代码与系统提供的标准模块(例如,C 语言中的标准函数)连接后才能执行。(3) 连接:将各模块的二进制目标代码与系统标准模块经过连接处理后,得到具有绝对地址的可执行文件,它是计算机能够直接执行的文件。(4)
10、 执行:执行一个经过编译和连接的可执行的目标文件。只有在操作系统的支持和管理下才能执行可执行的目标文件。集成化的工具环境已将编辑、编译、连接、调试工具集于一身(例如,TURBO C 2.0) ,用户可以很方便地在窗口下连续进行编辑、编辑、连接、调试、运行的全过程。1.2 C 语言的历史和特点1.2.1 C 语言的历史Algol 60 CPL BCPL B C 旧标准 C ANSI C C+ Visual C+ (新标准 C) 1960 1963 1967 1970 1972 1978 1983语言的诞生与发展:在 C 语言诞生以前,系统软件主要是用汇编语言编写的。由于汇编语言程序依赖于计算机硬
11、件,其可读性和可移植性都很差;但一般的高级语言又难以实现对计算机硬件的直接操作(这正是汇编语言的优势) ,于是人们盼望有一种兼有汇编语言和高级语言特性的新语言。语言是贝尔实验室于 70 年代初研制出来的,后来又被多次改进,并出现了多种版本。80 年代初,美国国家标准化协会(ANSI) ,根据语言问世以来各种版本对语言的发展和扩充,制定了 ANSI C 标准(1989 年再次做了修订) 。ALGOL60( 1960,面向问题的高级语言,不宜用来编写系统程序)CPL(1963,英国剑桥大学,规模较大)BCPL(1967,剑桥大学 Matin Richards,作了简化)B(1970,美国贝尔实验室
12、 Ken Thompson,进一步简化,又过于简单,功能有限)C(1972-1973,贝尔实验室 D.M.Ritchie,保持了精练,接近硬件的优点,克服了 B 语言过于简单的缺点)1973 年,K.Thompson 和 D.M.Ritchie 合作用 C 改写 UNIX(第 5 版) 。1975 年出的的 UNIX 第 6 版使人们普遍注意 C 语言。高级语言程序设计 湖北师范学院计算机科学系 - 5 -以 1978 年发表的 UNIX 第 7 版中的 C 编译程序为基础,Brian W.Kernigha和 Dennis M.Ritchie 合著了影响深远的The C Programming
13、 Language ,书中介绍的 C 语言称为标准 C。1983 年,美国国家标准化协会(ANSI)制定了新的标准,称为 ANSI C。现在微机上常用的 C 语言编译系统有 Microsoft C,Turbo C,Quick C。我们的教材选用的是 Turbo C 2.0 版本。1.2.2 C 语言的特点1语言简洁,表达能力强语言简洁、紧凑,使用方便、灵活。一共只有 32 个关键字,9 种控制语句;运算符丰富。共有 34 种运算符;数据结构丰富,便于数据的描述与存储;具有结构化的控制语句;强大的库函数,用函数作为程序模块以实现程序的模块化;语法限制不太严格,程序设计自由度大。2融合高、低级语言
14、的中级语言具有高级语言基本结构;可直接对硬件进行操作,允许直接访问物理地址;生成的代码质量高,生成目标程序运行速度高,占有内存少,程序执行效率高。3可移植性好:独立于具体机器。1.3 用库函数组装 C 程序从语言学的角度来看,通常语言都具有如下的体系结构:符号=字=词= 短语=句子=段落=篇章计算机语言属于语言范畴,当然满足这种普遍规律。但是与自然语言相比,由于其受到使用环境的约束,计算机语言在语义(描述的是用这种语言编写程序的含义)上要简单得多。例如,单词词汇相对较少,句子类型相对较少等等。但是麻雀虽小,五脏俱全。C 语言的体系结构如下:字符=标识符、常量、运算符、分界符=表达式=语句=函数
15、(库函数和用户自定义函数)= 程序可见 C 语言的结构和自然语言的结构基本保持一致。C 语言本身提供的语句很少,许多功能都是通过函数来实现的。例如输入输出功能并不是 C 语言本身提供的,而是 C 的库函数所提供的。这样做的目的是使C 语言的核心部分规模较小,而外围(函数)可以做得丰富,并且可以根据需要增加新的函数,使 C 语言具有较大的灵活性和多方面的功能。在编写 C 程序时应尽量使用 C 的库函数所提供的函数功能来实现自己的目的。例 1.1:显示“Program is fun”信息。main( )printf(“Program is funn”);说明:高级语言程序设计 湖北师范学院计算机科
16、学系 - 6 -(1) C 程序是由函数组成的,每一个函数完成相对独立的功能。main 是函数名,函数名后面一对圆括号是写参数的,本程序中 main 函数没有参数故不写,但是一对圆括号不能省略。一个完整的 C 程序必须有一个称为主函数的 main 函数,main 函数在程序中的位置可以改变,但是程序总是从 main 函数开始执行。main 函数后面有一对花括号,花括号中的内容称为函数体。函数体通常由变量说明部分和语句执行部分组成。变量说明部分的作用是定义数据类型,语句执行部分给出操作指令以便实现函数功能。语句执行部分又由若干条语句组成。C 语言中规定每条语句以分号结束,分号是语句不可缺少的组成
17、部分。(2) printf 是 C 库函数中的一个函数,它的功能是按照指定的输出格式在显示器上显示指定的内容。字符串末尾的字符n是 C 语言中的一个转义字符,其作用是“回车换行 ”。注意:printf 在输出时实际上是将字符n转换成“回车” 符和“换行”符后再进行输出的。(3) 函数 printf 由主函数 main 调用。例 1.2 计算一个数的正弦值。#include “math.h“main( ) float x;x=sin(0.19199); /*调用 sin 函数*/printf(“%fn“,x);说明:(1) 语句“float x;” 的作用是声明 x 是一个实型变量。(2) 语句
18、“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”命令将该文件
19、显式地包含进来,但在 BC3.1 中使用 printf 函数和 scanf 函数时必须使用#include “stdio.h”命令将该文件显式地包含进来。(3) printf 函数括号中的内容分为两部分:双引号内的部分是格式字符串,用它指定输出时的打印格式,双引号外的部分是输出项列表。(4) 符号“/*”与“*/”之间的内容为注释信息。注释信息对程序的运行结果不发生任何影响,只是为了帮助人们更好地理解程序中有关部分的功能。1.4 用自己设计的 C 函数组装 C 程序用库函数组装 C 程序是程序设计的一条捷径和重要方法。但是任何函数库都不可能是包罗万象的,当我们在函数库中找不到所需功能的函数时,
20、便要动手设计自己所需要的函数。设计的基本方法是从主函数开始,按调用关系,自上而下地进行。例 1.3 求三个数的平均值。main( )高级语言程序设计 湖北师范学院计算机科学系 - 7 -float a,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 要进行怎样
21、的运算呢?这要根据 average 的定义来确定。这个定义可以由系统预先定义好放在函数库中,也可以由程序员自己定义。这里我们需要一个求三个数平均值的函数,但从库函数中找不到求三个数平均值的函数,因此就需要自己设计一个 average 函数来实现上述功能。函数 average 的定义如下所示:float average(float a,float b,float c)float aver;aver=(a+b+b)/3;return(aver);说明:“float average(float x,float y,float z)”称为函数首部,用于说明函数的名称,返回值的类型,以及对什么样的数据进
22、行操作。函数体中的 return 语句的作用是将运算结果 aver 的值返回主调函数。函数定义中所使用的参数称为形式参数(例如,average 函数中的 a,b,c) 。注意:形式参数只用于描述被加工的数据是一种什么样的角色,以及如何对它们进行加工,并不说明也不可能说明哪些具体的数据被加工,具体的数据由函数调用语句在调用时从对应的实在参数传递给形式参数。例 1.4 求任意三个数的平均值。上面的例子是求三个固定数的平均值,这三个数是在 main 函数中用赋值语句确定的。本例中不用赋值语句确定三个变量的值,而从键盘上输入三个实数,以增加程序的灵活性。只要将上例 main 函数中的第四行赋值语句改写
23、成以下输入语句就可满足本题的要求:scanf(“%f,%f,%f”,说明:scanf 函数是 C 语言提供的库函数,它的功能是从键盘上输入所需要的数据并赋给有关变量。在定义变量 a,b,c 后,系统编译时给变量 a,b,c 在内存中分配固定的存储单元。的含义是把从键盘输入的三个数送到地址scanf(“%f%f“,if (ab) printf(“%fn“,a); else printf(“%fn“,b);高级语言程序设计 湖北师范学院计算机科学系 - 8 -说明:if 语句的功能是通过对变量 a 和 b 的值进行比较,决定输出变量 a 的值还是输出变量 b 的值。也可以定义一个求两个数中最大数的
24、函数 max2。在主函数 main 中调用 max2求出变量 a 和 b 中最大的数,并把此数赋给变量 max,最后通过 printf 函数输出变量 max 的值。float max2(float x,float y)float z;if(xy) z=x; else z=y;return(z);main( )float a,b,max; scanf(“%f%f“,max=max2(a,b);printf(“max is %fn“,max);例 1.6 求 1+2+3+10 的值。main( )int sum,i; sum=0; i=1;while (i10 时就不再执行循环体。也可以将 1+2
25、+3+n 定义成一个函数 sigma。通过在 main 中调用 sigma 函数完成求 1+2+3+10 的和。sigma 函数定义如下所示:int sigma(int n)int i,sum;i=1; sum=0;while(i、=、0?a+b:a-b 表示求 a+|b|的值;表达式 max=ab?a:b 表示求 a 和 b 中最大的数。(2) 优先级:比赋值运算符和逗号运算符高,但比所有的其它运算符低。(3) 结合性:右结合性。注意:整个表达式的结果类型为 e2 与 e3 二者中类型较高的一种类型。例如,表达式 yint=unsigned int=long=unsigned long=do
26、uble=a a=b ; b=t ;printf (“%d, %d”, a, b) ; C 语句书写格式无固定要求如,一行可写几条语句,一条语句可分几行书写。例、printf(“%d, %d”,a, b) ;注意:不可以随意把一条语句拆分成多行,需要保证字符串的完整性。 ;是语句的组成部分,不是分隔作用。高级语言程序设计 湖北师范学院计算机科学系 - 21 -二、基本输出与输入的方法printf(格式控制字符串,变量表列);格式字符及其用法:1、d 格式符: 用来输出十进制整数。有以下几种用法: (1)%d ,按整型数据的实际长度输出。 (2)%md,m 为指定的输出字段宽度。如果数据的位数小
27、于 m,则左端补以空格,若大于 m,则按实际位数输出。 (3)%ld,输出长整型数据。也可以指定长整型数据输出字段宽度,如 %mld。main()int a,float b; a=20;b=34.56; printf(“%d,%f“,a,b);2、o 格式符:以 8 进制数形式输出整数,是将内存单元中的各位的值按八进制形式输出,因此输出的数值不带符号。3、x 格式符:以 16 进制数形式输出整数,方法同 o 格式符。4、u 格式符:用来输出 unsigned 型数据,即无符号数,以十进制数形式输出。5、c 格式符: 用来输出一个字符。6、s 格式符:用来输出一个字符串。有几种用法:(1)%s,
28、输出指定的字符串。(2)%ms,输出的字符串占 m 列,如字符串本身长度大于 m,则全部输出字符串;若串长小于 m,则左补空格。(3)%-ms, 如果串长小于 m,则在 m 列范围内,字符串向左靠,右补空格。(4)%m.ns,输出占 m 列,但吸取字符串左端 n 个字符,这 n 个字符输出在 m列的右侧,左补空格。(5)%-m.ns,其中 m,n 含义同上,个字符输出在 m 列范围的左侧,右补空格。如果 nm,则 m 自动取 n 值,即保证 n 个字符正常输出。7、f 格式符:用来输出实数,以小数形式输出。有以下几种用法:(1)%f,不指定安段宽度,由系统自动指定,使整数部分全部如数输出,并输
29、出 6 位小数。应当注意,并非全部数字都是有效数字单精度实数的有效位数为 7位,双精度实数的有效位数为 16 位。(2)%m.nf,指定输出的数据位数占 m 列,其中有 n 位小数。如果数据长度小于 m,则左补空格。(3)%-m.nf,与%m.nf 基本相同,只是使输出的数值向左端靠,右端补空格。8、e 格式符: 以指数形式输出实数。可用以下形式:(1)%e,不指定输出数据所占的宽度和数字部分小数位数,由系统自动指定给出 6 位小数,指数部分占 5 位(如 e+002) ,其中 e 占一位,指数符号占一位,指数占 3 位。数值按标准化指数形式输出。(2)%m.ne 和%-m.ne,m、n 和“
30、-”字符含义与前相同。此处 n 指数据的数字部分的小数位数。高级语言程序设计 湖北师范学院计算机科学系 - 22 -9、g 格式符:用来输出实数,它根据数值的大小,自动选 f 格式或 e 格式,且不输出无意义的零。小结: printf 格式字符 说 明 d 以带符号的十进制形式输出整数(正数不输出符号)o 以 8 进制无符号形式输出整数(不输出前导符 0)x 以 16 进制无符号形式输出整数(不输出前导符 0x)u 以无符号的十进制形式输出整数c 以字符形式输出,只输出一个字符s 输出字符串f 以小数形式输出单、双精度数,隐含 6 位小数e 以标准指数形式输出单、双精度数,数字部分小数位数为6
31、 位g 选用%f 或%e 格式输出宽度较短的一种形式,不输出无意义的 0附加格式说明字符 说 明 l 用于长整型数据,可加在格式符 d、o、x、u 前面m(代表一个正整数) 数据最小宽度n(代表一个正整数)对实数,表示输出 n 位小数;对字符串,表示截取的字符个数- 输出的数字或字符在域内向左靠2、基本输入方法scanf(格式控制字符串,变量地址表列); main()int a,float b; scanf(“%d%f“,printf(“%d,%f“,a,b); 数据输入要注意的问题:(1)要用变量的地址做参数(2)运行时输入数据要严格按照格式控制字符串中规定的格式。例:输入数据格式 实际输入
32、数据%d,%f 23,34.5%d%f 23 34.5高级语言程序设计 湖北师范学院计算机科学系 - 23 -第 4 章 选择结构程序设计教学目标:了解条件与程序流程的关系;了解用不同的数据使程序的流程覆盖不同的语句、分支和路径;了解 C 语句表示逻辑量的方法(以 0 代表“假”以 1 代表“真” ) ;了解 if 语句和 switch 语句的使用方法及其应用;熟练掌握 if 语句和switch 语句的使用方法及其应用。教学重点:if 语句和 switch 语句的使用方法。教学难点:嵌套 if 语句的使用方法,while 语句的使用方法。一、条件判断 if 语句(1) if 语句的原型if (
33、表达式 )一个语句;else一个语句;如果表达式的值为真,执行 if 后面的语句;如果表达式的值为假,执行情况 else 后面的语句。一个语句指必须有一个语句,而且只能有一个语句。 (2) 简化的 if 语句 if (表达式 )一个语句; 没有 else 部分. (3) 复合的 if 语句 如果在一个语句处,要写多个语句,就要加上。 if (表达式 )语句;.语句;else语句;.语句; (4) 嵌套的 if 语句 就是 if 语句套 if 语句if (表达式 )if (表达式 )语句else语句 因为 if 可以简化,所有在嵌套时有时会出现歧义,例如上例中, else 是与第一个 if 配对
34、,还是与第二个 if 配对?这种时候,系统就武断地认为 else 与最近的一个 if 相对应。 例:ax2+bx+c=0 求根 (a!=0)高级语言程序设计 湖北师范学院计算机科学系 - 24 -main( ) float a,b,c;float x1,x2,s;printf(“Please Input a,b,c:n“);scanf(“%f,%f,%f“,s = b*b-4*a*c;if (s0) y=x;else y= -x;可用条件运算符表达如下:(x0) ? (y=x) : (y=-x) ;也可表示为:y=(x0) ? x : -x ; 优先级: 倒数第三 (P376) exp1 ?
35、exp2 : exp3三个表达式的类型可不相同。exp2、exp3 不相同时,条件表达式的值的类型为二者中较高的类型。例、 xy ? 1 : 1.5若 xy , 则值为 1.0#include main( ) char ch;ch=getchar( );printf(“%cn”, (ch=Aprintf(“%5d”, n);sum+ +;while(sum!=5); 小结: while循环语句 dowhile (注意: 为“ 假”结束循环) for break : 用于 switch 和循环语句 continue : 只用于循环语句 针对所在层 (本层)操作 goto : 尽量少用, 可以针对多层循环 分支和循环之间可以相互嵌套。但无论分支和循环之间,还是分支之间、循环之间的嵌套,都只能内嵌套,不能交叉。