鱼C论坛

 找回密码
 立即注册
查看: 4984|回复: 15

又是一个无法退出,出现死循环的问题..帮忙看看呀!!!

[复制链接]
发表于 2012-9-26 23:23:39 | 显示全部楼层 |阅读模式
1鱼币

  1. //1、无法正常退出, 会出现死循环


  2. #include <stdio.h>
  3. #define N 3

  4. int main()
  5. {
  6.         int i, number, top, bott, mid, loca, a[N];   
  7.         // 循环变量, 待查数据, 起始数据, 最后数据,中间数据,待查数据是否在查区间内,查找数据数组
  8.         int flag = 1;       //控制主whlie循环
  9.         int sign;           //表示待查找数据是否找到
  10.         char c;             //控制退出

  11.        
  12.         printf("输入数据:\n");
  13.         scanf("%d", &a[0]);
  14.        
  15.         i = 1;       

  16.         while(i < N)
  17.         {
  18.        

  19.                 scanf("%d", &a[i]);
  20.                
  21.                 if(a[i] >= a[i-1])
  22.                 {
  23.                         i++;
  24.                 }
  25.                 else
  26.                         printf("请重新输入数据!!!\n");
  27.                
  28.         }
  29.         printf("\n\n");

  30.         for(i = 0; i < N; i++)
  31.         {
  32.                 printf("%5d", a[i]);
  33.         }
  34.         printf("\n");




  35.         while(flag)
  36.         {
  37.                 printf("输入要查找的数据:\n");
  38.                 scanf("%d", &number);

  39.                 sign = 0;
  40.                 top = 0;
  41.                 bott = N - 1;
  42.                
  43.                 if((number < a[0]) || (number > a[N - 1]))
  44.                 {
  45.                         loca = -1;
  46.                 }


  47.                 while((!sign) && top <= bott)
  48.                 {
  49.                         mid = (top + bott) / 2;

  50.                         if(number == a[mid])
  51.                         {
  52.                                 loca = mid;
  53.                                 printf("找到查找数据%d,位置%d\n", number, mid + 1);
  54.                                 sign = 1;
  55.                         }
  56.                         else if(number < a[mid])
  57.                         {
  58.                                 bott = mid - 1;
  59.                         }
  60.                         else
  61.                         {
  62.                                 top = mid + 1;
  63.                         }
  64.                 }

  65.                 printf("sign=%d,flag=%d", sign, flag);

  66.                 if(!sign || loca == -1)
  67.                 {
  68.                         printf("未找到待查数据\n\n");
  69.                        
  70.                 }
  71.                
  72.                 printf("是否继续查找(Y/N)?\n");       
  73.        
  74.                 scanf("%c", &c);

  75.                 if(c == 'n' || c == 'N')
  76.                 {
  77.                         flag = 0;
  78.                 }
  79.                 printf("flag = %d", flag);
  80.        

  81.         printf("\n");

  82.         }

  83.         return 0;

  84. }
复制代码
写了好几段代码都有这样的问题,可能是我要某个方面没有理解正确吧,大家帮忙看看,指点一下啊!!!被这个问题纠结了好几天了...

最佳答案

查看完整内容

这个和scanf("%d %d",&a,&b);的道理一样,这时候要输入两个数,这两个数的中间可以 是空格、‘\t’、'\n',反正要有一个。 scanf("%d", &number);输入数的时候还输入了一个'\n';这个数给了number,‘\n’留在了缓冲区。 scanf(" %c", &c);在%c前面加了一个空格,这个空格就对应了‘\n’.这样c可以正常接收数据,否则 c就直接接收'\n';
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-9-26 23:23:40 | 显示全部楼层

这个和scanf("%d %d",&a,&b);的道理一样,这时候要输入两个数,这两个数的中间可以
是空格、‘\t’、'\n',反正要有一个。
scanf("%d", &number);输入数的时候还输入了一个'\n';这个数给了number,‘\n’留在了缓冲区。

scanf(" %c", &c);在%c前面加了一个空格,这个空格就对应了‘\n’.这样c可以正常接收数据,否则
c就直接接收'\n';
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-26 23:41:30 From FishC Mobile | 显示全部楼层
?hhhhhjjjjjjjjjjjkjjj
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-26 23:48:07 | 显示全部楼层
478668865 发表于 2012-9-26 23:41
?hhhhhjjjjjjjjjjjkjjj

什么情况??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-27 00:39:49 | 显示全部楼层
只看了一个开头,while(i < N)   //判断a[i] >= a[i-1]
        {     
            scanf("%d", &a[i]);                 //输入a[i]
            if(a[i] >= a[i-1])
                    i++;
            else
                    printf("请重新输入数据!!!\n");
        }
这个循环本身就是死循环吧,N等于3,i等于1,循环里面也没有改变变量i的语句,注定就是个死循环;
还有就是里面很多变量用之前就木扭赋初值,变量用时就是随机值;还有写代码能再多些注释不能啊!多些就是错了更改也容易些,别人看时也方便!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-27 07:37:38 | 显示全部楼层
你n没输入吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-27 07:41:14 | 显示全部楼层
顶顶贴~~~E文不好,没敢碰C
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-27 11:09:27 | 显示全部楼层
  1.                 printf("是否继续查找(Y/N)?\n");        
  2.         
  3.                 scanf(" %c", &c); //在%c前面加一个空格即可,过滤前面输入缓存留下的‘\n’;
  4.                                         //否则c直接接受'\n';
  5.                 if(c == 'n' || c == 'N')
  6.                 {
  7.                         flag = 0;
  8.                 }
  9.                 printf("flag = %d", flag);
  10.         
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-27 22:08:46 | 显示全部楼层
【red_hat】田野 发表于 2012-9-27 00:39
只看了一个开头,while(i < N)   //判断a >= a
        {     
            scanf("%d", &a);            ...

这里好像没出现什么问题吧??输入什么的都正常啊...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-27 22:10:48 | 显示全部楼层
wangyexin 发表于 2012-9-27 07:37
你n没输入吧

哪里的N啊。。。?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-27 22:13:56 | 显示全部楼层

为什么%c前面加一个空格,就可以过滤前面输入缓存。。。???
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-27 22:17:38 | 显示全部楼层
s0512 发表于 2012-9-27 07:41
顶顶贴~~~E文不好,没敢碰C

谢了。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-28 00:06:34 | 显示全部楼层
考鸡蛋 发表于 2012-9-27 22:08
这里好像没出现什么问题吧??输入什么的都正常啊...

是我看错了,有条件的i++;不好意思!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-9-28 04:40:13 | 显示全部楼层
加空格后,已经正常了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-28 10:43:48 From FishC Mobile | 显示全部楼层
玩酷子弟lv 发表于 2012-9-27 22:33  这个和scanf("%d %d",&a,&b);的道理一样,这时候要输入两个数,这两个数的中间可以  是空格、‘\t’、'\n ...

问题解决,谢谢了……手机上的,没法给鱼币,晚上弄吧!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-9-28 10:48:54 From FishC Mobile | 显示全部楼层
【red_hat】田野 发表于 2012-9-27 00:39  只看了一个开头,while(i< N) //判断a>= a  {  scanf("%d",&a); ...

问题解决了……以后会注意注释问题的!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-11 02:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表