当前位置: 首页 > 文档资料 > C++大学教程 >

2.10 构造算法与自上而下逐步完善:实例研究3(嵌套控制结构)

优质
小牛编辑
135浏览
2023-12-01

下面介绍另一个问题。这里还是用伪代码和自上而下逐步完善的方法构造算法,然后编写相应的C++程序。我们介绍过按顺序堆叠的控制结构,就像小孩堆积木一样。这里显示C++中控制结构的另一种方法,称为嵌套控制结构。

考虑下列问题:

学校开了一门课,让学生参加房地产经纪人证书考试。去年,几个学生读完这门课并参加了证 书考试。学校想知道学生考试情况,请编写一个程序来总结这个结果。已经得到了10个学生 的名单,每个姓名后面写1时表示考试通过,写2时表示没有通过。
程序应分析考试结果,如下所示:

1.输入每个考试成绩(即l或2),每次程序请求另一个考试成绩时,在屏幕上显示消息“Enter result"。
2.计算每种类型的考试成绩数。
3.显示总成绩,表示及格人数和不及格人数。
4.如果超过8个学生及格,则打印消息“Raise tuition”。

认真分析上述问题后,我们做出下列结论:

1.程序要处理10个考试成绩,用计数器控制循环。
2.每个考试成绩为数字l或2,每次程序读取考试成绩时,程序要确定成绩是否为数字1或2。
我们的算法中测试1,如果不是l,则我们假设其为2(本章末尾的练习会考虑这个假设的结果)。
3,使用两个计数器,分别计算及格人数和不及格人数。
4.程序处理所有结果之后,要确定是否有超过8个学生及格。

下面进行自上而下逐步完善的过程。首先是上层的伪代码表示:

Analyze exam results and decide if tuition should be raised

我们再次强调,顶层是程序的完整表达,但通常要先进行几次完善之后才能将伪代码自然演变成C++程序。我们的第一步完善为:

Initialize variables
lnput the ten quiz qrades and COU~t passes and failures
Print a sugary Of the cxam results and decide if tuition should be raised

这里虽然有整个程序的完整表达式,但还需要进一步完善。我们要提供特定变量。要用两个计数器分别计算,用一个计数器控制循环过程,用一个变量保存用户输入。伪代码语句:

Initialize variables

可以细分如下:

Initialize passes to zero
lnitialize failules to  zero
Inltiallze student  counter to  One

注意.这里只初始化计数器和总和。伪代码语句:

Input the ten quiz grades and count Passes and faiLures

要求循环输入每个考试成绩。我们事先知道共有10个成绩,因此可以用计数器控制循环。在循环中(即嵌套在循环中),用一个双项选择结构确定考试成绩为数字1或2,并递增相应的计数器。上述伪代码语句细化如下:

while student counter is less than or equal to ten
Input the next exam result
if the student passed
Add one to Passes
else
Add One to failures
Add one to student counter

注意这里用空行分开if/else控制结构,以提高程序可读性。伪代码语句:

Print a sugary Of the exam results and declde if tuition should be raised

可以细化如下:

Print the number of passes
Print the number of filuies
if more than eight students Passed
Priht "Raise tuition"

图2.10显示了完整的第2步完善结果。注意这里用空行分开while结构,以提高程序可读性。

Initlalize passes to zero
Init±a1ize failures to zero
lnitlallze student counter to one
while student counter is less than or equal to ten
Input the next exam result
if the student Passed
Add one to passes
else
Add one to failures
Add one to student counter
Priht the number of passes
Prirt the number of filures
if more than eight students passed
Print”Raise tuition'’

图2.10检查考试成绩的伪代码

这个伪代码语句已经足以转换为C++程序。图2.11显示了C++程序及示例的执行结果。注意,我们利用C++的一个特性,可以在声明中进行变量初始化。循环程序可能在每次循环开头要求初始化,这种初始化通常在赋值语句中进行。

// Fig. 2.11: fig02_ll.cpp
#include 

int main(){
  // initialize variables in declarations
  int passes = 0, // number of passes
  Passes = v; // number or passes
  failures = 0, // number of failures
  studentCounter = 1, // student counter
  result; // oue exam result
  // process 10 students; counter-controlled loop
  while ( studentCounter <= 10 ) {
    cout << "Enter result (1=pass,2=fail): "; cin >> result;
    if { result == 1 } // if/else nested in while
    passes = passes + 1;
    else
    failures = failures + 1;
    studentcounter = studentCounter + 1;
    )
    // termination phase
    cout << "Failed" << failures << endl; if ( passes > 8 )
    cout << "Raise tuition "<< endl;
    return 0; // successful termination
  }
}

输出结果:

Enter result (l=pass,2=fail}: 1
Enter result (l=pass,2=fail): 2
Enter result (l=pass,2=fail): 1
Enter result (l=pass,2=fail): 1
Enter result (l=pass,2=fail): 1
Enter result (l=pass,2=fail) 1
Enter result (l=pass,2=fail): 2
Enter result {l=pass,2=fail): 1
Enter result (l=pass,2=fail): 1
Enter result )1=pass,2=fail): 2
Passed 6
Failed 4

Enter result (a=pass,2=Fail): 1
Enter result (l=pass,2=fail): 1
Enter result (l=pass,2=fail) 1
Enter result (1-pass,2=fail): 2
Enter result {l=pass,2=fail): 1
Enter result (l=pass,2=fail): 1
Enter result {1=Pass,2=fail):1
Enter result(1=pass,2=fail):1
Enter result(1=pass,2=fail):1
Enter result(1=pass,2=fail):1
Passed 9
Failed 1
Raise tuition

图2.11 检查考试成绩的C++程序及示例执行结果

编程技巧2.13

在声明中进行变量初初化可以帮助程序员避免数据表初始化问题。

软件工程视点2.7

经验表明,计算机问题最难解决的部分是开发解决方案的算法。一旦确定正确算法后,从算法生成C++程序的过程通常是相当简单的。

软件工程视点2.8

许多熟练的程序员不必用伪代码之类的程序开发工具即可编写程序。这些程序员认为其最终目标是解决计算机上的问题,编写伪代码只会延迟最终产品的推出。尽管这种方法在简单和热悉的问题中能行得通,但在大型复杂项目中则可能导致严重的错误和延迟。