要求:
选课记录信息包括:记录编号、课程编号、学生学号
- 选课记录添加:输入课程编号、学生学号,作为一条选课记录,写入选课信息文件
- 选课学生信息查询:输入课程编号,查询所选课程学生信息。即从选课信息文件中读取已有的选课信息,然后根据选课信息中的学号从学生信息文件中读取学生信息,并实现屏幕显示。
- 专业课程信息浏览:输入专业名,查询所学课程。即从学生信息文件读取学生信息,然后根据输入的专业名,找到该专业的所有学生的学号;然后利用这些学号,在选课信息文件中查询其对应的所有选课课程编号(无重复);最后利用这些课程编号,在课程信息文件中,查找对应的课程信息,并显示到屏幕上。
- 选课记录的删除:根据输入的学生学号,找出其所选课程,并在其所选课程中根据记录编号,选择要删除的记录,删除记录后,写入选课记录文件。
- 每增加一条记录,记录编号自动加1。
注:第一行文件路径要改成自己的电脑上的路径
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <memory.h>
#include <string.h>
#include <string>
#include <iostream>
using namespace std;
const char *filename = "D://COURSEInfo.txt";
int COU_NUM = 0; //记录课程数量
class Course
{
public:
/* data */
int note_no; //记录编号
int cour_no; //课程编号
char cour_name[30]; //课程名称
float hour; //学时
float credit; //学分
int term; //学期
char kaohe[20]; //考核方式
Course *next;
};
void Menu()
{
cout<<"\n--------------课程信息系统--------------\n";
cout<<" 1.查看课程信息\n";
cout<<" 2.编辑课程信息\n";
cout<<" 3.删除课程信息\n";
cout<<" 4.添加课程信息\n";
cout<<" 5.读取课程信息\n";
cout<<" 6.保存课程信息\n";
cout<<" 7.按课程编号查找课程信息\n";
cout<<" 8.按课程学分查找课程信息\n";
cout<<" 9.按课程开课学期查找课程信息\n";
cout<<" 10.统计课程信息\n";
cout<<" 0.返回主菜单\n";
cout<<"-----------------------------------------------------\n";
cout<<"请选择:";
}
void AddCourseInfo(Course *head) // 添加职工信息
{
int num;
Course *p, *s;
p = head;
cout << "请输入要添加课程的个数:" << endl;
cin >> num;
for (int i = 0; i < num; ++i)
{
s = (Course *)malloc(sizeof(Course));
printf("请输入第【%d】个课程的信息:\n", i + 1);
cout << "输入课程的编号:";
cin >> s->cour_no;
cout << "请输入课程的名称:";
cin >> s->cour_name;
cout << "请输入课程的学时:";
cin >> s->hour;
s->credit = s->hour / 16;
cout << "请输入课程的开课学期:";
cin >> s->term;
cout << "请输入课程的考核方式(考试/报告):";
cin >> s->kaohe;
printf("第【%d】个学时的信息输入完成!\n", i + 1);
cout << "------------------------------------------------" << endl;
s->note_no = COU_NUM + i + 1; //记录编号
s->next = p->next;
p->next = s; //用头接法
}
COU_NUM += num;
cout << "学员信息录入完毕!" << endl;
}
void ModifyCourseInfo(Course *head)
{
Course *p = head->next;
int no;
cout << "请输入修改的课程的编号:";
cin >> no;
while (p != NULL)
{
if (p->cour_no == no)
{
int choice;
do
{
system("cls");
cout << "1、修改课程编号" << endl;
cout << "2、修改课程名称" << endl;
cout << "3、修改学时" << endl;
cout << "4、修改学期" << endl;
cout << "5、修改课程考核方式(考试/报告)" << endl;
printf("0、返回上一级菜单\n");
printf("请输入你的选择:");
cin >> choice;
switch (choice)
{
case 1:
cout << "请输入新的编号:";
cin >> p->cour_no;
break;
case 2:
cout << "请输入新的名称:";
cin >> p->cour_name;
break;
case 3:
cout << "请输入新的学时:";
cin >> p->hour;
p->credit = p->hour / 16;
break;
case 4:
cout << "请输入新的学期:";
cin >> p->term;
break;
case 5:
cout<<"请输入新的考核方式(考试/报告):";
cin >> p->kaohe;
break;
default:
if (choice != 0)
cout << "输入有误!" << endl;
break;
}
system("pause");
} while (choice != 0);
cout << "修改完毕!" << endl;
return;
}
p = p->next;
}
cout << "没有该编号的课程!" << endl;
}
void SearchInfoByNo(Course *head, int no) //通过编号查找信息
{
Course *p = head->next;
bool flag = true;
while (p != NULL)
{
if (p->cour_no == no)
{
cout << "记录编号\t课程编号\t课程名称\t学时\t学分\t开课学期\t考核方式" << endl;
cout << p->note_no << "\t" << p->cour_no << "\t" << p->cour_name << "\t" << p->hour << "\t" << p->credit << "\t" << p->term << "\t" << p->kaohe << endl;
flag = false;
}
p = p->next;
}
if (flag)
printf("不存在该课程编号,查找失败!\n");
}
void SearchInfoByCredit(Course *head, float credit) //通过学分查找信息
{
Course *p = head->next;
bool flag = true;
while (p != NULL)
{
if (p->credit == credit)
{
cout << "记录编号\t课程编号\t课程名称\t学时\t学分\t开课学期\t考核方式" << endl;
cout << p->note_no << "\t" << p->cour_no << "\t" << p->cour_name << "\t" << p->hour << "\t" << p->credit << "\t" << p->term << "\t" << p->kaohe << endl;
flag = false;
}
p = p->next;
}
if(flag)
printf("不存在该课程学分,查找失败!\n");
}
void SearchInfoByTerm(Course *head, float term) //通过开课学期查找信息
{
Course *p = head->next;
bool flag = true;
while (p != NULL)
{
if (p->term == term)
{
cout << "记录编号\t课程编号\t课程名称\t学时\t学分\t开课学期\t考核方式" << endl;
cout << p->note_no << "\t" << p->cour_no << "\t" << p->cour_name << "\t" << p->hour << "\t" << p->credit << "\t" << p->term << "\t" << p->kaohe << endl;
flag = false;
}
p = p->next;
}
if(flag)
printf("不存在该课程学期,查找失败!\n");
}
void DeleteInfoByNo(Course *head) //删除信息
{
int no;
printf("请输入要删除课程编号:");
scanf("%d", &no);
Course *p, *q;
p = head;
while (p->next != NULL)
{
if (p->next->cour_no == no)
{
q = p->next;
p->next = q->next;
free(q);
COU_NUM--;
printf("删除成功!\n");
return;
}
p = p->next;
}
printf("没有要删除课程的编号!删除失败!\n");
}
void DisplayAllInfo(Course *head) //输出全部课程信息
{
Course *p = head->next;
cout << "记录编号\t课程编号\t课程名称\t学时\t学分\t开课学期\t考核方式" << endl;
while (p)
{
cout << p->note_no << "\t" << p->cour_no << "\t" << p->cour_name << "\t" << p->hour << "\t" << p->credit << "\t" << p->term << "\t" << p->kaohe << endl;
printf("-----------------------------------------------------------------------\n");
p = p->next;
}
}
void SortByterm(Course *head) //按照学期升序排序
{
Course *p, *s, *q, *r, *t;
p = head->next;
int max;
p = head;
bool flag;
while (p->next != NULL)
{
max = p->next->cour_no;
q = p->next;
flag = false;
while (q->next)
{
if (q->next->cour_no < max)
{
max = q->cour_no;
r = q; //记录最大的位置
flag = true;
}
q = q->next;
}
if (flag)
{
s = r->next;
r->next = p->next;
t = p->next->next;
p->next->next = s->next;
s->next = t;
p->next = s;
}
p = p->next;
}
}
void total(Course *head)
{
int cou_num[10] = {0};//每学期的课程数量
float cou_credit[10] = {0.0};//每学期的总学分
Course *p = head->next;
while(p){
cou_num[p->term]++;
cou_credit[p->term] += p->credit;
p=p->next;
}
for(int i=0;i<10;++i){
if(cou_num[i]!=0){
cout<<"第"<<i+1<<"学期的课程数量为:"<<cou_num[i]<<endl;
cout<<"第"<<i+1<<"学的的总学分为:"<<cou_credit[i]<<endl;
}
}
}
void SavaData(Course *head)
{
FILE *fp;
if ((fp = fopen(filename, "w")) == NULL)
{
printf("Cannot open %s file!\n", filename);
return;
}
fprintf(fp, "%d\n", COU_NUM); //写入课程数量
Course *p = head->next;
while (p) //写入信息
{
fprintf(fp, "%-6d%-6d%-6s%-6.2f%-6.2f%-6d%-6s\n", p->note_no,p->cour_no,p->cour_name,p->hour,p->credit,p->term,p->kaohe);
p = p->next;
}
fclose(fp);
printf("信息存储完毕!\n");
}
void ReadData(Course *head)
{
FILE *fp;
Course *s;
if ((fp = fopen(filename, "r")) == NULL)
{
printf("Cannot open %s file!\n", filename);
return;
}
fscanf(fp, "%d", &COU_NUM); //读取人数
head->next = NULL;
for (int i = 0; i < COU_NUM; i++)
{
s = (Course *)malloc(sizeof(Course));
fscanf(fp, "%d%d%s%f%f%d%s", &s->note_no, &s->cour_no, s->cour_name, &s->hour, &s->credit, &s->term, s->kaohe);
s->next = head->next;
head->next = s;
}
fclose(fp);
printf("读取数据完毕!\n");
}
int main()
{
Course *head = (Course *)malloc(sizeof(Course));
head->next = NULL;
//系统开始前,读取课程的文件信息
ReadData(head);
int choice;
do
{
system("cls");
Menu();
scanf("%d", &choice);
switch (choice)
{
case 1:
DisplayAllInfo(head);
break;
case 2:
ModifyCourseInfo(head);
break;
case 3:
DeleteInfoByNo(head);
break;
case 4:
AddCourseInfo(head);
break;
case 5:
ReadData(head);
DisplayAllInfo(head);
break;
case 6:
SavaData(head);
break;
case 7:
printf("请输入要查找的课程编号:");
int no;
cin>>no;
SearchInfoByNo(head, no);
break;
case 8:
float credit;
cout<<"请输入要查找的课程学分:";
cin>>credit;
SearchInfoByCredit(head, credit);
break;
case 9:
int term;
cout<<"请输入要查找的课程学期:";
cin>>term;
SearchInfoByTerm(head, term);
break;
case 10:
total(head);
break;
default:
if (choice != 0)
cout<<"输入有误!\n";
break;
}
system("pause");
} while (choice != 0);
//系统关闭,保存数据
SavaData(head);
return 0;
}