SCAU c语言程序设计课设/学生证管理程序

1、题目描述

   设计一个学生证的管理程序。该程序具有以下功能:

   (1)录入某位学生的学生证信息(学生证应该包括的内容请参看自己的学生证);

   (2)给定学生的学号,修改该学生的学生证信息;

   (3)给定学生的学号,删除该学生的学生证信息;

   (4)根据输入的学生的学号,显示该学生的学生证信息;

   (5)根据输入的班级的编号,显示该班所有学生的学生证信息;

   (6)统计功能:提供一些统计各类信息的功能。

2、题目要求

   (1)按照分析、设计、编码、调试和测试过程完成应用程序;

   (2)学习并使用流程图等工具,并在撰写报告中使用;

   (3)程序的各项功能在程序运行时,以菜单方式选择并执行;

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

   (5)所有的信息存储在一个文件或多个中,并实现文件读写操作。(必须)

   (6)程序中用链表存放学生证信息并实现增、删、改、查、排序等功能。(必须)3、提示

   (1)学生证信息可以设计一个结构体类型

 (2)自己构思并增加的除规定功能之外的新功能,酌情加分。(比如:更加友好的用户界面、信息显示能表格化、结合现实场景能充分考虑用户体验(操作简单便捷、功能丰富)等)。

最近刚课设答辩完,于是把代码放上来记录一下。

其他的没什么想说的

#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 idcard[ 20 ];//身份证号
    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' : changedata(); break;
            case '3' : deldata(); break;
            case '4' : showdata(); break;
            case '5' : showclass(); 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 );
        printf( "请输入性别(男或女):" );
        scanf( "%s", p -> sex );
        printf( "请输入完整学号:" );
        scanf( "%I64d", &p -> number );
        printf( "请输入入学时间(如20210901):" );
        scanf( "%d", &p -> date );
        printf( "请输入身份证号:" );
        scanf( "%s", p -> idcard );
        printf( "请输入所属学院:" );
        scanf( "%s", p -> xueyuan );
        printf( "请输入所属班级:" );
        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 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 );
                    printf( "请重新输入性别(男或女):" );
                    scanf( "%s", p -> sex );
                    printf( "请重新输入完整学号:" );
                    scanf( "%I64d", &p -> number );
                    printf( "请重新输入入学时间(如20210901):" );
                    scanf( "%d", &p -> date );
                    printf( "请重新输入身份证号:" );
                    scanf( "%s", p -> idcard );
                    printf( "请重新输入所属学院:" );
                    scanf( "%s", p -> xueyuan );
                    printf( "请重新输入所属班级:" );
                    scanf( "%s", p -> banji );
                    printf( "-------------------------------------------------\n" );
                }

                if( chose == '2' )
                {
                    system( "cls" );

                    printf( "-------------------------------------------------\n" );
                    printf( "按1重新输入姓名\n" );
                    printf( "按2重新输入性别(男或女)\n" );
                    printf( "按3重新输入完整学号\n" );
                    printf( "按4重新输入入学时间(如20210901)\n" );
                    printf( "按5重新输入身份证号\n" );
                    printf( "按6重新输入所属学院\n" );
                    printf( "按7重新输入所属班级\n" );
                    printf( "-------------------------------------------------\n" );

                    chose1 = getch();

                    switch( chose1 )
                    {
                        case '1' : printf( "请重新输入姓名:" ); scanf( "%s", p -> name ); break;
                        case '2' : printf( "请重新输入性别(男或女):" ); scanf( "%s", p -> sex ); break;
                        case '3' : printf( "请重新输入完整学号:" ); scanf( "%I64d",&p -> number );break;
                        case '4' : printf( "请重新输入入学时间(如20210901):" ); scanf( "%d", &p -> date ); break;
                        case '5' : printf( "请重新输入身份证号:" ); scanf( "%s",p -> idcard ); break;
                        case '6' : printf( "请重新输入所属学院:" ); scanf( "%s",p -> xueyuan ); break;
                        case '7' : printf( "请重新输入所属班级:" ); 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 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 -> idcard );
                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 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);
}

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 -> idcard );
                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();
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哀無

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值