大学生课程设计--选课系统

要求:

选课记录信息包括:记录编号、课程编号、学生学号

  1. 选课记录添加:输入课程编号、学生学号,作为一条选课记录,写入选课信息文件
  2. 选课学生信息查询:输入课程编号,查询所选课程学生信息。即从选课信息文件中读取已有的选课信息,然后根据选课信息中的学号从学生信息文件中读取学生信息,并实现屏幕显示。
  3. 专业课程信息浏览:输入专业名,查询所学课程。即从学生信息文件读取学生信息,然后根据输入的专业名,找到该专业的所有学生的学号;然后利用这些学号,在选课信息文件中查询其对应的所有选课课程编号(无重复);最后利用这些课程编号,在课程信息文件中,查找对应的课程信息,并显示到屏幕上。
  4. 选课记录的删除:根据输入的学生学号,找出其所选课程,并在其所选课程中根据记录编号,选择要删除的记录,删除记录后,写入选课记录文件。
  5. 每增加一条记录,记录编号自动加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;
}

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值