admin 管理员组文章数量: 1086019
第三章:分支结构
文章目录
- 第一节:条件判断语句
- ==如果 ...==
- ==关系操作(运算)符==
- ==如果 .... 否则 ....==
- ==逻缉操作符与逻缉运算==
- ==三目运算符==
- ==if语句嵌套==
- ==switch...case..语句==
- 第二节:循环语句
- ==for 循环==
- ==加加和减减==
- ==省略参数==
- ==退出循环与跳出循环==
- ==循环嵌套==
- ==设置域宽与填充字符==
- ==另外两个循环==
- 1、while
- 2、do...while...
第一节:条件判断语句
世间万物是变幻莫测的,对于发生的不同情况,会有着不同的结果,在C++程序设计的过程中,常常需要对发生的不同情况进行判断,这就需要使用分支的方法,解决问题
例:计算时间差
输入两个时间,每个时间分别输入小时和分钟的值,然后输出两个时间之间的差,也以几小时几分表示
int hour1 = 1 , minute1 = 40;
int hour2 = 2 , minute2 = 10;
cout << "第一个时间是:" << hour1 << "小时" << minute1 <<"分" << endl;
cout << "第二个时间是:" << hour2 << "小时" << minute2 <<"分" << endl;
cout << "时间差是:" << hour2-hour1 << "小时" << minute2-minute1 <<"分" << endl;
执行结果:
如果 …
对于可能发生的事情,经常会使用“如果…就…”,如果之后的内容称为条件,如果条件满足,就做“就…”之后的事情。在程序设计中,也是用同样的方法来描述可能发生的情况的。
【语法格式】
if ( 条件成立 ) {
语句 1 ;
语句 2 ;
... ...
}
例:
int hour1 = 1 , minute1 = 40;
int hour2 = 2 , minute2 = 10;
cout << "第一个时间是:" << hour1 << "小时" << minute1 <<"分" << endl;
cout << "第二个时间是:" << hour2 << "小时" << minute2 <<"分" << endl;//对时和分进行计算
int h = hour2 - hour1;
int m = minute2 - minute1;//判断出现负数的情况
if (m<0){m = 60 + m;h = h - 1;
}cout << "时间差是:" << h << "小时" << m <<"分" << endl;
执行结果:
关系操作(运算)符
当判断一个条件时,后面的内容执不执行,完全取决于if语句条件是否得到满足,即条件的“真”与“假”。这就需要更多的能判断真假的内容,即关系运算。
计算两个值之间的关系,所以叫做关系运算
注意:== 和 = 是两个不同的操作符, == 是判断操作符两边数据的关系,是真正的等于,而 = 则是把右边的内容(结果)给左边,是赋值
【关系运算的结果】
当关系操作(运算)符两边的数据符合操作符对应的关系时,结果为真(1),否则为假(0)。
例:
// 输出5大于3的结果cout << (5 > 3) << endl ;// 输出8小于等于1的结果cout << (8 <= 1) << endl ;int a = 10;int b = 4;cout << ( a < b ) << endl ;
执行结果:
例:项目挑战——找零计算器
// 定义变量
int price;
int total;
// 读入金额和面额
cout << "应收金额(元):" ;
cin >> price;
cout << "实收面额(元):" ;
cin >> total;
// 计算找零
int change = total - price;
cout << "应找零" << change << "元" << endl;
执行结果:
例2:找零计算器02
// 定义变量
int price;
int total;
// 读入金额和面额
cout << "应收金额(元):" ;
cin >> price;
cout << "实收面额(元):" ;
cin >> total;
// 计算找零
if (total >= price){int change = total - price;cout << "应找零" << change << "元" << endl;
}
cout << "很抱歉,您的钱不够!" << endl;
执行结果:
【操作结果】
如果在if后面还有语句,它们在if结束后会执行,无论条件如何
如果 … 否则 …
【语法格式】
if ( 条件成立 ) {
语句 1 ;
语句 2 ;
... ...
}else{
语句1 ;
语句2 ;
... ...
}
例:
int weather = 5;
if(weather==1){cout << "今天去游泳" << endl;
}else{cout << "今天我只想躺着" <<endl;
}
执行结果:
例:找零计算器03
// 定义变量
int price;
int total;
// 读入金额和面额
cout << "应收金额(元):" ;
cin >> price;
cout << "实收面额(元):" ;
cin >> total;
// 计算找零
if (total >= price){int change = total - price;cout << "应找零" << change << "元" << endl;
}else{cout << "很抱歉,您的钱不够!" << endl;
}
【练习】
1、比较大小
提示用户输入两个整数,使用条件判断语句比较两个数的大小,输出大的数
2、判断成绩
提示用户输入考试成绩,使用条件判断语句,判断用户是否及格
例:项目挑战 —— 猜数字游戏
#include<iostream>
#include<cstdlib> // 与获取随机数有关,暂不研究
#include<ctime> // 与获取随机数有关,暂不研究
using namespace std;
int main(){ srand((unsigned int)time(NULL)); // 与获取随机数有关,暂不研究int ans = rand()%5+1,input; // 与获取随机数有关,暂不研究cout << "请猜一个数(1-6):";cin >> input;// 如果输入的数与随机数相同,则输出 "猜对" if(input == ans){cout << "恭喜,猜对啦!请到前台领取100万" <<endl;return 0; //---------------------------------结束程序 }cout << "猜错了,还有两次机会!" << endl;// 第二次猜cout << "请再猜一个数(1-6):";cin >> input;if(input == ans){cout << "恭喜,猜对啦!请到前台领取50万" <<endl;return 0;}cout << "猜错了,只剩一次机会了!" << endl;// 第三次猜cout << "请再猜一个数(1-6):";cin >> input;if(input == ans){cout << "恭喜,猜对啦!请到前台领取10万" <<endl;return 0;}cout << "猜错了,答案是:" << ans << endl;return 0;
}
执行结果:
逻缉操作符与逻缉运算
1、逻缉操作符
现实生活中,有些条件会很严格,要数项同时条件满足才算符合条件,在程序设计中,除了“大于”、“小于”、“等于”之外,往往还会用“与”、“或”、“非”、来进行表达
例:划分成绩区段
cout << "请输入成绩(0-100):";
cin >> mark;
if (mark>=80 && mark<=100) cout << "优秀" << endl;
if (mark>=60 && mark<80) cout << "及格" << endl;
if (mark>=0 && mark<60) cout << "不及格" << endl;
if (mark<00|| mark>100) cout << "分数错误" << endl;
执行结果;
2、逻缉运算
例:
int a = 3;
int b = 5;
int c = 7;
cout << (a<b && b<c) <<endl;
cout << (a>b && b<c) <<endl;
cout << (a<b || b>c) <<endl;
逻辑运算是对逻辑量进行的运算,结果只有0或1
三目运算符
随着程序越来越复杂多样,在代码中会出现越来越多的if语句。有时候其实只需要计算机做一个简单的判断就可以了,却不得不写占据多行的if语句,例如:两个数之间比大小。因此C++提供了另一种特殊的操作符,只用一个问号来判断一个条件。
【格式】
(条件表达式)?(条件为真时的表达式):(条件为假时的表达式)
“?” —— 称为条件操作符,含用?的表达叫条件表达式
注:条件表达式的结果需要声明一个变量进行接收,或者直接用cout输出
例:比较两个数的大小
int a,b;
cout << "请输入两个数:"<< endl;
cin >> a >> b;
if (a>b){ cout << "较大的数是:"<< a << endl;
}
if (a<b){cout << "较大的数是:"<< b << endl;
}
使用三目运算
int a,b,max;
cout << "请输入两个数:"<< endl;
cin >> a >> b;
//如a大于等于b,则a的值放到max中,否则就把b值放到max中
max = (a>b) ? a:b;
cout << "较大的数是:"<< max << endl;
【练习】
把下列自然语言描述的条件转化为逻缉运算和关系运算描述的条件,每小题至少写出两种
1、变量a不小于变量b
例:a>=b !(a<b)
2、变量a加上变量b之后再乘以变量c,得到的结果不为零
3、当变量a等于1时,变量b大于1;当变量a不等于1时,变量c大于1
4、当变量b不等于0时,变量a除以变量b大于3
5、变量b大于等于变量a并且变量b小于变量a
if语句嵌套
if语句的主要功能是给程序提供一个分支。然而,有时候程序中仅仅多一个分支是远远不够的,甚至有时候程序的分支会很复杂,有可能在分支里还有分支。这种在语句的内部多次使用同一种语句的现象叫嵌套
例:比较三个数谁最大
int a,b,c;
cout << "请输入第一个整数:";
cin >> a;
cout << "请输入第二个整数:";
cin >> b;
cout << "请输入第三个整数:";
cin >> c;
if(a>b&&a>c){cout << "大的那个是:"<<a<<endl;
}
if(b>c&&b>a){cout << "大的那个是:"<<b<<endl;
}
if(c>a&&c>b){cout << "大的那个是:"<<c<<endl;
}
使用if语句嵌套:
int a,b,c;
cout << "请输入第一个整数:";
cin >> a;
cout << "请输入第二个整数:";
cin>>b;
cout << "请输入第三个整数:";
cin >> c;
if(a>b&&a>c){cout << "大的那个是:"<<a<<endl;
}else{if(b>c&&b>a){cout << "大的那个是:"<<b<<endl; }else{if(c>a&&c>b){cout << "大的那个是:"<<c<<endl; }}
}
执行结果:
例:项目挑战 —— 非诚勿扰
int ans1,ans2 ;
cout << "你有钱吗?(是请输入1,否输入0):";
cin >> ans1;
cout << "你长得帅吗?(是请输入1,否输入0):";
cin >> ans2;
if(ans1==1){if(ans2==1){cout << "牵手成功" << endl; }else{cout << "整容医院在那边!" << endl;}
}else{if(ans2==1){cout << "搬砖的在那边!" << endl;}else{cout << "bye!" << endl;}
}
switch…case…语句
如果把if…else…语句看作是一个二分岔路口,那么计算机便可以选择一条路运行下去。但是往往在程序设计时,还会遇到“多贫路口”的状况,如果用if或者if…else…语句来描述会显得复杂而麻烦
例:
例:
int day;
cout << "请输入星期(1-7):";
cin >> day;
switch(day){case 1:{cout << "玩地铁跑酷游戏";break;}case 2:{cout << "玩我的世界游戏";break; }case 3:{cout << "玩时空猎人游戏";break; }case 4:{cout << "玩QQ游戏";break; }case 5:{cout << "玩塔防游戏";break; }case 6:{cout << "玩格斗游戏";break; }case 7:{cout << "玩恐怖游戏";break; }default:{cout << "输入错误";}
}
注:所有的case后的常量都必须不能相同,否则switch将不知道选择哪条路走。使用break关键字可以打断switch-case语句,否则将按顺序执行每一个case,直到遇到break或者整个语句结束, 防止上述情况发生
【switch-case与if…else…的区别】
switch-case语句只能对单个情况进行判断,而if-else语句可以判断一个范围内的值
例:赌大小(骰子的数字有1-6,123代表小数,456代表大数)
// 使用switch-case语句
int num;
cout << "请输入骰子的点数:";
cin >> num;
switch(num) {case 1:{cout << "是小点数"; break;}case 2:{cout << "是小点数";break;}case 3:{cout << "是小点数";break;}case 4:{cout << "是大点数";break;}case 5:{cout << "是大点数";break;}case 6:{cout << "是大点数";break;}default:{cout << "超出范围";}
}
// 使用if-else语句
int num;
cout << "请输入骰子的点数:";
cin >> num;
if(num>=1&&num<=3){cout << "是小点数";
}
if(num>3&&num<=6){cout << "是大点数";
}else{cout << "超出范围";
}
例:项目挑战 —— 十二生肖
int year;
cout << "请输入您的出生年份:";
cin >> year;
// 生肖每12年一个轮回 ,因此取余于12,取余数
int result = year % 12;
// 对余数进行switch-case判断
switch(result){case 3:{cout << "您出生于"<<year<<",是猪年"<<endl; break;}case 4:{cout << "您出生于"<<year<<",是鼠年"<<endl; break;}case 5:{cout << "您出生于"<<year<<",是牛年"<<endl; break;}case 6:{cout << "您出生于"<<year<<",是虎年"<<endl; break;}case 7:{cout << "您出生于"<<year<<",是兔年"<<endl; break;}case 8:{cout << "您出生于"<<year<<",是龙年"<<endl; break;}case 9:{cout << "您出生于"<<year<<",是蛇年"<<endl; break;}case 10:{cout << "您出生于"<<year<<",是马年"<<endl; break;}case 11:{cout << "您出生于"<<year<<",是羊年"<<endl; break;}case 0:{cout << "您出生于"<<year<<",是猴年"<<endl; break;}case 1:{cout << "您出生于"<<year<<",是鸡年"<<endl; break;}case 2:{cout << "您出生于"<<year<<",是狗年"<<endl; break;}default:{cout << "您输入有误!请重输"; }
}
执行结果:
第二节:循环语句
for 循环
计算机之所以能够帮助人类解决各种各样的问题,除了它的准确性之外,更重要的是在日常生活中,帮助人类省去了很多“力气”,并且可以不断重复做事情。
例“:输出10遍“加油”
注:for循环括号内的条件之间需要用 ” ; “ 进行隔开
for(int i=0;i<10;i=i+1){cout << "加油!" << endl;
}
执行结果:
例:求1-100的累计值
int sum = 0;
for (int i=1;i<=100;i=i+1){sum = sum + i;
}
cout << "求和的结果是:" << sum <<endl;
执行结果:
例:
int sum = 0;
for (int i=1;i<=100;i=i+1){ sum = sum + i;cout <<"求和的结果是:" << sum <<endl;
}
执行结果:
加加和减减
在for循环语句中,会经常用到 i = i + 1 这样的语句。为了方便表示,C++有了增量表达式与减量表达式,即
++
和--
。使用这两种操作符之后,整型变量的值会增加1或减少1
【i++与++i】
++i ,表示前增量操作符,先去做 i=i+1 ,再把i作为结果
i++ ,表示后增量操作符 ,先把 i作为结果,再去做 i=i+1
例:
int i=0,j=0,a,b;
a = i++;
b = ++j;
cout << "i++结果是:" << a <<",此时的i是:" << i <<endl;
cout << "++j结果是:" << b <<",此时的j是:" << j <<endl;
执行结果:
分析:当i和j同时为0时,分别去执行前后自增量以后,i和j的值明显都由0变成了1,但是a和b的值却是不同的。因为i++是先把i的值赋值给a,再做加法,而++j则是先做完加法,再把值赋值给b.
【练习】
1、例用for循环输出以下图形
2、使用for循环输出 1+3+5+7…+99 的和
3、口算:当i=1时,(i++)+(++i)+(i–) 的结果是多少?
省略参数
例:求1-100的累计值
int sum = 0;
int i = 1; //创建循环控制变量
for (;i<=100;){ //省略循环前准备和参数变化 sum = sum + i;i=i+1; //补上参数变化
}
cout << "求和的结果是:" << sum <<endl;
注意:括号内的 ";" 不可以省略,必须要写
退出循环与跳出循环
1、不会停止的循环
int i = 0;
for( ; ; ){cout << i << endl ;i++;
}
省略for循环的终止条件会使其进行无限循环,但如果放任它,则可能会导致整个程序永远不会停止,因此必须要能够让循环停下来。
2、break
3、continue
买房买哪一层,这是个让人纠结的问题,也是个见仁见智的问题。这和个人生活习惯有关,比如有人恐高,不喜欢住高层;也和迷信心理有关,比如有人忌讳4楼,因为4跟死谐音。因此中国人的房子,有时候逢4都会跳过
continue,和break并不一样,不是退出循环,而是跳过一次循环,然后再重新继续循环。
例:数一数100层的高楼,跳过带4的楼层
for(int i=0;i<=100;i++){if(i%10==4){cout << "这次不算,再来"<< endl;continue; //可用于跳过本次循环,本次不执行下面的内容}cout << "第" << i << "层楼" <<endl;
}
执行结果:
循环嵌套
和if语句一样,循环也有嵌套,即for循环的内部再出来一个或多少for循环,来描述多分支的状况
例:循环输入4个“士兵”
执行结果:
string soldier = "士兵" ;
for(int i=0;i<4;i++){cout << soldier << " " ;
}
string soldier = "士兵";
for(int j=0;j<5;j++){for(int i=0;i<4;i++){cout << soldier << " " ;}cout << endl;
}
【练习】
1、参考运行结果,使用循环嵌套的方法编写代码
2、使用continue语句,使其输出 1+3+5+…+99的和
设置域宽与填充字符
【练习答案】
1、设置域宽
【格式】
【注意】
1、设置域宽的时候应该应填入整数。
2、对输出的内容设置域宽时,仅对一个变量有效,之后的输出要再次设置。 即 cout << setw(2) << a << b; 这里对a有效,对b无效
3、需要在程序开头写上 #include <iomanip> ,否则无法使用
例:
#include<iostream>
#include <iomanip>
using namespace std;
int main(){ int number;for (int i=0;i<=3;i++){for(int j=0;j<=9;j++){number = i*10+j;cout <<setw(2) << number <<" ";}cout << endl;}return 0;
}
执行结果:
2、填充字符
【格式】
【注意】
1、设置字符的时候应该应填入字符。
2、对输出的内容可以同时设置域宽和填充字符,但仅对一个变量有效,之后的输出要再次设置。 即 cout << setw(2) << a << b; 这里对a有效,对b无效
3、需要在程序开头写上 #include <iomanip> ,否则无法使用
例:同上
#include<iostream>
#include <iomanip>
using namespace std;
int main(){ int number;for (int i=0;i<=3;i++){for(int j=0;j<=9;j++){number = i*10+j;cout << setfill('0') << setw(2) << number << " ";}cout << endl;}return 0;
}
执行结果:
例:项目挑战 —— 乘法口决表
#include<iostream>
#include <iomanip>
using namespace std;
int main(){ for (int i=1 ; i<10 ; i++){for(int j=1 ; j<i+1 ; j++){cout << setw(2) << j << "*" << setw(2) << i << "=" << setw(2) << i*j << " "; }cout << endl ;}return 0;
}
执行结果:
另外两个循环
使用 for 循环的时候,我们需要知道判断需要定议初始循环次数i、满足的条件、循环的次数来控制循环,但是人不具有先知能力,有些时候无法预知一个循环要进行几次。
比如:张三预备在赛车跑道上进行赛车练习,练习时每绕一圈他就自己记录一次,在晚饭时间之前都不停下,那如何使用for循环得到他在晚饭之前会被记录几次呢?这个for循环是无法编写的。
一个循环,最不可缺少的就是开始和终止,如果一个程序的循环只有开始而没有终止条件,那么程序就不会有结果。所以需要另一个只包含循环继续条件的循环语句
1、while
一个循环,最不可缺少的就是开始和终止。如果一个程序的循环中有开始没有终止,那程是不会有结果的。所以一个只含循环继续条件的循环语句产生了,就是while语句。while,就是"当…" 的意思。
【格式】
while (循环继续条件){
语句1;
语句2;
... ...
语句n;
}
例:数绵羊10次,10次以后就睡着了!
while(i<10){cout << i << "只绵羊!" << endl;i++;
}
cout << i << "只绵羊了!我睡着了!" << endl;
执行结果:
注:如是不满足条件,就继续数
例:破解密码
int password;
cout << "请设置一个四位数的密码(首位不能是0):";
cin >> password;
int i = 0;
while (i!=password){ cout << "尝试输入密码" << i <<",破解失败!" << endl; i++;
}
cout << "破解成功,密码是:" << i << endl;
执行结果:
这是暴力破解密码的其本原理,可以通过循环语句让机算机不断尝试破解密码。但由于无法得知密码是多少,不知道循环体要被执环多少次的情况下,应该使用 while循环
在实际应用中,多数情况下我们都是知道循环次数的,因此while多数都和for语句都是可以互相转化的,使用哪一个都差不多,while语句也有跟for循环一样的嵌套.一般来说,如果知道循环次数,最好使用for循环,如果不知道,那么便使用while循环
2、do…while…
在实际应用中有时也会遇到这样的问题,例如:妈妈叫弟弟去买大米,妈妈对弟弟说,如果看到小米免费,那么你下次就不用再去买大米了。如果弟弟第一次去就看到了小米免费,会把大米买回来吗?
像这种至少做一次的循环语句,是先执行内容再进行判断的,需要使用do…while循环语句,它能够搭配while语句。
【结构】
do{
语句 1 ;
语句 2 ;
... ...;
语句 n ;
}while(循环继续的条件);
例:
\*先询问是否要带你刷级,直到对方表示不要刷
*\
char choice;
do{int answer;cout << "小子,你想刷几级?" ;cin >> answer;for(int i=1;i<=answer;i++){cout << "你带对方升了" << i <<"级" << endl; }cout <<"还要再带你吗?(n表示不要)"; cin >> choice;
}while(choice!='n');
注 :do...whiler while语句后面有一个分号,如果缺少了这个分号,会导致编译错误
运行结果:
【结论】
要求第一次循环就要执行循环体内容,不论是否满足条件的,使用do…while;循环体可能一次都不运行的,使用只能使用while.除了do…while语句以外,所有循环语句未尾都是没有分号的。
本文标签: 第三章分支结构
版权声明:本文标题:第三章:分支结构 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1693406817a220112.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论