包含知识:结构体,动态内存分配,链表的增删改查,文件的读写操作等等
包含的功能有:
创建班级,录入学生信息,显示学生信息,查询学生信息,添加学生信息,修改学生信息,删除学生信息,学生信息排序,保存学生信息,载入学生信息。
头文件和结构体
#include <stdio.h>
#include <conio.h> // getch()
#include <stdlib.h>
typedef struct _stu
{
int num;//学号
char name[15];//姓名
int score[3];//C语言,高数,英语成绩
double sum;//总分
double ave;//平均分
int order;//排名
}STU;
typedef struct node
{
STU data;
struct node* next;
}NODE;
主函数
int main(void)
{
Menu();
int flag;
NODE* head;//创建头指针
printf("%d", 请选择:);
scanf("%d", &flag);
printf("\n");
while(1)//并非死循环,输入的flag为0时会跳出
{
switch(flag)
{
case 1://创建班级
{
printf("请输入需要创建的班级人数:");
scanf("%d",&count);
printf("创建成功!班级人数为%d人\n请录入学生信息!!\n",count);
break;
}
case 2://录入信息
{
head=create(count);
printf("录入成功!\n");
break;
}
case 3://显示信息
{
show(head);
printf("显示成功!\n");
break;
}
case 4://查找信息
{
printf("请输入学生的学号:");
scanf("%d",&n);
search(head,n);
break;
}
case 5://信息排序
{
sort(head);
printf("排序成功!\n");
break;
}
case 6://删除学生
{
head=dele(head);break;
}
case 7://添加学生
{
add(head);
break;
}
case 8://修改信息
{
printf("请输入要修改的学生的学号:");
scanf("%d",&n);
change(head,n);
break;
}
case 9://保存信息
{
save(head);
break;
}
case 10://载入信息
{
head=load(head);
break;
}
case 0://退出系统
{
exit(0);
}
}
printf("按任意健继续");//1
getch();// 2 输入字符不显示。 可将1和2换为 system("pause");
system("cls");//清除屏幕
Menu();
printf("请选择:");
scanf("%d",&flag);
}
return 0;
}
菜单
void Menu()
{
printf("***************************************************\n");
printf("---------------------------------------------------\n");
printf("**********************菜单*************************\n");
printf("---------------------------------------------------\n");
printf("* 1. 创建班级 2. 学生信息录入 *\n");
printf("* 3. 学生信息显示 4. 学生信息查询 *\n");
printf("* 5. 学生信息排序 6. 学生信息删除 *\n");
printf("* 7. 学生信息新增 8. 学生信息修改 *\n");
printf("* 9. 学生信息保存 10.学生信息载入 *\n");
printf("* 0. 退出系统 *\n");
printf("---------------------------------------------------\n");
printf("***************************************************\n");
}
录入信息
NODE* create(int n)
{
NODE* head, *p, *q;
for(int i = 0; i < n; ++i)
{
p = (NODE*)malloc(sizeof(NODE));
printf("请输入第%d个学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):\n", i+1);
scanf("%d%s%d%d%d",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]);
p->data.sum = p->data.score[0]+p->data.score[1]+p->data.score[2];
p->data.ave = p->data.sum/3;
p->data.order = 0;
p->next = NULL;
if(i == 0)
{
head = p;
q = p;
}
else
{
q->next = p;
q = p;
}
}
return head;
}
学生信息显示
void show(NODE* head)
{
NODE* p = head;
printf("|排名 |学号 |姓名 |C语言 |高数 |英语 |总分 |平均分|\n");
while(p != NULL)
{
printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0f|%-6.2f|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
p=p->next;
}
}
学生信息查询
void search(NODE* head, int n)
{
NODE* p = head;
while(p != NULL)
{
if(p->data.num == n)
{
printf("|排名 |学号 |姓名 |C语言 |高数 |英语 |总分 |平均分|\n");
printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0f|%-6.2f|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
break;
}
else
p=p->next;
}
if(p == NULL)
printf("没有找到此学号!!!");
}
学生信息排序
void sort(NODE* head)
{
STU t;
int flag, i = 1;
NODE* p, *q;
p = head;
q = p->next;
printf("0.总分排序\n");
printf("1.C语言成绩排序\n");
printf("2.高数成绩排序\n");
printf("3.英语成绩排序\n");
printf("请输入:");
scanf("%d", &flag);
if(flag)
{
while(q != NULL)
{
while(q != NULL)
{
if(p->data.score[flag-1] < q->data.score[flag-1])
{
t = p->data;
p->data = q->data;
q->data = t;
}
else
{
q = q->next;
}
}
p = p->next;
q = p->next;
}
}
else
{
while(q != NULL)
{
while(q != NULL)
{
if(p->data.sum < q->data.sum)
{
t = p->data;
p->data = q->data;
q->data = t;
}
else
{
q = q->next;
}
}
p = p->next;
q = p->next;
}
}
p = head;
while(p != NULL)
{
p->data.order = i;//排序完成后分别赋予名次
++i;
p = p->next;
}
}
删除学生信息
NODE* dele(NODE* head)
{
NODE* phead = head;
NODE* h = head;
NODE* p = head->next;
int flag;
if(count == 0)
{
printf("请先创建班级!!!");
return h;
}
printf("请输入所要删除学生的学号:");
scanf("%d", &flag);
if(flag == h->data.num)
{
printf("删除成功!!!");
--count;
return p;
}
while(p != NULL)
{
if(flag == p->data.num)
{
h->next = p->next;
printf("删除成功!!!");
--count;
return phead;
}
else
{
h = p;
p = p->next;
}
}
printf("没有找到该学号!!!");
return phead;
}
添加学生信息
void add(NODE* head)
{
NODE* p = head;
NODE* q;
while(p != NULL)
{
if(p->next == NULL)
{
q = (NODE*)malloc(sizeof(NODE));
printf("请输入学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):");
scanf("%d%s%d%d%d",&q->data.num,q->data.name,&q->data.score[0],&q->data.score[1],&q->data.score[2]);
q->data.sum = q->data.score[0]+q->data.score[1]+q->data.score[2];
q->data.ave = q->data.sum/3;
q->data.order = 0;
p->next = q;
q->next = NULL;
count++;
printf("添加成功!!!\n");
break;
}
p = p->next;
}
}
修改信息
void change(NODE* head, int n)
{
NODE* q = head;
while(q != NULL)
{
if(q->data.num == n)
{
printf("请输入学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):");
scanf("%d%s%d%d%d",&q->data.num,q->data.name,&q->data.score[0],&q->data.score[1],&q->data.score[2]);
q->data.sum = q->data.score[0]+q->data.score[1]+q->data.score[2];
q->data.ave = q->data.sum/3;
q->data.order = 0;
printf("修改成功!\n");
break;
}
q = q->next;
}
if(q == NULL)
printf("没有找到该学号!!!");
}
保存信息
void save(NODE* head)
{
NODE* p = head;
FILE* fp;
fp=fopen("C:\\Users\\lujia\\Desktop\\学生信息管理.txt","w");//打开文件,'w'表示写入文件
if(fp==NULL)
{
printf("无法打开文件!");
exit(0);
}
else
{
fprintf(fp,"学生人数:%d\n",count);
while(p != NULL)
{
fprintf(fp,"学号:%d\n姓名%s\nC语言:%d\n高数:%d\n英语:%d\n总分:%lf\n平均分:%lf\n排名:%d\n\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave,p->data.order);
p=p->next;
}
}
fclose(fp);//关闭文件
printf("保存成功!!!\n");
}
载入信息(切记fscanf函数的输入格式要与上边fprintf函数的格式相同)
NODE* load(NODE* head)
{
NODE* p;
NODE* q;
FILE* fp;
fp=fopen("C:\\Users\\lujia\\Desktop\\学生信息管理.txt","r");//打开文件,'r'表示读取文件
if(fp==NULL)
{
printf("无法打开文件!");
exit(0);
}
else
{
fscanf(fp,"学生人数:%d\n",&count);//读取学生人数
for(int i = 1; i <= count; ++i)
{
p = (NODE*)malloc(sizeof(NODE));
fscanf(fp,"学号:%d\n姓名%s\nC语言:%d\n高数:%d\n英语:%d\n总分:%lf\n平均分:%lf\n排名:%d\n\n",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2],&p->data.sum,&p->data.ave,&p->data.order);
printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0lf|%-6.2lf|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
p->next=NULL;
if(i == 1)
{
head = p;
q = p;
}
else
{
q->next = p;
q = p;
}
}
printf("读取成功!!!");
}
fclose(fp);
return head;
}
总代码
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct _stu
{
int num;//学号
char name[15];//姓名
int score[3];//C语言,高数,英语成绩
double sum;//总分
double ave;//平均分
int order;//排名
}STU;
typedef struct node
{
STU data;
struct node* next;
}NODE;
int count = 0;//统计学生人数
int n;
//函数声明
void Menu();
NODE* create(int n);
void show(NODE* head);
void search(NODE* head, int n);
void sort(NODE* head);
NODE* dele(NODE* head);
void add(NODE* head);
void change(NODE* head, int n);
void save(NODE* head);
NODE* load(NODE* head);
int main(void)
{
Menu();
int flag;
NODE* head;//创建头指针
printf(" 请选择:");
scanf("%d", &flag);
printf("\n");
while(1)
{
switch(flag)
{
case 1:
{
printf("请输入需要创建的班级人数:");
scanf("%d",&count);
printf("创建成功!班级人数为%d人\n请录入学生信息!!\n",count);
break;
}
case 2:
{
head=create(count);
printf("录入成功!\n");
break;
}
case 3:
{
show(head);
printf("显示成功!\n");
break;
}
case 4:
{
printf("请输入学生的学号:");
scanf("%d",&n);
search(head,n);
break;
}
case 5:
{
sort(head);
printf("排序成功!\n");
break;
}
case 6:
{
head=dele(head);break;
}
case 7:
{
add(head);
break;
}
case 8:
{
printf("请输入要修改的学生的学号:");
scanf("%d",&n);
change(head,n);
break;
}
case 9:
{
save(head);
break;
}
case 10:
{
head=load(head);
break;
}
case 0:
{
exit(0);//退出系统
}
}
printf("按任意健继续");
getch();//输入字符不显示
system("cls");//清除屏幕
Menu();
printf("请选择:");
scanf("%d",&flag);
}
return 0;
}
// 菜单排版可自由发挥
void Menu()//菜单
{
printf("**************************************************\n");
printf("--------------------------------------------------\n");
printf("**********************菜单************************\n");
printf("--------------------------------------------------\n");
printf("* 1. 创建班级 2. 学生信息录入 *\n");
printf("* 3. 学生信息显示 4. 学生信息查询 *\n");
printf("* 5. 学生信息排序 6. 学生信息删除 *\n");
printf("* 7. 学生信息新增 8. 学生信息修改 *\n");
printf("* 9. 学生信息保存 10.学生信息载入 *\n");
printf("* 0. 退出系统 *\n");
printf("---------------------------------------------------\n");
printf("***************************************************\n");
}
NODE* create(int n)//录入班级学生信息
{
NODE* head, *p, *q;
for(int i = 0; i < n; ++i)
{
p = (NODE*)malloc(sizeof(NODE));
printf("请输入第%d个学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):\n", i+1);
scanf("%d%s%d%d%d",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]);
p->data.sum = p->data.score[0]+p->data.score[1]+p->data.score[2];
p->data.ave = p->data.sum/3;
p->data.order = 0;
p->next = NULL;
if(i == 0)
{
head = p;
q = p;
}
else
{
q->next = p;
q = p;
}
}
return head;
}
void show(NODE* head)//显示所有学生信息
{
NODE* p = head;
printf("|排名 |学号 |姓名 |C语言 |高数 |英语 |总分 |平均分|\n");
while(p != NULL)
{
printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0f|%-6.2f|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
p=p->next;
}
}
void search(NODE* head, int n)//查询某个学生信息
{
NODE* p = head;
while(p != NULL)
{
if(p->data.num == n)
{
printf("|排名 |学号 |姓名 |C语言 |高数 |英语 |总分 |平均分|\n");
printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0f|%-6.2f|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
break;
}
else
p=p->next;
}
if(p == NULL)
printf("没有找到此学号!!!");
}
void sort(NODE* head)//学生信息排序
{
STU t;
int flag, i = 1;
NODE* p, *q;
p = head;
q = p->next;
printf("0.总分排序\n");
printf("1.C语言成绩排序\n");
printf("2.高数成绩排序\n");
printf("3.英语成绩排序\n");
printf("请输入:");
scanf("%d", &flag);
if(flag)
{
while(q != NULL)
{
while(q != NULL)
{
if(p->data.score[flag-1] < q->data.score[flag-1])
{
t = p->data;
p->data = q->data;
q->data = t;
}
else
{
q = q->next;
}
}
p = p->next;
q = p->next;
}
}
else
{
while(q != NULL)
{
while(q != NULL)
{
if(p->data.sum < q->data.sum)
{
t = p->data;
p->data = q->data;
q->data = t;
}
else
{
q = q->next;
}
}
p = p->next;
q = p->next;
}
}
p = head;
while(p != NULL)
{
p->data.order = i;
++i;
p = p->next;
}
}
NODE* dele(NODE* head)//删除某个学生信息
{
NODE* phead = head;
NODE* h = head;
NODE* p = head->next;
int flag;
if(count == 0)
{
printf("请先创建班级!!!");
return h;
}
printf("请输入所要删除学生的学号:");
scanf("%d", &flag);
if(flag == h->data.num)
{
printf("删除成功!!!");
--count;
return p;
}
while(p != NULL)
{
if(flag == p->data.num)
{
h->next = p->next;
printf("删除成功!!!");
--count;
return phead;
}
else
{
h = p;
p = p->next;
}
}
printf("没有找到该学号!!!");
return phead;
}
void add(NODE* head)//添加学生
{
NODE* p = head;
NODE* q;
while(p != NULL)
{
if(p->next == NULL)
{
q = (NODE*)malloc(sizeof(NODE));
printf("请输入学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):");
scanf("%d%s%d%d%d",&q->data.num,q->data.name,&q->data.score[0],&q->data.score[1],&q->data.score[2]);
q->data.sum = q->data.score[0]+q->data.score[1]+q->data.score[2];
q->data.ave = q->data.sum/3;
q->data.order = 0;
p->next = q;
q->next = NULL;
count++;
printf("添加成功!!!\n");
break;
}
p = p->next;
}
}
void change(NODE* head, int n)//修改学生信息
{
NODE* q = head;
while(q != NULL)
{
if(q->data.num == n)
{
printf("请输入学生的学号,姓名,C语言成绩,高数成绩,英语成绩,(分别用空格隔开):");
scanf("%d%s%d%d%d",&q->data.num,q->data.name,&q->data.score[0],&q->data.score[1],&q->data.score[2]);
q->data.sum = q->data.score[0]+q->data.score[1]+q->data.score[2];
q->data.ave = q->data.sum/3;
q->data.order = 0;
printf("修改成功!\n");
break;
}
q = q->next;
}
if(q == NULL)
printf("没有找到该学号!!!");
}
void save(NODE* head)//保存所有学生信息
{
NODE* p = head;
FILE* fp;
fp=fopen("C:\\Users\\lujia\\Desktop\\学生信息管理.txt","w");//打开文件,'w'表示写入文件
if(fp==NULL)
{
printf("无法打开文件!");
exit(0);
}
else
{
fprintf(fp,"学生人数:%d\n",count);
while(p != NULL)
{
fprintf(fp,"学号:%d\n姓名%s\nC语言:%d\n高数:%d\n英语:%d\n总分:%lf\n平均分:%lf\n排名:%d\n\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave,p->data.order);
p=p->next;
}
}
fclose(fp);//关闭文件
printf("保存成功!!!\n");
}
NODE* load(NODE* head)//载入所有学生信息
{
NODE* p;
NODE* q;
FILE* fp;
fp=fopen("C:\\Users\\lujia\\Desktop\\学生信息管理.txt","r");//打开文件,'r'表示读取文件
if(fp==NULL)
{
printf("无法打开文件!");
exit(0);
}
else
{
fscanf(fp,"学生人数:%d\n",&count);//读取学生人数
printf("|排名 |学号 |姓名 |C语言 |高数 |英语 |总分 |平均分|\n");
for(int i = 1; i <= count; ++i)
{
p = (NODE*)malloc(sizeof(NODE));
fscanf(fp,"学号:%d\n姓名%s\nC语言:%d\n高数:%d\n英语:%d\n总分:%lf\n平均分:%lf\n排名:%d\n\n",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2],&p->data.sum,&p->data.ave,&p->data.order);
printf("|%-6d|%-6d|%-6s|%-6d|%-6d|%-6d|%-6.0lf|%-6.2lf|\n",p->data.order,p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2],p->data.sum,p->data.ave);
p->next=NULL;
if(i == 1)
{
head = p;
q = p;
}
else
{
q->next = p;
q = p;
}
}
printf("读取成功!!!");
}
fclose(fp);
return head;
}