程序设计与问题求解:C语言
上QQ阅读APP看书,第一时间看更新

1.4 计算机问题求解的步骤

1.4.1 求解问题的一般步骤

借助计算机进行问题求解有其独特的概念和方法,其思维方法和求解过程发生了很大变化,大致的步骤如图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程序运行结果