鱼C论坛

 找回密码
 立即注册
查看: 3451|回复: 7

[已解决]小白求助 查找一个数是不是在某个数组里

[复制链接]
发表于 2022-11-4 12:43:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最后scanf询问是否继续查找那里有问题,感觉最后一个scanf并没有运行,而且打N不继续的时候总会重复打印是否继续输入再停止。
#include <stdio.h>
#include <math.h>
int main(void)
    { int a[7]={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[0]||n<a[6])
        {printf("不在范围内重新输入");
        continue;}
      else
         {
          top = 0;
          bott = 6;
           while ((flag )&& (top<=bott))
           {
            avg = (top+bott)/2 ;
            if (a[avg] == n)
              {
              printf("该数的位置在%d",avg+1);
              break;
              }
            else
              if (n < a[avg] ) 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请输入");}
         }
         
      }     
    }
最佳答案
2022-11-4 14:31:23
kevinde2022 发表于 2022-11-4 13:49
我把这句fflush(stdin) 替换成getchar()就成功了,谢谢你帮我扫除一个知识盲点,忘了回车会被当做字符读 ...

         既然问题已经得到解决,你就请你设置 "最佳答案"
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-4 13:01:48 | 显示全部楼层
本帖最后由 jackz007 于 2022-11-4 13:21 编辑
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int a[] = {8,7,6,5,3,2,1} , top , bott , flag = 1 , sign = 1       ;
  5.         int i , n , avg                                                    ;
  6.         char c                                                             ;
  7.         while (sign) {
  8.                 printf("请输入目标数 : ")                                  ;
  9.                 scanf("%d" , & n)                                          ;
  10.                 if (n < a[6] || n > a[0]) {
  11.                         printf("目标数不在范围内\n")                       ;
  12.                 } else {
  13.                         top = 0                                            ;
  14.                         bott = 6                                           ;
  15.                         flag = 1                                           ;  // 应对多次查找,必须每次重新初始化 flag
  16.                         while(flag && top <= bott) {
  17.                                 avg = (top + bott) / 2                     ;
  18.                                 if (a[avg] == n) {
  19.                                         printf("该数的位置在%d\n" , avg+1) ;
  20.                                         flag = 0                           ;
  21.                                 } else {
  22.                                         if(n < a[avg]) top = avg + 1       ;
  23.                                         else bott = avg - 1                ;
  24.                                 }
  25.                         }
  26.                         if(flag) printf("查无此数!\n")                    ;
  27.                         printf("\n")                                       ;
  28.                         printf("是否继续查找 <Y/N> : ")                    ;
  29.                         fflush(stdin)                                      ;  // 读取字符前,先清空键盘缓冲区,否则,后面变量 c 读取到的一定是 '\n' 字符
  30.                         scanf("%c" , & c)                                  ;
  31.                         if(c == 'N' || c == 'n') {
  32.                                 printf("\n好的\n")                         ;
  33.                                 sign = 0                                   ;
  34.                         }
  35.                 }
  36.                 printf("\n")                                               ;
  37.         }
  38. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-4 13:32:37 | 显示全部楼层

我试了你的代码,最后输入是否继续查找那里 还是不运行 if(c == 'N' || c == 'n'),还有那个键盘缓冲区一般啥时候要清空啊,确实读取了回车,但是你写的fflush那句好像没起作用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  2. D:\[00.Exerciese.2022]\C>x
  3. 请输入目标数 : 7
  4. 该数的位置在2

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

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

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

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

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

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

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

  15. 好的


  16. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-4 13:49:08 | 显示全部楼层
jackz007 发表于 2022-11-4 13:37
是吗,你真的仔细试过了?
         看看我这里的编译、运行实况吧

我把这句fflush(stdin) 替换成getchar()就成功了,谢谢你帮我扫除一个知识盲点,忘了回车会被当做字符读取
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-4 14:31:23 | 显示全部楼层    本楼为最佳答案   
kevinde2022 发表于 2022-11-4 13:49
我把这句fflush(stdin) 替换成getchar()就成功了,谢谢你帮我扫除一个知识盲点,忘了回车会被当做字符读 ...

         既然问题已经得到解决,你就请你设置 "最佳答案"
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-4 22:54:07 | 显示全部楼层
你的代码没什么问题,就是缩进太差
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(void)
  4. {
  5.         int a[7]={8,7,6,5,3,2,1},top,bott,flag = 1,sign = 1;
  6.         int n,avg;
  7.         char c;
  8.         while (sign)
  9.         {
  10.                 scanf("%d",&n);
  11.                 if( n > a[0] || n < a[6] )
  12.                 {
  13.                         printf("不在范围内重新输入");
  14.                         continue;
  15.                 }
  16.                 else
  17.                 {
  18.                         top = 0;
  19.                         bott = 6;

  20.                         while ( (flag ) && (top<=bott) )
  21.                         {
  22.                                 avg = ( top + bott ) / 2 ;
  23.                                 if (a[avg] == n)
  24.                                 {
  25.                                         printf("该数的位置在%d",avg+1);
  26.                                         break;
  27.                                 }
  28.                                 else
  29.                                 {
  30.                                         if (n < a[avg] )
  31.                                                 top = avg+1;
  32.                                         else
  33.                                                 bott = avg-1;
  34.                                 }
  35.                         }

  36.                         if(top > bott)
  37.                         {
  38.                                 printf("无此数");
  39.                         }
  40.                         printf("\n是否继续查找");
  41.                         getchar();
  42.                         scanf("%c",&c);

  43.                         if (c == 'N' || c =='n')
  44.                         {
  45.                                 printf("\n好的");
  46.                                 sign = 0;
  47.                         }
  48.                         else
  49.                         {
  50.                                 printf("\n请输入");
  51.                         }
  52.                 }
  53.         }     
  54. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-7 17:03:42 | 显示全部楼层
桃花飞舞 发表于 2022-11-4 22:54
你的代码没什么问题,就是缩进太差

从python那边过来开始学C,缩进特别不舒服,还在习惯。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 18:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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