广州大学学生实验报告
开课实验室:计算机科学与工程实验(电子楼418A) 2023年3月23日
学院 | 计算机科学与网络工程学院 | 年级、专业、班 | 姓名 | 学号 | ||||
实验课程 | 面向对象程序设计 | 成绩 | ||||||
实验项目 | 实验一 类与对象 | 指导老师 | ||||||
一、实验目的
二、使用仪器、器材微机一台 操作系统:WinXP 编程软件:C++ 三、实验内容及原理(1) 定义一个score类,其中包括私有数据成员和公有成员函数,即 num 学号 Math 高等数学成绩 English 英语成绩 Programming 程序设计成绩 inscore() 输入学号和各科成绩,并且计算平均成绩 showscore(时) 输出学号和各科成绩 使用score类,输入某班n(事先不能确定)个学生的学号和各科成绩,然后求各个学生的平均成绩,并列表输出学生的学号、各科成绩和平均成绩。 #include<iostream> using namespace std; class score { score* b;//定义成绩数组,记录全班的成绩 long int num;//定义学号数据对象 double Math, English, Programing,Average;//定义各科成绩和平均分 public:
void inscore(score&a,int n)//定义输入成绩的成员函数 {
b = new score[n];//使用动态对象数组来描述每个学生的数据 for (int i = 0; i < n; i++) { cout << "请输入第" << i+1 << "个学生的学号:" << endl; cin >> b[i].num; cout << "请输入第" << i+1 << "个学生的高数成绩:" << endl; cin >> b[i].Math; cout << "请输入第" << i+1 << "个学生的英语成绩:" << endl; cin >> b[i].English; cout << "请输入第" << i+1 << "个学生的程序设计成绩:" << endl; cin >> b[i].Programing; b[i].Average = (b[i].Math + b[i].English + b[i].Programing) / 3; } } void showscore(score&a,int n)//定义输出成绩的成员函数 { cout << "学号\t" << "高数\t" << "英语\t" << "程序设计\t" << "平均" << endl; for (int i = 0; i < n; i++) { cout << b[i].num << "\t" << b[i].Math << "\t" << b[i].English << "\t" << b[i].Programing << "\t"<<b[i].Average<<endl; } } }; int main() { score a; a.inscore( a,3); a.showscore(a, 3); } (2)写出下列程序的执行结果,然后上机进行验证。用VC6的Debug的功能跟踪构造函数、析构函数和成员函数的执行顺序。 运行结果如下: 调用构造函数 x=2 y=50 z=9 调用重载构造函数 x=33 y=20 z=80 调用析构函数 33,20和80最大值是:80 调用析构函数 2,50和9最大值是:50 (3)建立一个复数类imaginary,其私有数据成员x和y表示复数的实部和虚部,构造函数imaginary用于对复数的实部和虚部初始化,友员函数add,sub,mul和div分别用于进行复数的加、减、乘和除法运算,静态函数show用于显示运算结果。在主函数中,实例化两个复数,并输入一个运算符,按运算符选择相应的友员函数进行复数运算,然后输出运算结果。 #include<iostream> using namespace std; class imagenary { int x, y;//定义实部和虚部变量 public: //用友元函数定义四则运算的函数 friend imagenary add(imagenary&, imagenary&); friend imagenary sub(imagenary&, imagenary&); friend imagenary mul(imagenary&, imagenary&); friend imagenary div(imagenary&, imagenary&); friend ostream& operator<<(ostream&, imagenary); //定义构造函数,设初值 imagenary(int a = 0, int b = 0) { x = a; y = b; } //定义静态成员函数,输出运算结果 static void show(imagenary& a, imagenary& b) { cout << "(" << a.x << "+" << a.y << "i" << ")" << "+" << "(" << b.x << "+" << b.y << "i" << ")" << "=" << add(a, b) << endl; cout << "(" << a.x << "+" << a.y << "i" << ")" << "-" << "(" << b.x << "+" << b.y << "i" << ")" << "=" << sub(a, b) << endl; cout << "(" << a.x << "+" << a.y << "i" << ")" << "*" << "(" << b.x << "+" << b.y << "i" << ")" << "=" << mul(a, b) << endl; cout << "(" << a.x << "+" << a.y << "i" << ")" << "/" << "(" << b.x << "+" << b.y << "i" << ")" << "=" << div(a, b) << endl; } }; imagenary add(imagenary& a, imagenary& b) { imagenary temp; temp.x = a.x + b.x; temp.y = a.y + b.y; return temp; } imagenary sub(imagenary& a, imagenary& b) { imagenary temp; temp.x = a.x - b.x; temp.y = a.y - b.y; return temp; } imagenary mul(imagenary& a, imagenary& b) { imagenary temp; temp.x = a.x * b.x - a.y * b.y; temp.y = a.y * b.x + a.x * b.y; return temp; } imagenary div(imagenary& a, imagenary& b) { imagenary temp; temp.x = (a.x * b.x + a.y * b.y) / (b.x * b.x + b.y * b.y); temp.y = (a.y * b.x - a.x * b.y) / (b.x * b.x + b.y * b.y); return temp; } //对虚部正负的输出呈现分情况讨论 ostream& operator<<(ostream& cout, imagenary a) { if (a.y > 0) cout << "(" << a.x << "+" << a.y << "i)"; else if (a.y = 0) cout << a.x; else cout << "(" << a.x << a.y << "i)"; return cout; } int main() { imagenary a(2, 7), b(3, 4); imagenary::show(a, b); } 四、实验过程原始数据记录实验一 分析:由运算结果可知,在程序中可以使用动态对象数组来描述每个学生的数据和对学生的数据进行的操作。将学生的成绩被编成一个数组,存入该动态数组中,通过for循环输入成绩,for循环输出成绩得到结果。 实验二 分析:通过Debug的功能跟踪构造函数、析构函数和成员函数的执行顺序,验证了与自己所写的运行结果相符。由运行 可知,先构造的对象最后调用析构函数,后构造的对象先调用析构函数。 实验三 分析:通过两个复数的四则运算法则,得到该运行结果。 五、实验结果及分析总结:
个人小结: 通过这次实验,我掌握了声明类的方法,了解类和类的成员概念以及定义对象,成员函数,友元函数,静态成员函数的方法,掌握引检查和调试基于对象和程序的方法;深刻领会类与对象的区别,还有类实现数据隐藏与封装的原理。 | ||||||||