八. 程序控制语句

● 基础知识

算法的基本控制结构: 顺序结构(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. windows下开启端口映射配置办法

    #1.添加一个端口映射 netsh interface portproxy add v4tov4 listenaddress=大网IP listenport=端口  connectaddress=要映 ...

  2. hdu-6194 string string string 后缀数组 出现恰好K次的串的数量

    最少出现K次我们可以用Height数组的lcp来得出,而恰好出现K次,我们只要除去最少出现K+1次的lcp即可. #include <cstdio> #include <cstrin ...

  3. Django 权限管理(二)

    权限菜单展示 1.展示的效果 实现该效果,涉及到的核心点(突破点) 1. 权限分类: (1)菜单权限 (主要用来展示的权限(url)如查看权限 url,  如上图中的每个权限都归类为菜单权限,主要用来 ...

  4. apiCloud 双击事件

    apiCloud 双击事件只能使用纯js去写 var app = new Vue({ el: "#app", data: function() { return { token: ...

  5. optimizer(代码分析)

    torch.optim是里面是和优化算法相关的类.比如使用SGD算法用 optimizer = optim.SGD(net.parameters(),lr=1e-3) 这个地方要注意的是传入的第一个参 ...

  6. 1.2 面向对象 Object-oriented

    前导课程 1.UML(统一建模语言) 2.OOAD Concept(Object-oriented Analysis and Design 概念) 3.Design Pattern(设计模式) 4.面 ...

  7. A strange lift HDU - 1548

    There is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 ...

  8. 统计数组中各个元素出现的次数,元素取值范围为:1到N

     问题描述: * 给定一个整数数组a,长度为N,元素取值范围为[1,N]. * 统计各个元素出现的次数,要求时间复杂度为O(N),空间复杂度为O(1). * 可以改变原来数组结构.  思路: * 从第 ...

  9. CRS添加、删除节点

    一.如何删除一个节点: 1.1 在存活的节点上操作,使用dbca删除DB实例 1.2 清除ASM实例  在存活的节点上做如下操作  1.2.1 停止ASM实例    export ORACLE_HOM ...

  10. SQL - 数据定义

    SQL 的数据定义功能包括模式定义.表定义.视图和索引的定义: 操作对象 操作方式 创建 删除 修改 模式  create schema drop schema   表  create table d ...