| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 747 人关注过本帖
标题:[原创]求助:一个有关循环的问题
只看楼主 加入收藏
mazy
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2005-9-7
收藏
 问题点数:0 回复次数:8 
[原创]求助:一个有关循环的问题

有5个数按从大到小的顺序存放在一个数组中,输入一个数,要求按折半查找法找出该数组中的第几个元素的值。如果该数不在数组中,则打印出“无此表”。

程序如下:

#include<stdio.h> #define N 5

main() { int i,number,top,bott,mid,loca,a[N],flag=0,sign=1; char c; printf("Enter data:\n"); scanf("%d",&a[0]); i=1; while(i<N) { scanf("%d",&a[i]); if(a[i]>=a[i-1]) i++; else printf("Enter the number angain:"); } printf("\n");

for(i=0;i<N;i++) printf("%4d",a[i]); printf("\n"); flag=1; while(flag) { printf("Input the number to look for:"); scanf("%d",&number); loca=0; top=0; bott=N-1; if(number<a[0]||number>a[N-1]) flag=-1; while((sign==1)&&(top<=bott)) { mid=(bott+top)/2; if(number==a[mid]) { loca=mid; printf("Find %d ,its position is %d\n",number,loca+1); sign=0; } else if(number<a[mid]) bott=mid-1; else bott=mid+1; } if((sign==1)||loca==-1) printf("%d is not found .\n",number); printf("Continue or not(Y/N)?"); scanf("%c",&c); if(c=='N'||c=='n') flag=0; } }

这是其中一个的结果:

Enter data: 1 2 3 4 5

1 2 3 4 5 Input the number to look for:3 Find 3 ,its position is 3 Continue or not(Y/N)?Input the number to look for:

我的问题是:怎么样使“Continue or not(Y/N)?”这个循环有效,还有就是不要后面那句“Input the number to look for:”。

请高手指点。

搜索更多相关主题的帖子: 循环 有关 问题 
2005-10-08 20:56
raul
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2005-5-24
收藏
得分:0 
字太小,看不见啊
2005-10-08 21:03
五等公民
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-10-7
收藏
得分:0 

if(number<a[0]||number>a[N-1]) flag=-1; 首先,如果没理解错,你这里应该用错了变量~~ …………………………… …………………… sign=0; } ………… 另,你这里令sign为0,初始化的又是在一开始的地方,那么当第二次循环时,这个值还是0不会进入循环!

最后,再看看这个或许有用http://www.ezikao.com.cn/art.view.asp?artid=1445 希望这个答案是对的哦


群号:18814536 ASP初学者交流的天堂,欢迎加入 注:群主非高手
2005-10-08 23:24
wdz555
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2005-10-9
收藏
得分:0 
麻烦下次有点注释好吗 我要看晕了!!!!! 你差一个清除流函数ffluch(stdin); ffluch(stdin); printf("Continue or not(Y/N)?"); scanf("%c",&c); if(c=='N'||c=='n') flag=0;

[此贴子已经被作者于2005-10-9 14:14:18编辑过]


2005-10-09 14:12
五等公民
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-10-7
收藏
得分:0 
哈哈,楼上的仁兄~~

比我晚了二天注册,居然比我高分~~

群号:18814536 ASP初学者交流的天堂,欢迎加入 注:群主非高手
2005-10-09 17:32
toraji
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2005-10-10
收藏
得分:0 
字太小了。cp下来看看
2005-10-10 13:11
philip_yin
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2005-10-6
收藏
得分:0 
说明:你的这个程序原本我也很纳闷,百思不得其解,看了wdz555(第4楼)的帖子才明白,他推荐的网页介绍的很不错。感谢wdz555! 下面是我改动的程序,改的地方都有注释,测试过,完全没有问题了。

2005-10-10 17:12
philip_yin
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2005-10-6
收藏
得分:0 

#include<stdio.h> #define N 5

int main() //main前加了int,在程序尾部加了return 0,还是标准一些养成好习惯吧 { int i,number,top,bott,mid,a[N],flag=0,sign=1; //去掉了loca变量,根本就是多余的 char c; //输入5个数(从小到大输入) printf("Enter data:\n"); scanf("%d",&a[0]); i=1; while(i<N) { scanf("%d",&a[i]); if(a[i]>=a[i-1]) i++; else printf("Enter the number angain:"); } printf("\n");

//输出这5个数 for(i=0;i<N;i++) printf("%4d",a[i]); printf("\n");

//开始对半查找算法 flag=1; while(flag) { sign = 1; //此处增加这个语句,使得第二次开始的循环(假如有)能够进行 printf("Input the number to look for:"); scanf("%d",&number); top=0; bott=N-1; //去掉了loca=0语句 if((number<a[0])||(number>a[N-1])) flag=-1; while((sign==1)&&(top<=bott)) { mid=(bott+top)/2; if(number==a[mid]) { //去掉了loca=mid语句 printf("Find %d ,its position is %d\n",number,mid+1); //loca+1变为mid+1 sign=0; } else if(number<a[mid]) bott=mid-1; else top=mid+1; //你原先的程序是bott=mid+1,错了,应该是top=mid+1 } if(sign==1) //去掉了loca==-1这个判断条件 printf("%d is not found .\n",number); printf("Continue or not(Y/N)?\n"); fflush(stdin); //增加了此函数,清除缓冲空间,问题就出在这里 scanf("%c",&c); if(c=='N'||c=='n') flag=0; } return 0; //配合int main()使用 }


2005-10-10 17:13
不走寻常路
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2005-9-26
收藏
得分:0 
把字放大点又不收你钱,呵呵,下次记住了

学C不长,但很喜欢,梦想能成为编程一族! qq: 83461951 欢迎来指教!
2005-10-10 17:13
快速回复:[原创]求助:一个有关循环的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017958 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved