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

这篇博客详细介绍了使用C语言和链表实现学生证管理系统的全过程,包括录入、修改、删除、查询学生信息,以及统计和文件操作。作者强调了文件读写是难点,并提供了流程设计和界面设计思路。
摘要由CSDN通过智能技术生成

找了好多的文章,发现很多博主都不怎么走心啊,就把代码往这一放就走了,干脆我写篇高质量的吧
如果觉得我写的好记得给个赞哦
需求分析和总体设计小可爱们还是自己想把,我怎么可能给你们抄呢哈哈哈哈
题目要求:
设计一个学生证的管理程序。该程序具有以下功能:
(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("请输入你的专业:(请输入全称,如:计算机科学与技术)")
  • 27
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
设计一个学生证的管理程序。该程序应该具有以下功能: (l)录入某位学生的学生证信息(学生证应该包含的位息请参看自己的学生证); (2)给定学号,显示某位学生的学生证信息; (3)给定某个班级的班号,按学号由小到大显示该班所有学生的学生证信息; (4)给定某个班级的班号,按姓名的字典顺序显示该班所有学生的学生证信息; (5)给定某位学生的学号,修改该学生的学生证信息; (6)给定某位学生的学号,删除该学生的学生证信息。 题目要求: (1)按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序,即在程序中加入异常处理,检查用户输入数据的有效性,以保证程序的健壮性; (2)学生证应该包含的信息请参看自己的学生证; (3)为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单选项选则所需进行的操作项目,菜单要界面友好、清晰; (4)将所有学生证信息存储在一个文件中,并实现文件的读写操作,即将输入的数据以文件的形式存盘,将原来已经存盘的文件读入内存,进行管理; (5)应保证测试用例测试程序的各种边缘情况。 输入要求: 应用程序运行后,在屏幕上显示一个菜单。用户可以根据需要,选定相应的操作项目。进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。 输出要求: (1)应用程序运行后,在屏幕上显示一个菜单。 (2)要求用户输入数据时,要给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等。
#include<stdio.h> #include<malloc.h> #include<string.h> #include<stdlib.h> #define STU struct student STU {long num; char name[20]; int sex; long classes; long birth; }; /***************************input****************************/ void input(int k,STU *st) {int n,i; FILE *fp; long b; STU student_1; printf("Please input your number[ ]\b\b\b\b\b\b\b"); scanf("%ld",&b); for(i=0;i<k;i++) if(st[i].num==b) {printf("\nThe school number is repeat!\n"); free(st);menu();} else {printf("\nPlease input your name[ ]\b\b\b\b\b\b\b\b\b"); scanf("%s",student_1.name); printf("\nPlease input you sex male(1) or female(2)[ ]\b\b\b\b\b\b\b"); scanf("%d",&student_1.sex); printf("\nPlease input you Class[ ]\b\b\b\b\b\b\b"); scanf("%ld",&student_1.classes); printf("\nPlease input you date of birth[ ]\b\b\b\b\b\b\b"); scanf("%ld",&student_1.birth); fp=fopen("student1.txt","ab"); if(!fp) {printf("Document error! "); exit(0);} else {fprintf(fp,"%ld%s%d%ld%ld",b,student_1.name,student_1.sex,student_1.classes,student_1.birth); printf("%ld%s%d%ld%ld",b,student_1.name,student_1.sex,student_1.classes,student_1.birth); n=k+1; rewind(fp); fprintf(fp,"%d",n); fclose(fp); free(st); menu();} }} /******************************inquiries********************************/ void inquiries(int k,STU *st) {int i,j=0,n,p,w; long a; do {printf("\n\t\t**************INQUIRIE MENU**************\n\n"); printf("\t\t\t1.Inquiries school number\n"); printf("\t\t\t2.Inquiries classes\n"); printf("\t\t\t3.Inquiries date of birth\n"); printf("\t\t\t4.Back to menu\n"); printf("\n\n\t\t******************************************\n"); printf("Choice your number(1-4)[ ]\b\b\b\b\b\b\b"); scanf("%d",&n); if(n<1&&n>4) {w=1;getchar();} else w=0; }while(w==1); switch(n) {case 1:j=0;printf("Please input your inquiries school number[ ]\b\b\b\b\b\b\b"); scanf("%ld",&a); for(i=0;i<k;i++) {if(st[i].num==a) {j=1;p++; printf("%ld%s%d%ld%ld",st[i].num,st[i].name,st[i].sex,st[i].classes,st[i].birth);} } if(!j) {printf("There is no this school number!");} else {printf("Success.There are %d student.",p);} inquiries(k,st);break; case 2:j=0;printf("Please input you class number[ ]\b\b\b\b\b\b\b"); scanf("%ld",&a); for(i=0;i<k;i++) {if(st[i].classes==a) {i=1;p++; printf("%d%s%d%d%ld",st[i].num,st[i].name,st[i].sex,st[i].classes,st[i].birth);} } if(!j) {printf("There is no this Class!");} else {printf("Success.There are %d student.",p);} inquiries(k,st);break; case 3:j=0; printf("Please input you date of birth[ ]\b\b\b\b\b\b\b"); scanf("%ld",&a); for(i=0;i<k;i++) {if(st[i].birth==a) {i=1;p++; printf("%d%s%d%d%ld",st[i].num,st[i].name,st[i].sex,st[i].classes,st[i].birth);} } if(!j) {printf("There is no this date of birth!");} else {printf("Success.There are %d student.",p);} inquiries(k,st);break; case 4:free(st);menu();break; } } /***************************change************************/ void change(int k,STU *st) {int a,i,n,w,j=0,p,q=0; FILE *fp; fp=fopen("student1","wb"); if(!fp) {printf("Document error! "); exit(0);} printf("Plese input you change number[ ]\b\b\b\b\b\b\b"); scanf("%ld",&a); for(i=0;i<k;i++) if(st[i].num==a) {j=1;p=i; do {printf("\n\t\t***************CHANGES MENU***************"); printf("\n\t\t\t1.Change Number"); printf("\n\t\t\t2.Change Name"); printf("\n\t\t\t3.Change Sex"); printf("\n\t\t\t4.Change classes"); printf("\n\t\t\t5.Change Date of birth"); printf("\n\t\t\t6.Back"); printf("\n\t\t***********************************************\n"); printf("\nChoice your number(1-6)[ ]\b\b\b\b\b\b\b"); scanf("%d",&n); if(n<1&&n>6) {w=1;getchar();}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值