问题解决过程
解决问题的过程是一种活动,它的成分是程序的规范,所上的菜是正确的程序。该活动包括四个步骤: 1.了解问题: 要解决任何问题,首先理解问题是非常关键的。代码的期望输出是什么,以及如何生成该输出?产生输出的明显而必要的需求是输入。输入可以是单一的,也可以是一组输入。为了有效地解决问题,必须在输入和输出之间建立适当的关系。输入集应完整且足以绘制输出。这意味着计算输出所需的所有必要输入都应该在计算时出现。然而,应该记住,程序员应该确保输入的数量最少。任何不相关的输入只会增加程序的大小和内存开销。 因此,确定输出所需的最小输入数量是理解问题的关键要素。
2.制定计划: 一旦理解了一个问题,就必须制定一个适当的行动计划来解决它。这叫做设计计划。这一步通常涉及计算给定输入集的结果。它使用上一步中绘制的输入和输出之间的关系。这一步的复杂性取决于手头问题的复杂性。
3.执行计划: 一旦确定了计划,它应该遵循行动轨迹,同时确保计划在各个检查点的完整性。如果发现两者之间有任何不一致之处,则需要修改计划。
4.评价: 必须对由此获得的最终结果进行评估和验证,以确定问题是否得到了满意的解决。
问题解决方法(问题的解决方案)
解决问题的方法被定义为最有效的解决问题的方法。虽然可以有多种方法来破解螺母,但方法是在最短的时间内以最小的努力破解螺母。显然,大锤永远不能用来敲开螺母。在问题解决方法下,我们将看到 逐步解决 为了一个问题。这些步骤与 软件生命周期 软件生命周期包括程序生命周期的几个阶段。任何tyro程序员都可以使用这些步骤以最有效的方式解决问题。该循环的几个步骤如下:
问题的逐步解决方案(软件生命周期) 1.问题定义/说明: 计算机程序基本上是解决现实问题的机器语言解决方案。因为节目通常是为了解决外部世界的实际问题而制作的。为了解决问题,有必要对问题进行定义,以获得正确的理解。例如,假设我们被要求编写“计算三个数字的平均值”的代码。在这种情况下,问题的正确定义将包括以下问题: “平均值到底意味着什么?” “如何计算平均值?”
一旦提出了这样的问题,就有助于更好地制定问题的解决方案。一旦定义了一个问题,就会列出程序的规范。问题规格说明描述了解决问题的程序必须执行的操作。它肯定应该包括:
- 输入:
程序的输入集是什么
- 输出:
程序的期望输出是什么?期望输出的形式是什么?
2.问题分析(将解决方案分解为简单步骤): 解决问题的这一步遵循模块化的方法来破解螺母。该问题被划分为多个子问题,因此为这些子问题设计解决方案变得更容易。然后合并所有这些单独部分的解决方案,以获得原始问题的最终解决方案。这就像是分而治之的方法。
模块化编程方法:
将一个大问题分解成子问题,然后将这些单独的部分作为不同的函数处理的过程称为模块化编程。每个功能的行为都独立于另一个功能,并且功能间的交流最少。有两种方法可以实现模块化编程:
- 自上而下的设计: 在这种方法中,原始问题被分成子部分。这些子部分被进一步划分。这个链条会一直持续下去,直到我们得到这个问题的最基本的子部分,而这个子部分是无法进一步划分的。然后我们为每一个基本部分画出一个解。
- 自下而上的设计: 在这种编程风格中,应用程序是使用编程语言中预先存在的原语编写的。然后将这些原语与更复杂的功能合并,直到编写应用程序。这种风格与自上而下的设计风格正好相反。
3.问题设计: 问题的设计可以用两种形式中的任何一种来表示:
- 算法 :
为制定问题的解决方案而写下的指令集称为算法。当遵循这些指令编写代码时,会产生所需的输出。算法中涉及的步骤通常用英语或任何口语编写,程序员更容易理解代码需要什么。 让我们举一个普通的例子来准备早茶,并为其编写一个算法。 第一步: 开始 第二步: 把水倒进平底锅里。 第三步: 把锅放在煤气炉上。 第4步: 点燃煤气炉。 第5步: 在锅里放糖。 第6步: 把茶叶放进锅里。 第7步: 把牛奶倒进锅里。 第8步: 过滤杯中准备好的茶。 第9步: 为他人服务,享受生活。 第10步: 停止
执行任何程序的方式分为三类:
- 序列语句 在这里,所有指令都按顺序执行,也就是说,一个接一个地执行,直到程序执行为止。
- 选择声明 顾名思义,在这些类型的语句中,不执行整个指令集。必须做出选择。根据某些条件执行选定数量的指令。如果条件为真,则执行指令集的某一部分,否则执行指令集的另一部分。由于必须从指令集中进行选择,因此这些类型的指令称为选择语句。
- 迭代或循环语句 正如名字本身所表明的,这里一组特定的指令被多次执行。这组指令在循环中持续执行,直到特定条件终止。这些类型的指令也称为迭代语句。
上述三种执行程序的方式也被称为“控制结构”,因为它们决定并控制一组语句中的执行流。
确定解决方案所需的算术和逻辑运算: 在为一个问题编写算法时,通常还会确定解决方案所需的算术和逻辑运算。它们有助于以更简单的方式编写代码,因为算术和逻辑符号的正确顺序对于确定正确的输出是必要的。当所有这些都在算法编写步骤中完成时,它只会使编码任务变得更加顺利。
4.编码: 算法一旦形成,就不能在计算机上执行。因此,在这一步中,必须将该算法翻译成特定编程语言的语法。这个过程通常被称为“编码”。编码是软件生命周期中最重要的步骤之一。找到问题的解决方案不仅具有挑战性,而且为解决方案编写优化的代码更具挑战性。
编写优化执行时间和内存存储的代码: 程序员在本地计算机上编写代码。现在,假设他写了一个需要5个小时才能执行的代码。这5个小时实际上是程序员的空闲时间。它不仅需要更长的时间,而且在这段时间内还使用了资源。内存是最宝贵的计算资源之一。一个大型程序预计将使用更多内存。然而,内存利用率并不是一个错误,但是如果一个程序正在利用不必要的时间或内存,那么它就是一个编码错误。优化后的代码可以节省时间和内存。例如,如前所述 使用最小数量的输入来计算输出 ,可以节省不必要的内存利用率。为了编写优化的代码,所有这些技术都是非常必要的。务实的世界不仅尊重问题的解决方案,也尊重优化的解决方案。这种编写优化代码的艺术也被称为 “竞争性编程”。
5.程序测试和调试: 程序测试包括运行代码的每条指令,并通过示例输入检查输出的有效性。通过测试程序,还可以检查程序中是否有错误。如果检测到错误,则完成程序调试。这是一个定位导致程序出错的指令,然后对其进行纠正的过程。程序中存在不同类型的错误: (一) 语法错误 每种编程语言都有自己的一套规则和结构,需要遵循这些规则和结构才能在该特定语言中形成有效的程序。如果在整个代码中的任何地方违反了这组规则,就会导致语法错误。 以C语言为例
#include <stdio.h> void main() { char ans[50]; printf ( "how are you?" ) gets (ans); printf ( "good to see that you are %s" , ans); } |
在上面的程序中,语法错误出现在第一个printf语句中,因为printf语句不以“;”结尾。现在,除非这个错误得到纠正,否则程序将无法执行。
一旦纠正错误,就可以得到所需的输出。假设输入为“良好”,则输出为: 输出:
how are you good to see that you are good
(二) 逻辑错误 由于在程序中执行错误的逻辑而导致的错误称为逻辑错误。它们通常在运行时被检测到。 以C语言为例:
#include <stdio.h> void main() { int n = 11, i; for (i = n; i <= 10; i++) printf ( "%d" , i); } |
在上面的代码中,“for”循环不会被执行,因为n已被初始化为11,而“for”循环只能打印小于或等于10的值。这样的代码将导致不正确的输出,因此类似的错误称为逻辑错误。 一旦纠正错误,就可以得到所需的输出。假设n用值“5”初始化,则输出为: 输出:
5 6 7 8 9 10
(三) 运行时错误 任何导致程序异常终止的错误称为运行时错误。它们在运行时被检测到。 运行时错误的一些常见示例如下: 例1:
#include <stdio.h> void main() { int a, b, c; printf ( "enter the value of a and b" ); scanf ( "%d%d" , &a, &b); c = a / b; printf ( "The quotient when a is divided by b is %d" , c); } |
如果在运行时,用户将B的输入值设为0,则程序会突然终止,导致运行时错误。输出结果如下: 输出:
NO OUTPUT Floating Point Exception
例2: 如果在执行程序时,试图打开一个不存在的文件,即硬盘中不存在的文件,也会导致运行时错误。
6.文件: 项目文件包括:
- 问题定义
- 问题设计
- 测试执行文件
- 项目发展史
- 用户手册
用户手册用于了解程序的输入、处理和输出数据。
7.程序维护: 一旦项目形成,为了确保其寿命,必须进行维护。程序的维护有其自身的相关成本,在某些情况下也可能超过程序的开发成本。程序的维护包括以下内容:
- 检测和消除现有程序中未检测到的错误。
- 修改当前程序以提高其性能和 适应性
- 增强用户界面
- 用新功能丰富项目。
- 文件的更新。
控制结构-条件控制和循环(有限和无限)
有些代码通常涉及循环语句。循环语句是指指令或一组指令多次执行,直到满足特定条件的语句。while循环、for循环、do-while循环等构成了这种循环结构的基础。这些语句也称为控制结构,因为它们决定或控制程序中的指令流。这些循环结构有两种:
- 条件控制(有限循环) 在这个循环中,循环执行的次数是有限的。一旦满足特定条件,循环就会终止。 以C语言为例:
#include <stdio.h>
void
main()
{
int
n = 1, i;
for
(i = n; i <= 10; i++)
printf
(
"%d"
, i);
}
在上面的程序中,“for”循环只在i的值小于或等于10之前执行。一旦i的值大于10,while循环就终止。 输出:
1 2 3 4 5 6 7 8 9 10 //loop gets terminated
- 无限循环 无限循环控制结构与有限循环控制结构正好相反。在这里,终止循环的条件永远不会得到满足,因此循环会无限执行。 以C语言为例:
#include <stdio.h>
void
main()
{
int
n = 1;
while
(n <= 10)
printf
(
"%d"
, n);
}
在上面的代码中,可以很容易地看到n的值没有增加。在这种情况下,n的值将始终保持为1,因此while循环将永远不会执行。这种循环称为无限循环。 输出:
1 1 1 1 1 1 .. .. .. //loop never terminates