(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; 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++学习笔记) 八. 程序控制语句的更多相关文章
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
- Java学习笔记之---流程控制语句
Java学习笔记之---流程控制语句 (一)循环语句 (1)if语句 if(布尔表达式){ //如果布尔表达式为true将执行的语句 } if(i%2!=0){ System.out.println( ...
- go微服务框架kratos学习笔记八 (kratos的依赖注入)
目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...
- Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Go语言学习笔记八: 数组
Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...
- Redis学习笔记八:集群模式
作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...
- Java IO学习笔记八:Netty入门
作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...
- [Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明
作用域访问权限: 程序实体访问权限(作用域)有三种:1. 包级私有(代码包)2. 模块级私有(代码包)3. 公开(全域). 一个函数是一个代码块.一个程序实体的作用域总是会被限制在某个代码块中.好处: ...
随机推荐
- python中的面向对象学习以及类的封装(这篇文章初学者一定要好好看)
这篇文章对于初学者可以很有效的理解面对过程.面对对象 一.首先介绍一下面向过程和面向对象的比较: 面向过程 VS 面向对象 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何 ...
- ip网关配置
流量查看watch more /proc/net/devip子网查询https://www.sojson.com/convert/subnetmask.htmlhttp://ip.gchao.cn/ ...
- tchart2
- 安卓中使用OkHttp发送数据请求的两种方式(同、异步的GET、POST) 示例-- Android基础
1.首先看一下最终效果的截图,看看是不是你想要的,这个年代大家都很忙,开门见山很重要! 简要说下,点击不同按钮可以实现通过不同的方式发送OkHttp请求,并返回数据,这里请求的是网页,所以返回的都是些 ...
- js时间字符串转为标准时间
//将字符串转换为时间格式,适用各种浏览器,格式如2016-09-09T17:02:37.227"function GetTimeByTimeStr(dateString) { var ti ...
- PHP策略模式demo
<?php//策略模式就是你有很多的方法,选择一种适合自己的,// 单例模式就是只有一个实例对象,不需要每个文件都要加载,比如连接数据库,// 工厂模式就是//策略模式interface cha ...
- Web 自动化测试框架 sweetest 介绍
项目开源: https://github.com/tonglei100/sweetest 文章转载:https://segmentfault.com/a/1190000011612061 介绍 swe ...
- activiti部署流程定义时出错:INSERT INTO ACT_GE_BYTEARRAY,修改数据库编码
activiti部署流程定义时出错 // 部署流程定义 Deployment deployment = deploymentBuilder.deploy(); 错误信息:(有乱码的...没留下截图.. ...
- stl中常用的排序算法
#include"iostream" #include"vector" using namespace std; #include"string&qu ...
- CF-517B-DP
http://codeforces.com/contest/1072/problem/B 给出两个数列 a,b 长度为n-1 ,询问是否能构造出一个长度为n的数列t,使得 所有的ab都满足 a[i] ...