LOADING

加载过慢请开启缓存 浏览器默认开启

计算机导论与程序设计复习

一、程序语言概述

  • 可编程
  • 计算机信息处理本质是: 接收输入的数据、对输入的数据进行加工和处理、产生结果并输出。
  • 程序可以预先存储在计算机中调度运行。计算机的操作是在程序的控制下进行的。
  • 可编程结构、图灵机都是计算机模型。
  • 冯诺依曼机
  • 程序的运行就是不断地取指令、分析指令、执行指令的过程,这3个步骤均由控制单元来控制。控制单元取指令、分析指令,产生操作控制信号发给输入输出设备、运算部件或者主存,完成指令的执行。
  • 指令由“0”和“1”的二进制码组成 ,是指挥计算机工作的命令,是计算机唯一可以直接识别的语言;
  • 指令系统:计算机能直接识别和执行的全部指令的集合, 称为该种计算机的指令系统。
  • 程序是按事先设计的功能和性能要求编制的指令序列。
  • 算法:完成一个任务或者解决一个问题的步骤 序列(操作序列)。
  • 符号语言:用符号或助记符来表示不同的机器语言指令(包括操作码和和操作数地址)。符号语言又称汇编语言。
  • 过程化的程序设计即是实现某一计算的操作过程和操作步骤,然后用编程语言来描述这些操作过程和步骤。
  • 程序要素:数据与运算表达式、输入输出、控制结构、子程序(函数)
  • C编程活动:编辑程序-编译程序-链接程序-运行程序

二、程序设计初步:数据类型、常量、变量

  • 最小的存储单元是(bit)
  • (word)是设计计算机时运算单元给定的整数运算的数据通路的宽度。因此,计算机中每个数据的二进制位数都是固定长度的。
  • 汉字数字化
  • 数据类型包括两层含义:定义了值的集合(属于该类型的数据能够取值的范围)以及能应用于这些数值上的操作集合(数据操作)。

三、算数运算/逻辑运算

  • C语言中默认的算术运算符的结合方向为“自左至右”,即先左后右。但是赋值运算符是右结合,即从右到左计算
  • 命名常量:不能改写的变量(命名常量)。有些变量一旦定义并初始化,便不允许程序去改变该存储空间中的数据。例如,C语言中:
const float pi = 3.14;
  • 小数转化为整数:
    • 小数四舍五入取整:(int)(2.5+0.5); (int)(-2.3-0.5);
    • 小数向上取整:ceil函数返回大于等于参数的最小整数
    • 小数向下取整:floor函数返回小于等于参数的最大整数
  • 逻辑非运算最高,然后是算术运算和关系运算,其他逻辑运算的优先级仅高于赋值运算。逻辑运算的结合性默认是左结合,只有非运算是右结合
  • 发生意外或错误,程序无法继续处理时,需要终止,操作系统提供了exit()函数。
/*
功 能: 关闭所有文件,终止正在执行的进程。
exit(0)表示正常退出;
exit(x)(x不为0)都表示异常退出,这个x是返回给操作系统的,以供其他程序使用;
*/

void exit(int status); // 参数status,程序退出的返回值
  • 注意++和—有前缀和后缀的区别:
    • ++i,--i(在使用i之前,先使 i 的值加(减)1)
    • i++,i--(在使用i之后,使i的值加(减)1)

四、有限自动状态机

  • 有限状态机可以简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。
    • 状态:存储关于过去的信息,它反映从系  统开始到现在时刻的输入变化。
    • 转移:指示状态变更,并且用必须满足来  确使转移发生的条件来描述它。
    • 动作:在给定时刻要进行的活动的描述。

五、子程序

  • 子程序是封装并给以命名的一段程序代码,这段程序代码完成子程序所定义的功能,可供调用。
  • 封装:子程序可以独立完成功能,调用者只需知道如何调用子程序(即子程序接口)
  • 引入子程序的目的:
  1. 程序"复用",避免在程序中使用重复代码;
  2. 结构化程序设计的需要:自顶向下、逐步细化,将复杂问题分解为相对简单的子问题,这些子问题用子程序实现,从而提高主程序结构的清晰性和易读性。
  3. 使程序的调试和 维护变得更加容易。
  • 子程序设计原则
    • 高内聚:功能相对独立和完整;
    • 低耦合:与外界(调用者)的关系尽量松散,不要太紧密,使其能方便地被重用;
  • 子程序在C语言中的实现机制:C语言中的函数机制
  • return语句中返回值表达式的类型要和返回值的类型说明一致。如果不一致,则以返回值类型为准(进行类型转换,参数类型的转换有可能是低类型向高类型转换,也可能是高类型向低类型转换。高类型向低类型转换可能会导致不正确的结果(如long类型向short类型的转换)。)。

  • 函数的调用:函数的调用和执行的实质是控制转移,调用函数时,将控制转到被调用的函数,被调函数执行结束时,则将控制转回主调函数,继续执行后续的操作 。
  • 子程序参数传递两种方式:按值传递按引用传递
  • 函数原型的作用:是对被调用函数的接口声明,它告诉编译器函数返回的数据类型、函数所要接收的参数个数、参数类型和参数顺序,编译器用函数原型校验函数调用是否正确。
  • 数据在内存中的存储:
    • 系统区:用于存放系统软件和运行需要的数据,如操作系统。只要机器一运行,这部分空间就必须保留给系统软件使用
    • 用户程序代码区:存放用户程序代码
    • 静态存储区:存放程序运行期间不释放的数据(静态局部变量、全局变量)
    • 栈区:存放程序运行期间会被释放的数据(函数参数、非静态局部变量)以及活动的控制信息
    • 堆区:用户可以在程序运行过程中根据需要动态地进行存储空间的分配,这样的分配在堆区进行


## 六、数组
* 线性表是具有相同数据类型的\(n(n>=0)\)个数据元素的有限序列。线性表数据元素之间为线性关系,即任意两个元素之间都可比较大小。
* 线性表有两种存储结构:连续(顺序表)、随机(链表)。
* 数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。
* 若在定义一个数组的同时赋初值,如果初始化值的个数小于数组元素的个数,剩余的元素被自动初始化为0。(整型数组各元素不会自动初始化为0,至少要把第一个数组元素初始化为0,才能使剩下的元素自动初始化为0。)
* 二维数组做形参,第2个下标必须给出,使编译器能确定元素内存地址;多维数组做函数形参时,需要给出除了第1个下标之外的其他所有的下标

七、字符串

  • scanf函数读取用户键入的字符到字符数组,直到遇到空格、回车、或文件结束符为止。空格、回车、或文件结束符被丢弃,最后一个字符读入后往字符数组中写入结束符‘\0’。
  • gets()函数简单易用,它读取整行输入,直至遇到换行符,然后丢弃换行符,存储其余字符,并在这些字符的末尾添加一个空字符使其成为一个C字符串。它经常和puts()函数配对使用,该函数用于显示字符串,并在末尾添加换行符。成功则返回所读字符串指针,失败返回空指针.
char * gets(char * str);
  • 将str所指向的字符串输出到文件或显示器上,字符串结束标记‘\0’ 不会被输出。成功则返回字符长度,失败返回-1。puts输出字符串时,会将字符数组中所有内容输出,直到‘\0’,但会在末尾自动追加输出‘’ 。
int puts(const char * str);
  • fgets从文件或键盘读取字符到str所指向的数组中,直到读够n-1个字符,或读到换行符‘’ ,但不会丢弃换行符,或者读到文件末尾。最后一个字符读入后自动写入一个 '\0' 。若成功则返回str,若无字符读入数组或者读取失败返回空指针NULL。
char * fgets(char *str, int n, FILE *stream);
  • 将str所指向的字符串输出到文件或显示器上,字符串结束标记‘\0’ 不会被输出。
int fputs(const char * str, FILE *stream);

八、自定义结构体

  • 结构是用其他类型的对象构造出来的派生数据类型(注意:结构是一种数据类型);
  • 结构既可以在函数外定义,也可以在函数内定义。但函数内定义的结构只能在本函数中使用;
  • 同一结构中的成员不能同名,不同结构中的成员可以同名;
  • 嵌套结构:结构中的数据项,可以是另一个已经定义的结构变量;
  • 如果初始化的个数少于结构中的成员数目,剩余成员被自动化初始为0(整型、浮点型)、‘\0’(字符或者字符串型)、NULL(指针);
  • 传递结构变量方法:传递结构、还是指向结构的指针?
    • 传递指针
      • 优点:既可以工作在较早的C实现上,也可以工作在较新的C实现上;执行速度快:只需要传递一个地址。
      • 缺点:缺少对数据的保护(可以使用const限定词解决这个问题)。
    • 传递结构:
    • 优点:安全性。函数处理的是原始数据的副本。
    • 缺点: 早期的C实现不处理这种代码,浪费时间和空间;

九、计算机原理

  • 计算的定义:
    • 以数字为基础、遵循一定的计算规则进行; 如:数的加减乘除,函数的微分、积分、方程的求解、定理的证明推导;
    • 广义:计算就是把一个符号串f变换成另一个符号串g;
    • 更广义:计算就是对信息的变换 ;
    • 由于计算规则的机械化、公式化,可以借助计算工具来实现计算。
  • 图灵机:
  • 图灵机模型被认为是计算机的基本理论模型:计算机是使用相应的程序来完成任何设定好的任务。图灵机是一种离散的、有穷的、构造性的问题求解思路,一个问题的求解可以通过构造其图灵机(即程序)来解决。图灵认为:凡是能用算法方法解决的问题也一定能用图灵机解决; 凡是图灵机解决不了的问题任何算法也解决不了----图灵可计算性问题。
  • 巴贝奇的分析机由四部分构成:
    • 第一部分:保存数据的齿轮式"存贮仓库"(Store);
    • 第二部分:对数据进行各种运算的装置("作坊");
    • 第三部分:对操作顺序进行控制、并对所要处理的数据及输出结果加以选择的装置;
    • 第四部分:送入和取出数据、以及在"存贮仓库"和"作坊"之间运输数据的输入输出部件。
    • 分析机工作过程:通过输入部件将要处理的数据输入并存储到"存储仓库"中,在控制装置控制下,从存储仓库依次取出数据运输到运算装置进行运算,最终运算结果由输出部件进行输出。
  • 冯.诺依曼机体系结构的特点:
    • 指令和数据采用二进制表示,从而简化机器的逻辑线路;--指令和数据的表示
    • 指令和数据一样存储在主存储器中;--指令和数据的存储
    • 计算机由运算器、控制器、存储器、输入设备、输出设备五大部分组成。
  • 程序的运行就是不断地取指令、分析指令、执行指令的过程,这3个步骤均由控制器来控制。控制器取指令、分析指令,产生操作控制信号发给输入输出设备、运算部件或者主存,完成指令的执行。
  • 计算机系统由硬件和软件两大部分组成;
  • 操作系统是最基本、最重要的系统软件,直接运行在裸机(硬件) 上,只有在操作系统的支持下,才可以运行其他软件,故操作系统是计算机软件的核心和基础。
  • 操作系统的基本功能:作业管理、进程管理、内存管理、设备管理、文件管理
  • 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
  • 程序与进程的关系
    • 进程是动态的,强调执行过程,而程序是静态的;
    • 进程具有并发性(宏观上同时运行),程序没有;
    • 不同的进程可以对应同一程序,只是该程序对应的数据集不同。
  • 进程状态转换:
    1. 运行:当一个进程在处理机上运行时,则称该进程处于运行状态。处于此状态的进程的数目小于等于处理器的数目,对于单处理机系统,处于运行状态的进程只有一个。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。 
    2. 就绪:当一个进程获得了除处理机以外的一切所需资源,一旦得到处理机即可运行,则称此进程处于就绪状态。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。 
    3. 阻塞:也称为等待或睡眠状态,一个进程正在等待某一事件发生(例如请求I/O而等待I/O完成等)而暂时停止运行,这时即使把处理机分配给进程也无法运行,故称该进程处于阻塞状态。

汇总简答题

  1. 什么是计算?
    • 以数字为基础、遵循一定的计算规则进行;如:数的加减乘除,函数的微分、积分、方程的求解、定理的证明推导;
    • 广义:计算就是把一个符号串f变换成另一个符号串g;
    • 更广义:计算就是对信息的变换;
  2. 什么是冯诺依曼结构?
    • 冯诺依曼结构是一种计算机设计模型,其核心思想是将数据和程序存储在同一存储器中,并通过控制器统一管理。其组成包括:
      • 输入设备
      • 输出设备
      • 控制器
      • 运算器
      • 存储器
  3. 什么是内存?什么是外存?两者的区别是什么?
    • 内存:存储程序和数据的高速存储设备,直接与CPU交互,断电后数据丢失。
    • 外存:如硬盘、U盘,用于长期存储数据,断电后数据不会丢失。
    • 区别:内存速度快但容量小;外存容量大但速度慢。
  4. 什么是指令?什么是指令系统?什么是程序?
    • 指令:由“0”和“1”的二进制码组成 ,是指挥计算机工作的命令,是计算机唯一可以直接识别的语言;
    • 指令系统:计算机能直接识别和执行的全部指令的集合, 称为该种计算机的指令系统。
    • 程序程序是按事先设计的功能和性能要求编制的指令序列。
  5. 简述计算机的组成结构与工作原理。
    • 组成结构:包括输入设备、输出设备、存储器、运算器、控制器。
    • 工作原理:通过输入设备获取数据,存储器存储数据和程序,控制器按照指令系统控制运算器完成数据处理,结果通过输出设备输出。
  6. 计算机系统由哪两大部分组成?
    • 硬件系统:如CPU、内存、硬盘等。
    • 软件系统:如操作系统、应用程序等。
  7. 什么是操作系统?它具有哪些管理功能?
    • 操作系统:管理计算机硬件与软件资源的系统软件,提供用户与计算机交互的接口。
    • 管理功能
      1. 进程管理
      2. 内存管理
      3. 文件管理
      4. 设备管理
      5. 作业管理
  8. 什么是机器语言、符号语言和高级语言?它们各自有什么特点?
    • 机器语言:由0和1组成的二进制代码,可直接被计算机识别;执行效率高但难以编写和理解。
    • 符号语言:使用助记符(如MOV、ADD)代替机器码,通过汇编程序翻译成机器语言;较容易理解。
    • 高级语言:接近自然语言,易读易写,通过编译或解释器转换成机器语言;跨平台且开发效率高。
  9. 计算机唯一可以直接识别的是什么语言?
    • 计算机唯一可以直接识别的是机器语言
  10. 简述预处理程序和翻译程序各自的功能。
    • 预处理程序:处理源代码中的指令(如宏定义、头文件引入),生成预处理后的代码。
    • 翻译程序:将源代码翻译为机器语言,生成目标文件。
  11. 链接程序的目的是什么?
    • 链接程序的目的在于将多个目标文件和库文件连接成一个可执行文件,同时解决跨文件函数调用和变量引用的问题。
  12. 载入程序的功能是什么?
    • 载入程序负责将可执行文件从外存加载到内存,并为其分配运行所需的资源,使程序可以被CPU执行。
  13. 程序是如何运行的?
    • 程序的运行就是不断地取指令、分析指令、执行指令的过程,这3个步骤均由控制单元来控制。控制单元取指令、分析指令,产生操作控制信号发给输入输出设备、运算部件或者主存,完成指令的执行。
  14. 什么是标识符?
    • 标识符是程序中用来标识变量、常量、函数、数组等名称的字符序列。
  15. 什么是常量?使用命名常量和符号常量有哪些好处?
    • 常量:程序中值固定不变的量,例如数字3.14或字符'A'。
    • 好处
      1. 增强代码的可读性,例如PI比3.14更具意义。
      2. 方便修改,只需更改定义处即可在全局生效。
      3. 避免代码中出现“魔法数”(即难以理解的硬编码值)。
  16. 什么是函数?
    • 函数是一个具有特定功能的代码块,用于完成某种任务。它通过调用来执行,可以提高代码的复用性和可读性。
  17. 函数声明的作用是什么?
    • 函数声明(也称为函数原型)用于向编译器声明函数的名称、返回类型和参数类型,使编译器在函数调用时能进行正确的检查。
  18. 函数定义包括哪几部分内容?
    • 函数定义通常包括以下部分:
      1. 返回类型:函数执行完后返回的值的类型,例如int、float。
      2. 函数名:用于标识函数的名称,例如add。
      3. 参数列表:函数接收的输入参数,包含类型和变量名,例如int a, int b。
      4. 函数体:包含具体实现功能的代码块,用{}括起来。
  19. 什么是算法?
  20. 结构化程序设计的主要内容是?
    1. 程序控制结构:
      • 顺序结构:程序按照语句的书写顺序依次执行。
      • 选择结构:根据条件判断选择执行某一分支(如if-else、switch-case)。
      • 循环结构:重复执行某一代码块,直到满足特定条件(如for、while、do-while)。
    2. 模块化设计:
      • 将程序划分为若干功能模块,每个模块完成一个独立的功能。
      • 模块之间通过函数接口进行通信,减少相互依赖。
    3. 自顶向下设计:
      • 从问题的整体出发,逐步细化,依次设计各子模块,最终实现整个程序。
    4. 封装与复用:
      • 每个模块应具有独立性,其内部实现细节对外部隐藏,只通过定义好的接口与其他模块交互。
      • 提高代码复用性,减少重复开发。