1、密码登录;
2、通过键盘输入学生信息,包括学生学号、姓名、成绩;
3、将输入的信息保存到指定文件中;
4、从文件中读取学生信息;
5、显示全部学生信息;
6、按学生总分进行降序排序;
7、删除学生信息;
8、查找学生信息,可以通过学号查找,也可以通过姓名查找;
9、统计学生信息,统计出最高分和学生人数;
10、退出系统;
源代码:
chunli@Linux:~$ cat main.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student
{
char num[9];
char name[9];
int scorem;
int scoree;
int scorec;
int sum;
struct student *next;
};
struct student *creat(struct student *p)//创建链表
{
struct student *p1 = NULL;
p1 = (struct student*)malloc(sizeof (struct student));
p -> next = p1;
p1 -> next = NULL;
printf("请输入要添加的学生的信息\n");
printf("学号:"); scanf("%s",p1 -> num);
printf("姓名: "); scanf("%s",p1 -> name);
printf("数学成绩:"); scanf("%d",&p1 -> scorem);
printf("英语成绩:"); scanf("%d",&p1 -> scoree);
printf("C语言成绩:"); scanf("%d",&p1 -> scorec);
p1 -> sum = 0;
p1 -> sum = p1 -> scorem + p1 -> scorec + p1 -> scoree;
printf("总分:%d",p1 -> sum);
return p1;
}
void save1(struct student *p)//将链表从内存保存到文件中
{
FILE *fp;
if ((fp = fopen("student_system.txt","ab+")) == NULL)
printf("创建失败!\n");
while(p != NULL)
{
fwrite(p,sizeof(struct student),1,fp);
p = p -> next;
}
fclose(fp);
printf("保存成功!\n");
}
void save2(struct student *p)//将以变动的链表信息存入到文件中
{
FILE *fp;
if ((fp = fopen("student_system.txt","wb")) == NULL)
printf("创建失败!\n");
while(p != NULL)
{
fwrite(p,sizeof(struct student),1,fp);
p = p -> next;
}
fclose(fp);
}
struct student *read()//把文件中的数据读到链表中
{
FILE *fp;
struct student *head=NULL,*p1=NULL,*p2=NULL;
if ((fp=fopen ("student_system.txt","rb+"))==NULL)
{
printf ("读取时,文件打开失败!\n");
return NULL;
}
head=p1=(struct student *)malloc (sizeof (struct student ));
while (fp != NULL)
{
if (fread(p1,sizeof (struct student ),1,fp) != 1) break;
p1 -> next = (struct student *)malloc (sizeof (struct student ));
p2= p1;
p1= p1 -> next;
}
p2->next = NULL;
fclose (fp);
return head;
}
struct student *input()//添加函数
{
char ch;
struct student *p = NULL,*head=NULL;
head=p = (struct student*)malloc(sizeof(struct student));
p-> next = NULL;
printf("请输入要添加的学生的信息\n");
printf("学号:"); scanf("%s",p -> num);
printf("姓名: "); scanf("%s",p -> name);
printf("数学成绩:"); scanf("%d",&p -> scorem);
printf("英语成绩:"); scanf("%d",&p -> scoree);
printf("C语言成绩:"); scanf("%d",&p -> scorec);
p -> sum = 0;
p -> sum = p -> scorem + p -> scorec + p -> scoree;
printf("总分:%d",p -> sum);
for (;;)
{
printf ("\n是否继续输入学生信息?( y / n ):\n");
getchar( );
ch = getchar ( );
if (ch == 'y'|| ch == 'Y')
p = creat(p);
else if(ch=='n'|| ch=='N')
{
save1 (head);
break;
}
else
printf ("您的输入有误,请重新输入,");
}
return p->next;
}
struct student *output()//输出函数,查看全部学生信息
{
struct student *p ;
p = read();
if(read==NULL)
exit(1);
printf("\n *************************STUDENT***********************\n");
printf(" -------------------------------------------------------\n");
printf(" | 学号| 姓名| 数学| 英语| C语言| 总分|\n");
printf(" -------------------------------------------------------\n");
while (p != NULL)
{
p -> sum = 0;
p -> sum = p -> scorem + p -> scoree + p -> scorec;
printf(" | %4s | %-4s| %3d | %3d| %3d| %3d|\n",p->num,
p->name,p->scorem,p->scoree,p->scorec,p->sum);
printf(" -------------------------------------------------------\n");
p = p -> next;
}
return p;
}
struct student *search()//查找函数
{
int n;
char a[9],b[9];
struct student *p = NULL,*head = NULL;
printf("请您选择要查找的方式:1 按姓名 2 按学号\n");
scanf("%d",&n);
if(n==1)
{
printf("请输入您要查找的学生的姓名:\n");
scanf("%s",a);
p=head=read();
while(p!=NULL)
{
if(p==NULL)
{
printf("对不起,没有您要找的人。\n");
}
if(strcmp(p -> name,a)==0)
{
printf("\n *************************STUDENT***********************\n");
printf(" -------------------------------------------------------\n");
printf(" | 学号 | 姓名 | 数学 | 英语 | C语言 | 总分 |\n");
printf(" -------------------------------------------------------\n");
printf(" | %4s | %-4s | %3d | %3d | %3d | %3d |\n",p->num,
p->name,p->scorem,p->scoree,p->scorec,p->sum);
printf(" -------------------------------------------------------\n");
break;
}
p=p->next;
}
}
if(n==2)
{
printf("请输入您要查找的学生的学号:\n");
scanf("%s",b);
p=head=read();
while(p!=NULL)
{
if(p==NULL)
{
printf("对不起,没有您要找的人。\n");
}
if(strcmp(p -> num,b)==0)
{
printf("\n *************************STUDENT***********************\n");
printf(" -------------------------------------------------------\n");
printf(" | 学号 | 姓名 | 数学 | 英语 | C语言 | 总分 |\n");
printf(" -------------------------------------------------------\n");
printf(" | %4s | %-4s | %3d | %3d | %3d | %3d |\n",p->num,
p->name,p->scorem,p->scoree,p->scorec,p->sum);
printf(" -------------------------------------------------------\n");
break;
}
p=p->next;
}
}
return head;
}
struct student *dele()//删除函数
{
struct student *p1=NULL,*p2=NULL,*head=NULL;
char a[9];
output();
printf ("请输入需要删除信息的人的姓名:\n");
scanf ("%s",a);
p1=head=read();
if(head==NULL)
{
printf("对不起,暂时没有信息,无法删除。\n");
}
while (head!=NULL)
{
if(strcmp(a,head -> name) != 0 && p1->next!=NULL )
{
p2=head ;
head= head->next ;
if(head==NULL) break;
}
if(strcmp(a,head -> name) == 0 && p1==head)
{
p1=head->next ;
}
if(strcmp(a,head->name)==0)
{
p2->next=head->next;
save2(p1);
printf("该学生的信息删除成功!");
break;
}
}
if(head==NULL)
printf("对不起,没有该学生的信息。\n");
return head;
}
struct student *change()//修改函数
{
int a;
char x[9];
struct student *p = NULL,*head = NULL,*q = NULL;
output();
p = head = read();
printf("请输入要修改的人的姓名:\n");
scanf("%s",x);
if(p == NULL)
{
printf("没有这个人!\n");
exit(1);
}
while (p != NULL)
{
if (strcmp(p -> name,x) == 0)
{
q = p;
break;
}
p = p -> next;
}
if(p!=NULL)
{
printf("请选择修改的内容:\n");
printf("1.姓名\n");
printf("2.学号\n");
printf("3.数学成绩\n");
printf("4.英语成绩\n");
printf("5.C成绩\n");
do
{
scanf ("%d",&a);
if(a < 0 || a > 6)
printf ("您输入的数字有误,请重新输入:\n");
}while (a<=0||a>=6);
switch (a)
{
case 1 : printf("请输入更改后的姓名:\n"); scanf("%s",p -> name); break;
case 2 : printf("请输入更改后的学号:\n"); scanf("%s",p -> num); break;
case 3 : printf("请输入更改后的数学成绩:\n");scanf("%d",&p -> scorem);break;
case 4 : printf("请输入更改后的英语成绩:\n");scanf("%d",&p -> scoree);break;
case 5 : printf("请输入更改后的C成绩:\n"); scanf("%d",&p -> scorec);break;
}
p->sum =0;
p->sum=p->scorem +p->scoree +p->scorec ;
printf("更改后的总分:%d",p->sum);
save2 (head);
output();
}
if(p==NULL)
{
printf("对不起,没有这个人。\n");
}
return head;
}
struct student *sortsum(struct student *head)//排序函数
{
struct student *p,*p1,*p2,*p3;
struct student m, n;
if (head == NULL) return NULL;
m.next=head;
p=&m;
while (p->next!=NULL)
{
p=p->next;
}
p=p->next=&n;
while (p!=m.next)
{
p3=&m;
p1=p3->next;
p2=p1->next;
while (p2!=p)
{
if ((p1 -> sum) < (p2 -> sum) )
{
p1->next=p2->next;
p2->next=p1;
p3->next=p2;
p3=p2;
p2=p1->next;
}
else
{
p3=p1;
p1=p2;
p2=p2->next;
}
}
p=p1;
}
while (p->next!=&n)
{
p=p->next;
}
p->next=NULL;
return m.next;
}
struct student *outputsortsum()//总分排序输出
{
int i=0;
struct student *head = NULL , *p = NULL;
head = read();
p = sortsum(head);
printf("\n *************************STUDENT****************************\n");
printf(" ------------------------------------------------------------\n");
printf(" | 名次 | 学号 | 姓名 | 数学 | 英语 | C语言 | 总分 |\n");
printf(" ------------------------------------------------------------\n");
while(p != NULL)
{
i++;
printf(" | %3d | %4s | %-4s | %3d | %3d | %3d | %3d |\n",i,p->num,
p->name,p->scorem,p->scoree,p->scorec,p->sum);
printf(" ------------------------------------------------------------\n");
p=p->next;
}
return head;
}
struct student *statistic()//统计函数
{
int m = 0;
struct student *head=NULL;
struct student *p,*q;
p = head = read();
while( p != NULL)
{
m++;
p = p -> next;
}
printf("总共有%d个学生信息.\n\n",m);
q= sortsum(head);
printf("分数最高的学生的信息:\n");
printf("\n ***********************STUDENT*************************\n");
printf(" -------------------------------------------------------\n");
printf(" | 学号 | 姓名 | 数学 | 英语 | C语言 | 总分 |\n");
printf(" -------------------------------------------------------\n");
printf(" | %4s | %-4s | %3d | %3d | %3d | %3d |\n",q->num,
q->name, q->scorem,q->scoree,q->scorec,q->sum);
printf(" -------------------------------------------------------\n");
return head;
}
void login1 ()
{
while(1)
{
int a=1;
int i;
char ch[10];
char num[20]={"abcde"};
printf("进入管理员成绩管理系统之前请先输入密码\n");
printf("请输入您的密码 : ");
scanf("%s",ch);
if(strcmp(num,ch)==0)
{
a = 0;
}
if(a!=0)
{
printf("\n这个密码是错误的! ");
printf("\n请输入正确的密码:");
}
else
{
break;
}
}
}
void login2 ()
{
while(1)
{
int a=1;
int i;
char ch[10];
char num[20]={"12345"};
printf("进入学生成绩管理系统之前请先输入密码\n");
printf("请输入您的密码 :");
scanf("%s",ch);
if(strcmp(num,ch)==0)
a = 0;
if(a==0)
{
printf("\n欢迎进入学生成绩管理系统 !\n");
getchar();
break;
}
else
{
printf("\n这个密码是错误的! ");
printf("\n请输入正确的密码:");
}
}
}
void menu1()
{
system("clear");
printf(" 欢迎进入管理员管理系统!\n");
printf(" *******************************主菜单****************************\n");
printf(" * 1 添加学生成绩 *\n");
printf(" * 2 查找学生成绩 *\n");
printf(" * 3 删除指定学生 *\n");
printf(" * 4 修改学生信息 *\n");
printf(" * 5 总分排序信息 *\n");
printf(" * 6 查看全部信息 *\n");
printf(" * 7 统计学生人数 *\n");
printf(" * 8 停止程序运行 *\n");
printf(" *****************************************************************\n");
}
void menu2()
{
system("clear");
printf(" 欢迎进入学生管理系统!\n");
printf(" *******************************主菜单****************************\n");
printf(" * 1 查找学生成绩 *\n");
printf(" * 2 总分排序信息 *\n");
printf(" * 3 查看全部信息 *\n");
printf(" * 4 统计学生人数 *\n");
printf(" * 5 停止程序运行 *\n");
printf(" *****************************************************************\n");
}
void main()
{
int a,m;
int b = 1;
system("clear");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf(" 教务管理系统欢迎您!\n");
printf(" 请选择您要进入的管理系统 \n");
printf(" 1.管理员管理系统。\n");
printf(" 2.学生管理系统。\n");
printf(" 3.退出系统!\n");
printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
printf("请您选择: ");
scanf("%d",&m);
if(m==1){login1();}
if(m==2){login2();}
while (b == 1)
{
if(m==1)
{
menu1();
scanf("%d",&a);
switch(a)
{
case 1 : input(); break;
case 2 : search(); break;
case 3 : dele(); break;
case 4 : change(); break;
case 5 : outputsortsum(); break;
case 6 : output(); break;
case 7 : statistic(); break;
case 8 : exit(1);
default : printf("输入错误!\n");break;
}
printf("\n\n请选择接下来的操作:\n");
printf(" 1 . 返回主菜单 2 . 退出程序\n");
scanf("%d",&b);
}
if(m==2)
{
menu2();
scanf("%d",&a);
switch(a)
{
case 1 : search(); break;
case 2 : outputsortsum(); break;
case 3 : output(); break;
case 4 : statistic(); break;
case 5 : exit(1);
default : printf("输入错误!\n");break;
}
printf("\n\n请选择接下来的操作:\n");
printf(" 1 . 返回主菜单 2 . 退出程序\n");
scanf("%d",&b);
}
if(m==3)
exit (1);
}
}
chunli@Linux:~$
编译运行:
chunli@Linux:~$ gcc main.c && ./a.out
★★★★★★★★★★★★★★★★★★★★★★★★★★★
教务管理系统欢迎您!
请选择您要进入的管理系统
1.管理员管理系统。
2.学生管理系统。
3.退出系统!
★★★★★★★★★★★★★★★★★★★★★★★★★★★
请您选择: 1
进入管理员成绩管理系统之前请先输入密码
请输入您的密码 : abcde
欢迎进入管理员管理系统!
*******************************主菜单****************************
* 1 添加学生成绩 *
* 2 查找学生成绩 *
* 3 删除指定学生 *
* 4 修改学生信息 *
* 5 总分排序信息 *
* 6 查看全部信息 *
* 7 统计学生人数 *
* 8 停止程序运行 *
*****************************************************************
6
*************************STUDENT***********************
-------------------------------------------------------
| 学号| 姓名| 数学| 英语| C语言| 总分|
-------------------------------------------------------
| 1 | lucy| 12 | 32| 0| 44|
-------------------------------------------------------
| 45 | 34 | 354 | 343| 4234| 4931|
-------------------------------------------------------
请选择接下来的操作:
1 . 返回主菜单 2 . 退出程序
转载于:https://blog.51cto.com/990487026/1792587