C语言学生信息管理系统实现

设计过程见C语言学生基本信息管理系统设计过程

头文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <stdbool.h>
#include <math.h>

定义常量

#define ADUSER_NAME "admin"
#define ADPASSWORD "123456"
#define STPASSWORD "123456"
#define Max 50
#define MAX_USERNAME 50
#define MAX_PASSWORD 50
#define strsize 50
#define FLT_MAX 300
const int num_provinces = 34;
//56个民族
const char *ethnicGroups[] = 
{
    "汉族", "蒙古族", "回族", "藏族", "维吾尔族", "苗族", "彝族", "壮族",
    "布依族", "朝鲜族", "满族", "侗族", "瑶族", "白族", "土家族", "哈尼族",
    "哈萨克族", "傣族", "黎族", "僳僳族", "佤族", "畲族", "高山族", "拉祜族",
    "水族", "东乡族", "纳西族", "景颇族", "柯尔克孜族", "土族", "达斡尔族", "仫佬族",
    "羌族", "布朗族", "撒拉族", "毛南族", "仡佬族", "锡伯族", "阿昌族", "普米族",
    "塔吉克族", "怒族", "乌孜别克族", "俄罗斯族", "鄂温克族", "德昂族", "保安族", "裕固族",
    "京族", "塔塔尔族", "独龙族", "鄂伦春族", "赫哲族", "门巴族", "珞巴族", "基诺族"
};
//34个省、自治区、直辖市
const char *provinces[] = 
{
    "北京", "天津", "河北", "山西", "内蒙古",
    "辽宁", "吉林", "黑龙江",
    "上海", "江苏", "浙江", "安徽", "福建", "江西",
    "山东", "河南", "湖北", "湖南", "广东", "广西",
    "海南", "重庆", "四川", "贵州", "云南",
    "西藏", "陕西", "甘肃", "青海", "宁夏",
    "新疆", "台湾", "香港", "澳门"
};

数据结构设计

typedef struct entrancescore
{
    float chinese;
    float math;
    float english;
    float comprehensive;
    float Sumup;
}ES;

typedef struct Student 
{
	char Name[50];
	char Number[50];
    int  Grade ;//21到24
    int  Major ;//1到4
	int  Class ;//1到4
	int  Gender;
    float FamilyIncome;  // 家庭收入
    ES EntranceScore;  // 高考入学成绩
    char hometown[strsize]; //生源地
    char monity[strsize]; //民族
    struct Student  *next;
}STU;
typedef struct Class
{
    int grade;
    int major;
    int class;
	STU students[Max];
	//各个课程的最高、最低、平均
	ES maxs;
	ES mins;
	ES averages;
	float averageincome;//班级平均家庭收入
	int loethana;//低于班级平均家庭收入的学生人数
}Class;

函数设计

基础功能函数功能设计

/// 文件功能
int write_students_to_file(const char* filename, STU* head);
STU* read_students_from_file(const char* filename);
///基本输入
void inputinf(STU** head);
void add_student_to_list(STU** head, STU* new_student);
int input_scores(ES *score) ;
int extract_info_from_student_id(const char *student_id, STU *student);
//
bool isEthnicGroup(const char *ethnicGroup);
void inputmonity(char *monity);
bool isProvinceCorrect(const char *origin);
void inputhometown(char *hometown);

//输出
void printstudentinfo(STU *student);
void printallstudentsinfo(STU *head);
//查询
STU* findStudentByName(STU* head, const char* name);
STU* findStudentByNumber(STU* head, const char* number);
STU* findStudentByGrade(STU* head, int grade);
STU* findStudentByMajor(STU* head, int grade, int major);
STU* findStudentByClass(STU* head, int grade, int major, int class_number);
void systemofsearching(STU* head);
//学号查询修改信息,删除信息
void modifyStudentInfo(STU* head, const char* number);
void deleteStudentByNumber(STU** head, const char* number) ;
//统计
int stacticmenu();
void printClassStatistics(Class* class_stats);
void calculateClassStatistics(STU* studentsInClass, Class* class_stats);
void countStudentsByMajor(STU* head);
void countStudentsByProvince(STU* head, int provinceCounts[]);
void countStudentsByEthnic(STU* head, int enthicCounts[]);
int systemofstatistics(STU* head);

拓展功能程序设计

// 登录界面
int adminmenu();
int stumenu();
int Login();
int adminLogin();
int studentLogin();
void clearInputBuffer();
void delayTextPrint(const char* text, int delay);
void clearScreen();
void Head();
void STHead();

实现

输入

void inputinf(STU** head) 
{
    char number[strsize];
    char name[strsize];
    int gender;
    float family_income;
    ES entrance_score;
    char hometown[strsize];
    char monity[strsize];
    STU* new_student = (STU*)malloc(sizeof(STU)); // 分配新学生内存

    if (new_student == NULL) 
    {
        printf("内存分配失败。\n");
        return;
    }
    printf("学号: ");
    while(1)
    {
        scanf("%49s", number);
        int islegal = extract_info_from_student_id(number, new_student); // 从学号中提取年级、专业、班级
        if(islegal)
        {
            break;
        }
    }
    printf("年级:%d\n专业编号:%d\n班级:%d\n",new_student->Grade,new_student->Major,new_student->Class);
    printf("姓名: ");
    scanf("%49s", name);
    while(1)
    {
        printf("性别: ");
        scanf("%d", &gender);
        if(gender ==0||gender == 1)
        {
            break;
        }
        printf("输入无效\n");
    }
    while(1)
    {
        printf("家庭平均收入: ");
        scanf("%f", &family_income);
        if(family_income>0)
        {
            break;
        }
        printf("输入无效\n");
    }
    while(1)
    {
        int islegal1 = input_scores(&entrance_score);
        if(islegal1)
        {
            break;
        }
        else
        {
            printf("成绩输入有误,请重新输入\n");
        }
    }
     // 输入并验证生源地
    while (1) 
    {
        inputhometown(hometown);
        if (isProvinceCorrect(hometown)) 
        {
            break; // 如果生源地正确,跳出循环
        }
        printf("生源地输入错误,请重新输入。\n");
    }

    // 输入并验证民族
    while (1) 
    {
        inputmonity(monity);
        if (isEthnicGroup(monity)) 
        {
            break; // 如果民族正确,跳出循环
        }
        printf("民族输入错误,请重新输入。\n");
    }
    // 将获取的信息填充到新学生结构体中
    strcpy(new_student->Number, number);
    strcpy(new_student->Name, name);
    new_student->Gender = gender;
    new_student->FamilyIncome = family_income;
    new_student->EntranceScore = entrance_score;
    strcpy(new_student->hometown, hometown);
    strcpy(new_student->monity, monity);
    add_student_to_list(head, new_student);
}

void add_student_to_list(STU** head, STU* new_student) 
{
    if (*head == NULL) 
    { // 如果链表为空,则新学生成为头节点
        *head = new_student;
    } 
    else 
    {
        STU* current = *head;
        while (current->next != NULL) 
        { // 遍历到链表末尾
            current = current->next;
        }
        current->next = new_student; // 将新学生添加到链表末尾
    }
    new_student->next = NULL; // 确保新学生的下一个节点为 NULL
}
// 检查输入的民族是否在56个民族之中
bool isEthnicGroup(const char *ethnicGroup) 
{
    for (int i = 0; i < 56; ++i) {
        if (strcmp(ethnicGroup, ethnicGroups[i]) == 0) 
        {
            return true;
        }
    }
    return false;
}
//
void inputhometown(char *hometown) 
{
    printf("请输入生源地(省份): ");
    scanf("%s",hometown);
    while (getchar() != '\n');
}

//
void inputmonity(char *monity) 
{
    printf("请输入学生民族:");
    scanf("%49s", monity);
    while (getchar() != '\n');
}


//检查输入的生源地是否为正确的省份
bool isProvinceCorrect(const char *origin) 
{
    for (int i = 0; i < num_provinces; i++) 
    {
        if (strcmp(provinces[i], origin) == 0) 
        {
            return true; 
        }
    }
    return false; 
}

///


int extract_info_from_student_id(const char *student_id, STU *student) //从学号中提取年级专业班级
{
    if (strlen(student_id) != 8 || student_id[0] != '2' || student_id[1] != '0') 
    {
        printf("输入的学号格式不正确。\n");//学号标准八位
        return 0;
    }
    // 提取年级
    int year = (student_id[2] - '0') * 10 + (student_id[3] - '0');
    if (year < 20 || year > 25) 
    {
        printf("年份错误\n");//标准为20到25
        return 0;
    }
    // 提取专业
    int major = student_id[4] - '0';
    if (major < 1 || major > 4) //标准为1到4
    {
        printf("专业代码错误。\n");
        return 0;
    }
    // 提取班级
    int class_number = student_id[5] - '0';
    if (class_number < 1 || class_number > 4) //标准为1到4
    {
        printf("班级序号错误\n");
        return 0;
    }
    student->Grade = year;
    student->Major = major;
    student->Class = class_number;
    return 1;
}


int input_scores(ES *score) 
{
    printf("请输入语文成绩:");
    scanf("%f", &score->chinese);
    if(score->chinese>150 ||score->chinese<0)
    {
        return 0;
    }
    printf("请输入数学成绩:");
    scanf("%f", &score->math);
    if(score->math>150 ||score->math<0)
    {
        return 0;
    }
    printf("请输入英语成绩:");
    scanf("%f", &score->english);
    if(score->english>150 ||score->english<0)
    {
        return 0;
    }
    printf("请输入综合成绩:");
    scanf("%f", &score->comprehensive);
    if(score->comprehensive>300 ||score->comprehensive<0)
    {
        return 0;
    }
    // 计算总分
    score->Sumup = score->chinese + score->math + score->english + score->comprehensive;
    return 1;
}

存储和读取文件

// 读取学生数据到链表
STU* read_students_from_file(const char* filename) 
{
    FILE* file = fopen(filename, "r");
    if (file == NULL) {
        perror("打开文件失败\n");
        return NULL;
    }
    STU* head = NULL;
    STU* current = NULL;
    STU* previous = NULL;
    char buffer[1024]; // 假设每行数据不超过1024个字符
    while (fgets(buffer, sizeof(buffer), file)) 
    {
        current = (STU*)malloc(sizeof(STU));
        if (current == NULL) {
            perror("内存分配失败\n");
            fclose(file);
            return NULL;
        }
        // 初始化 next 指针
        current->next = NULL;
        // 使用 sscanf 读取一行数据
        sscanf(buffer, "%[^,],%[^,],%d,%d,%d,%d,%f,%f,%f,%f,%f,%f,%[^,],%[^\n]",
               current->Number, current->Name, &current->Grade, &current->Major,
               &current->Class, &current->Gender, &current->FamilyIncome,
               &current->EntranceScore.chinese, &current->EntranceScore.math,
               &current->EntranceScore.english, &current->EntranceScore.comprehensive,
               &current->EntranceScore.Sumup, current->hometown, current->monity);
        // 添加到链表
        if (previous == NULL) 
        {
            head = current;
        } 
        else 
        {
            previous->next = current;
        }
        previous = current;
    }
    fclose(file);
    printf("读取成功\n");
    printallstudentsinfo(head);
    return head;
}


// 将学生数据写入文件
int write_students_to_file(const char* filename, STU* head) {
    FILE* file = fopen(filename, "w");
    if (file == NULL) {
        perror("Error opening file for writing");
        return -1;
    }

    STU* current = head;
    while (current != NULL) 
    {
        // 使用 fprintf 写入一行数据
        fprintf(file, "%s,%s,%d,%d,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%s,%s \n",
                current->Number, current->Name, current->Grade, current->Major,
                current->Class, current->Gender, current->FamilyIncome,
                current->EntranceScore.chinese, current->EntranceScore.math,
                current->EntranceScore.english, current->EntranceScore.comprehensive,
                current->EntranceScore.Sumup, current->hometown, current->monity);

        current = current->next;
    }

    fclose(file);
    return 0; 
}

输出


void printgender(int n) {
    const char* gender = n == 1 ? "男" : "女";
    printf("性别:\t\t%s", gender);
}

void printstudentinfo(STU *student) {
    if (student == NULL) {
        printf("学生信息为空。\n");
        return;
    }
    printf("-------------------------------------------------------------\n");
    printf("学号:\t\t%s\n", student->Number);
    printf("姓名:\t\t%s\n", student->Name);
    //printf("性别:\t\t");
    printgender(student->Gender);
    printf("\n年级:\t\t%d", student->Grade);
    printf("\t专业:\t%d", student->Major);
    printf("\t班级:\t%d\n", student->Class);
    printf("家庭收入:\t%.2f\n", student->FamilyIncome);
    printf("高考成绩:\n");
    printf("\t语文:\t%.2f\n", student->EntranceScore.chinese);
    printf("\t数学:\t%.2f\n", student->EntranceScore.math);
    printf("\t英语:\t%.2f\n", student->EntranceScore.english);
    printf("\t综合:\t%.2f\n", student->EntranceScore.comprehensive);
    printf("\t总分:\t%.2f\n", student->EntranceScore.Sumup);
    printf("生源地:\t\t%s\n", student->hometown);
    printf("民族:\t\t%s\n", student->monity);
    printf("-------------------------------------------------------------\n");
}

void printallstudentsinfo(STU* head) {
    STU* current = head;
    while (current != NULL) {
        printstudentinfo(current);
        current = current->next;
    }
}

查询

// 按姓名查找学生的函数
STU* findStudentByName(STU* head, const char* name) {
    STU* current = head;
    STU* studentsWithName = NULL;
    STU* tail = NULL;

    while (current != NULL) {
        if (strcmp(current->Name, name) == 0) {
            STU* new_student = (STU*)malloc(sizeof(STU));
            if (new_student == NULL) {
                perror("内存分配失败");
                exit(EXIT_FAILURE);
            }
            *new_student = *current; // 复制结构体内容
            new_student->next = NULL; // 确保新节点的 next 指针为 NULL

            if (studentsWithName == NULL) {
                studentsWithName = new_student;
                tail = new_student;
            } else {
                tail->next = new_student; // 将新节点链接到链表末尾
                tail = new_student;
            }
        }
        current = current->next; // 继续遍历原链表
    }
    return studentsWithName; // 返回新创建的链表
}

// 查询学生信息按学号
STU* findStudentByNumber(STU* head, const char* number) {
    STU* current = head;
    STU* studentsWithNumber = NULL;
    STU* tail = NULL;

    while (current != NULL) {
        if (strcmp(current->Number, number) == 0) {
            STU* new_student = (STU*)malloc(sizeof(STU));
            if (new_student == NULL) {
                perror("内存分配失败");
                exit(EXIT_FAILURE);
            }
            *new_student = *current; // 复制结构体内容
            new_student->next = NULL; // 确保新节点的 next 指针为 NULL

            if (studentsWithNumber == NULL) {
                studentsWithNumber = new_student;
                tail = new_student;
            } else {
                tail->next = new_student; // 将新节点链接到链表末尾
                tail = new_student;
            }
        }
        current = current->next; // 继续遍历原链表
    }
    return studentsWithNumber; // 返回新创建的链表
}


// 查询学生信息按年级
STU* findStudentByGrade(STU* head, int grade) {
    STU* current = head;
    STU* studentsInGrade = NULL;
    STU* tail = NULL;

    while (current != NULL) {
        if (current->Grade == grade) {
            STU* new_student = (STU*)malloc(sizeof(STU));
            if (new_student == NULL) {
                perror("内存分配失败");
                exit(EXIT_FAILURE);
            }
            *new_student = *current;
            new_student->next = NULL;

            if (studentsInGrade == NULL) {
                studentsInGrade = new_student;
                tail = new_student;
            } else {
                tail->next = new_student;
                tail = new_student;
            }
        }
        current = current->next;
    }
    return studentsInGrade; // 可能是NULL
}

// 查询学生信息按专业
STU* findStudentByMajor(STU* head, int major) 
{
    STU* current = head;
    STU* studentsInmajor = NULL;
    STU* tail = NULL;

    while (current != NULL) 
    {
        if (current->Major == major) 
        {
            STU* new_student = (STU*)malloc(sizeof(STU));
            if (new_student == NULL) 
            {
                perror("内存分配失败");
                exit(EXIT_FAILURE);
            }
            *new_student = *current;
            new_student->next = NULL;

            if (studentsInmajor == NULL) 
            {
                studentsInmajor = new_student;
                tail = new_student;
            } 
            else 
            {
                tail->next = new_student;
                tail = new_student;
            }
        }
        current = current->next;
    }
    return studentsInmajor; // 可能是NULL
}

// 查询学生信息按班级
STU* findStudentByClass(STU* head, int class_number) 
{
    STU* current = head;
    STU* studentsInclass = NULL;
    STU* tail = NULL;

    while (current != NULL) 
    {
        if (current->Class == class_number) 
        {
            STU* new_student = (STU*)malloc(sizeof(STU));
            if (new_student == NULL) 
            {
                perror("内存分配失败");
                exit(EXIT_FAILURE);
            }
            *new_student = *current;
            new_student->next = NULL;

            if (studentsInclass == NULL) 
            {
                studentsInclass = new_student;
                tail = new_student;
            } 
            else 
            {
                tail->next = new_student;
                tail = new_student;
            }
        }
        current = current->next;
    }
    return studentsInclass; // 可能是NULL
}

void systemofsearching(STU* head)
{
    // 查询系统函数
    int choice;
    char number[strsize];
    int grade, major, class_number;
    STU* result = NULL;

    printf("请选择查询方式:\n");
    printf("1. 按学号查询\n");
    printf("2. 按年级查询\n");
    printf("3. 按专业查询\n");
    printf("4. 按班级查询\n");
    printf("5. 按姓名查询\n");
    printf("请输入选项(1-4):");
    scanf("%d", &choice);

    switch (choice) {
        case 1:
        {
            printf("请输入学号:");
            scanf("%s", number);
            result = findStudentByNumber(head, number);
            break;
        }
        case 2:
        {
            printf("请输入年级:");
            scanf("%d", &grade);
            result = findStudentByGrade(head, grade);
            break;
        }
        case 3:
        {
            printf("请输入专业编号:");
            scanf("%d", &major);
            result = findStudentByMajor(head, major);
            break;
        }
        case 4:
        {
            printf("请输入班级编号:");
            scanf("%d", &class_number);
            result = findStudentByClass(head, class_number);
            break;
        }
        case 5:
        {
            char nameToFind[strsize];
            printf("请输入要查询的学生姓名:");
            scanf("%49s", nameToFind); // 限制输入长度,防止溢出
            result = findStudentByName(head, nameToFind);
            break;
        }
        default:
        {
            printf("无效的选项。\n");
            return;
        }
    }

    // 打印查询结果
    if (result == NULL) {
        printf("没有找到匹配的学生信息。\n");
    } else {
        printf("查询结果:\n");

        printallstudentsinfo(result);

        STU* temp;
        while (result != NULL) {
            temp = result;
            result = result->next;
            free(temp);
        }
    }
    system("pause");
}

修改和删除

///

void modifyStudentInfo(STU* head, const char number[strsize]) {
    STU* student = NULL;
    STU* current = head;
    while (current != NULL) 
    {
        if (strcmp(current->Number, number) == 0) 
        {
            student =  current;
            break; // 
        }
        current = current->next;
    }
    if (student == NULL) {
        printf("未找到学生信息。\n");
        system("pause");
        return;
    }
    char name[strsize] ;
    int gender;
    float family_income;
    ES entrance_score;
    char hometown[strsize];
    char monity[strsize];
    int option;
    do {
        printf("请选择要修改的信息:\n");
        printf("1. 姓名\n");
        printf("2. 性别\n");
        printf("3. 家庭收入\n");
        printf("4. 入学成绩\n");
        printf("5. 生源地\n");
        printf("6. 民族\n");
        printf("0. 退出修改\n");
        printf("请输入选项:");
        scanf("%d", &option);
        while (getchar() != '\n'); 

        switch (option) {
            case 1:
                printf("请输入学生姓名:");
                scanf("%49s", name); 
                strcpy(student->Name, name);
                break;
            case 2:
                while(1)
                {
                    printf("性别: (男 1;女 0)");
                    scanf("%d", &gender);
                    if(gender ==0||gender == 1)
                    {
                        student->Gender = gender;
                        break;
                    }
                    printf("输入无效\n");
                }
                break;
            case 3:
                while(1)
                {
                    printf("家庭平均收入: ");
                    scanf("%f", &family_income);
                    if(family_income>0)
                    {
                        student->FamilyIncome = family_income;
                        break;
                    }
                    printf("输入无效\n");
                }
                break;
            case 4:
                while(1)
                {
                    int islegal1 = input_scores(&entrance_score);
                    if(islegal1)
                    {
                        student->EntranceScore = entrance_score;
                        break;
                    }
                    else
                    {
                        printf("成绩输入有误,请重新输入\n");
                    }
                }
                break;
            case 5:
                while (1) 
                {
                    inputhometown(hometown);
                    if (isProvinceCorrect(hometown)) 
                    {
                        strcpy(student->hometown, hometown);
                        break; // 
                    }
                    printf("生源地输入错误,请重新输入。\n");
                }
                break;
            case 6:
                while (1) 
                {
                    inputmonity(monity);
                    if (isEthnicGroup(monity)) 
                    {
                        strcpy(student->hometown, hometown);
                        break; //
                    }
                    printf("民族输入错误,请重新输入。\n");
                }
                break;
            case 0:
                printf("退出修改。\n");
                break;
            default:
                printf("无效选项,请重新输入。\n");
                break;
        }
    } while (option != 0);
    
    printf("学生信息已更新。\n");
}

// 
void deleteStudentByNumber(STU** head, const char* number) {
    STU* current = *head;
    STU* previous = NULL;

    //
    while (current != NULL) {
        if (strcmp(current->Number, number) == 0) {
            break; 
        }
        previous = current;
        current = current->next;
    }

    if (current == NULL) {
        printf("未找到学号为 %s 的学生。\n", number);
        return;
    }

    // 如果要删除的是头节点
    if (previous == NULL) {
        *head = current->next;
    } else {
        // 如果要删除的是中间或尾部的节点
        previous->next = current->next;
    }

    free(current);
    printf("学号为 %s 的学生信息已删除。\n", number);
}

统计

int stacticmenu()
{
        char c;
        system("cls");
        printf("\n\n\n\n\n\n\n\n");
        printf("\t\t\t\t   ╭═════════════════════════════════○●○●═══╮\n");
        printf("\t\t\t\t   │            学生基本信息统计系统        │\n");
        printf("\t\t\t\t   ╰═══○●○●═════════════════════════════════╯\n");
        printf("\t\t\t\t   ┌───────────────────────────────────────────-┐\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 1. 统计班级信息            2. 统计年级人数 │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 3. 统计班级生源            4. 统计少数民族 │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 0. 退出程序                                │\n");
        printf("\t\t\t\t   └────────────────────────────────────────────┘\n");
        printf("\t\t\t\t\t\t  请您选择(0-4):");
        c=getche();

	while(c < '0' || c > '4')
	{
		system("cls");
        printf("\n\n\n\n\n\n\n\n");
        printf("\t\t\t\t   ╭═════════════════════════════════○●○●═══╮\n");
        printf("\t\t\t\t   │            学生基本信息统计系统        │\n");
        printf("\t\t\t\t   ╰═══○●○●═════════════════════════════════╯\n");
        printf("\t\t\t\t   ┌───────────────────────────────────────────-┐\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 1. 统计班级信息            2. 统计年级人数 │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 3. 统计班级生源            4. 统计少数民族 │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 0. 退出程序                                │\n");
        printf("\t\t\t\t   └────────────────────────────────────────────┘\n");
        printf("\t\t\t\t\t  请您重新选择选择(0-4):");
			c = getche();
			system("CLS");
	}
	return c-'0';
}
void calculateClassStatistics(STU* studentsInClass, Class* class_stats) 
{
    int student_count = 0;
    float total_income = 0.0;
    class_stats->maxs = (ES){.chinese = -1, .math = -1, .english = -1, .comprehensive = -1, .Sumup = -1};
    class_stats->mins = (ES){.chinese = FLT_MAX, .math = FLT_MAX, .english = FLT_MAX, .comprehensive = FLT_MAX, .Sumup = FLT_MAX};
    class_stats->averages = (ES){.chinese = 0, .math = 0, .english = 0, .comprehensive = 0, .Sumup = 0};

    STU* current = studentsInClass;
    while (current != NULL) {
        // 更新最高分和最低分
        class_stats->maxs.chinese = fmax(class_stats->maxs.chinese, current->EntranceScore.chinese);
        class_stats->maxs.math = fmax(class_stats->maxs.math, current->EntranceScore.math);
        class_stats->maxs.english = fmax(class_stats->maxs.english, current->EntranceScore.english);
        class_stats->maxs.comprehensive = fmax(class_stats->maxs.comprehensive, current->EntranceScore.comprehensive);
        class_stats->maxs.Sumup = fmax(class_stats->maxs.Sumup, current->EntranceScore.Sumup);

        class_stats->mins.chinese = fmin(class_stats->mins.chinese, current->EntranceScore.chinese);
        class_stats->mins.math = fmin(class_stats->mins.math, current->EntranceScore.math);
        class_stats->mins.english = fmin(class_stats->mins.english, current->EntranceScore.english);
        class_stats->mins.comprehensive = fmin(class_stats->mins.comprehensive, current->EntranceScore.comprehensive);
        class_stats->mins.Sumup = fmin(class_stats->mins.Sumup, current->EntranceScore.Sumup);

        // 累加总分
        class_stats->averages.chinese += current->EntranceScore.chinese;
        class_stats->averages.math += current->EntranceScore.math;
        class_stats->averages.english += current->EntranceScore.english;
        class_stats->averages.comprehensive += current->EntranceScore.comprehensive;
        class_stats->averages.Sumup += current->EntranceScore.Sumup;

        // 累加家庭收入
        total_income += current->FamilyIncome;
        student_count++;

        current = current->next;
    }

    // 计算平均分
    if (student_count > 0) {
        class_stats->averages.chinese /= student_count;
        class_stats->averages.math /= student_count;
        class_stats->averages.english /= student_count;
        class_stats->averages.comprehensive /= student_count;
        class_stats->averages.Sumup /= student_count;

        // 计算平均家庭收入
        class_stats->averageincome = total_income / student_count;

        // 重置指针,重新遍历链表以计算低于平均家庭收入的人数
        current = studentsInClass;
        class_stats->loethana = 0;
        while (current != NULL) 
        {
            if (current->FamilyIncome < class_stats->averageincome) 
            {
                class_stats->loethana++;
            }
        current = current->next;
        }
    }
}

int systemofstatistics(STU* head)
{
    int grade;
    int major;
    int class_number;
    int provinceCounts[34];
    int ethnicGroupsCount[56];
    system("cls");
    int choice;
    choice = stacticmenu();
    system("cls");
    switch (choice) 
    {
        case 1: 
        {
            printf("\n请输入年级:");
            scanf("%d", &grade);
            printf("请输入专业编号:");
            scanf("%d", &major);
            printf("请输入班级编号:");
            scanf("%d", &class_number);
            STU* studentsInClass = findStudentByClass(head, grade, major, class_number);
            if (studentsInClass == NULL) {
               printf("没有找到指定的班级信息。\n");
               return 1;
            }

            // 创建班级统计信息结构体
            Class class_stats = {grade, major,class_number};
            calculateClassStatistics(studentsInClass, &class_stats);
            
            // 输出班级统计信息
            printClassStatistics(&class_stats);
            break;
        }
    case 2:
    {
        countStudentsByMajor(head);
        system("pause");
        break;
    }
    case 3:
    {
        printf("\n请输入年级:");
        scanf("%d", &grade);
        printf("请输入专业编号:");
        scanf("%d", &major);
        printf("请输入班级编号:");
        scanf("%d", &class_number);
        STU* studentsInClass = findStudentByClass(head, grade, major, class_number);
        if (studentsInClass == NULL) 
        {
            printf("没有找到指定的班级信息。\n");
            return 1;
        }

        // 创建班级统计信息结构体
        Class class_stats = {grade, major,class_number};
        countStudentsByProvince(studentsInClass,provinceCounts);
        for (int i = 0; i < num_provinces; ++i) 
        {
            if (provinceCounts[i] > 0) 
            {
                    printf("%s: %d人\n", provinces[i], provinceCounts[i]);
            }
        }
        system("pause");
        break;
    }
    case 4:
    {
        int ethnicCounts[56]; // 用于统计各民族学生数量的数组

        printf("\n请输入年级:");
        scanf("%d", &grade);
        STU* studentsInGrade = findStudentByGrade(head, grade);
        if (studentsInGrade == NULL) 
        {
        printf("没有找到指定的年级信息。\n");
        return 1;
        }
        countStudentsByEthnic(studentsInGrade, ethnicCounts);
        for (int i = 0; i < 56; ++i) 
        {
            if (ethnicCounts[i] > 0) 
            {
            printf("%s: %d人\n", ethnicGroups[i], ethnicCounts[i]);
            }
        }
        system("pause");
        break;
    }
    case 0:
    {
        exit(0);
        break;
    }
    default:
        break;
    }
}

void printClassStatistics(Class* class_stats) {
    printf("班级统计信息:\n");
    printf("年级:%d,专业:%d,班级:%d\n", class_stats->grade, class_stats->major, class_stats->class);
    printf("语文最高分:%.2f,最低分:%.2f,平均分:%.2f\n", class_stats->maxs.chinese, class_stats->mins.chinese, class_stats->averages.chinese);
    printf("数学最高分:%.2f,最低分:%.2f,平均分:%.2f\n", class_stats->maxs.math, class_stats->mins.math, class_stats->averages.math);
    printf("英语最高分:%.2f,最低分:%.2f,平均分:%.2f\n", class_stats->maxs.english, class_stats->mins.english, class_stats->averages.english);
    printf("综合最高分:%.2f,最低分:%.2f,平均分:%.2f\n", class_stats->maxs.comprehensive, class_stats->mins.comprehensive, class_stats->averages.comprehensive);
    printf("总分最高分:%.2f,最低分:%.2f,平均分:%.2f\n", class_stats->maxs.Sumup, class_stats->mins.Sumup, class_stats->averages.Sumup);
    printf("班级平均家庭收入:%.2f\n", class_stats->averageincome);
    printf("低于班级平均家庭收入的学生人数:%d\n", class_stats->loethana);
    system("pause");
}

// 统计每个专业的人数
void countStudentsByMajor(STU* head) {
    int counts[4][4] = {0}; // 4个年级,4个专业,初始化为0

    // 遍历每个年级和专业
    for (int grade = 21; grade <= 24; ++grade) {
        for (int major = 1; major <= 4; ++major) {
            STU* studentsInMajor = findStudentByMajor(head, grade, major);
            int count = 0;
            STU* current = studentsInMajor;
            while (current != NULL) {
                count++;
                current = current->next;
            }
            // 释放临时链表
            while (studentsInMajor != NULL) {
                STU* temp = studentsInMajor;
                studentsInMajor = studentsInMajor->next;
                free(temp);
            }
            // 存储统计结果
            counts[grade - 21][major - 1] = count;
        }
    }

    // 打印统计结果
    printf("各专业学生人数统计:\n");
    printf("-------------------------------------------------------------\n");
    for (int grade = 21; grade <= 24; ++grade) {
        printf("年级 %d 级:\n", grade);
        for (int major = 1; major <= 4; ++major) {
            printf("专业 %d: %d人\n", major, counts[grade - 21][major - 1]);
        }
        printf("-------------------------------------------------------------\n");
    }
}

void countStudentsByProvince(STU* head, int provinceCounts[]) 
{
    // 初始化省份数组
    for (int i = 0; i < num_provinces; ++i) 
    {
        provinceCounts[i] = 0;
    }
    STU* current = head;
    while (current != NULL) {
        for (int i = 0; i < num_provinces; ++i) 
        {
            if (strcmp(current->hometown, provinces[i]) == 0) 
            {
                provinceCounts[i]++;
                break;
            }
        }
        current = current->next;
    }
}

void countStudentsByEthnic(STU* head, int ethnicCounts[]) {
    // 初始化民族数组
    for (int i = 0; i < 56; ++i) {
        ethnicCounts[i] = 0;
    }
    STU* current = head;
    while (current != NULL) {
        for (int i = 0; i < 56; ++i) {
            if (strcmp(current->monity, ethnicGroups[i]) == 0) {
                ethnicCounts[i]++;
                break;
            }
        }
        current = current->next;
    }
}

生成测试数据

**generatedata.py**

import random

# 定义民族和省份列表
ethnic_groups = [
    "汉族", "蒙古族", "回族", "藏族", "维吾尔族", "苗族", "彝族", "壮族",
    "布依族", "朝鲜族", "满族", "侗族", "瑶族", "白族", "土家族", "哈尼族",
    "哈萨克族", "傣族", "黎族", "僳僳族", "佤族", "畲族", "高山族", "拉祜族",
    "水族", "东乡族", "纳西族", "景颇族", "柯尔克孜族", "土族", "达斡尔族", "仫佬族",
    "羌族", "布朗族", "撒拉族", "毛南族", "仡佬族", "锡伯族", "阿昌族", "普米族",
    "塔吉克族", "怒族", "乌孜别克族", "俄罗斯族", "鄂温克族", "德昂族", "保安族", "裕固族",
    "京族", "塔塔尔族", "独龙族", "鄂伦春族", "赫哲族", "门巴族", "珞巴族", "基诺族"
]
provinces = [
    "北京", "天津", "河北", "山西", "内蒙古",
    "辽宁", "吉林", "黑龙江",
    "上海", "江苏", "浙江", "安徽", "福建", "江西",
    "山东", "河南", "湖北", "湖南", "广东", "广西",
    "海南", "重庆", "四川", "贵州", "云南",
    "西藏", "陕西", "甘肃", "青海", "宁夏",
    "新疆", "台湾", "香港", "澳门"
]
def generate_student_data(num_students):
    """生成指定数量的学生数据。"""
    data = []
    for _ in range(num_students):
        student_grade = random.randint(2021, 2024)
        student_major = random.randint(1, 4)
        student_class = random.randint(1, 4)
        student_number = f"{random.randint(0, 30):02d}"
        student_id = f"{student_grade}{student_major}{student_class}{student_number}"
        name = "".join(random.choices("abcdefghijklmnopqrstuvwxyz", k=8))
        gender = random.randint(1,2)
        chinese = random.randint(72, 150)
        math = random.randint(72, 150)
        english = random.randint(72, 150)
        comprehensive = random.randint(180, 300)
        sum_score = chinese + math + english + comprehensive
        income = random.randint(3000, 7000)
        hometown = random.choice(provinces)
        # 汉族和少数民族的人口比例
        han_population_ratio = 91.11  # 汉族人口比例
        ethnic_population_ratio = 8.89  # 少数民族人口比例
        # 汉族的权重设置为汉族人口比例
        han_weight = han_population_ratio
        # 简化处理,将所有少数民族的权重设为1
        other_ethnic_weights = [1] * (len(ethnic_groups) - 1)  # 减去汉族
        # 将汉族的权重和其他少数民族的权重合并
        weights = [han_weight] + other_ethnic_weights
        # 确保权重列表与民族列表长度一致
        assert len(weights) == len(ethnic_groups), "权重列表长度与民族列表长度不一致"
        selected_ethnic_group = random.choices(ethnic_groups, weights=weights, k=1)[0]
        data.append(f"{student_id},{name},{student_grade},{student_major},{student_class},{gender},{income},{chinese},{math},{english},{comprehensive},{sum_score},{hometown},{selected_ethnic_group}")
    return data
# 生成30个学生数据
test_data = generate_student_data(30)
print("\n".join(test_data))

拓展功能设计

包括管理权限账号和阅览权限账号登录,用户界面的设计
下面为尚未填充功能的主程序框架

// 登录界面
int main() 
{
    int judge = 0;
    int choice;
    system ("color F1");
    printf("欢迎使用本系统!\n");
	int i;
	printf("\n\n\n\n\n\n\n\n\t\t\t\t\t");
	char heihei[] = {"即将进入学生基本信息管理系统..."};
	for(i = 0; i < strlen(heihei); i++)
	{
		printf("%c",heihei[i]);
		Sleep(100);
	}
	system("CLS");
    judge = Login();
	system("cls");
    if(judge==1)
    {
        int choice = adminmenu();
        switch(choice)
        {
			case 0:
				system("cls");
				printf("\n\n\n\t ");
				for(int i = 0; i < 50; i++)
				{
					printf("* ");
					Sleep(50);
				}
				printf("\n\t\t\t   ");
				printf("要返回登录界面按任意键\t\t要退出程序请按Esc键\n");
				char cho;
				fflush(stdin);
				cho = getch();
				if(cho == 0x1b)
				{
					exit(0);
				}
            case 1:
            {

            }
            case 2:
            {

            }
            case 3:
            {

            }
            case 4:
            {

            }
            case 5:
            {

            }
            case 6:
            {

            }
            default:
            {

            }

        }
    }
    else if(judge = 2)
        {
            int choice = stumenu();
			switch(choice)
        	{
			case 0:
			system("cls");
			printf("\n\n\n\t ");
			for(int i = 0; i < 50; i++)
			{
				printf("* ");
				Sleep(50);
			}
			printf("\n\t\t\t   ");
			printf("要返回登录界面按任意键\t\t要退出程序请按Esc键\n");
			char cho;
			fflush(stdin);
			cho = getch();
			if(cho == 0x1b)
			{
				exit(0);
			}
            case 1:
            {

            }
            case 2:
            {

            }
            case 3:
            {

            }
            case 4:
            {

            }
            case 5:
            {

            }
            case 6:
            {

            }
            default:
            {

            }
        }
        else
        {
            perror("异常状态");
        }
    return 0;
}
/// 登录
/// 登录
///  
int adminLogin() 
{
    char username[MAX_USERNAME];
    char password[MAX_PASSWORD];
    
    printf("\n");
    char xing[]={ "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \n \n"};
    delayTextPrint(xing,20);
    while(1)
    {
    printf("\t\t\t\t\t\t 管理员登录\n");
    printf("\t\t\t\t\t\t ==========\n");
    printf("\t\t\t\t\t 请输入用户名: ");
    fgets(username, MAX_USERNAME, stdin);
    username[strcspn(username, "\n")] = 0; // 去除末尾的换行符
    printf("\t\t\t\t\t 请输入密码: ");
    fgets(password, MAX_PASSWORD, stdin);
    password[strcspn(password, "\n")] = 0; //

    // 验证管理员登录信息
    if (strcmp(username, "admin") == 0 && strcmp(password, "123456") == 0) 
    {
        system("cls");
        Head();
        printf("\n\t\t\t\t\t 登录成功!欢迎您,管理员。");
        system("pause");
        return 1;
    } else 
    {
        system("cls");
        Head();
        printf("\n\t\t\t\t\t 用户名或密码错误!");
        system("pause");
    }
    }
}
int studentLogin() 
{
    char password[MAX_PASSWORD];
    
    printf("\n\n\n");
    printf("\t\t\t\t\t\t 学生登录\n");
    printf("\t\t\t\t\t\t ========\n");
    printf("\t\t\t\t\t 请输入密码: ");
    fgets(password, MAX_PASSWORD, stdin);
    password[strcspn(password, "\n")] = 0; 

    // 
    if (strcmp(password, "123456") == 0) 
    {   
        system("cls");
        STHead();
        printf("\n\t\t\t\t\t 登录成功!");
        system("pause");
        return 1;
    } 
    else 
    {
        system("cls");
        STHead();
        printf("\n\t\t\t\t\t 密码错误!");
        system("pause");
    }
}
int Login() 
{
    loop:
    system("cls");
    printf("\n");
    printf("\t\t\t\t\t                                  \n");
    printf("\t\t\t\t\t        学生信息管理系统            \n");
    printf("\t\t\t\t\t                                   \n");
    printf("\n\n\n");
    printf("\t\t\t\t\t   ┅┅┅       LOGIN      ┅┅┅       \n");
    printf("\n\n\n");
    char xing[] = {"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "};
    for (int i = 0; i < strlen(xing); i++) {
        printf("%c", xing[i]);
        Sleep(10);
    }

    printf("\n\n\t\t\t\t\t\t请选择您的登录身份:\n\n\n\n\t\t\t\t\t\t\t1.编辑\n\n\n\n\t\t\t\t\t\t\t2.查看");
    char num;
    fflush(stdin);
    num = getch();
    while (1) {
        system("cls");
        if (num != '1' && num != '2') 
        {
            printf("\n");
            printf("\t\t\t\t\t                               \n");
            printf("\t\t\t\t\t        学生信息管理系统         \n");
            printf("\t\t\t\t\t                               \n");
            printf("\n\n\n");
            printf("\t\t\t\t\t   ┅┅┅       LOGIN      ┅┅┅    \n");
            printf("\n\n\n");
            printf("%s", xing);
            printf("\n\n\t\t\t\t\t请重新选择您的登录身份:\n\n\n\n\t\t\t\t\t\t\t1.编辑\n\n\n\n\t\t\t\t\t\t\t2.查看");
            fflush(stdin);
            num = getch();
        }
        if (num == '1') 
        {
            system("cls");
            printf("\n");
            printf("\t\t\t\t\t                                  \n");
            printf("\t\t\t\t\t      学生信息管理系统   管理端     \n");
            printf("\t\t\t\t\t                                  \n");
            printf("\n\n\n");
            printf("\t\t\t\t\t       ┅┅┅       LOGIN      ┅┅┅   \n");
            printf("\n\n\n");
            xing[0] = '*';
            for (int i = 0; i < strlen(xing); i++) 
            {
                printf("%c", xing[i]);
                Sleep(10);
            }
            printf("\n\n\n\n\n\n\t\t\t\t您将以管理员身份登录,按回车键继续,按空格键返回上一页");
            char cho;
            cho = getch();
            if (cho == 0x0d) 
            { // 回车键
                system("cls");
                Head(); 
                int isadmin = 0;
                isadmin = adminLogin();
                if (isadmin) 
                {
                    system("cls");
                    //printf("\n\n\t\t\t\t\t\t\t\t欢迎您,管理员!");
                    //ssystem("pause");
                    // 管理员菜单
                    //Menu_select();
                    return 1;
                } 
                else 
                {
                    // 登录失败处理
                    // 
                    exit(-1);
                }
            }
            else
            {
                goto loop;
            }
        } 
        else if (num == '2') 
        {
            system("cls");
            printf("\n");
            printf("\t\t\t\t\t                            \n");
            printf("\t\t\t\t\t       学生信息管理系统   学生端  \n");
            printf("\t\t\t\t\t                            \n");
            printf("\n\n\n");
            printf("\t\t\t\t\t       ┅┅┅       LOGIN      ┅┅┅       \n");
            printf("\n\n\n");
            for (int i = 0; i < strlen(xing); i++) 
            {
                printf("%c", xing[i]);
                Sleep(10);
            }
            printf("\n\n\n\n\n\n\t\t\t\t您将以阅览权限登录,按回车键继续,按空格键返回上一页");
            char cho = getch();
            if (cho == 0x0d) 
            { // 回车键
                system("cls");
                STHead(); 
                int isstu = 1;
                //isstu = studentLogin();
                if (isstu) 
                {
                    system("cls");
                    STHead();
                    printf("\n\t\t\t\t\t 登录成功!");
                    system("pause");
                    return 0;
                } 
                else 
                {
                    // 登录失败处理
                    // ...(省略)
                    exit(-1);
                }
            }
            else
            {
                goto loop;//为了方便实现,使用了goto重新回到登录界面
				
            }
        }
    }
}
// 延迟打印文本
void delayTextPrint(const char* text, int delay) 
{
    // 遍历文本并逐字符打印,每个字符后暂停指定的时间
    while (*text) {
        putchar(*text++);
        Sleep(delay); // 暂停指定毫秒数
    }
    putchar('\n'); // 打印换行符
}
// 清屏函数
void clearScreen() 
{
    // 使用 system 函数调用系统命令来清屏
    system("cls");
}
void clearInputBuffer() 
{
    int c;
    while ((c = getchar()) != '\n' && c != EOF) {} // 清除输入缓冲区
}

void Head()
{
    printf("\n");
    printf("\t\t\t\t\t                            \n");
    printf("\t\t\t\t\t   学生信息管理系统   管理端  \n");
    printf("\t\t\t\t\t                            \n");
    printf("\n\n");
}
void STHead()
{
    printf("\n");
    printf("\t\t\t\t\t                             \n");
    printf("\t\t\t\t\t   学生信息管理系统   阅览端   \n");
    printf("\t\t\t\t\t                             \n");
    printf("\n\n");
}

int adminmenu()
{
    char c;
	system("cls");
	printf("\n\n\n\n\n\n\n\n");
        printf("\t\t\t\t   ╭═════════════════════════════════○●○●═══╮\n");
        printf("\t\t\t\t   │            学生基本信息管理系统        │\n");
        printf("\t\t\t\t   ╰═══○●○●═════════════════════════════════╯\n");
        printf("\t\t\t\t   ┌───────────────────────────────────────────-┐\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 1. 添加信息               2. 显示全部记录  │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 3. 修改信息               4. 删除信息      │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 5. 信息查询系统           6. 信息统计系统  │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 0. 退出程序                                │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   └────────────────────────────────────────────┘\n");
        printf("\t\t\t\t\t\t  请您选择(0-6):");
        c=getche();
	while(c < '0' || c > '7')
	{
		system("cls");
		printf("\n\n\n\n\n\n\n\n");
        printf("\t\t\t\t   ╭═════════════════════════════════○●○●═══╮\n");
        printf("\t\t\t\t   │            学生基本信息管理系统        │\n");
        printf("\t\t\t\t   ╰═══○●○●═════════════════════════════════╯\n");
        printf("\t\t\t\t   ┌───────────────────────────────────────────-┐\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 1. 添加信息               2. 显示全部记录  │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 3. 修改信息               4. 删除信息      │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 5. 信息查询系统           6. 信息统计系统  │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 0. 退出程序                                │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   └────────────────────────────────────────────┘\n");
        printf("\t\t\t\t\t\t  请您选择(0-6):");
			c = getche();
			system("CLS");
		}
		return c-'0';
}

int stumenu()
{
        char c;
        system("cls");
        printf("\n\n\n\n\n\n\n\n");
        printf("\t\t\t\t   ╭═════════════════════════════════○●○●═══╮\n");
        printf("\t\t\t\t   │         学生信息管理系统     阅览端    │\n");
        printf("\t\t\t\t   ╰═══○●○●═════════════════════════════════╯\n");
        printf("\t\t\t\t   ┌───────────────────────────────────────────-┐\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 1. 信息查询系统            2. 信息统计系统 │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 0. 退出程序                                │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   └────────────────────────────────────────────┘\n");
        printf("\t\t\t\t\t\t  请您选择(0-2):");
        c=getche();

	while(c < '0' || c > '3')
	{
		system("cls");
        printf("\n\n\n\n\n\n\n\n");
        printf("\t\t\t\t   ╭═════════════════════════════════○●○●═══╮\n");
        printf("\t\t\t\t   │         学生信息管理系统     阅览端    │\n");
        printf("\t\t\t\t   ╰═══○●○●═════════════════════════════════╯\n");
        printf("\t\t\t\t   ┌───────────────────────────────────────────-┐\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 1. 信息查询系统            2. 信息统计系统 │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   │ 0. 退出程序                                │\n");
        printf("\t\t\t\t   │                                            │\n");
        printf("\t\t\t\t   └────────────────────────────────────────────┘\n");
        printf("\t\t\t\t\t  请您重新选择选择(0-2):");
			c = getche();
			system("CLS");
	}
	return c-'0';
}
///

主函数

int main() 
{
    
    const char* filename = "students_updated.txt"; 
    STU* head = read_students_from_file(filename);
    int judgeadmin = 0;
    int choice;
    system ("color F1");
    printf("欢迎使用本系统!\n20231213蔡明辉\n");
	int i;
    //system("cls");
	printf("\n\n\n\n\n\n\n\n\t\t\t\t\t");
	char heihei[] = {"即将进入学生基本信息管理系统..."};
	for(i = 0; i < strlen(heihei); i++)
	{
		printf("%c",heihei[i]);
		Sleep(100);
	}
	system("CLS");
    judgeadmin = Login();
	system("cls");
    if(judgeadmin)
    {
        while(1)
        {
        int choice = adminmenu();
        system("cls");
            switch(choice)
            {
			    case 0://
                {
				system("cls");
				printf("\n\n\n\t ");
				for(int i = 0; i < 50; i++)
				{
					printf("* ");
					Sleep(50);
				}
				printf("\n\t\t\t   ");
                int result = write_students_to_file("students_updated.txt", head);
                if (result == 0) 
                {
                    printf("数据存储成功.\n");
                } 
                else 
                {
                    printf("数据写入失败\n");
                }
				printf("\t要返回管理界面按任意键\t要退出程序请按Esc键\n");
				char cho;
				    fflush(stdin);
				    cho = getch();
				    if(cho == 0x1b)
				    {
					    exit(0);
				    }
                    else
                    {
                        main();//回到登录界面
                    }
                    break;
                }
                case 1://添加信息
                {
                    system("cls");
                    inputinf(&head);
                    write_students_to_file("students_updated.txt", head);
                    system("pause");
                    break;
                }
                case 2://显示全部记录
                {
                    printallstudentsinfo(head);
                    system("pause");
                    break;
                }
                case 3://修改信息
                {
                    char number3[strsize];
                    printf("请输入要修改的学生学号: ");
                    scanf("%49s", number3);
                    STU* student = findStudentByNumber(head, number3);
                    if (student != NULL) 
                    {
                        modifyStudentInfo(head,number3);
                        write_students_to_file("students_updated.txt", head);
                    } 
                    else 
                   {
                        printf("未找到学号为 %s 的学生。\n", number3);
                    }
                    break;
                }
                case 4://删除信息
                {
                    char number4[strsize];
                    printf("请输入要删除的学生学号: ");
                    scanf("%49s", number4);

                    deleteStudentByNumber(&head, number4);
                    write_students_to_file("students_updated.txt", head);
                    break;
                }
                case 5://信息查询
                {
                    systemofsearching(head);
                    break;
                }
                case 6://信息统计
                {
                    systemofstatistics(head);
                    break;
                }
                default://其它
                {
                    break;
                }
            }
        }
        int result = write_students_to_file("students_updated.txt", head);
        if (result == 0) 
        {
            printf("数据存储成功.\n");
        } 
        else 
        {
            printf("数据写入失败\n");
        }
        system("pause");
    }
    else
    {
        while(1)
        {int choice = stumenu();
        system("cls");
        switch(choice)
        {
            case 0:
            {
				system("cls");
				printf("\n\n\n\t ");
				for(int i = 0; i < 50; i++)
				{
					printf("* ");
					Sleep(50);
				}
				printf("\n\t\t\t   ");
                int result = write_students_to_file("students_updated.txt", head);
                if (result == 0) 
                {
                    printf("数据存储成功.\n");
                } 
                else 
                {
                    printf("数据写入失败\n");
                }
				printf("要返回管理界面按任意键\t\t要退出程序请按Esc键\n");
				char cho;
				fflush(stdin);
				cho = getch();
				if(cho == 0x1b)
				{
				    exit(0);
				}
                else
                {
                    main();
                }
                break;
            }
            case 1:
            {
                systemofsearching(head);
                break;
            }
            case 2:
            {
                systemofstatistics(head);
                break;
            }
        }}
    }
    int result = write_students_to_file("students_updated.txt", head);
    if (result == 0) 
    {
        printf("数据存储成功.\n");
    } 
    else 
    {
       printf("数据写入失败\n");
    }
    system("pause");
    return 0;
}

设计中遇到的问题

重复造轮子

许多功能实际上可以都用一些更小的功能拼凑实现,比如说查询、修改和删除都需要遍历,比如说基本的输入和修改都需要大致相同的信息输入。在设计程序时要预先考虑种种可能,尽量做到将不同的函数设计的更加有通用性和标准性,尽量避免接口不一致。
在写程序时也一定要避免前后相同内容变量命名不一致的情况。

严格把握输入的有效性

尽量提高系统的鲁棒性,一定要对所有的输入进行有效性检验。

关于输出

程序需求中可能输出多名符合要求的学生,此时输出需要设计新的方法。设计一个新链表储存可能得信息。

查询

在设计中年级专业班级是分开的,在设计查询时,未能注意,将所有符合专业的不同年级、所有符合班级不同专业年级的学生输出。
实际上查询时要限定年级、专业

修改信息

原设计需要重复输入所有信息,且没有提示
改善后在修改前输出原信息进行参考、提供修改菜单选择需要修改的信息

账户的切换

原设计需要退出程序后才能转换账户
修改后,选择退出程序时,需要输入‘0x1b’即Esc才能退出,否则重新调用主函数实现返回选择登录账号界面
在确认登录账号界面如果不输入‘0x0d’即Enter键也会退回到选择账号界面

统计民族

统计民族时需要和定义好的民族字符串常量进行比较
经检验发现读取的民族会在最后加一个空格,导致统计少数民族时不能和民族的字符串比对成功,排查后需要设计函数对民族字符串去结尾的空格

void trim_string(char *str) {
    if (str == NULL) {
        return;
    }
    int index = 0;
    while (str[index] != '\0') {
        index++;
    }
    // 从后向前遍历字符串,去除末尾的空格
    while (index > 0 && str[index - 1] == ' ') {
        index--;
    }
    str[index] = '\0'; // 在新的末尾处添加字符串终止符
}
···
sscanf(buffer, "%[^,],%[^,],%d,%d,%d,%d,%f,%f,%f,%f,%f,%f,%[^,],%[^\n]",
               current->Number, current->Name, &current->Grade, &current->Major,
               &current->Class, &current->Gender, &current->FamilyIncome,
               &current->EntranceScore.chinese, &current->EntranceScore.math,
               &current->EntranceScore.english, &current->EntranceScore.comprehensive,
               &current->EntranceScore.Sumup, current->hometown, current->monity);
trim_string(current->monity);
posted @   lumiere_cloud  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示