课程设计一夜C语言爆肝两万字 《建议收藏!》

Posted @了凡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了课程设计一夜C语言爆肝两万字 《建议收藏!》相关的知识,希望对你有一定的参考价值。

效果展示

前言

博主简介

博主介绍:

– 本人是了凡,意义是希望本人任何时候以善良为先,以人品为重,喜欢了凡四训中的立命之学、改过之法、积善之方、谦德之效四训,更喜欢每日在简书上投稿日更的读书感悟笔名:三月_刘超。专注于 Go Web 后端,辅学Python、Java、算法、前端等领域。未来大家一起加油啊~



引言

在这里插入图片描述


准备工作


引用头文件

#include <iostream>
#include<fstream>
#include<string>
#include<cstring>

#define MAXSIZE 100
#define OK 1
#define ERROR0 -3
#define ERROR1 0
#define ERROR2 -1
#define OVERFLOW -2

using namespace std;

结构体类型定义

typedef int status;//返回值状态
typedef int ElemType;//返回值的类型

//学生信息结构体
struct studentInformation {
    int id;   // 储存每条数据id
    char stuName[7]; // 姓名
    char stuNum[14]; // 学号
    char stuClass[8]; // 班级
    float verbal; // 语文成绩
    float math; // 数学成绩
};

//顺序表结构体
typedef struct {
    studentInformation* elem; // 顺序表首地址
    int length; // 表长
} SqlList;

函数声明

/* 初始模块 */
status initListSq(SqlList& L); // 顺序表的初始化
status importData(SqlList &L);  // 建立录入成绩函数
status save(SqlList& L); // 保存函数

/* CRUD模块 */
status insertion(SqlList &L, studentInformation stu, int n); // 添加学生信息
status deleteStudent(SqlList &L, studentInformation stu, int n); // 删除学生信息
status modifyStudents(SqlList &L, studentInformation stu, int n); // 修改学生信息
int findStuNum(SqlList L,studentInformation stu); // 按照学号查找学生信息
int findStuName(SqlList L,studentInformation stu); // 按照姓名查找学生信息

/* 补充模块 */
status showAll(SqlList L); // 显示所有学生信息

/*扩展模块*/
void ASort(SqlList L); // 语文排序
void MSort(SqlList L); // 数学排序
void idSort(SqlList L);// id排序
void filterScore(SqlList L,int type);// 筛选
void collectScore(SqlList L,int type);// 汇总
void dY(SqlList L,int type,float score);// 大于
int xY(SqlList L,int type,float score);// 小于
void nDY(SqlList L,int type,float score);// 不大于
int nXY(SqlList L,int type,float score);// 不小于
int between(SqlList L,int type,float score1,float score2);//介于
void frontTen(SqlList L,int type);//前十名
void BehindTen(SqlList L,int type);// 后十名

主函数

主菜单目录

cout << "****************************************" << endl;
cout << "*   1、录入学生成绩       2、添加学生信息      3、删除学生信息        *" << endl;
cout << "*   4、修改学生信息       5、查找学生信息      6、显示所有学生信息     *" << endl;
cout << "*   7、对学生成绩进行排序  8、单科目学生成绩筛选  9、单科目汇总成绩      *" << endl;
cout << "*   0、退出                                                   *" << endl;
cout << "****************************************" << endl;
cout << "请输入操作项【0-9】:";

1、录入学生成绩

思路:

当用户按1的时候执行switch内的case为1的内容;既然是录入成绩一定有初始化,和文件读取等内容。所以就有了函数 initListSq 顺序表初始化函数、以及 importData 文件读取函数,和为了提高用户体验感的 showAll 显示当前录入读取文件内的所有内容。

代码展示

case 1: { // 录入学生成绩
    // 创建顺序表
    if (initListSq(L)) {
        cout << "顺序表的初始化成功!" << endl;
    } else {
        cout << "顺序表的初始化失败!" << endl;
    }
    int res = importData(L);
    if (res == 1) {
        showAll(L);
        cout << "顺序表信息录入成功!" << endl;
    } else {
        cout << "顺序表信息录入失败!" << endl;
    }
    break;
}

initListSq 函数

思路

使用数组储存方式先默认申请100个空间、 MAXSIZE 在引用文件解释过。如果没有首地址达标申请失败则直接退出,否则给将整个表长定义初始为0;

代码展示

// 顺序表的初始化
status initListSq(SqlList& L) {
    L.elem = new studentInformation[MAXSIZE];	//申请100个studentInformation数组
    if (!L.elem) {
        // 内存申请失败,直接退出程序
        exit(OVERFLOW);
    }
    L.length = 0;		// 初始
    return OK;
};

importData 函数

思路

引用指针 FILE *fp; fopen打开文件函数,写入文件路径和 r 读取文件,如果等于空代表读取失败。否则 fscanf 函数进行读出储存下来,并且不断扩容表长 length

代码展示

// 建立录入成绩函数
status importData(SqlList &L) {
    FILE *fp;
    int i = L.length;
    if((fp = fopen("D:\\\\C++\\\\gradeManagementSystem\\\\stu.txt","r")) == NULL){
        printf("读取失败!");
        return ERROR1;
    }
    while(!feof(fp)){
        fscanf(fp,"%d%s%s%s%f%f",&L.elem[i].id,L.elem[i].stuName,L.elem[i].stuNum,
                L.elem[i].stuClass,&L.elem[i].verbal,&L.elem[i].math);
        i++;
        L.length++;
    }
    fclose(fp);
    return OK;

};

2、添加学生信息

思路

当用户按2的时候执行switch内的case为2的内容;既然是添加学生信息一定要问用户是按照学生学号添加还是学生姓名添加,所以提示用户输入二级菜单,用户输入1则是按照学号添加,输入2则是按照姓名添加。除了这两个数之外都可以判定为输入的数字不合法,最后重新操作。也用到了添加学生信息函数 insertion

代码展示

case 2: { // 添加学生信息
    cout << "****************************************" << endl;
    cout << "* 1、按学生学号添加    2、按学生姓名添加  *" << endl;
    cout << "****************************************" << endl;
    cout << "请输入操作项【1-2】:";
    cin >> a;
    if (a == 1){
        cout << "请输入要添加的学生学号: ";
        cin >> e.stuNum;
        insertion(L, e, a);
    }else if(a == 2){
        cout << "请输入要添加的学生姓名: ";
        cin >> e.stuName;
        insertion(L, e, a);
    }else if(a != 1 || a != 2){
        cout << "您输入的内容不合法!";
    }
    break;
}

insertion 函数

思路

当用户输入1为根据姓名添加,输入2为根据学号添加。分别根据用户输入的姓名或学号使用 findStuNamefindStuNum 查询函数来查看库内是否有相同的数据,如果有则提示用户已存在,否则提示用户输入下一步姓名或学号进行再次查看用户输入的姓名或学号是否存在,有则提示已存在,否则进行继续输入班级、语文成绩和数学成绩的添加,最终添加成功,提示用户新增成功!等内容。findStuNamefindStuNum 函数后序会详细解释。

代码展示

// 添加学生信息
status insertion(SqlList &L, studentInformation stu, int n){
    if (n == 2){
        int res1 = findStuName(L,stu);
        if(res1 == -1) {
            cout << "请输入要添加的学生学号:";
            cin >> stu.stuNum;
            int result = findStuNum(L,stu);
            if (result == -1){
                ++L.length;
                L.elem[L.length-2].id = L.elem[L.length-3].id + 1;
                strcpy(L.elem[L.length-2].stuNum, stu.stuNum);
                // strcpy用错将字符串stu.stuName 赋值给 L.elem[L.length-2].stuName 数组。
                strcpy(L.elem[L.length-2].stuName, stu.stuName);
                cout << "请输入要添加的学生班级:";
                cin >> L.elem[L.length-2].stuClass;
                cout << "请输入要添加学生的语文成绩:";
                cin >> L.elem[L.length-2].verbal;
                cout << "请输入要添加学生的数学成绩:";
                cin >> L.elem[L.length-2].math;
                cout << "新增成功!" << endl;
                findStuNum(L,stu);
            }else if(result == 1){
                cout << "您输入的学生学号已存在";
            }
        }else if(res1 == 1) {
            cout << "您输入的学生姓名已存在!" << endl;
        }
    }else if (n == 1){
        int res2 = findStuNum(L,stu);
        if(res2 == -1){
            cout << "请输入要添加的学生姓名:";
            cin >> stu.stuName;
            int result = findStuName(L,stu);
            if (result == -1){
                ++L.length;
                L.elem[L.length-2].id = L.elem[L.length-3].id + 1;
                strcpy(L.elem[L.length-2].stuNum, stu.stuNum);
                strcpy(L.elem[L.length-2].stuName, stu.stuName);
                cout << "请输入要添加的学生班级:";
                cin >> L.elem[L.length-2].stuClass;
                cout << "请输入要添加学生的语文成绩:";
                cin >> L.elem[L.length-2].verbal;
                cout << "请输入要添加学生的数学成绩:";
                cin >> L.elem[L.length-2].math;
                cout << "新增成功!" << endl;
                findStuName(L,stu);
            }else{
                cout << "您输入的学生姓名已存在!";
            }
        }else if(res2 == 1) {
            cout << "您输入的学生学号已存在!" << endl;
        }
    }
    return OK;
}

3、删除学生信息

思路

当用户按3的时候执行switch内的case为3的内容;既然是删除学生信息一定要问用户是按照学生学号删除还是学生姓名删除,所以提示用户输入二级菜单,用户输入1则是按照学号删除,输入2则是按照姓名删除。除了这两个数之外都可以判定为输入的数字不合法,最后重新操作。也用到了删除学生信息函数 deleteStudent。

代码展示

case 3: { // 删除学生信息
    cout << "****************************************" << endl;
    cout << "* 1、按学生学号删除        2、按学生姓名删除  *" << endl;
    cout << "****************************************" << endl;
    cout << "请输入操作项【1-2】:";
    cin >> a;
    if (a == 1){
        cout << "请输入要删除的学生学号: ";
        cin >> e.stuNum;
        deleteStudent(L, e, a);
    }else if(a == 2){
        cout << "请输入要删除的学生姓名: ";
        cin >> e.stuName;
        deleteStudent(L, e, a);
    }else{
        cout << "您输入的内容不合法!";
    }
    break;
}

deleteStudent 函数

思路

传入参数L结构体对象地址,并且传入用户输入的对象以及二级菜单选项。根据用户输 入的菜单选项进行判断用户输入的是姓名还是学号进行删除操作。找到要删除的地址下 标,让第二个表内容进行顶替。

代码展示

// 删除学生信息
status deleteStudent(SqlList &L, studentInformation stu, int n){
    if (n == 2){
        int res1 = findStuName(L,stu);
        if(res1 == -1) {
            cout << "您输入的学生姓名未存在!" << endl;
        }else if(res1 == 1) {
            int index = 0;
            for(int i = 0; i < L.length;i++){
                if(strcmp(L.elem[i].stuName,stu.stuName)==0){
                    index = i; // 索引下标获取成功
                }
            }
            for(int i = index+1; i < L.length;i++){
                L.elem[i-1] = L.elem[i];
            }
            L.length --;
            cout << "删除成功!" << endl;
        }
    }else if (n == 1){
        int res2 = findStuNum(L,stu);
        if(res2 == -1){
            cout << "您输入的学生学号未存在!" << endl;
        }else if(res2 == 1) {
            int index = 0;
            for(int i = 0; i < L.length;i++){
                if(strcmp(L.elem[i].stuNum,stu.stuNum)==0){
                    index = i; // 索引下标获取成功
                }
            }
            for(int i = index+1; i < L.length;i++){
                L.elem[i-1] = L.elem[i];
            }
            L.length --;
            cout << "删除成功!" 以上是关于课程设计一夜C语言爆肝两万字 《建议收藏!》的主要内容,如果未能解决你的问题,请参考以下文章

爆肝两万字,我爷爷都看的懂的《栈和队列》,建议各位观众姥爷先收藏

熬夜爆肝两万字,建议收藏scrapy学习路线及其爬虫框架详解

❤️ 爆肝3天!两万字图文 SQL 零基础入门,不怕你学不会,就怕你不收藏!❤️

❤️ 爆肝3天!两万字图文 SQL 零基础入门,不怕你学不会,就怕你不收藏!❤️

[数据结构]——线性表总结(c语言代码实现)爆肝两万字!

[数据结构]——线性表总结(c语言代码实现)爆肝两万字!