620 likes | 728 Views
第 1 章 C 语言概述 C 语言是一种国内外广泛流行的、已经得到普遍应用的程序设计语言,它既可以用来编写系统软件,又可以用来编写应用软件。 本章主要介绍 C 语言的发展过程、特点、结构、运行过程和算法描述以及程序设计的基本概念。. 第 1 章 C 语言概述. 1.1 程序设计语言的发展历程 1.2 C 语言的发展历程 1.3 C 语言的主要特点 1.4 C 语言程序的基本组成 1.5 C 语言程序的书写风格 1.6 C 语言程序的编译及运行 1.7 程序及算法 1.8 程序设计方法
E N D
第1章 C语言概述C语言是一种国内外广泛流行的、已经得到普遍应用的程序设计语言,它既可以用来编写系统软件,又可以用来编写应用软件。 本章主要介绍 C语言的发展过程、特点、结构、运行过程和算法描述以及程序设计的基本概念。
第1章 C语言概述 1.1 程序设计语言的发展历程 1.2 C语言的发展历程 1.3 C语言的主要特点 1.4 C语言程序的基本组成 1.5 C语言程序的书写风格 1.6 C语言程序的编译及运行 1.7 程序及算法 1.8 程序设计方法 1.9 Visual C++6.0的运行环境及基本操作 1.10 程序举例 第 1 章
1.1 程序设计语言的发展历程计算机是由人来指挥的,人们为了用计算机来解决实际问题,一般总是要编制程序。所谓程序,是指用某种程序设计语言为工具编制出来的指令序列,它表达了人们解决问题的思路,用于指挥计算机进行一系列操作,从而实现预定的功能。程序设计语言(也称为计算机语言)就是用户用来编写程序的语言,它是人与计算机之间交换信息的工具。 程序设计语言就其发展过程和特点,一般可以分为机器语言、汇编语言和高级语言。
1.1 程序设计语言的发展历程 (1)机器语言(Machine Language) 计算机硬件系统只能执行由0和1二进制代码构成的操作指 令。每一台计算机都有一套指令系统,指令系统中的每一条指 令称为机器指令。每一种类的计算机都有它特有的机器指令系 统,这样的机器指令集合称为机器语言。 用机器语言编写的程序,称为机器语言程序。计算机可以 直接识别并执行机器语言程序。 例如,“101110001110100000000011”的功能仅仅表示将1000 送入寄存器AX中。
1.1 程序设计语言的发展历程 (2)汇编语言(Assemble Language) 为了方便记忆和编写程序,人们用一些符号和简单的语法来表示二进制形式的机器指令。 汇编语言编写的程序称为汇编语言源程序。这种程序计算机是不能直接识别和执行的,必须通过一个专门的程序(汇编程序)将这些符号翻译成二进制数的机器语言才能执行。这种“汇编程序”就是汇编语言的翻译程序。 例如,用符号ADD表示加法,用符号SUB表示减法,用机器语言表示的“101110001110100000000011”,用汇编语言表示为“MOV AX,1000”。 与机器语言相比,汇编语言仅仅改进了指令表示方法,比机器语言易记、易读、易写。汇编语言和机器语言都是面向机器的程序设计语言,一般称为“低级语言”。
1.1 程序设计语言的发展历程 汇编语言程序的执行过程 图1-1 汇编语言程序的执行过程
1.1 程序设计语言的发展历程 (3)高级语言(High Level Language) 高级语言使用接近人类习惯的自然语言来编写计算机程序,如FORTRAN语言、C语言等。 例如,下列C语言程序段: if(x>y) max=x; else max=y; 表示“如果x大于y,则max=x,否则max=y”。对于稍稍有点英语基础的人都很容易理解语句的含义,也便于记忆。
1.1 程序设计语言的发展历程 (3)高级语言(High Level Language) 由于高级语言与具体的计算机指令系统无关,因而高级语言是一种面向操作者(用户)的语言。用高级语言编写的程序能在不同类型的计算机上运行,通用性好,这大大地促进了计算机应用的普及。 用高级语言编写的程序称为高级语言源程序。计算机不能直接识别和执行这种程序,必须经过翻译,才能将其转换成机器语言程序执行。 翻译的方法有两种,解释方式和编译方式。
1.1 程序设计语言的发展历程 解释方式 图1-2高级语言解释执行方式 编译方式 图1-3 高级语言编译执行方式
1.2 C语言的发展历程 随着计算机应用的迅速发展,各种功能强大使用方便的高级语言相继出现,高级语言使用方便,可移植性好。但高级语言一般难以实现低级语言能够直接操作计算机硬件的特点(如对内存地址的操作等)。在这样的情况下,人们希望有一种语言既有高级语言使用方便的优点,又有低级语言能够直接操作计算机硬件的优点,因此,C语言就运用而产生了。
1.2 C语言的发展历程 1963年英国的剑桥大学在ALGOL 60的基础上推出了CPL语言,但是CPL语言难以实现。1967年英国剑桥大学的学者对CPL语言作了简化和改进,推出了BCPL语言。1970年美国贝尔实验室的学者以BCPL语言为基础,又作了进一步的简化,设计出了很简单且接近硬件的B语言。1972年由美国的学者在B语言的基础上设计出了C语言。 1977年D.M.Ritchie发表了不依赖于具体机器的C语言编译文本《可移植C语言编译程序》,使C语言移植到其他机器时所需要的工作大大简化了。1978年以后,C语言先后移植到大、中、小、微型计算机上。C语言很快风靡全世界,成为世界上应用最广泛的程序设计语言。
1.3 C语言的主要特点 C 语言发展十分迅速,而且成为最受欢迎的语言之一,主要因为它具有强大的功能。许多著名的系统软件,如 UNIX 操作系统就是由C语言编写的。另外,C语言还成功地用于数值计算、文字处理、图形处理、数据库、计算机网络和多媒体等。归纳起来 C 语言具有6个特点。
1.3 C语言的主要特点 (1) 语言简洁,结构紧凑,使用方便、灵活 C语言一共只有32个关键字和9种控制语句,且源程序书写格式自由。 (2) 具有丰富的运算符和数据结构 C语言把括号、赋值、数据类型转换等都作为运算符处理,从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其他高级语言中难以描述的运算,并具有现代程序设计语言的各种数据结构,尤其是指针类型数据,使用十分灵活和多样化。 (3) C语言是结构化语言 C语言是一种结构化程序设计语言,适合于大型程序的模块化设计。
1.3 C语言的主要特点 (4) C语言允许直接访问物理地址 C语言能够直接对内存地址进行访问操作,可以实现汇编语言的大部分功能。所以,它既有高级语言的功能,又兼有汇编语言的大部分功能。有时,也称它为“中级语言”。 (5) 生成的目标代码效率高 C语言仅比汇编程序生成的目标代码执行效率低10~20%。这在高级语言中已是出类拔萃的了。 (6) C语言适用范围大,可移植性好 C 语言还有一个突出的优点就是基本上不做修改就能用于各种型号的计算机和各种操作系统。
1.4 C语言程序的基本组成 例1.1 输出:Let’s study the C language!。 /* This is the first C program */ #include <stdio.h>/*程序需要使用C语言提供的标准函数库*/ void main()/*主函数*/ { printf("Let's study the C language!\n"); /*调用库函数printf显示字符串*/ } 程序运行结果: Let's study the C language!
1.4 C语言程序的基本组成 例1.2 求两个数a与b之和。 /* This is the second C program */ #include <stdio.h>/* 程序需要使用C语言提供的标准函数库 */ void main()/* 主函数 */ { int a,b,sum; /* 定义a,b,sum三个整型变量 */ a=123; /* 把常数123赋给变量a */ b=456; /* 把常数456赋给变量b */ sum=a+b; /* 将a、b的和赋给变量sum */ printf("sum is:%d\n",sum); /* 在屏幕上输出sum的值 */ } 程序运行结果: sum is: 579
1.4 C语言程序的基本组成 例1.3 从键盘输入两个整数,在屏幕上输出它们的最大值。 /* This is the third C program */ #include <stdio.h>/* 程序需要使用C语言提供的标准函数库 */ int max(int x,int y)/*定义函数max(),形参x、y为整型,返回整型值*/ { int z; /* 定义变量z为整型 */ if(x>y) /* 条件判断语句,判断x是否大于y */ z=x; /* 条件为真时,将x值赋给z */ else z=y; /* 条件为假时,将y值赋给z */ return(z); /* 返回z的值 */ }
1.4 C语言程序的基本组成 void main()/* 主函数 */ { int a,b,c; /* 定义a,b,c三个整型变量 */ printf("input a,b="); /* 输出提示字符串input a,b= */ scanf("%d,%d",&a,&b); /* 由键盘输入a和b的值 */ c=max(a,b); /* 调用函数max,并将返回的值赋值给变量c */ printf("max is:%d\n",c); /* 输出结果 */ } 程序运行结果: input a,b=6,11↙(符号“↙”表示回车) max is:11
1.4 C语言程序的基本组成 程序解释(以例3为例): ①定义了两个函数:主函数main()和被调用函数max() main()函数中调用了三个函数:scanf()、max()和printf(),程序中只提供了max()函数的定义,因为scanf()和printf()函数是C语言提供的标准函数(也称为库函数),故可以通过文件包含命令#include将stdio.h头文件包含进来后在程序中就可以直接调用了。函数max()不是库函数,而是用户自己定义的函数(自定义函数),调用时必须提供函数的定义,才能使用。
1.4 C语言程序的基本组成 ② 一个自定义函数由两部分组成 · 函数的首部 · 函数体
1.4 C语言程序的基本组成 · 函数的首部:即函数的第一行,包括函数名、函数类型、参数 类型和参数名。函数名后面必须跟一对圆括号, 函数参数可以没有。 例如: 没有参数 函数类型 函数类型 参数名 函数名 参数类型 参数类型 参数名 函数名 int max ( int x, int y) { int z; if(x>y) z=x; else z=y; return(z); } void main( ) { printf("Let's study the C!"); }
1.4 C语言程序的基本组成 ·函数体。即函数首部下面的大括号{……}内的部分。如果一个函数内有多个大括号,则最外层的一对{}为函数的范围。函数体一般包括说明部分和执行部分,它们都是C语句。 说明部分(也称数据定义部分或声明部分)用于定义函数内部所用到的所有变量的名字、变量的类型,并可对变量指定初值。执行部分用于完成函数内部所规定的各项操作。 int max ( int x, int y) { int z; if(x>y) z=x; else z=y; return(z); } void main( ) { printf("Let's study the C!"); }
1.4 C语言程序的基本组成 C语言程序的结构特点: ① C语言程序主要由函数构成,C语言程序中有主函数main()、开发系统提供的库函数(如printf()、scanf()等)以及程序员自己设计的自定义函数(max()等)三种类型的函数。 ② 一个程序总是从主函数(main()函数)开始执行的,无论主函数写在程序的什么位置。 ③ 语言没有输入输出语句,在C语言中输入输出操作是由函数实现的。 #include <stdio.h> int max( int x, int y) { int z; if(x>y) z=x; else z=y; return(z); } void main() { int a,b,c; printf("input a,b="); scanf("%d,%d",&a,&b); c=max(a,b); printf("max is:%d\n",c); }
1.4 C语言程序的基本组成 #include <stdio.h> int max( int x, int y) { int z; if(x>y) z=x; else z=y; return(z); } void main() { int a,b,c; printf("input a,b="); scanf("%d,%d",&a,&b); c=max(a,b); printf("max is:%d\n",c); } C语言程序的结构特点: ④ 一个函数由说明部分和执行部分两部分构成。说明部分在前,执行部分在后,两部分的顺序不能颠倒 ,也不能交叉。 ⑤ C语言的语句都是以分号结尾。 ⑥程序中有预处理命令(如include等),预处理命令通常应放在程序的最前面。
1.4 C语言程序的基本组成 C语言程序的结构特点: ⑦C程序书写格式自由,一个语句可以占多行,一行也可以 有多个语句。 例1.2 求两个数a与b之和。 #include <stdio.h> void main() { int a,b,sum; a=123; b=456; sum=a+b; printf("sum is:%d\n",sum); } 例1.2 求两个数a与b之和。 #include <stdio.h> void main() { int a,b,sum; a=123; b=456; sum=a+b; printf("sum is:%d\n",sum); }
1.4 C语言程序的基本组成 C语言程序的结构特点: ⑧ 为了增加程序的可读性和易读性,C语言程序中可用 /* 字符串 */对程序进行注释。 例1.2 求两个数a与b之和。 /* This is the second C program */ #include <stdio.h> /* 程序需要使用C语言提供的标准函数库 */ void main() /* 主函数 */ { int a,b,sum; /* 定义a,b,sum三个整型变量 */ a=123; /* 把常数123赋给变量a */ b=456; /* 把常数456赋给变量b */ sum=a+b; /* 将a、b的和赋给变量sum */ printf("sum is:%d\n",sum); /* 在屏幕上输出sum的值 */ }
1.5 C语言程序的书写风格 书写C语言程序时应遵循以下规则: • ① 一个说明或一个语句占一行。 • ② 函数与函数之间加空行,以清晰地分出程序中有几个函数。 • 用{}括起来的部分,通常表示了程序的某一层次结构。{}一 • 般与该结构语句的第一个字母对齐,并单独占一行。 • ④ 低一层次的语句或说明可比高一层次的语句或说明缩进若干 格后书写,同一个层次的语句左对齐,以便看起来更加清晰,增加程序的可读性。 • ⑤ 对于数据的输入,运行时最好要出现输入提示,对于数据的输出,也要有一定的提示格式。 • ⑥ 为了增加程序的可读性,对语句和函数,应加上适当的注释。
1.5 C语言程序的书写风格 例 1.4 将例 1.3的程序以不规范的形式书写如下。 #include <stdio.h> int max(int x,int y) { int z; if(x>y) z=x; else z=y; return(z); } void main( ) { int a,b,c; printf("input a,b="); scanf("%d,%d",&a,&b); c=max(a,b); printf("max is:%d\n",c); } #include <stdio.h> int max(int x,int y) { int z; if(x>y) z=x; else z=y; return(z); } void main( ) { int a,b,c; printf("input a,b="); scanf("%d,%d",&a,&b); c=max(a,b); printf("max is:%d\n",c); }
1.6 C语言程序的编译及运行 C语言是一种编译型的高级语言,描述解决问题算法的C语言源程序文件(*.c),必须先用C语言编译程序(Compiler)编译,形成中间目标程序文件(*.obj),然后再用连接程序(Linker)将该中间目标程序文件与有关的库文件(*.lib)和其他有关的中间目标程序文件连接起来,形成最终可以在计算机操作系统平台上运行的二进制形式的可执行文件(*.exe)。
1.6 C语言程序的编译及运行 2. 程序编译(Compiler) 将上一步形成的源程序文件作为编译程序的输入,进行编译。编译程序会自动分析、检查源程序的语法错误,并按两类错误类型(warning和error)报告出错行和原因。用户可根据报告信息修改源程序,再编译,直到程序正确后,输出中间目标程序文件(*.obj)。 • 源文件的编辑(edit) • 为了编译C源程序,首先要用系统提供的编辑器建立一个C语言程序的源文件。一个C源文件是一个编译单位,它是以文本格式保存的。源文件名自定,文件的扩展名(或后缀名)为“c”或“cpp”(C++的约定)。例如,myfile.c和file.cpp。 3. 连接程序(Link) 使用连接程序,将上一步形成的中间目标文件与所指定的库文件和其他中间目标文件连接,这期间可能出现缺少库函数等连接错误,同样连接程序会报告错误信息。用户可根据错误报告信息修改源程序,再编译,再连接,直到程序正确无误后输出可执行文件(*.exe)。 4. 程序运行(Run) 执行文件生成后,就可执行它了。若执行的结果达到预想的结果,则说明程序编写正确,否则,就需要进一步检查修改源程序,重复上述步骤,直至得到正确的运行结果为止。 图1-4 C语言程序的执行过程
1.7 程序及算法 1.7.1 程序 一个程序应该包括以下两方面的内容: (1)对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构。 (2)对数据操作的描述,即操作步骤,就是算法。 数据是操作的对象,操作的目的是对数据进行加工处理,以得到期望的结果。作为程序设计人员,必须认真考虑和设计数据结构及操作步骤(即算法)。因此,瑞士著名计算机科学家沃思(Nikiklaus Wirth)在1976年提出了一个公式: 程序=数据结构+算法
1.7 程序及算法 一个实际的程序除了以上两个主要因素之外,还应当采用合适的程序设计方法进行程序设计,并且用某一种计算机语言来表示: 程序=算法+数据结构+程序设计方法+语言工具和环境
1.7 程序及算法 1.7.2 算法的概念 广义地说,算法是指为解决一个问题而采取的方法和步骤。 • 一个算法应该具有以下5个特性: • (1) 有穷性。一个算法应包含有限的操作步骤,而不能是无限的。 • 确定性。算法中的每一个步骤都必须很清楚地表达出来。即 • 算法的含义应当是唯一的,而不应当产生“歧义性”。 • (3) 输入。包含零个或一个以上的输入数据。 • (4) 输出。至少产生一个输出的结果,没有输出的算法是无意义的 • (5) 有效性。算法中的每一个步骤都应当有效地执行,并得到确定的结果。 计算机算法可分为两大类别:数值运算算法和非数值运算算法。
1.7 程序及算法 1.7.3 算法的描述 算法一定是可描述的,一个无法用任何语言描述的算法等于没有算法。算法的描述具有重要意义,描述一个算法的目的在于使其他人能够利用算法解决具体问题。 算法的描述方式没有统一规定,可以用不同的方法。常用的方法有自然语言、伪代码、流程图、N-S图等方式。但需要注意的是,不论是哪类方式,对它们的基本要求都是能提供对算法的无歧义的描述,以便使我们能够将这种描述很容易转换成计算机程序。
1.7 程序及算法 1.7.3 算法的描述 1.流程图方式 流程图是用一些图框表示各种类型的操作,用线表示这些操作的执行顺序。 图 1-5 流程图常用图形符号 起止框:表示算法由此开始或结束。 处理框:表示基本操作处理。 判断框:表示根据条件进行判断操作处理。 输入/输出框:表示输入数据或输出数据。 流程线:表示程序的执行流向。
1.7 程序及算法 例如,计算半径为r的圆面积s以及判断两个输入数据的大小,并输出其中的大数,这两种算法的流程图描述 。 图1-6 计算圆面积算法的流程图描述 图1-7 求两个输入数据中最大数算法的流程图描述
1.7 程序及算法 2. N-S图方式 在N-S图方式中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其他的从属于它的框,或者说,由一些基本的框组成一个大的框。因此也称为盒图。 (a)顺序结构 (b)选择结构 (c) 当型循环结构 (d) 直到型循环结构 图1-8 N-S图中使用的基本符号
1.7 程序及算法 例如,计算半径为r的圆面积s以及判断两个输入数据的大小,并输出其中的大数,这两种算法的N-S图描述。 图1-10 求两个输入数据中最大数算法的N-S图描 图1-9 计算圆面积算法的N-S图描述
1.8 程序设计方法 编写程序的目的是使用计算机解决实际问题,使用计算机解决一个实际问题时,通常需要经过提出问题、确定数据结构和算法,并据此编写程序,直至程序调试通过得到正确的运行结果。这一整个过程就称为程序设计。 到目前为止,程序设计方法先后经历了非结构化程序设计、结构化程序设计和面向对象程序设计3个主要阶段。
1.8 程序设计方法 1.8.1 结构化程序设计方法 结构化程序设计方法的核心有两个方面: (1)任何程序均由顺序结构、选择结构和循环结构三种基本结构组成。 ① 顺序结构:按语句出现的先后顺序依次执行的程序结构,如图1-12(a)所示。 ② 选择结构:根据给定的条件是否成立,以便决定程序转向的程序结构,如图1-12(b)所示。 ③ 循环结构:反复执行某一部分语句的程序结构,其可 以分为当型循环结构和直到型循环结构,如图1-12(c)(d)所示。
1.8 程序设计方法 (a)顺序结构 (b)选择结构 (c)当型循环结构程序 (d)直到型循环结构程序 图1-12 结构化程序设计的三种基本结构
1.8 程序设计方法 (2)程序的开发过程应当采取“自顶向下,逐步细化,模块化”的方法。 在开发一个大型的应用软件的过程中,应该采用“自顶向下,逐步细化,模块化”的设计方法。即将大型任务从上向下分解为多个功能模块,每个模块又可以分解为若干个子模块,然后分别进行各模块程序的编写,每个模块程序都只能由3种基本结构组成,并通过计算机语言的结构化语句实现。
1.8 程序设计方法 例如,要开发一个学生成绩统计程序,按照“自顶向下,逐步细化,模块化”的设计方法,可按其功能分解为如图1-13所示的模块结构。 图1-13 学生成绩统计模块结构图
1.8 程序设计方法 1.8.2 面向对象程序设计方法 对象:一个对象就是变量和相关的方法的集合,其中变量表明对象的状态,方法表明对象具有的行为。例如,把汽车抽象为一个对象,用变量来表示它当前的的状态,如速度、油量、型号、所处的位置等,它的行为则可以有加速、刹车、换挡等。 类:类定义的是一种对象类型,它是对具有相似行为的对象的一种抽象,描述了属于该类型的所有对象的性质。即类中定义一类对象共有的变量和方法,把一个类实例化既生成该类的一个对象。例如,每辆汽车都是一个不同的对象,但是多个对象常常具有一些共性,如所有的汽车都有轮子、方向盘、刹车装置等。
1.8 程序设计方法 面向对象程序设计的主要特征: 封装性:是一种信息隐蔽技术,用户只能看到对象封装界面上的信息,对象内部对用户是隐蔽的。封装的目的在于将对象的使用者和设计者分开,使用者不必知道行为实现的细节,只需用设计者提供的消息来访问该对象。 继承性:是指在一个已存在类的基础上可派生出新的子类,这些子类能够继承父类的属性和方法,而且可在子类中再添加新的属性和方法。 多态性:是指同一方法(函数)名对应多种不同的实现,即完成不同的功能。换句话说,一个类中可以有多个具有相同名字的方法(函数),由传递给它们的不同个数和类型的参数来决定使用哪种方法,这就是多态。
1.9 VisualC++6.0的运行环境及基本操作 Visual C++6.0开发环境是一个基于Windows操作系统、并包含C语言子集的可视化集成开发环境(Integrated Development Environment,简称IDE)。它可以将编辑、运行等操作通过单击菜单选项或工具栏按钮来完成,使用方便、快捷。这里仅介绍在此环境中,如何新建或打开C语言程序,以及如何编辑、编译、连接和运行C语言程序,要熟悉和掌握该集成开发环境,可参见有关该系统的说明书。
1.9 Visual C++6.0的运行环境及基本操作 Visual C++6.0环境下运行一个C程序的步骤: 1.启动Visual C++6.0环境 直接从桌面双击Microsoft Visual C++6.0图标,或者单击“开始”→“程序”→“Microsoft Visual C++6.0”的顺序,启动Visual C++6.0 IDE。启动后的主窗口如图1-14所示。该窗口由标题栏、菜单栏、工具栏、工作区子窗口、编辑子窗口、输出子窗口和状态栏组成。 图1-14 Visual C++6.0集成开发环境