c语言学生管理信息系统

wangyahui110119 2016-09-02 09:14:50
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student//定义学生
{
   char name[10];
   long long number;
   char sex[2];
   int math;
   int english;
   int cyuyan;
   int sum;
   }student;
   typedef struct unit//定义接点
   {
    student date;
    struct unit *next;
} unit;
unit* build()//建立链表并返回指针
{
unit *p;
if((p=(unit*)malloc(sizeof(unit)))==NULL){
printf("=>初始化失败!");
return 0;
}
else{
p->next=NULL;
p->date.number=0;
printf("初始化成功!\n");
return p;
}

   void add(unit *head)//增加学生 
{
unit *p,*q;
int m,n=0;
q=head->next;
p=(unit*)malloc(sizeof(unit));
printf("=>请输入新生姓名\n");
gets(p->date.name);fflush(stdin);
printf("=>请输入学生学号!\n");
while(n==0){
scanf("%d",&m);fflush(stdin);
    if(q==NULL)n=1;
while(q){
if(q->date.number==m){
printf("=>你输入的学号与已有学生的学号相同,请重新输入!\n");
q=head->next;
break;  
}
else{
q=q->next;
if(q=NULL)n=1;
}
}

p->date.number=m;}
printf("=>请输入性别!\n");
gets(p->date.sex);fflush(stdin);
printf("=>请输入数学成绩\n");
scanf("%d",&m);fflush(stdin);
p->date.math=m;
printf("=>请输入英语成绩\n");
scanf("%d",&m);fflush(stdin);
p->date.english=m;
printf("=>请输入c语言成绩\n");
scanf("%d",&m);fflush(stdin);
p->date.cyuyan=m;
p->date.sum=(p->date.math+p->date.english+p->date.cyuyan);
q=head->next;
head->next=p;
p->next=q;
head->date.number++;
}

void deletion(unit *head)//删除一名学生
{
unit *p=head->next,*q=head;
char N[10];
printf("=>请输入你想要删除的学生姓名!\n");
gets(N);fflush(stdin);
if(p==NULL) 
printf("=>系统无学生可删除!\n");
while(p){
if(strcmp(p->date.name,N)==0){
q->next=p->next;
head->date.number--;
printf("=>删除%s成功!\n",p->date.name);
free(p);
break;
}
else{
p=p->next;
q=q->next;
if(p==NULL)
printf("=>你要删除的学生不存在,删除失败!\n");

}
}
 }
 
 int display(unit *head)//显示学生信息 统计汇总 
 {
  unit *p=head->next;
  int m,n=0;
  char N[10];
  if(p==NULL){
  printf("=>系统无学生!\n");
  return 0; 
 }
 while(n==0){
  printf("-------------------------\n");
  printf("=>请选择你的操作!\n");
printf("=>\t\t\t1.显示所有\t2.按姓名查找\n\t\t\t3.按学号查找\t4.返回主菜单\n");
  scanf("%d",&m);
fflush(stdin);
switch(m)
{
case 1:printf("\n=>该系统拥有%d名学生!\n\n",head->date.number);
p=head->next;
printf("\t姓名\t学号\t性别\t数学\t英语\tc语言\t综合\n\n");
while(p){
printf("\t%s\t%d\t%s\t%d\t%d\t%d\t%d\n",p->date.name,p->date.number,p->date.sex,p->date.math,p->date.english,p->date.cyuyan,p->date.sum);
p=p->next;
}
break;
case 2:printf("=>请输入查找姓名!\n");
gets(N);
fflush(stdin);
p=head->next; 
while(p){
if(strcmp(p->date.name,N)==0){
printf("\t姓名\t学号\t性别\t数学\t英语\tc语言\t综合\n");
printf("\t%s\t%d\t%s\t%d\t%d\t%d\t%d\n",p->date.name,p->date.number,p->date.sex,p->date.math,p->date.english,
p->date.cyuyan,p->date.sum);
break; 
}else{
p=p->next;
if(p==NULL)
printf("=>你要查的学生不存在!\n");

}
}break;
case 3:printf("=>请输入查找学号!\n");
scanf("%d",&m);
fflush(stdin);
p=head->next;
while(p){
if(p->date.number==m){
printf("\t姓名\t学号\t性别\t数学\t英语\tc语言\t综合\n");
printf("\t%s\t%d\t%s\t%d\t%d\t%d\t%d\n",p->date.name,p->date.number,p->date.sex,p->date.math,p->date.english,
p->date.cyuyan,p->date.sum);
break;
}else{
p=p->next;
if(p==NULL)
printf("=>你要查的学生不存在!\n");
}
}
break;
 case 4:n=1;break;
}
 }
 return 1;
  } 
  int range(unit *head)//排序
  {
   unit *p=head,*q=head->next;
   int n,i,m=head->date.number;
   printf("--------------------------\n");
   printf("\t\t\t1.按学号\t2.按成绩\n\n");
   printf("=>请选择操作!\n");
   scanf("%d",&n);
fflush(stdin) ;
if(q==NULL){
printf("=>无学生可排序!\n");
return 0;

switch(n){
case 1:for(i=0;i<=m;i++){
p=head;q=head->next;
while(q->next){
if((q->date.number)>(q->next->date.number)){
p->next=q->next;
p=p->next;
q->next=p->next;
p->next=q;
}else{
p=p->next;q=q->next;
}
}
} break;
}
printf("=>排序成功!\n");
return 1;
  }
  void menu(){
   printf("-------------主菜单------------------\n");
   printf("\t1.新建系统\t2.添加学生\n\t3.删除学生\t4.查看信息\n\t5.排列顺序\t6.读取信息\n\t7.保存信息\t8.退出系统\n");
   printf("-------------------------------------\n");
    printf("=>请输入你的操作!\n");
  }
int save(unit *head)//保存
  {
   FILE *fp;
  unit *p;
  p=head;
  if((fp=fopen("xuesheng.txt","wb+"))==NULL)
  {
  printf("=>保存失败!\n");
   return 0; 
  }
   while(p){
   fwrite(&(p->date),sizeof(student),1,fp);
   p=p->next;
  }
   printf("=>保存成功!\n");
   fclose(fp);
   return 1;
   } 


  unit* read()//读入系统学生信息
   {
    int i;
    unit *p,*q,*head;
    FILE *fp;
    if((head=(unit*)malloc(sizeof(unit)))==NULL){
    printf("=>开发空间失败!\n");
    exit(1); 
   }
    else{
    head->next=NULL;
    head->date.number=0;//头结点存放学生人数;
   }
    q=head;
    if((fp=fopen("xuesheng.txt","ra"))==NULL){
    printf("=>系统无学生!\n");
    return 0; 
   }
    fread(&(q->date),sizeof(student),1,fp);
    for(i=0;i<head->date.number;i++){
    if((p=(unit*)malloc(sizeof(unit)))==NULL)
    {
    printf("=>读值失败!\n");
    exit(1);
   }
    fread(&(q->date),sizeof(student),1,fp);
    p->next=q->next;
    q->next=p;
   }
    fclose(fp);
return head;

int main(){
int m=0,n,i;
unit *head;
printf("--------------------------------------------------------------------------\n");
printf("\t\t\t* 欢迎使用学生成绩管理系统 *!\n");
printf("\n\t\t\t\t\t\t\t\t\t\t\t\t\t编译学生:王亚辉\n\n");
printf("正在读取系统信息。。。。。。\n");
if((head=read())==0){
printf("=>是否新建?!\n");
printf("\t\t\t是(1)\t\t否(2)\n");
scanf("%d",&i);
fflush(stdin);
if(i==1)
head=build();
else if(i==2)
exit(1);
}
else
printf("=>信息导入成功!\n");


while(m==0){
menu();
scanf("%d",&n);
fflush(stdin);
switch(n){
case 1:head=build();break;
case 2:add(head);break;
case 3:deletion(head);break;
case 4:display(head);break;
case 5:range(head);break;
case 6:head=read();if(head!=0) printf("=>读取存盘成功!\n");break;
case 7:save(head);break;
case 8:m=1;break; 
}

}
}


但是每次存盘还正常 但是再次打开这个程序显示的时候显示的就是乱码了
是不是保存或者读取那块出问题了 求大神教我 帮我指正
...全文
377 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灸舞 版主 2016-09-04
  • 打赏
  • 举报
回复
检查每一步返回值,看看操作是不是成功。 代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
边军一小兵 2016-09-03
  • 打赏
  • 举报
回复
顶楼上,建议改成 if(NULL==q)n=1; 这样可以杜绝少一个等号的错误
wangyahui110119 2016-09-03
  • 打赏
  • 举报
回复
您说的建议 我会听 不过现在没那么多时间了 这个作业 马上就要交了 希望帮帮忙
gzshun 2016-09-03
  • 打赏
  • 举报
回复
这种问题就是锻炼你能力的时候,在程序加载的时候下个断点,看下读取的数据和写文件的数据是否一致,多调试,多下断点。
wangyahui110119 2016-09-03
  • 打赏
  • 举报
回复
已经改过来了 可是我再次打开的时候之前存储的数据 显示的是乱码 不知为何 是保存那块还是存储那块的代码有问题 求指教 最好能改正过来代码发上 谢谢
paschen 2016-09-02
  • 打赏
  • 举报
回复
add函数中: if(q=NULL)n=1; 改成 if(q==NULL)n=1; 两个等号

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧