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循环例题还有: 打印菱形, 九九乘法表, 素数

     

  • 相关阅读:
    DBCP,C3P0与Tomcat jdbc pool 连接池的比较
    MySQL:创建、修改和删除表
    MySQL添加用户、删除用户与授权
    王垠 :写给支持和反对《完全用Linux工作》的人们 ( 2004/8/26)
    王垠:完全用Linux工作 (2003)
    王垠:什么是“对用户友好”(2012/05/18)
    顿悟:Linux是拿来用的,不是拿来折腾的
    《从零开始搭建游戏服务器》MySQL安装配置
    ehcache 缓存
    servlet
  • 原文地址:https://www.cnblogs.com/ArrozZhu/p/8377779.html
Copyright © 2011-2022 走看看