标签:【c项目】 文件 结构体 链表 排序 学生信息管理系统
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 . 退出程序
本文出自 “魂斗罗” 博客,请务必保留此出处http://990487026.blog.51cto.com/10133282/1792587
标签:【c项目】 文件 结构体 链表 排序 学生信息管理系统
原文地址:http://990487026.blog.51cto.com/10133282/1792587