C语言程序设计-01概述_第1页
C语言程序设计-01概述_第2页
C语言程序设计-01概述_第3页
C语言程序设计-01概述_第4页
C语言程序设计-01概述_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章概述

1.1程序设计基本知识

1.2C语言的发展与特点

1.3C语言程序的基本结构

1.4C语言程序的运行

本章小结1.1程序设计基本知识

1.1.1程序与程序设计

程序是用某种计算机能理解并执行的语言所描述的解决问题的方法和步骤。

一个计算机程序主要描述两部分内容:一是描述问题的每个对象和对象之间的关系,二是描述对这些对象作处理的处理规则。其中关于对象及对象之间的关系是数据结构(DataStructure)的内容,而处理规则是求解的算法(Algorithm)。

使用计算机解决实际问题,通常是先要对问题进行分析并建立数学模型,然后考虑数据的组织方式和算法,并用某一种程序设计语言编写程序,最后调试程序,使之运行后能产生预期的结果。这个过程称为程序设计(Programming)。

具体要经过以下4个基本步骤:

(1)分析问题,确定数学模型或方法。

(2)设计算法,画出流程图。

(3)选择编程工具,按算法编写程序。

(4)调试程序,分析输出结果。1.1.2算法及其描述

著名的瑞士计算机科学家N.Wirth教授曾提出:

算法+数据结构=程序

算法是对数据运算的描述,而数据结构是指数据的组织存储方式,包括数据的逻辑结构和存储结构。程序设计的实质是对实际问题选择一种好的数据结构,并设计一个好的算法,而好的算法在很大程度上取决于描述实际问题的数据结构。

1.算法的概念

计算机解决问题的方法和步骤,就是计算机解题的算法。要编写解决问题的程序,首先应设计算法,任何一个程序都依赖于特定的算法,有了算法,再来编写程序是容易的事情。

下面举两个简单例子,以说明计算机解题的算法。【例1.1】这一题的算法并不难,可写成:

(1)从键盘输入a,b的值。

(2)如果a<b,则x=a2+b2,y=(a+b)/(a-b),否则x=a2-b2,y=4/(a+b)。

(3)计算u的值。

(4)输出u的值。

【例1.2】输入10个数,要求找出其中最大的数。

(1)输入一个数,存放在max中。

(2)用i来统计比较的次数,其初值置1。

(3)若i≤9,执行第(4)步,否则执行第(8)步。

(4)输入一个数,放在x中。

(5)比较max和x中的数,若x>max,则将x的值送给max,否则,max值不变。

(6)i增加1。

(7)返回到第(3)步。

(8)输出max中的数,此时max中的数就是10个数中最大的数。

2.算法的特性

从上面的例子中,可以概括出算法的5个特性:

(1)有穷性。算法中执行的步骤总是有限次数的,不能无止境地执行下去。

(2)确定性。算法中的每一步操作必须具有确切的含义,不能有二义性。

(3)有效性。算法中的每一步操作必须是可执行的。

(4)要有数据输入。

(5)要有结果输出。

3.算法评价标准

目前,评价算法质量有4个基本标准:

(1)正确性。

(2)可读性。

(3)通用性。

(4)高效率。

4.算法效率的度量

算法效率的度量分为时间度量和空间度量。

(1)时间度量

算法的执行时间需要依据该算法编制的程序在计算机上运行时所消耗的时间来度量。通常把算法中进行简单操作的次数的多少称为算法的时间复杂度,它是一个算法执行时间的相对度量。

一般没必要计算出算法的精确复杂度,只要大致计算出相应的数量级即可,即随着问题规模n的增大,算法的执行时间的增长率如何,这个时间增长率称为阶。若算法的时间复杂度是n阶的,记为T(n)=O(n)。

按数量级递增顺序,常见的几种时间复杂度有O(1)、O(log2n)、O(n)、O(nlog2n)、O(n2)、O(n3)、O(2n)等。T(n)=O(1)表示算法执行时间与问题规模无关。图1-1给出了各种具有代表性的时间复杂度T(n)与问题规模n的变化关系。图1-1时间复杂度函数曲线比较一个算法的时间复杂度除了与问题的规模有关外,还与输入的数据的次序有关,输入的次序不同,算法的复杂度也不同,所以当分析算法的复杂度时,还要考虑到最好、最坏和平均复杂度。

(2)空间度量

通常把算法在执行过程中临时占用的存储空间定义为算法的空间复杂度。

5.算法的描述

常用流程图、结构化流程图和伪代码等描述工具来描述算法。

(1)用流程图描述算法

流程图也称为框图,它是用一些几何框图、流程线和文字说明表示各种类型的操作。

【例1.3】用流程图来描述例1.1和例1.2的算法。

流程图分别如图1-2和图1-3所示。图1-2用一般流程图描述例1.1的算法图1-3用一般流程图描述例1.2的算法(2)用N-S图描述算法

①程序的3种基本结构

程序的3种基本结构:顺序结构、选择结构和循环结构。

顺序结构是最简单的一种基本结构,依次顺序执行不同的程序块,如图1-4所示。其中A块和B块分别代表某些操作,先执行A块然后再执行B块。图1-4顺序结构选择结构根据条件满足或不满足而去执行不同的程序块。在图1-5中,当条件P满足时执行A程序块,否则执行B程序块。 图1-5

选择结构循环结构亦称重复结构,是指重复执行某些操作,重复执行的部分称为循环体。循环结构分当型循环和直到型循环两种,分别如图1-6(a)和图1-6(b)所示。

(a)当型循环结构(b)直到型循环结构

图1-6循环结构两种循环结构的区别在于:当型循环结构是先判断条件,后执行循环体,而直到型循环结构则是先执行循环体,后判断条件。直到型循环至少执行一次循环体,而当型循环有可能一次也不执行循环体。3种基本程序结构具有如下共同特点:

只有一个入口。

只有一个出口。

结构中无死语句,即结构内的每一部分都有机会被执行。

结构中无死循环。

②结构化流程图(N-S图)

3种基本结构的N-S图画法规定如下:

顺序结构由若干个前后衔接的矩形块顺序组成,如图1-7所示。先执行A块,然后执行B块。各块中的内容表示一条或若干条需要顺序执行的操作。图1-7顺序结构的N-S图

选择结构如图1-8所示,在此结构内有两个分支,它表示当给定的条件满足时执行A块的操作,条件不满足时,执行B块的操作。图1-8选择结构的N-S图当型循环结构如图1-9(a)所示。先判断条件是否满足,若满足就执行A块(循环体),然后再返回判断条件是否满足,如满足再执行A块,如此循环下去,直到条件不满足为止。

直到型循环结构如图1-9(b)所示。它先执行A块(循环体),然后判断条件是否满足,如不满足则返回再执行A块,若满足则不再继续执行循环体了。(a)当型循环结构(b)直到型循环结构

图1-9循环结构的N-S图【例1.4】用N-S图来描述例1.1和例1.2的算法。

N-S图分别如图1-10和图1-11所示。图1-10用N-S图描述例1.1的算法图1-11用N-S图描述例1.2的算法(3)用伪代码描述算法

伪代码是介于自然语言和高级程序设计语言之间的一种文字和符号描述工具,它是结合某种高级语言一行一行、自上而下描述算法,书写方便,格式紧凑。

【例1.5】计算2+4+6+…+100的和并输出,设计算法并用C伪代码描述。

0→sum

1→i

whilei≤100

{

ifi/2的余数为0则sum+i→sum

i+1→i

}

输出sum

1.1.3程序设计方法

1.结构化程序设计

结构化程序设计采用自顶向下、逐步求精和模块化的分析方法,从而有效地将一个较复杂的程序分解成许多易于控制和处理的子程序,便于开发和维护。

自顶向下是指对设计的系统要有一个全面的理解,从问题的全局入手,把一个复杂问题分解成若干个相互独立的子问题,然后对每个子问题再作进一步的分解,如此重复,直到每个问题都容易解决为止。

逐步求精是指程序设计的过程是一个渐进的过程,先把一个子问题用一个程序模块来描述,再把每个模块的功能逐步分解细化为一系列的具体步骤,以致能用某种程序设计语言的基本控制语句来实现。逐步求精总是和自顶向下结合使用,一般把逐步求精看作自顶向下设计的具体体现。

模块化是结构化程序设计的重要原则。所谓模块化就是把大程序按照功能分为较小的程序。将一个庞大的模块分解为若干个子模块分别完成。然后用主控模块控制和调用子模块。这种程序的模块化结构如图1-12所示。图1-12程序的模块化结构

2.面向对象程序设计

面向对象程序设计则以对象作为程序的主体。对象是数据和操作的“封装体”,封装在对象内的程序通过“消息”来驱动运行。在图形用户界面上,消息可通过键盘或鼠标的某种操作(称为事件)来传递。

(1)对象

对象(Object)是指现实世界中客观存在的实体。每一个对象都有自己的属性(包括自己特有的属性和同类对象的共同属性)。属性反映对象自身状态变化,表现为当前的属性值。

方法是用来描述对象动态特征的一个操作序列。消息是用来请求对象执行某一操作或回答某些信息的要求,实际上是一个对象对另一个对象的调用。

(2)类

类(Class)是具有相同属性和方法的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述。将相似的对象分组形成一个类,每个这样的对象被称为类的一个实例,一个类中的所有对象共享一个公共的定义。

(3)封装

封装(Encapsulation)是指把对象属性和操作结合在一起,构成独立的单元,它的内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过有限的接口与对象发生联系。

(4)继承

继承(Inheritance)反映的是类与类之间抽象级别的不同,根据继承与被继承的关系,可分为基类和衍类,基类也称为父类,衍类也称为子类,正如“继承”这个词的字面含义一样,子类将从父类那里获得所有的属性和方法,并且可以对这些获得的属性和方法加以改造,使之具有自己的特点。一个父类可以派生出若干子类,每个子类都可以通过继承和改造获得自己的一套属性和方法,由此,父类表现出的是共性和一般性,子类表现出的是个性和特性,父类的抽象级别高于子类。

(5)多态性

不同的对象收到相同的消息产生不同的动作,这种功能称为多态性(Polymorphism)。将多态的概念应用于面向对象程序设计,增强了程序对客观世界的模拟性,使得对象程序具有了更好的可读性,更易于理解,而且显著提高了软件的可复用性和可扩充性。

1.2C语言的发展与特点

1.2.1C语言的发展历史

C语言是在B语言的基础上发展起来的,它的根源可以追溯到ALGOL60。

1960年出现的ALGOL60是一种面向问题的高级语言,它离硬件比较远,不宜用来编写系统软件。

1963年英国剑桥大学推出了CPL(CombinedProgrammingLanguage)语言。

1967年英国剑桥大学的M.Richards对CPL语言作了简化,推出了BCPL(BasicCombinedProgrammingLanguage)语言。1970年美国贝尔实验室的K.Thompson以BCPL语言为基础,又作了进一步简化,设计出了很简单而且很接近硬件的B语言(取BCPL的第一个字母),并用B语言编写第一个UNIX操作系统,在PDP-7机上实现。1971年在PDP-11/20机上实现了B语言,并写了UNIX操作系统。

1972年至1973年间,贝尔实验室的D.M.Ritchie在B语言的基础上设计出了C语言(取BCPL的第二个字母)。

1973年,K.Thompson和D.M.Ritchie两人合作把UNIX的90%以上用C语言改写(UNIX第5版,原来的UNIX操作系统是1969年由K.Thompson和D.M.Ritchie开发成功的,是用汇编语言写的)。

直到1975年UNIX第6版公布后,C语言的突出优点才引起人们普遍注意。1977年出现了不依赖于具体机器的C语言编译文本《可移植C语言编译程序》,使C语言移植到其他机器时所做的工作大大简化了,这也推动了UNIX操作系统迅速地在各种机器上实现。

现在C语言已风靡全世界,成为世界上应用最广泛的程序设计语言之一。

以1978年发表的UNIX第7版中的C编译程序为基础,B.W.Kernighan和D.M.Ritchie(合称K&R)合著了影响深远的名著《TheCProgrammingLanguage》,这本书中介绍的C语言成为后来广泛使用的C语言版本的基础,它被称为标准C。1983年,美国国家标准化协会(AmericanNationalStandardInstitute,ANSI)根据C语言问世以来各种版本对C的发展和扩充,制定了新的标准,称为ANSIC。ANSIC比原来的标准C有了很大的发展。K&R在1988年修改了他们的经典著作《TheCProgrammingLanguage》,按照ANSIC的标准重新写了该书。1987年,ANSIC又公布了新标准——87ANSIC。

1989年,ANSI又公布了一个新的C语言标准—ANSIX3.159-1989(简称C89)。1990年,国际标准化组织(InternationalOrganizationforStandardization,ISO)接纳C89为ISO国际标准(ISO/IEC9899:1990),因而有时也称为C90。ISOC90与ANSIC89基本上是相同的。

1995年,ISO对C90作了一些修订,称为C95。1999年,ISO又对C语言标准进行修订,命名为ISO/IEC9899:1999,简称C99规范。但到目前为止,各种C语言编译系统还没有完成对C99规范的完全支持。现在的编译器一般都支持C89,所以本书基本上以C89为基础。

1.2.2C语言的特点

(1)语言简洁紧凑,使用方便灵活。

(2)运算符丰富。

(3)数据类型丰富,具有现代语言的各种数据类型。

(4)具有结构化的控制语句。

(5)语法限制不太严格,程序设计自由度大。

(6)C语言兼有高级语言和低级语言的特点。

(7)生成目标代码质量高,程序执行效率高。

(8)与汇编语言比,用C语言写的程序可移植性好。

1.3C语言程序的基本结构

1.3.1初识C语言程序

【例1.6】在屏幕上显示一行文字“OneWorld,OneDream.”。

程序如下:

#include<stdio.h>

voidmain()

{

printf("OneWorld,OneDream.\n");

}

【例1.7】从键盘输入一个数x,求x的平方根,然后输出结果。

程序如下:

#include<stdio.h>

#include<math.h>

voidmain()

{

doublex,s;

printf("inputnumber:");

scanf("%lf",&x);

s=sqrt(x);

printf("Squarerootof%lfis%lf.\n",x,s);

}

【例1.8】由用户输入两个整数,程序执行后输出其中较大的数。

程序如下:

#include<stdio.h>

intmax(inta,intb);

/*函数声明*/

voidmain()

/*主函数*/

{

intx,y,z;

/*变量定义*/

printf("inputtwonumbers:\n");

scanf("%d%d",&x,&y);

/*输入x和y的值*/

z=max(x,y);

/*调用max函数*/

printf("maxima=%d\n",z);

/*输出z的值*/

}

intmax(inta,intb)

/*定义max函数*/

{

if(a>b)returna;

elsereturnb; /*把结果返回主调函数*/

}1.3.2C语言程序的结构特点与书写规则

1.C语言程序的结构特点

(1)一个C语言程序可以由一个或多个函数组成,且任何一个完整的C语言程序,都必须包含一个且只能包含一个名为main的函数,程序总是从main函数开始执行,而不管main函数处于程序的什么位置。因此函数是C语言程序的基本单位。

(2)函数体应由花括号“{}”括起来,函数体一般包括变量定义部分和执行部分,并且所有的变量定义语句应放在一起,且位于函数体的开始。

(3)可以用“/*”和“*/”对C语言程序中的任何部分作注释。注释除了能对程序作解释说明,以提高程序的可读性外,还能用于程序调试。

(4)一个C语言程序通常由带#号的编译预处理命令开始,其作用是将由双引号或尖括号括起来的文件名的内容插入到该命令所在的位置处。

(5)每个语句和变量定义的后面都要有一个分号,但在#include等预编译命令后面不要加分号,这一点初学者尤其要注意。

2.C语言程序的书写规则

(1)一个语句占一行。从语法上讲,C语言程序不存在程序行的概念。只要每个语句用分号作为结尾即可,多个语句可以写在一行。但为了层次清楚,一般情况下,一行只写一个语句。

(2)用花括号“{}”括起来的部分,通常表示了程序的某一层次结构。同一层次结构的语句上下对齐。

(3)低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写,以便使程序更加清晰,增加程序的可读性。

1.4C语言程序的运行

1.4.1C语言程序的运行步骤与调试

1.C语言程序的运行步骤

C语言程序在计算机上运行时一般要经过编辑、编译、连接和运行4个步骤,如图1-13所示

图1-13C语言程序的运行步骤2.程序调试

程序中的错误大致可分为3类:

(1)程序编译时检查出来的语法错误。

(2)连接时出现的错误。

(3)程序运行过程中出现的错误。

1.4.2VisualC++6.0集成开发环境

1.VisualC++6.0的安装

将VisualC++6.0系统安装盘放入光驱,一般情况下系统能自动运行安装程序,否则运行安装盘中的setup.exe文件。启动安装程序后,根据屏幕提示依次回答有关内容,便可完成系统安装。

2.启动VisualC++6.0

启动VisualC++6.0的过程十分简单。常用的方法是,在Windows桌面选择“开始”|“程序”|“MicrosoftVisualStudio6.0”|“MicrosoftVisualC++6.0”,即可启动VisualC++6.0,屏幕上将显示如图1-14所示的VisualC++6.0主窗口。

图1-14VisualC++6.0主窗口VisualC++6.0主窗口有标题栏、菜单栏和工具栏。标题栏的内容是MicrosoftVisualC++。菜单栏提供了编辑、运行和调试VisualC++程序所需要的菜单命令。VisualC++6.0共有9个菜单项,每个菜单项都有下拉菜单,单击菜单项将弹出其下拉菜单,下拉菜单中的每个菜单命令实现不同的功能。工具栏是一些菜单命令的快捷按钮。单击工具栏上的按钮,即可执行该按钮所代表的操作。

在VisualC++6.0主窗口的左侧是项目工作区(Workspace)窗口、右侧是程序编辑窗口、下方是输出(Output)窗口。项目工作区窗口用于显示所设定的工作区的信息,程序编辑窗口用于输入和修改源程序,输出窗口用于显示程序编译、运行和调试过程中出现的状态信息。

3.新建或打开C程序文件

在VisualC++6.0主窗口的菜单栏中选择File菜单的New菜单项,这时屏幕出现一个New对话框,如图1-15所示。单击对话框中的Files标签,选中C++SourceFile项,表示要建立新的源程序。在对话框右半部分的Location文本框中输入源程序文件的存储路径(如E:\cp),在File文本框中输入源程序文件名(如test.c)。

图1-15New对话框注意:

(1)源程序文件的存储路径一定要事先建好。即先要在E盘建立文件夹cp,才能输入上面的存储路径E:\cp。

(2)输入文件名时,一定要指定扩展名.c,否则系统将按C++扩展名.cpp保存。

在单击OK按钮后,回到VisualC++6.0主窗口,可以在编辑窗口中输入或修改源程序。由于完全是Windows界面,可以使用鼠标操作,输入和修改都十分方便。

如果源程序文件已经存在,可选择File菜单的Open菜单项,并在查找范围中找到正确的文件路径,打开指定的程序文件。

文件修改后要进行存盘操作。

4.程序的编译

在主窗口菜单栏中选择Build菜单的Compiletest.c菜单项,如果是首次编译,则屏幕出现一个对话框,如图1-16所示。编译命令要求建立一个项目工作区,询问用户是否同意建立一个默认的项目工作区。单击“是”按钮,表示同意由系统建立默认的项目工作区,然后开始编译。

图1-16编译过程中屏幕出现的一个对话框

也可以不用菜单操作,而直接按【Ctrl+F7】快捷键来完成编译。

在编译过程中,编译系统检查源程序中有无语法错,然后在输出窗口显示编译信息。如果程序没有语法错误,则生成目标文件test.obj,并将在输出窗口中显示(见图1-17)如下信息:

图1-17编译正确提示信息

TEST.OBJ-0error(s),0warning(s)

表示没有任何错误。有时出现几个警告性信息(warning),不影响程序执行。假如有致命性错误(error),则会指出错误的位置和信息,双击某行出错信息,程序窗口中会指示对应出错位置,根据信息窗口的提示分别予以修改。例如,将上面test.c中printf函数调用语句后面的分号去掉,重新编译,错误提示如图1-18所示。此时要根据错误信息分析提示错误原因并找到位置,对源程序进行修改。

图1-18编译出错提示信息

5.程序的连接

在主窗口菜单栏选择Build菜单中的Buildtest.exe菜单项,表示要求连接并生成一个可执行文件test.exe。同样,在输出窗口会显示连接信息,如果有错,则要返回去修改源程序。

以上介绍的是分别进行程序的编译和连接,也可以在主窗口菜单栏选择Build菜单中的Build菜单项(或按【F7】键)一次完成编译与连接。

6.程序的执行

在主窗口菜单栏选择Build菜单中的Executetest.exe菜单项(或按【Ctrl+F5】快捷键)执行程序。当程序执行后,VisualC++6.0将自动弹出数据输入输出窗口,如图1-19所示。第1行是执行scanf函数时,用户从键盘输入的r值,以回车键结束,第2行是printf函数的输出结果,按任意键将关闭该窗口图1-19数据输入输出窗口

7.关闭程序工作区

若要执行第2个程序,则必须关闭前一个程序的工作区,然后通过新的编译连接,产生第2个程序的工作区,否则运行的将一直是前一个程序。File菜单提供关闭程序工作区功能。执行CloseWorkspace菜单功能,然后在如图1-20所示的对话框中单击“否”按钮,将关闭程序工作区。如果单击“是”按钮将同时关闭源程序编辑窗口。

图1-20关闭程序工作区提示对话框

本章小结

1.程序设计反映了利用计算机解决实际问题的全过程,具体要经过以下4个基本步骤:分析问题,确定数学模

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论