c++课程设计(学生课程学分信息管理)

总体需求

假设每位学生必须完成基础课50学分,专业课50学分,选修课24学分,人文类课程8学分,实践性课程20学分才能够毕业
因此,在管理学分时,要考虑每个学分所属于的课程类别。

功能需求

1)能够通过键盘输入某位学生的学分。//该需求涵盖在下面的需求中。所以不单独在菜单中设置选项
2) 给定学号,显示某位学生的学分完成情况。
3) 给定某个班级的班号,显示该班所有学生学分完成情况。
4) 给定某位学生的学号,修改该学生的学分信息。
5) 按照某类课程的学分高低进行排序。

界面样式

输入:
程序正常运行后屏幕上显示一个文字菜单(根据序号选定相应的操作项目),当用户选定操作项目所对应的序号时,根据应用程序的提示信息,从键盘上输入相应的数据。
输出:

  1. 应用程序正常运行后,要在屏幕上显示一个文字菜单。
  2. 要求用户输入数据时,要给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等

类设计

设计Student类
private:

姓名name,学号sid,班号cid,课程信息类Course

public:

空构造函数:给所有私有属性赋默认值,string全部为“null”,int全部为0
Student(){
		name="null";
		sid="null";
		cid="null";
		course.setBasicCla(0);
		course.setCultureCla(0);
		course.setPracticeCla(0);
		course.setProfessionCla(0);
		course.setSelectCla(0);
	}
setRecord(int,int ,int,int,int);//重新设置课程学分
Course* getCourse()//返回课程信息对象指针
私有属性的set,get方法
void setName(string name)
void setSid(string sid)
void setCid(string cid)
string getName()
string getSid()
string getCid()

设计Course类
private:

	int basicCla//基础课程学分
	int professionCla//专业课程学分
	int selectCla//选修课程学分
	int cultureCla//人文课程学分
	int practiceCla//实践课程学分

public:

空构造函数,默认初始化int型为0
Course(){
		this->basicCla=0;
		this->professionCla=0;
		this->selectCla=0;
		this->cultureCla=0;
		this->practiceCla=0;
	}
set,get方法:
	int getBasicCla()//获取基础课程学分
	int getProfessionCla()//获取专业课程学分
	int getSelectCla()//获取选修课程学分
	int getCultureCla()//获取人文课程学分
	int getPracticeCla()//获取实践课程学分

	void setBasicCla()//设置基础课程学分
	void setProfessionCla()//设置专业课程学分
	void setSleectCla()//设置选修课程学分
	void setCultureCla()//设置人文课程学分
	void setPracticeCla()//设置实践课程学分

程序编写流程:

void ViewBySid(string sid,Student *students);//根据学号查询学生信息
void ViewCidAll(string cid,Student *students); //根据班号查询全班信息
void changeRecord(string sid,Student *students,int basicCla,int professionCla,int selectCla,int cultureCla,int practiceCla);//重新设置课程分数
void setStudents(Student* students);//文件数据读入
void updateStudents(Student *students);//文件数据更新
void sortByRecord(int num,Student *students);//按照分数排序

业务逻辑

创建一个对象数组用来读取文件中的数据。
setStudents中进行文件流的操作,对象数组的指针传到该方法中,将文件中的数据存储到这个对象数组中
输出功能菜单,if else,else if实现对应功能的调用

设计功能菜单

1.给定学号,显示某位学生的学分完成情况。
用户界面输入学号,拿到学号后通过循环Student对象数组,该学号与Student[i].couse->getSid()比对,若比对成功,输出该学生的信息
2.给定某个班级的班号,显示该班所有学生学分完成情况。
同需求1一样,拿到班号后循环Student对象数组,然后将对应班号Student类的信息全部输出,即该班级所有学生信息
3.给定某位学生的学号,修改该学生的学分信息。
同需求1,拿到学号和学分修改信息(暂且功能为不能单独设置学分,必须传入所有课程学分),
循环数组找到对象,通过set方法更改
4.按照某类课程的学分高低进行排序。
定义一个指针数组,里边的指针元素一一指向对象数组中的对象,用排序算法(冒泡)进行排序,改变指针数组中指针的指向,然后遍历输出该数组

编写中可能遇到的问题**

问题1:c++输入和输出的问题
解决方案:
输入:

char filename[]="D://student.txt";
	char buff[1024]= {0};
	ifstream fin;
        fin.open(filename,ios::in);
        fin.getline(buff,1024);                //通过getline函数读取字符串
        cout<<buff<<endl;        
        fin.close();

写出:

	char fname[] = "d:/file1.txt";
        char buff[1024]= {0};
        /***********  写文件  *************/
        //方式1 输出流ofstream对象调用fopen函数
        ofstream fout;
        fout.open(fname,ios::out);
        if(!fout)
        {
                cout<<"打开文件失败"<<fname<<endl;
        }
        fout<< "hello world !";  //通过左移运算符写入字符串
        fout.flush();
        fout.close();

问题2:根据课程分数进行排序

for(int i=0;i<size-1;i++){
		for(int j=0;j<size-i-1;j++){
			Course *course=stus[j]->getCourse();
			Course *course2=stus[j+1]->getCourse();
			if(course->getProfessionCla() > course2->getProfessionCla()){
					Student *temp;
					temp=stus[j];
					stus[j]=stus[j+1];
					stus[j+1]=temp;
			}
		}
	}

问题3:Student类中Course还是Course*属性:
必须是course属性,因为临时在方法中创建的对象给course指针,方法的消亡,对象也会消亡,每一次调用就会创建新的对象,所以应该将Course对象作为属性,而不是它的指针。
另外,getCourse类应该返回指针,实现引用传递

问题4:文件编码格式和输入流读入编码格式不同
解决方案:文件读入时是GBK编码格式,将txt文件中的数据转为GBK格式
使用工具notePad++

问题5:提取文件中的数字字符串转换为整型数据进行存储,比如basicCla为整型,但文件是字符串。
解决方案:basicStr是字符串 int basicCla=atoi(basicStr.c_str());

完整代码

Student类

#include <string>
#include "Course.h"
using namespace std;
class Student{
	private:
		string name;
		string sid;
		string cid;
		Course course;
	public:
	
		Student(){
			name="null";
			sid="null";
			cid="null";
		}
		
	
	
		void setRecord(int basicCla,int professionCla,int selectCla,int cultureCla//重新设置课程学分 
				,int practiceCla){
					course.setBasicCla(basicCla);
					course.setProfessionCla(professionCla);
					course.setSelectCla(selectCla);
					course.setCultureCla(cultureCla);
					course.setPracticeCla(practiceCla);
		}
		
		
		
		Course* getCourse(){//返回课程信息对象 
				return &course;
		}
		
		
		
		
		
		
		void setName(string name){
			this->name=name;
		}
		void setSid(string sid){
			this->sid=sid;
		}
		void setCid(string cid){
			this->cid=cid;
		}
		
	
		string getName(){
			return name;
		}
		string getSid(){
			return sid;
		}
		string getCid(){
			return cid;
		}
	
};

Course类

#include <string>
using namespace std;

class Course{
	private:
		int basicCla;//基础课程学分50
		int professionCla;//专业课程学分50
		int selectCla;//选修课程学分24
		int cultureCla;//人文课程学分8
		int practiceCla;//实践课程学分20
	public:
		
		Course(){
			this->basicCla=0;
			this->professionCla=0;
			this->selectCla=0;
			this->cultureCla=0;
			this->practiceCla=0;
		}
		
		int getBasicCla(){//获取基础课程学分
			return basicCla;
		}
		int getProfessionCla(){//获取专业课程学分
			return professionCla;
		}
		int getSelectCla(){//获取选修课程学分
			return selectCla;
		}
		int getCultureCla(){//获取人文课程学分
			return cultureCla;
		}
		int getPracticeCla(){//获取实践课程学分
			return practiceCla;
		}
		
		
		void setBasicCla(int basicCla){//设置基础课程学分
			this->basicCla=basicCla;
		}
		void setProfessionCla(int professionCla){//设置专业课程学分
			this->professionCla=professionCla;
		}
		
		void setSelectCla(int selectCla){//设置选修课程学分
			this->selectCla=selectCla;
		}
		
		void setCultureCla(int cultureCla){//设置人文课程学分
			this->cultureCla=cultureCla;
		}
		
		void setPracticeCla(int practiceCla){//设置实践课程学分
			this->practiceCla=practiceCla;
		}
		


		
		
		
				
	};

main.cpp逻辑代码

#include <iostream>
#include <string>
#include "fstream"
#include "Student.h" 
#include "fstream"
#include <sstream>
#include<stdlib.h>

//数组长度函数  int sizeof(array) 
using namespace std;
const int size=5;

int main(){
	//函数声明 
	void ViewBySid(string sid,Student *students);
	void ViewCidAll(string cid,Student *students); 
	void changeRecord(string sid,Student *students,int basicCla,int professionCla,int selectCla,int cultureCla,int practiceCla);
	void setStudents(Student* students);
	void updateStudents(Student *students);
	void sortByRecord(int num,Student *students);
	
	
	
	
	//将文件中的数据存入对象数组中 
		Student students[size];
		setStudents(students);
		string strNum="";
		
		cout<<"菜单"<<endl;
		cout<< "1.查询某个学生信息"<<endl;
		cout<< "2.查询班级学生信息" <<endl;
		cout<< "3.修重置某个学生学分"<<endl;
		cout<< "4.根据学分排序" <<endl; 
		
		cout<<"请输入序号选择对应功能:" ;
 		strNum=cin.get();
 		
 		
		while(strNum!="esc") {
		int num=atoi(strNum.c_str());
 		//输入 
 		if(num==1){
 			cout<<"请输入学生的学号"<<endl;
			string sid;
			cin>>sid;
			ViewBySid(sid,students);
		 }else if(num==2){
		 	cout<<"请输入班级"<<endl;
			 string cid;
			 cin>> cid;
			 ViewCidAll(cid,students);
		 }else if(num==3){
		 	cout<<"请输入学号"<<endl;
			 string sid;
			 int basicCla;
			 int professionCla;
			 int selectCla;
			 int cultureCla;
			 int practiceCla;
			 cin>>sid;
			 cout<<"请输入基础课学分"<<endl;
			 cin>>basicCla;
			 cout<<"请输入专业课学分"<<endl;
			 cin>>professionCla;
			 cout<<"请输入选修课学分"<<endl;
			 cin>>selectCla;
			 cout<<"请输入文体课学分"<<endl;
			 cin>>cultureCla;
			 cout<<"请输入实践课学分"<<endl;
			 cin>>practiceCla;
			 changeRecord(sid,students,basicCla,professionCla,selectCla,cultureCla,practiceCla);
			 
			  
		 }else if(num==4){
		 	cout<<"输入下列序号选择排序的种类"<<endl; 
		 	cout<<"1.按照基础课程学分进行排序"<<endl;
		 	cout<<"2.按照专业课程学分进行排序"<<endl;
		 	cout<<"3.按照选修课程学分进行排序"<<endl;
		 	cout<<"4.按照文体课程学分进行排序"<<endl;
		 	cout<<"5.按照实践课程学分进行排序"<<endl;
		 	string orderNum;
		 	cin>>orderNum;
		 	int num=atoi(orderNum.c_str());
		 	sortByRecord(num,students);
		 }
 		updateStudents(students);
 		cout<<endl;
 		cout<<"继续输入序号使用其他功能,输入esc退出程序"<<endl; 
 		cin.get();
		cin>>strNum;
 	}
 	cout<<"谢谢使用!"<<endl; 
 		
                     
        
	
		
	
	
	
	return 0;
}

//传入学号,显示该学生的信息 
void ViewBySid(string sid,Student *students){
	for(int i=0;i<size;i++){
		if(sid==students[i].getSid()){
			Course *course=students[i].getCourse();
			cout<<students[i].getName()<<"  ";
			cout<<students[i].getSid()<<"  ";
			cout<<students[i].getCid()<<"  ";
			cout<<course->getBasicCla()<<"  ";
			cout<<course->getProfessionCla()<<"  ";
			cout<<course->getSelectCla()<<"  ";
			cout<<course->getCultureCla()<<"  ";
			cout<<course->getPracticeCla()<<"  ";
			break;
			
		}
	}
}

//传入班号,显示所有学生的信息 
void ViewCidAll(string cid,Student *students){
	for(int i=0;i<size;i++){
		if(cid==students[i].getCid()){
			Course *course=students[i].getCourse();
			cout<<students[i].getName()<<"  ";
			cout<<students[i].getSid()<<"  ";
			cout<<students[i].getCid()<<"  ";
			cout<<course->getBasicCla()<<"  ";
			cout<<course->getProfessionCla()<<"  ";
			cout<<course->getSelectCla()<<"  ";
			cout<<course->getCultureCla()<<"  ";
			cout<<course->getPracticeCla()<<"  "<<endl;
			
		}
	}
}


// 传入学号,修改学分信息
void changeRecord(string sid,Student *students,int basicCla,int professionCla,int selectCla,int cultureCla,int practiceCla){
		for(int i=0;i<size;i++){
		if(sid==students[i].getSid()){
			Course *course=students[i].getCourse();
			course->setBasicCla(basicCla);
			course->setProfessionCla(professionCla);
			course->setSelectCla(selectCla);
			course->setCultureCla(cultureCla);
			course->setPracticeCla(practiceCla);
		}
	}



} 
//将文件中信息存储到students对象数组中 

void setStudents(Student* students){
	char filename[]="D://student.txt";
		ifstream fin;
        fin.open(filename,ios::in);
        if(!fin){
        	cout<<"文件打开失败"; 
		}
		for(int i=0;i<size;i++){
			string str;
			fin>>str;
			students[i].setName(str);
			
			fin>>str;
			students[i].setSid(str);
			
			fin>>str;
			students[i].setCid(str);
			
			
			fin>>str;
			students[i].getCourse()->setBasicCla(atoi(str.c_str()));
			fin>>str;
			students[i].getCourse()->setProfessionCla(atoi(str.c_str()));
			fin>>str;
			students[i].getCourse()->setSelectCla(atoi(str.c_str()));
			fin>>str;
			students[i].getCourse()->setCultureCla(atoi(str.c_str()));
			fin>>str;
			students[i].getCourse()->setPracticeCla(atoi(str.c_str()));
 		
		}
		fin.close();
		
} 
//将数组信息更新到文件中 

void updateStudents(Student *students){
	 	char filename[] = "D://student.txt";
        char buff[1024]= {0};
        /***********  写文件  *************/
        //输出流ofstream对象调用fopen函数
        ofstream fout;
        fout.open(filename,ios::out);
        if(!fout)
        {
                cout<<"打开文件失败"<<filename<<endl;
        }
        
        
        
        
        for(int i=0;i<size;i++){
        	if(students[i].getName()==""){
        		fout<<"null"<<" ";
			}else{
				fout<<students[i].getName()<<" ";
			}
			if(students[i].getSid()==""){
        		fout<<"null"<<" ";
			}else{
				fout<<students[i].getSid()<<" ";
			}
			if(students[i].getCid()==""){
        		fout<<"null"<<" ";
			}else{
				fout<<students[i].getCid()<<" ";
			}
 			
 			
 			
 			
 			Course * course =students[i].getCourse();
 			fout<<course->getBasicCla()<<" ";
			fout<<course->getProfessionCla()<<" ";
			fout<<course->getSelectCla()<<" ";
			fout<<course->getCultureCla()<<" ";
			fout<<course->getPracticeCla()<<endl;
		}
        
        
        
        fout.flush();
        fout.close();

}


//对某类课程的分数进行排序    通过switch让用户进行数字选择,对应相应的课程 
void sortByRecord(int num,Student *students){
	Student *stus[5];
	for(int i=0;i<size;i++){
		stus[i]=&students[i];
	}
	
	if(num==1){//根据基础课程进行排序 
		for(int i=0;i<size-1;i++){
			for(int j=0;j<size-i-1;j++){
				Course *course=stus[j]->getCourse();
				Course *course2=stus[j+1]->getCourse();
				if(course->getBasicCla() > course2->getBasicCla()){
					
					Student *temp;
					temp=stus[j];
					stus[j]=stus[j+1];
					stus[j+1]=temp;
				}
			}
		}
		
	
		
	}else if(num==2){//根据专业课程进行排序 
		for(int i=0;i<size-1;i++){
			for(int j=0;j<size-i-1;j++){
				Course *course=stus[j]->getCourse();
				Course *course2=stus[j+1]->getCourse();
				if(course->getProfessionCla() > course2->getProfessionCla()){
					
					Student *temp;
					temp=stus[j];
					stus[j]=stus[j+1];
					stus[j+1]=temp;
				}
			}
		}
		
		
	}else if(num==3){//根据 选修课程进行排序 
		for(int i=0;i<size-1;i++){
			for(int j=0;j<size-i-1;j++){
				Course *course=stus[j]->getCourse();
				Course *course2=stus[j+1]->getCourse();
				if(course->getSelectCla() > course2->getSelectCla()){
					
					Student *temp;
					temp=stus[j];
					stus[j]=stus[j+1];
					stus[j+1]=temp;
				}
			}
		}
		
	}else if(num==4){//根据文体课程进行排序 
		for(int i=0;i<size-1;i++){
			for(int j=0;j<size-i-1;j++){
				Course *course=stus[j]->getCourse();
				Course *course2=stus[j+1]->getCourse();
				if(course->getCultureCla() > course2->getCultureCla()){
					
					Student *temp;
					temp=stus[j];
					stus[j]=stus[j+1];
					stus[j+1]=temp;
				}
			}
		}
		
		
	}else if(num==5){//根据实践课程进行排序 
		
		for(int i=0;i<size-1;i++){
			for(int j=0;j<size-i-1;j++){
				Course *course=stus[j]->getCourse();
				Course *course2=stus[j+1]->getCourse();
				if(course->getPracticeCla() > course2->getPracticeCla()){
					
					Student *temp;
					temp=stus[j];
					stus[j]=stus[j+1];
					stus[j+1]=temp;
				}
			}
		}
		
		
	}else{}
	for(int i=0;i<size;i++){
		Student stu=*stus[i];
			Course *course=stu.getCourse();
			cout<<stu.getName()<<"  ";
			cout<<stu.getSid()<<"  ";
			cout<<stu.getCid()<<"  ";
			cout<<course->getBasicCla()<<"  ";
			cout<<course->getProfessionCla()<<"  ";
			cout<<course->getSelectCla()<<"  ";
			cout<<course->getCultureCla()<<"  ";
			cout<<course->getPracticeCla()<<"  "<<endl;
		}
} 

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,学生成绩管理系统的设计与实现,需要以下几个步骤: 1. 确定系统需求:考虑需要实现哪些功能,比如学生信息管理课程信息管理、成绩录入与查询等。 2. 设计数据库:根据系统需求,设计合适的数据库结构,包括学生表、课程表、成绩表等。 3. 编写程序代码:使用C++语言编写程序代码,实现系统需求,包括菜单界面、数据输入与输出、查询结果显示等。 4. 测试与调试:对程序进行测试与调试,保证程序的正确性与稳定性。 下面是一个简单的学生成绩管理系统的设计与实现示例: 1. 系统需求: - 学生信息管理:包括学生姓名、学号、性别、年龄等基本信息。 - 课程信息管理:包括课程名称、课程编号、学分等基本信息。 - 成绩录入与查询:包括成绩录入、成绩查询、成绩统计等功能。 2. 数据库设计: - 学生表:包括学生姓名、学号、性别、年龄等基本信息。 - 课程表:包括课程名称、课程编号、学分等基本信息。 - 成绩表:包括学生学号课程编号、成绩等信息。 3. 程序代码: 该程序使用C++语言编写,使用文件存储数据。 - 主菜单界面: ``` ======================================== 学生成绩管理系统 ======================================== 请选择操作: 1. 学生信息管理 2. 课程信息管理 3. 成绩录入与查询 4. 退出系统 ``` - 学生信息管理界面: ``` ======================================== 学生信息管理 ======================================== 请选择操作: 1. 添加学生信息 2. 修改学生信息 3. 删除学生信息 4. 查看学生信息 5. 返回主菜单 ``` - 课程信息管理界面: ``` ======================================== 课程信息管理 ======================================== 请选择操作: 1. 添加课程信息 2. 修改课程信息 3. 删除课程信息 4. 查看课程信息 5. 返回主菜单 ``` - 成绩录入与查询界面: ``` ======================================== 成绩录入与查询 ======================================== 请选择操作: 1. 录入成绩 2. 查询成绩 3. 统计成绩 4. 返回主菜单 ``` 其中,每个操作对应具体的代码实现,例如添加学生信息的代码: ``` void add_student() { // 读取学生信息 std::string name, id, gender; int age; std::cout << "请输入学生姓名:"; std::cin >> name; std::cout << "请输入学生学号:"; std::cin >> id; std::cout << "请输入学生性别:"; std::cin >> gender; std::cout << "请输入学生年龄:"; std::cin >> age; // 写入学生信息 std::ofstream fout("student.txt", std::ios::app); fout << id << "," << name << "," << gender << "," << age << std::endl; fout.close(); std::cout << "添加学生信息成功!" << std::endl; } ``` 4. 测试与调试: 对程序进行测试与调试,确保程序的正确性与稳定性。例如,输入非法字符时,程序需要进行异常处理,防止程序崩溃。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值