第六章 控制结构(一 if选择结构)【信息学奥赛】

6.1  简介

编写解决特定问题的程序之前,首先要彻底了解问题并认真计划解决问题的方法。编写程序时,还要了解可用的基本组件和采用实践证明的程序结构原则。本章将讨论结构化编程的理论和原理的所有问题。这里介绍的技术适用于大多数高级语言,包括C++。

6.2  算法

任何计算问题都可以通过按特定顺序执行一系列操作而完成。解决问题的过程(procedure)称为算法(algorithm),包括:

1.执行的操作(action)

2.执行操作的顺序(order)

下例演示正确指定执行操作的顺序是多么重要:

考虑每个人早晨起床到上班的“朝阳算法”:(1)起床,(2)脱睡衣,(3)洗澡,(4)穿衣,(5)吃早饭,(6)搭车上班。

总裁可以按这个顺序,从容不迫地来到办公室。假设把顺序稍作调换:(1)起床,(2)脱睡衣,(3)穿衣,(4)洗澡,(5)吃早饭.(6)搭车上班。

如果这样,总裁就得带着肥皂水来上班。指定计算机程序执行语句的顺序称为程序控制(program control),本章介绍C++程序的控制功能。

6.3  控制结构

通常,程序中的语句按编写的顺序一条一条地执行,称为顺序执行(sequential execution)。程序员可以用稍后要介绍的不同C++语句指定下一个执行的语句不是紧邻其后的语句,这种技术称为控制转移(transfer of control)。

20世纪60年代,人们发现,软件开发小组遇到的许多困难都是由于控制转移造成的。goto语句使程序员可以在程序中任意指定控制转移目标,因此人们提出结构化编程就是为了清除goto语句。

Bohm和JMoP5n1的研究表明,不用goto语句也能编写程序。困难在于程序员要养成不用goto语句的习惯。直到20世纪70年代,程序员才开始认真考虑结构化编程,结果使软件开发小组的开发时间缩短、系统能够及时交付运行并在颅算之内完成软件项目。这些成功的关键是.结构化编程更清晰、更易调试与修改并且不容易出错。

BohM和J·jecopini的研究表明,所有程序都可以只用三种控制结构(control structure)即顺序结构(sequence structure)、选择结构(selection structure)和重复结构(repetition structure)。顺序结构是C++内置的,除非另外指定,计算机总是按编写的顺序一条一条地执行。图2.1的流程图(flowchart)演示了典型的顺序结构.按顺序进行两次计算。

流程图是算法或部分算法的图形表示。流程图用一些专用符号绘制,如长方形、菱形、椭圆和小圆,这些符号用箭头连接,称为流程。

C++提供三种选择结构,本章将介绍这三种选择结构。if选择结构在条件为true时执行一个操作,在条件为false时跳过这个操作。if/else选择结构在条件为true时执行一个操作,在条件为false时执行另一个操作。swutch选择结构根据表达式取值不同而选择不同操作。

if选择结构称为单项选择结构(single—selection,structure),选择或忽略一个操作。if/else选择结构称为双项选择结构(double-selection structure),在两个不同操作中选择。switch选择结构称为多项选择结构(multiple-selection structure),在多个不同操作中选择。

C++提供三种重复结构while、do/while和for。if、else、switch、while、do和for等都是C++关键字(keyword)。这些关键字是该语言保留的,用于实现如C++控制结构等不同特性。

C++只有七种控制结构:顺序结构、三种选择结构和三种重复结构。每个C++程序都是根据程序所需的算法组合这七种控制结构。这种单入/单出控制结构(single-entry/single-exit control structure)使程序容易建立,只要将一个控制结构的出口与另一个控制结构的入口连接,即可组成程序。这点很像小孩子堆积木,因此称为控制结构堆栈(control-structure stacking),还有另一种控制结构连接方法,称为控制结构嵌套(control-structure nesing)。

6.4  if选择结构

选择结构在不同操作之间选择。例如,假设考试成绩60分算及格,则下列伪代码:

    if student's grade is greater than or equal to 60

        print "Passed"

确定“学生成绩大于或等于60分”是true或false,如果是true,则该生及格,打印“Passed”字样,并顺序“执行”下一个伪代码语句(记住,伪代码不是真正的编程语言)。如果条件为false,则忽略打印语句,并顺序“执行”下一个伪代码语句。注意这个选择结构第二行的缩排,这种缩排是可选的,但值得提倡,因为它能体现结构化程序的内部结构。将伪代码变成C++代码时,C++编译器忽略空格、制表符、换行符等用于缩排和垂直分隔的空白字符。

上述伪代码的if语句可以写成如下C++语句:

if (grade>=60)

    cout<<"Passed";

cout<<"Passed";

注意C++代码与伪代码密切对应,这是伪代码的一个属性,使得其成为有用的程序开发工具。

注:伪代码常用于程存设计期间“构思”程序,然后再将伪代码程序转换为C++程序。

if结构也是单入/单出结构。

6.5  if/else选择结构

if选择结构只在条件为true时采取操作,条件为false时则忽略这个操作。利用if/else选择结构则可以在条件为true时和条件为false时采取不同操作。例如,下列伪代码:

if student's grade is greater than or equal to 60
    print "Passed"

else
    print "Failed"

在学生成绩大于或等于60时打印“Passed”,否则打印"Failed"。打印之后,都“执行”下一条伪代码语句。注意else的语句体也缩排。

   

上述伪代码if/else结构可以写成如下的C++代码:

if(grade>=60)
    cout<<"Passed";

else
    cout<<"Failed";

C++提供条件运算符(?:),与if/else结构密切相关。条件运算符是C++中惟一的三元运算符(thrnary operator),即取三个操作数的运算符。操作数和条件运算符一起形成条件表达式(conditional expression)。第一个操作数是条件,第二个操作数是条件为true时整个条件表达式的值.第三个操作数是条件为false时整个条件表达式的值。例如,下列输出语句:

cout<<(grade>=60? "Passed":"Failed");

包含的条件表达式在grade=60取值为true时,求值为字符串“Passed”;在grade>=60取值为false时,求值为字符串"Failed"。这样,带条件表达式的语句实际上与上述if/else语句相同。可以看出,条件运算符的优先级较低,因此上述表达式中的话号是必需的。

条件表达式酌值也可以是要执行的操作。例如.下列条件表达式:

grade >=60? cout<<"Passed": cout<<"Failed";

表示如果grade大于或等于60,则执行cout<<"Passed",否则执行cout<<"Failed"。这与前面的if/else结构也是相似的。条件运算符可以在一些无法使用if/else语句的情况中使用。

嵌套if/else结构(nested if/else structure)测试多个选择,将一个if/else选择放在另一个if/else选择中。例如,下列伪代码语句在考试成绩大于或等于90分时打印A.在80到89分之间时打印B,在70到79分之间时打印C,在60到69分之间时打印D,否则打印F。

if studen's grade is greater than or equal to 90
    print "A"

else
    If student's grade is greater than or equal to 80
        print "B"

else
    If student's grade is greater than or equal to 70
        print "C"

else
    If student's grade is greater than or equal to 60
        print "D"

else
    print "F"

这个伪代码对应下列C++代码:

if (grade>=90)
    cout<<"A";
    
else
    if (grade>=80)
        cout<<"B";
    else
        if (grade>=70)
            cout<<"C";
            else
                if (grade>=60)
                    cout<<"D";
                    else
                        cout<<"F";

如果考试成绩大于或等于90分,则前4个条件都为true,但只执行第一个测试之后的cout语句。执行这个cout语句之后,跳过外层if/else语句的else部分。许多C++程序员喜欢将上述if结构写成:

if (grade>=90)

    cout<<"A";

else if (grade>=80)

    cout<<"B";

else if (grade>=70)

    cout<<"C";

else if (grade>=60)

    cout<<"D";

else

    cout<<"F";

两者形式是等价的。后者更常用,可以避免深层缩排便代码移到右端。深层缩排会使一行的空间太小,不长的行也要断行,从而影响可读性。

下例在if/else结构的else部分包括复合语句:

if (grade>=60)

    cout<<"Passed.\n";

else{

    cout<<"Failed.\n";

    cout<<"You must take this course again.\n";

}

如果grade小于60,则程序执行else程序体中的两条语句并打印:

    Failed.

    You must take this course again.

注意else从句中的两条语句放在花括号中。这些花括号很重要,如果没有这些花括号,则下列语句:

    cout<<"You must take this cours again.\n";

在if语句else部分之外,不管成绩是否小于60都执行。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值