第 1 讲:程序设计基本概念

一、人类的助手:计算机核心概念

1. 程序与指令

  • 指令:计算机可直接执行、不可再分割的命令,是计算机操作的最小单位。
  • 程序:一组计算机能够识别和执行的指令集合,用于完成特定任务。
  • 程序设计(编程):将人类解决问题的思路转化为程序,进而转换为计算机可执行指令的过程。

二、与计算机对话:计算机语言体系

计算机语言按抽象程度分为三级,核心作用是实现“人类意图→计算机执行”的转换。

1. 机器语言(最低级)

  • 本质:二进制代码(0和1)组成的机器指令集合,是计算机唯一能直接理解和执行的语言。
  • 结构:每条指令包含“操作码”(指定操作类型,如存储、加法)和“操作数”(指定操作对象,如寄存器地址、数值)。
  • 示例
    • 存储指令:1 001 10(将数据存入地址为10的寄存器)
    • 加法指令:2 002 10 00000010(将十进制2与寄存器10中的数相加并存储)
  • 缺点:可读性极差,难以记忆和编写,依赖具体硬件。

2. 汇编语言(低级)

  • 本质:用符号(如MOV、ADD)替代二进制指令的“符号语言”,仍依赖特定硬件架构。

  • 优势:相比机器语言更易理解,降低编程复杂度。

  • 示例:“1+2”的汇编实现

    指令序号 操作码 操作数1 操作数2 指令含义
    1 MOV A 将十进制“1”存入寄存器A
    2 ADD A 2 十进制“2”与寄存器A中的数相加,结果存回A
  • 局限性:仍需了解硬件细节,未完全脱离机器依赖。

3. 高级语言(最高级)

  • 核心特点:独立于特定计算机系统,语法接近人类自然语言,可读性和通用性强。
  • 执行流程:需通过“编译器”将高级语言编写的源程序(如.c文件)转换为目标程序(如.obj文件),再经“链接程序”生成可执行程序(如.exe文件)。
  • 主流语言:根据IEEE Spectrum 2023排行榜,热门语言包括Python、C++、C、Java等。

4. 重点:C语言

  • 发展背景:20世纪70年代由美国贝尔实验室的D.M.Ritchie设计,用于开发UNIX系统。

  • 语言结构:类比人类语言的层级关系,形成清晰的语法体系

    类别 结构
    人类语言 字 → 词 → 句子 → 段落 → 文章
    C语言 标识符 → 表达式 → 语句 → 函数 → 程序
  • 基础示例:输出“I love China!”的C程序

    #include <stdio.h>  // 引入标准输入输出库
    int main() {         // 主函数,程序入口(C程序必须有且仅有一个main函数)
        printf("I love China!");  // 输出语句
        return 0;        // 主函数返回值,标识程序正常结束
    }
    

(1)C语言核心组成单元

  • 标识符:用于命名变量、函数等的符号,规则如下:

    • 由英文字母(A-Z、a-z)、数字(0-9)、下划线(_)组成;
    • 不能以数字开头;
    • 区分大小写(如Word3word3是不同标识符);
    • 不能与“关键字”重名。
  • 关键字:C语言预定义的特殊标识符,具有固定含义,不可自定义

    常用关键字 功能说明
    int、char、double 数据类型声明
    if、else、while、for 流程控制
    return、break、continue 程序跳转
    void、static、const 存储类型/修饰符
  • 表达式:用运算符连接运算对象的式子,用于计算或判断

    运算符类型 符号示例 功能说明
    算术运算符 +、-、*、/、%、++ 加减乘除、取余、自增
    关系运算符 >、<、==、!=、>=、<= 比较大小关系
    逻辑运算符 !(非)、&&(与)、
    赋值运算符 =、+=、-=、*= 变量赋值及扩展赋值
    其他 sizeof(求字节数)、(类型)(强制转换) 数据操作辅助
  • 语句:C语言的基本执行单位,一条语句对应一个或多个机器指令,如:

    • 赋值语句:sum = 1 + 2;
    • 输出语句:printf("Hello");
    • 分支语句:if (sunny == 1) fly_kite = 1; else stay_home = 1;
  • 函数:C程序的基本功能单位,实现代码模块化,示例:两数交换函数

    #include <stdio.h>
    // 自定义函数swap:通过指针交换两个整数的值
    void swap(int *a, int *b) {
        int temp = *a;  // 临时变量存储*a的值
        *a = *b;        // 将*b的值赋给*a
        *b = temp;      // 将临时变量的值赋给*b
    }
    int main() {
        int num1 = 2, num2 = 3;
        swap(&num1, &num2);  // 调用swap函数,传入变量地址
        printf("交换后的两个数: %d %d", num1, num2);  // 输出结果:3 2
        return 0;
    }
    

三、从问题到程序:程序设计完整流程

程序设计需遵循标准化步骤,确保逻辑清晰、可维护性强。

1. 核心步骤

  1. 分析问题:明确问题需求(如“计算1到100的和”“找出三个数中的最大值”),确定输入、输出和处理逻辑。

  2. 设计算法

    • 算法定义:解决问题的具体方法和步骤,需满足“有穷性”“确定性”“可行性”。
    • 表示方法
      • 自然语言:如“计算1+2+…+100”的步骤:
        1. 令sum=0(累加结果)、augend=1(累加项);
        2. sum = sum + augend;
        3. augend = augend + 1;
        4. 若augend ≤ 100,跳转至步骤2;否则执行步骤5;
        5. 输出sum的值。
      • 流程图:用图形符号表示算法,常用符号包括
        • 开始/结束框(椭圆形)、执行框(矩形)、选择框(菱形)、输入输出框(平行四边形)、流程线(箭头)。
    • 经典结构:顺序结构(按步骤执行)、选择结构(if-else,根据条件分支)、循环结构(while/for,重复执行)。
  3. 编写程序

    • 按算法逻辑,用选定的高级语言(如C语言)编写源程序;
    • 注意语法规范(如语句结尾加;、括号配对)。
  4. 测试程序

    • 编译:检查语法错误,生成目标程序;
    • 运行:测试功能正确性(如输入边界值、异常值),修复逻辑错误。
  5. 编写文档:记录程序关键信息,便于维护和使用,文档内容示例

    文档明细 具体内容 备注
    程序文件名称 FindTallestMan.c 源文件
    程序功能描述 找出三个数中最大的数及位置
    输入数据格式 小数,小数,小数 示例:1.9,1.8,1.7
    输出数据格式 身高最高的是第X人,他的身高是Y米 X、Y由程序计算输出

四、让计算机认识世界:数据表示方式

计算机仅能识别数字,需将各类信息(整数、小数、字符)转换为二进制形式存储。

1. 整数表示

  • 存储单位:字节(1字节=8位二进制),字节有唯一地址(内存地址)。

  • 表示方法

    • 无符号整数:仅表示非负数,1字节范围为0~255(2⁸-1)。
    • 有符号整数:用最高位(符号位)表示正负(0为正,1为负),采用补码存储(解决“+0”与“-0”重复问题):
      • 正整数:补码=原码(二进制本身);
      • 负整数:补码=原码(除符号位外)按位取反 + 1。
  • C语言整数类型

    数据类型 字节数 是否有符号 取值范围
    unsigned short 2 0~65535(2¹⁶-1)
    signed short 2 -32768~32767(-2¹⁵~2¹⁵-1)
    unsigned int/long 4 0~4294967295(2³²-1)
    signed int/long 4 -2147483648~2147483647(-2³¹~2³¹-1)
    unsigned long long 8 0~18446744073709551615(2⁶⁴-1)
    signed long long 8 -9223372036854775808~9223372036854775807(-2⁶³~2⁶³-1)

2. 小数表示(浮点数)

  • 特点:位数不固定,采用“指数形式”存储(类似科学计数法),如十进制19.625=二进制10011.101=1.0011101×2⁴。

  • 存储结构(以4字节float为例):1位符号位 + 8位指数位 + 23位尾数位。

  • C语言浮点类型

    数据类型 字节数 有效数位 数值范围(绝对值)
    float 4 6~7位 0 及 1.2×10⁻³⁸~3.4×10³⁸
    double 8 15~16位 0 及 2.3×10⁻³⁰⁸~1.7×10³⁰⁸
    long double 16 18~19位 0 及 3.4×10⁻⁴⁹³²~1.1×10⁴⁹³²
  • 注意:浮点数存在精度误差(如0.1无法用二进制精确表示),需避免直接用“==”比较。

3. 字符表示

  • 编码标准

    • 英文字符/数字:采用ASCII码(1字节),如’A’=65(十进制)=1000001(二进制),‘a’=97,‘0’=48。
    • 中文字符:采用GB2312编码(2字节),解决ASCII码无法表示中文的问题。
  • C语言字符类型

    类型 字节数 取值范围 说明
    char(有符号) 1 -128~127 存储ASCII码或窄字符
    unsigned char(无符号) 1 0~255 存储扩展ASCII码
  • 表示方式:字符常量需用单引号包裹,如'A'(字符)与A(标识符)、"A"(字符串)区分。

五、思考题

  • 如何区分十进制数与八进制(以0开头,如012=10十进制)、十六进制数(以0x开头,如0xA=10十进制)?
  • 为什么字符需要用单引号引起来?(区分字符常量与标识符、字符串)