1. 绪论
C 语言由 Bell 实验室的 D. M. Ritchie 在 1972 年研制,最初和 UNIX 系统一起发展起来。
1.1 程序、算法与结构化设计
算法:解决一类问题的一组有限步骤。每一步都得写清楚,而且最终必须停下来。只说“不断尝试,直到成功”不算完整的算法,因为没有说明怎样尝试,也不能保证一定结束。
从题目到程序,大致要走下面几步:
- 分析问题,明确输入、输出和约束;
- 建立数学模型,选择数据结构和算法;
- 用流程图、NS 图或伪代码描述流程;
- 编码、编译、链接、运行;
- 测试并调试。
结构化程序归根到底只有三种结构:顺序、选择、循环。复杂程序看着长,其实也只是这三种结构的嵌套,再加上函数拆分。
传统流程图用箭头表示控制流,容易出现随意跳转,也不便于表示嵌套。NS 图把每个基本结构画成一个方框,结构边界、作用域和嵌套关系更清楚。
1.2 测试与调试
测试是为了找错,不是为了证明程序没错。自己测程序时,至少准备这几类数据:
- 正常情况;
- 边界值,如 0、1、最大值、最小值;
- 特殊情况,如空输入、重复值、除数为 0;
- 非法输入(题目要求处理时)。
错误大致分四类:
- 编译错误:语法、类型或声明有问题;
- 链接错误:函数只有声明却没有定义,或缺少所需库;
- 运行错误:越界、空指针解引用、除零等;
- 逻辑错误:程序能运行,但算法或边界处理不对。
调试时先看中间量从哪一步开始不对。找到第一个错误状态后再往前追,比看到答案不对就到处改代码靠谱得多。
1.3 程序设计语言与 C 程序
机器语言直接写机器指令,汇编语言用助记符代替二进制指令,高级语言则更接近人的表达。C 程序从源文件到真正运行,中间还要经过预处理、编译、链接。
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", a + b);
return 0;
}
#include <stdio.h>引入标准输入输出函数的声明;main是程序入口,返回类型写成int;- 花括号围成函数体或复合语句;
- C 区分大小写,一般语句以分号结束;
- 注释可写成
/* ... */或// ...。
