赞
踩
假设每位学生必须完成基础课50学分,专业课50学分,选修课24学分,人文类课程8学分,实践性课程20学分才能够毕业
因此,在管理学分时,要考虑每个学分所属于的课程类别。
1)能够通过键盘输入某位学生的学分。//该需求涵盖在下面的需求中。所以不单独在菜单中设置选项
2) 给定学号,显示某位学生的学分完成情况。
3) 给定某个班级的班号,显示该班所有学生学分完成情况。
4) 给定某位学生的学号,修改该学生的学分信息。
5) 按照某类课程的学分高低进行排序。
输入:
程序正常运行后屏幕上显示一个文字菜单(根据序号选定相应的操作项目),当用户选定操作项目所对应的序号时,根据应用程序的提示信息,从键盘上输入相应的数据。
输出:
设计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;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。