weixin_37061400 2017-04-04 14:51 采纳率: 0%
浏览 1569

做了个简单c语言通讯录出现了问题

就是选择分类的时候本来0是返回上一项菜单的,结果变成新的一类
#include /*标准输入输出函数库*/
#include /*标准函数库*/
#include
#include
FILE *fp;
struct Data
{
int fenlei;
char name[10]; //姓名
char tel[15]; //电话
char age[8]; //年龄
char qq[10]; //QQ号

} ren[1000];
struct Data1
{
struct Data data;
struct Data1 *next;
} *p,*p1,*p2;
struct zhanghao
{
char username[20];
char password[10];
} zh,*zh1,*zh2;
struct LNode
{
char clas[20];
int length;
struct Data1 *next;
} a[6];

int menu() //主菜单选择函数
{
int c; //定义一个整型变量
do
{
system("cls"); //清屏
printf("\t*******通讯录*******\n");
printf("\t--------------------\n");
printf("\t 1、通讯信息显示 \n");
printf("\t 2、通讯信息保存 \n");
printf("\t 3、通讯信息删除 \n");
printf("\t 4、通讯信息修改 \n");
printf("\t 5、通讯信息增加 \n");
printf("\t 6、通讯信息查询 \n");
printf("\t 0. 退出 \n");
printf("\t--------------------\n");
printf("\t请您选择(0-6):");
scanf("%d",&c);
}
while(c>7&&c<0);
return(c);
}
void openclass()
{
FILE *fp1;
int i;
if ((fp1=fopen("contact.dat","r"))==NULL)
{
printf("\n不存在分类类别");

    if ((fp1=fopen("contact.dat","w"))==NULL) //不存在则进行创建
    {
        printf("\n建立失败");
        exit(0);
    }
    strcpy(a[1].clas,"1.家人亲戚");            //依次将下一条信息复制到上一条的位置
    strcpy(a[2].clas,"2.朋友");
    strcpy(a[3].clas,"3.同学");
    strcpy(a[4].clas,"4.同事");
    strcpy(a[5].clas,"5.陌生人");
    strcpy(a[6].clas,"6.其他");
    for (i=1; i<=6; i++)
    {

        if (fprintf(fp1,"%s\n",a[i].clas)==0)
        {
            printf("\n文件保存错误!\n");
        }
        a[i].length=0;
        a[i].next=NULL;

    }
}
else
{

    rewind(fp1);
    for (i=1; !feof(fp1) && fscanf(fp1,"%s\n",a[i].clas); i++)a[i].next=NULL;
    printf("\n类别文件导入成功\n");
}
fclose(fp1);
//printf("\n按任意键返回主菜单:");
// getch();//按任意键退出
return;

}
int select()
{
int c,i=1;
do
{
printf("\n1.家人亲戚\n");
printf("2.朋友\n");
printf("3.同学\n");
printf("4.同事\n");
printf("5.陌生人\n");
printf("6.其他\n");
printf("0.返回主菜单\n");
printf("请您选择(0-6):");
scanf("%d",&c);
if(c6)
printf("输入错误!请重新输入:\n");

}
while(c<0||c>6);
if (c==0)return;
else  return (c);

}
int checkUerValid(struct zhanghao zh1)/校验用户合法性*/
{
FILE*fp;
struct zhanghao zh[1],*zh2=zh;
char *usr,*pwd;
int check=0;
usr=zh1->username;
pwd=zh1->password;

if((fp=fopen("user.dat","rb"))==NULL)
{
    printf("File open error!\n");
    exit(0);
}
rewind(fp);
fread(zh2,sizeof(struct zhanghao),1,fp);
if((strcmp(usr,zh2->username)==0)&&(strcmp(pwd,zh2->password)==0))
{
    check=1;
}
if(fclose(fp))

{
    printf("不能关闭文件!\n");
    exit(0);
}
return check;

}
void Readfile()
{
int n,i;
openclass();
if((fp=fopen("user.dat","rb"))!=NULL)
{

    printf("通讯录文件已存在。\n");
    rewind(fp);
    fread(&p2,sizeof(struct zhanghao),1,fp);

    printf("请输入用户名:");
    scanf("%s",zh.username);
    printf("请输入密码:");
    scanf("%s",zh.password);

    while(checkUerValid(&zh)!=1)
    {
        printf("密码错误,请重新输入:\n");
        printf("请输入用户名:");
        scanf("%s",zh.username);
        printf("请输入密码:");
        scanf("%s",zh.password);

    }
    fclose(fp);
}
if((fp=fopen("catalog.dat","rb"))==NULL)
{
    printf("\n通讯录文件不存在!");
    if ((fp=fopen("catalog.dat","wb"))==NULL) //不存在则进行创建
    {
        printf("\n建立失败");
        exit(0);
    }
    else
    {
        if ((fp=fopen("user.dat","wb"))==NULL) //不存在则进行创建
        {
            printf("\n建立失败");
            exit(0);
        }
        else
        {
            printf("\n输入注册号(不大于8位数):");
            struct zhanghao zh[1],*zh1=zh;
            scanf("%s",zh1->username);
            while(strlen(zh1->username)>=8)
            {
                printf("\n注册号输入错误!请重新输入:");
                scanf("%s",zh1->username);
            }
            printf("\n输入注册号密码(不大于8位数):");
            scanf("%s",zh1->password);
            while(strlen(zh1->password)>=8)
            {
                printf("\n注册号输入错误!请重新输入:");
                scanf("%s",zh1->password);
            }

            fwrite(zh1,sizeof(struct zhanghao),1,fp);
        }
        fclose(fp);
        printf("\n通讯录文件已建立\n");
        printf("\n按任意键进入主菜单");
        getch();
        return;
    }
    exit(0); //退出
}
fseek(fp,0,2); //文件位置指针移动到文件末尾
if (ftell(fp)>0) //文件不为空,获取的是文件长度
{
    //rewind(fp); //文件位置指针移动到文件开始位置
    fseek(fp,0,0); //文件位置指针移动到文件开始位置
    for ( n=0; !feof(fp) && fread(&ren[n],sizeof(struct Data),1,fp); n++);
    //for(i=0;i<=n;i++)printf("%s",dat[i].name);
    for(i=0; i<=n; i++)
    {
        p1=a[ren[i].fenlei].next;
        p=(struct Data1*)malloc(sizeof(struct Data1));
        p->data=ren[i];
        p->next=NULL;
        if(a[ren[i].fenlei].next==NULL)
        {
            a[ren[i].fenlei].next=p;
            a[ren[i].fenlei].length++;
        }
        else
        {
            while(p1->next!=NULL)p1=p1->next;
            p1->next=p;
            a[ren[i].fenlei].length++;
        }
    }
    //从文件流中读取数据,以Data结构体接收读取的数据,并由n记录下文件中联系人个数
    printf("\n文件导入成功\n");
    printf("\n按任意键进入主菜单:");

    getch();
    return;
}
fclose(fp);
printf("\n文件导入成功\n");
printf("\n文件中没有数据\n");
printf("\n按任意键进入主菜单:");
getch();//按任意键退出
return;

}
int input1(struct LNode a[],int n)
{
char s[10];
char ch,m;
while(ch!='n'&&ch!='N')
{
p1=a[n].next;
printf("添加新联系人\n");
printf("姓名:");
p=(struct Data1*)malloc(sizeof(struct Data1));
p->next=NULL;
scanf("%s",s);
if(p1!=NULL)
{
while((strcmp(p1->data.name,s)!=0)&&p1->next!=NULL)
p1=p1->next;
if(strcmp(p1->data.name,s) == 0)
{
printf("通讯录中已有此人!\n");
printf("是否继续添加?(Y/N)");
scanf("%s",&m);
while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&m);
}
if(m!='n'&&m!='N')
{
input1(a,n);
}
return 0;
}
if(p1->next==NULL)
{

            printf("电话:");
            scanf("%s",p->data.tel);
            printf("电子邮件:");
            scanf("%s",p->data.age);

            printf("QQ号:");
            scanf("%s",p->data.qq);
            strcpy(p->data.name,s);
            printf("类别:%d",n);
            p->data.fenlei=n;
            p1->next=p;
            a[n].length++;
        }
    }
    else
    {
        printf("电话:");
        scanf("%s",p->data.tel);
        printf("电子邮件:");
        scanf("%s",p->data.age);

        printf("QQ号:");
        scanf("%s",p->data.qq);
        strcpy(p->data.name,s);
        printf("类别:%d",n);
        p->data.fenlei=n;
        a[n].next=p;
        a[n].length++;
    }
    printf("\n是否继续添加?(Y/N)");
    scanf("%s",&ch);
    while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')
    {
        printf("\n输入错误!请重新输入:");
        scanf("%s",&ch);
    }
}
printf("\n添加成功!\n");
printf("\n按任意键返回主菜单:");
getch();
return 0;

}
void print11(struct LNode a[],int n)
{
int l=1;
if(a[n].length>0)
{
printf("共%d条记录\n",a[n].length);
p1=p=a[n].next;
while(p!=NULL)
{

        printf("\n%d\n类别:",l++);
        printf("%d\n",p->data.fenlei);
        printf("姓名:");
        printf("%s\n",p->data.name);
        printf("电话:");
        printf("%s\n",p->data.tel);
        printf("电子邮件:");
        printf("%s\n",p->data.age);

        printf("QQ:");
        printf("%s\n",p->data.qq);
        p=p->next;
    }
}
else printf("\n名片数为0!\n");
printf("\n按任意键返回主菜单:");
getch();
return;

}
void allprint(struct LNode a[])
{
int n,sum=0,l=0;
for(n=1; n {
sum=sum+a[n].length;
}
printf("\n一共%d记录",sum);
for(n=1; n {
if(a[n].length>0)
{
printf("\n类别%d共%d条记录\n",n,a[n].length);
p1=p=a[n].next;
while(p!=NULL)
{

            printf("%d\n",p->data.fenlei);
            printf("姓名:");
            printf("%s\n",p->data.name);
            printf("电话:");
            printf("%s\n",p->data.tel);
            printf("电子邮件:");
            printf("%s\n",p->data.age);

            printf("QQ:");
            printf("%s\n",p->data.qq);
            p=p->next;
        }
    }
    else printf("\n名片数为0!\n");
    printf("\n按任意键返回主菜单:");
    getch();
    return;
}

}
void print111(struct LNode a[])
{
int m,n;
printf("\n请选择显示方式:\n");
printf("1--分类显示 \n");
printf("2--全部显示\n");
printf("0--返回菜单\n");
printf("请选择(0-2):");
scanf("%d",&m);
while(m!=1&&m!=2&&m!=0)
{
printf("\n输入错误,请重新选择:");
scanf("%d",&m);
}
if(m==1)
{
printf("\n请输入要查询的分类");
n=select();
print11(a,n);
}
if(m==2)
{
allprint(a);
}
if(m==0)
{
return;
}
}
void namefind(struct LNode a[],int n)
{
char s[20];
int i=0;
char m;

printf("\n请输入想查询的姓名:");
scanf("%s",s);
p1=p=a[n].next;
if(p1==NULL)
{
    printf("\n通讯录中没有此人!\n");
    return;
}
while(p->next!=NULL)
{

    while(strstr(p->data.name,s)==NULL&&p->next!=NULL)p=p->next;
    if(strstr(p->data.name,s)!=NULL)
    {
        i++;
        printf("\n类别:");
        printf("%d\n",p->data.fenlei);
        printf("姓名:");
        printf("%s\n",p->data.name);
        printf("电话:");
        printf("%s\n",p->data.tel);
        printf("电子邮件:");
        printf("%s\n",p->data.age);

        printf("QQ:");
        printf("%s\n",p->data.qq);
    }
    if((p->next==NULL)&&i==0)
    {
        printf("\n通讯录中没有此人!\n");
        printf("\n是否继续查询?(Y/N)");
        scanf("%s",&m);
        while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
        {
            printf("\n输入错误!请重新输入:");
            scanf("%c",&m);
        }
        if(m!='n'&&m!='N')
        {
            namefind(a,n);
        }
        return;
    }
    if(p->next==NULL)
    {
        printf("\n查询完成!\n");
        printf("\n是否继续查询?(Y/N)");
        scanf("%s",&m);
        while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
        {
            printf("\n输入错误!请重新输入:");
            scanf("%s",&m);
        }
        if(m!='n'&&m!='N')
        {
            namefind(a,n);
        }
        return;
    }
    else p=p->next;
}
if(strstr(p->data.name,s)!=NULL)
{
    i++;
    printf("\n类别:");
    printf("%d\n",p->data.fenlei);
    printf("姓名:");
    printf("%s\n",p->data.name);
    printf("电话:");
    printf("%s\n",p->data.tel);
    printf("电子邮件:");
    printf("%s\n",p->data.age);

    printf("QQ:");
    printf("%s\n",p->data.qq);
}

printf("\n查询完成!\n");
printf("\n是否继续查询?(Y/N)");
scanf("%s",&m);
while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
{
    printf("\n输入错误!请重新输入:");
    scanf("%s",&m);
}
if(m!='n'&&m!='N')
{
    namefind(a,n);
}
return;

}
void onedelete1(struct LNode a[],int n)
{
char s[20],r;
int i=0;
printf("请输入想删除联系人的姓名:");
scanf("%s",s);
p1=p=a[n].next;
if(p1==NULL)
{
printf("\n通讯录中没有此人!\n");
return;
}
while(strcmp(p->data.name,s)!=0&&p->next!=NULL)p=p->next;
if(strcmp(p->data.name,s) != 0)
{
printf("\n通讯录中没有此人!\n");
return;
}
if(strcmp(p->data.name,s) == 0)
{
printf("类别:");
printf("%d\n",p->data.fenlei);
printf("姓名:");
printf("%s\n",p->data.name);
printf("电话:");
printf("%s\n",p->data.tel);
printf("电子邮件:");
printf("%s\n",p->data.age);

    printf("QQ:");
    printf("%s\n",p->data.qq);
}
printf("确认删除?(Y/N):");
scanf("%s",&r);
while(r!='n'&&r!='N'&&r!='y'&&r!='Y')
{
    printf("\n输入错误!请重新输入:");
    scanf("%s",&r);
}
if(r=='y'||r=='Y')
{
    if(p1==p)a[n].next=p->next;
    else
    {
        while(p1->next!=p)p1=p1->next;
        p1->next=p->next;
    }
    free(p);
    a[n].length--;
    printf("\n已经成功删除!\n");
    return;
}

}
//全部删除函数
void alldelete1(struct LNode a[],int n)
{
char r;

p1=p=a[n].next;
printf("\n确认删除?(Y/N):");
scanf("%s",&r);
while(r!='n'&&r!='N'&&r!='y'&&r!='Y')
{
    printf("\n输入错误!请重新输入:");
    scanf("%s",&r);
}
if(r=='y'||r=='Y')
{
    if(p1==NULL)
    {
        printf("不存在名片!");
        return;
    }
    while(p1->next!=NULL)
    {
        p=p1->next;
        p1->next=p->next;
        free(p);
    }
    a[n].next=NULL;
    a[n].length=0;
    printf("\n已经成功删除全类名片!\n");
    return;
}
if(r=='n'||r=='N')
{
    return;
}

}
//选择删除联系人函数
void delete11(struct LNode a[],int n)
{
int m;
printf("\n请选择删除方式:\n");
printf("1--单个删除 \n");
printf("2--全部删除\n");
printf("0--返回菜单\n");
printf("请选择(0-2):");
scanf("%d",&m);
while(m!=1&&m!=2&&m!=0)
{
printf("\n输入错误,请重新选择:");
scanf("%d",&m);
}
if(m==1)
{
onedelete1(a,n);
}
if(m==2)
{
alldelete1(a,n);
}
if(m==0)
{
return;
}
}
void Save()
{
FILE *fp;
int i;
if ((fp=fopen("catalog.dat","wb"))==NULL)
{
printf("\n文件打开失败");
}
for (i=1; i<=6; i++)
{
p=a[i].next;
while(p!=NULL)
{
if (fwrite(&(p->data),sizeof(struct Data),1,fp)==0)
{
printf("\n文件保存错误!\n");
}
p=p->next;
}
}
fclose(fp);
printf("\n按任意键返回主菜单:");
getch();//按任意键退出
return;
}
void namechange(struct LNode a[],int n)
{
char s[20];
char m,ch;
int i=0,k;
p1=a[n].next;
printf("\n请输入想修改的联系人的姓名:");
scanf("%s",s);
if(p1==NULL)
{
printf("\n通讯录中没有此人!\n");
printf("\n是否继续修改?(Y/N)");
scanf("%s",&ch);
while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&ch);
}
if(ch!='n'&&ch!='N')
{
namechange(a,n);
}
return;
}
else
{
while((strcmp(p1->data.name,s)!=0)&&p1->next!=NULL)
p1=p1->next;

    if(p1->next ==NULL&&strcmp(p1->data.name,s) != 0)
    {
        printf("\n通讯录中没有此人!\n");
        printf("\n是否继续修改?(Y/N)");
        scanf("%s",&ch);
        while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')
        {
            printf("\n输入错误!请重新输入:");
            scanf("%s",&ch);
        }
        if(ch!='n'&&ch!='N')
        {
            namechange(a,n);
        }
        return;
    }
}
if(strcmp(p1->data.name,s) == 0)
{
    printf("类别:");
    printf("%d\n",p1->data.fenlei);
    printf("姓名:");
    printf("%s\n",p1->data.name);
    printf("电话:");
    printf("%s\n",p1->data.tel);
    printf("电子邮件:");
    printf("%s\n",p1->data.age);

    printf("QQ:");
    printf("%s\n",p1->data.qq);

    printf("\n1.修改姓名\n");
    printf("2.修改电话\n");
    printf("3.修改电子邮件\n");
    printf("4.修改地址\n");
    printf("5.修改QQ号\n");
    printf("0.返回菜单\n");

    printf("请您选择(0-5):");
    scanf("%d",&k);
    while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0)
    {
        printf("\n输入错误,请重新选择:");
        scanf("%d",&k);
    }
    switch(k)
    {
    case 1:
        printf("\n请输入新的姓名:");
        scanf("%s",p1->data.name);
        break;
    case 2:
        printf("\n请输入新的电话:");
        scanf("%s",p1->data.tel);
        break;
    case 3:
        printf("\n请输入新的电子邮件:");
        scanf("%s",p1->data.age);
        break;

    case 5:
        printf("\n请输入新的QQ号:");
        scanf("%s",p1->data.qq);
        break;
    case 0:
        return;
    }
    printf("\n修改成功!\n");
    printf("\n是否继续修改?(Y/N)");
    scanf("%s",&m);
    while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
    {
        printf("\n输入错误!请重新输入:");
        scanf("%c",&m);
    }
    for(; m=='y'||m=='Y';)
    {
        printf("请您选择(0-5):");
        scanf("%d",&k);
        while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0)
        {
            printf("\n输入错误,请重新选择:");
            scanf("%d",&k);
        }
        switch(k)
        {
        case 1:
            printf("\n请输入新的姓名:");
            scanf("%s",p1->data.name);
            break;
        case 2:
            printf("\n请输入新的电话:");
            scanf("%s",p1->data.tel);
            break;
        case 3:
            printf("\n请输入新的电子邮件:");
            scanf("%s",p1->data.age);
            break;

        case 5:
            printf("\n请输入新的QQ号:");
            scanf("%s",p1->data.qq);
            break;
        case 0:
            return;
        }
        printf("\n修改成功!\n");
        printf("\n是否继续修改?(Y/N)");
        scanf("%s",&m);
        while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
        {
            printf("\n输入错误!请重新输入:");
            scanf("%s",&m);
        }
    }
    if(m=='n'||m=='N');
    return;
}

}
int main()
{
int ads,asd;
Readfile();
while(1)
{
switch(ads=menu())
{
case 1:
system("cls");

        print111(a);
        break;
    case 2:
        system("cls");
        Save();
        break;
    case 3:
        system("cls");
        asd=select();
        delete11(a,asd);
        break;
    case 4:
        system("cls");
        asd=select();
        namechange(a,asd);
        break;
    case 5:
        system("cls");
        asd=select();
        input1(a,asd);
        break;
    case 6:
        system("cls");
        asd=select();
        namefind(a,asd);
        break;
    case 0:
        system("cls");
        exit(0);
    default:
        ads=menu();
    }
}

}

  • 写回答

3条回答 默认 最新

  • devmiao 2017-04-04 15:28
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果