《程序设计基础课程设计》题目(2013级)
1、内容简介
编写一个C语言程序,实现同学通讯录管理功能。其中:
1)至少能够管理50位同学的个人信息和通讯信息,个人信息和通讯信息需要有较强的纠错功能(重点考察)。
2)个人信息包括:学号(53开头的实际学号8位),姓名(至少可以保存4个汉字或8个英文字母),性别,年级班级(可选项,学号中包含相关信息),行政职务(班长、学委、无)。
3)通讯信息包括:主要手机号(11位),其它手机号(11位),邮箱(30个字符以内的字符串,必须包含一个且只包含一个@字符)。
注:存在重复手机号,即多位同学存储了相同的手机号;邮箱除@字符外其它格式不限定。
具体功能要求如下:
1)【增加】能够从多个文件(学生自己提前生成2个文件备用)中录入多位同学的相关信息(全部信息或部分信息),也能够随时增加1位新同学的相关信息(全部信息或部分信息)。需要考虑各种类型的不规范或错误数据(重点考察),尽可能考虑重复同学的处理(同一文件多次重复录入,录入文件中同学与系统已有同学重复,增加同学与系统已有同学重复)。
2)【修改】能够随时修改1位同学的相关信息,包括:对已录入的信息进行修改或删除、对未录入的信息进行添加。
3)【删除】能够随时删除1位同学的所有信息。
4)【存储】能够将当前系统中的所有信息保存到文件中。
5)【某位同学信息】能够打印某位同学(按照姓名或手机号查找)的所有相关信息。
6)【某个班级信息】能够按照学号顺序打印某班同学的所有相关信息(可选)。
7)【班级干部信息】能够输出所有班级干部的相关信息,要求用链表实现(重点考察)。
8)【全部信息】能够按照学号顺序打印系统中所有同学的信息。
9)【关联信息】能够打印所有包含相同手机号的同学信息,要求用链表实现(重点考察)。
10)【其它功能】你认为有用的附加功能,可酌情添加。
2、课程设计要求
按照指导教师的要求进行分组和任务分工,完成指定任务。具体要求如下:
1)保证出勤和纪律,服从指导教师的安排。
2)每组不超过3人,每组提交1份实验报告,明确标明成员的任务分工和完成情况。
3)所提交的C语言源程序需要含有必要的代码注释和1份独立的程序说明文档。
4)指导教师按照平时考核、代码和实验报告质量、任务分工和完成比例、界面美观和人性化、个人和团队答辩情况等环节综合评定最终成绩。
3、成绩说明
五分制:优秀15%-20%,良好35%-40%;中等25%-30%;及格和不及格10%-15%。
迟到/早退1次,最高成绩为良好;
旷课1次,或迟到/早退2次,最高成绩为中等;
旷课1次且迟到/早退1次,或迟到/早退3次,最高成绩为及格;
旷课2次,或旷课1次且迟到/早退2次,或迟到/早退4次,取消答辩资格。
4、参考测试示例
学号:53开头的8位,8位但非53开头,8位含有其它非数字符号,不足8位,超过8位。
姓名:汉语、英文,过长(如20个字符),其它特殊字符。
性别:男,女,不详。
年级班级:各种表示形式均可,1个或2个字段,但建议数字形式便于输入和存储。
行政职务:至少包含班长、学委,也可扩展其它职务。
手机号:符合常识,138-0431-0519(多2个-),13804310519(正确),0013804310519(多前导0),138 05190159(多个空格),1380519051(少1位)。
邮箱:一个字符串(不含@),含有@(正确),一个字符串(含有2个@)。
/*********************************************************************************************************************************************************************************/
操作附图
1.第一次登陆:
2.选择添加信息.
3.添加信息
4.转到初始功能选择界面
5.查询服务界面(这里选择5 ---全部查询)
6.查询结果:
7.修改服务:
8.修改年级:
9.单人信息查询:
10..删除服务:
11.密码服务:
12.重新登录时验证密码:
/**********************************************************************************************************************************************************************************/
完成代码如下:
#include <cstdio>
#include <cstring>
#include <windows.h>
typedef long long ll;//由于VC6不支持long long 在使用VC时把 long long 改成 int64
struct student
{
//个人信息
int id;
char name[10];
int sex;// 1男 2女 0未知
int Grade,Class;
int Duty;// 0无 1班长 2学委
//通讯信息
ll phone1,phone2;//电话 这里用ll 是因为电话号有11位
char email[35];
};
/*********************主要函数声明************************/
int Load(char *inf,student *p);//从文件中读取信息并储存在p中
int Add(int x,int y,student *p);//添加 返回添加的人数
int Change(int x,int y,student *p);//修改(在x~y的范围内对p进行查找操作 然后修改 下同) 返回添加的人数
int Delete(int x,int y,student *p);//删除 返回添加的人数(***一个负整数***)
void Store(int x,int y,student *p,char *inf);//储存
void Printinf(student p);//打印单个人的全部信息(可视)
void print(student p);//打印单人信息(不可视)
void fprint(student p,FILE*f);//打印单人信息(不可视)
void Personinf(int x,int y,student *p);//搜索并打印单人信息
void Classinf(int x,int y,student *p);//班级信息
void Dutyinf(int x,int y,student *p);//班委信息
void Allinf(int x,int y,student *p);//全部信息
void Relinf(int x,int y,student *p);//关联信息
void makepassword();//创建或修改密码
ll getpass(char *ch);
bool is_password();
bool is_pass(char *ch);
//这里补充其他功能
/************************END-主要函数声明*************************/
/*****************数据存储文件格式说明***************************/
//数据储存在 .txl 的文件格式中
//存储用的 .txl文件名为 base.txl
//base.txl文件的格式如下
//第一行一个整数 n 代表通讯录中现有的同学数量
//接下来每组数据有9*n行 如下
//学号(53开头8位)
//姓名(最多9位有效字符(4个汉字)无特殊符号)
//性别(0或1或2)
//年级(正整数)
//班级(正整数)
//职务(0、1、2)
//主要手机号(11位 1开头的正整数)
//其他手机号(同上)
//电子邮箱(英文字符串只含一个@符)
//
//例:
//1
//53131001
//陶罗
//1
//1
//10
//0
//12312312312(不存在填0)
//13213213212(不存在填0)
//123456789@qq.com(不存在填0)
//
//其他用于录入信息的文件.txl格式文件如下
//第一行一个整数 n 代表通讯录中现有的同学数量
//接下来每组数据有9*n行 如下
//学号(一行数据或0(代表未知))
//姓名(一行数据或空行)
//性别(0或1或2)
//年级(一个正整数或0)
//班级(一个正整数或0)
//职务(0或1或2)(0表示未知或无)
//主要手机号(一行数据或0)
//其他手机号(一行数据或0)
//电子邮箱(一行数据或0)
/**注意 base.txl只允许系统登录时读取 禁止用户读取**/
/*********************END-数据存储文件格式说明***************************/
/*************************main及其相关函数********************************/
const int maxn=1000+10;//最多100人
char base[10]="base";
/**注意:base在系统第一次读取时就已经转换为"base.txl"**/
void Search(int x,int y,student *p);//查询与检索操作
int Operate(int x,int y,student *p);//修改与添加操作
void Others(int x,int y,student *p);//其他服务
void print(student p)
{
printf("%d\n",p.id);
printf("%s",p.name);
if(p.name[strlen(p.name)-1]!='\n')putchar('\n');
printf("%d\n%d\n%d\n%d\n",p.sex,p.Grade,p.Class,p.Duty);
printf("%lld\n%lld\n",p.phone1,p.phone2);
printf("%s",p.email);
if(p.email[strlen(p.email)-1]!='\n')putchar('\n');
}
void fprint(student p,FILE*f)
{
fprintf(f,"%d\n",p.id);
fprintf(f,"%s",p.name);
if(p.name[strlen(p.name)-1]!='\n')fprintf(f,"\n");
fprintf(f,"%d\n%d\n%d\n%d\n",p.sex,p.Grade,p.Class,p.Duty);
fprintf(f,"%lld\n%lld\n",p.phone1,p.phone2);
fprintf(f,"%s",p.email);
if(p.email[strlen(p.email)-1]!='\n')fprintf(f,"\n");
}
int input(int x,int y)
{
char ch[50];
gets(ch);
if(strlen(ch)!=1)return -1;
if(ch[0]-'0'>=x&&ch[0]-'0'<=y)return ch[0]-'0';
return -1;
}
void END()
{
puts("---------------------------------------------------------------");
puts("---------------------------- ---------------------------------");
puts("----------------------------感---------------------------------");
puts("---------------------------- ---------------------------------");
puts("----------------------------谢---------------------------------");
puts("---------------------------- ---------------------------------");
puts("----------------------------您---------------------------------");
puts("---------------------------- ---------------------------------");
puts("----------------------------的---------------------------------");
puts("---------------------------- ---------------------------------");
puts("----------------------------使---------------------------------");
puts("---------------------------- ---------------------------------");
puts("----------------------------用---------------------------------");
puts("---------------------------------------------------------------");
getchar();getchar();
}
int main()
{
system("color 1A");
char pas[20];
while(is_password())
{
puts("请输入密码");
scanf("%s",pas);
getchar();
if(is_pass(pas))break;
else
{
puts("密码错误 请从新输入");
continue;
}
}
system("cls");
puts("---------------------------------------------------------------");
puts("------------欢 迎 来 到 同 学 通 讯 录 管 理 系 统-------------");
puts("---------------------------------------------------------------");
student stu[maxn];
int num=0;
num=Load(base,stu);
while(num==0)
{
puts("");
puts("检测到第一次登录系统或系统中没有信息\n 是(1)否(0)添加信息?");
int key;
key=input(0,1);
if(key==1)
num+=Add(1,num,stu);
else if(key==-1)
continue;
else
{
system("cls");
break;
}
}
while(1)
{
printf("当前系统人数:%d\n",num);
puts("----------------请输入数字选择功能---------------");
puts(" 1.查询服务 2.添加或修改 3.其他服务 0.退出程序 ");
int key;
key=input(0,3);
if(key==0) {system("cls");break ;}
else if(key==1) Search(1,num,stu);
else if(key==2) num=Operate(1,num,stu);
else if(key==3) Others(1,num,stu);
else if(key==-1)continue;
}
END();
}
void Search(int x,int y,student *p)
{
while(1)
{
system("cls");
puts("---------------------------------------------------------------");
puts("------------------------- 查 询 服 务 -------------------------");
puts("---------------------------------------------------------------");
puts("");
puts("请输入想要查询的内容");
puts("1.某位同学信息");
puts("2.某个班级信息");
puts("3.班级干部信息");
puts("4.关联信息");
puts("5.全部信息");
puts("0.返回上一层");
int key;
key=input(0,5);
if(key==0) {system("cls");break ;}
else if(key==1) Personinf(x,y,p);
else if(key==2) Classinf(x,y,p);
else if(key==3) Dutyinf(x,y,p);
else if(key==4) Relinf(x,y,p);
else if(key==5) Allinf(x,y,p);
else if(key==-1)continue;
}
}
int Operate(int x,int y,student *p)
{
while(1)
{
system("cls");
puts("---------------------------------------------------------------");
puts("-------------------------修改与添加服务------------------------");
puts("---------------------------------------------------------------");
puts("请输入想要的操作(操作1、2、3后请进行操作4)");
puts("1.添加个人全部信息");
puts("2.修改或添加个人的部分信息");
puts("3.删除个人信息");
puts("4.储存当前系统中的所有信息");
puts("0.返回上一层");
int key;
key=input(0,4);
if(key==0) {system("cls");break ;}
else if(key==1) y+=Add(x,y,p);
else if(key==2) y+=Change(x,y,p);
else if(key==3) y+=Delete(x,y,p);
else if(key==4) Store(x,y,p,base);
else if(key==-1)continue;
}
return y-x+1;
}
void Others(int x,int y,student *p)
{
system("cls");
puts("---------------------------------------------------------------");
puts("------------------------- 其 他 服 务 -------------------------");
puts("---------------------------------------------------------------");
while(1)
{
puts("1.为系统设定密码或修改密码 0.返回上一层");
int key;
key=input(0,1);
if(key==0) {system("cls");return;}
else if(key==1)
{
makepassword();
system("cls");
}
else if(key==-1)continue;
}
}
/*************************END-main及其相关函数********************************/
/*************************主要函数实现***************************************/
/**1.Load**/
void Corerr(char *inf);//文件修正函数
int Load(char *inf,student *p)
{
strcat(inf,".txl");
if(strcmp(inf,"base.txl")) Corerr(inf);
FILE* in=fopen(inf,"r");
if(!in)
{
if(strcmp(inf,"base.txl"))
puts("打开文件失败");
return 0;
}
int num;
fscanf(in,"%d",&num);
for(int i=1;i<=num;i++)
{
fscanf(in,"%d",&p[i].id);
fgets(p[i].name,10,in);//读空行
fgets(p[i].name,10,in);
fscanf(in,"%d%d%d%d",&p[i].sex,&p[i].Grade,&p[i].Class,&p[i].Duty);
fscanf(in,"%lld%lld",&p[i].phone1,&p[i].phone2);
fgets(p[i].email,35,in);//读空行
fgets(p[i].email,35,in);
}
fclose(in);
return num;
}
void delpla(char *ch)// 删除字符串中的空格
{
char ret[100];
int j=0;
for(int i=0;i<strlen(ch);i++)
if(ch[i]!=' ')
ret[j++]=ch[i];
for(int i=0;i<j;i++)
ch[i]=ret[i];
}
void Corerr(char *inf)
{
FILE*in=fopen(inf,"r");
student p[maxn];
int num;
fscanf(in,"%d",&num);
char tes[55];
fgets(tes,50,in);
//printf("%s\n",tes);
if(num>=maxn)
num=0;
for(int i=0;i<num;i++)
{
//学号
fgets(tes,50,in);
tes[strlen(tes)-1]=0;//删去读取的回车 下同
for(int i=0;i<strlen(tes);i++)
if(tes[i]<'0'||tes[i]>'9')
{
strcpy(tes,"0");
printf("第%d个同学学号错误,已更改为0,请用修改功能修改\n",i+1);
getchar();
}
sscanf(tes,"%d",&p[i].id);
if(p[i].id/1000000!=53)p[i].id=0;
//姓名
fgets(tes,50,in);
tes[strlen(tes)-1]=0;
if(strlen(tes)>9)strcpy(tes,"0");
for(int i=0;i<strlen(tes);i++)
if(!((tes[i]>='a'&&tes[i]<='z')||(tes[i]>='A'&&tes[i]<='Z')||tes[i]<0))//存在特殊符号
{
strcpy(tes,"0");
printf("第%d个同学姓名错误,已更改为0,请用修改功能修改\n",i+1);
getchar();
}
strcpy(p[i].name,tes);
//性别
fgets(tes,50,in);
tes[strlen(tes)-1]=0;
if(tes[0]>='0'&&tes[0]<='2')p[i].sex=tes[0]-'0';
else p[i].sex=0;
//年级 班级
fgets(tes,50,in);
tes[strlen(tes)-1]=0;
for(int i=0;i<strlen(tes);i++)
if(tes[i]<'0'||tes[i]>'9')
{
strcpy(tes,"0");
printf("第%d个同学年级错误,已更改为0,请用修改功能修改\n",i+1);
getchar();
}
sscanf(tes,"%d",&p[i].Grade);
fgets(tes,50,in);
tes[strlen(tes)-1]=0;
for(int i=0;i<strlen(tes);i++)
if(tes[i]<'0'||tes[i]>'9')
{
strcpy(tes,"0");
printf("第%d个同学班级错误,已更改为0,请用修改功能修改\n",i+1);
getchar();
}
sscanf(tes,"%d",&p[i].Class);
//职务
fgets(tes,50,in);
tes[strlen(tes)-1]=0;
if(tes[0]>='0'&&tes[0]<='2')
p[i].Duty=tes[0]-'0';
else p[i].Duty=-1;
//手机号1
fgets(tes,50,in);
tes[strlen(tes)-1]=0;
if(tes[3]=='-'&&tes[8]=='-')
{
for(int i=3;i<7;i++)tes[i]=tes[i+1];
for(int i=7;i<11;i++)tes[i]=tes[i+2];
}
delpla(tes);
tes[11]=0;
sscanf(tes,"%lld",&p[i].phone1);
if(p[i].phone1/10000000000!=1)
{
p[i].phone1=0;
printf("第%d个同学主要手机号错误,已更改为0,请用修改功能修改\n",i+1);
getchar();
}
//手机号2
fgets(tes,50,in);
tes[strlen(tes)-1]=0;
if(tes[3]=='-'&&tes[8]=='-')
{
for(int i=3;i<7;i++)tes[i]=tes[i+1];
for(int i=7;i<11;i++)tes[i]=tes[i+2];
}
delpla(tes);
tes[11]=0;
sscanf(tes,"%lld",&p[i].phone2);
if(p[i].phone2/10000000000!=1)
{
p[i].phone2=0;
printf("第%d个同学其他手机号错误,已更改为0,请用修改功能修改\n",i+1);
getchar();
}
//E-mail
fgets(tes,50,in);
tes[strlen(tes)-1]=0;
int is=0;
for(int i=0;i<strlen(tes);i++)
if(tes[i]=='@')is++;
if(is!=1)
{
strcpy(p[i].email,"0");
printf("第%d个同学电子邮箱错误,已更改为0,请用修改功能修改\n",i+1);
getchar();
}
else strcpy(p[i].email,tes);
}
fclose(in);
FILE*out=fopen(inf,"w");
fprintf(out,"%d\n",num);
for(int i=0;i<num;i++)
{
fprintf(out,"%d\n",p[i].id);
fprintf(out,"%s\n",p[i].name);
fprintf(out,"%d\n%d\n%d\n%d\n",p[i].sex,p[i].Grade,p[i].Class,p[i].Duty);
fprintf(out,"%lld\n%lld\n",p[i].phone1,p[i].phone2);
fprintf(out,"%s\n",p[i].email);
}
fclose(out);
return ;
}
/**END-Load**/
/**2.Add**/
bool isrep(int x,int y,student *p,student q)//无重复返回1
{
for(int i=x;i<=y;i++)
{
if(p[i].id==q.id&&q.id!=0)return 0;
if(q.id==0&&!strcmp(p[i].name,q.name))return 0;
}
return 1;
}
int Add1(int x,int y,student *p,char * inf) //文件添加
{
student add[maxn];
int num=Load(inf,add);
int ret=0;
for(int i=1;i<=num;i++)
{
if(isrep(x,y,p,add[i]))
{
p[++y]=add[i];
ret++;
}
}
system("cls");
return ret;
}
int Add2(int x,int y,student *p)//屏幕上添加
{
char ch[50];
FILE*sto=fopen("regsto.txl","w");
fputs("1\n",sto);
//getchar();
puts("请输入学号,未知请填0");
gets(ch);
fputs(ch,sto);
fputs("\n",sto);
puts("请输入姓名(不含空格),未知请填0");
gets(ch);
fputs(ch,sto);
fputs("\n",sto);
puts("请输入性别 0.不详 1.男 2.女");
gets(ch);
fputs(ch,sto);
fputs("\n",sto);
puts("请输入年级(一个整数)");
gets(ch);
fputs(ch,sto);
fputs("\n",sto);
puts("请输入班级(一个整数)");
gets(ch);
fputs(ch,sto);
fputs("\n",sto);
puts("请输入职务(0.无 1.班长 2.学委)");
gets(ch);
fputs(ch,sto);
fputs("\n",sto);
puts("请输入主要电话号");
gets(ch);
fputs(ch,sto);
fputs("\n",sto);
puts("请输入其他电话号");
gets(ch);
fputs(ch,sto);
fputs("\n",sto);
puts("请输入电子邮箱");
gets(ch);
fputs(ch,sto);
fputs("\n",sto);
fclose(sto);
char str[20]="regsto";
return Add1(x,y,p,str);
}
int Add(int x,int y,student *p)
{
system("cls");
puts("请输入添加方式 1.文件录入 2.手写录入 0.返回上一层");
int key;
key=input(0,2);
system("cls");
if(key==1)
{
puts("---------------------------------------------------------------");
puts("------------------------ 文件添加服务 -------------------------");
puts("---------------------------------------------------------------");
char inf[100];
puts("请输入txl的文件名(不用加后缀):");
while(scanf("%s",inf),inf[0]=='\n');
getchar();
return Add1(x,y,p,inf);
}
else if(key==2)
{
puts("---------------------------------------------------------------");
puts("------------------------ 手写添加服务 -------------------------");
puts("---------------------------------------------------------------");
return Add2(x,y,p);
}
else if(key==0)
{
system("cls");
return 0;
}
}
/**END-Add**/
/**3.Change**/
int Searchid(int x,int y,student *p,int id);
int Searchname(int x,int y,student *p,char *name);
int Change(int x,int y,student *p)
{
bool cont=1;
int ret=0;
while(cont)
{
system("cls");
puts("---------------------------------------------------------------");
puts("--------------------------- 修改服务 --------------------------");
puts("---------------------------------------------------------------");
puts("1.按学号查找并修改 2.按姓名查找并修改 0返回上一层");
int key=input(0,2);
int loc;
if(key==1)
{
system("cls");
puts("------------------------- 按学号修改 --------------------------");
puts("请输入要修改同学的学号");
int id;
scanf("%d",&id);
loc=Searchid(x,y,p,id);
}
else if(key==2)
{
system("cls");
puts("------------------------- 按姓名修改 --------------------------");
puts("请输入要修改同学的姓名");
char name[20];
scanf("%s",name);
loc=Searchname(x,y,p,name);
}
else if(key==-1)
{
system("cls");
return -ret;
}
if(loc>=0)
{
puts("请连续输入想要修改项目的代号,代号间不需要插入回车或空格");
puts("1.学号 2.姓名 3.性别 4.年级 5.班级 6.职务");
puts("7.主要手机号 8.其他手机号 9.E-mail");
ll ky;
scanf("%lld",&ky);
getchar();
while(ky)
{
int poi=ky%10;
ky/=10;
if(poi==1)
{
puts("请输入新学号");
int nid;
while(scanf("%d",&nid),nid/1000000!=53)
puts("学号错误 请重新输入");
p[loc].id=nid;
getchar();
}
else if(poi==2)
{
puts("请输入新姓名");
char nname[50];
while(gets(nname),1)
{
if(strlen(nname)>9){puts("名字过长,请简写");continue;}
for(int i=0;i<strlen(nname);i++)
if(!((nname[i]>='a'&&nname[i]<='z')||(nname[i]>='A'&&nname[i]<='Z')||nname[i]<0))
{
puts("含有非法字符 请检查并重新填写");
continue;
}
strcpy(p[loc].name,nname);
break;
}
}
else if(poi==3)
{
puts("请输入性别 0.不详 1.男 2.女");
int k;
while(scanf("%d",&k),!(k>=0&&k<=2))
puts("请输入 0 或 1 或 2 ");
p[loc].sex=k;
getchar();
}
else if(poi==4)
{
puts("请输入年级(一个正整数)");
int k;
while(scanf("%d",&k)!=1)
puts("请重新输入");
p[loc].Grade=k;
//getchar();
}
else if(poi==5)
{
puts("请输入班级(一个正整数)");
int k;
while(scanf("%d",&k)!=1)
puts("请重新输入");
p[loc].Class=k;
getchar();
}
else if(poi==6)
{
puts("请输入职务 0.无 1.班长 2.学委");
int k;
while(scanf("%d",&k),!(k>=0&&k<=2))
puts("请输入 0 或 1 或 2 ");
p[loc].Duty=k;
getchar();
}
else if(poi==7||poi==8)
{
puts("请输入新的手机号");
char tes[50];
gets(tes);
if(tes[3]=='-'&&tes[8]=='-')
{
for(int i=3;i<7;i++)tes[i]=tes[i+1];
for(int i=7;i<11;i++)tes[i]=tes[i+2];
}
delpla(tes);
tes[11]=0;
ll k;
sscanf(tes,"%lld",&k);
if(poi==7)
{
if(k/10000000000==1)
p[loc].phone1=k;
else
puts("号码有误,请从新进入修改号码功能");
}
else if(poi==8)
{
if(k/10000000000==1)
p[loc].phone2=k;
else
puts("号码有误,请从新进入修改号码功能");
}
}
else if(poi==9)
{
puts("请输入新的E-mail");
char nem[50];
gets(nem);
int ok=0;
for(int i=0;i<strlen(nem);i++)
if(nem[i]=='@')
ok++;
if(ok==1)
strcpy(p[loc].email,nem);
else
puts("E-mail有误 请重新进入E-mail修改功能");
}
}
}
else if(loc<0)
{
puts("不存在此人的信息 是(1)否(0)添加?选是将转到添加页面");
bool is;
scanf("%d",&is);
system("cls");
if(is)
ret+=Add2(x,y,p);
}
puts("是否从新进入修改系统 0 否 1 是");
scanf("%d",&cont);
}
return ret;
}
int Searchid(int x,int y,student *p,int id)
{
for(int i=x;i<=y;i++)
if(p[i].id==id)return i;
return -1;
}
int Searchname(int x,int y,student *p,char *name)
{
for(int i=x;i<=y;i++)
if(!strcmp(name,p[i].name))return i;
strcat(name,"\n");
for(int i=x;i<=y;i++)
if(!strcmp(name,p[i].name))return i;
return -1;
}
/**END-Change**/
/**4.Delete**/
int Delete(int x,int y,student *p)
{
int ret=0;
while(1)
{
system("cls");
puts("---------------------------------------------------------------");
puts("------------------------- 删 除 服 务 -------------------------");
puts("---------------------------------------------------------------");
puts("1.通过学号查找并删除 2.通过姓名查找并删除 0.返回上一层");
int key,loc;
key=input(0,2);
if(key==1)
{
puts("请输入学号");
int did;
scanf("%d",&did);
loc=Searchid(x,y,p,did);
}
else if(key==2)
{
puts("请输入同学的姓名");
char name[20];
scanf("%s",name);
loc=Searchname(x,y,p,name);
}
else if(key==0||key==-1)return -ret;
if(loc<0)puts("不存在该学生");
else
{
puts("是(1)否(0)确认删除?");
Printinf(p[loc]);
scanf("%d",&key);
if(key)
{
for(int i=loc;i<y;i++)
p[i]=p[i+1]; //前移
y--;//去尾
ret++;//返回值+1
}
}
puts("是(1)否(0)继续删除?");
scanf("%d",&key);
system("cls");
if(key==1)continue;
else return -ret;
}
return -ret;
}
/**END-Delete**/
/**5.Store**/
void Store(int x,int y,student *p,char *inf)
{
puts("储存数据中 请稍后······");
FILE*f=fopen(inf,"w");
fprintf(f,"%d\n",y-x+1);
for(int i=x;i<=y;i++)
{
fprint(p[i],f);
}
fclose(f);
puts("数据储存完毕! 请按任意键返回上一层");
getchar();
system("cls");
}
/**END-Store**/
/**6.Printinf**/
void Printinf(student p)
{
if(p.id!=0)
printf("学号 : %d\n",p.id);
if(p.name[0]!='0')
{
printf("姓名 : %s",p.name);
if(p.name[strlen(p.name)-1]!='\n')putchar('\n');
}
printf("性别 : ");
if(p.sex==0)printf("不详\n");
else if(p.sex==1)printf("男\n");
else if(p.sex==2)printf("女\n");
if(p.Grade&&p.Class)
printf("班级 : %d 年 %d 班\n",p.Grade,p.Class);
printf("职务 : ");
if(p.Duty==0)printf("无\n");
else if(p.Duty==1)printf("班长\n");
else if(p.Duty==2)printf("学委\n");
if(p.phone1)
printf("主要手机号 : %lld\n",p.phone1);
if(p.phone2)
printf("其他手机号 : %lld\n",p.phone2);
if(p.email[0]!='0')
{
printf("E-mail : %s",p.email);
if(p.email[strlen(p.email)-1]!='\n')putchar('\n');
}
puts("------------------------------------------------------");
}
/**7.Personinf**/
void Personinf(int x,int y,student *p)
{
system("cls");
puts("---------------------------------------------------------------");
puts("------------------------ 个人信息查询 -------------------------");
puts("---------------------------------------------------------------");
puts("请入查询方式");
puts("1.学号 2.姓名 3.电话号 0.返回上一层");
int loc,key;
scanf("%d",&key);
if(key==0)return;
else if(key==1)
{
puts("请输入学号");
int sid;
scanf("%d",&sid);
loc=Searchid(x,y,p,sid);
}
else if(key==2)
{
puts("请输入姓名");
char name[20];
scanf("%s",name);
loc=Searchname(x,y,p,name);
}
if(key==1||key==2)
{
if(loc>=0)
Printinf(p[loc]);
else puts("未找到该同学");
}
if(key==3)
{
puts("请输入手机号");
ll sp;
bool is=0;
scanf("%lld",&sp);
for(int i=x;i<=y;i++)
if(p[i].phone1==sp||p[i].phone2==sp)
{Printinf(p[i]);is=1;}
if(!is)puts("未找到该同学");
}
puts("按任意键返回上一层(注意 返回上一层会清屏)");
getchar();getchar();
system("cls");
return ;
}
/**END-Personinf**/
/**8.Classinf**/
bool cmp(student a,student b)
{
if(a.Grade!=b.Grade)
return a.Grade>b.Grade;
else if(a.Class!=b.Class)
return a.Class<b.Class;
else return a.id<b.id;
}
void swap(student &a,student &b){student t=a;a=b;b=t;}
void sort(int x,int y,student *p,bool cmp(student ,student))
{
bool flag=1;
while(flag)
{
flag=0;
for(int i=x;i<y;i++)
if(!cmp(p[i],p[i+1]))
{
swap(p[i],p[i+1]);
flag=1;
}
}
}
void Classinf(int x,int y,student *p)
{
system("cls");
puts("---------------------------------------------------------------");
puts("------------------------ 班级信息查找 -------------------------");
puts("---------------------------------------------------------------");
sort(x,y,p,cmp);
puts("请输入想要查找的年级");
int g,c;
scanf("%d",&g);
puts("请输入查找的班级");
scanf("%d",&c);
bool is=0;
for(int i=x;i<=y;i++)
if(p[i].Grade==g&&p[i].Class==c)
{Printinf(p[i]);is=1;}
if(!is)puts("未找到该班级学生");
puts("按任意键返回上一层(会清屏)");
getchar();getchar();
system("cls");
}
/**END-Classinf**/
/**9.Allinf**/
bool cmpid(student a,student b)
{
return a.id<b.id;
}
void Allinf(int x,int y,student *p)
{
system("cls");
puts("---------------------------------------------------------------");
puts("------------------------- 全 部 信 息 -------------------------");
puts("---------------------------------------------------------------");
sort(x,y,p,cmpid);
for(int i=x;i<=y;i++)
Printinf(p[i]);
puts("按任意键返回上一层(会清屏)");
getchar();
system("cls");
}
/**END-ALLinf**/
/**10.Dutyinf**/
void Dutyinf(int x,int y,student *p)
{
system("cls");
puts("---------------------------------------------------------------");
puts("------------------------- 班 委 查 询 -------------------------");
puts("---------------------------------------------------------------");
int next[maxn];//静态链表 next表示当前班委下一个班委的坐标
int j=0;
next[j]=-1;
for(int i=x;i<=y;i++)
{
if(p[i].Duty)
{
next[j]=i;
j=i;
next[j]=-1;
}
}
int k=0;
while(next[k]>=0)
{
Printinf(p[next[k]]);
k=next[k];
}
puts("按任意键返回上一层(会清屏)");
getchar();
system("cls");
}
/**END-Dutyinf**/
/**11.Relinf**/
void phorep(int x,int y,student *p,ll phone,int next[])//判断是否存在与当前学生相同的电话号码 next 静态链表的坐标表
{
memset(next,0,sizeof(next));
next[0]=-1;
int j=0;
for(int i=x;i<=y;i++)
{
if(phone==p[i].phone1||phone==p[i].phone2)
{
next[j]=i;
j=i;
next[j]=-1;
}
}
}
bool repphone(ll *num,int n,ll phone){for(int i=0;i<n;i++)if(phone==num[i])return 1;return 0;}
void Relinf(int x,int y,student *p)
{
system("cls");
puts("---------------------------------------------------------------");
puts("------------------------- 关 联 信 息 -------------------------");
puts("---------------------------------------------------------------");
ll phone[maxn*2];
int num=0;
for(int i=x;i<=y;i++)
{
if(!repphone(phone,num,p[i].phone1))
{
phone[num++]=p[i].phone1;
}
if(!repphone(phone,num,p[i].phone2))
{
phone[num++]=p[i].phone2;
}
}
for(int i=0;i<num;i++)
{
int next[maxn];
phorep(x,y,p,phone[i],next);
if(next[next[0]]==-1)continue;//若只有一个人有此号码 则不输出
else
{
printf("存有号码 %lld 同学有\n",phone[i]);
puts("------------------------------------------------------");
int k=0;
while(next[k]>=0)
{
Printinf(p[next[k]]);
k=next[k];
}
puts("------------------------------------------------------");
}
}
puts("按任意键返回上一层(会清屏)");
getchar();
system("cls");
}
/**END-Relinf**/
/**12.password**/
int pasnum[20]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536};
ll getpass(char *ch)
{
if(!strcmp(ch,"0"))return 0;
ll ret=0;
for(int i=0;i<strlen(ch);i++)
{
ret+=ch[i]*pasnum[i%17];
ret%=1000000007;
}
return ret;
}
void makepassword()
{
FILE*pass=fopen("data.pas","w");
char pas[20];
system("cls");
puts("---------------------------------------------------------------");
puts("----------------------- 密码添加或修改 ------------------------");
puts("---------------------------------------------------------------");
puts("请输入密码 不超过17位 不含空格和回车或制表符\n 删除密码请输入0");
while(scanf("%s",pas),strlen(pas)>17);
ll password=getpass(pas);
fprintf(pass,"%lld\n",password);
fclose(pass);
puts("密码修改完成 任意键退出");
getchar();getchar();
system("cls");
}
bool is_password()
{
FILE*pass=fopen("data.pas","r");
if(!pass)return 0;
int k;
fscanf(pass,"%d",&k);
if(k==0)
return 0;
return 1;
}
bool is_pass(char *ch)
{
FILE*pass=fopen("data.pas","r");
ll k;
fscanf(pass,"%lld",&k);
if(k==getpass(ch))
return 1;
return 0;
}
/**END-password**/