在C中查找数组的峰值编号

时间:2017-08-31 07:18:50

标签: c arrays algorithm loops

我是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]

3 个答案:

答案 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
}

Try it online

  

我正在尝试编写一个代码来查找数组中的峰值数,   这是大于前后数字的数字   说的数字

我认为第一个和最后一个号码无法满足此要求,因为它们只有一个邻居。

答案 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语句中的条件可能会以更优雅的方式编写。