八. 程序控制语句

● 基础知识

算法的基本控制结构: 顺序结构(sequential structure), 选择结构(case structure), 循环结构(loop structure)

case structure: ① if statement; ② nested if statement; ③ if...else if statement; ④ switch statement;

loop structure: ① while statement; ② do...while statement; ③ for statement

这些控制结构关键字后面的括号都是"测试条件(test-condition)"

流程图 flowchart

※ 块语句(Block Statement: 用花括号{}括起来的多条语句(也可以是一条, 不过这时花括号可以省略)

"语句块"又叫"复合语句(compound statements)"

 

if statement

if statement;

statement_1

if (test_expr)

    statement_2

 

statement_1

if (test_expr)

    statement_2

else

    statement_3

#include <iostream>

using namespace std;

void main()

{

    int input;

    cout << "Input a value:" << endl;

    cin >> input; //输入一整型数

    if(input%2!=0)

        cout << "The value is odd number" << endl;

} 

 

 

如果判定为假(0), 则不进行任何输出, 程序执行完毕.

注意下列容易混淆的if条件表达式:

if(a=1)实际上等于两个操作,

1. a = 1

2. if(a)

那么if(1)其实就是if(true)就是条件为真, 这通常是程序调试时看if语句下的代码是否工作

if(a==1) 是判断a是否等于1,这里a可以为左值,也可以是右值。

 

if(a);如果a为真(true或者非0)就继续,这里的真包括非0数字和字符,

if(!a);就是如果a为假(false或者0)就继续,这个和最后一个等价

if(a!=0);这个就是如果a不等于0:C++中没有!==

if(a==0) 如果a等于0

 

if ...else statement;

#include <iostream>

using namespace std;

void main()

{

    int input;

    cin >> input;

    if(input>90)

        cout << "It is Good" << endl;        //这一语句可以加花括号,但一般不用,因为这不是一个复合语句

    else

        cout << "It is not Good" << endl;

}

//其它案例

//if, else后跟的语句可以是复合语句

#include <iostream>

using namespace std;

int main()

{

    int a=10,b=5,max;

    if(a>b)

    {

        max=a;

        cout<<a<<endl;

    }

    else

    {

        max=b;

        cout<<b<<endl;

    }

    return 0;

}

 

//上面的例子如果实现没有给定两个数

#include <iostream>

using namespace std;

int main()

{

    int a,b,max;

    cout<<"input two numbers:"<<endl;

    cin>>a;

    cin>>b;        //这里也可以写成: cin>>a>>b; 或者cin>>a,b

    if(a>b)

    {

        max=a;

        cout<<a<<endl;

    }

    else

    {

        max=b;

        cout<<b<<endl;

    }

    return 0;

}

在控制台输入两个数字的方法: ①输一个,回车换行,输一个; ②在同一行输入,但两个数之间有逗号或空格.

 

if...else if ...else statement;

if (test_expr_1)

    statement_1;

else if(test_expr_2)

    statement2;

else if(test_expr_3)

    statement_3;

    ...

else if(test_expr_m)

    statement_m;

else

    statement_n;

#include <iostream>

using namespace std;

void main()

{

    char input;

    cin >> input;

    if(input == 'A')

    {

        cout << "very good" <<endl;

        return ;

    }else if(input == 'B')

    {

        cout << "good" <<endl;

        return ;

    }else if(input == 'C')

    {

        cout << "normal" <<endl;

        return ;

    }else if(input == 'D')

    {

        cout << "failure" <<endl;

        return ;

    }

    else        //如果没有除了上面的条件的情况,比如只可能有A,B,C,D四种值,这个else分支可以省略

        cout << "input error" << endl;

}

 

int a=0

if(1) a=3;

if(0) a=4;

else a=5;

 

if(1) 中的1表示真,这个if总是成立,也就是说 a=3 总是要执行的;

if(0) 中的0表示假,这个if总是不成立的,则else的条件总是成立的,也就是说 a=5总是要执行;

这个程序的执行过程为:

a=0;然后a=3;最后 a=5;

所以最好的结果为5.

 

if的特殊案例

while (x--); 这里目的就是将x减到0

x=0while(x--) ;跳出循环,不过x还要执行一次x=x-1; 所以x=-1; 答案 -1

※ 在C++中, 整数 0 被认为是false, 而其余整数则可看成true.

int i=10s=0;,执行语句whiles+=i--,--i);si值分别为300 为什么?

while循环中(s+=i--, --i)等价于 s+=i, i--, --i

进入循环后

第一次运行后:s=10, i=8

第二次运行后:s=18, i=6

第三次运行后:s=24, i=4

第四次运行后:s=28, i=2

第五次运行后:s=30, i=0

退出循环

 

死记:

if(i) 和if(i!=0)的效果是一样的,判断i是否不等于0, 如果i!=0, 那么执行if后语句,等于0执行else语句;

if(i)判断的是变量的值.

 

if(i==0) 和if(!i)的效果是一样的,判断i是否等于0,如果i等于0,则i==0表示真(非零)执行if后语句,否则执行else语句.

if(i==0) 和if(!i)判断的是表达式的值.

 

if(!i) 如果i等于0!0表示真(非零)执行if后语句

 

再来个更绕的:

if(i==0)是说i==0成立就直接运行下一行程序,if((i==0))是说在i==0这个条件下,真值为1才可以运行下一行程序.

 

 

● 三目运算符:?

//<表达式1>?<表达式2>:<表达式3>; "?"运算符的含义是: 先求表达式1的值, 如果为真, 则执行表达式2,并返回表达式2的结果 ; 如果表达式1的值为假, 则执行表达式3 ,并返回表达式3的结果。

x = 10;

y = x> 9? 100: 200;

//等价于

x = 10;

if(x>9) y=100;

else y=200;

 

if和指针

当把一个指针作为条件表达式时,所要判断的条件实际上就是"该指针是否为一空指针"。在if,whilefordo/while等语句中,或者在条件表达式中,都可以使用指针。请看下例:

if(p)    //等价于(p!=NULL)if(p !0)

{

/*dO something*/

}

else

{

/* dOsomethingelse */

}

 

if (p == NULL), if (p == 0) if(p) 都可用来判断指针是否为空

 

switch statement

switch statement;

switch (expression)            

{

    case constant_expr_1:    //constant_expr是常量表达式

        statement(s);

        break;

    case constant_expr_2:

        statement(s);

        break;

    ...

    case constant_expr_n:

        statement(s);

        break;

    default:

        statement(s);

}

//根据输入的字符输出字符串

#include <iostream>

#include <iomanip>    //C++I/O流控制头文件,但不包含这个头文件也可移执行

using namespace std;

void main()

{

    char input;

    cin >> input;

    switch (input)

    {

    case 'A':

    cout << "very good" << endl;

    break;

    case 'B':

    cout << "good" << endl;

    break;

    case 'C':

    cout << "normal" << endl;

    break;

    case 'D':

    cout << "failure" << endl;

 

    break;

    default:

        cout << "input error" << endl;

    }

}

如果把第一个break;去掉, 得到的结果是:

不过其它的case是正常的:

不是每一个 case 都需要包含 break, 如果 case 语句不包含 break,控制流将会继续后续的 case,直到遇到 break 为止。

//上面的程序还可以如下的if statement;实现

#include <iostream>

using namespace std;

void main()

{

    int input;

    cin >> iInput;

    if(input = 'A')

    {

        cout << "very good" <<endl;

        return ;

    }

    if(input = 'B')

    {

        cout << "good" <<endl;

        return ;

    }

    if(input = 'C')

    {

        cout << "normal" <<endl;

        return ;

    }

    if(input = 'D')

    {

        cout << "failure" <<endl;

        return ;

    }

    cout << "input error" << endl;

}

 

nested if statement

nested if statement;

if(test_expr_1)        //第一种判断语句的嵌套:if语句中有if...else语句

{

    if(test_expr_2)

        statement_1;

    else

        statement_2;

}

 

if(test_expr_1)        //第二种判断语句的嵌套:if...else语句中有if...else语句

{

    if(test_expr_2)

        statement_1;

    else

        statement_2;

}

else

{

    if(test_expr_2)

        statement_1;

    else

        statement_2;

}

//判断是否是闰年; 判断方法是该年份能否被4整除, 不能被100整除但能被400整除

#include <iostream>

using namespace std;

void main()

{

    int year;

    cout << "please input number" << endl;

    cin >> year;

    if(year%4==0)

    {

        if(year%100==0)

        {

            if(year%400==0)

                cout << "It is a leap year" << endl;

            else

                cout << "It is not a leap year" << endl;

        }

        else

            cout << "It is not a leap year" << endl;

    }

    else

        cout << "It is not a leap year" << endl;

}

 

//代码简化

#include <iostream>

using namespace std;

void main()

{

    int year;

    cout << "please input number" << endl;

    cin >> year;

    if(iYear%4==0 && year%100!=0 || year%400==0)

        cout << "It is a leap year" << endl;

    else

        cout << "It is not a leap year" << endl;

}

 

 

while statement

// 110累加

#include <iostream>

using namespace std;

void main()

{

    int sum=0,i=1;

    while(i<=10)

    {

        sum=sum+i;

        i++;

    }

    cout << "the result :" << sum << endl;

}

//实现无限循环

while(1)        //因为测试条件表达式(test-conditon)1表示真

{

...

}

//在C++while(1)等同于while(true), 但是在C语言中, 不存在true, 所以不能用while(1)

//为了跳出循环,循环体内部要用break语句来跳出。

例如,可以在循环体内部用if来判断,if(x==5)break;

 

//不进行循环

while(0)

{

...

}

 

 

do...while statement

do...while statement;    //就算循环条件不成立, 循环体也会执行一次

// 110累加

#include <iostream>

using namespace std;

void main()

{

    int sum=0,i=1;

    do

    {

        sum=sum+i;

        i++;

    }while(i<=10);

    cout << "the result :" << sum << endl;

}

 

while do...while比较

while 和 do...while比较

// 110累加

#include <iostream>

using namespace std;

void main()

{

    int i=0,j=0;

    cout << "before while j=" << j << endl;

    while(i>1)

    {

        j++;

    }

    cout << "after while j=" << j << endl;

}

 

//do...while

#include <iostream>

using namespace std;

void main()

{

    int i=0,j=0;

    cout << "before do_while j=" << j << endl;

    do

    {

        j++;

    }while(i>1);

    cout << "after do_while j=" << j << endl;

}

 

 

for statement

for statement;

for (initial; condition; increment)        //initial是循环变量, condition是循环条件, increment是循环条件改变

    statements;

//for (初值; 循环条件;迭代器)

//for(表达式; 表达式2; 表达式) {/*循环体*/} 这个整体称为for语句/for循环

//(表达式; 表达式2; 表达式) 称为for语句/for循环的条件表达式

//{/*循环体*/}称为for语句/for循环的语句或循环体

● 循环次数:

① 例如如果for后面的循环条件是for(int i=0; i<100; i++), 那么int i=0执行1, i<100执行101; i++执行100, 循环体执行100-0=100次;

//对于for(int i=0; i<100; i++)这一整条语句来说, 它执行了101, 即与i<100执行的次数相同

② 如果for后面的循环条件是for(int i=1; i<=100; i++), 那么那么int i=0执行1, i<100执行101; i++执行100, 循环体执行100-1+1=100

 

注意i的取值不仅关系到循环次数; 如果在循环体中也要用到变量i (比如循环体中有一个数组a[i]), 把我们就要根据实际情况, 选择i的值

// 110累加

#include <iostream>

using namespace std;

void main()

{

    int sum=0;        //sum是用来累加和的变量

    int i;                //C++,可以不用先定义变量i,而是直接在for后面测试条件中定义并初始化,for(int i=1;i<=10;i++)

    for(i=1;i<=10;i++)    //i叫作loop counter(循环计数器)loop control variable(循环控制变量)

        sum+=i;            //执行i++得到i=11以后,到表达式2,停止循环,不执行循环语句,而执行下一条语句

cout << "the result :" << sum << endl;

}

 

※ 循环语句里面可能还有内嵌循环

//除了while1)可以表示无限循环, 还可以用for表示无限循环,建议使用计数控制,也就是说循环执行到指定次数,就跳出循环

for( ; ; )

{

    ...

}

 

for循环与一维数组的初始化(倒序列)

for循环与一维数组的初始化(倒序列):

#include<stdio.h>

#include<stdlib.h>

 

void main()

{

    int a[3][4]={11,10,9,8,7,6,5,4,3,2,1,0};

    for (int i = 0; i <12; i++)

    {

        a[i/4][i%4] = i; //一维数组初始化

        //以第二个下标为准来确定除数的值

        printf("%d\t",i);

    }

}

for循环与二维数组的初始化:

构建一个数组num[3][4], 如下:

1    2    3    4

5    6    7    8

9    10    11    12

#include<stdio.h>

#include<stdlib.h>

 

void main()

{

    int num[3][4];

    for (int i = 0; i < 3; i++)

    {

        for (int j = 0; j < 4; j++)

        {

            num[i][j] = i*4+j+1; //数学公式, 赋值

            printf("%-6d", num[i][j]);    //打印

        }

        printf("\n"); //每行要换行

    }

}

 

break

#include <iostream>

using namespace std;

void main()

{

    int i,n,sum;

    sum=0;

    cout<< "input 10 number" << endl;

    for(i=1;i<=10;i++)

    {

        cout<< i<< ":" ;

            cin >> n;

        if(n<0)     //判断输入是否为负数

            break;    //碰到负数,就直接跳出循环体,碰到难题就不再做了

        sum+=n;     //对输入的数进行累加

    }

    cout << "The Result :"<< sum << endl;

}

 

continue

#include <iostream>

using namespace std;

void main()

{

    int i,n,sum;

    sum=0;

    cout<< "input 10 number" << endl;

    for(i=1;i<=10;i++)

    {

        cout<< i<< ":" ;

            cin >> n;

        if(n<0)    //判断输入是否为负数

            continue;    //碰到负数就不执行continue下面的代码,不跳出循环体,返回到循环起始语句处. 碰到难题跳过做简单的

        sum+=n;    //对输入的数进行累加

    }

    cout << "The Result :"<< sum << endl;

}

 

goto

#include <stdio.h>

int main()

{

    int i;

    for (i = 0; i<10; i++)

    {

        if (i == 5)

        {

            printf("\nWe are using goto statement when i = 5″);

            goto HAI;

        }

        printf("%d ", i);

    }

HAI: printf("\nNow, we are inside label name \"hai\" \n");

}

 

// 另一案例

#include <iostream>

using namespace std;

void main()

{

    int ivar = 0 ;            //定义一个整型变量,初始化为0

    int num = 0;            //定义一个整型变量,初始化为0

mylabel:                     //定义一个标签

    ivar++;                    //ivar自加1

    num += ivar;            //累加求和

    if (ivar <10)            //判断ivar是否小于10, ivar大于10, 就结束循环

    {

        goto mylabel;            //转向标签

    }

    cout << num << endl;

}

 

● 循环嵌套

循环嵌套

使用双层for循环打印如下由星号组成的倒三角形:

#include <iostream.h>

 

main()    //编译器会认为主函数的默认返回值类型为int, 并且main()main(void) 是一样的

{

    int k,i,j;

    for(i=0; i<4; i++)    //虽然下面有三个for, 但实际上这是一个双层的for循环,这个for外层循环统领下面两个同级的内层循环

        {

        for(k=1; k<=i; k++)    

            cout<<" ";        //C语言中的printf(" ")

        for(j=0; j<7-i*2;j++)    

            cout<<"*";        //C语言中的printf("*")

        cout<<endl;            //C语言中的printf("\n"); 也可以写成cout<<"\n"

        }

}

 

注意:一个嵌套循环是否终止,要看第一个循环是否终止了

△花括号的问题?

 

典型的for循环例题还有: 打印菱形, 九九乘法表, 素数

 

 posted on 2018-01-29 16:01  Arroz  阅读(510)  评论(0编辑  收藏  举报