面向对象编程实验课随笔(类与对象2)

这篇博客记录了一次面向对象编程实验,要求包括输入多位学生成绩,显示每位同学的科目成绩及平均分,每门科目的平均成绩,成绩排序,以及文件打包。博主详细介绍了如何创建类,定义变量,实现输入、显示、计算平均分和排序等功能,并使用冒泡排序进行成绩排序。
摘要由CSDN通过智能技术生成

试验要求:

1.连续输入多位学生成绩(float)(成绩=科目A成绩+科目B成绩+科目C成绩)

2.学生数目可以由用户自定义(默认为2,最多100)

3.显示没为同学的每科成绩和平均分

4.显示每门科目的平均成绩

5.对没门科目进行排序并由高到低显示

6.对整个文件进行打包

试验随笔:

首先要建立类,在类里面声明所需要的变量。我们首先需要两个数组来保存分数和学生姓名,还需要一个记录学生数量的变量。

#include<iostream>
using namespace std;
class Student
{
public:

private:
	float score[100][100];
	int times;
	string name[100];
};

之后写上构造函数,要记得写上析构函数。

class Student
{
public:
	Student()
	{
		times = 2;
		cout << "学生数量已被设定为:2" << endl;
	}
	Student(int times1)
	{
		times = times1;
		cout << " 学生数量已被设定为:" << times << endl;
	}
	~Student(){}
}

然后就可以按照要求逐个写函数了

首先是要输入学生的姓名和成绩

void InputScore()
	{
		for (int i = 0; i < times; i++)
		{
			cout << "请输入学生姓名:" << endl;
			cin >> name[i];
			cout << "请输入科目A成绩:" << endl;
			cin >> score[i][0];
			cout << "请输入科目B成绩:" << endl;
			cin >> score[i][1];
			cout << "请输入科目C成绩:" << endl;
			cin >> score[i][2];
		}
	}

这边使用了一个二维数组来对学生成绩进行保存,用一个一维数组储存学生姓名,通过for循环来实现对含有成绩数据的二维数组,和含有姓名数据的一维字符串数组的输入。

之后便是展示之前输入的学生成绩,按照上一个函数录入的原理,同样通过for循环进行

void ShowScore()
	{
		for (int i = 0; i < times; i++)
		{
			cout << "学生的姓名为:" << name[i] << endl;
			cout << "科目A成绩:"<< score[i][0] << endl;
			cout << "科目B成绩:" << score[i][1] << endl;
			cout << "科目C成绩:" << score[i][2] << endl;
		}
	}

这之后是现实学生三科成绩的平均分

void ShowAvg()
	{
		float avg = 0;
		for (int i = 0; i < times; i++)
		{
			avg = score[i][0] + score[i][1] + score[i][2];
			avg = avg / 3;
			cout << "同学" << name[i] << "的平均成绩为:" << endl;
			cout << avg << endl;
		}
	}

通过一个for循环将三科成绩都加起来再均分,最后存入一个变量中来得到

最后是将三科成绩按照由高到低顺序进行排序

void ScoreSort()
	{
		for (int i = 0; i < times; i++)
		{
			for (int j = 0; j < 3; j++)
			{
				for (int k = 0; k < 3 - j - 1; k++)
				{
					if (score[i][k] < score[i][k + 1])
					{
						float temp;
						temp = score[i][k];
						score[i][k] = score[i][k + 1];
						score[i][k + 1] = temp;
					}
				}
			}
			cout << "经过排序后同学" << name[i] << "的成绩由高到低为" << score[i][0] << " " << score[i][1] << " " << score[i][2]<<"\n";
		}
	}

我在这里使用的是冒泡排序,因为嵌套三层循环,所以效率较低,但是胜在简单。

第一层循环用来循环需要排序的同学,第二层、第三层循环建立排序,最里层循环每一次都是前一个数字与后一个数字进行比较,将大的数字交换到前面。

现在所有要求需要的函数已经完成,开始编辑主函数

int main()
{
	Student a(3);
	a.InputScore();
	a.ShowScore();
	a.ShowAvg();
	a.ScoreSort();
	return 0;
}

将初始学生数量设置为3,载入对象,最后得到结果

 

 完整代码如下

#include<iostream>
using namespace std;
class Student
{
public:
	Student()
	{
		times = 2;
		cout << "学生数量已被设定为:2" << endl;
	}
	Student(int times1)
	{
		times = times1;
		cout << " 学生数量已被设定为:" << times << endl;
	}
	~Student(){}
	void InputScore()
	{
		for (int i = 0; i < times; i++)
		{
			cout << "请输入学生姓名:" << endl;
			cin >> name[i];
			cout << "请输入科目A成绩:" << endl;
			cin >> score[i][0];
			cout << "请输入科目B成绩:" << endl;
			cin >> score[i][1];
			cout << "请输入科目C成绩:" << endl;
			cin >> score[i][2];
		}
	}
	void ShowScore()
	{
		for (int i = 0; i < times; i++)
		{
			cout << "学生的姓名为:" << name[i] << endl;
			cout << "科目A成绩:"<< score[i][0] << endl;
			cout << "科目B成绩:" << score[i][1] << endl;
			cout << "科目C成绩:" << score[i][2] << endl;
		}
	}
	void ShowAvg()
	{
		float avg = 0;
		for (int i = 0; i < times; i++)
		{
			avg = score[i][0] + score[i][1] + score[i][2];
			avg = avg / 3;
			cout << "同学" << name[i] << "的平均成绩为:" << endl;
			cout << avg << endl;
		}
	}
	void ScoreSort()
	{
		for (int i = 0; i < times; i++)
		{
			for (int j = 0; j < 3; j++)
			{
				for (int k = 0; k < 3 - j - 1; k++)
				{
					if (score[i][k] < score[i][k + 1])
					{
						float temp;
						temp = score[i][k];
						score[i][k] = score[i][k + 1];
						score[i][k + 1] = temp;
					}
				}
			}
			cout << "经过排序后同学" << name[i] << "的成绩由高到低为" << score[i][0] << " " << score[i][1] << " " << score[i][2]<<"\n";
		}
	}
private:
	float score[100][100];
	int times;
	string name[100];
};
int main()
{
	Student a(3);
	a.InputScore();
	a.ShowScore();
	a.ShowAvg();
	a.ScoreSort();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值