学生综合测评系统(C语言)

这是一个C语言编写的课程设计,实现了一个包含学生信息输入、修改、删除、查询等功能的系统。系统考虑了考试平均成绩和品德成绩对学生综合测评的影响,并能进行数据的保存和加载。代码已经包含了基本功能,但仍有改进空间,例如增加成绩等级划分和账户密码设置。

        这是学校C语言课程设计,小试牛刀大家可以借鉴,欢迎各位在这基础上整花活!(记得分享!!!!)

学校要求:

针对用户群体对该系统的需求分析,结合项目要求,精心设计并开发了一套具备多功能模块的系统。在开发完成后,我们还对系统进行了全面的测试和评估,以确保其质量和性能达到预期。以下为主要需求:

学生信息包括:学号、姓名、性别、家庭住址、联系电话、语文、数学、外语三门单科成绩、考试平均成绩、考试名次、品德成绩、综合测评总分及名次。其中,考试平均成绩与品德成绩分别占综合测评总分的80%与20%。

1.学生信息处理:

(1)输入学生基本信息,并按照学号顺序排列。

(2)插入或修改同学信息。

(3)删除同学信息:在确认删除前需要核实待删除同学信息

(4)查询特定条件下(如学号或姓名)的学生信息

2.学生数据处理:

(1)录入各科目考试成绩,并根据公式:(语文+数学+外语)/3 计算平均成绩及名次。

(2) 输入品德成绩并计算综合测评总分及名次。公式:(考试平均成绩)*0.8 + 品德成绩*0.2。

(3)学生数据管理:输入学号或姓名,显示该同学信息。

(4)学生数据导入:从文件中导入学生信息。

(5)学生数据保存:将学生信息存储至文件。

3.学生综合信息输出,并且在屏幕上显示。

大体如图:

46165d30b23e4ebcb40d55a9f456e950.png

代码还有很多不足之处,记得修改,花活方面可以在加:成绩等级划定,设置账户密码等等....

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#ifdef _WIN32
#include <windows.h>
#define SLEEP(sec) Sleep((sec) * 1000)
HANDLE hConsole;
#else
#include <unistd.h>
#define SLEEP(sec) sleep(sec)
#endif

#define MAX_STUDENT 100 // 最多学生数目
#define FILE_NAME "./students.dat" // 文件名

// 学生结构体
typedef struct {
    int id;
    char name[20];
    char sex[5];
    char address[50];
    char phone[20];
    float chinese;
    float math;
    float english;
    float average;
    float score;
    int rank;
    float morality;
    float evaluation;
    int eval_rank;
} Student;

Student students[MAX_STUDENT]; // 学生数组
int num_students = 0; // 学生数目

// 函数声明
void welcome();
void menu();
void save_students();
void load_students();
void input_student();
void modify_student();
void delete_student();
void search_student();
void input_scores();
void calculate_score(int index);
void calculate_rank();
void input_evaluation();
void calculate_evaluation(int index);
void calculate_eval_rank();
void print_students();
void print_student(Student student);

int main() {
#ifdef _WIN32
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
#endif
    welcome();
    load_students();
    menu();
    return 0;
}

// 欢迎界面
void welcome() {
    char title[] = "欢迎使用学生信息管理系统!";

#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
#endif

    int width = strlen(title) + 4;
    for (int i = 0; i < width; i++) {
        printf("*");
    }
    printf("\n* %s *\n", title);
    for (int i = 0; i < width; i++) {
        printf("*");
    }
    printf("\n");

#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif

    SLEEP(2); // 延迟2秒
    printf("正在加载ing");
    for (int i = 0; i < 8; i++) {
        printf(".");
        fflush(stdout); // 刷新输出缓冲区
        SLEEP(1);
    }
    printf("\n--------------------");
    printf("\n加载完成!\n");
    printf("--------------------\n");

    save_students();

    // 定义一个time_t类型变量用于存储当前时间
    time_t currentTime;

    // 获取当前系统时间
    time(&currentTime);

    // 将当前时间转换为本地时间格式,并赋值给localTime变量
    struct tm *localTime = localtime(&currentTime);

    // 打印当前本地时间
    printf("--------------------\n");
    printf("登录日期: %04d-%02d-%02d", localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday);
    printf(" %02d:%02d:%02d\n", localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
    printf("--------------------\n");
}

// 菜单
void menu() {
    while (1) {
        printf("\n");

#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
#endif

        printf("--------------------\n");
        printf(" ↓请选择操作 ↓\n");
        printf("--------------------\n");

#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif

        printf("1. 输入学生信息\n");
        printf("2. 修改学生信息\n");
        printf("3. 删除学生信息\n");
        printf("4. 查询学生信息\n");
        printf("5. 输入学生成绩\n");
        printf("6. 输入学生测评数据\n");
        printf("7. 查看学生信息\n");
        printf("8. 退出\n");
        printf("请选择操作(1-8):\n");

#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
#endif

        printf("--------------------\n");

#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif

        int choice;
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                input_student();
                break;
            case 2:
                modify_student();
                break;
            case 3:
                delete_student();
                break;
            case 4:
                search_student();
                break;
            case 5:
                input_scores();
                break;
            case 6:
                input_evaluation();
                break;
            case 7:
                print_students();
                break;
            case 8:
                return;
            default:
#ifdef _WIN32
                SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
                printf("输入无效,请重新输入\n");

#ifdef _WIN32
                SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
        }
    }
}

// 保存学生信息到文件中
void save_students() {
    FILE *fp = fopen(FILE_NAME, "wb");
    if (fp == NULL) {
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
        printf("保存文件失败\n");
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
        return;
    }
    fwrite(&num_students, sizeof(int), 1, fp);
    fwrite(students, sizeof(Student), num_students, fp);
    fclose(fp);
    printf("学生信息已保存到文件中\n");
}

// 从文件中加载学生信息
void load_students() {
    FILE *fp = fopen(FILE_NAME, "rb");
    if (fp == NULL) {
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
        printf("未找到学生信息文件!\n");
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
        return;
    }
    fread(&num_students, sizeof(int), 1, fp);
    fread(students, sizeof(Student), num_students, fp);
    fclose(fp);
    printf("学生信息已从文件中加载\n");

#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
    printf("--------------------\n");
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
}

// 输入学生信息
void input_student() {
    printf("请输入学号(数字):");
    int id;
    scanf("%d", &id);

    // 检查学号是否已存在
    for (int i = 0; i < num_students; i++) {
        if (students[i].id == id) {
#ifdef _WIN32
            SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
            printf("学号已存在\n");
#ifdef _WIN32
            SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
            return;
        }
    }

    // 创建新学生
    Student student;
    student.id = id;
    printf("请输入姓名:");
    scanf("%s", student.name);
    printf("请输入性别:");
    scanf("%s", student.sex);
    printf("请输入家庭住址:");
    scanf("%s", student.address);
    printf("请输入联系电话:");
    scanf("%s", student.phone);

    students[num_students] = student;
    num_students++;
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
    printf("学生信息已成功添加\n");
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
}

// 修改学生信息
void modify_student() {
    printf("请输入要修改的学号(数字):");
    int id;
    scanf("%d", &id);
    int index = -1;
    for (int i = 0; i < num_students; i++) {
        if (students[i].id == id) {
            index = i;
            break;
        }
    }
    if (index == -1) {
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
        printf("未找到该学生信息!\n");
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
        return;
    }
    printf("请输入姓名(留空表示不修改):");
    char name[20];
    scanf("%s", name);
    if (strlen(name) > 0) {
        strcpy(students[index].name, name);
    }
    printf("请输入性别(留空表示不修改):");
    char sex[5];
    scanf("%s", sex);
    if (strlen(sex) > 0) {
        strcpy(students[index].sex, sex);
    }
    printf("请输入家庭住址(留空表示不修改):");
    char address[50];
    scanf("%s", address);
    if (strlen(address) > 0) {
        strcpy(students[index].address, address);
    }
    printf("请输入联系电话(留空表示不修改):");
    char phone[20];
    scanf("%s", phone);
    if (strlen(phone) > 0) {
        strcpy(students[index].phone, phone);
    }
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
    printf("学生信息已成功修改\n");
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
}

// 删除学生信息
void delete_student() {
    printf("请输入要删除的学号(数字):");
    int id;
    scanf("%d", &id);
    int index = -1;
    for (int i = 0; i < num_students; i++) {
        if (students[i].id == id) {
            index = i;
            break;
        }
    }
    if (index == -1) {
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
        printf("未找到该学生信息!\n");
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
        return;
    }
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
    printf("确定要删除该学生信息吗?(y/n)");
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
    char confirm[5];
    scanf("%s", confirm);
    if (strcmp(confirm, "y") != 0) {
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
        printf("学生信息未被删除\n");
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
        return;
    }
    for (int i = index; i < num_students - 1; i++) {
        students[i] = students[i + 1];
    }
    num_students--;
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
    printf("学生信息已成功删除\n");
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
}

// 查询学生信息
void search_student() {
    printf("请输入查询条件:");
    char condition[20];
    scanf("%s", condition);
    int found = 0;
    for (int i = 0; i < num_students; i++) {
        if (strcmp(students[i].name, condition) == 0 ||
            strcmp(students[i].sex, condition) == 0 ||
            strcmp(students[i].address, condition) == 0 ||
            strcmp(students[i].phone, condition) == 0 ||
            students[i].id == atoi(condition)) {
            print_student(students[i]);
            found = 1;
        }
    }
    if (!found) {
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
        printf("未找到符合条件的学生信息!\n");
#ifdef _WIN32
        SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
    }
}

// 输入学生成绩
void input_scores() {
    for (int i = 0; i < num_students; i++) {
        printf("请输入学号为 %d 的学生成绩:\n", students[i].id);
        printf("语文:");
        scanf("%f", &students[i].chinese);
        printf("数学:");
        scanf("%f", &students[i].math);
        printf("外语:");
        scanf("%f", &students[i].english);
        calculate_score(i);
    }
    calculate_rank();
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
    printf("学生成绩已成功录入\n");
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
}

// 计算学生成绩和名次
void calculate_score(int index) {
    students[index].average = (students[index].chinese + students[index].math + students[index].english) / 3;
    students[index].score = students[index].average;
}

void calculate_rank() {
    for (int i = 0; i < num_students; i++) {
        students[i].rank = 1;
        for (int j = 0; j < num_students; j++) {
            if (students[j].score > students[i].score) {
                students[i].rank++;
            }
        }
    }
}

// 输入学生测评数据
void input_evaluation() {
    for (int i = 0; i < num_students; i++) {
        printf("请输入学号为 %d 的学生综合测评数据:\n", students[i].id);
        printf("品德成绩:");
        scanf("%f", &students[i].morality);
        calculate_evaluation(i);
    }
    calculate_eval_rank();
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
#endif
    printf("学生测评数据已成功录入\n");
#ifdef _WIN32
    SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
#endif
}

// 计算学生综合测评总分
void calculate_evaluation(int index) {
    students[index].evaluation = students[index].score * 0.8 + students[index].morality * 0.2;
}

// 计算学生综合测评名次
void calculate_eval_rank() {
    for (int i = 0; i < num_students; i++) {
        students[i].eval_rank = 1;
        for (int j = 0; j < num_students; j++) {
            if (students[j].evaluation > students[i].evaluation) {
                students[i].eval_rank++;
            }
        }
    }
}

// 查看学生信息
void print_students() {
    for (int i = 0; i < num_students; i++) {
        print_student(students[i]);
    }
}

// 输出单个学生信息
void print_student(Student student) {
    printf("学号:%d\n", student.id);
    printf("姓名:%s\n", student.name);
    printf("性别:%s\n", student.sex);
    printf("家庭住址:%s\n", student.address);
    printf("联系电话:%s\n", student.phone);
    printf("语文成绩:%.2f\n", student.chinese);
    printf("数学成绩:%.2f\n", student.math);
    printf("外语成绩:%.2f\n", student.english);
    printf("考试平均成绩:%.2f\n", student.average);
    printf("考试名次:%d\n", student.rank);
    printf("品德成绩:%.2f\n", student.morality);
    printf("综合测评总分:%.2f\n", student.evaluation);
    printf("综合测评名次:%d\n", student.eval_rank);

    // 定义一个time_t类型变量用于存储当前时间
    time_t currentTime;

    // 获取当前系统时间
    time(&currentTime);

    // 将当前时间转换为本地时间格式,并赋值给localTime变量
    struct tm *localTime = localtime(&currentTime);

    // 打印当前本地时间
    printf("--------------------\n");
    printf("查询日期: %04d-%02d-%02d", localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday);
    printf(" %02d:%02d:%02d\n", localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
    printf("--------------------\n");
}

这次没问题了应该....

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

+1MB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值