《学生证管理系统》C语言链表版(附带图文讲解)

找了好多的文章,发现很多博主都不怎么走心啊,就把代码往这一放就走了,干脆我写篇高质量的吧
如果觉得我写的好记得给个赞哦
需求分析和总体设计小可爱们还是自己想把,我怎么可能给你们抄呢哈哈哈哈
题目要求:
设计一个学生证的管理程序。该程序具有以下功能:
(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)二级界面
二级界面就是菜单选择后的界面,界面太多,不一一写进来,拿一个有代表性的例子出来。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43249043/article/details/89304048
今日推荐