| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 1109 人关注过本帖
标题:求有空的大神帮忙调试一下,在输入任何一个字母的时候就会出现死循环,问题 ...
取消只看楼主 加入收藏
计科1102
Rank: 1
等 级:新手上路
帖 子:56
专家分:9
注 册:2013-4-26
结帖率:87.5%
收藏
已结贴  问题点数:20 回复次数:5 
求有空的大神帮忙调试一下,在输入任何一个字母的时候就会出现死循环,问题何在?
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <stdlib.h>
#include <ctime>
#define NULL 0

typedef struct Node    //定义每个结点的类型
{   int m;             //每个人所拥有的密码
    int n;            //每个人的位序
    struct Node *next;
}Node,*Linklist;

Linklist create(int z)  //生成z个结点的循环单链表,z为总人数
{   int i,mm;
    Linklist r,s,H=NULL;   
    for(i=1;i<=z;i++)
    {  printf("请输入NO.%d的密码=",i);
       scanf("%d",&mm);
       s=(Linklist)malloc(sizeof(Node));
       s->n=i;
       s->m=mm;
       if(H==NULL)      //从链表的第一个节点插入
       {  H=s;
          r=H;
       }
        else               //链表的其余节点插入
        {  r->next=s;
           r=s;      //r后移
        }
    }    //for结束
    r->next=H;    //生成循环单链表
    return H;
}
void search(Linklist H,int m0,int z)//用循环链表实现报数问题
{   int count=1;    //count为累计报数人数计数器
    int num=0;      //num为标记出列人数计数器
    Linklist pre,p;
    p=H;
    printf("出列的顺序为:");
    while(num<z)
    {  
        do{  count++;
             pre=p;
             p=p->next;
          }while(count<m0);
        pre->next=p->next;
        printf("%d  ",p->n);
        m0=p->m;
        free(p);
        p=pre->next;
        count=1;
       num++;
    }    //while结束
}

void clean()
{    int system(const char *string);
     int  inquiry;
     printf("若要清除上一次操作记录请选择(1.清屏/2.不清屏)...\n");
     scanf("%d",&inquiry);
     if(inquiry ==1)
     system("cls");
     
}
void time()
{   time_t timer ;/*时间*/
    struct tm *ptrtime;/*指向struct tm的指针*/
    timer = time( NULL ) ;/*调用time()函数获取当前时间*/
    ptrtime = localtime( &timer ) ;/*调用localtime()函数将获得的系统时间转化为指向struct tm的指针指向的结构体*/
    printf("\n系统时间: %s",asctime( ptrtime ) ) ;/*用asctime()将结构体转化为字符串输出*/
}
void  text()
{  int m0,z,i,k=1; //k用来阻止第一次进入程序清屏操作
   int choose;
   Linklist H;
   bool chooseFlag=false;
  while(1)
  {   if(k!=1)
  {clean();
  time();}
         k++;
     
      while(!chooseFlag)
      {   printf("           ============欢迎进入排序系统计设——约瑟夫环问题============\n");
          printf("                   *              1.输入约瑟夫环数据              *\n");
          printf("                   *              2.什么是约瑟夫环?               *\n");
          printf("                   *              3.退出系统                      *\n");
          printf("          ..............................................................\n");
          printf("请输入相应的数字进行选择: ");                       
          scanf("%d",&choose);
          for(i=1;i<=4;i++)
            {    if(choose==i)
                     { chooseFlag=true;
                       break;
                     }
                else chooseFlag=false;
            }
          if(!chooseFlag)
               printf("输入错误!\n");
      } //end  while(!chooseFlag)
      if(choose==1) //if 开始
      {   printf("请输入一个小于30的整数表示人数:");
          scanf("%d",&z);
           while(z>30||z<1)
           {   printf("超过最大输入人数! 请重新输入整数: ");
               scanf("%d",&z);
           }
           H=create(z);//函数调用
           printf("请输入初始密码m0: ");
           scanf("%d",&m0);//
           search(H,m0,z);
           printf("\n\n");         
           }
       else if(choose==2)   
       {   printf("\n约瑟夫环问题:设有n个人,其编号分别为1,2,3,…,n,安装编号顺序顺时针围坐一圈。选定一个正整数m,从第一个人开始顺时针报数,报到m时,则此人出列,然后从他的下一个人从1重新报数,依此类推,直到所有人全部出列为止,求出列的顺序。\n\n");
       }            
       else if(choose==3)
       {   printf("程序结束!\n");
           break;
       }
       else
       {   printf("错误!\n");
           
       }//end if
           chooseFlag=0;   
  }//end while(1)
}

void main()
{  time();
    text();
}
2013-05-10 22:34
计科1102
Rank: 1
等 级:新手上路
帖 子:56
专家分:9
注 册:2013-4-26
收藏
得分:0 
这是约瑟夫环的一个小程序,就是希望输入字母的时候不会出现死循环,求大神帮忙啊!我改了又改,结果还是不行!!
2013-05-10 22:36
计科1102
Rank: 1
等 级:新手上路
帖 子:56
专家分:9
注 册:2013-4-26
收藏
得分:0 
上面的函数可以编译出来的,只是经不起测试!!情况就像我说的,输入数字可以,不会有问题。就是输入字母的时候,就会出现死循环,我就不知道怎么改进完善它而已。还有望各路大神多指教!!
2013-05-13 13:40
计科1102
Rank: 1
等 级:新手上路
帖 子:56
专家分:9
注 册:2013-4-26
收藏
得分:0 
问题不是出现在那里,在下面的红色说明那里
void  text()
{  int m0,z,i,k=1; //k用来阻止第一次进入程序清屏操作
   int choose;
   Linklist H;
   char chooseFlag=false;
  while(1)
  {   if(k!=1)
  {clean();
  Time();}
         k++;
     
      while(!chooseFlag)
      {   printf("           ============欢迎进入排序系统计设——约瑟夫环问题============\n");
          printf("                   *              1.输入约瑟夫环数据              *\n");
          printf("                   *              2.什么是约瑟夫环?               *\n");
          printf("                   *              3.退出系统                      *\n");
          printf("          ..............................................................\n");
          printf("请输入相应的数字进行选择: ");   问题出现在这里!!!叫你输入相应的数字的时候,如果你输入的是字母,就会出现死循环了            
2013-05-14 00:33
计科1102
Rank: 1
等 级:新手上路
帖 子:56
专家分:9
注 册:2013-4-26
收藏
得分:0 
就是不知道怎么修改才放到这里来让各路大神指教的呀,还有请您帮修改一下,感激不尽啊
2013-05-14 19:04
计科1102
Rank: 1
等 级:新手上路
帖 子:56
专家分:9
注 册:2013-4-26
收藏
得分:0 
希望不小心输入字母的时候,提示‘输入错误,重新输入之类的’,不要出现死循环就好。这个问题问过很多同学,都说不知道怎么改,所以我就放在这里问一下。我想应该会很麻烦的
2013-05-16 17:50
快速回复:求有空的大神帮忙调试一下,在输入任何一个字母的时候就会出现死循环, ...
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015189 second(s), 8 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved