鱼C论坛

 找回密码
 立即注册
查看: 2597|回复: 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()就成功了,谢谢你帮我扫除一个知识盲点,忘了回车会被当做字符读 ...

         既然问题已经得到解决,你就请你设置 "最佳答案"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[6] || n > a[0]) {
                        printf("目标数不在范围内\n")                       ; 
                } else {
                        top = 0                                            ;
                        bott = 6                                           ;
                        flag = 1                                           ;  // 应对多次查找,必须每次重新初始化 flag
                        while(flag && top <= bott) {
                                avg = (top + bott) / 2                     ;
                                if (a[avg] == n) {
                                        printf("该数的位置在%d\n" , avg+1) ;
                                        flag = 0                           ;
                                } else {
                                        if(n < a[avg]) 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")                                               ;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

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

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

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

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

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

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

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

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

好的


D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我把这句fflush(stdin) 替换成getchar()就成功了,谢谢你帮我扫除一个知识盲点,忘了回车会被当做字符读取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

         既然问题已经得到解决,你就请你设置 "最佳答案"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-4 22:54:07 | 显示全部楼层
你的代码没什么问题,就是缩进太差
#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 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是否继续查找");
                        getchar();
                        scanf("%c",&c);

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

从python那边过来开始学C,缩进特别不舒服,还在习惯。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 16:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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