C程序设计(第五版)整理 第一章 程序设计和C语言


前言

保研已经告一段落,由于本科期间相关的研究开发着重于机器学习、深度学习,相对的也对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) 的,把编辑、编译、连接和运行操作集成在一个界面上进行。
运行C程序的步骤


六、程序设计的任务

一般经历以下几个阶段:
(1)问题分析(建模)。
(2)设计算法。即设计出解题的方法和具体步骤。
(3)编写程序。用高级语言编写出源程序。
(4)对源程序进行编辑、编译和连接,得到可执行程序(.exe)。
(5)运行程序,分析结果。需要反复进行调试(debug),发现和排除错误。
(6)编写程序文档。程序文档时向用户提供的程序说明书,也叫用户文档。内容应包括程序名称、程序功能、运行环境、程序的装入和启动、需要输入的数据、以及使用的注意事项。


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在輸入......

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值