【C语言】简单的学生证管理程序

本文档介绍了一款使用C语言设计的学生证管理程序,包括录入、修改、删除学生信息,按学号查询,按班级显示信息及统计功能。程序采用链表存储,实现文件读写操作,并通过菜单式交互提供友好的用户界面。在答辩后,提出了增加排序、录入确认、修改确认和随时退出等功能的改进建议。
摘要由CSDN通过智能技术生成


*大一下高程的课设
只能使用C语言
尽管还有许多不足,还是在这里存一下叭!

题目描述

设计一个学生证的管理程序。该程序具有以下功能:
(1)录入某位学生的学生证信息(学生证应该包括的内容请参看自己的学生证);
(2)给定学生的学号,修改该学生的学生证信息;
(3)给定学生的学号,删除该学生的学生证信息;
(4)根据输入的学生的学号,显示该学生的学生证信息;
(5)根据输入的班级的编号,显示该班所有学生的学生证信息;
(6)统计功能:提供一些统计各类信息的功能。

题目要求

(1)按照分析、设计、编码、调试和测试过程完成应用程序;
(2)学习并使用流程图等工具,并在撰写报告中使用;
(3)程序的各项功能在程序运行时,以菜单方式选择并执行;
(4)要求用户输入数据时,要给出清晰、明确的提示,包括:输入数据的内容、格式及结束方式等
(5)所有的信息存储在一个文件或多个中,并实现文件读写操作。
(6)程序中用链表存放学生证信息并实现增删减功能。(必须)

整体结构图

在这里插入图片描述

流程图

在这里插入图片描述

个人想法

其实做这个程序还是比较水的,没有太多的思考,只顾着主要功能(想尽快完成:-P)。比较特别的(?)大概就是除了必要实现的功能以外,考虑到了修改后必须要保存的情况,为了提高友好性,在答辩前临时添加了一个保存提示(在退出管理模块/本程序的时候,若已进行了信息修改而未保存,将提示保存),此外每个功能也有继续操作等比较友好的设置。统计功能也尽量想了很多。

不足

答辩后老师提出的几点可以改进的地方:

  • 排序功能(完完全全没考虑到啊!!)
  • 录入完毕后显示信息进行确认
  • 修改时的确认(防止修改错误)
  • 录入时的随时退出

代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct node
{
   
    char name[20];//姓名
    char sex[10];//性别
    long long num;//学号
    char data[20];//入学日期
    int school_system;//学制(学习年限)
    char collge[50];//学院
    char major[50];//专业
    int cla;//班级
    char id[50];//身份证
    struct node *next; //链表指针域
}students;

//extern students* student_list;

students* student_list;

int save_flag;

int student_list_empty()
{
   
    return student_list->next == NULL;
}

//根据学号查找学生信息
students *search_student_info(long long num)
{
   
    students *stu;
    stu=student_list->next;
    while(stu&&stu->num!=num)
    {
   
        stu=stu->next;
    }
    return stu;
}

void menu1()
{
   
    printf("\n========主菜单=========\n|                     |\n");
    printf("|  1.管理学生证信息   |\n");
    printf("|                     |\n|  2.查询学生证信息   |\n");
    printf("|                     |\n|  3.统计学生证信息   |\n");
    printf("|                     |\n|   0.退出系统操作    |\n");
    printf("|                     |\n=======================\n\n");
}
void menu2()
{
   
    printf("\n========管理学生证信息=========\n\n");
    printf("       1.添加学生证信息\n");
    printf("\n       2.修改学生证信息\n");
    printf("\n       3.删除学生证信息\n");
    printf("\n       4.保存学生证信息\n");
    printf("\n        0.返回主菜单\n");
    printf("\n===============================\n\n");
}
void menu3()
{
   
    printf("\n========查询学生证信息=========\n\n");
    printf("     1.查询单个学生证信息\n");
    printf("\n   2.查询班级全部学生证信息\n");
    printf("\n        0.返回主菜单\n");
    printf("\n===============================\n\n");
}

void init()//初始化学生信息
{
   
    student_list=(students*)malloc(sizeof(students));
    student_list->next = NULL;
}

int input()//录入学生证信息
{
   
    int i=1;
    char ch;
    int f=0;
    system("cls");//清屏
    printf("\n=================================***录入须知***=================================\n");//给使用者备注录入要求,便于统一信息录入格式
    printf("\n1.请按要求输入学生的学生证信息\n2.学生入学日期以xxxx.xx.xx为格式(例如:2019.09.01)\n3.学生学制及所属班级只需输入数字即可(例如学生在1班,则只需输入1即可。)\n4.*切记!录入信息或更改信息后在退出本系统前要在主页面选择保存数据,否则本次操作数据将丢失!\n5.学院专业名称请统一输入标准全称,否则将影响数据统计!\n");
    do
    {
   
    printf("\n==============================================================================\n");
    printf("\n=======***开始录入学生证信息(若要返回菜单请输入0)***=======\n");
    printf("-------------------------------------------------------------------------------------\n");
        students *stu=(students*)malloc(sizeof(students));
    if(stu==NULL)
    {
   
        printf("内存分配失败\n");
        return 0;
    }
        printf("\n现在开始录入第%d个学生的学生证信息\n",i);
        printf("学生学号:\n");
        scanf("%lld",&stu->num);
        if(stu->num==0)return 0;
        if((search_student_info(stu->num))!=NULL)
        {
   
            printf("该学号已经存在学生信息表中!请重新输入。\n");
            continue;
        }
        printf("\n学生姓名:\n");
        scanf("%s",stu->name);
        //gets(stu->name);
        printf("\n学生性别:\n");
        scanf("%s",stu->sex);
        //gets(stu->sex);
        printf("\n学生入学日期:\n");
        scanf("%s",stu->data);
        //gets(stu->data);
        printf("\n学生学制:\n");
        scanf("%d",&stu->school_system);
        printf("\n学生所属学院:\n");
        scanf("%s",stu->collge);
        //gets(stu->collge);
        printf("\n学生所属专业:\n");
        scanf("%s",stu->major);
        //gets(stu->major);
        printf("\n学生所在班级:\n");
        scanf("%d",&stu->cla);
        printf("\n学生身份证号码:\n");
        scanf("%s",stu->id);
        //gets(stu->id);
        i++;
        stu->next=student_list->next;
        student_list->next=stu;
        printf("*****该学生的学生证信息已成功录入!*****\n");
        save_flag=0;
        printf("====*****是否继续录入学生证信息?*****====\n");
        printf("*是:请输入0          *否:请输入1\n");
        scanf("%d",&f);
    }
    while(!f);
    printf("\n**********%d个学生的学生证信息已成功录入!**********\n",i-1);
    //printf("\n=========按回车键返回菜单!===========\n");
    //getch();
    return 1;
}

int modify()//修改学生证信息
{
   
    int choice,f=0;
    long long modify_num;
    while(f==0)
    {
   
        system("cls");
        printf("======*****请输入要修改的学生学号(若要返回菜单请输入0)*****======\n");
        scanf("%lld",&modify_num);
        if(modify_num==0)return 0;
        students *stu = search_student_info(modify_num);
        if(stu!=NULL)
        {
   
            printf("\n\n--------------------当前学生信息---------------------\n\n");
            printf("学生姓名:\n");
            printf("%s\n",stu->name);
            printf("\n学生性别:\n");
            printf("%s\n",stu->sex);
            printf("\n学生学号:\n");
            printf("%lld\n",stu->num);
            printf("\n学生入学日期:\n");
            printf("%s\n",stu->data);
            printf("\n学生学制:\n");
            printf("%d\n",stu->school_system);
            printf("\n学生所属学院:\n");
            printf("%s\n",stu->collge);
            printf("\n学生所属专业:\n");
            printf("%s\n",stu->major);
            printf("\n学生所在班级:\n");
            printf("%d\n",stu->cla);
            printf("\n学生身份证号码:\n");
            printf("%s\n",stu->id);
            
设计一个学生证管理程序。该程序应该具有以下功能: (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();}
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值