我是C新编码的新手。我正在尝试编写一个代码,用于查找数组中的峰值数,即大于该数字前后数字的数字。
这是我的代码。它运行没有错误但没有输出,所以我知道我做错了。
#include <stdio.h>
int main() {
int nums[14] = {1, 2, 3, 3, 2, 4, 1, 5, 6, 3, 1, 10, 2, 8};
int peaks[4];
for(int i = 0; i < nums[i]; i++){
if(nums[i] > nums[i-1] && nums[i] > nums[i+1]){
peaks == nums[i];
}
return peaks;
}
printf("Peak numbers are %d",peaks);
}
如何将其输出为结果:[4, 6, 10, 8]
答案 0 :(得分:5)
启用编译器的warnigs !!!你应该得到这样的东西:
prog.c: In function 'main':
prog.c:8:16: warning: comparison between pointer and integer
peaks == nums[i];
^~
prog.c:8:16: warning: statement with no effect [-Wunused-value]
peaks == nums[i];
~~~~~~^~~~~~~~~~
prog.c:10:13: warning: returning 'int *' from a function with return type 'int' makes integer from pointer without a cast [-Wint-conversion]
return peaks;
^~~~~
prog.c:10:13: warning: function returns address of local variable [-Wreturn-local-addr]
prog.c:13:28: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=]
printf("Peak numbers are %d",peaks);
~^ ~~~~~
%ls
所以,改变一下:
peaks == nums[i];
到此:
peaks[j] = nums[i];
其中j
是您可以使用的另一个计数器。
然后你return peaks
,为什么?它不是自定义函数,所以你不应该返回。
此外,您尝试打印如下数组:
printf("Peak numbers are %d",peaks);
这是不可能的,你需要循环遍历数组的元素,如下所示:
for(i = 0; i < 4; ++i)
printf("%d\n", peaks[i]);
在纠正警告后,您已准备好实际处理yuor逻辑。你的for循环不会迭代所有数组的数组。所以改变这个:
for(i = 0; i < nums[i]; i++)
到此:
for(i = 0; i < 14; i++)
此外,您的if语句将导致未定义的行为:
if(nums[i] > nums[i-1] && nums[i] > nums[i+1])
i
为0且i
为13时
答案 1 :(得分:3)
在这里你有一个更正的程序版本,你的错误在评论中:
#include <stdio.h>
int main() {
int nums[14] = {1, 2, 3, 3, 2, 4, 1, 5, 6, 3, 1, 10, 2, 8};
int peaks[4];
int ctr=0; // counter to count the amount of peaks
for(int i = 1; i < 13; i++){ // start with one and end with 12, so you don't access elements outside of your array (-1 and 14)
// You need to implement special cases for the first and the last element
if(nums[i] > nums[i-1] && nums[i] > nums[i+1]){
peaks[ctr] = nums[i]; // use an assignment instead of a comparison
ctr++; // increment counter
}
// No return here, it will end your main and the print will never be reached
}
printf("Peak numbers are ");
for(int i = 0; i<ctr; i++)
printf("%d ", peaks[i]); // Print all the peaks you found, you need to print every element separate
return 0; // main needs a return value
}
我正在尝试编写一个代码来查找数组中的峰值数, 这是大于前后数字的数字 说的数字
我认为第一个和最后一个号码无法满足此要求,因为它们只有一个邻居。
答案 2 :(得分:1)
此程序适用于nums
数组中任何数量的元素,并且它正确地考虑了第一个和最后一个元素。
[sizeof(nums)/sizeof(nums[0])
是nums
数组中元素的实际数量,因此yolu可以将任意数量的元素放入nums
数组中,程序将始终正常工作
此外,peaks
的元素数量不再被硬编码为4
,而是与num
中的元素数量相同,因此我们可以确保赢得“{1}}是任何索引超出范围的问题。但是,由于大小为n
的数组的最大峰数为n/2 + 1
(不太确定),我们可能会写int peaks[sizeof(nums)/sizeof(nums[0])/2+1]
#include <stdio.h>
int main() {
int nums[] = { 1, 2, 3, 3, 2, 4, 1, 5, 6, 3, 1, 10, 2, 8 };
int peaks[sizeof(nums)/sizeof(nums[0])];
int pi = 0;
for (int i = 0; i < sizeof(nums)/sizeof(nums[0]); i++) {
if (
(i == 0 && nums[i + 1] < nums[i]) || /* first element */
(i == sizeof(nums) / sizeof(nums[0]) && nums[i - 1] < nums[i]) || /* last element */
(nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) /* elements in the middle */
)
{
peaks[pi++] = nums[i];
}
}
for (int i = 0; i < pi; i++)
printf("%d ", peaks[i]);
}
但是if
语句中的条件可能会以更优雅的方式编写。