我在函数定义中犯了什么错误(C)

时间:2015-10-15 07:57:55

标签: c arrays pointers

所以我有这个代码应该这样做

// REQUIRES: n >= 1. Elements a[0] ... a[n-1] exist. 
// PROMISES
//   If n == 1, returns 1.
//   Returns 1 if all of a[0] <= a[1] ... a[n-2] <= a[n-1] are true.
//   Otherwise, returns 0.


#include <assert.h>

#include "array-utils4F.h"

#define UNIT_TESTS 1
int is_sorted(const int *a, int n)
{
  assert (n >= 1);

  if (n == 1)
    return 1;

  int k ;
  for (k = 1; k < n ; k++) {
    if (a[k-1] > a[k])
      return 0;

      return 1;
  }
}

int max_el(const int *a, int n)
{
  assert(n >= 1);

  int result = 0, i;
  for (i = 0; i < n; i++)
    if (a[i] > result)
      result = a[i];
  return result;
}

#ifdef UNIT_TESTS
#include <stdio.h>


#define COUNT(x) (sizeof(x)/sizeof(x[0]))

void test_is_sorted(const char *tag, const int *a, int n, int expected_rv);
void test_max_el(const char *tag, const int *a, int n, int expected_rv);

int main(void)
{
  int test_01[] = { 10, 20, 30, 40, 50 };
  int test_02[] = { 10, 10, 10, 10 };
  int test_03[] = { 10, 20, 30, 40, 35 };
  int test_04[] = { 10, 20, 30, 25, 40 };
  int test_05[] = { 10, 5, 15, 25 };
  test_is_sorted("test_01", test_01, COUNT(test_01), 1);
  test_is_sorted("test_02", test_02, COUNT(test_02), 1);
  test_is_sorted("test_03", test_03, COUNT(test_03), 0);
  test_is_sorted("test_04", test_04, COUNT(test_04), 0);
  test_is_sorted("test_05", test_05, COUNT(test_05), 0);
  fputc('\n', stdout);

  int test_06[] = { 100, 1, 2, 3 };
  int test_07[] = { 1, 2, 100, 3 };
  int test_08[] = { 1, 2, 3, 100 };
  int test_09[] = { -1, -2, -3, -4 };
  int test_10[] = { -8, -7, -6, -7, -8 };
  test_max_el("test_06", test_06, COUNT(test_06), 100);
  test_max_el("test_07", test_07, COUNT(test_07), 100);
  test_max_el("test_08", test_08, COUNT(test_08), 100);
  test_max_el("test_09", test_09, COUNT(test_09), -1);
  test_max_el("test_10", test_10, COUNT(test_10), -6);
  fputc('\n', stdout);

  return 0;
}

void test_is_sorted(const char *tag, const int *a, int n, int expected_rv)
{
  printf("Testing is_sorted for case with tag \"%s\":", tag);
  if (expected_rv == is_sorted(a, n))
    printf(" Pass.\n");
  else
    printf(" FAIL!\n");
}

void test_max_el(const char *tag, const int *a, int n, int expected_rv)
{
  printf("Testing max_el for case with tag \"%s\":", tag);
  if (expected_rv == max_el(a, n))
    printf(" Pass.\n");
  else
    printf(" FAIL!\n");
}

#endif // #ifdef UNIT_TESTS

但是当我测试它时它不起作用,我可以改变什么。 当我使用此测试时int test_04[] = { 10, 20, 30, 35, 40 }; 它返回0.我做错了什么?我已经添加了我的整个代码但功能仍然显示出一些缺陷,idk为什么要这样做任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:2)

现在,当您执行if (a[0] <= a[k+ 1])时,只需检查数组中的所有值是否大于或等于数组的第一个元素。您必须检查元素是否大于或等于前一个元素,以及它是否小于或等于下一个元素。

int is_sorted(const int *a, int n)
{
   assert (n >= 1);

   int k;
   for (k = 1 ; k < n ; k++) {
      if (a[k-1] > a[k])
        return 0;
   }
   return 1; 
}

当您知道数组未排序时,您可以直接返回result,而不是使用变量0

答案 1 :(得分:1)

没有添加局部变量

int is_sorted(const int *a, int n) {
   assert (n >= 1);

   while (--n)
      if (a[n] < a[n-1])
         return 0;
   return 1; 
}

答案 2 :(得分:0)

试试这个

int is_sorted(const int *a, int n)
{
  assert (n >= 1);

  if (n == 1)
    return 1;

  int k, result=1;
  for (k = 0; k < n - 1; k++) {
    if (a[k] > a[k+ 1])
     {
         result = 0;
         break;
     }
  }
  return result;
}