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, ¤t->Grade, ¤t->Major,
¤t->Class, ¤t->Gender, ¤t->FamilyIncome,
¤t->EntranceScore.chinese, ¤t->EntranceScore.math,
¤t->EntranceScore.english, ¤t->EntranceScore.comprehensive,
¤t->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, ¤t->Grade, ¤t->Major,
¤t->Class, ¤t->Gender, ¤t->FamilyIncome,
¤t->EntranceScore.chinese, ¤t->EntranceScore.math,
¤t->EntranceScore.english, ¤t->EntranceScore.comprehensive,
¤t->EntranceScore.Sumup, current->hometown, current->monity);
trim_string(current->monity);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术