学生证管理程序
题目描述:
请设计一个学生证管理的程序,以方便辅导员对学生证的管理,该程序应该具有以下功能:
(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);
}