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