如何用C++从文件读取学生成绩再求出平均成绩送回文件中

如何用C++从文件读取学生成绩再求出平均成绩送回文件中

楼主今天心血来潮,第一次发帖,请多多包涵。
首先与大家分享座右铭——

祸福无门,惟人自召;善恶之报,如影随身。

数据库第一个实验的目的和内容如下:
一、实验目的
熟练的使用C语言或C++编写程序
二、实验内容
(1)创建一个文本文件,含有若干班级的数据,要求其数据每个班级至少有50位同学,每位同学至少学习10门课程(要考虑各班级中的不同人数以及学习的课程门数不同)
(2) 写出函数求出某一位的平均成绩
(3)写出函数求出每一位的平均成绩
(4)使用文件输入数据,将运行结果送到文件中

其实读取文件数据和把数据送回文件考察的就是文件输入输出流对象的使用。
言归正传,首先说下实验思路。

(1)创建一个文本文件,含有若干班级的数据,要求其数据每个班级至少有50位同学,每位同学至少学习10门课程。因为考虑人数问题,这里只列举一个班的数据,一共54人,效果相同。文本文档f1,数据可以自己编辑,也可以找张班级成绩表,将数据从excel复制粘贴到f1这个文本文档中。
f1.txt

(2)创建一个二维数组来存储学生的各科成绩信息。这个二维数组的第一行其实是按照学号 姓名 十门学科名称。写出两个函数——函数average()求出某一位的平均成绩,函数all()求出每一位的平均成绩并打印。
在这里插入图片描述
(3)使用display()方法读入f1.txt内的学生成绩数据,再将得到的平均分用all()方法送到文件f1.txt中,考虑到如果送回原文件会导致原有数据被刷新,所以选择送到新的文件f2.txt中。而且创建输入输出流时候f2.txt文本文件会自动创建在f1.txt所在的相同目录中,不需要自己创建,非常方便。
在这里插入图片描述

(4)运行程序,观察输出结果,发现和期待结果一样。(这里有个注意点,你的班级人数如果为n.那你创建的数组大小要为n+2,因为有一行是学号 姓名 还有十门课的名称。)
f2.txt

附上源代码:

#include <iostream>
#include <string>
#include<fstream>
using namespace std;
#define MAX 56
class Student{
private:
	string num;
	string name;
	double subject[10];
	double total;
    double ave;
public:
	void display(Student s[]);
	void average(Student s[],int);
	void all(Student s[], int);
}
stu[MAX];
     void Student::display(Student s[]){
	 cout<<"所有学生的成绩信息为:"<<endl;
	 string a[56][12];
	 ifstream infile("f1.txt",ios::in);
		 if(!infile){
			 cerr<<"Open Error!"<<endl;
			 exit(1);
		 }
		 for(int i=0;i<56;i++){
			 for(int j=0;j<12;j++){
			 infile>>a[i][j];
			 cout<<a[i][j]<<" ";
			 }
			 cout<<endl;
		 }
	 s[i].total = 0;
	 for (i=1;i<56;i++){
		 	 s[i].num=a[i][0];
			 s[i].name=a[i][1];
			 for(int j=2;j<12;j++){
		     s[i].total +=atoi (a[i][j].c_str());
			 s[i].ave=s[i].total/10;
			 }	 	
	 }

}
	void Student::average(Student s[],int n){
		cout<<"请输入要查询平均成绩的学生学号:"<<endl;
		cin>>num;
			for (int i= 1; i < n; i++){
				if(s[i].num==num)
				   cout<<s[i].name<<"的平均成绩为"<<s[i].ave<<endl;
			}
	}
    void Student::all(Student s[], int n){
		ofstream outfile("f2.txt",ios::out);
		 if(!outfile){
		 cerr<<"open error!"<<endl;
         exit(1);
		 }
		cout<<"打印出所有同学的平均成绩"<<endl;
		for (int i = 1; i < n; i++){
            outfile<<s[i].name<<"的平均分为"<<s[i].ave<<endl;
		}
		outfile.close();
	}
	int main(){
			Student s;
			s.display(stu);
			s.average(stu,56);
			s.all(stu,55);
			return 0;
		}

完成一个程序主要还是拥有一个清晰的思路,多思考如何去实现这个功能,而不能盲目地开始去写,代码尽量简洁明了又功能全面,显得短小精悍。这个程序还有许多改进的空间,比如自动扩充数组容量,不论多少学生和成绩都可以,根据数据的个数而变化。

发布了16 篇原创文章 · 获赞 21 · 访问量 987

猜你喜欢

转载自blog.csdn.net/qq_42257666/article/details/101034550