吉林大学2013级大一下学期程序设计作业:同学通讯录系统

来源:互联网 发布:云免软件下载 编辑:程序博客网 时间:2024/05/17 02:24

《程序设计基础课程设计》题目(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 改成 int64struct 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**/

0 0