1概述.docx
- 文档编号:9615263
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:32
- 大小:223.32KB
1概述.docx
《1概述.docx》由会员分享,可在线阅读,更多相关《1概述.docx(32页珍藏版)》请在冰点文库上搜索。
1概述
吉林医药学院教案
(章节部分)
章节、课题
C语言概述、算法
学时
2
日期
08.28
教学目的和要求:
了解:
C语言的历史、特点
熟悉:
C程序的构成和VC集成开发环境
掌握:
传统流程图和N-S流程图的画法
教学重点与难点:
教学重点:
C程序组成、VC集成开发环境和N-S流程图的画法
教学难点:
N-S流程
教学方法与手段:
教室讲授、幻灯片演示
案例式教学
教学中的创新点:
讨论、思考题和课后作业:
思考题:
算法和数学解题方法的区别与联系?
备注:
教学过程
时间分配
很高兴,由我和大家一起来学习C程序设计这门课。
首先,我问大家一个问题,你对“程序”是怎么理解的?
我们怎么来写程序呢?
目前,计算机已经应用到当今社会的各个领域,能给我们提供各种服务,也能按照我们的要求来完成一些特定的工作。
那大家想过没有,这些计算机是怎么工作呢?
其实,计算机做的工作都是通过程序来控制的,那怎样来设计程序就变的非常重要了。
我们要学习的C就可以写出各种程序来。
下面我们就一起来学习有关C语言的相关知识,第一章,C语言概述。
第1章C语言概述
C程序设计是生工专业的专业基础课,在后续的课程中,会应用较多。
C语言是国际上流行的计算机高级语言。
它适合作为系统的描述语言,既可以用来编写系统软件也可以用来编写应用软件(操作系统就是用C语言开发的,还有一些驱动程序都是C语言开发的)。
1.1C语言出现的历史背景
C语言是国际上广泛流行的高级语言。
C语言是在B语言的基础上发展起来的。
B(BCPL)语言是1970年由美国贝尔实验室设计的,并用于编写了第一个UNIX操作系统,在PDP7上实现。
优点:
精练,接近硬件,缺点:
过于简单,数据无类型。
1973年贝尔实验室的D.M.Ritchie在B语言的基础上设计出了C语言,对B取长补短,并用之改写了原来用汇编编写的UNIX,(即UNIX第5版),但仅在贝尔实验室使用。
1975年UNIX第6版发布,C优点突出引起关注。
1977年出现了《可移植C语言编译程序》,推动了UNIX在各种机器上实现,C语言也得到推广,其发展相辅相成。
1978年影响深远的名著《TheCProgrammingLanguage》由BrianW.Kernighan和DennisM.Ritchie合著,被称为标准C。
之后,C语言先后移植到大、中、小、微型计算机上,已独立于UNIX和PDP,风靡世界,成为最广泛的几种计算机语言之一。
1983年,美国国家标准化协会(ANSI)根据C语言各种版本对C的发展和扩充,制定了新的标准ANSIC,比标准C有了很大的发展。
1988年K&R按照ANSIC修改了他们的《TheCProgrammingLanguage》。
1987年,ANSI公布了新标准——87ANSIC。
1990年,国际标准化组织接受了87ANSIC为ISOC的标准(ISO9899—1990)。
1994年,ISO又修订了C语言标准。
目前流行的C语言编译系统大多是以ANSIC为基础进行开发的。
说明:
不同版本的C编译系统所实现的语言功能和语法规则又略有差别,因此读者应了解所用的C语言编译系统的特点(可以参阅有关手册)。
本书的叙述基本上以ANSIC为基础。
C语言版本:
目前最流行的C语言有以下几种:
·MicrosoftC或称MSC
·BorlandTurboC或称TurboC
·AT&TC
这些C语言版本不仅实现了ANSIC标准,而且在此基础上各自作了一些扩充,使之更加方便、完美。
1.2C语言的特点
1.C语言简洁、紧凑,使用方便、灵活。
ANSIC一共只有32个关键字:
9种控制语句,程序书写自由,主要用小写字母表示,压缩了一切不必要的成分。
2.运算符丰富。
共有34种。
C把括号、赋值、逗号等都作为运算符处理。
从而使C的运算类型极为丰富,可以实现其他高级语言难以实现的运算。
3.数据结构类型丰富。
4.具有结构化的控制语句。
5.语法限制不太严格,程序设计自由度大。
6.C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
因此有人把它称为中级语言。
7.生成目标代码质量高,程序执行效率高。
8.与汇编语言相比,用C语言写的程序可移植性好。
但是,C语言对程序员要求也高,程序员用C写程序会感到限制少、灵活性大,功能强,但较其他高级语言在学习上要困难一些。
面向对象的程序设计语言:
在C的基础上,一九八三年又由贝尔实验室的BjarneStrou-strup推出了C++。
C++进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。
C++目前流行的最新版本是BorlandC++,SymantecC++和MicrosoftVisualC++。
C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。
因而也增加了整个语言的复杂性,掌握起来有一定难度。
C和C++:
但是,C是C++的基础,C++语言和C语言在很多方面是兼容的。
因此,掌握了C语言,再进一步学习C++就能以一种熟悉的语法来学习面向对象的语言,从而达到事半功倍的目的。
1.3简单的C程序介绍
为了说明C语言源程序结构的特点,先看以下几个程序。
这几个程序由简到难,表现了C语言源程序在组成结构上的特点。
虽然有关内容还未介绍,但可从这些例子中了解到组成一个C源程序的基本部分和书写格式。
#include
voidmain()/*主函数*/
{/*函数体开始*/
printf("ThisisaCprogram.\n");/*输出语句*/
}/*函数体结束*/
本程序的作用是输出一行信息:
ThisisaCprogram.
说明:
main-主函数名,void-函数类型
•每个C程序必须有一个主函数main
•{}是函数开始和结束的标志,不可省
•每个C语句以分号结束
•使用标准库函数时应在程序开头一行写:
#include
•/*……*/表示注释。
注释只是给人看的,对编译和运行不起作用。
所以可以用汉字或英文字符表示,可以出现在一行中的最右侧,也可以单独成为一行。
例求3个数中较大者。
#include
voidmain()/*主函数*/
{
intmax(intx,inty);/*对被调用函数max的声明*/
inta,b,c;/*定义变量a、b、c*/
scanf(″%d,%d″,&a,&b);/*输入变量a和b的值*/
c=max(a,b);/*调用max函数,将得到的值赋给c*/
printf(″max=%d\\n″,c);/*输出c的值*/
}
intmax(intx,inty)
{
intz;
if(x>y)z=x;
elsez=y;
return(z);
}
程序运行情况如下:
8,5↙(输入8和5赋给a和b)
max=8(输出c的值)
说明:
本程序包括main和被调用函数max两个函数。
max函数的作用是将x和y中较大者的值赋给变量z。
return语句将z的值返回给主调函数main。
在前例子中用到了输出函数printf,在以后要详细介绍。
这里我们先简单介绍一下scanf和printf这两个函数的格式,以便下面使用。
scanf和printf这两个函数分别称为格式输入函数和格式输出函数。
其意义是按指定的格式输入输出值。
因此,这两个函数在括号中的参数表都由以下两部分组成:
“格式控制串”,参数表
格式控制串是一个字符串,必须用双引号括起来,它表示了输入输出量的数据类型。
各种类型的格式表示法可参阅第三章。
在printf函数中还可以在格式控制串内出现非格式控制字符,这时在显示屏幕上将原文照印。
参数表中给出了输入或输出的量。
当有多个量时,用
逗号间隔。
C源程序的结构特点:
(1)C程序是由函数构成的。
这使得程序容易实现模块化。
(2)一个函数由两部分组成:
函数的首部:
例1.3中的max函数首部
intmax(intx,inty)
函数体:
花括号内的部分。
若一个函数有多个花括号,则最外层的一对花括号为函数体的范围。
函数体包括两部分:
声明部分:
inta,b,c;可缺省
执行部分:
由若干个语句组成。
可缺省
注意:
函数的声明部分和执行部分都可缺省,例如:
voiddump()
{
}
这是一个空函数,什么也不做,但是合法的函数
(3)C程序总是从main函数开始执行的,与main函数的位置无关。
(4)C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上,C程序没有行号。
(5)每个语句和数据声明的最后必须有一个分号。
(6)C语言本身没有输入输出语句。
输入和输出的操作是由库函数scanf和printf等函数来完成的。
C对输入输出实行“函数化”。
书写程序时应遵循的规则:
从书写清晰,便于阅读,理解,维护的角度出发,在书写程序时应遵循以下规则:
1.一个说明或一个语句占一行。
2.用{}括起来的部分,通常表示了程序的某一层次结构。
{}一般与该结构语句的第一个字母对齐,并单独占一行。
3.低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。
以便看起来更加清晰,增加程序的可读性。
4.习惯用小写字母,大小写敏感。
不使用行号,无程序行概念。
可使用空行和空格常用锯齿形书写格式。
在编程时应力求遵循这些规则,以养成良好的编程风格。
1.4运行C程序的步骤和方法
一、运行C程序的步骤
●上机输入与编辑源程序
●对源程序进行编译
●与库函数连接
●运行目标程序
二、上机运行C程序的方法
●目前使用的大多数C编译系统都是集成环境(IDE)的。
可以用不同的编译系统对C程序进行操作
●常用的有TurboC2.0、TurboC++3.0、VisualC++等
●TurboC++3.0:
是一个集成环境,它具有方便、直观和易用的界面,虽然它也是DOS环境下的集成环境,但是可以把启动TurboC++3.0集成环境的DOS执行文件tc.exe生成快捷方式,也可以用鼠标操作。
●VisualC++:
也可以用VisualC++对C程序进行编译。
第2章程序的灵魂—算法
计算机做的工作都是通过程序来控制的,那怎样来设计程序就变的非常重要了,今天我们就来一起学习设计过程中,重要的一步:
程序设计的灵魂----算法。
计算机都是根据我们提供的数据和操作来完成一定功能的,所以对一个程序来说应包括:
●对数据的描述。
在程序中要指定数据的类型和数据的组织形式,即数据结构(datastructure)。
(在后面的章节中,我们会学到C语言中的数据类型)
●对操作的描述。
即操作步骤,也就是算法(algorithm)。
数据是操作的对象,操作的目的是对数据进行加工处理,以得到期望的结果。
就像我们打算做一道菜,原料就是数据,把原来加工成菜肴的过程就是操作。
程序设计人员的工作就相当于厨师的工作,他们必须认真考虑把数据和算法。
可见,对一个应用程序来说,数据结构和算法都是非常重要的,著名科学家NikiklausWirth(沃斯)提出的公式:
数据结构+算法=程序
教材认为:
程序=算法+数据结构+程序设计方法+语言工具和环境
这4个方面是一个程序涉及人员所应具备的知识。
本次课我们主要学习算法的使用。
首先来学与算法相关的第一个内容:
算法的概念。
2.1算法的概念
做任何事情都有一定的步骤。
为解决一个问题而采取的方法和步骤,就称为算法。
对同一个问题,可有不同的解题方法和步骤。
例如:
求1到100的和?
解:
方法1:
1+2,+3,+4,一直加到100加99次
方法2:
100+(1+99)+(2+98)+…+(49+51)+50=100+49×100+50加51次
通过运算的次数我们可以认为方法2比方法1优秀,计算机在选择算法时也要选择最优的解法。
即计算机能够执行的算法,为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法。
希望方法简单,运算步骤少。
计算机算法可分为两大类:
⏹数值运算算法:
求解数值;例如求方程的根、求函数的定积分等。
⏹非数值运算算法:
事务管理领域。
例如图书检索、人事管理、行车调度管理等。
这两类算法我们在后面的章节中都能应用到,下面我来介绍两个简单的算法。
2.2简单算法举例
例1求1×2×3×4×5。
最原始方法:
步骤1:
先求1×2,得到结果2。
步骤2:
将步骤1得到的乘积2乘以3,得到结果6。
步骤3:
将6再乘以4,得24。
步骤4:
将24再乘以5,得120。
这样的算法虽然正确,但太繁。
如果要求1×2×…×1000,则要写999个步骤。
改进的算法:
观察算式的特点,先看被乘数,从第二个算式开始,被乘数是上一个算式的乘积,乘数
的变化是前一个与后一个相差为1,发现这样的规律之后,我们就可以把这个算法做一下改进,在计算机中,这样有规律变化的数可以用变量来表示,变量是后面我们在编写程序时每天都会使用的一个量,关于变量的知识我们在后面会详细的介绍,今天我们先简单的介绍一下变量的用法。
变量对应内存中的一个地址,并且有一个名字,我们可以通过名字找到这个存数据的地址。
想当于我们生活中的一个小盒子,盒子是不变的,盒子里装的东西却可以经常改变,在程序中的变量的变化是这样的,用新值来代替旧值。
例如,在变量A中,原来的有个值是1,经过一次运算之后的的值是2了,有了变量了,我们再来看,这个算法可以怎么改进?
设两个变量:
一个变量代表被乘数,我们可以用p来表示,p就是变量的名字,在写算式时,p就可以代替被乘数,再设一个变量代表乘数我们可以用i来表示。
有了这两个变量,我们就可以把算式写成:
p*i,现在我们在观察算式的乘积的特点,被乘数就是上一个算式的乘积,所以我们不另设变量存放乘积结果,而直接将每一步骤的乘积放在被乘数变量中。
这样,表示乘积的算式的通式我们就写出来了。
接下来的问题,这个通式要怎么使用的,换句话说,这个通式要执行多少次才能求出结果呢?
第一次执行通式p*i时,此时变量p的值是1,i的值2,计算之后乘积是2。
注意,这时的乘积应该存在哪里?
存放在变量p中。
第二次执行通式p*i时,此时变量p的值是2,i的值3,计算之后乘积是6。
注意,乘积存放在变量p中。
第三次执行通式p*i时,此时变量p的值是6,i的值4,计算之后乘积是24。
注意,乘积存放在变量p中。
第四次执行通式p*i时,此时变量p的值是24,i的值5,计算之后乘积是120。
注意,乘积存放在变量p中。
到此,5的阶乘求出来了,这个通式我们反复执行了四次,在计算机中,对于这样重复的工作我们可以用循环来解决,循环是后面的程序设计非常重要的一个结构,既然是循环结构,我们就不能一直循环下去,在满足一定条件时我们要跳出这个循环。
对于上例来说,我们已经得知,该通式执行了四次,那这四次又和哪个量有关系的,我们再去观察我们用到的这两个变量,看看他们都是怎么变化的,通过观察我们发现,当乘数的值超过5的时候,我们就不再执行通式了。
经过以上分析,我们可以把该算法可改写成:
S1:
使p=1
S2:
使i=2
S3:
使p×i,乘积仍然放在在变量pt中,可表示为p×i→t
S4:
使i的值+1,即i+1→i
S5:
如果i≤5,返回重新执行步骤S3以及其后的S4和S5;否则,算法结束。
如果计算1000!
只需将S5:
若i≤5改成i≤1000即可。
如果该求1×3×5×7×9×11,算法也只需做很少的改动:
S1:
1→t
S2:
3→i
S3:
t×i→t
S4:
i+2→t
S5:
若i≤11,返回S3,否则,结束。
用这种方法表示的算法具有通用性、灵活性。
S3到S5组成一个循环,在实现算法时要反复多次执行S3,S4,S5等步骤,直到某一时刻,执行S5步骤时经过判断,乘数i已超过规定的数值而不返回S3步骤为止。
此时算法结束,变量p的值就是所求结果。
因为计算机是高速运算的自动机器,实现循环轻而易举。
对于一个算法来说,除了正确,还有具有以下一下特性,下面来学本章的第三个内容:
算法的特性。
2.3算法的特性
●有穷性:
一个算法应包含有限的操作步骤而不能是无限的。
比如我们刚刚讲到的循环,我们在设计算法是就要避免出现死循环,要在一个合理的范围内,让循环能终止。
●确定性:
算法中每一个步骤应当是确定的,而不能应当是含糊的、模棱两可的。
不能有歧义,每一步的含义都是唯一的。
●有零个或多个输入:
输入是指在执行算法时需要从外界取得必要的信息。
●有一个或多个输出:
算法的目的是为了求解,“解”就是输出。
●有效性:
算法中每一个步骤应当能有效地执行,并得到确定的结果。
对于程序设计人员,必须会设计算法,并根据算法写出程序。
不管是复杂还是简单的算法都必须具有以上的特点。
那么怎么来表示一个优秀的算法呢,这是我们下面要学的内容:
表示一个算法。
2.4怎样表示一个算法
2.4.1用自然语言表示算法
自然语言就是人们日常使用的语言,可以是汉语或英语或其它语言。
用自然语言表示通俗易懂,但文字冗长,容易出现“歧义性”。
自然语言表示的含义往往不大严格,要根据上下文才能判断其正确含义,描述包含分支和循环的算法时也不很方便。
因此,除了那些很简单的问题外,一般不用自然语言描述算法。
除了很简单的问题,一般不用自然语言表示算法。
2.4.2用流程图表示算法
把执行的流程用图来表示。
流程图表示算法,直观形象,易于理解。
美国国家标准化协会ANSI(AmericanNationalStandardInstitute)规定了一些常用的流程图符号:
例2将判断素数的算法用流程图表示。
(改图有两个出口)
流程图是表示算法的较好的工具。
一个流程图包括以下几部分:
(1)表示相应操作的框;
(2)带箭头的流程线;
(3)框内外必要的文字说明。
2.4.3
三种基本结构和改进的流程图
1、传统流程图的弊端
传统流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。
因此,使用者可以毫不受限制地使流程随意地转向,使流程图变得毫无规律,阅读者要花很大精力去追踪流程,使人难以理解算法的逻辑。
如图:
这种如同乱麻一样的算法称为BS型算法,意为一碗面条(ABowlofSpaghetti),乱无头绪。
缺点:
难以阅读、修改,使算法的可靠性和可维护性难以保证。
解决办法:
必须限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序地进行下去。
2、三种基本结构
Bohra和Jacopini提出了以下三种基本结构:
顺序结构、选择结构、循环结构
用这三种基本结构作为表示一个良好算法的基本单元。
(1)顺序结构:
按照操作的顺序,一次执行。
就像我们看病挂号,就按照你挂号的顺序依次去医生的办公室就诊。
按照顺序结构的图示,由a入口开始,进入之后,先执行操作A,A执行之后,执行B操作。
有出口b退出该结构。
(2)选择结构:
按照条件进行判断,满足条件执行一种操作,不满足条件执行另一种操作。
比如,我去医院挂号,导诊员都会问你,是不是医保挂号,如果是医保挂号,可能是在一楼,不是的可能就在二楼。
去哪挂号,就看你是不是用医保卡了。
图一的执行过程,由a入口进入,先判断条件,若条件成立,执行A操作,若条件不成立执行B操作,A操作和B操作,只有一个会被执行,不管执行哪个操作,都由b出口退出该结构。
图二的执行过程,由a入口进入,先判断条件,若条件成立,执行完A操作,由b出口退出该结构;若条件不成立由b出口退出该结构。
例3将求y=算法用流程图表示。
(3)循环结构:
在满足条件的情况下,某种操作会反复的执行,例如,我们刚刚讲的求5的阶乘的算法。
图一的执行过程,由a入口进入,先判断条件p1,若条件成立,执行A操作,然后再先判断条件是否成立,若成立,执行A操作。
执行到条件不成立时,退出该结构。
图二的执行过程,由a入口进入,先执行操作A,然后判断条件,若条件不成立,执行A操作。
然后再判断条件,若条件依然不成立,继续执行A操作,执行到条件成立由b出口退出该结构。
例4将求5!
的算法用流程图表示。
例5将求50名学生中成绩在80分以上者的学号和成绩输出。
三种基本结构的共同特点:
●只有一个入口;
●只有一个出口;
●结构内的每一部分都有机会被执行到;
●结构内不存在“死循环”。
不正确的流程表示:
图中没有一条从入口到出流程内的死循环
口的路径通过A框
由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。
由基本结构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。
只要具有上述四个特点的都可以作为基本结构。
可以自己定义基本结构,并由这些基本结构组成结构化程序。
2.4.4用N-S流程图表示算法
三种基本结构可以解决各种各样的问题,那我们就可以把流程见的箭头省略。
1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。
在这种流程图中,完全去掉了带箭头的流程线。
全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框,或者说,由一些基本的框组成一个大的框。
这种流程图又称N--S结构化流程图。
顺序结构:
去掉了流程图中的柳城线,执行顺序为先A后B。
选择结构:
除了去掉流程线,还将菱形判断框改成了一个倒三角形,当P条件成立成立时执行A操作,不成立时执行B操作。
例6将求y=算法用流程图表示。
循环结构:
也分当型循环和直到型循环两种。
用三种N--S流程图中的基本框,可以组成复杂的N--S流程图。
图中的A框或B框,可以是一个简单的操作,也可以是三个基本结构之一。
例7将例2.1的求5!
算法用N-S图表示。
例8将求50名学生中成绩在80分以上者的学号和成绩输出算法用N-S图表示。
出口2
N--S图表示算法的优点:
比文字描述直观、形象、易于理解;比传统流程图紧凑易画。
尤其是它废除了流程线,整个算法结构是由各个基本结构按顺序组成的,N--S流程图中的上下顺序就是执行时的顺序。
用N--S图表示的算法都是结构化的算法,因为它不可能出现流程无规律的跳转,而只能自上而下地顺序执行。
一个结构化的算法是由一些基本结构顺序组成的。
在基本结构之间不存在向前或向后的跳转,流程的转移只存在于一个基本结构范围之内(如循环中流程的跳转);一个非结构化的算法可以用一个等价的结构化算法代替,其功能不变。
如果一个算法不能分解为若干个基本结构,则它必然不是一个结构化的算法。
2.4.5用伪代码表示算法
概念:
伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。
特点:
它如同一篇文章一样,自上而下地写下来
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 概述