您最多只能将15个不同的负载从一个端口运输到另一个端口。运送这些货物的货船的载重量为50吨。枚举载荷,有关每个载荷重量的信息作为输入。
假设每个负载的重量小于或等于50吨且大于0。
您将在一行中从输入中读取每个负载的重量。您的输入将以-1结尾。您将打印必要的旅行次数。
样本输入:
50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 -1
输出:
15
但是出现此错误,并且每当我向程序提供输入时
./vpl_execution: line 5: 15093 Bus error (core dumped) ./main
通过我对这种情况的了解,我认为我并没有超出数组索引或使用了错误的指针。另外,我在这里看到了具有解决方案的相同问题,但我想知道为什么代码无法正常工作,然后自己解决问题。非常感谢您的帮助。
#include <stdio.h>
int main()
{ int w,i,t,sum,index;
int list[16];
w = 1;
do
{
scanf("%d",&w);
list[index] = w;
index++;
}while(w >= 0);
t = 0;
for(i = 0;i < ((sizeof(list)/sizeof(list[0]))+1);i++)
{
sum =0;
if(sum <= 50)
{sum += list[i];}
else
{t++;}
}
printf("%d",t);
return 0;
}
首先,您使用了未初始化的变量index
,请使用index=0
。
同样也有a maximum of 15 different
的问题,但是您使用的((sizeof(list)/sizeof(list[0]))+1)
除了其末尾的+1
之外,这将导致数组边界的传递,这将导致未定义的行为,这是错误的,因为您将在array
中元素较少的情况下完全遍历数组。您应在扫描数据时添加一个计数器,第二个循环应以此为基础。
您的代码也不同于问题,如果输入始终为0 < input <= 50
,则永远不会输入else statement
(t++
),而您将始终打印0
。您发现的是sum
而不是重量,并且在解释了有问题的输入后,您将始终打印t=0
。
我在do while循环中遇到分段错误
第一个分段错误发生在此行:
list[index] = w;
您认为index
的值是什么?
您未使用值进行初始化,该值可能应该为0
。
因此,访问list[index]
是未定义的行为。就您而言,它导致了分段错误。
然后在for(i = 0;i < ((sizeof(list)/sizeof(list[0]))+1);i++)
内
此处访问list[i]
可能会在i的最后一个值处引起另一个段错误。您应该从+1
]中删除((sizeof(list)/sizeof(list[0]))+1)
解决方案:
执行index = 0;
之前执行一次(C0]一次(初始化)>
从list[index] = w;
中删除+1
最好改变
[((sizeof(list)/sizeof(list[0]))+1)
to
[for(i = 0;i < ((sizeof(list)/sizeof(list[0])));i++)
,因为您已经知道for (i = 0; i < 16; ++i)
的大小。
这只是消除了段错误,代码中还有其他问题。
我想知道为什么代码不起作用,然后解决我自己的。
您的for循环内的逻辑是错误的。
list
此条件始终为真,并且永远不会执行增加sum =0;
if(sum <= 50)
的值的else块。因此,输出始终是您分配给t
的初始值。
提示:
继续添加货物(您的t
),直到不超过其最大容量(sum
吨)。只要总和超过50,就增加所需的货物数量(您的50
)并将t
重置为sum
。重复此过程,直到所有负载都被运输为止(for循环条件将解决此问题),但请记住在遇到0
时要循环到break
。