实验一面向对象程序设计基础
1.实验目的
(1)理解并学会使用枚举类型数据以及掌握数据类型的转换
(2)掌握在什么场景下需要使用枚举类型
2.实验内容
数据类型转换的要求及格式、通过一些简单的函数实验来展现枚举类型的使用方式和使用场景
3.实验过程
3.1数据类型的强制转换
Part1.应用场景
当表达式中出现了多种类型数据的混合运算是,往往需要进行类型转换。
Part2.枚举类型的基本语法及注意事项
(1)隐含转换(默认转换)
①转换的基本原则:低类型数据转换为高类型数据(类型越高,数据的表示范围越大,精度也越高)
②各种类型的高低顺序如下:
Char short int unsigned long unsigned long fioat double
低---------------------------------------------------------------------------------à高
注:
这种转换是安全的,因为转换过程中数据的精度没有损失。
(2)显示转换(强制转换)
①作用:将表达式的结果类型转换为另一种指定的类型。
②语法形式:
类型说明符(表达式) //C++风格的显示转换符号
(类型说明符)表达式 //C语言风格的显式转换符号
两种写法形式不同,功能完全相同。
③例如:
float z=7.56,fractionPart;
int wholePart;
wholePart=int(z);//将float转换为int
fractionPart=z-(int)z;
运行结果如下:
即保留了小数部分。
3.2枚举类型
Part1.应用场景
有时候我们在解决实际问题时遇到这样的情景:一场比赛的结果只有胜、负、平局、取消比赛四种情况;一个袋子里只有红、黄、蓝、白、黑5种颜色的球;一个星期里只有星期一到星期日7天……。像这样的情形,用int,char等类型来表示他们,对数据的合法性检验会变得很麻烦。
所以,我们可以使用枚举类型。只需要将需要的变量值一一列举出来,便构成一个枚举类型。
Part2.枚举类型的基本语法及注意事项
一、 定义方式:
enum 枚举类型名字 {枚举常量表};
例:enum Weekday{SUN,MON,TUE,WED,THE,FRI,SAT};
注意:枚举常量只能以标识符形式表示,而不能是整型、字符型等文字常量。
例如: enum year_set{2010,2011,2012,2013,2014};//枚举常量不能是整形常量
enum book_set{'a','b','c','d'};//枚举类型不能是字符常量
二、应用说明
① 枚举类型具有默认值。默认从零开始,依次为0,1,2….
代码举例:
#include<iostream>
using namespace std;
enum Weekday{ SUN,MON,TUE,WED,THU,FRI,SAT };
int main()
{
Weekday one;
for (int count = SUN; count <= SAT; count++) {
cout << count << endl;
}
return 0;
}
通过代码和结果我们可以知道,我将int类型的count赋值为枚举类型的数据,在将count的值一一打印出来,结果正是从0,1,2,3,4,开始递增的。
① 枚举类型应当按照常量来处理,不能对他们赋值
代码举例:
#include<iostream>
usingnamespace std;
enumWeekday{SUN,MON,TUE,WED,THU,FRI,SAT};
int main()
{
Weekday one = SUN;
SUN = 0;
return 0;
}
程序报出以上错误,这就说明了枚举类型是一个常量,不能对他们赋值。
②可以在声明中另行定义枚举元素的值,则后面的值在前面值的基础上依次加1
例如:
enum Weekday{SUN=7,MON=1,TUE,WED,THU,FRI,SAT};
//定义SUN=7,MON=1,则后面的值在前面值的基础上依次加1,即TUE=2,WED=3,......SAT=6
代码举例:
#include<iostream>
using namespace std;
enum Weekday{ SUN = 1,MON,TUE,WED,THU,FRI,SAT = 7 };
int main()
{
Weekday one;
for (int count = SUN; count <= SAT; count++) {
cout << count << endl;
}
return 0;
}
通过代码分析可知,我将枚举类型元素的第一个元素SUN赋值为1后,后续的枚举元素的值以此为基准依次递增1,而不是之前的0,1,2,3,4,……
③枚举变量可以直接输出,输出的是变量的整数值。
enum color_set1 {RED, BLUE, WHITE, BLACK};
color3=RED; //将枚举常量值赋给枚举变量
cout<< color3; //输出的是color3的整数值,即RED的整数值1
④ 枚举类型可以进行关系运算。
例如:
day1=SUN;//day1中元素SUM的序号值为0
DAY2=MON;//day2中元素MON的序号值为1
if(day2>day1)//day2>day1比较的就是序号值的关系1>0
⑤ 整数值不能直接赋值给枚举变量,如需赋值给枚举变量,需要强制转换
整数值不能直接赋给枚举变量,如需将整数赋给枚举变量,应进行强制类型转换。
枚举(隐含转换)整形
整形(显示转换)枚举
1)枚举型数据隐含转换为整型数据(隐含转换)
int count=MON;//将枚举型数据MON的值赋给整型数据数据count
int a;
a=SUN;//枚举值赋给整型变量
cout<<a;
2)整型数据转换为枚举数据(显式转换)
result=GameResult(count);//显示转换,括号中的整型数据转换成枚举数据
代码举例:
① 声明枚举型变量 day ,today #include<iostream> usingnamespace std; enum Weekday { SUN, MON, TUE, WED, TUR, FRI, STA };//声明枚举类型名weekday int main() { Weekday day; enum Weekday today = FRI;//枚举型变量 day ,today day=SUN;//对枚举型变量赋Weekday类型的值 cout << day << endl << today << endl; return0; } 运行成功; ② 声明整型变量yesterday,对整型变量赋Weekday类型值 #include<iostream> usingnamespace std; enum Weekday { SUN, MON, TUE, WED, TUR, FRI, STA };//声明枚举类型名weekday int main() { Weekday day; enum Weekday today = FRI;//枚举型变量 day ,today int yesterday;//整型变量 yesterday yesterday = TUR;//对整型变量赋weekday型的值,测试是否正确,结果正确:枚举型变量(小)->整形变量(大),隐式转换 day=SUN; cout << day << endl << today <<endl<<yesterday<< endl; return0; } 运行成功: 说明枚举类型可以隐式转换为整形。 ③声明枚举类型变量day,对枚举型变量赋整形值 #include<iostream> usingnamespace std; enum Weekday { SUN, MON, TUE, WED, TUR, FRI, STA };//声明枚举类型名weekday int main() { Weekday day; enum Weekday today = FRI;//枚举型变量 day ,today int yesterday;//整型变量 yesterday yesterday = TUR;//对整型变量赋weekday型的值,测试是否正确,结果正确:枚举型变量(小)->整形变量(大),隐式转换 //day = SUN;//对枚举型变量赋weekday型的值,若对枚举形变量赋整型值,是否正确? day = 0;//报错:无法从int型转换为枚举类型weekday cout << day << endl << today <<endl<<yesterday<< endl; return0; } 出现错误 ④使用强制类型转换,对枚举型变量day赋整形值 #include<iostream> usingnamespace std; enum Weekday { SUN, MON, TUE, WED, TUR, FRI, STA };//声明枚举类型名weekday int main() { Weekday day; enum Weekday today = FRI;//枚举型变量 day ,today int yesterday;//整型变量 yesterday yesterday = TUR;//对整型变量赋weekday型的值,测试是否正确,结果正确:枚举型变量(小)->整形变量(大),隐式转换 //day = 0;//报错:无法从int型转换为枚举类型weekday day = (Weekday)0;//正确!强制类型转换,格式day=Weekday(0); 也正确 cout << day << endl << today <<endl<<yesterday<< endl; return0; } 通过强制类型转换,可以对枚举型变量赋整型值
① ②
③ ④
通过以上四个程序测试过程,我们可以知道:
枚举类型的数据可以和整型数据相互转换,枚举类型数据可以隐含转换为整型数据,而整型数据到枚举数据的转换,则需要采用显示转换。
Part.3枚举类型的综合运用
例:口袋中有红、黄、蓝、白、黑5种颜色的球若干个。每次从口袋中取出3个不同颜色的球,问有多少种取法。
代码展示:
#include<iostream>
usingnamespace std;
void transfer(int i)//将相应的数值组合通过switch语句转换为字符串
{
switch (i)
{
case0:cout <<"red "; break;
case1:cout <<"yello "; break;
case2:cout <<"blue "; break;
case3:cout <<"white "; break;
case4:cout <<"black "; break;
}
}
enum ball { red, yello, blue, white, black };//定义球的枚举类型
int main()
{
int i, j, k, count = 0;
for (int i = red; i <= black; i++)
{
for (int j = i + 1; j <= black; j++)
{
for (int k = j + 1; k <= black; k++)
{
transfer(i);
transfer(j);
transfer(k);
cout << endl;
count++;
}
}
}
cout << count;
return0;
}
分析:
函数transfer将相应的数值组合通过switch语句转换为字符串。定义枚举形变量ball,列举出总共的5种颜色。取出三个,及三种颜色的组合,利用循环嵌套,一一列举,以红球开始,以黄球开始,以蓝球开始的情况即可。
Part4.实验感想
通过这次实验,很清晰的了解了数据类型转换的要求以及语法形式,枚举类型的基本语法和使用场景,并对枚举类型与整型数据转化的要求做了详细的实验测试,巩固了强制类型转换的知识点的同时,对枚举类型变量的赋值要求有了更深层次的理解。