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; 
}

}
}


但是每次存盘还正常 但是再次打开这个程序显示的时候显示的就是乱码了
是不是保存或者读取那块出问题了 求大神教我 帮我指正
...全文
381 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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; 两个等号
c语言24点游戏源码 c语言Turbo C下写的俄罗斯方块 c语言UDP传输系统源码 c语言奔跑的火柴人游戏源码 c语言别踩白块儿(双人版)源码 C语言超市管理系统 c语言吃逗游戏源码 c语言打字母游戏源码 c语言打字游戏代码 c语言大丰收游戏源码 c语言地空对战游戏 c语言电子时钟程序 c语言对对碰游戏源码 c语言对自己电脑系统测试 c语言俄罗斯方块 c语言盒子接球游戏源码 c语言黑白棋ai游戏源码 c语言华容道源码 c语言火车票订票管理源码 c语言教工工资管理系统 c语言坑爹;大冒险 c语言矿井逃生 c语言力学相关的流体源码 c语言连连看游戏源码 c语言模拟快打旋风游戏源码 c语言配有图片和音乐的打字母游戏 c语言实现类似弹力球效果 c语言实现如果cmd中的ping c语言实现数字雨 c语言实现水波纹显示效果 c语言实现图片转化为ASCI图 c语言贪吃蛇游戏的双人对战版 c语言坦克游戏源代码 c语言通讯录管理系统源码 c语言图书管理系统源码 c语言图书借阅系统源码 c语言涂格子游戏源码 c语言万年历源码 c语言文本编辑器系统源码 c语言五子棋源码 c语言学生成绩管理系统 c语言学生成绩管理系统源码 c语言学生信息系统 c语言支持自2已创建迷宫,并求解最短路径 c语言种地要浇水游戏源码 c语言自创军旗游戏源码 c语言自创推箱子游戏改版 c语言做的播放器源码 c语言做的绘图板系统 c语言做的一个任务管理器 纯c语言迷宫源码 链表HuffmanTree

70,024

社区成员

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

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