八. 程序控制语句

● 基础知识

算法的基本控制结构: 顺序结构(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;

if (test_expr)

statement_2

statement_1

if (test_expr)

statement_2

else

#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语句下的代码是否工作

,这里a可以为左值,也可以是右值。

值)就继续,这里的真包括非0数字和字符,

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

:C++中没有!==

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总是成立,也就是说 a=3 总是要执行的;

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

这个程序的执行过程为:

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

所以最好的结果为5.

● if的特殊案例

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

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

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

,0 为什么?

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

退出循环

死记:

执行else语句;

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

,如果i等于0,则i==0表示真(非零)执行if后语句,否则执行else语句.

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

,!0表示真(非零)执行if后语句

再来个更绕的:

才可以运行下一行程序.

● 三目运算符:?

的值, 如果为真, 则执行表达式2,并返回表达式2的结果 ; 如果表达式1的值为假, 则执行表达式3 ,并返回表达式3的结果。

x = 10;

y = x> 9? 100: 200;

//等价于

x = 10;

if(x>9) y=100;

else y=200;

● if和指针

当把一个指针作为条件表达式时,所要判断的条件实际上就是"该指针是否为一空指针"。在if,while,for或do/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;

}

整除, 不能被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

到10累加

#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;    //就算循环条件不成立, 循环体也会执行一次

到10累加

#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比较

到10累加

#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循环的语句或循环体

● 循环次数:

; i++), 那么int i=0执行1次, i<100执行101次; i++执行100, 循环体执行100-0=100次;

; i++)这一整条语句来说, 它执行了101次, 即与i<100执行的次数相同

次, i<100执行101次; i++执行100, 循环体执行100-1+1=100次

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

到10累加

#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(循环控制变量)

时,停止循环,不执行循环语句,而执行下一条语句

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

}

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

)可以表示无限循环, 还可以用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循环例题还有: 打印菱形, 九九乘法表, 素数

(C/C++学习笔记) 八. 程序控制语句的更多相关文章

  1. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

  2. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  3. Java学习笔记之---流程控制语句

    Java学习笔记之---流程控制语句 (一)循环语句 (1)if语句 if(布尔表达式){ //如果布尔表达式为true将执行的语句 } if(i%2!=0){ System.out.println( ...

  4. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

  5. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  6. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  7. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  8. Java IO学习笔记八:Netty入门

    作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...

  9. [Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明

    作用域访问权限: 程序实体访问权限(作用域)有三种:1. 包级私有(代码包)2. 模块级私有(代码包)3. 公开(全域). 一个函数是一个代码块.一个程序实体的作用域总是会被限制在某个代码块中.好处: ...

随机推荐

  1. python中的面向对象学习以及类的封装(这篇文章初学者一定要好好看)

    这篇文章对于初学者可以很有效的理解面对过程.面对对象 一.首先介绍一下面向过程和面向对象的比较: 面向过程 VS 面向对象 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何 ...

  2. ip网关配置

    流量查看watch more /proc/net/devip子网查询https://www.sojson.com/convert/subnetmask.htmlhttp://ip.gchao.cn/ ...

  3. tchart2

  4. 安卓中使用OkHttp发送数据请求的两种方式(同、异步的GET、POST) 示例-- Android基础

    1.首先看一下最终效果的截图,看看是不是你想要的,这个年代大家都很忙,开门见山很重要! 简要说下,点击不同按钮可以实现通过不同的方式发送OkHttp请求,并返回数据,这里请求的是网页,所以返回的都是些 ...

  5. js时间字符串转为标准时间

    //将字符串转换为时间格式,适用各种浏览器,格式如2016-09-09T17:02:37.227"function GetTimeByTimeStr(dateString) { var ti ...

  6. PHP策略模式demo

    <?php//策略模式就是你有很多的方法,选择一种适合自己的,// 单例模式就是只有一个实例对象,不需要每个文件都要加载,比如连接数据库,// 工厂模式就是//策略模式interface cha ...

  7. Web 自动化测试框架 sweetest 介绍

    项目开源: https://github.com/tonglei100/sweetest 文章转载:https://segmentfault.com/a/1190000011612061 介绍 swe ...

  8. activiti部署流程定义时出错:INSERT INTO ACT_GE_BYTEARRAY,修改数据库编码

    activiti部署流程定义时出错 // 部署流程定义 Deployment deployment = deploymentBuilder.deploy(); 错误信息:(有乱码的...没留下截图.. ...

  9. stl中常用的排序算法

    #include"iostream" #include"vector" using namespace std; #include"string&qu ...

  10. CF-517B-DP

    http://codeforces.com/contest/1072/problem/B 给出两个数列 a,b 长度为n-1 ,询问是否能构造出一个长度为n的数列t,使得 所有的ab都满足  a[i] ...