系统的主界面 系统的操作指令 结构体的创建
目录
1、学生信息的输入
2、学生信息的添加
3、学生信息的删除
4、学生信息的查找,找到并显示
*判断查找函数3和4和5共用
5、学生信息的修改
6、显示学生的信息
7、学生成绩的排序,并打印(代码中有快排和冒泡都行)
综合代码
1、学生信息的输入2、学生信息的添加3、学生信息的删除 4、学生信息的查找
5、学生信息的修改6、显示学生的信息7、学生成绩的排序 0、退出系统
结构体学生的信息和信息系统结构体(1000个空间),静态内存
//结构体:学生的信息
typedef struct Student
{char name[20];//名字int num; //学号int score[3]; //成绩//语数英
}Stu;//信息系统结构体(1000个空间),静态
typedef struct System
{Stu data[100];//一共的空间int ren; //人数
}Sy
系统的主界面 系统的操作指令 菜单
//菜单,系统主界面
void menu()
{printf(" \n"); printf("*********学生管理系统********\n");printf("****************************\n");printf("***1:信息输入 2:信息删除***\n");printf("***3:信息查找 4:信息修改***\n");printf("***5:显示信息 6:信息排序***\n");printf("***7:添加信息 0:退出系统***\n");printf("****************************\n");
}
main函数
int main()
{//定义管理系统Sy con;//初始化InitSy(&con);//初始化管理系统int input = 0;//do{menu();//菜单,系统主界面scanf("%d", &input);//输入switch (input){case 1://1、学生信息的输入Stuxinxi(&con);break;case 2://2、学生信息的添加AddSy(&con);break;case 3://3、学生信息的删除 DelSy(&con);break;case 4://4、学生信息的查找SeekSy(&con);break;case 5://5、学生信息的修改ModifySy(&con);break;case 6://6、显示学生的信息ShowSy(&con);break;case 7://7、学生成绩的排序SortSy(&con);break;case 0:printf("退出学生信息管理系统\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);return 0;
}
初始化管理系统函数
/初始化管理系统函数
void InitSy(Sy* pc)
{pc->ren = 0;memset(pc->data, 0, sizeof(pc->data));//单位字节,因为传的地址是整个数组的地址所以可以直接用sizeof。
}
1、学生信息的输入
//1、学生信息的输入
void Stuxinxi(Sy* pc)
{int n = 0;printf("输入相输入成绩的人数->");scanf("%d", &n);for (int i = 0; i < n; i++){printf("请输入第%d名学生姓名>>", i + 1);scanf("%s", pc->data[i].name);printf("请输入第%d名学生学号>>", i + 1);scanf("%d", &pc->data[i].num);printf("请输入第%d名学生语文成绩>>", i + 1);scanf("%d", &pc->data[i].score[0]);printf("请输入第%d名学生数学成绩>>", i + 1);scanf("%d", &pc->data[i].score[1]);printf("请输入第%d名学生英语成绩>>", i + 1);scanf("%d", &pc->data[i].score[2]);printf("\n");}pc->ren = n;
}
2、学生信息的添加
//2、学生信息的添加
void AddSy(Sy*pc)
{if (pc->ren == 1000){printf("成员已满,无法录入新的信息\n");return;}printf("请输入学生姓名>>");scanf("%s", pc->data[pc->ren].name);printf("请输入学生学号>>");scanf("%d", &pc->data[pc->ren].num);printf("请输入学生语文成绩>>");scanf("%d", &pc->data[pc->ren].score[0]);printf("请输入学生数学成绩>>");scanf("%d", &pc->data[pc->ren].score[1]);printf("请输入学生英语成绩>>");scanf("%d", &pc->data[pc->ren].score[2]);printf("添加成功\n");pc->ren++;//人数加一
}
3、学生信息的删除
//查找函数通过名字,要用在删除,和修改上面
int FindByname(Sy*pc,char*name)
{for (int i = 0; i < pc->ren; i++){if (strcmp(name, pc->data[i].name) == 0)//字符比较函数{return i;//直接返回下标为了让其后面的信息更好覆盖}}//没找到return -1;
}//3、学生信息的删除(用名字删除)
void DelSy(Sy* pc)
{//要想删除信息,必须要找到那个人的信息//找char name[20];printf("输入你想删除学生信息的姓名>>");scanf("%s", name);int n = FindByname(pc, name);//要删除人的下标if (n == -1){printf("查无此人\n");return;}//不等于-1,也就是找到了//找到后直接覆盖memmove(pc->data + n, pc->data + n + 1, sizeof(int) * (pc->ren - n));//要传指针!!!!!!!data[n]不是指针//for (int j = n; j < pc->ren - 1; j++)//人-1,为了防止空间溢出//{// pc->data[j] = pc->data[j + 1];//}pc->ren--;//删除后人数减一printf("删除成功\n");
}
4、学生信息的查找,找到并显示
//查找函数通过名字,要用在删除,和修改上面
int FindByname(Sy*pc,char*name)
{for (int i = 0; i < pc->ren; i++){if (strcmp(name, pc->data[i].name) == 0)//字符比较函数{return i;//直接返回下标为了让其后面的信息更好覆盖}}//没找到return -1;
}//4、学生信息的查找,找到并显示
void SeekSy(Sy* pc)
{char name[20];printf("请输入你想查找学生的姓名>>");scanf("%s", name);int i = FindByname(pc, name);//不等于-1,就是找到了if (i == -1){printf("没找到\n");return;}//找到了,打印printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩");int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2], k);
}
简便::4学生信息的查找和3学生信息的删除(用名字删除)共用的查找函数(判断字符串相不相等函数)
//查找函数通过名字,要用在删除,和修改上面,因为查找和修改和删除都需要先找到这个人
*判断查找函数3和4和5共用
//3和4和5共用//查找函数通过名字,要用在删除,和修改上面(判断字符串相不相等函数)
int FindByname(Sy*pc,char*name)
{for (int i = 0; i < pc->ren; i++){if (strcmp(name, pc->data[i].name) == 0)//字符比较函数{return i;//直接返回下标为了让其后面的信息更好覆盖}}//没找到return -1;
}
5、学生信息的修改
//查找函数通过名字,要用在删除,和修改上面,因为修改和删除都需要先找到这个人(判断字符串相不相等函数)
int FindByname(Sy*pc,char*name)
{for (int i = 0; i < pc->ren; i++){if (strcmp(name, pc->data[i].name) == 0)//字符比较函数{return i;//直接返回下标为了让其后面的信息更好覆盖}}//没找到return -1;
}void ModifySy(Sy*pc)
{char name[20];printf("输入你想修改学生信息的名字>>");scanf("%s", name);int n = FindByname(pc, name);//n为-1,就是没是找到if (n == -1){printf("没找到\n");return;}//找到了printf("请重新输入学生姓名>>");scanf("%s", pc->data[n].name);printf("请重新输入学生学号>>");scanf("%d", &pc->data[n].num);printf("请重新输入学生语文成绩>>");scanf("%d", &pc->data[n].score[0]);printf("请重新输入学生数学成绩>>");scanf("%d", &pc->data[n].score[1]);printf("请重新输入学生英语成绩>>");scanf("%d", &pc->data[n].score[2]);printf("修改成功\n");
}
6、显示学生的信息
//6、显示学生的信息
void ShowSy(Sy* pc)
{printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名","学号","语文成绩","数学成绩","英语成绩","总成绩");for (int i = 0; i < pc->ren; i++){int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1],pc->data[i].score[2], k);}
}
7、学生成绩的排序,并打印(代码中有快排和冒泡都行)
//7、学生成绩的排序,并打印
void SortSy(Sy* pc)
{printf(" \n");printf("*********1:语文成绩排序********\n");printf("*********2:数学成绩排序********\n");printf("*********3:英语成绩排序********\n");printf("*********4:总成绩排序 ********\n");int w = 0;scanf("%d", &w);if (w == 1){qsort(pc->data, pc->ren, sizeof(pc->data[0]), paixu1);printf("语文成绩排序\n");printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩");for (int i = 0; i < pc->ren; i++){int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2], k);}}if (w == 2){qsort(pc->data, pc->ren, sizeof(pc->data[0]), paixu2);printf("数学成绩排序\n");printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩");for (int i = 0; i < pc->ren; i++){int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2], k);}}if (w == 3){qsort(pc->data, pc->ren, sizeof(pc->data[0]), paixu3);printf("英语成绩排序\n");printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩");for (int i = 0; i < pc->ren; i++){int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2], k);}}//冒泡if (w == 4){printf("总成绩成绩排序\n");printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩");for (int p = 0; p < pc->ren - 1; p++){for (int j = 0; j < pc->ren - 1 - p; j++){int t1 = pc->data[j].score[0] + pc->data[j].score[1] + pc->data[j].score[2];int t2 = pc->data[j+1].score[0] + pc->data[j+1].score[1] + pc->data[j+1].score[2];if (t1 < t2){Stu tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;}}}//打印for (int i = 0; i < pc->ren; i++){int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2], k);}}
}
综合代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>//qsort的头文件
/*
系统的主界面 系统的操作指令1、学生信息的录入2、学生信息的添加3、学生信息的删除 4、学生信息的查找5、学生信息的修改6、显示学生的信息7、学生成绩的排序学生成绩的排序
*///结构体:学生的信息
typedef struct Student
{char name[20];//名字int num; //学号int score[3]; //成绩//语数英
}Stu;//信息系统结构体(1000个空间),静态
typedef struct System
{Stu data[1000];//一共的空间int ren; //人数
}Sy;//初始化管理系统函数
void InitSy(Sy* pc)
{pc->ren = 0;memset(pc->data, 0, sizeof(pc->data));//单位字节,因为传的地址是整个数组的地址所以可以直接用sizeof。
}//菜单,系统主界面
void menu()
{printf(" \n"); printf("*************学生管理系统****************\n");printf("*****************************************\n");printf("***1:学生信息的输入 2:学生信息的添加***\n");printf("***3:学生信息的删除 4:学生信息的查找***\n");printf("***5:学生信息的修改 6:显示学生的信息***\n");printf("***7:学生成绩的排序 0:退出系统 ***\n");printf("*****************************************\n");
}//2、学生信息的添加
void AddSy(Sy*pc)
{if (pc->ren == 1000){printf("成员已满,无法录入新的信息\n");return;}printf("请输入学生姓名>>");scanf("%s", pc->data[pc->ren].name);printf("请输入学生学号>>");scanf("%d", &pc->data[pc->ren].num);printf("请输入学生语文成绩>>");scanf("%d", &pc->data[pc->ren].score[0]);printf("请输入学生数学成绩>>");scanf("%d", &pc->data[pc->ren].score[1]);printf("请输入学生英语成绩>>");scanf("%d", &pc->data[pc->ren].score[2]);printf("添加成功\n");pc->ren++;//人数+1
}//6、显示学生的信息
void ShowSy(Sy* pc)
{printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名","学号","语文成绩","数学成绩","英语成绩","总成绩");for (int i = 0; i < pc->ren; i++){int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1],pc->data[i].score[2], k);}
}//查找函数通过名字,要用在删除,和修改上面,因为修改和删除都需要先找到这个人(判断字符串相不相等函数)
//3和4和5共用
int FindByname(Sy*pc,char*name)
{for (int i = 0; i < pc->ren; i++){if (strcmp(name, pc->data[i].name) == 0)//字符比较函数{return i;//直接返回下标为了让其后面的信息更好覆盖}}//没找到return -1;
}//3、学生信息的删除(用名字删除)
void DelSy(Sy* pc)
{//要想删除信息,必须要找到那个人的信息//找char name[20];printf("输入你想删除学生信息的姓名>>");scanf("%s", name);int n = FindByname(pc, name);//要删除人的下标if (n == -1){printf("查无此人\n");return;}//不等于-1,也就是找到了//找到后直接覆盖memmove(pc->data + n, pc->data + n + 1, sizeof(int) * (pc->ren - n));//要传指针!!!!!!!data[n]不是指针//for (int j = n; j < pc->ren - 1; j++)//人-1,为了防止空间溢出//{// pc->data[j] = pc->data[j + 1];//}pc->ren--;//删除后人数减一printf("删除成功\n");
}//4、学生信息的查找,找到并显示
void SeekSy(Sy* pc)
{char name[20];printf("请输入你想查找学生的姓名>>");scanf("%s", name);int i = FindByname(pc, name);//不等于-1,就是找到了if (i == -1){printf("没找到\n");return;}//找到了,打印printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩");int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2], k);
}//5、学生信息的修改
void ModifySy(Sy*pc)
{char name[20];printf("输入你想修改学生信息的名字>>");scanf("%s", name);int n = FindByname(pc, name);//n为-1,就是没是找到if (n == -1){printf("没找到\n");return;}//找到了printf("请重新输入学生姓名>>");scanf("%s", pc->data[n].name);printf("请重新输入学生学号>>");scanf("%d", &pc->data[n].num);printf("请重新输入学生语文成绩>>");scanf("%d", &pc->data[n].score[0]);printf("请重新输入学生数学成绩>>");scanf("%d", &pc->data[n].score[1]);printf("请重新输入学生英语成绩>>");scanf("%d", &pc->data[n].score[2]);printf("修改成功\n");
}//放在快排的排序函数
//语文成绩排序
int paixu1(const void* p1, const void* p2)
{return ((Sy*)p2)->data->score[0] - ((Sy*)p1)->data->score[0];//->的优先级大于*,所以要加个括号
}
//数学成绩排序
int paixu2(const void* p1, const void* p2)
{return ((Sy*)p2)->data->score[1] - ((Sy*)p1)->data->score[1];//->的优先级大于*,所以要加个括号
}
//英语成绩排序
int paixu3(const void* p1, const void* p2)
{return ((Sy*)p2)->data->score[2] - ((Sy*)p1)->data->score[2];//->的优先级大于*,所以要加个括号
}//7、学生成绩的排序,并打印
void SortSy(Sy* pc)
{printf(" \n");printf("*********1:语文成绩排序********\n");printf("*********2:数学成绩排序********\n");printf("*********3:英语成绩排序********\n");printf("*********4:总成绩排序 ********\n");int w = 0;scanf("%d", &w);if (w == 1){qsort(pc->data, pc->ren, sizeof(pc->data[0]), paixu1);printf("语文成绩排序\n");printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩");for (int i = 0; i < pc->ren; i++){int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2], k);}}if (w == 2){qsort(pc->data, pc->ren, sizeof(pc->data[0]), paixu2);printf("数学成绩排序\n");printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩");for (int i = 0; i < pc->ren; i++){int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2], k);}}if (w == 3){qsort(pc->data, pc->ren, sizeof(pc->data[0]), paixu3);printf("英语成绩排序\n");printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩");for (int i = 0; i < pc->ren; i++){int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2], k);}}//冒泡if (w == 4){printf("总成绩成绩排序\n");printf("%-10s%-15s%-10s%-10s%-10s%-10s\n", "姓名", "学号", "语文成绩", "数学成绩", "英语成绩", "总成绩");for (int p = 0; p < pc->ren - 1; p++){for (int j = 0; j < pc->ren - 1 - p; j++){int t1 = pc->data[j].score[0] + pc->data[j].score[1] + pc->data[j].score[2];int t2 = pc->data[j+1].score[0] + pc->data[j+1].score[1] + pc->data[j+1].score[2];if (t1 < t2){Stu tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;}}}//打印for (int i = 0; i < pc->ren; i++){int k = pc->data[i].score[0] + pc->data[i].score[1] + pc->data[i].score[2];//总成绩printf("%-10s%-15d%-10d%-10d%-10d%-10d\n", pc->data[i].name, pc->data[i].num, pc->data[i].score[0], pc->data[i].score[1], pc->data[i].score[2], k);}}
}//1、学生信息的输入
void Stuxinxi(Sy* pc)
{int n = 0;printf("输入相输入成绩的人数->");scanf("%d", &n);for (int i = 0; i < n; i++){printf("请输入第%d名学生姓名>>", i + 1);scanf("%s", pc->data[i].name);printf("请输入第%d名学生学号>>", i + 1);scanf("%d", &pc->data[i].num);printf("请输入第%d名学生语文成绩>>", i + 1);scanf("%d", &pc->data[i].score[0]);printf("请输入第%d名学生数学成绩>>", i + 1);scanf("%d", &pc->data[i].score[1]);printf("请输入第%d名学生英语成绩>>", i + 1);scanf("%d", &pc->data[i].score[2]);printf("\n");}pc->ren = n;
}int main()
{//定义管理系统Sy con;//初始化InitSy(&con);//初始化管理系统int input = 0;//do{menu();//菜单,系统主界面scanf("%d", &input);//输入switch (input){case 1://1、学生信息的输入Stuxinxi(&con);break;case 2://2、学生信息的添加AddSy(&con);break;case 3://3、学生信息的删除 DelSy(&con);break;case 4://4、学生信息的查找SeekSy(&con);break;case 5://5、学生信息的修改ModifySy(&con);break;case 6://6、显示学生的信息ShowSy(&con);break;case 7://7、学生成绩的排序SortSy(&con);break;case 0:printf("退出学生信息管理系统\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);return 0;
}