一、总体介绍
(1)录入出入校园人员信息
提示用户按一定格式以及需要输入的各项信息。
(2)保存出入校园人员信息
将人员信息存入文件,并提示保存是否成功。
(3)浏览出入校园人员信息 在屏幕上显示所有出入校园人员信息,并注意将各项数据对齐,若无信息,则给出
相关提示。
(4)查询出入校园人员信息
提示用户可分别按照人员身份、姓名、出/入校进行信息查询,并根据用户提供的 选择进行查询结果显示,下图仅供参考。
(5)增加出入校园人员信息 提示用户按一定格式输入要增加的出入校园人员信息,并提示是否添加成功。 (6)删除出入校园人员信息 提示用户输入姓名、身份证号、出/入校、出/入校时间,根据输入确定要删除的人
员信息,若没有该人员信息,则提示系统没有该人员信息;如有,先输入该人员的全部
信息,后提示用户是否确认删除该数据 y/n? 输入 y 后则删除人员信息,并提示相应信 息。下图仅供参考。
(7)修改出入校园人员信息
提示用户输入姓名、身份证号、出/入校、出/入校时间,根据输入确定要修改的人 员信息,若没有该人员信息,则提示系统没有该人员信息;若有,则先输出该人员的全 部信息,并询问用户修改哪项信息,选择后,输入新信息,并提示用户确实要修改吗 y/n?输入 y 后则修改人员信息。下图仅供参考。
注意:对于增加、删除、修改的人员信息均需更新保存至文件中,并提示保存是否 成功。
(8)统计出入校园人员信息
提示用户输入需要统计的出校信息或入校信息,输入 0 或 1,然后对出校或入校人 员信息进行统计,按人员身份进行统计人数,并输出统计结果以及统计的所有人员信 息。下图仅供参考。
(9)按出入校园人员信息进行排序 按姓名对出入校园人员信息进行升序显示,同名人员按入校时间进行升序显示。 (10)退出
提示用户是否退出该系统。
2. 程序设计要求 (1)要合理使用枚举、结构体、结构体数组、结构体指针访问数组。 (2)逻辑独立的功能定义在函数中,并利用指针进行参数传递。 (3)要有合理提示,例如修改、删除需提示确认。 (4)考虑程序鲁棒性,对不合法数据要有错误处理机制。 (5)所有数据保存在文件中。
显示数据的时候做了一下优化,入校/出校不是显示的0/1,而是直接用中文显示的,看着更直观。
运行结果:
(1)
(2)
(3)
(4)
(5)
(6)
(7)
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OUT_SCHOOL (int)0
#define IN_SCHOOL (int)1
//身份类型
enum eType
{
e_student=1,
e_teacher=2,
e_other
};
//日期
typedef struct _date
{
int y,m,d;
}Date;
typedef struct _person
{
eType type;//人员身份
char name[20];//姓名
char id[10];//编号 不能超过9位数
char phone[12];//联系方式
char sfz[20];//身份证号
int op; //出/入校
Date time;
}Person;
void save(Person ps[],int n);//先声明一下
int menu()
{
int op;
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("---------7.修改出入校园人员信息-------------------\n");
printf("---------8.统计出入校园人员信息-------------------\n");
printf("---------9.对出入校园人员信息进行排序-------------\n");
printf("---------10.退出----------------------------------\n");
printf("--------------------------------------------------\n");
printf("*****************谢谢使用*************************\n");
printf("请选择(1-10): ");
scanf("%d",&op);
return op;
}
//1.录入信息
int input(Person ps[],int n)
{
int flag = 0;
int t;
while(1)
{
system("cls");//清屏
while(1)
{
printf("请输入人员身份(1.学生 2.教职工 3.其他):");
scanf("%d",&t);
if(t == 1)
{
ps[n].type = e_student;
printf("请输入学号:");
scanf("%s",ps[n].id);
break;
}else if(t == 2)
{
ps[n].type = e_teacher;
printf("请输入教职工号:");
scanf("%s",ps[n].id);
break;
}else if(t == 3)
{
ps[n].type = e_other;
ps[n].id[0] = 0;
break;
}else
printf("输入错误!");
}
printf("请输入姓名:");
scanf("%s",ps[n].name);
printf("请输入联系方式:");
scanf("%s",ps[n].phone);
printf("请输入身份证号:");
scanf("%s",ps[n].sfz);
printf("0.出校 1.入校:");
scanf("%d",&ps[n].op);
if(ps[n].op == OUT_SCHOOL)
printf("请输入离校时间(YYYY/MM/DD):");
else
printf("请输入入校时间(YYYY/MM/DD):");
scanf("%d/%d/%d",&ps[n].time.y,&ps[n].time.m,&ps[n].time.d);
printf("录入成功!\n");
n++;
while(1)
{
printf("是否继续录入(1.是 0.否):");
scanf("%d",&flag);
if(flag == 0 || flag == 1)
break;
}
if(flag == 0)
break;
}
save(ps,n); //保存信息
return n;
}
//2.保存
void save(Person ps[],int n)
{
FILE* fp = fopen("data.txt","w");
//system("cls");//清屏
for(int i = 0;i<n;i++)
{
if(ps[i].type == e_student)
fprintf(fp,"1 %s %s %s %s %d %d %d %d\n",ps[i].name,ps[i].id,ps[i].phone,ps[i].sfz,ps[i].op,ps[i].time.y,ps[i].time.m,ps[i].time.d);
else if(ps[i].type == e_teacher)
fprintf(fp,"2 %s %s %s %s %d %d %d %d\n",ps[i].name,ps[i].id,ps[i].phone,ps[i].sfz,ps[i].op,ps[i].time.y,ps[i].time.m,ps[i].time.d);
else
fprintf(fp,"1 %s %s %s %s %d %d %d %d\n",ps[i].name,"无",ps[i].phone,ps[i].sfz,ps[i].op,ps[i].time.y,ps[i].time.m,ps[i].time.d);
}
fclose(fp);
printf("数据已保存到data.txt中!\n");
system("pause");
}
//显示单条信息
void showSingle(Person ps)
{
if(ps.type == e_student)
{
if(ps.op == OUT_SCHOOL)
printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","学生",ps.name,ps.id,ps.phone,ps.sfz,"出校",ps.time.y,ps.time.m,ps.time.d);
else
printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","学生",ps.name,ps.id,ps.phone,ps.sfz,"入校",ps.time.y,ps.time.m,ps.time.d);
}
else if(ps.type == e_teacher)
{
if(ps.op == OUT_SCHOOL)
printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","教职工",ps.name,ps.id,ps.phone,ps.sfz,"出校",ps.time.y,ps.time.m,ps.time.d);
else
printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","教职工",ps.name,ps.id,ps.phone,ps.sfz,"入校",ps.time.y,ps.time.m,ps.time.d);
}else
{
if(ps.op == OUT_SCHOOL)
printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","其他",ps.name,"无",ps.phone,ps.sfz,"出校",ps.time.y,ps.time.m,ps.time.d);
else
printf("%-6s %-10s %-9s %s %s %s %d/%d/%d\n","其他",ps.name,"无",ps.phone,ps.sfz,"入校",ps.time.y,ps.time.m,ps.time.d);
}
}
//3.浏览
void show(Person ps[],int n)
{
system("cls");//清屏
for(int i = 0;i<n;i++)
{
showSingle(ps[i]);
}
system("pause");
}
//4.查询
void search(Person ps[],int n)
{
int i,t;
int op;
char sel;
char tmp[20];
int flag = 0;
while(1) //多次操作
{
system("cls");
flag = 0;
rewind(stdin);
printf("A.按人员身份查询\n");
printf("B.按姓名查询\n");
printf("C.按出/入校查询\n");
printf("D.退出\n");
printf("请选择(A-D):");
sel = getchar();
getchar();
switch(sel)
{
case 'A':
printf("请输入人员身份(1.学生 2.教职工 3.其他):");
scanf("%d",&t);
for(i=0;i<n;i++)
{
if(ps[i].type == t)
{
flag = 1;
showSingle(ps[i]);
}
}
if(flag == 0)
printf("未找到符合条件的人员信息\n");
break;
case 'B':
printf("请输入人员姓名:");
scanf("%s",tmp);
for(i=0;i<n;i++)
{
if(strcmp(ps[i].name,tmp) == 0)
{
flag = 1;
showSingle(ps[i]);
}
}
if(flag == 0)
printf("未找到符合条件的人员信息\n");
break;
case 'C':
printf("1.出校 2.入校 \n请选择:");
scanf("%d",&op);
for(i=0;i<n;i++)
{
if(ps[i].op == op)
{
flag = 1;
showSingle(ps[i]);
}
}
if(flag == 0)
printf("未找到符合条件的人员信息\n");
break;
case 'D':
return ;
}
system("pause");
}
}
//5.增加人员信息,input函数中可以修改信息数量,所以这个功能,直接调用input函数即可
int add(Person ps[],int n)
{
return input(ps,n);
}
//6.删除
int del(Person ps[],int n)
{
int i,j;
char name[20],sfz[20];
int op;
int y,m,d;
char ch;
system("cls");//清屏
rewind(stdin);//清空输入缓存
printf("输入姓名、身份证号、出/入校、出/入校时间: ");
scanf("%s %s %d %d/%d/%d",name,sfz,&op,&y,&m,&d);
for(i=0;i<n;i++)
{
if(strcmp(ps[i].name,name)==0 && strcmp(ps[i].sfz,sfz)==0 && ps[i].op==op && ps[i].time.y ==y && ps[i].time.m ==m && ps[i].time.d ==d)
{
showSingle(ps[i]);
break;
}
}
if(i==n)
{
printf("没有该人员信息\n");
system("pause");
}
else
{
while(1)
{
printf("确认删除(y/n)? ");
rewind(stdin);
ch = getchar();
if(ch =='y' || ch=='Y')
{
for(j=i;j<n-1;j++)
ps[j] = ps[j+1];
printf("删除成功!\n");
n--;
break;
}
}
save(ps,n);
}
return n;
}
//7.修改
void change(Person ps[],int n)
{
int i,j,t;
char name[20],sfz[20];
int op;
int y,m,d;
char ch;
system("cls");//清屏
rewind(stdin);//清空输入缓存
printf("输入姓名、身份证号、出/入校、出/入校时间: ");
scanf("%s %s %d %d/%d/%d",name,sfz,&op,&y,&m,&d);
for(i=0;i<n;i++)
{
if(strcmp(ps[i].name,name)==0 && strcmp(ps[i].sfz,sfz)==0 && ps[i].op==op && ps[i].time.y ==y && ps[i].time.m ==m && ps[i].time.d ==d)
{
showSingle(ps[i]);
break;
}
}
if(i==n)
{
printf("没有该人员信息\n");
system("pause");
}
else
{
rewind(stdin);
while(1)
{
printf("是否修改身份类型(y/n):");
ch = getchar(); getchar();
if(ch =='y' || ch=='Y')
{
printf("请输入人员身份(1.学生 2.教职工 3.其他):");
scanf("%d",&t);
if(t==1)
ps[i].type = e_student;
else if(t==2)
ps[i].type = e_teacher;
else if(t == 3)
ps[i].type = e_other;
break;
}
}
rewind(stdin);
printf("是否修改姓名(y/n):");
ch = getchar(); getchar();
if(ch =='y' || ch=='Y')
{
printf("请输入姓名:");
scanf("%s",ps[i].name);
}
rewind(stdin);
if(ps[i].type == e_student)
{
printf("是否修改学号(y/n):");
ch = getchar(); getchar();
if(ch =='y' || ch=='Y')
{
printf("请输入学号:");
scanf("%s",ps[i].id);
}
}else if(ps[i].type == e_teacher)
{
printf("是否修改教职工编号(y/n):");
ch = getchar(); getchar();
if(ch =='y' || ch=='Y')
{
printf("请输入教职工编号:");
scanf("%s",ps[i].id);
}
}
rewind(stdin);
printf("是否修改联系方式(y/n):");
ch = getchar(); getchar();
if(ch =='y' || ch=='Y')
{
printf("请输入联系方式:");
scanf("%s",ps[i].phone);
}
rewind(stdin);
printf("是否修改身份证号(y/n):");
ch = getchar(); getchar();
if(ch =='y' || ch=='Y')
{
printf("请输入身份证号:");
scanf("%s",ps[i].sfz);
}
rewind(stdin);
printf("是否修改出/入校(y/n):");
ch = getchar(); getchar();
if(ch =='y' || ch=='Y')
{
printf("请输入0.出校 / 1.入校:");
scanf("%d",&ps[i].op);
}
rewind(stdin);
printf("是否修改出/入校时间(y/n):");
ch = getchar(); getchar();
if(ch =='y' || ch=='Y')
{
printf("请输入出入校时间(YYYY/MM/DD):");
scanf("%d/%d/%d",&ps[i].time.y,&ps[i].time.m,&ps[i].time.d);
}
printf("修改成功!\n");
save(ps,n);
}
}
//统计
void tongji(Person ps[],int n)
{
int i;
int a[3]={0};
int op;
system("cls");
printf("输入0.出校 1.入校:");
scanf("%d",&op);
for(i=0;i<n;i++)
{
if(ps[i].op == op)
{
if(ps[i].type == e_student)
a[0]++;
else if(ps[i].type == e_teacher)
a[1]++;
else if(ps[i].type == e_other)
a[2]++;
}
}
if(op == OUT_SCHOOL)
printf("出校统计结果: ");
else
printf("入校统计结果: ");
printf("学生%d人,教职工%d人,其他人%d人\n",a[0],a[1],a[2]);
for(i=0;i<n;i++)
{
if(ps[i].op == op)
{
showSingle(ps[i]);
}
}
system("pause");
}
//比较时间
int cmp(Date d1,Date d2)
{
if(d1.y < d2.y)
return -1;
else if(d1.y > d2.y)
return 1;
else
{
if(d1.m < d2.m)
return -1;
else if(d1.m > d2.m)
return 1;
else
{
if(d1.d < d2.d)
return -1;
else if(d1.d > d2.d)
return 1;
else
return 0;
}
}
}
//9.排序
void sortByName(Person ps[],int n)
{
int i,j;
Person t;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(strcmp(ps[j].name,ps[j+1].name)> 0)
{
t = ps[j];
ps[j] = ps[j+1];
ps[j+1] = t;
}else if(strcmp(ps[j].name,ps[j+1].name)== 0)
{
if(ps[j].op == IN_SCHOOL && ps[j+1].op == IN_SCHOOL)
{
//按入校时间排序
if(cmp(ps[j].time,ps[j+1].time) > 0)
{
t = ps[j];
ps[j] = ps[j+1];
ps[j+1] = t;
}
}
}
}
}
printf("排序后:\n");
show(ps,n);
}
int main()
{
int op;
Person ps[500]; //保存所有信息
int n = 0; //信息条数
while(1)
{
op = menu();
switch(op)
{
case 1: n = input(ps,n);break;//录入
case 2: save(ps,n); break;//保存
case 3: show(ps,n);break;//浏览
case 4: search(ps,n);break;//查询
case 5: n = add(ps,n);break;//增加
case 6: n = del(ps,n);break;//删除
case 7: change(ps,n);break;//修改
case 8: tongji(ps,n);break;//统计
case 9:sortByName(ps,n);break;//排序
case 10:return 0;//退出
}
}
return 0;
}
这多
没个大几百行代码怕是搞不下来哦
有时间限制没有啊???
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!基于c语言的校园外来人员进出监控与管理系统
如有帮助,望采纳
#pragma once
#include<stdio.h>
#include<Windows.h>
#include<conio.h>
#include<time.h>
#include<string.h>
#define N 10 //代表最多的管理员数量
#define M 300 //容纳的最多的申请
//申请人或领队人信息: 缺少的信息统一为 -1 或‘N'
typedef struct
{
int is_team;//判断是否是团队入校:0---个人,1---团队
char name[20];//姓名
int sex;//性别:男---1,女---0
char telephone[20];//联系电话
char id_number[30];//身份证号
char work[50];//工作单位
int car_number[10];//车牌信息
char surety_name[20];//担保人姓名
char surety_phone[20];//担保人电话
int health_code;//健康码:绿码---1,黄码---2,紫码---3,红码---4
int health_cough;//是否身体有咳嗽发热: 有---1,无---0
int in_danger_area;//是否在14天内到过疫区: 有---1,无---0
char apply_in_time[20];//申请进入时间:格式为:2021/06/03/05/30或2021/06/03/12/50
char apply_out_time[20];//申请出校时间
char reason[30];//进校事由
int apply_result;//申请是否通过:通过---1,驳回---0,未审批---2
char real_in_time[20];//实际进入时间
char real_out_time[20];//实际出校时间
}Guest;
//管理员信息
typedef struct
{
char user_name[30];//账号
char password[30];//密码
}Admin;
void gotoxy(int, int);//将光标移动到指定位置
void hide();//隐藏光标
int menu();//菜单
void about();//介绍该系统
void administrator();//管理员登录
void guest();//访客登录
void write();//申请数据存盘
void read();//读取申请数据
//访客的功能函数
void request();//提出申请
void record_in();//记录进入时间
void record_out();//记录出校时间
void autoapprove();//自动审批
//管理员的功能函数
int check();//管理员登录验证
void add();//增加管理员
void seek();//查询界面
void approve();//审批
void data_seek();//按照日期查询
void info_seek();//按照人员信息查询
void name_seek();//按照申请人姓名查询
void id_seek();//申请人身份证号查询
void sex_seek();//申请人性别查询
void surety_seek();//担保人姓名查询
void telephone_seek();//申请人电话查询
void team_seek();//团队查询