有点不明白

看似疯癫 2012-12-22 07:36:11
在论坛看到别人的贴,自己运行改了下,但是不明白原因
主要问题是,为什么数组不是从下标为0开始输出,而是从1开始
#include<stdio.h>
#include<stdlib.h>
void Bouble(int n,int a[]){
int i,j,temp;
for(j=0;j<n;j++){
for(i=0;i<n-j;i++){
if (a[i]>a[i+1]) {
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
}
printf("the result is:\n");
for(i=1;i<n+1;i++){ //i为什么不能从0开始算
printf("%3d",a[i]);
}
printf("\n");
}
void Find(int n,int a[]){

int x,top=1,bot=n; //为什么不是n-1,为什么不行?
int mid;
printf("输入要查找的数:\n");
scanf("%d",&x);
while(top<=bot){
mid=(top+bot)/2;
if(x==a[mid]){
printf("找到元素,位置为:%d\n",mid);
exit(0);
}
else if (x>a[mid]) top=mid+1;
else if (x<a[mid])bot=mid-1;
}
printf("没有找到该元素!\n");
}
void main(){
int a[10],n,i=0;
printf("输入数组长度n:\n");
scanf("%d",&n);
printf("输入数组元素:\n");
for(i=0;i<n;i++){ //从这里看应该是从数组下标为0开始赋值的
scanf("%d",&a[i]);
}
printf("输入的数组为:\n");
for(i=0;i<n;i++){
printf("%d\n",a[i]);
}
Bouble(n,a);
Find(n,a);
}
...全文
121 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
图灵狗 2012-12-22
  • 打赏
  • 举报
回复
修改是一个整体,下面的某些边界和判断也要跟着改才行啊。
引用 4 楼 melon_o 的回复:
引用 2 楼 turingo 的回复:根据算法来,你用1和n,或者是0和n-1都可以,本质上没什么差别。 如果用0到n-1,结果是不可行的,a[0]的值是错误的
看似疯癫 2012-12-22
  • 打赏
  • 举报
回复
引用 2 楼 turingo 的回复:
根据算法来,你用1和n,或者是0和n-1都可以,本质上没什么差别。
如果用0到n-1,结果是不可行的,a[0]的值是错误的
看似疯癫 2012-12-22
  • 打赏
  • 举报
回复
引用 1 楼 fanstysword 的回复:
没有错啊,n是个数,最少也是1,如果n-1的话旧没有意义了
数组下标从0到n-1表示n个数,无法输出a【0】
图灵狗 2012-12-22
  • 打赏
  • 举报
回复
根据算法来,你用1和n,或者是0和n-1都可以,本质上没什么差别。
fanstysword 2012-12-22
  • 打赏
  • 举报
回复
没有错啊,n是个数,最少也是1,如果n-1的话旧没有意义了
看似疯癫 2012-12-22
  • 打赏
  • 举报
回复
引用 8 楼 h_w_m 的回复:
C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include<stdio.h>#include<stdlib.h>void Bouble(int n,int a[]){ int i,j,temp; fo……
原来如此,谢啦!
h_w_m 2012-12-22
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
void Bouble(int n,int a[]){
	int i,j,temp;
	for(j=0;j<n-1;j++){//****  j<n ==> j<n-1
		for(i=0;i<n-j-1;i++){//**** i<n-j ==> i<n-j-1
			if (a[i]>a[i+1]){
				temp=a[i];
				a[i]=a[i+1];
				a[i+1]=temp;
			}
		}
	}
	printf("the result is:\n");
	for(i=0;i<n;i++){      
		printf("%3d",a[i]);
	}
	printf("\n");
}
void Find(int n,int a[]){
	int x,top=0,bot=n-1;      
	int mid;
	printf("输入要查找的数:\n");
	scanf("%d",&x);
	while(top<=bot){
		mid=(top+bot)/2;
		if(x==a[mid]){
			printf("找到元素,位置为:%d\n",mid+1);//不习惯于说第0个 找成非0自然数序号
			return;
		}
		else if (x>a[mid]) top=mid+1;
		else if (x<a[mid]) bot=mid-1;
	}
	printf("没有找到该元素!\n");
}
void main(){
	int a[10],n,i=0;
	printf("输入数组长度n:\n");
	scanf("%d",&n);
	printf("输入数组元素:\n");
	for(i=0;i<n;i++){                     
		scanf("%d",&a[i]);	
	}
	printf("输入的数组为:\n");
	for(i=0;i<n;i++){
		printf("%d\n",a[i]);
	}
	Bouble(n,a);
	Find(n,a);
}
原来的冒泡排序错误,越界1,把一个无效数据排到第0个上去了,改正好,下标是从0开始到n-1止
看似疯癫 2012-12-22
  • 打赏
  • 举报
回复
引用 5 楼 turingo 的回复:
修改是一个整体,下面的某些边界和判断也要跟着改才行啊。 引用 4 楼 melon_o 的回复:引用 2 楼 turingo 的回复:根据算法来,你用1和n,或者是0和n-1都可以,本质上没什么差别。 如果用0到n-1,结果是不可行的,a[0]的值是错误的
我下面给出了错误的代码,但是我没看出来越界,运行结果是错的
看似疯癫 2012-12-22
  • 打赏
  • 举报
回复
下面给出错误的:a[0]输入值是错误,必须往后挪一个 #include<stdio.h> #include<stdlib.h> void Bouble(int n,int a[]){ int i,j,temp; for(j=0;j<n;j++){ for(i=0;i<n-j;i++){ if (a[i]>a[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } } } printf("the result is:\n"); for(i=0;i<n;i++){ printf("%3d",a[i]); } printf("\n"); } void Find(int n,int a[]){ int x,top=0,bot=n-1; int mid; printf("输入要查找的数:\n"); scanf("%d",&x); while(top<=bot){ mid=(top+bot)/2; if(x==a[mid]){ printf("找到元素,位置为:%d\n",mid); exit(0); } else if (x>a[mid]) top=mid+1; else if (x<a[mid])bot=mid-1; } printf("没有找到该元素!\n"); } void main(){ int a[10],n,i=0; printf("输入数组长度n:\n"); scanf("%d",&n); printf("输入数组元素:\n"); for(i=0;i<n;i++){ scanf("%d",&a[i]); } printf("输入的数组为:\n"); for(i=0;i<n;i++){ printf("%d\n",a[i]); } Bouble(n,a); Find(n,a); }

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧