我只是C.的初学者 我正在尝试制作一个简单的程序来按升序排列用户输入的数字。我已经找到了解决方案,但无法理解为什么我的其他代码不起作用:(
-------------------------------------------------------------------------
working code:
-------------------------------------------------------------------------
#include <stdio.h>
int main()
{
int i,j,num[10];
printf("Enter 10 numbers\n");
for (i=0;i<10;i++)
{scanf("%d",&num[i]);}
for (i=0;i<9;i++)
{
for (j=i+1;j<10;j++)
{
if (num[i]>num[j])
{
num[i]+=num[j];
num[j]=num[i]-num[j];
num[i]=num[i]-num[j];
}
}
}
printf("The numbers in ascending order are:");
for (i=0;i<10;i++)
{
printf(" %d",num[i]);
}
return 0;
}
-------------------------------------------------------------------------
code that won't work:
-------------------------------------------------------------------------
#include <stdio.h>
int main()
{
int i,j,num[10];
printf("Enter 10 numbers\n");
for (i=1;i<=10;i++)
{scanf("%d",&num[i]);}
for (i=1;i<10;i++)
{
for (j=i+1;j<=10;j++)
{
if (num[i]>num[j])
{
num[i]+=num[j];
num[j]=num[i]-num[j];
num[i]=num[i]-num[j];
}
}
}
printf("The numbers in ascending order are:");
for (i=1;i<=10;i++)
{
printf(" %d",num[i]);
}
return 0;
}
在后一个程序中,数字出现乱序,甚至还有未输入的数字。
我的问题是,它的代码基本相同吗?只是在后一个程序中,数字将从num[1]
存储到num[10]
而不是num[0]
到num[9]
?
它与数组定义有关吗?
看来我有严重的误解,请帮帮我!
答案 0 :(得分:8)
在C中,当你有int num[10];
时,你的索引需要从0到9,从不到10.所以查看你的代码,如果有i
或j
结束在程序运行期间任何时候都是10,这是个坏消息。
答案 1 :(得分:1)
C中的索引从0开始。所以当你声明一个大小为10的数组,并且你试图获得索引为10的元素时,你实际上得到了第11个元素。由于您尚未定义第11个元素,因此数组很可能会从内存中获取一些随机数,这就是您注意到已输入注释的数字的原因。
由于您不熟悉编程,我建议您现在花些时间真正了解C如何管理内存,以及不同的数据结构如何访问内存。现在可能有点无聊,但是你将来会为自己省去一些麻烦,你将开始建立良好的习惯和良好的做法,这将导致编写好的,最佳的代码
答案 2 :(得分:0)
在非工作示例中,您的内存访问无效。例如,当i = 9且j = 10时,您访问num [10],这是无效的内存。
答案 3 :(得分:0)
for(i=0;i<9;i++) //**i<9**
for (j=i+1 ...)
如果i = 8则j = 9,一切正常。
在第二个代码段中:
for(i=0;i<10;i++) //**i<10**
for (j=i+1 ...)
如果i = 9则j = 10,那么你试图访问num [10]并且它会给你错误。
如果要访问num [10],则必须声明array int num [11],然后才能访问num [10]。
int num [10]
答案 4 :(得分:0)
欢迎编程!我相信你对如何在C中索引数组感到有点困惑。
大多数语言(包括C)中的数组称为零索引数组。这意味着数组的开始总是在位置0.所以如果你使用int [10],尝试访问num [10]实际上根本不是有效的调用,因为start是num [0]。因此,您只能从num [0]访问num [9]。
这是一个容易犯的错误,即使我已经编程了多年,有时当它是一个漫长的夜晚,我仍然会做出愚蠢的数组索引问题。
答案 5 :(得分:0)
在您的other code
示例中,您正在执行此操作:
int num[10];
for(int i = 1; i <= 10; i++) {
//...
}
这意味着您有一个包含十个空格[0-9]
的数组,而对于for循环的最后一部分,您试图访问不存在的num[10]
。
您的工作示例来自0-9
,从不尝试阅读num[10]
,因此可行。
与大多数语言一样,C中的数组从位置0开始,并将其计为位置1。因此,数组的最后一个元素将是您在声明变量时输入的大小减一。