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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值