程序的控制结构【1.1】
选择结构语句:
- 引:
我们之前的程序都是由上至下一条一条的执行的(老老实实,规规矩矩),讲真的太无趣了,我们在C++中有没有更加好玩,可玩性更高的一些语法结构呢?
答案是——当然有!!!一定有的!!!!那就是我们今天要攻占的那个山头!!
占山为王需要掌握的就只有两种
if
(双分支选择)andswitch
(多项选择)当然one by one ;
if
2.switch
引用嵌套真好玩!!!-
if
语句(走上暴力不归路)
-
格式1:
if(条件表达语句) //结果为真就执行,结果为假就跳过~~无视~~ 语句1:
格式中的条件表达语句必须使用圆括号括起来
-
格式2:
if(条件表达式) { 语句1; 语句2; ………… }
例题(小茗同学又来了):
今天小茗同学在写作业的时候写到了一道题:判断一个数a是否为偶数,真则输出“Yes”
- 这就是一个判断就行了
#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
if(a%2 == 0)
cout<<"Yes"<<endl;
return 0;
}
在这里加不加花括号结果一样:
#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
if(a%2 == 0)
cout<<"Yes"<<endl;
return 0;
}
关系运算符为 == 而不能写成 = ,因为=是赋值运算符
建议在花括号内最好缩进两个字节,注意对齐,方便阅读
效果一样没有区别!
效果2
至于为何会这样,往下看吧
- 其实我们只用改动一个地方就可以判断不是偶数,输出“No”
#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
if(a%2 != 0) //条件
{
cout<<"No"<<endl;
}
return 0;
}
!= 为不等于
再继续往下看之前我们先来练习一下:
输入a,b,c三个整数保证数据在
int
内,请找出其中的最大值并输出。
输入(一行三个整数):
4 8 9
输出(两行每行三个整数):
9
其实思路很简单(只有三个数):
1.找出最大值
2.找出最小值
3.输出
下面是一个做法无比复杂的代码
#include<iostream>
using namespace std;
int main()
{
int a,b,c; //首先定义三个变量来储存读进来的值
int max;//分别用一个变量max来储存我们找到的最大值
cin>>a>>b>>c;//读入这三个数
if(a>b&&a>c)//判断a是否大于其它
max=a;
if(b>a&&b>c)//判断b是否大于其它两个数
max=b;
if(c>a&&c>b)//判断c是否大于其它两个数
max=c;
cout<<"MAX="<<max<<endl;
return 0;
}
跑跑出奇迹了:
那我们能不能在一个程序当中就完成输出“Yes”和“No”呢,当然可以
那就是下面的了:
-
if-else
语句
写完这个就去锤爆小茗:
#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
if((a%2) == 0)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
return 0;
}
上手试一试效果:
你以为就完了?不可能!!
还有一个坑还没有填:
花括号:
如果没有花括号编译器只会认为下一条语句是受if
这个大哥管的,其它的if
就没有权利去管了,所以这个花括号就像是各个 social man 划分势力范围一样的,乱分就要出问题,我们可以来告一哈不加的后果。
这个就不设置题目了,直接上需求:从键盘读入一个整数a,如果a>10则输出“a>10”和“a=a+5”,否则则输出“a<=10”和“a=a-5”
- 有花括号的:
#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
if(a>10)
{
cout<<"a > 10"<<endl;
cout<<"a + 5 = "<<a+5<<endl;
}
else
{
cout<<"a <= 10"<<endl;
cout<<"a - 5 = "<<a-5<<endl;
}
return 0;
}
这次的运行结果:
运行结果1
运行结果2
- 那么看看不加花括号的代码和效果:
#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
if(a>10)
cout<<"a > 10"<<endl;
cout<<"a + 5 = "<<a+5<<endl;
else
cout<<"a <= 10"<<endl;
cout<<"a - 5 = "<<a-5<<endl;
return 0;
}
有趣的是,在我们进行编译的时候就会像下面一样:
这里出错的原因是——难道是
其实编译器就像是一个掌权者管理着你写的代码和二进制代码的秩序性,你不把你的代码的势力范围划分好,编译器是不会放你的代码这个不安定因素进到二进制代码的王国的,这个
else
不认识if
就是两个兄弟因为一个没有分清楚的女朋友而恩断义绝了,当然你也可以理解为这就像是你和学习之间有了第三者——假期,从此与学习形同陌路了。
那我们让if
和else
这两兄弟冰释前嫌吧:
#include<iostream>
using namespace std;
int main()
{
int a;
cin>>a;
if(a>10)
{
cout<<"a > 10"<<endl;
cout<<"a + 5 = "<<a+5<<endl;
}
else
cout<<"a <= 10"<<endl;
cout<<"a - 5 = "<<a-5<<endl;
return 0;
}
这样就可以完美的编译了
- 在
a<=10
的时候输出不变:
没有区别的 - 但是到了这个势力纠纷区域
a>10
时就出现纠纷了:
错误了
这里按照我们设想的那样当a>10时是只有两个输出的,但是为什么第14行cout<<"a - 5 = "<<a-5<<endl;
依旧被执行了?
那就是你自己在划分的时候把14行划分成了公共区域,是if
和else
的共同利益,但是我们只是想把他划分给else
就是没有加花括号的问题了。
那么就说道这么多,可以尝试做做题了:
-
洛谷:
#include <iostream>
using namespace std;
int main()
{
int a,b,c,d;
cin>>a>>b>>c>>d;
int x=c-a,y=d-b;
if(y<0)
{
x--;
y+=60;
}
cout<<x<<" "<<y<<endl;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
cin>>a>>b;
c=a*10+b;
cout<<c/19<<endl;
return 0;
}
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a;
cin>>a;
if(a<=150)
{cout<<fixed<<setprecision(1)<< a*0.4463<<endl;}
if(150<a&&a<=400)
{cout<<fixed<<setprecision(1)<<a*0.4663-3<<endl;}
if(a>400)
{cout<<fixed<<setprecision(1)<<a*0.5663-43<<endl;}
return 0;
}
这里需要解释的就是setprecision(x)
就是C++输出的格式控制,控制数据的有效位数,在前面加上fixed
后就是限制输出的小数位数了,
对了。TA们都在iomanip
内,调用他们需要#include<iomanip>
为了方便其实在竞赛中常用的是C语言中的printf("%d.x",a)
就行了更方便更快速,只需要#include<cstdio>
还有很多的题目可以慢慢去做,这里就写这么多了。
The End
网友评论