找了好多的文章,发现很多博主都不怎么走心啊,就把代码往这一放就走了,干脆我写篇高质量的吧
如果觉得我写的好记得给个赞哦
需求分析和总体设计小可爱们还是自己想把,我怎么可能给你们抄呢哈哈哈哈
题目要求:
设计一个学生证的管理程序。该程序具有以下功能:
(1)录入某位学生的学生证信息(学生证应该包括的内容请参看自己的学生证);
(2)给定学生的学号,修改该学生的学生证信息;
(3)给定学生的学号,删除该学生的学生证信息;
(4)根据输入的学生的学号,显示该学生的学生证信息;
(5)根据输入的班级的编号,显示该班所有学生的学生证信息;
(6)统计功能:提供一些统计各类信息的功能。
(7)一定要用链表和文件操作
起初想想应该随随便便一天就搞定的,但是写完链表操作后发现原来文件读写是个大大的坑,搞了好几个星期,今天终于搞定了。
正文开始:
流程设计:
总图:
1.读文档操作(这里最难了)
struct student *read_file(){
int i=0;
struct student *p1=NULL,*head=NULL,*p2=NULL;
FILE *fp;
fp = fopen("student.txt","r");
if(fp == NULL){
printf("+ 未发现存档 +\n");
return 0;}
while(!feof(fp)){
p1 = (struct student*)malloc(LEN);
if(fscanf(fp,"%d%d%d%s%s%s%s%s",&p1->idnum,&p1->cardnum,&p1->date,p1->school,p1->sex,&p1->major,&p1->iden,p1->name)>0)
/*这里我的保存格式是
18xxxxxxxx(10位)
xxxxx(5位)
20220630
数信
男
计算机
本科生
xx
18xxxxxxxxx(10位)…………
如果超过10位会报错!!!!!!!!!!!!!!!!!
*/
{
p1->next=NULL;
if(i==0) head=p1;
else p2->next=p1;
p2=p1;
i++;
}
}
fclose(fp);
printf("+ 读档成功 +\n");
return head;
}
2.录入学生信息
struct student *create(int n,struct student *file)
{
struct student *head=NULL,*p1=NULL,*p2=NULL,*p3=NULL;
int i;
if(file==NULL){
for(i=1;i<=n;i++)
{
p1=(struct student *)malloc(LEN);
printf("请输入你的学号:(去掉前面的20)"); scanf("%d",&p1->idnum);
printf("请输入你的卡号:"); scanf("%d",&p1->cardnum);
printf("请输入你的学生证有效期:(形如20220620)"); scanf("%d",&p1->date);
printf("请输入你的学院:(请输入全称,如:数学与信息学院)"); scanf("%s",&p1->school);
printf("请输入你的性别:(男或女)"); scanf("%s",&p1->sex);
printf("请输入你的专业:(请输入全称,如:计算机科学与技术)"); scanf("%s",&p1->major);
printf("请输入你的身份:(本科生或研究生)"); scanf("%s",&p1->iden);
printf("请输入你的名字:"); scanf("%s",&p1->name);
printf("\n");
p1->next=NULL;
if(i==1) head=p1;
else p2->next=p1;
p2=p1;
}
return(head);}//file==null 无误
else{
for(i=1;i<=n;i++){
p1=(struct student *)malloc(LEN);
printf("请输入你的学号:(去掉前面的20)"); scanf("%d",&p1->idnum);
printf("请输入你的卡号:"); scanf("%d",&p1->cardnum);
printf("请输入你的学生证有效期:(形如20220620)"); scanf("%d",&p1->date);
printf("请输入你的学院:(请输入全称,如:数学与信息学院)"); scanf("%s",&p1->school);
printf("请输入你的性别:(男或女)"); scanf("%s",&p1->sex);
printf("请输入你的专业:(请输入全称,如:计算机科学与技术)"); scanf("%s",&p1->major);
printf("请输入你的身份:(本科生或研究生)"); scanf("%s",&p1->iden);
printf("请输入你的名字:"); scanf("%s",&p1->name);
printf("\n");
p1->next==NULL;
if(i==1){
p3=file;
while(p3->next!=NULL) p3=p3->next;//p3是最后一个有数据节点
p3->next=p1;}
else p2->next=p1;
p2=p1;
}
return (file);
}
}
3.修改学生信息.
struct student *update(struct student *head,int idnum){
struct student *p1=head;
for(;p1!=NULL;p1=p1->next){
if(p1->idnum==idnum){
printf("请重新输入你的信息\n");
printf("请重新输入你的卡号:"); scanf("%d",&p1->cardnum);
printf("请重新输入你的学生证有效期:(形如20220620)"); scanf("%d",&p1->date);
printf("请重新输入你的学院:(请输入全称,如:数学与信息学院)"); scanf("%s",&p1->school);
printf("请重新输入你的性别:(男或女)"); scanf("%s",&p1->sex);
printf("请重新输入你的专业:(请输入全称,如:计算机科学与技术)"); scanf("%s",&p1->major);
printf("请重新输入你的身份:(本科生或研究生)"); scanf("%s",&p1->iden);
printf("请重新输入你的名字:"); scanf("%s",&p1->name);
printf("\n");}}
return head;}
4.删除学生信息
struct student *delet(struct student *head,int idnum){
struct student *p1=head;
for(;p1!=NULL;p1=p1->next){
if(p1->next->idnum==idnum) p1->next=p1->next->next;}
return head;}
5.查看学生信息
void check(int idnum,struct student *head){
struct student *p1=head;
for(;p1!=NULL;p1=p1->next){
if(p1->idnum==idnum){
printf("你的信息:");
printf("卡号:%d\n",p1->cardnum);
printf("学生证有效期:%d\n",p1->date);
printf("学院:%s\n",p1->school);
printf("性别:%s\n",p1->sex);
printf("专业:%s\n",p1->major);
printf("身份:%s\n",p1->iden);
printf("名字:%s\n",p1->name);
printf("\n");
break;}
if(p1->next==NULL) printf("输入的学生学号不存在\n");
printf("\n");}}
6.查看全班同学信息
void classroom(int classnum,struct student *head){
struct student *p1=head;
for(;p1!=NULL;p1=p1->next){
if((p1->idnum-000000-classnum*100)<40&&(p1->idnum-00000-classnum*100)>0){
//一个班40人左右,自己掂量掂量怎么设计数字
printf("学号:%d\n",p1->idnum);
printf("卡号:%d\n",p1->cardnum);
printf("学生证有效期:%d\n",p1->date);
printf("学院:%s\n",p1->school);
printf("性别:%s\n",p1->sex);
printf("专业:%s\n",p1->major);
printf("身份:%s\n",p1->iden);
printf("名字:%s\n",p1->name);
printf("\n"); }}}
7.统计各班男女数量
void count(int classnum,struct student *head){
int man=0,woman=0;
struct student *p1=head;
for(;p1!=NULL;p1=p1->next){
if((p1->idnum-0000-classnum*100)<40&&(p1->idnum-0000-classnum*100)>0){
//一个班40人左右,自己掂量掂量怎么设计数字
if(strcmp(p1->sex,"男")==0) man++;
else woman++;}}
printf("你们班的女生数为%d\n",woman);
printf("你们班的男生数为%d\n",man);
printf("你们班的人数为%d\n",man+woman);}
8.刷新文档(真是大坑)
void write_file(struct student*head){
struct student *p=head;
FILE *fp;
if((fp=fopen("student.txt","w"))==NULL) return 0;
while(p!=NULL){
fprintf(fp,"%d\n%d\n%d\n%s\n%s\n%s\n%s\n%s\n",p->idnum,p->cardnum,p->date,p->school,p->sex,p->major,p->iden,p->name);
p=p->next;}
fclose(fp);
}
主体代码:
#include "stdio.h"
#include"linkchange.h"//链表操作
#include"filerw.h"//文档读写
#include"count.h"
#include <windows.h> //用来写sleep的
main(){
int choice=0,n,idnum,classnum;
struct student *head;
printf("+ 读档中......... +\n");
Sleep(2000); //有没有觉得骚气十足,假装加载文档需要时间
head=read_file();
if(head==NULL)
printf(" 文档中没有学生信息!! \n");
while(1){
printf("+=================================================+\n");
printf("+ 学生证管理系统 +\n");
printf("+=================================================+\n");
printf("+1.录入学生信息 + 2.修改学生信息 +\n");
printf ("+------------------------------------------------+\n");
printf("+3.删除学生信息 + 4.查看个人学生信息 +\n");
printf ("+------------------------------------------------+\n");
printf("+5.查看全班学生信息 + 6.统计各班男女数量 +\n");
printf("+=================================================+\n");
printf("+ +0.保存操作并退出 +\n");
printf("+=================================================+\n");
printf("输入您的功能选项序号:\n");
scanf("%d",&choice);
if(choice==1){
printf("请选择要录入信息的学生人数:\n");
scanf("%d",&n);
head=create(n,head);}
if(choice==2){
printf("请输入要修改的学生的学号:");
scanf("%d",&idnum);
head=update(head,idnum);}
if(choice==3){
printf("请输入要删除的学生的学号:");
scanf("%d",&idnum);
head=delet(head,idnum);}
if(choice==4){
printf("请输入要查看信息的学生的学号:");
scanf("%d",&idnum);
check(idnum,head); }
if(choice==5){
printf("请输入要查看信息的班别(1班表示为 1):");
scanf("%d",&classnum);
classroom(classnum,head);}
if(choice==6){
printf("请输入要查看信息的班别(1班表示为 1):");
scanf("%d",&classnum);
count(classnum,head);}
if(choice==0){
write_file(head);
break;}
}
}
**
有人可能会问了:那3个头文件是啥,没错,是我的装x代码 把函数写进头文件里了
分别是链表操作,文件操作,统计
(快看我另一篇文章,分享装x经历)
**
界面设计:
(1)功能选择界面设计
考虑到操作者需要简单易懂的菜单界面,故把初始界面设计为下图所示样貌。
(2)二级界面
二级界面就是菜单选择后的界面,界面太多,不一一写进来,拿一个有代表性的例子出来。