学生证管理程序

学生证管理程序

题目描述:

请设计一个学生证管理的程序,以方便辅导员对学生证的管理,该程序应该具有以下功能:

(1)能从键盘输入某位学生的学生证信息(学生证应该包含的信息可以参考自己的学生证)。

(2)给定学号,显示该学生的学生证信息。

(3)给定班号,显示该班所有学生的学生证信息。

(4)给定学号,修改该学生的学生证信息。

(5)给定学号,删除该学生的学生证信息。

题目要求:

(1)按照分析、设计、编码、调试、测试的软件过程完成这个应用程序。

(2)学生证应该包含的信息参考自己的学生证。

(3)为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单项选择希望进行的操作项目。

输入要求:

    (1)应用程序运行后在屏幕上显示一个菜单。用户可以根据需求,选定相应的操作项目。进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。程序根据用户输入的信息完成相应的处理,实现要求的功能。

    (2)能对输入的数据进行简单的校验,例如,学生的入学时间必须是一个合法的日期格式,学号是唯一的(一个学号对应一条学生证信息)。

输出要求:

    (1)应用程序运行后,要在屏幕上显示一个菜单。

    (2)要求用户输入数据时,给出清晰、明确的提示信息,包括输入的数据内容、格式以及结束方式等。

(3)在程序完成处理后,要清楚地给出程序的处理结果。例如,在给定学号删除学生证信息时,如果该学生不存在,要提示没能删除,如果删除成功要提示删除成功。

实现要求:

    (1)在程序中使用链表存储学生证信息。

    (2)采用模块化程序设计的方法,将程序中的各项功能用函数实现。

提示:

    (1)使用结构体表示学生证信息,一个结点保存一条学生证信息。  

扩展功能:

    (1)提供一些统计功能。例如统计每个班学生的人数,统计男女生比例。

    (2)学生证信息从文件读入。

    (3)将学生证信息保存到文件中。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <conio.h>
 
 
typedef struct data//定义包含学生证信息的结构体
{
    char name[ 10 ];//姓名
    char sex[ 5 ];//性别
    long long number;//学号
    int date;//入学时间
    char xueyuan[ 50 ];//所属学院
    char banji[ 50 ];//所属班级
    struct data *next;
}STUDENT;
 
STUDENT *readf();
void adddata();
void savedata( STUDENT *p );
void changedata();
void showdata();
void deldata();
void redata();
void showclass();
void count();
 
 
int main()
{
    system( "cls" );
 
    STUDENT *head;
    char chose;
 
    printf( "-------------------------------------------------\n" );
    printf( "欢迎使用学生证管理程序!\n" );
    printf( "正在读取数据......\n" );
    printf( "-------------------------------------------------\n" );
    system( "PAUSE" );
 
    system( "cls" );
 
    head = readf();
 
    if( head == NULL )
    {
        system( "cls" );
 
        printf( "-------------------------------------------------\n" );
        printf( "目前文档中没有学生证信息!\n" );
        printf( "-------------------------------------------------\n" );
 
        system( "PAUSE" );
    }
 
    while( 1 )
    {
        system( "cls" );
 
        printf( "-------------------------------------------------\n" );
        printf( "请按下对应数字使用功能:\n" );
        printf( "1 输入学生证信息\n" );
        printf( "2 查询个人学生证信息\n" );
        printf( "3 查询班级学生证信息\n" );
        printf( "4 修改学生证信息\n" );
        printf( "5 删除学生证信息\n" );
        printf( "6 统计\n" );
        printf( "0 退出\n" );
        printf( "-------------------------------------------------\n" );
 
        chose = getch();
 
        switch( chose)
        {
            case '1' : adddata(); break;
            case '2' : showdata(); break;
            case '3' : showclass(); break;
            case '4' : changedata(); break;
            case '5' : deldata(); break;
            case '6' : count(); break;
            case '0' : exit( 0 ); break;
            default : break;
        }
    }
 
    return 0;
}
 
STUDENT *readf()//读取文件数据到链表
{
    STUDENT *head = NULL, *tail = NULL, *p = NULL;
    FILE *fp;
 
    fp = fopen( "StudentData.txt", "r" );
 
    if( fp == NULL )
    {
        return 0;
    }
 
    while( !feof( fp ) )
    {
        p = ( STUDENT* )malloc( sizeof( STUDENT ) );
 
        fread( p, sizeof( STUDENT ), 1, fp );
        p -> next = NULL;
 
        if( head == NULL )
        {
            head = p;
        }
        else
        {
            tail -> next = p;
        }
        tail = p;
    }
 
    fclose( fp );
 
    return head;
}
 
void adddata()//录入学生证信息
{
    while( 1 )
    {
        system("cls");
 
        char chose, chose1;
        int i = 0;
        STUDENT *p, *p1;
 
        p = ( STUDENT* )malloc( sizeof( STUDENT ) );
 
        printf("-------------------------------------------------\n");
        printf( "请输入姓名:" );
        scanf( "%s", p -> name );
        while(1)
        {
            printf("请输入性别(男或女): ");   
            scanf( "%s", p -> sex );
            if(strcmp(p -> sex,"男") != 0 && strcmp(p -> sex,"女") != 0)
            	printf("性别只能输入男或女,请重新输入\n");
            else
            	break;
        }
        printf( "请输入完整学号(如202062051):" );
        scanf( "%I64d", &p -> number );
        printf( "请输入入学时间(如20220901):" );
        scanf( "%d", &p -> date );
        printf( "请输入所属学院:" );
        scanf( "%s", p -> xueyuan );
        printf( "请输入所属班级(如计Z2001):" );
        scanf( "%s", p -> banji );
        printf("-------------------------------------------------\n");
 
        for( p1 = readf() ; p1 != NULL; p1 = p1 -> next )
        {
            if( p1 -> number == p -> number )
            {
                i = 1;
                printf( "该学号的学生证数据已存在!\n按1继续录入,按2修改数据,按0返回主页\n" );
                printf( "-------------------------------------------------\n" );
 
                chose1 = getch();
 
                if ( chose1 == '1' )
                {
                    adddata();
                }
                else if( chose1 == '2' )
                {
                    changedata();
                }
                else if( chose1 == '0' )
                {
                    main();
                }
            }
        }
 
        if( i == 0 )
        {
            savedata( p );//保存录入数据
 
            printf( "录入成功!按1继续录入,按0返回主页\n" );
            printf("-------------------------------------------------\n");
 
            chose = getch();
            if( chose == '1' )
            {
                continue;
            }
            else if( chose == '0' )
            {
                system( "cls" );
                main();
            }
        }
    }
}
 
void savedata( STUDENT *p )//保存操作
{
    FILE *fp;
    fp = fopen( "StudentData.txt", "a" );
 
    if( fp == NULL )
    {
        exit( 0 );
    }
    if( fwrite( p, sizeof( STUDENT ), 1, fp ) != 1 )
        {
            printf("保存失败\n");
        }
    fclose( fp );
}
 
void showdata()//显示查询的学生证信息
{
    while( 1 )
    {
        system( "cls" );
 
        STUDENT *p;
        int i = 0;
        long long num;
        char chose;
 
        p = readf();
 
        printf( "-------------------------------------------------\n" );
        printf( "请输入希望查询信息的学生证的学号:");
        scanf( "%I64d", &num );
        printf( "-------------------------------------------------\n" );
 
        for( ; p != NULL; p = p -> next )
        {
            if( p -> number == num )
            {
                i = 1;
                printf( "该生学生证信息:\n" );
                printf( "姓名:%s\n", p -> name );
                printf( "性别:%s\n", p -> sex );  
                printf( "学号:%I64d\n", p -> number );
                printf( "入学时间:%d\n", p -> date );
                printf( "所属学院:%s\n", p -> xueyuan );
                printf( "所属班级:%s\n", p -> banji );
                printf( "-------------------------------------------------\n" );
                break;
            }
        }
 
        if( i == 1 )
        {
            printf( "查询成功!\n按下1继续查询,按下0返回主页\n" );
            printf( "-------------------------------------------------\n" );
        }
        else
        {
            printf( "未找到该生信息!\n按下1继续查询,按下0返回主页\n" );
            printf( "-------------------------------------------------\n" );
        }
 
        chose = getch();
 
        if( chose == '1' )
        {
            continue;
        }
        else if( chose == '0' )
        {
            main();
        }
 
        printf( "\n" );
    }
}
 
void showclass()//显示班级学生证信息
{
    while( 1 )
    {
        system( "cls" );
 
        STUDENT *p;
        int i = 0;
        char banji[ 50 ];
        char chose;
 
        p = readf();
 
        printf( "-------------------------------------------------\n" );
        printf( "请输入希望查询信息的班级的名称:");
        scanf( "%s", banji );
        printf( "-------------------------------------------------\n" );
 
        for( ; p != NULL; p = p -> next )
        {
            if( strcmp( p -> banji, banji ) == 0 )
            {
                i = 1;
                printf( "姓名:%s\n", p -> name );
                printf( "性别:%s\n", p -> sex );
                printf( "学号:%I64d\n", p -> number );
                printf( "入学时间:%d\n", p -> date );
                printf( "所属学院:%s\n", p -> xueyuan );
                printf( "所属班级:%s\n", p -> banji );
                printf( "-------------------------------------------------\n" );
            }
        }
 
        if( i == 1 )
        {
            printf( "查询成功!\n按1继续查询,按0返回主页\n");
        }
        else if( i == 0 )
        {
            printf( "未找到该班级信息!\n按1继续查询,按0返回主页\n");
        }
 
        chose = getch();
 
        if( chose == '1' )
        {
            continue;
        }
        else if( chose == '0' )
        {
            main();
        }
    }
}
 
void count()
{
    while( 1 )
    {
        system( "cls" );
 
        STUDENT *p;
        char chose, chose1;
        char *boy = "男";
        char *girl = "女";
        char xueyuan[ 50 ];
        char banji[ 50 ];
        int bnum = 0, gnum = 0, xnum = 0, bjnum = 0;
 
        p =readf();
 
        printf( "-------------------------------------------------\n" );
        printf( "按1统计全部男生数量\n按2统计全部女生数量\n按3统计学院人数数量\n按4统计班级人数数量\n");
        printf( "-------------------------------------------------\n" );
 
        chose = getch();
 
        system( "cls" );
        printf( "-------------------------------------------------\n" );
 
        for( ; p != NULL; p = p -> next )
        {
            if( strcmp( p -> sex, boy ) == 0 )
            {
                bnum++;
            }
            else if( strcmp( p -> sex, girl ) == 0 )
            {
                gnum++;
            }
        }
 
        if( chose == '1' )
        {
            printf( "男生数量为:%d\n", bnum );
        }
        else if( chose == '2' )
        {
            printf( "女生数量为:%d\n", gnum );
        }
        else if( chose == '3' )
        {
            printf( "请输入希望统计人数的学院的名称:" );
            scanf( "%s", xueyuan );
            p = readf();
 
            for( ; p != NULL; p = p -> next )
            {
                if( strcmp( p -> xueyuan, xueyuan ) == 0 )
                {
                    xnum++;
                }
            }
 
            printf( "该学院人数为:%d\n", xnum );
        }
        else if( chose == '4' )
        {
            printf( "请输入希望统计人数的班级的名称:" );
            scanf( "%s", banji );
            p = readf();
 
            for( ; p != NULL; p = p -> next )
            {
                if( strcmp( p -> banji, banji ) == 0 )
                {
                    bjnum++;
                }
            }
 
            printf( "该班级人数为:%d\n", bjnum );
        }
 
        printf( "-------------------------------------------------\n" );
        printf( "统计成功!按下1继续统计,按下0返回主页\n");
        chose1 = getch();
 
        if( chose1 == '1' )
        {
            continue;
        }
        else if( chose1 == '0' )
        {
            main();
        }
    }
}
void changedata()//修改学生证信息
{
    while( 1 )
    {
        system( "cls" );
 
        int i = 0;
        long long num;
        char chose, chose1, chose2;
        STUDENT *p;
 
        p = readf();
 
        printf( "-------------------------------------------------\n" );
        printf( "请输入希望修改信息的学生证的学号:" );
        scanf( "%I64d", &num );
 
        redata();
 
        for( ; p != NULL ; p = p -> next )
        {
            if( p -> number == num )
            {
                i = 1;
 
                printf( "-------------------------------------------------\n" );
                printf( "按1修改该学生证全部信息\n按2修改该学生证部分信息\n" );
                printf( "-------------------------------------------------\n" );
                chose = getch();
 
                if( chose == '1' )
                {
                    system( "cls" );
 
                    printf( "-------------------------------------------------\n" );
                    printf( "请重新输入姓名:" );
                    scanf( "%s", p -> name );
                	while(1)
        			{
            			printf("请输入性别(男或女): ");   
            			scanf( "%s", p -> sex );
            			if(strcmp(p -> sex,"男") != 0 && strcmp(p -> sex,"女") != 0)
            				printf("性别只能输入男或女,请重新输入\n");
            			else
            				break;
        			}
                    printf( "请重新输入完整学号(如202062051):" );
                    scanf( "%I64d", &p -> number );
                    printf( "请重新输入入学时间(如20220901):" );
                    scanf( "%d", &p -> date );
                    printf( "请重新输入所属学院:" );
                    scanf( "%s", p -> xueyuan );
                    printf( "请重新输入所属班级(如计z2001):" );
                    scanf( "%s", p -> banji );
                    printf( "-------------------------------------------------\n" );
                }
 
                if( chose == '2' )
                {
                    system( "cls" );
 
                    printf( "-------------------------------------------------\n" );
                    printf( "按1重新输入姓名\n" );
                    printf( "按2重新输入性别(男或女)\n" );
                    printf( "按3重新输入完整学号(如202062051)\n" );
                    printf( "按4重新输入入学时间(如20220901)\n" );
                    printf( "按6重新输入所属学院\n" );
                    printf( "按7重新输入所属班级(如计z2001)\n" );
                    printf( "-------------------------------------------------\n" );
 
                    chose1 = getch();
 
                    switch( chose1 )
                    {
                        case '1' : printf( "请重新输入姓名:" ); scanf( "%s", p -> name ); break;
                        case '2' :                 
									while(1)
        							{
            							printf("请输入性别(男或女): ");   
            							scanf( "%s", p -> sex );
            							if(strcmp(p -> sex,"男") != 0 && strcmp(p -> sex,"女") != 0)
            								printf("性别只能输入男或女,请重新输入\n");
            							else
            								break;
        							}
                        case '3' : printf( "请重新输入完整学号(如202062051):" ); scanf( "%I64d",&p -> number );break;
                        case '4' : printf( "请重新输入入学时间(如20220901):" ); scanf( "%d", &p -> date ); break;
                        case '6' : printf( "请重新输入所属学院:" ); scanf( "%s",p -> xueyuan ); break;
                        case '7' : printf( "请重新输入所属班级(如计z2001):" ); scanf( "%s",p -> banji ); break;
                        default : break;
                    }
                }
            }
            savedata( p );
        }
 
        if( i == 1 )
        {
            printf( "修改成功!\n按下1继续修改,按下0返回主页\n");
            printf( "-------------------------------------------------\n" );
        }
        else
        {
            printf( "未找到该生信息!\n按下1继续修改,按下0返回主页\n");
            printf( "-------------------------------------------------\n" );
        }
 
        chose2 = getch();
 
        if( chose2 == '1' )
        {
            continue;
        }
        else if( chose2 == '0' )
        {
            main();
        }
    }
}

void deldata()//删除学生证信息
{
    while( 1 )
    {
        system( "cls" );
 
        STUDENT *p;
        long long num;
        char chose;
        int i = 0;
 
        p = readf();
 
        printf( "-------------------------------------------------\n" );
        printf( "请输入希望删除信息的学生证的学号:" );
        scanf( "%I64d", &num );
 
        redata();
 
        for( ; p != NULL; p = p -> next )
        {
            if( p -> number == num )
            {
                i = 1;
                p = p -> next;
            }
 
            if( p == NULL )
            {
                break;
            }
 
            savedata( p );
        }
 
        if( i == 1 )
        {
            printf( "-------------------------------------------------\n" );
            printf( "删除成功!\n按1继续删除,按0返回主页\n");
        }
        else if( i == 0 )
        {
            printf( "-------------------------------------------------\n" );
            printf( "未找到该生信息!\n按1继续删除,按0返回主页\n");
        }
 
        chose = getch();
 
        if( chose == '1' )
        {
            continue;
        }
        else if( chose == '0' )
        {
            main();
        }
    }
}
 
void redata()//刷新文档
{
    FILE *fp;
    fp = fopen( "StudentData.txt","w" );
    if( fp == NULL )
    {
        exit ( 0 );
    }
 
    fclose(fp);
}

设计一个学生证管理程序。该程序应该具有以下功能: (l)录入某位学生的学生证信息(学生证应该包含的位息参看自己的学生证); (2)给定学号,显示某位学生的学生证信息; (3)给定某个班级的班号,按学号由小到大显示该班所有学生的学生证信息; (4)给定某个班级的班号,按姓名的字典顺序显示该班所有学生的学生证信息; (5)给定某位学生的学号,修改该学生的学生证信息; (6)给定某位学生的学号,删除该学生的学生证信息。 题目要求: (1)按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序,即在程序中加入异常处理,检查用户输入数据的有效性,以保证程序的健壮性; (2)学生证应该包含的信息参看自己的学生证; (3)为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单选项选则所需进行的操作项目,菜单要界面友好、清晰; (4)将所有学生证信息存储在一个文件中,并实现文件的读写操作,即将输入的数据以文件的形式存盘,将原来已经存盘的文件读入内存,进行管理; (5)应保证测试用例测试程序的各种边缘情况。 输入要求: 应用程序运行后,在屏幕上显示一个菜单。用户可以根据需要,选定相应的操作项目。进入每个操作后,根据应用程序的提示信息,从键盘输入相应的信息。 输出要求: (1)应用程序运行后,在屏幕上显示一个菜单。 (2)要求用户输入数据时,要给出清晰、明确的提示信息,包括输入的数据内容、格式及结束方式等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值