zoukankan      html  css  js  c++  java
  • (C/C++学习笔记) 八. 程序控制语句

    八. 程序控制语句

    ● 基础知识

    算法的基本控制结构: 顺序结构(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 ",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(" "); //每行要换行

        }

    }

     

    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(" We are using goto statement when i = 5″);

                goto HAI;

            }

            printf("%d ", i);

        }

    HAI: printf(" Now, we are inside label name "hai" ");

    }

     

    // 另一案例

    #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(" "); 也可以写成cout<<" "

            }

    }

     

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

    △花括号的问题?

     

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

     

  • 相关阅读:
    WampServer Mysql配置
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 前10名
  • 原文地址:https://www.cnblogs.com/ArrozZhu/p/8377779.html
Copyright © 2011-2022 走看看