复制
收藏
提问
简洁
void Student::selecSub() { //判断是否是选课时间 Time nowTime; time_t t = time(NULL); tm* tt = localtime(&t); nowTime.year = tt->tm_year + 1900; nowTime.month = tt->tm_mon + 1; nowTime.day = tt->tm_mday; readTime1(); int x = diffDay(start, endt); int y = diffDay(start, nowTime); if (x >= y) { Subject* head_sub = new Subject; head_sub->next = NULL; head_sub = readSub(); Subject* a = head_sub->next; //显示可选课程 readShowSub(); int c; cout << "\n 请输入要选择的课程(序号):"; cin >> c; //根据输入的序号定位课程 int i = 1; int flag = 0; while (a) { if (c == i) { flag = 1; break; } if (a->maxNum - a->okNum > 0) i++; a = a->next; } if (flag == 1) { /** 判断是否已选此课,并更新信息 **/ Student* head_st = new Student; head_st->next = NULL; head_st = readStSub(); Student* p; p = new Student; p->head_stSub = new Subject; p->next = NULL; Subject* s; Subject* t; //判断该学生本学期是否已选本课程 int flag1 = 0, flag2 = 1; p = head_st->next; while (p) { if (p->stNo == st.ip.id) { flag1 = 1; s = p->head_stSub->next; t = p->head_stSub; while (s) { if (s->subID == a->subID) { flag2 = 0; break; } t = s; s = s->next; } break; }//if p = p->next; }//while //更新学生-课程文件 if (flag1 == 1 && flag2 == 1) { //将新选课程加入链表 s = new Subject; s->subID = a->subID; s->next = NULL; t= s; writeStSub(head_st); //修改课程信息 a->okNum++; ma.writeSub(head_sub); //更新课程_学生信息 Student* head_st2 = new Student; Student* e = new Student, * r; r = head_st2; r->next = NULL; //读取学生基本信息 ifstream in2("Student.txt"); if (!in2) { cout << "Can't open \"Student.txt\"!"; exit(0); } while (in2 >> e->stNo >> e->name >> e->college >> e->major >> e->clas) { e->next = NULL; r->next = e; r = e; e = new Student; } in2.close(); //将学生信息加入到课程-学生文件 r = head_st2->next; while (r) { if (r->stNo == st.ip.id) break; r = r->next; } string ssss = a->subID + ".txt"; ofstream ou(ssss, ios::app); if (!ou) { cout << "Can't open \"" << ssss << "\"!"; exit(0); } ou << r->stNo << " " << r->name << " " << r->college << " " << r->major << " " << r->clas << endl; ou.close(); cout << "选课成功!"; cout << " *按Enter键返回!*" << endl; }//if else { cout << " 你本学期已选本课程!" << endl; } }//if else { cout << " 输入错误!" << endl; } }//if (x >= y) else cout << "现在不是选课时间!"; }//Student::selecSub()
2个月前
全网
文档
学术
百科
知识库
回答简洁模式
深入研究一些
这段代码是一个C++类成员函数的实现,属于Student
类,函数名为selecSub
,用于实现学生选课的功能。下面是对这段代码的分析和解释:
-
函数开始:首先定义了一个
Time
类型的局部变量nowTime
来存储当前时间,并使用time
函数获取当前时间,然后转换为tm
结构体,从中提取年、月、日信息赋值给nowTime
。 -
判断是否是选课时间:通过调用
readTime1
函数读取选课开始和结束时间,然后使用diffDay
函数计算当前时间与选课开始和结束时间的差值。如果当前时间在选课时间范围内,则允许选课。 -
读取课程信息:如果当前时间允许选课,首先创建一个指向
Subject
的指针head_sub
,然后调用readSub
函数读取课程信息,并显示可选课程。 -
用户输入选课序号:提示用户输入要选择的课程序号。
-
定位课程:使用一个循环遍历课程链表,根据用户输入的序号定位到相应的课程,并检查该课程是否还有剩余名额。
-
检查是否已选该课程:如果用户选择了一个课程,接下来会检查该学生是否已经选了这门课。这通过遍历学生选课信息链表来实现。
-
更新选课信息:如果学生没有选这门课,并且课程还有名额,代码将执行以下操作:
- 将新选课程加入到学生选课信息链表中。
- 更新课程的已选人数。
- 将学生信息写入到以课程ID命名的文件中。
-
错误处理:如果用户输入的序号不正确,或者已经选了这门课,或者当前时间不是选课时间,代码会输出相应的错误信息。
-
文件操作:代码中使用了文件操作来读取和写入学生和课程信息。例如,使用
ifstream
从文件中读取学生信息,使用ofstream
以追加模式写入选课信息。 -
退出和返回:在某些情况下,如果无法打开文件,程序将输出错误信息并退出。在选课成功后,程序会提示用户按Enter键返回。
这段代码是一个典型的C++面向对象程序设计的例子,涉及到类、对象、时间处理、链表操作、文件I/O等概念。
你觉得结果怎么样?