标题:C语言通讯录,能运行,就最后排序的,运行的时候出现乱码,该怎么改?可能是 ...
只看楼主
gg0013
Rank: 2
等 级:论坛游民
帖 子:25
专家分:16
注 册:2012-11-26
结帖率:100%
已结贴  问题点数:26 回复次数:8 
C语言通讯录,能运行,就最后排序的,运行的时候出现乱码,该怎么改?可能是逻辑上有问题。会的帮忙 改下, 谢谢
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>

#define N 10


struct student
{
  char num[10];char name[10];char tel[10];
};

void myprint();
void mycreat(struct student *p,int n);
void mydisplay(struct student *p,int n);
void mysearch(struct student *p,int n);
void mymodify(struct student *p,int n);
void myadd(struct student *p,int n);
void mydelete(struct student *p,int n);
void mysort(struct student *p,int n);

main()
{
  char choose='\0',yes_no='\0';
  struct student record[N]={0};  //结构体对象, 用来存放N个学生的记录

  do
  {
    myprint();          //显示菜单
    choose=getche();
    getch();
    switch(choose)
    {
    case '1':mycreat(record,N);       break;   //创建
    case '2':mydisplay(record,N);     break;  //显示
    case '3':mysearch(record,N);      break;   //查询
    case '4':mymodify(record,N);      break;   //修改
    case '5':myadd(record,N);         break;   //添加
    case '6':mydelete(record,N);      break;   //删除
    case '7':mysort(record,N);        break;   //排序
    case '0':       break;
    default:printf("\n                    %c为非法选项!\n",choose);
    }
    if(choose=='0')  break;
    printf("\n                要返回菜单吗(Y/N)?\n");
    do
    {
      yes_no=getch();
    }while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
  }while(yes_no=='Y'||yes_no=='y');
}

 

void myprint()            //显示菜单
{
 system("cls");            //清空屏幕
 printf("\n*****************通讯录系统*****************\n");
 printf("\t请输入选项编号(0-7):");
 printf("\t1.创建通讯录\n");
 printf("\t2.显示通讯录\n");
 printf("\t3.查询通讯录\n");
 printf("\t4.修改通讯录\n");
 printf("\t5.添加通讯录\n");
 printf("\t6.删除通讯录\n");
 printf("\t7.排序通讯录\n");
 printf("\t0.保存并退出!\n");
 printf("*************************************************\n");
 printf("\t请选择:\n");
}


void mycreat(struct student *p,int n)  //创建
{
 int i=1;
 char yes_no='\0';

 system("cls");
 while(i<=n)
 {
     do
     {
         printf("\n");
         printf("请输入第%d个学生的记录:\n",i);
         printf("请输入学号:\n");
         do
         {
             gets(p->num);
         }while(strcmp(p->num,"")==0);      
         printf("姓名:\n");
         gets(p->name);
         printf("电话号码:\n");
         gets(p->tel);
         i++;
         p++;
         
         printf("还要继续输入么(Y/N?)\n");
         do
         {
             yes_no=getch();
         }while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
     }while(yes_no=='y'||yes_no=='y');

     if(yes_no!='y'||yes_no!='Y')  break;
 }
}


void mydisplay(struct student *p,int n)         //显示
{
   system("cls");
   int i=0;
   printf("                 学号             姓名           电话号码\n");

   for(i=0;i<n;i++)
   {
       printf("%20s%17s%17s\n",p->num,p->name,p->tel);
       p++;
   }
}


void mysearch(struct student *p,int n)          //查询
{
  int i=0,m=0,flag=0;
  struct student *q=NULL;           //定义一个指针变量
  char c='\0',nam[10]="",nm[10]="";
  
  system("cls");

  q=p;                     //使其初始指向位置相同  
  printf("请选择想要查询人的方式:1.通过学号查询; 2.通过姓名查询; 3.结束查询:");
  c=getch();
  printf("%c\n",c);
  switch(c)
  {
  case '1':
      printf("\n请输入要查询的学号:");
      do
      {
          gets(nm);
      }while(strcmp(nm,"")==0);
      for(i=0;i<n;i++,p++)
      {
          if(strcmp(nm,p->num)==0)
          {
            printf("                 学号             姓名           电话号码\n");
             printf("%20s%17s%17s\n",p->num,p->name,p->tel);
             flag=1;
             break;
          }
      }
      if(flag==0) printf("输入有误或者查无此人!\n");
      break;
      
  case '2':
      printf("\n请输入要查询的姓名:\n");
      gets(nam);
      for(i=0;i<n;i++,p++)
      {
          if(strcmp(nam,p->name)==0)
          {
             printf("                 学号             姓名           电话号码\n");
             printf("%20s%17s%17s\n",p->num,p->name,p->tel);
             break;
          }
      }
      if(i==n) printf("输入有误或者查无此人!\n");
      break;

  case '3':break;

  default :
      printf("\n                          %d为非法选项\n",m);
  }
}


void mymodify(struct student *p,int n)      //修改
{
     int i=0; char nam[10]="";   
     struct student *q=p;
     mydisplay(p,n);                        
     printf("\n请输入要修改记录的姓名:");
     gets(nam);
     for(i=0;i<n;i++,p++)                     
         if(strcmp(nam,p->name)==0)  break;   //找到记录结束循环
     if(i==n) printf("无此人!\n");
     else                                       
     {
       printf("\n请输入正确的学号:");
      do
      {
          gets(p->num);                           
      }while(strcmp(p->num,"")==0);
      printf("\n请输入正确的姓名:"); gets(p->name);
      printf("\n请输入正确的电话号码:"); gets(p->tel);
     }
     printf("\n\n");
     printf("                 学号             姓名           电话号码\n");
     for(p=q;p-q<n;p++)
     {
     printf("%20s%17s%17s\n",p->num,p->name,p->tel);
     }
}


void myadd(struct student *p,int n)          //添加
{
  int i=0,sum=0;
  char yes_no='\0';
  struct student *q=p;
  char addnum[10]="",addname[10]="",addtel[10]="";

  system("cls");
  mydisplay(p,n);
  printf("\n请输入总人数:");
  scanf("%d",&sum);
  printf("\n创建的总人数有:%d人\n",sum);

  do
  {
    printf("\n请输入新纪录的学号:");
    do
    {
      gets(addnum);
    }while(strcmp(addnum,"")==0);
    printf("\n请输入姓名:"); gets(addname);
    printf("\n请输入电话号码:"); gets(addtel);
    for(i=0;i<sum;i++) p=p+1;        //使指针指向已添加的最后
    if(p-q<=n)
    {   
        strcpy(p->num,addnum);
        strcpy(p->name,addname);
        strcpy(p->tel,addtel);
    }
         printf("还要继续输入么(Y/N?)\n");
    do
    {
        yes_no=getch();
    }while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
  }while(yes_no=='Y'||yes_no=='y');

    printf("                 学号             姓名           电话号码\n");
    for(p=q;p-q<n;p++)
      {
          printf("%20s%17s%17s\n",p->num,p->name,p->tel);
      }
}


void mydelete(struct student *p,int n)         //删除
{
   int i=0,j=0;
   struct student *q=NULL;
   char yes_no='\0';
   char detnm[10]="";

   q=p;
   mydisplay(p,n);
   do
   {
       printf("\n请输入要删除记录的学号:");
       do
       {
         gets(detnm);
       }while(strcmp(detnm,"")==0);
       p=q;
       for(i=0;i<n;i++,p++)
        {
            if(strcmp(detnm,p->num)==0)  break;
        }
           if(p-q<n)
           {
               for(;p-q<n-1;p++)
               {
                 strcpy(p->num,(p+1)->num);
                 strcpy(p->name,(p+1)->name);
                 strcpy(p->tel,(p+1)->tel);
               }     
               printf("删除后的记录:\n");
               printf("                 学号             姓名           电话号码\n");
               p=q;
               n=n-1;
               for(i=0;i<n;i++)
                   {
                       printf("%20s%17s%17s\n",p->num,p->name,p->tel);
                       p++;
                   }
           }
           else
               printf("\n查无此人\n");
            printf("还要继续输入么(Y/N?)\n");
       do
       {
           yes_no=getch();
       }while(yes_no!='Y'&&yes_no!='y'&&yes_no!='N'&&yes_no!='n');
  }while(yes_no=='Y'||yes_no=='y');
}



void mysort(struct student *p,int n)           //排序
{  
  int i=0;
  struct student  *q=NULL;
  char temp[10]={0};
  char c='\0';

  system("cls");
  
  q=p;
  mydisplay(p,n);
  printf("请选择排序的方式:1.按学号排序 2.按姓名排序: ");
  c=getch();
  printf("%c",c);

  switch(c)
  {
  case '1':
      for(i=0;i<n;i++,p++)
      {
        for(q=p+1;q-p<n-i;q++)
          {
              if(strcmp(p->num,q->num)>0)
              {
                  strcpy(temp,p->num);
                  strcpy(p->num,q->num);
                  strcpy(q->num,temp);

                  strcpy(temp,p->name);
                  strcpy(p->name,q->name);
                  strcpy(q->name,temp);

                  strcpy(temp,p->tel);
                  strcpy(p->tel,q->tel);
                  strcpy(q->tel,temp);
              }
          }
      }
      printf("\n\n                 学号             姓名           电话号码\n");
      for(i=0;i<n;i++)
      {
          printf("%20s%17s%17s\n",p->num,p->name,p->tel);
          p++;
      }
          break;
  case '2':
      for(i=0;i<n;i++,p++)
      {
          for(q=p+1;q-p<n-i;q++)
          {
              if(strcmp(p->name,q->name)>0)
              {   
                  strcpy(temp,p->num);
                  strcpy(p->num,q->num);
                  strcpy(q->num,temp);

                  strcpy(temp,p->name);
                  strcpy(p->name,q->name);
                  strcpy(q->name,temp);

                  strcpy(temp,p->tel);
                  strcpy(p->tel,q->tel);
                  strcpy(q->tel,temp);
              }
          }
      }
      printf("\n\n                 学号             姓名           电话号码\n");
      for(i=0;i<n;i++)
      {
          printf("%20s%17s%17s\n",p->num,p->name,p->tel);
          p++;
      }
      break;
 default: printf("\n\n                %c为非法输入!\n",c);break;
  }
}
搜索更多相关主题的帖子: void C语言 include 
2013-05-26 21:42
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2391
专家分:13384
注 册:2013-3-3
得分:1 
我调试了各个功能,没发现什么异常啊

Maybe
2013-05-26 22:06
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
得分:1 
长了点哈   眼睛有点花

三十年河东,三十年河西,莫欺少年穷!
2013-05-26 22:15
gg0013
Rank: 2
等 级:论坛游民
帖 子:25
专家分:16
注 册:2012-11-26
得分:0 
回复 2楼 邓士林
就是说排序这个功能, 选项7,mysort()这个函数
2013-05-26 22:20
apull
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:三体星系
等 级:版主
威 望:185
帖 子:1404
专家分:8479
注 册:2010-3-16
得分:24 
大概看了下,写的有些乱,
程序代码:
void mysort(struct student *p,int n)           //排序
{
    int i=0;
    struct student  *q=NULL,*l=NULL;
    l=p;    //保存p
    q=p;
....
    printf("\n\n                 学号             姓名           电话号码\n");
    p=l;    //前面一阵p++,q++,所以p要回到回到原位。
    for(i=0; i<n; i++)
        {
            printf("%20s%17s%17s\n",p->num,p->name,p->tel);
            p++;
        }
        break;
...
}


再就是,建议添加函数改成int,返回已经添加的记录数,这样在输出,查找,排序的时候不会和空结构比较。
程序代码:
int main()
{
..
    int count = 0;        //通讯录记录数
...
    switch(choose)
        {
        case '1':
            count = mycreat(record,N);
        case '2':
            mydisplay(record,count);
            break;  //显示
...
}

int mycreat(struct student *p,int n)  //创建
{
    int i=1;
...
    while(i<=n)
    {
...
        if(yes_no!='y'||yes_no!='Y') break ;
    }
     return --i;
}

2013-05-26 22:38
gg0013
Rank: 2
等 级:论坛游民
帖 子:25
专家分:16
注 册:2012-11-26
得分:0 
回复 5楼 apull
嗯,确实问题解决了 , 我想问下,那个不用和空函数比较,是说,循环的时候, 只循环到结构体数组中已经赋值的地方, 后面未赋值到的,空的数组,就循环不到?
2013-05-27 10:28
apull
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:三体星系
等 级:版主
威 望:185
帖 子:1404
专家分:8479
注 册:2010-3-16
得分:0 
就是说你输入了3个记录,那么排序,显示什么的就在这3个里进行。
按照你的程序,不管输入了几个记录,排序,显示都在N个里进行,没有必要,也容易出问题。你可以排序看看会输出很多空行的。
如果N是1万,而只输入了5条记录,那么每次显示,排序都要按N计算是不是很浪费。
2013-05-27 11:35
gg0013
Rank: 2
等 级:论坛游民
帖 子:25
专家分:16
注 册:2012-11-26
得分:0 
回复 7楼 apull
嗯  ,我明白 , 开始我也考虑过那情况, 只是不知道该怎么改, 准备一步步来的。总之 ,谢谢了
2013-05-27 19:11
zhangchuxi
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-6-9
得分:0 
求楼主帮忙写个简单的通讯录管理系统。(用结构体数组)
2013-06-15 16:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-408839-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.056270 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved