![程序设计与问题求解:C语言](https://wfqqreader-1252317822.image.myqcloud.com/cover/147/53256147/b_53256147.jpg)
1.4 计算机问题求解的步骤
1.4.1 求解问题的一般步骤
借助计算机进行问题求解有其独特的概念和方法,其思维方法和求解过程发生了很大变化,大致的步骤如图1.5所示。在利用计算机求解问题的过程中,最关键的难点在于对客观世界的认识、问题的提出与分析、数学模型的建立、数据结构和算法的设计等环节。这些难点和环节一旦突破,后面的程序设计往往“顺理成章、迎刃而解”。而这些难点也恰恰是我们学习编程语言、提高编程能力真正的最大障碍,其根本的成因就在于对客观世界的认知(包括本学科/专业问题的认知)及思维转换(包括学科/领域融合的认知)的困难;其根本的能力就是计算思维能力。
![](https://epubservercos.yuewen.com/4150B0/31729192104878806/epubprivate/OEBPS/Images/58639-00-016-1.jpg?sign=1739556527-JE5FesbT1gNoMaoL6bWU1SRdRIHSguin-0-932237cffec74cd6b9f16707ef28a083)
图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个关系表达式建立算术表达式:
![](https://epubservercos.yuewen.com/4150B0/31729192104878806/epubprivate/OEBPS/Images/58639-00-017-1.jpg?sign=1739556527-IA6iUWldn4cb5Nv7NyoFWrXsQIosru0S-0-613bce6c5cfdc47f1143894e608ddf68)
(3)算法流程如图1.6所示。
![](https://epubservercos.yuewen.com/4150B0/31729192104878806/epubprivate/OEBPS/Images/58639-00-017-2.jpg?sign=1739556527-NWodYCwTDRPArd9noMaUHpIGojtdkXa2-0-8aa315a05f73d504cec9f4c0a1fcecd0)
图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所示。
![](https://epubservercos.yuewen.com/4150B0/31729192104878806/epubprivate/OEBPS/Images/58639-00-018-1.jpg?sign=1739556527-SjRhlkC9y9HBMuFYXTk0Wp8y4OmwtI1l-0-c5b133d8007366a3477e1d1d5c84f04e)
图1.7 例1.3程序运行结果