搜档网
当前位置:搜档网 › C语言第1章至第七章

C语言第1章至第七章

C语言第1章至第七章
C语言第1章至第七章

第1章C语言概述

本章要点

了解C语言的特点,初步掌握C语言的基本结构,掌握在VC++6.0环境下C语言程序的编辑、编译、连接与运行,了解算法的概念及用传统流程图表示算法的方法。本章的重点和难点是VC++6.0集成环境下C 语言程序的运行方法。

第一节C语言的发展与特点

一、C语言的发展

C语言诞生以前,系统软件主要是用汇编语言编写的。但由于汇编语言依赖于计算机硬件,其可读性和可移植性都很差,而一般的高级语言又难以实现对计算机硬件直接进行操作。所以人们希望出现一种兼有汇编语言和高级语言优点的新语言,于是诞生了C语言。

C语言是由贝尔实验室的Dennis Ritchie在20世纪70年代初发明的,最初是作为UNIX 系统的开发语言。70年代末,随着微型计算机的发展,C语言开始移植到非UNIX环境中,并逐步成为独立的程序设计语言。1978年,Brian.W.Kernighan和Dennis.M.Ritchie出版了名著《The C Programming Language》,通常简称为《K&R》,该书中介绍的C语言成为后来广泛使用的C语言版本的基础,也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的标准C语言。继C语言问世之后出现了许多版本,由于没有统一的标准,不同C语言版本之间缺乏兼容。为了改变这种情况,美国国家标准化协会ANSI(American National Standards Institute)于1983年根据C语言问世以来各种版本对C语言的发展和扩充,公布了第一个C语言标准草案(’83 ANSI C)。1989年,ANSI公布了一个完整的C语言标准,常称ANSI C或C89,该标准定义了语言和一个标准C库。1990年,C89被国际标准化组织ISO (International Standard Organization)接受作为国际标准,常称C90,C89和C90实质上是同一个标准。1999年,ISO对C语言标准进行修订,在基本保留原来的C语言特征的基础上,针对应用的需要,增加了一些功能,尤其是C++中的一些功能,命名为C99。本书基本上以C89为基础进行介绍。

二、C语言的特点

C语言是一种用途广泛、功能强大、使用灵活的结构化程序设计语言。由于以下原因而在程序员中流行:

1.C语言具有结构化的高级编程语言应有的所有高级指令,使程序员不需要知道硬件细节。同时,C也具有一些低级指令,允许程序员能够直接快速地访问硬件。这种把高级语言的基本结构和语句与低级语言的实用性结合起来的特点使得C语言在通用程序设计和系统程序设计上都能满足程序员的需要。

2. C语言是结构式语言。结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。

3. C语言是一种高效的语言。在设计上它充分利用了当前计算机在能力上的优点,生成的目标代码质量高,运行速度快。

4. C语言简洁紧凑,使用方便灵活。C语言只有37个关键字,9种控制语句。程序书写形式自由,源程序短。

5. C语言运算符丰富。C语言提供的运算符范围广泛且功能强大,共有34种运算符,程序员可以简单地表达自己的意图,书写的程序更为简洁且运行效率更高。

6. C语言是一种可移植性语言。可移植性意味着在一个系统上编写的C程序经过很少改动或不经修改就可以在其他系统上运行。

当然,C语言也有一些缺点。由于用C语言进行程序设计时自由度大,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查,尤其是对指针的使用,可能经常出现难以追踪的编程错误。此外,C语言输入输出相对很多语言都较为复杂,对于字符串的处理,只能通过字符数组实现。与其他高级语言相比,C语言较难掌握。

第二节简单的C程序介绍

简单地讲,计算机程序是指用某种程序设计语言编写并能够运行于某种目标体系结构上的一组指令序列,告诉计算机完成一些特定的任务。C程序就是用C语言所编写的计算机程序。

先来看几个简单的C程序例子。

例1.1在屏幕上输出一行文字信息。

#include

void main()

{

printf ("Welcome to the world of C!\n");

}

程序运行结果:

Welcome to the world of C!

例1.2求两数之和。

#include

void main( )

{

int a,b,sum; /* 声明部分,定义整型变量a、b、sum*/

a=25;b=68; /* 以下3 行为C 语句*/

sum=a+b;

printf("sum=%d\n",sum);

}

程序运行结果:

sum=93

例1.3求两个数中较大者。

#include

int max(int a,int b) /*定义函数max,a和b为函数的接口,即形式参数*/ {

int c; /* max函数中的声明部分,定义整型变量c*/

if(a>b) c=a;

else c=b;

return (c); /*返回变量c的值*/

}

void main( )

{

int x,y,z; /* 主函数中的声明部分,定义整型变量x、y、z*/

printf("请输入两个整数:");

scanf(“%d,%d”,&x,&y);/*输入变量x和y的值*/

z=max(x,y); /*调用函数max,得到的值赋给z,x,y是实际参数*/ printf("两数中较大者为:%d\n",z);

}

程序运行结果:

请输入两个整数:20,35↙(从键盘上输入20,35,↙表示回车键,下同)

两数中较大者为:35

下面就程序中的一些知识点进行简单说明,在随后的章节中将逐一详细介绍。

(一)#include

三个程序中都包含了该行“文件包含”处理语句,其作用是告诉编译器包含文件stdio.h 中的全部信息。文件stdio.h是所有C语言编译包的一个标准部分,当在程序中用到系统提供的标准函数库中的输入输出函数时,必须包含该文件。

(二)void main( )

C程序包含一个或多个函数,它们是C程序的基本模块。例1.1和1.2只包含了一个main 函数,该函数是主函数,每一个C语言程序都必须有一个main函数。void表示此函数是“空类型”,即执行此函数后不产生函数值。例1.3中除了主函数main之外还有一个max函数,该函数是用户自定义函数,其作用是将a和b两个数中较大者的值赋给变量c,return语句的作用是将c的值返回给主调函数main。在主函数main中有一行语句“z=max(x,y);”,其作用是在主函数中调用max函数,函数的返回值赋给变量z。

(三)变量声明语句

例1.2和1.3中都包含了变量声明语句,如例1.2中的“int a,b,sum;”,例1.3中的“int x,y,z;”等。声明语句的作用是定义程序(或函数)中要使用的变量,并定义每个变量的类型。在C 语言中,要求对所有用到的变量必须先定义、后使用。

(四)scanf()和printf()

这是C语言提供的两个标准输入输出函数,scanf()是输入函数,printf()是输出函数。如例1.1中的“printf ("Welcome to the world of C!\n");”,该语句的作用是调用printf函数,输出括号内的字符串,“\n”是换行符,即在输出“Welcome to the world of C!”后回车换行,也就是把光标移到下一行的开始位置。例1.3中“scanf(“%d,%d”,&x,&y);”语句的作用是要求用户从键盘输入变量x和y的值,中间以逗号隔开,“&”是取地址符号。输入输出函数中的“%d”表示“以十进制整数类型”,用来指定输入输出时的数据类型和格式。

(五)/* ……*/

表示注释部分,注释只是为了帮助读者理解程序,在编译时将被编译器忽略,即编译和运行时不起作用。

第三节C程序的基本结构和语法基础

通过以上三个由简到难的程序,可以分析并了解组成一个C源程序的基本部分和书写格式。

(一)在程序开始,C语言用#include命令实现文件包含操作,通常称为编译预处理命令,作用是将尖括号内的文件(一般称之为“头文件”)包含到程序中,成为该程序的一部分。C语言的头文件中包括了各个标准库函数的函数原型。

(二)C语言程序是由函数构成的。每个C程序有且只有一个主函数main(),main函数可以放在程序中的任何位置,但程序总是从main函数开始执行。除了main函数外,程序还可以包含若干个其它函数,每个函数根据用户需求设计,完成某一特定的功能,多个函数之间可以相互调用。此外每个C语言版本都会提供很多库函数,在程序开发中可直接调用。

C语言函数由函数头和函数体两部分组成。

1.函数头,即函数的第一行。其结构如下:

函数类型函数名(形式参数1类型形式参数1名称,形式参数2类型形式参数2名称,……)

例如:int max(int a,int b)

函数也可以没有参数,如void main( )

2.函数体,函数头下面花括号内的部分称为函数体。如果一个函数中包含多个花括号,最外面一层花括号所包含部分是函数体范围。

函数体由声明部分和执行部分组成。声明部分对程序中所使用的变量进行说明,执行部分由若干条语句组成。

(三)C语言程序语句以分号结束,分号是语句的一部分。但是,预处理命令、函数头和花括号“}”之后不能加分号。

(四)C语言程序中,/*和*/之间的部分称为注释,目的是为了增加程序的可读性,但

在程序执行过程中不起任何作用。C语言的注释可以出现在程序中的任何地方,一个较长的注释可以放在一行或是多行上。无论你使用何种编程语言,一个好的源程序都应该有必要的、完整的注释。

(五)C语言中的关键字。所谓关键字是指在C语言中已经使用了的有特殊含义的字符,在程序中不能作其它用途使用,也成为保留字。例如“int”用于声明整型变量或函数,“if”用来控制程序中语句的执行顺序。在定义变量名或函数名时不能使用这些关键字,否则在编译时会产生错误。

由ANSI标准定义的C语言关键字共有32个。根据关键字的作用,可分为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类,如表1-1所示。

C99标准中新增了五个关键字:restrict,inline,_Complex,_Imaginary,_Bool,读者可参考其它相关的书籍。

(六)C语言程序书写格式比较自由,例如一行可以写一个语句也可以写多个语句,一个语句可以分写在多行上。

一个优秀的编程人员,不仅要实现程序的功能,也要让自己的程序具有良好的可读性。尤其对于一个团对而言,良好的可读性不仅利于团队成员之间的互相交流,也为软件后期维护节约成本,因此在编写程序时一定要养成良好的编程风格。从上一节的三个例子中可以看出,在书写程序时注重了以下几个方面:缩进,每行只写一条语句,添加必要的注释等。此外,在使用变量名和函数名时尽量做到“见名知意”,例如声明语句“int Stu_age;”,从变量名Stu_age可以立即看出该变量表示学生的年龄。同时为了避免一些小的不易发现的错误,在书写成对的符号如“{ }”、“( )”时,尽量先成对的写出,再在符号之间添加内容。关于如何使得程序的逻辑结构更为清晰,可读性更好,在以后的编程中可以慢慢领悟。

第四节C程序的运行

一、Visual C++ 编译系统简介

Visual c++是微软公司推出的一个功能强大的可视化软件开发工具,目前比较常用的版本是Visual C++ 6.0,简称VC 6.0。VC 6.0不仅仅是一个C/C++编译器,它为用户提供了一套良好的可视化开发环境,包括文本编辑器、资源编辑器、工程创建工具、调试器、程序向导AppWizard、类向导ClassWizard等等。用户可以在集成开发环境中创建工程、打开工程,建立、打开和编辑文件、编译、链接、调试、运行应用程序。

在Windows环境中运行VC 6.0后,即进入C/C++语言的集成开发环境。程序运行的主界

面如图1-1所示。

图1-1 Microsoft Visual C++6.0集成开发环境

VC6.0集成开发环境的主框架窗口由标题栏、菜单栏、工具栏、工作区、客户区、输出窗口和状态栏等组成。标题栏用于显示应用程序名和当前打开的文件名;工作区用于显示当前打开工程的有关信息,包括工程的类、资源以及文件组成等内容;客户区用于文本编辑器、资源编辑器等进行文件或资源的编辑;输出窗口用于输出编译信息、调试信息和一些查询结果信息等;状态栏用于显示关于菜单栏、工具栏等的简单说明信息以及文本编辑器中当前光标所在的行列号等。

二、C程序的编译与链接

在计算机上运行一个C程序,必须经过以下几个步骤:输入与编辑源程序→编译源程序得到目标程序→将目标程序与系统库函数连接得到可执行程序→运行可执行程序得到结果。整个过程如图1-2所示。

图1-2 C程序运行流程图

下面以创建一个最简单的C语言程序为例,介绍如何在VC 6.0环境下创建、编写、编译、调试、运行一个C语言程序。此处假定程序只由一个源文件组成,即单文件程序。

1. 启动VC 6.0集成开发环境。

2. 新建一个文件。选择菜单栏中的“File”(文件),在其下拉菜单中选择“New”(新建),屏幕上出现New(新建)对话框,如图1-3所示。

图1-3 New(新建)对话框

该对话框包含四个标签:Files(文件)、Projects(工程)、Workspaces(工作区)和Other Documents(其它文档)。选择Files标签,在其下列表中选择“C++ Source File”项,在对话框右边的File(文件名)文本框中输入将要编辑的源程序文件的名称,例如“c1.c”。“.c”是C

源程序的后缀,如果不指定后缀,默认后缀是“.cpp”,其为C++源程序的后缀。在Location (位置)文本框中输入将要编辑的源程序文件的存储路径,或单击该文本框后的图标选择路径。此处假定路径为“D:\C程序示例”。单击“OK”(确定)按钮,回到主窗口。

3. 编辑C语言程序源代码。在主窗口的客户区中输入并编辑如下程序:

#include

void main( )

{

printf("*************************\n");

printf ("Welcome to the world of C!\n");

printf("*************************\n");

}

输入编辑完成后,选择菜单“File”下的“Save”保存源程序文件,也可以按工具栏上的

按钮,或是使用快捷键“Ctrl+S”。

如果要打开一个已有的源文件,选择菜单“File”下的“Open”(打开)子菜单,在弹出的Open对话框中选择要打开的源文件路径和名称。

4. 编译源文件。选择菜单栏中的“Build”(构建),在其下拉菜单中选择“Compile c1.c”(编译c1.c)编译文件,也可以使用工具栏上的按钮,或是使用快捷键“Ctrl+F7”。单击编译命令后,屏幕上出现如图1-4所示的对话框。

图1-4

意思是:此编译命令要求一个有效的项目工作区,你是否同意建立一个默认的项目工作区?单击“是”按钮。表示同意由系统建立默认的项目工作区,然后开始编译程序。

在对源代码进行编译时如果出现错误,在输出窗口中会显示错误的位置和类型。错误信息分为两类:以error提示的致命错误和以warning提示的警告错误。如果有error错误,程序编译不能通过,也就无法运行。而warning错误不影响生成目标程序和可执行程序,但是可能会影响程序运行的结果。例如在输入时故意漏掉最后一个printf语句后面的分号,那么程序经过编译后在输出窗口中出现的提示信息如图1-5所示。

图1-5 输出窗口提示信息

“1 error(s)”表明在程序中有一个错误。在输出窗口的错误提示行上双击鼠标左键,可以定位至程序中的出错处(在客户区的程序中出现一粗箭头指向被报错的程序行)。

程序中的错误通常叫做bugs,发现和修正这些错误的过程叫做调试(debugging)。

值得注意的是,并不是任何时候真正的错误就出现在该行,有时候需要扩大差错范围才能找到错误之所在。另外如果提示有多个错误,我们没有必要试图一次性改正所有的错误,可以先修改一个或两个(最好是你能立即理解并知道如何修正的错误),然后重新编译,此时某些错误提示可能就会消失。不断调试程序,直到输出窗口中显示“c1.obj - 0 error(s), 0 warning(s)”。“c1.obj”是“c1.c”经过编译后生成的目标文件。

5. 连接程序。选择菜单栏中的“Build”,在其下拉菜单中选择“Buid c1.exe”(构建c1.exe),也可以使用工具栏上的按钮,或是使用快捷键“F7”。完成连接后生成了可执行文件c1.exe。

三、C程序的运行

得到可执行文件c1.exe后,选择菜单栏中的“Build”,在其下拉菜单中选择“!Execute c1.exe”(执行c1.exe),也可以使用工具栏上的按钮,或是使用快捷键“Ctrl+F5”运行程序。运行结果窗口如图1-6所示。

图1-6 运行结果窗口

运行结果的窗口中共有四行信息,前三行通过程序中的printf语句输出,最后一行“Press any key to continue”并不是程序所产生的输出结果,而是VC 6.0系统自动加上的一行信息,所有程序运行结果的最后一行都会自动添加此行信息,意思是:按任意键继续。当按下任意

一键后,该窗口消失,返回VC 6.0的主窗口。

以上只是介绍一个程序只包含一个源文件的情况,如果一个程序包含了多个源文件,只是在程序的创建上有所不同,程序的编译、连接及运行方法一样,具体请参考其它相关书籍,此处不再赘述。

第五节算法

一、算法概念

著名计算机科学家沃思(Nikiklaus Wirth)提出如下公式:程序=算法+数据结构

算法是程序的灵魂,数据结构是加工对象。除了这两个要素外,一个程序还应当采取合适的设计方法及选择合适的工具。所以,程序应该包含四个方面,表示成公式即为:程序=算法+数据结构+程序设计方法+语言工具和环境

本书重点在C语言上,所以对算法只是进行简单的介绍。

何为算法?简单地理解,算法就是逐步解决问题的方法。例如要研究一个从四个数中找出最大数的算法,我们可能会采取以下步骤:

S1:比较第一和第二个数,把两个数中较大的那个数放在当前最大值中;

S2:用当前的最大值与第三个数进行比较,两者中较大数放在当前最大值中;

S3:用当前的最大值与第四个数进行比较,两者中较大数放在当前最大值中。

这时的当前最大值就是四个数中最大的那个数。

一个算法应该具有以下特点:

(1)有穷性:一个算法应包含有限的操作步骤,即算法必须能够在有限的时间内终止。

(2)确定性:算法的每一步都必须有清晰明白的定义,而不能是含糊的、模棱两可的。

(3)有零个或多个输入。

(4)有一个或多个输出。算法必须产生结果,否则就失去了意义。

(5)有效性:算法中每一步应当能有效地执行,并得到确定的结果。

二、算法举例

例1.4求1+2+3+ (100)

设两个变量:sum表示被加数,n表示加数,每次相加的结果放在被加数sum中。算法表示如下:

S1:1→sum

S2:1→n

S3:n+1→n

S4:sum+n→sum

S5:如果n小于100,返回重新执行S3及其以后的步骤;否则,算法结束,最后得到的sum值就是所要的结果。

例1.5输入一个大于或等于3的正整数,判断它是否是素数。

所谓素数,是指除了1和该数本身之外,不能被其它任何整数整除的数。判断一个数是

否是素数的方法:将n作为被除数,将2到n之间的整数作为除数,如果都不能被整除,则n 为素数。

另设两个变量:i表示除数,r表示余数。算法表示如下:

S1:输入n的值

S2:2→i

S3:n被i除,得到余数r

S4:如果r=0,则输出n“不是素数”,算法结束;否则执行S5

S5:i+1→i

S6:如果i≤n,返回S3;否则输出n“是素数”,算法结束。

三、用传统流程图表示算法

自然语言、流程图和伪代码都可以用来表示算法,其中流程图是算法的图形化表示方法,用图形表示算法直观形象,易于理解。

(一)流程图基本符号

美国标准化协会ANSI规定了一些常用的流程图符号,如图1-7所示,已为世界各国程序工作者普遍采用。

图1-7 流程图基本符号

(二)三种基本结构

计算机科学家们提出了三种基本结构:顺序、选择和循环。任何一个复杂的算法都可以使用这三种结构来描述。

1. 顺序结构,是最简单的一种基本结构。如图1-8所示,先执行A操作,再执行B操作。

2. 选择结构,又称为判断结构或分支结构。如图1-9所示,当p条件成立时执行A操作,当p条件不成立时执行B操作。注意,无论条件p是否成立,A或B两个操作中只能有一个

被执行。A或B操作允许为空操作。

3. 循环结构,根据条件重复执行同一操作。如图1-10所示,当条件p成立时,反复执行A操作,直到p条件不成立为止。

图1-8 顺序结构图1-9 选择结构图1-10 循环结构

三种基本结构的共同特点:

(1)只有一个入口;

(2)只有一个出口;

(3)结构内的每一部分都有机会被执行到;

(4)结构内不存在“死循环”。

例1.4和1.5两个算法用流程图表示分别如图1-11和图1-12所示。

图1-11图1-12

本章小结

本章简述了C语言的发展与特点,C语言程序的基本结构及语法基础,介绍了在VC++6.0环境下C语言程序的编辑、编译、连接与运行方法,简要介绍了算法的概念及算法的传统流程图表示方法。

在计算机上运行一个C语言程序,必须经过以下几个步骤:输入与编辑源程序、编译源程序得到目标程序、将目标程序与系统库函数连接得到可执行程序、运行可执行程序得到结果。

学习本章内容,应重点掌握构成一个C语言程序的基本结构及在VC 6.0集成环境下程序的编译、连接及运行方法。

习题

一、选择题

1.C语言是一种()。

A. 低级语言

B. 汇编语言

C. 高级语言

D. 机器语言2.以下不是C语言的特点的是()。

A. 语言简洁紧凑

B. 可以直接对硬件进行操作

C. 数据类型丰富

D. 是面向对象的程序设计语言

3.一个C程序的执行是从()。

A. 本程序的main函数开始,到main函数结束

B. 本函数的第一个数开始,到本程序文件的最后一个函数结束

C. 本程序的main函数开始,到本程序文件的最后一个函数结束

D. 本函数的第一个数开始,到本程序main函数结束

4.以下叙述正确的是()。

A. 在C程序中,main函数必须位于程序的最前面

B. C程序的每行只能写一条语句

C. C语言的本身没有输入输出语句

D. 在对一个C程序进行编译的过程中,可以发现注释中的拼写错误

5.以下叙述不正确的是()。

A. 一个C源程序可由一个或多个函数组成

B. 一个C源程序必须包括一个main函数

C. C程序的基本组成单位是函数

D. 在C程序中,注释说明只能位于一条语句的后面

6.以下叙述中正确的是()。

A. C程序的基本组成单位是语句

B. C程序中的每一行只能写一条语句

C. C语句必须以分号结束

D. C语言必须在一行内写完

7.下列叙述中正确的是()。

A. 每个C程序文件中都必须要有一个main函数

B. 在C程序中main()位置是固定的

C. C程序中所有函数之间都可以相互调用,与函数所在位置无关

D. 在C程序的函数中不能定义另一个函数

8.C语言源程序的基本单位是()。

A. 过程

B. 函数

C. 子程序

D. 标识符

9.下列关于算法的特点描述中错误的是()。

A. 有穷性

B. 确定性

C. 有零个或多个输入

D. 有零个或多个输出10.用C语言编写的代码程序()。

A. 可立即执行

B. 是一个源程序

C. 经过编译即可执行

D. 经过编译解释才能执行

二、填空题

1.C语言的源程序必须通过和连接后,才能被计算机执行。

2.C语言源程序文件的后缀是.c;经过编译后,生成文件的后缀是. obj;经过连接后,生成文件的后缀是。

3.C语言从源程序的书写到上机运行输出结果要经过编辑、、连接、执行四个步骤。

4.结构化程序由、选择结构和循环结构三种基本结构组成。

5.C语言源程序的基本单位是。

6.一个C语言源程序是由若干函数组成,其中至少应含有一个。

7.在一个C语言源程序中,注释部分两侧的分界符为。

8.是程序设计的灵魂。

9.C语言程序只能从开始执行。

10.自然语言、流程图和伪代码都可以用来表示算法,其中是算法的图形化表示方法。

三、编程/思考题

1.简述C语言的主要特点。

2.要得到一个可以正常运行的C语言程序,一般经过哪几个过程?

3.算法具有哪些特点?

4.用流程图表示求解1×2×3×4×5的算法。

5.参照本章例题,编写一个C程序,输出以下信息:

*********************************

This is a simple C program!

*********************************

相关主题