系统的主界面 系统的操作指令 结构体的创建
目录
1、学生信息的输入2、学生信息的添加3、学生信息的删除 4、学生信息的查找
5、学生信息的修改6、显示学生的信息7、学生成绩的排序 0、退出系统
结构体学生的信息和信息系统结构体(1000个空间),静态内存
cpp
//结构体:学生的信息
typedef struct Student
{
char name[20];//名字
int num; //学号
int score[3]; //成绩//语数英
}Stu;
//信息系统结构体(1000个空间),静态
typedef struct System
{
Stu data[100];//一共的空间
int ren; //人数
}Sy
系统的主界面 系统的操作指令 菜单
cpp
//菜单,系统主界面
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函数
cpp
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;
}
初始化管理系统函数
cpp
/初始化管理系统函数
void InitSy(Sy* pc)
{
pc->ren = 0;
memset(pc->data, 0, sizeof(pc->data));//单位字节,因为传的地址是整个数组的地址所以可以直接用sizeof。
}
1、学生信息的输入
cpp
//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、学生信息的添加
cpp
//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、学生信息的删除
cpp
//查找函数通过名字,要用在删除,和修改上面
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、学生信息的查找,找到并显示
cpp
//查找函数通过名字,要用在删除,和修改上面
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共用
cpp
//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、学生信息的修改
cpp
//查找函数通过名字,要用在删除,和修改上面,因为修改和删除都需要先找到这个人(判断字符串相不相等函数)
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、显示学生的信息
cpp
//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、学生成绩的排序,并打印(代码中有快排和冒泡都行)
cpp
//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);
}
}
}
综合代码
cpp
#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;
}