第一章 C语言程序设计概述汇总文档格式.docx
- 文档编号:16720653
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:18
- 大小:108.69KB
第一章 C语言程序设计概述汇总文档格式.docx
《第一章 C语言程序设计概述汇总文档格式.docx》由会员分享,可在线阅读,更多相关《第一章 C语言程序设计概述汇总文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
机器语言和汇编语言都是面向机器的语言,一般称为低级语言。
它们对机器的依赖性很大,用它们开发出的程序通用性差,而且要求程序的开发者必须熟悉和了解计算机硬件的每一个细节,因此,它们面对的用户一般是计算机专业人员。
随着计算机技术的发展及计算机应用领域的不断扩大,计算机用户的队伍也在不断壮大,而且这个队伍中绝大部分人不是计算机专业人员。
为此,从20世纪50年代中期开始,逐步发展了面向问题的程序设计语言,称为高级语言。
高级语言与具体的计算机硬件无关,其表达方式接近于被描述的问题,接近于自然语言和数学语言,易为人们接受和掌握。
用高级语言编写程序要比用低级语言容易得多,大大简化了程序的编制和调试过程,使编程效率得到大幅度的提高。
例如,上述计算A=15+10的BASIC语言程序如下:
A=15+10'
15与10相加的结果放入A中
PRINTA'
输出A
END'
程序结束
用高级语言编写的程序易学、易读、易修改,通用性好。
但是,计算机同样不能直接执行高级语言程序,必须经过语言处理程序的翻译后才能被机器接受。
下面列出几种最常用的高级语言及其最适用的领域:
Basic教学和微小型应用程序的开发
Fortran科学及工程计算程序的开发
Pascal专业教学和应用程序的开发
C中、小型系统程序的开发
C++面向对象程序的开发
JavaInternet上应用的重要编程语言
VisualBasic面向对象程序的开发
Cobol商业、交通和银行等行业应用程序的开发
Lisp人工智能程序的开发
Prolog人工智能程序的开发
1.1.3语言处理程序
计算机可以直接识别和执行的只能是机器语言程序。
用汇编语言和高级语言编写的程序,都必须经过一个翻译过程才能转换为计算机所能识别的机器语言程序,实现这个翻译过程的工具是语言处理程序,即翻译程序。
翻译程序除了要完成语言间的转换外,还要进行语法、语义等方面的检查。
针对不同的程序设计语言编写出的程序,有各自的翻译程序,互相不通用。
翻译程序可分为汇编程序和高级语言翻译程序;
高级语言翻译程序有两种工作方式:
解释方式和编译方式,对应的是解释程序和编译程序。
1.汇编程序
汇编程序是一种由专业的软件开发商提供的系统软件,它能将用汇编语言编写的源程序翻译成某种类型的计算机的机器语言程序,即目标程序,这一翻译过程称为汇编。
图1.1是汇编程序的功能示意图。
汇编程序通常是将一条汇编语言指令翻译成一条机器语言指令。
在翻译的过程中,还要对每一条指令进行语法检查,若有错误,就中断汇编过程,并以某种方式输出错误的类型及有关信息,以便用户进行修改。
若没有错误,就自动生成相应的目标程序,再经过一定处理之后,便可以运行了。
运行的是可执行的目标代码,与源程序及汇编程序无关。
若源程序作了某些修改,则必须再重新进行汇编。
2.解释程序
解释程序的工作过程是将高级语言源程序一句一句地读入,每读入一个语句都要对它进行分析和解释,若有错误就即时中断其解释过程,并通知用户进行修改,若没有错误就按照解释结果执行所要求的操作。
其工作过程如图1.2所示。
BASIC、LISP等语言采用解释方式。
解释方式灵活、方便,交互性好,解释执行程序的过程中也不会产生目标程序。
但因为是边解释边执行,所以程序的执行速度很慢,如果源程序中出现循环结构,解释程序也要重复多次地解释循环体中的每一条语句,造成很大浪费,而且解释方式在运行源程序时离不开翻译程序。
3.编译程序
编译程序的功能是将用高级语言编写的源程序翻译成机器语言程序,即目标程序,这一翻译过程称为编译。
但目标程序还不能立即装入机器执行,因为还没有连接成一个整体,在目标程序中还可能要调用一些其他语言编写的程序和标准程序库中的标准子程序,所有这些程序通过连接程序将目标程序和有关的程序库组合成一个完整的可执行程序。
产生的可执行程序可以脱离编译程序和源程序独立存在并反复使用。
故编译方式执行速度快,但每次修改源程序后,都必须重新编译。
其工作过程如图1.3所示。
与汇编程序不同的是,编译程序往往需要将一条高级语言的语句转换成若干条机器语言指令,而且翻译的过程也要复杂得多。
一般高级语言(C/C++、PASCAL、FORTRAN、COBOL等)都是采用编译方式。
1.1.4设计程序的基本原则
要设计出一个好的程序,必须了解利用计算机解决实际问题的过程,掌握程序设计的基本技术,熟练地掌握一种程序设计语言。
计算机解决问题的基本过程如图1.4所示。
图1.4计算机解决问题的基本过程
如何才能编写出高质量的程序呢?
下面是设计程序时应遵循的基本原则:
(1)正确性。
正确性是指程序本身必须具备且只能具备程序设计规格说明书中所列举的全部功能。
它是判断程序质量的首要标准。
(2)可靠性。
可靠性是指程序在多次反复使用过程中不失败的概率。
(3)简明性。
简明性的目标是要求程序简明易读。
(4)有效性。
程序在计算机上运行需要使用一定数量的计算机资源,如CPU的时间、存储器的存储空间。
有效性就是要在一定的软、硬件条件下,反映出程序的综合效率。
(5)可维护性。
程序的维护可分为校正性维护、适应性维护和完善性维护。
一个软件的可维护性直接关系到程序的可用性,因此应特别予以关注。
(6)可移植性。
程序主要与其所完成的任务有关,但也与它的运行环境有着一定的联系。
软件的开发应尽可能远离机器的特征,以提高它的可移植程度。
为了有效地进行程序设计,不仅要掌握一门高级语言,还应该学会对各类问题拟定出有效的解题步骤——即算法设计。
有了正确的算法,才能够编制程序。
算法的好坏,决定了程序的优劣,因此,程序设计的核心任务之一就是设计算法。
1.2算法
所谓算法,就是问题的求解方法。
例如,期末考试前的复习计划,就是“复习算法”;
到医院看病,先挂号,后诊断、检查,再取药等,是“看病算法”。
在计算机中,把解题过程的准确而完整地描述称为解题算法。
一个算法由一些操作组成,而这些操作又是按一定的控制结构所规定的次序执行的,也就是算法由操作与控制结构两个要素组成。
一个算法应该具有如下特点:
(1)有穷性:
一个算法应该包含有限的操作步骤,而不能是无限的;
并且能在有限的时间内完成。
(2)确定性:
每一个步骤都是确定的,而不能是含糊的、模棱两可的。
(3)有效性:
每一个步骤都能得到有效地执行,并得到确定的结果。
(4)有零个或多个输入:
所谓输入是指执行算法时需要从外界取得必要的信息。
(5)有一个或多个输出:
算法的目的就是为了求解,“解”就是输出。
上述所讲的算法特性,约束人们去正确地书写算法,使之能够正确无误地执行,达到求解问题的预期效果。
同时,算法还应该具有直观、清晰、易懂的表示形式,以利于维护、修改和交流。
1.简单算法举例
例1.1给出求x1+x2+x3+x4+x5的值的算法。
算法分析如下:
(1)手工计算的算法。
采用手工计算的步骤为:
①将x1与x2相加,得到两个数之和;
②将上一步的和与x3相加,得到三个数之和;
③将上一步的和与x4相加,得到四个数之和;
④将上一步的和与x5相加,得到五个数之和。
这种算法虽然是正确的,但太繁琐。
如果要求x1+x2+……+x100,则要写99个步骤,显然是不可取的。
(2)适合计算机处理的算法。
该算法能更加简洁地表达上述解题过程,并具有通用性。
先定义几个变量:
设置变量s表示多项式之和,其初值为零;
设置变量a表示多项式中的一项,它的值可以为x1,x2,…,x5;
用i记录被加了几次,其初值为1。
解题步骤为:
①s0;
②i1;
③axi;
(使a等于多项式中的第i项)
④ss+a;
(求和,并将结果保留在s中)
⑤ii+1;
(计数增值)
⑥若i≤5,则重复③,④,⑤各步;
否则,计算结束;
⑦输出s。
2.算法的表示
算法的表示,有多种不同的方法。
如自然语言、传统流程图、结构化流程图、伪代码、PAD图等。
(1)自然语言。
自然语言就是人们日常使用的语言,可以是汉语、英语或其他语言。
这样的算法通俗易懂,但文字冗长,容易出现“歧义性”,在表示包含分支和循环的算法时,不太方便和直观。
因此,除了很简单的问题以外,一般不用自然语言表示。
(2)传统流程图。
流程图(Flowchart)是用一些框图、线条及文字说明来描述算法。
美国国家标准化协会ANSI规定了一些常用的流程图符号。
如表1.1所示。
用三种基本结构作为表示一个良好算法的基本单元,由它们可以嵌套、组合,形成复杂的程序流程图。
图1.5表示了三种基本结构的传统流程图。
其中,(a)表示顺序结构,(b)表示选择结构,(c)表示当型循环结构,(d)表示直到型循环结构。
①顺序结构。
图1.5(a)中,两个框是顺序执行的。
即先执行“处理1”框所指定的操作,接着执行“处理2”框所指定的操作。
②选择结构,又称分支结构。
图1.5(b)中,当条件满足时执行“处理1”框,否则执行“处理2”框。
③循环结构,又称重复结构。
图1.5(c)中,首先判断条件是否满足,若条件满足,则执行“处理”框指定的操作,之后返回再判断条件,由此构成循环,直至条件不满足为止;
图1.5(d)中,先执行“处理”框指定的操作,之后判断条件是否满足,若条件不满足,就返回执行“处理”框指定的操作,直到条件满足为止。
(a)顺序结构(b)选择结构(c)当型循环结构(d)直到型循环结构
图1.5三种基本结构的传统流程图
表1.1传统流程图常用的符号
图形名称说明
流向线表示算法流程方向;
箭头方向为入口,相背方向为出口
开始、结束框开始框仅有流向线从其流出,而结束框仅有流向线流入
处理框也称矩形框,表示确定的处理、步骤
输入输出框表示原始数据的输入和处理结果的输出
判断框允许有一个入口,两个或两个以上的可选择的出口
连接点用来将画在不同地点的流程线连接起来
功能调用框表示执行模块或子程序
……[注释框用于书写注释信息
流程图形象、直观,便于交流,广泛使用。
例1.2输入一个整数,将它倒过来输出。
例如,输入12345,输出为54321。
试给出其算法。
流程图见图1.6。
例1.3从键盘输入100个数,求出这100个数的累加和,并找出它们的最大值和最小值。
试用传统流程图表示解决这个问题的算法。
流程图见图1.7。
输入一个整数给x
(3)N-S流程图。
随着结构化程序设计的兴起,简化了控制流向,出现了N-S图。
N-S图是美国学者I.Nassi和B.Shneiderman提出的一种新的流程图形式。
N-S图中去掉了传统流程图中带箭头的流向线,全部算法以一个大的矩形框表示,该框内还可以包含一些从属于它的小矩形框,适于结构化程序设计。
图1.8表示了结构化程序设计的三种基本结构的N-S流程图表示。
其中,(a)表示顺序结构,(b)表示选择结构,(c)表示当型循环结构,(d)表示直到型循环结构。
处理1
处理2
成立
不成立
条件P
处理
当P成立时
直到P成立时为止
(a)顺序结构
(b)选择结构
(c)当型循环
(d)直到型循环
图1.8三种基本结构的N-S流程图
例1.4从键盘输入一个整数,判别该数是否为素数。
素数,也称为质数,是指只能被1及其自身整除且大于1的正整数,如2、3、5、7等都是素数。
用N-S流程图表示解决这个问题的算法。
N-S流程图见图1.9。
从键盘输入一个数给n
w=0;
i=2
r=n%i(求n除以i的余数)
直到i=n或w=1时为止
r=0?
不是
是
w=1
i=i+1
w=0?
输出n不是素数
输出n是素数
图1.9判断素数的N-S流程图
(4)伪代码。
伪代码是一种介于自然语言和计算机语言之间的文字和符号来表示的算法,每一行(或几行)表示一个基本操作。
它不用图形符号,因此书写方便、格式紧凑,也比较好懂,便于向计算机语言算法(即程序)过渡。
例1.5将例1.2的算法用伪代码表示。
①输入一个整数给x;
②while(x≠0)
{
d=x%10;
输出d;
x=将x/10得到的整数;
}
(5)计算机语言。
计算机是无法识别流程图和伪代码的,只有用计算机语言编写的程序才能被计算机执行(当然还要经过翻译等处理)。
因此,在用流程图或伪代码表示出一个算法后,还要将它转换称计算机语言程序。
用计算机语言表示算法必须严格遵循所用语言的语法规则,这是和伪代码不同的。
例1.6将例1.2的算法用C语言表示。
#include<
stdio.h>
main()
{
intx,d;
x=12345;
while(x!
=0)
d=x%10;
printf(“%d”,d);
x=x/10;
}
在这里,读者只需大体看懂它即可,在以后的各章中会详细介绍C语言有关的使用规则。
应当强调说明的是,写出了C程序,仍然只是表示了算法,并未实现算法,只有运行程序才是实现算法。
应该说,用计算机语言表示的算法是计算机能够执行的算法。
1.3结构化程序设计方法
程序设计是一门技术,需要相应的理论、技术、方法和工具来支持。
就程序设计方法和技术而言,主要经过了结构化程序设计和面向对象的程序设计阶段。
结构化程序设计强调程序设计风格和程序结构的规范化,提倡结构清晰。
良好的程序设计风格可以使程序结构清晰合理,使程序代码便于维护。
著名的“清晰第一,效率第二”的论点已成为当今主导的程序设计风格。
结构化程序设计方法的基本思路是,把一个复杂的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。
结构化设计方法的主要原则可以概括为自顶向下,逐步细化,模块化,限制使用GOTO语句。
(1)自顶向下。
程序设计时,应先考虑总体,后考虑细节;
先考虑全局目标,后考虑局部目标。
先从最上层总体目标开始设计,逐步使问题具体化。
(2)逐步求精。
对复杂问题,应设计一些目标做过渡,逐步细化。
(3)模块化。
一个复杂的问题,肯定是由若干稍简单的问题组成。
模块化是把程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,每个小目标成为一个模块。
(4)限制使用GOTO语句。
用三种基本结构组成的程序必然是结构化程序,这种程序便于编写、阅读、修改和维护。
这就减少了程序出错的机会,提高了程序的可靠性,保证了程序的质量。
例1.7求3~5000之间的所有素数(质数)。
分析:
我们采用自上向下、逐步细化的方法来处理这个问题。
即先把这个问题分解为二个相对较小的问题:
①判别某数是否为素数;
②利用循环判别3~5000之间的所有的数是否为素数,若是就把它输出。
把这两个小问题分别用两个程序模块来实现,并由此给出解决这个问题的程序流程图。
图1.10(a)是判别3~5000之间的所有的数是否为素数,若是就把它输出的流程图。
但其内容还是笼统的、抽象的,因为还没有解决怎样才能实现“判别某数是否为素数”的功能,需要进一步“细化”。
在这里我们给出一种算法:
用整数i除以从2、3、4……一直到i-1的每一个正整数,如果都除不尽,则i是素数,否则,只要其中有一个被除数能除尽,则i就不是素数。
其实现算法如图1.12(b)所示,该程序模块运行结束后,若变量flag的值为1,则i是素数,否则i不是素数。
(a)(b)
图1.10输出3~5000之间所有的质数
到此为止,已全部细化完毕。
每一部分都可以分别直接用高级语言的语句来表示。
由此可以看出:
“自顶向下、逐步细化”是结构化程序设计方法的核心。
应当学会利用这种方法把一个总的任务(即抽象化的要求)逐步具体化。
可以说,逐步细化的过程是使求解问题“由抽象到具体”的过程。
1.4C语言程序的基本结构
C语言是目前国际上流行的一种结构化的程序设计语言,它不仅是开发系统软件的很好工具,而且也是开发应用软件的很好的程序设计语言。
因此,它深受广大程序设计者的欢迎。
1.C程序的特点
C语言之所以能被推广并广泛应用,概括地说主要有如下特点:
(1)中级语言
C语言通常被成为中级语言,这并不意味着C语言的功能不如高级语言,而是因为它把高级语言的先进思想与汇编语言的控制和灵活性有机地结合了起来。
作为中级语言,C语言允许对位、字节和地址这些计算机功能中的基本成分进行操作。
(2)结构化语言
C语言是便于进行模块化程序设计的语言,它是由一系列函数所组成,这种结构便于把一个大型程序划分为若干相对独立的模块,模块间通过函数调用来实现相互连接;
C语言直接支持顺序、选择和循环三种典型的基本结构(见第三章至第五章),使程序设计人员便于使用“自顶向下、逐步求精”的结构化程序设计技术。
(3)可移植性
C语言程序具有较高的可移植性。
所谓可移植性,指的是可以把为某种计算机编写的软件运行在另一种机器或操作系统上。
C语言不包含依赖硬件的输入输出机制,其输入输出是由独立于C语言的库函数来实现的,这样就使C语言程序本身不依赖于硬件系统,也便于在不同的机器系统间移植。
2.几个简单的C程序
通过介绍几个简单的C程序,使读者对C程序有一个大概的了解。
这些例子虽然简单,但反映了一般C程序的特点以及基本组成。
例1.8编写一个C程序,其功能是显示字符串“howareyou”。
main()
{
printf(“howareyou\n”);
这是一个简单而完整的C语言程序。
如果将这个程序利用编辑程序输入进计算机,并经过编译和连接后,运行结果是在显示器屏幕的当前光标位置处显示如下字符串:
Howareyou
其中main函数是“主函数”,每一个C程序都必须有一个main函数。
函数体由花括号{}括起来。
本例中主函数内只有一个输出语句,printf()是由系统提供的标准库函数,它完成输出功能。
双引号内的字符串原样输出。
“\n”是换行符,即在输出howareyou后回车换行。
语句最后有一个分号“;
”。
在使用标准函数库中的输入输出函数时,编译系统要求程序提供有关的信息,程序第1行“#include<
”的作用就是用来提供这些信息的,在此读者不必深究,这在后面章节中有详细的介绍。
例1.9求两数之和。
main()/*求两数之和*/
{
inta,b,sum;
/*这是定义变量*/
a=88;
b=99;
sum=a+b;
printf(“sumis%d\n”,sum);
本程序的作用是求两个整数a和b之和sum。
/*……*/表示注释部分,为了便于理解,这里采用汉字来注释,当然也可以用英语或汉语拼音来注释。
注释可以加在程序的任何位置,它只是用来给人看的,在程序编译和运行时不起作用。
第4行是变量定义部分,定义a和b为整型(int)变量。
第5、6行是两个赋值语句,将整数值88和99分别赋值给变量a和b。
第7行是将a+b的结果赋值给变量sum,第8行中“%d”是输出函数的“格式说明”,表示要在这个位置输出一个“十进制整数”。
printf函数中括弧内最右端的sum是要输出的变量,现在它的值为187(即88+99之值),因此程序运行的结果是:
sumis187
例1.10编程实现求两个数的最大数。
main()/*主函数*/
intmax(intx,inty);
/*对被调用函数max的声明*/
inta,b,c;
/*定义变量*/
scanf(“%d,%d”,&
a,&
b);
/*输入变量a和b的值*/
c=max(a,b);
/*调用max函数,将得到的值赋给c*/
printf(“max=%d”,c);
/*输出c的值*/
intmax(intx,inty)/*定义max函数,函数值为整型,x,y为形式参数*/
{
intz;
/*max函数中用到的变量z,也要加以定义*/
if(x>
y)
z=x;
else
z=y;
return(z);
/*将z的值返回,通过max带回调用函数处*/
本程序包括两个函数:
主
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第一章 C语言程序设计概述汇总 语言程序设计 概述 汇总