借助计算机进行问题求解有其独特的概念和方法,其思维方法和求解过程发生了很大变化,大致的步骤如图1.5所示。在利用计算机求解问题的过程中,最关键的难点在于对客观世界的认识、问题的提出与分析、数学模型的建立、数据结构和算法的设计等环节。这些难点和环节一旦突破,后面的程序设计往往“顺理成章、迎刃而解”。而这些难点也恰恰是我们学习编程语言、提高编程能力真正的最大障碍,其根本的成因就在于对客观世界的认知(包括本学科/专业问题的认知)及思维转换(包括学科/领域融合的认知)的困难;其根本的能力就是计算思维能力。
图1.5 计算机求解问题的一般步骤
例1.3 警察抓了A、B、C、D 4名盗窃嫌疑犯,其中只有一人是小偷。审问中,A说:“我不是小偷”;B说:“C是小偷”;C说:“小偷肯定是D”;D说:“C在冤枉人”。他们中只有一人说的是假话,请问谁是小偷?
问题分析与程序思路:
尽管这个例子还比较小,还不足以全面、完整、充分地展示人的内在思维活动、思维形式、思维方法和思维过程,但可从中看出编程过程实际上就是一个思维转换的过程,也可以反映利用计算机求解问题的一般步骤。对于此问题,需要考虑并解决以下3个问题。
(1)如何对4名嫌疑人的陈述进行适当的符号化表达,进而如何建立适当的数学模型或数学公式?
(2)如何设计并运用适当的数据结构和算法,将上述模型映射为计算机可以理解和执行的步骤?对于算法,还需要考虑如何利用流程图等工具恰当地描述算法?
(3)如何利用某种计算机语言编写程序并运行得到计算结果?
对上述3个问题,具体介绍如下。
(1)设变量 x 为小偷,并将4个人说的话表达为以下关系表达式。
A说: x !='A'
B说: x =='C'
C说: x =='D'
D说: x !='D'
以上4个关系表达式中必定有3个成立。
(2)对上述4个关系表达式建立算术表达式:
(3)算法流程如图1.6所示。
图1.6 警察破案问题算法流程图
分别将4个可能的取值'A' 'B' 'C' 'D'逐一赋值给变量 x ,然后判断当 x 取什么值时,能使上述算术表达式的结果为3。为此,再定义一个变量 t 来统计关系式成立的个数,当 t =3时,当前 x 的值就是小偷,否则继续列举下一个。
(4)参考源码
#include <stdio.h> int main(void){ char x = 'A'; int t = 0; while(x <= 'D'){ t = (x!='A') + (x=='C') + (x=='D') + (x!='D'); if(t == 3){ printf("%c is a criminal.", x); break; }else{ x = x + 1; } } return 0; }
程序运行结果如图1.7所示。
图1.7 例1.3程序运行结果
C程序的开发通常包括4个步骤:编辑、编译、连接和运行,如图1.8所示。
图1.8 C程序的编程过程
程序的编辑过程就是代码的书写过程,用于实现计算机执行编程者期望的任务。理论上可以使用各种各样的文本编辑器来书写代码,例如记事本、写字板、Vim、Word、WPS等文本编辑软件,但为了更好地提高书写代码的效率,建议使用集成开发工具与环境,例如Turbo C、Dev-C++、Code::Blocks、Microsoft Visual Studio等。
下面以“Dev-C++”开发工具为例,介绍C程序编程过程。
如图1.9所示,选择“File”→“New”→“Source File”菜单项,可以新建一个源代码文件。编辑源代码后,选择“File”→“Save”菜单项或单击“Save”按钮,在随后打开的对话框中设置“文件名”,并选择“保存类型”为“C source files (*.c)”就可以完成源代码文件的创建、编辑与保存。后缀为“.c”的文件是C语言的通用后缀名称。
图1.9 编辑并保存源代码
由于计算机只能识别机器语言的二进制指令,因此为了使计算机进行工作,需要将设计好的程序转换为机器语言,计算机才能够按照设计人员的指令来工作,这种转换工作需要由一个被称为编译器的程序来完成。编译器将源代码文件作为输入,经过编译后生成一个磁盘文件,该文件包含了与源码文件语句所对应的二进制机器指令。编译器生成的机器语言指令被称为目标代码,而包含目标代码的磁盘文件被称为目标文件,通常使用“.obj”作为文件的扩展名。
如图1.10所示,选择“Execute”→“Compile”菜单项对源代码进行编译。
图1.10 编译源代码
若编译通过,将打开“Compile Progress”对话框显示相关信息;若编译失败,也将高亮显示有警告或错误的代码行等信息。
由于在进行程序设计时往往需要使用编译器所提供的通用代码或程序,而这些通用代码或程序通常是存在于库文件中,因此连接的作用就是把编译后所得到的目标文件与相应的库文件中的代码连接起来,最终生成一个可以被计算机执行的完整二进制文件。这个文件也被称为可执行程序。在Windows操作系统中,可执行程序文件的扩展名为“.exe”。大多数开发环境都提供了一个选项,可以设置编译和连接是分步进行还是一步完成。
经过编译和连接并生成可执行文件后,便可双击程序图标进行运行操作,或者在图1.10中,选择“Execute”→“Run”菜单项运行程序,程序运行后将打开命令行界面显示运行结果,如图1.11所示。
图1.11 运行可执行程序
在运行程序时,应注意观察运行方式和运行结果是否与设计目标相符。如果运行结果与期望结果不一致,则应重新审查代码或者算法的正确性。初学者不仅要解决语言语法运用问题,尤其更要注意算法思维是否存在逻辑问题。