暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++入门:选择结构

酷教 2020-05-01
960
选择是人一生中的必经之路,从每个人出生开始,或是被动的或是主动的去选择自己的人生之路。选择是每个人的权利,选择的同时就注定会失去。

1

上节简单介绍了C++的数据类型和运算符,在程序中如果定义了一个变量,计算机就会在内存中开辟一个空间来存储这个变量,如果不合理设置变量,要么程序出错,要么就会出现资源浪费。比如在程序中float  a表示在内存中开辟一个存储占用4字节的空间,double则在内存中开辟一个8字节空间。

整型(int)中最常用的就是int和long long,而实型(正、负实数和0)有三种类型float、double、long double都常用,一般记住这三种类型的有效位数(精确度)即可。

在实际应用中还有一个变量类型的转换问题需要注意,也是经常使用的。比如下面的例子:

#include<iostream>
using namespace std;
int main(){
int a=3.1415926;
cout<<a;
return 0;
}
程序运行后输出结果为3,这里的变量a设置的是整型int,只能存储整数,虽然赋值了3.14.1926,但被强制类型转换成int,社区了小数部分。
再看一个例子,在上节例子中cin只做了一个数字的输入,即半径r的输入,其实cin可以做多个输入,清尝试下面例子。
例:输入三角形的底和高,求三角形的面积。
我们知道三角形的面积公式为:s=a*h/2
#include<iostream>
using namespace std;
int main()
{
int a,h,s; //底,高,面积
cin>>a>>h;
s=a*h/2;
cout<<s<<endl;
return 0;
}
仔细阅读上面的程序,看看有什么问题?需要做哪些修正?思考假如将面积s设定为float型可以吗?
#include<iostream>
using namespace std;
int main()
{
int a,h;
float s;
cin>>a>>h;
s=a*h/2;
cout<<s<<endl;
return 0;
}

变量的类型间是可以互相转换的,类型的转换一般遵循一定的规则,可分为自动转换和强制转换。仔细揣摩下面的规则,后期运用中别踩漏了。

  • 自动转换规则
    • a、若两种类型的字节数不同,转换成字节数高的类型
    • b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
    • 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
    • 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int型转成long型后再进行运算。
    • 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
    • char型和short型参与运算时,必须先转换成int型。
    • 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。
  • 强制转换规则
        强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)表达式其功能是把表达式的运算结果强制转换成类型说明符所表示的类型,如下面样子;
int a = 1; 
double b = 2.1;
cout << "a + b = " << a + (int)b << endl; //输出为a + b = 3

所以上面计算三角形面积的小程序需要写成下面的样子才可以,大家可以试验一下。

#include<iostream>
using namespace std;
int main()
{
int a,h;
float s;
cin>>a>>h;
s=a*h/2.0; //注意这里
cout<<s<<endl;
return 0;
}

需要注意的是,无论哪种转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,不改变数据说明时对该变量定义的类型。


2

前面我们练习的几个例子都是按照编写的顺序一条一条的执行,这种结构叫做顺序结构,但在实际应用中,不可避免的会遇到选择、循环等情况,C++为了支持这些控制结构,提供了丰富灵活的控制语句,从结构化程序设计的观点看,所有的程序都可以用顺序结构、选择结构和循环结构来实现。

在C++中提供了三种选择结构,即if选择结构、if-else选择结构和switch选择结构。

1.if选择语句
if(需要达到的条件){
//当达到括号中的条件时,执行花括号中的语句;单个句子不需要花括号,下面也一样 需要执行的语句;
//可有多句,但需要有花括号
}

这些选择结构只有表达式值为真,即表达式(需要达到的条件)成立时才会执行后面的语句。

关系表达式运算符一般包含:

等于== 、 不等于!=  、  大于>  、  小于<   、大于等于>=  、  小于等于<=

等几种,关系表达式的值是一个逻辑值,即“真”或“假”,如果为真,则表达式条件成立。

在表达式运算中还有可能出现逻辑运算,一般是多个条件的判断。逻辑运算符一般包含&& 与运算,||或运算,!非运算。优先级为:! > && > ||。

例子:设计如下程序,输入一个数(不为0),判断这个数是正数还是负数。
#include<iostream>
using namespace std;
int main()
{
int a;
cout<<"请输入一个不为0的整数:";
cin>>a;
if(a<0)
cout<<"a是负数"<<endl;
if(a>0)
cout<<"a是正数"<<endl;
return 0;
}
2.if-else选择语句
if(判断条件){
满足 判断条件(true),就执行此大括号里面的内容
}
if(判断条件){
满足 判断条件(true),就执行此大括号里面的内容
}

‍‍例子:设计一个程序,输入三个整数a、b、c,判断以这三个整数为边长能否构成三角形,如果能,输出yes,否输出no。

#include<iostream>
using namespace std;
int main()
{
int a,b,c;
cout<<"请输入3个不为0的整数:"<<endl;
cin>>a>>b>>c;
if(a+b>c && b+c>a && a+c>b)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
return 0;
}

3.多分支选择语句

if(判断条件A){
满足 判断条件A(true),执行此大括号内部内容,后面的else-if及else不执行
}else if(判断条件B){
满足 判断条件B(true),执行大括号里面的内容,后面的else-if 及else不执行
} else if(判断条件C){
满足 判断条件C(true),就执行此大括号里面的内容,后面的 else 不执行
}else{
前面的if esle-if 都不满足条件(false),执行此大括号里面的内容
}

例子:输入一整数,根据1-7数字显示周一至周日。

#include<iostream>
using namespace std;
int main()
{
int week;
cout<<"请输入1-7中任意整数:"<<endl;
cin>>week;
if(week==1)
cout<<"周一"<<endl;
else if(week==2)
cout<<"周二"<<endl;
else if(week==3)
cout<<"周三"<<endl;
else if(week==4)
cout<<"周四"<<endl;
else if(week==5)
cout<<"周五"<<endl;
else if(week==6)
cout<<"周六"<<endl;
else if(week==7)
cout<<"周日"<<endl;
else
cout<<"输入错误"<<endl;
return 0;
}

多个条件时还可以做嵌套,比如输入性别和身高条件,判断满足男性,身高170以上的才可以加入篮球队。可以实操看看如何编写。

4.switch语句
switch(x){//x是 变量或者一个表达式。
case 变量的可能值1: 功能语句;break;
case 变量的可能值2: 功能语句;break;
case 变量的可能值3: 功能语句;break;
........
default:功能语句;
}
还是上面判断周几的例子,可以这样去写:
#include<iostream>
using namespace std;
int main()
{
int week;
cout<<"请输入1-7中任意整数:"<<endl;
cin>>week;
switch(week) {
case 1:cout<<"周一"<<endl;break;
case 2:cout<<"周二"<<endl;break;
case 3:cout<<"周三"<<endl;break;
case 4:cout<<"周四"<<endl;break;
case 5:cout<<"周五"<<endl;break;
case 6:cout<<"周六"<<endl;break;
case 7:cout<<"周日"<<endl;break;
default:cout<<"输入错误"<<endl;
}
return 0;
}

思考:如果case语句后面漏掉了break;会出现什么状况呢?


3


微信编辑器的代码输入真坑人,保存了一下再打开格式颜色都变了,还吃字符,比如<iostream>,在代码框里面竟然可以自动消失。

还有流程图怎么画还是要认真学习一下,在程序设计中,最重要的不是写程序,而是设计。就像建筑、机械等行业的要画设计图、施工图,程序设计的思路也有必要用图的形式画出来。画图的过程就是思考的过程,由于其直观性,画图的过程本身又促进了思考。
最后试着做一下练习吧,实践是永远的最好老师。
习题一:输入一个年份,判断是否为闰年。


习题二:输入一个正整数值,请查这个值是否可以被17整除,如果可以输出yes,否则输出no。
习题三:输入某年某月某日,判断这一天是这一年的第几天。
习题四:利润提成,编写一个程序,根据年利润提成,计算企业发放的年度奖金。 
利润低于或等于10万元的部分,奖金按10%提取; 
利润高于10万元,低于或等于20万元的部分,奖金按7.5%提取;
20万到40万之间的部分,可提成5%; 
40万到60万之间部分,可提成3%;
60万到100万之间的部分,可提成1.5%; 
超过100万元的部分按1%提成。 从键盘输入当月利润,求应发放奖金总数。
习题五:根据历法,凡是1、3、5、7、8、10、12月,每月31天;凡是4、6、9、11月,每月30天;2月闰年29天,平年28天。闰年的判断方法是:
1)如果年号能被400整除,此年为闰年; 
2)如果年号能被4整除但不能被100整除,此年为闰年; 
3)其他情况都不是闰年。 
编程输入年、月,输出该月的天数。
文章转载自酷教,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论