学生管理系统(1)

帮同学修改的一个管理系统,要求把全局变量换为形参传递,自己尝试了好几次,在查询方面查询不存在的学生会出现bug,但还是比较有成就感的。


#include"stdio.h"
#include"string.h"
#include"math.h"
#include"conio.h"
#include"stdlib.h"
#define N sizeof(struct student)
void save_message(struct student *h);
struct date{int y;int m;int d;}bir;    /*日期结构体数组*/
struct student
{
int num;
char name[20];
char tel[20];
char addr[30];  /*省份*/ 
char yb[20];  /*邮编*/
char daxue[30];
struct date bir;
struct student *next; 
};
char a;
FILE *fp;
struct student *create()
{
int i,k;
struct student *head,*p1,*p2;
printf("\n请输入学生数:\n");
scanf("%d",&k);
head=NULL;
head=p1=p2=(struct student *)malloc(N);
for(i=0;i<k;i++)
{
p1=(struct student *)malloc(N);
printf("\n请输入序号:");
scanf("%d",&p1->num);
printf("\n请输入姓名:");
scanf("%s",p1->name);
printf("\n请输入电话:");
scanf("%s",p1->tel);
printf("\n请输入籍贯:");
scanf("%s",p1->addr);
printf("\n请输入邮编:");
scanf("%s",p1->yb);
printf("\n请输入大学:");
scanf("%s",p1->daxue);
printf("\n请输入出生日期(年-月-日)");
scanf("%d-%d-%d",&p1->bir.y,&p1->bir.m,&p1->bir.d);
p2->next=p1; 
p2=p1;  
}
p2->next=NULL; 
head=head->next;
save_message(head);
return head;
}
struct student *input_message(struct student *h)  
{
system("cls");
printf("\n\n**********输入学生信息**********\n");
printf("------------------------------------\n");
h=create();
getch();
printf("输入完毕,按任意键返回主菜单!");
getch();
return h;



void output_message(struct student *p)  /*输出模块*/
{
system("cls");
if(p==NULL) 
printf("暂无信息!请回主菜单录入信息!\n");
else
{
printf("\n\n====================通讯录信息表====================\n\n");
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n");
while(p!=NULL)
{
printf("-----------------------------------------------\n");
printf("%s %s %s %d-%d-%d %s %s",p->name,p->addr,p->tel,p->bir.y,p->bir.m,p->bir.d,p->yb,p->daxue);
printf("-----------------------------------------------\n");
printf("\n");
p=p->next;
}
}
printf("\n");
printf("按任意键返回主菜单!\n\n");
getch();
}
void save_message(struct student *h)  /*保存学生信息*/
{
FILE *fp;
struct student *f;
f=h;
if((fp=fopen("a.txt","wb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
while(h!=NULL)
{
if(fwrite(h,N,1,fp)!=1)  /*向文件写入数据*/
{
printf("文件写入错误!");
return; 
}
h=h->next;
}
h=f;
printf("已存盘,按任意键回上层菜单:\n");
getch();
fclose(fp);
return;
}
struct student *read_message(struct student *h)  /*读取信息*/ 
{
FILE *fp;
if((fp=fopen("a.txt","rb"))==NULL)
{
printf("\n\n****暂时还没有该生信息,请按任意键返回上一级菜单.\n");
getch();
}
struct student *p,*q,t;
p=(struct student*)malloc(sizeof(struct student));
h=p;
q=p;
q->next=NULL;
while(fread(&t,sizeof(struct student),1,fp)!=0)
{
if(p!=h)
{
q=q->next;
}
strcpy(p->name,t.name);
strcpy(p->tel,t.tel);
strcpy(p->addr,t.addr);
strcpy(p->yb,t.yb);
strcpy(p->daxue,t.daxue);
p->num=t.num;
p->bir.y=t.bir.y;
p->bir.m=t.bir.m;
p->bir.d=t.bir.d;
p=(struct student*)malloc(sizeof(struct student));
q->next=p;
}
q->next=NULL;
free(p);
fclose(fp);
return h;
}
struct student *add_message(struct student *w)  /*添加学生信息*/
{
struct student *p,*q;
p=(struct student *)malloc(N);  /*p指向新申请的结点*/
system("cls");
printf("\n请输入学生序号:");
scanf("%d",&p->num);
printf("\n请输入学生姓名:");
scanf("%s",p->name);
printf("\n请输入学生电话:");
scanf("%s",p->tel);
printf("\n请输入学生籍贯:");
scanf("%s",p->addr);
printf("\n请输入学生邮编:");
scanf("%s",p->yb);
printf("\n请输入学生大学:");
scanf("%s",p->daxue);
printf("\n请输入学生出生日期:");
scanf("%d-%d-%d",&p->bir.y,&p->bir.m,&p->bir.d);
p->next=NULL;
if(w==NULL)
{w=p;  /*头指针为空,p作为新头指针*/ 
return w;  /*正确插入返回1*/
}
q=w;  /*从头指针开始*/
if((q->num)>(p->num))  /*找到插入位置在首结点之前*/ 
{
p->next=w;  /*将首结点链接在新结点之后*/ 
w=p;  /*p作为新的头指针*/ 
return w;
}
while((q->next)!=NULL&&(q->next->num)<(p->num))
q=q->next;  /*继续查找插入位置*/
if(q->next==NULL)  /*插入位置在尾结点之后*/ 
{q->next=p;  /*新结点链接到尾结点之后*/ 
return w;
}
else if((q->next->num)==(p->num))  /*找到重号*/
{free(p); 
printf("已存在该学号!"); /*释放新结点的存储空间*/ 
return w;  /*不插入返回0*/
}
p->next=q->next;  /*后续结点链接到新结点之后*/
q->next=p;  /*新结点链接到前驱结点之后*/ 
return w;
}
struct student *del_message(struct student *w)  /*删除模块*/ 
{
char name[20];
struct student *p,*q;
if(w==NULL)
return w;  /**w就是头指针,空表不能删除返回0*/ 
system("cls");
printf("请输入要删除的学生姓名:\n");
scanf("%s",name);
q=w;
if(strcmp(q->name,name)==0)  /*找到要删除的是第一个结点*/
{
w=q->next;  /*修改头指针*/
free(q);  /*释放存储空间*/
return w;  /*正确删除返回1*/
}
p=q->next;
while(p!=NULL)
{
if(strcmp(p->name,name)==0)  /*找到要删除的结点*/
{
q->next=p->next;  /*后续结点连接到前驱结点之后*/ 
free(p);  /*释放存储空间*/
return w;
}
q=p;  /*推移指针继续查找*/
p=p->next;
}
if(p==NULL)
{
printf("没有该学生\n");
system("pause");
return w; 
}
/*未找到要删除的结点返回0*/
}
void revise_message(struct student *g)  /*修改模块*/
{
int choice;
char name[20],m,n;
do
{
system("cls");
printf("**********学生信息**********\n");
printf("请输入要修改的学生的姓名:\n");
scanf("%s",name);
while(g!=NULL)

while(strcmp(g->name,name)!=0)
g=g->next;
if(g==NULL)
{
printf("\n 该学生不存在!");
getch();
}
else
{
do
{
printf("\n您要修改哪一项?\n");
printf("\n 1序号\n"); 
printf("\n 2姓名\n");
printf("\n 3籍贯\n");
printf("\n 4电话\n");
printf("\n 5大学\n");
printf("\n 6出生日期\n");
scanf("%d",&choice);
switch(choice)
{
case 1:printf("\n 请输入修改后的序号:");
scanf("%d",&g->num);break;
case 2:printf("\n 请输入修改后的姓名:");
scanf("%s",g->name);break;
case 3:printf("\n 请输入修改后的籍贯:");
scanf("%s",g->addr); break;
case 4:printf("\n 请输入修改后的电话:");
scanf("%s",g->tel); break;
case 5:printf("\n 请输入修改后的大学:");
scanf("%s",g->daxue); break;
case 6:printf("\n 请输入修改后的出生日期:");
scanf("%d-%d-%d",&g->bir.y,&g->bir.m,&g->bir.d);break;
}
printf("\n是否继续修改此人信息?y/n\n") ;
getchar();
m=getchar();
}while(m=='y');
printf("\n\n=======================通讯录信息表======================\n\n");
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n");
printf("-----------------------------------------------------------------------\n");
printf("%s %s %s %d-%d-%d %s %s\n",g->name,g->addr,g->tel,g->bir.y,g->bir.m,g->bir.d,g->yb,g->daxue);
printf("-----------------------------------------------------------------------\n\n"); 
getch();
}
break;
}
printf("\n要继续吗?(y/n)\n");
getchar();
n=getchar();
  }while(n=='y');
  printf("\n按任意键返回主菜单!");
  getch();
}
struct student *renew_message(struct student *h)  /*更新模块*/
{
int choice=100;
while(choice!=0)
{
printf("\n**********更新同学信息**********\n\n");
printf(" 1.添加同学信息\n\n");
printf(" 2.删除同学信息\n\n");
printf(" 3.修改同学信息\n\n");
printf(" 0.返回修改菜单\n\n");
printf(" 请选择(0—3):\n");
printf("***********************************\n\n");
scanf("%d",&choice);
switch(choice)
{
case 1:h=add_message(h);break;
case 2:h=del_message(h);break;
case 3:revise_message(h);break;
case 0:break;
default:printf("输入有误!\n");
}
}
return h;
}
void inquire_name(struct student *p)  /*按姓名查询*/ 
{
char name[20];
struct student *f;
f=p;
system("cls");
printf("\n\n 请输入要查找的姓名:");
scanf("%s",name);
if(p==NULL)
{
printf("\n您要查找的学生不存在,请按任意键返回.\n");
getch(); 
}
else if(strcmp(p->name,name)!=0||p->name==NULL)
p=p->next;
system("cls");
printf("\n\n该生有关信息为:\n\n");
printf("\n\n==============通讯录信息表=============="); 
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n"); 
printf("-----------------------------------------------------------------------\n");
printf("%s %s %s %d-%d-%d %s %s\n",p->name,p->addr,p->tel,p->bir.y,p->bir.m,p->bir.d,p->yb,p->daxue);
printf("-----------------------------------------------------------------------\n\n"); 
p=f;
getch();
}
void inquire_tel(struct student *p)  /*按电话查询*/
{
char tel[20];
struct student *f;
f=p;
system("cls");
printf("\n 请输入要查找的电话:");
scanf("%s",tel);
if(p==NULL)
{
printf("NO");
system("pause");
}
else{
while(strcmp(p->tel,tel)!=0||p->tel==NULL)
p=p->next;
if(strcmp(p->tel,tel)==0)
{
system("cls");
printf("\n\n该生有关信息为:\n\n");
printf("\n\n==============通讯录信息表=============="); 
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n"); 
printf("-----------------------------------------------------------------------\n");
printf("%s %s %s %d-%d-%d %s %s\n",p->name,p->addr,p->tel,p->bir.y,p->bir.m,p->bir.d,p->yb,p->daxue);
printf("-----------------------------------------------------------------------\n\n"); 
p=f;
getch();
}
else
{
system("cls");
printf("您要查找的学生不存在,请按任意键返回.") ;
getch(); 
}}
}
void inquire_message(struct student *h)  /*查询模块*/
{
int choice=100;
while(choice!=0)
{
printf("\n************查询同学通讯信息************");
printf(" 1.按同学姓名查询:\n");
printf(" 2.按同学电话查询:\n");
printf(" 0.返回主菜单:\n");
printf(" 请选择(0-2):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:inquire_name(h);break;
case 2:inquire_tel(h);break;
case 0:break;
default:printf("无此类查询方式!\n");
}
}
}
void count_ad(struct student *p)  /*省份统计*/
{
int count=0;
char count_ad[20];
printf("\n 输入要统计的省份名称:\n"); 
scanf("%s",count_ad);
if(p==NULL)
{
printf("\n 该学生不存在!");
getch();
}
else
{
printf(" 在该省份的同学:\n");
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n");
printf("----------------------------------------------------\n");  
while(p!=NULL)
{
if(strcmp(p->addr,count_ad)==0)
{
printf("%s %s %s %d-%d-%d %s %s\n",p->name,p->addr,p->tel,p->bir.y,p->bir.m,p->bir.d,p->yb,p->daxue);
count++;
} p=p->next;
 
  }
  printf("在这个省份的同学共有%d个",count);
}
void count_birthday(struct student *p)  /*生日统计*/
{
int count=0;
int count_birthday_month;
printf(" 请输入要统计的月份:\n");
scanf("%d",&count_birthday_month);
if(p==NULL)
{
printf("\n 该学生不存在!");
getch();
}
else
{
printf(" 在这个月过生日的同学:记得祝贺他们生日快乐!\n");
printf("姓名=省份====电话=====生日(年-月-日)=邮编======大学\n");
printf("----------------------------------------------------\n");
while(p!=NULL)

if(p->bir.m==count_birthday_month)
{
printf("%s %s %s %d-%d-%d %s %s\n",p->name,p->addr,p->tel,p->bir.y,p->bir.m,p->bir.d,p->yb,p->daxue);
count++; 
}p=p->next;
}
}
printf("在这个月过生日的同学有%d个",count);
}
void count_message(struct student *h)  /*统计模块*/ 
{
int choice=100;
while(choice!=0)
{
printf("\n\n*************************统计同学通讯信息*************************\n");
printf(" 1.按省份统计信息;\n");
printf(" 2.按生日统计信息;\n");
printf(" 0.返回主菜单;\n");
printf(" 请选择(0-2):\n");
scanf("%d",&choice);
switch(choice)
{
case 1:count_ad(h);break;
case 2:count_birthday(h);break;
case 0:break;
default:printf("输入有误!\n");
}
}
}
main()
{
int b;
struct student *h=NULL;
h=read_message(h);
printf("输入任意键进入。\n");
getch();
do
{
system("cls");
printf("\n\n\n*************欢迎进入*************\n\n\n");
printf("**********学生通讯录管理系统**********\n\n"); 
printf("  ****  1输入学生信息  ****  \n\n");
printf("  ****  2输出学生信息  ****  \n\n");
printf("  ****  3更新学生信息  ****  \n\n");
printf("  ****  4查询学生信息  ****  \n\n");
printf("  ****  5统计学生信息  ****  \n\n");
printf("  ****  6保存信息  ****  \n\n");
printf("  ****  0退出系统  ****  \n\n");
printf("  ****  请选择(0~6) :  ****  \n\n"); 
scanf("%d",&b);
switch(b)
{
case 1: h=input_message(h); break;
case 2: output_message(h); break;
case 3: h=renew_message(h); break;
case 4: inquire_message(h); break;
case 5: count_message(h); break;
case 6: save_message(h); break;
case 0: break;
}
}while(b!=0);
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值