小白求助 查找一个数是不是在某个数组里
最后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: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") ;
}
} jackz007 发表于 2022-11-4 13:01
我试了你的代码,最后输入是否继续查找那里 还是不运行 if(c == 'N' || c == 'n'),还有那个键盘缓冲区一般啥时候要清空啊,确实读取了回车,但是你写的fflush那句好像没起作用 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> jackz007 发表于 2022-11-4 13:37
是吗,你真的仔细试过了?
看看我这里的编译、运行实况吧
我把这句fflush(stdin) 替换成getchar()就成功了,谢谢你帮我扫除一个知识盲点,忘了回车会被当做字符读取 kevinde2022 发表于 2022-11-4 13:49
我把这句fflush(stdin) 替换成getchar()就成功了,谢谢你帮我扫除一个知识盲点,忘了回车会被当做字符读 ...
既然问题已经得到解决,你就请你设置 "最佳答案" 你的代码没什么问题,就是缩进太差
#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请输入");
}
}
}
}
桃花飞舞 发表于 2022-11-4 22:54
你的代码没什么问题,就是缩进太差
从python那边过来开始学C,缩进特别不舒服,还在习惯。
页:
[1]