kevinde2022 发表于 2022-11-4 12:43:41

小白求助 查找一个数是不是在某个数组里

最后scanf询问是否继续查找那里有问题,感觉最后一个scanf并没有运行,而且打N不继续的时候总会重复打印是否继续输入再停止。
#include <stdio.h>
#include <math.h>
int main(void)
    { int a={8,7,6,5,3,2,1},top,bott,flag = 1,sign = 1;
      int i,n,avg;
      char c;
    while (sign)
      {scanf("%d",&n);
      if (n>a||n<a)
      {printf("不在范围内重新输入");
      continue;}
      else
         {
          top = 0;
          bott = 6;
         while ((flag )&& (top<=bott))
         {
            avg = (top+bott)/2 ;
            if (a == n)
            {
            printf("该数的位置在%d",avg+1);
            break;
            }
            else
            if (n < a ) top = avg+1;
            else bott = avg-1;

            }
          if (top>bott)
            {
            printf("无此数");
            }
      printf("\n是否继续查找");
      scanf("%c",&c);
      if (c == 'N')
          {printf("\n好的");sign = 0;}
      else
          {printf("\n请输入");}
         }
         
      }   
    }

jackz007 发表于 2022-11-4 13:01:48

本帖最后由 jackz007 于 2022-11-4 13:21 编辑

#include <stdio.h>

int main(void)
{
      int a[] = {8,7,6,5,3,2,1} , top , bott , flag = 1 , sign = 1       ;
      int i , n , avg                                                    ;
      char c                                                             ;
      while (sign) {
                printf("请输入目标数 : ")                                  ;
                scanf("%d" , & n)                                          ;
                if (n < a || n > a) {
                        printf("目标数不在范围内\n")                     ;
                } else {
                        top = 0                                          ;
                        bott = 6                                           ;
                        flag = 1                                           ;// 应对多次查找,必须每次重新初始化 flag
                        while(flag && top <= bott) {
                              avg = (top + bott) / 2                     ;
                              if (a == n) {
                                        printf("该数的位置在%d\n" , avg+1) ;
                                        flag = 0                           ;
                              } else {
                                        if(n < a) top = avg + 1       ;
                                        else bott = avg - 1                ;
                              }
                        }
                        if(flag) printf("查无此数!\n")                  ;
                        printf("\n")                                       ;
                        printf("是否继续查找 <Y/N> : ")                  ;
                        fflush(stdin)                                    ;// 读取字符前,先清空键盘缓冲区,否则,后面变量 c 读取到的一定是 '\n' 字符
                        scanf("%c" , & c)                                  ;
                        if(c == 'N' || c == 'n') {
                              printf("\n好的\n")                         ;
                              sign = 0                                 ;
                        }
                }
                printf("\n")                                             ;
      }
}

kevinde2022 发表于 2022-11-4 13:32:37

jackz007 发表于 2022-11-4 13:01


我试了你的代码,最后输入是否继续查找那里 还是不运行 if(c == 'N' || c == 'n'),还有那个键盘缓冲区一般啥时候要清空啊,确实读取了回车,但是你写的fflush那句好像没起作用

jackz007 发表于 2022-11-4 13:37:06

kevinde2022 发表于 2022-11-4 13:32
我试了你的代码,最后输入是否继续查找那里 还是不运行 if(c == 'N' || c == 'n'),还有那个键盘缓冲区一 ...

         是吗,你真的仔细试过了?
         看看我这里的编译、运行实况吧
D:\\C>g++ -o x x.c

D:\\C>x
请输入目标数 : 7
该数的位置在2

是否继续查找 <Y/N> : y

请输入目标数 : 1
该数的位置在7

是否继续查找 <Y/N> : y

请输入目标数 : 8
该数的位置在1

是否继续查找 <Y/N> : y

请输入目标数 : 6
该数的位置在3

是否继续查找 <Y/N> : n

好的


D:\\C>

kevinde2022 发表于 2022-11-4 13:49:08

jackz007 发表于 2022-11-4 13:37
是吗,你真的仔细试过了?
         看看我这里的编译、运行实况吧

我把这句fflush(stdin) 替换成getchar()就成功了,谢谢你帮我扫除一个知识盲点,忘了回车会被当做字符读取

jackz007 发表于 2022-11-4 14:31:23

kevinde2022 发表于 2022-11-4 13:49
我把这句fflush(stdin) 替换成getchar()就成功了,谢谢你帮我扫除一个知识盲点,忘了回车会被当做字符读 ...

         既然问题已经得到解决,你就请你设置 "最佳答案"

桃花飞舞 发表于 2022-11-4 22:54:07

你的代码没什么问题,就是缩进太差
#include <stdio.h>
#include <math.h>
int main(void)
{
        int a={8,7,6,5,3,2,1},top,bott,flag = 1,sign = 1;
        int n,avg;
        char c;
        while (sign)
        {
                scanf("%d",&n);
                if( n > a || n < a )
                {
                        printf("不在范围内重新输入");
                        continue;
                }
                else
                {
                        top = 0;
                        bott = 6;

                        while ( (flag ) && (top<=bott) )
                        {
                                avg = ( top + bott ) / 2 ;
                                if (a == n)
                                {
                                        printf("该数的位置在%d",avg+1);
                                        break;
                                }
                                else
                                {
                                        if (n < a )
                                                top = avg+1;
                                        else
                                                bott = avg-1;
                                }
                        }

                        if(top > bott)
                        {
                                printf("无此数");
                        }
                        printf("\n是否继续查找");
                        getchar();
                        scanf("%c",&c);

                        if (c == 'N' || c =='n')
                        {
                                printf("\n好的");
                                sign = 0;
                        }
                        else
                        {
                                printf("\n请输入");
                        }
                }
        }   
}

kevinde2022 发表于 2022-11-7 17:03:42

桃花飞舞 发表于 2022-11-4 22:54
你的代码没什么问题,就是缩进太差

从python那边过来开始学C,缩进特别不舒服,还在习惯。
页: [1]
查看完整版本: 小白求助 查找一个数是不是在某个数组里