文章目录
前言
保研已经告一段落,由于本科期间相关的研究开发着重于机器学习、深度学习,相对的也对C/C++语言有部分淡忘,故大四准备重新学习一遍,以谭浩强教授的《C语言设计(第五版)》作为复习教材,也希望能有更深刻的理解和感悟。
一、什么是计算机程序?
所谓程序,就是一组计算机能识别和执行的指令。每一条指令使计算机执行特定的操作。执行程序,计算机就会有条不紊地执行程序中各条指令。一个特定的指令序列用来完成一定的功能。
计算机的本质是程序的机器,程序和指令是计算机系统中的最基本的概念。
二、什么是计算机语言
人和计算机交流信息需要解决语言问题,需要创造出一种计算机和人都能识别的语言,这就是计算机语言。计算机语言有以下几个发展阶段。
机器语言
计算机普遍基于二进制工作,从根本上说计算机只能识别和接收0和1组成的指令。在计算机发展初期,一般计算机指令长度是16,例如1011011000000000是进行一次加法运算。配合黑色纸带穿孔和光电输入机,在有孔处产生电脉冲,指令变成电信号,让计算机执行各种操作。
这种计算机能够直接识别和接受的二进制代码称为机器指令(machine instruction)。机器指令的集合就是计算机的机器语言。机器语言只有极少数的计算机专业人员掌握。
符号语言
为了克服机器语言难学、难写、难记、难检查、难修改、难以推广使用的缺点,人们创造出符号语言(symbolic language),他用一些英文字母和数字表示一个指令。
ADD A,B (执行A+B=>A,将寄存器A中的数与寄存器B中的数相加,放入寄存器A中)
显然计算机不能直接识别和执行符号语言的指令,需要一种称为汇编程序的软件把符号语言的指令转换为机器指令。一般一条符号语言的指令对应一条机器指令,转换的过程称为“代真”或“汇编”,因此符号语言又称为符号汇编语言(symbolic assembler language)或汇编语言(assembler language)。
虽然汇编语言比机器语言好记简单,但是仍难以普及,只在专业人员中使用。不同的计算机使用的机器语言和汇编语言是互不通用的,是完全依赖于具体及其特性的、面向机器的语言。由于它离计算机很近,偏向底层,故称为计算机低级语言(low level language)
高级语言
为了克服低级语言的缺点,20世纪50年代创造出了第一个计算机高级语言——FORTRAN语言。它很接近人们习惯使用的自然语言和数学语言。
例如在FORTRAN语言程序中想要计算输出3.5*6sin(π/3),只需要写下面这个语句即可:
PRINT*, 3.56SIN(3.1415926/3)
这种语言功能强,不依赖于具体机器,用它写出的程序对任何计算机都是用,距离具体机器较远,故称为计算机高级语言(high level language)。
高级语言更不能直接被计算机识别,而要通过编译程序的软件将高级语言程序(源程序(source program))转换为机器指令的程序(目标程序(object program))。高级语言的一个语句往往对应多条机器指令。高级语言是计算机发展史上“惊人的成绩”。其经历了不同的发展阶段:
(1)非结构化的语言。初期的语言符合语法规则即可,程序流程可以随意跳转,人们往往为了追求执行的效率采用了许多小技巧,使得程序难以阅读和维护。如早期的BASIC,FORTRAN和ALGOL语言。
(2)结构化语言。为了解决这些问题,提出了“结构化程序设计方法”,规定程序必须由良好特性的基本结构(顺序结构、选择结构、循环结构)构成,程序流程不允许随意跳转,总是自上而下顺序执行各个基本结构。如QBASIC,FORTRAN77和C语言等语言。
以上两种语言都是基于过程的语言,需要具体指定每一个过程的细节,适合规模较小的程序,而不适合处理规模较大的程序。
(3)面向对象的语言。在处理规模较大的问题时,开始使用面向对象的语言。C++,C#,Visual Basic和Java等语言都是支持面向对象程序设计方法的语言。
进行程序设计,需根据任务需要选择合适的语言编写程序。
三、C语言的发展及其特点
C语言是在B语言的基础上设计出来的,最初只为描述和实现UNIX操作系统提供一种工作语言。之后UNIX的90%以上的系统代码用C语言进行改写,C语言也不断得到推广。1978年以后,C语言先后移植到大、中、小和微型计算机上,很快就成为世界上应用最广泛的程序设计高级语言。
C语言有以下一些主要特点。
(1)语言简洁、紧凑、使用方便、灵活。C语言一共只有37个关键字、9种控制语句,书写形式自由,主要用小写字母表示,压缩了一切不必要成分。
(2)运算符丰富。共有34种运算符,运算类型丰富,表达式类型多样化。
(3)数据类型丰富。提供有整型、浮点型、字符型、数组类型、指针类型、结构体类型和共用体类型等。C99扩充了复数浮点类型、超长整型(long long)和布尔类型(bool)等。
(4)具有结构化的控制语句。如if…else语句,while语句、do…while语句、switch语句和for语句。用函数作为程序模块化的单位,C语言是完全模块化和结构化的语言。
(5)语法限制不太严格,程序设计自由度大。如对数组下标越界不进行检查;整型量与字符型数据以及逻辑型数据可以通用。
(6)C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此C语言既具有高级语言的功能,又具有低级语言的许多功能,具有双重性。
(7)用C语言编写的程序可移植性好。由于C的编译系统相当简洁,很容易移植到其他系统。在新的系统上运行时可以直接编译“标准链接库”中的大部分功能,不需要修改源代码。故几乎所有计算机系统都可以使用C语言。
(8)生成目标代码质量高,程序执行效率高。C语言可以设计系统软件,也可以设计应用软件,可移植性好、硬件控制能力高、表达和运算能力强。
四、最简单的C语言程序
4.1 最简单的C语言程序举例
【例1.1】 要求在屏幕上输出以下一行信息
This is a C program.
程序:
#include <stdio.h> // 这是编译预处理指令,standard input & output
int main( ) // 定义主函数
{ // 函数开始的标志
printf ("This is a C program.\n"); // 输出所指定的一行信息
return 0; // 函数执行完毕时返回函数值0
}
结果:
PS D:\forth year\1.1 C language\source program\source program\source program(17.9)\chapter1> cd "d:\forth year\1.1 C language\source program\source program\source program(17.9)\chapter1\" ; if ($?) { gcc c1-1.c -o c1-1 } ; if ($?) { .\c1-1 }
This is a C program.
PS D:\forth year\1.1 C language\source program\source program\source program(17.9)\chapter1>
【例1.2】 求两个整数之和
程序:
#include <stdio.h> // 这是编译预处理命令
int main( ) // 定义主函数
{ // 函数开始
int a,b,sum; // 本行是程序的声明部分,定义a、b、sum为整型变量
a = 123; // 对变量a赋值
b = 456; // 对变量b赋值
sum = a + b; // 进行a+b 的运算,并把结果存放在变量sum中
printf("sum is %d\n",sum); // 输出结果
return 0; // 使函数返回值为0
} // 函数结束
结果:
PS D:\forth year\1.1 C language\source program\source program\source program(17.9)\chapter1> cd "d:\forth year\1.1 C language\source program\source program\source program(17.9)\chapter1\" ; if ($?) { gcc c1-2.c -o c1-2 } ; if ($?) { .\c1-2 }
sum is 579
【例1.3】 求两个整数中的较大者
程序:
#include <stdio.h>
int main( ) // 定义主函数
{ // 主函数体开始
int max(int x,int y); // 对被调用函数max的声明,编译自上而下
int a,b,c; // 定义变量a,b,c
scanf("%d,%d",&a,&b); // 输入变量a和b的值
c = max(a,b); // 调用max函数,将得到的值赋给c
printf("max=%d\n",c); // 输出c的值
return 0; // 返回函数值为0
}
int max(int x,int y) //定义max函数,函数值为整型, 形式参数x和y为整型
{
int z; // max函数中的声明部分,定义本函数中用到的变量z为整型
if (x > y) z = x;
else z = y;
return(z); //将z的值返回,通过max带回到调用函数的位置
}
结果:
90 50
max=90
PS D:\forth year\1.1 C language\source program\source program\source program(17.9)\chapter1>
4.2 C语言程序的结构
结构特点如下:
(1)一个程序由一个或多个源程序文件组成。源程序文件可以包括三部分:
①预处理指令。如#include<stdio.h>, #define等。
②全局声明。即在函数之外的数据声明,这些变量称为全局变量,在整个源程序文件范围内有效。函数中声明的变量只是局部变量,在函数范围内有效。
③函数定义。如例子中的main函数和max函数。
(2)函数时C程序的主要组成部分。也是基本单位,一个C语言程序只包含一个源文件,一个源文件包含若干个函数,其中一个是main函数。当程序规模较大时,可以使一个程序包含若干源程序文件,每个源程序包含若干函数。
(3)一个函数包括两个部分.
①函数首部。函数的第一行,包括函数名、函数类型、函数属性、函数参数名、参数类型。
②函数体。即首部下面花括号内的部分,又分为声明部分(定义变量、函数声明)和执行部分(若干语句)。
(4)程序总是从main函数开始执行的。
(5)程序中要求计算机的操作是由函数中的C语句完成的。
(6)每一个数据声明和语句的最后必须有一个分号。
(7)C语言本身不提供输入输出语句。scanf和printf是由库函数完成的。
(8)程序应当包含注释。
五、运行C程序的步骤和方法
(1)上机输入和编辑源程序。f.c
(2)对源程序进行编译,先用预处理器对包含头文件等等指令进行处理,读取头文件信息取代指令行,组成完整的正式编译的源程序。如没有语法错误,编译程序进行正式编译,将源程序转换为目标程序(f.obj)。
(3)进行连接处理。将所有编译后得到的二进制目标文件(目标模块)连接装配起来,再与函数库相连接成一个整体,生成可供计算机执行的目标程序,成为可执行程序(executive program)(f.exe)。
(4)运行可执行程序,得到运行结果。
目前很多使用的C编译系统都是集成开发环境(Integrated Development Environment) 的,把编辑、编译、连接和运行操作集成在一个界面上进行。
六、程序设计的任务
一般经历以下几个阶段:
(1)问题分析(建模)。
(2)设计算法。即设计出解题的方法和具体步骤。
(3)编写程序。用高级语言编写出源程序。
(4)对源程序进行编辑、编译和连接,得到可执行程序(.exe)。
(5)运行程序,分析结果。需要反复进行调试(debug),发现和排除错误。
(6)编写程序文档。程序文档时向用户提供的程序说明书,也叫用户文档。内容应包括程序名称、程序功能、运行环境、程序的装入和启动、需要输入的数据、以及使用的注意事项。