【问题标题】:C code function calling not workingC代码函数调用不起作用
【发布时间】:2018-07-26 04:49:01
【问题描述】:

好的,我需要编写两个迭代和递归函数来计算数组中的负元素,然后我需要构建 main.我只能编写递归函数,但我不能从 main 调用它,这是某个地方的错误。有人可以帮我解决它并帮助我使用迭代方法吗?

#include <stdio.h>

main()
{
    int vektor[100];
    int i, madhesia;

    /* Input size of array */
    printf("Madhesia e vektorit: ");
    scanf("%d", &madhesia);

    /* Input array elements */
    printf("Elementet: ");
    for (i = 0; i < madhesia; i++)
    {
        scanf("%d", &vektor[i]);
    }

    int ret = numero(vektor, madhesia);
    printf("\nTotal negative elements in array = %d", ret);

    return 0;
}

int numero(array, size)
{
    int count = 0;
    for (int j = 0; j < size; j++)
    {
        if (array[j] < 0)
        {
            count++;
        }
    }

    return count;
}

【问题讨论】:

标签: c arrays function for-loop recursion


【解决方案1】:

一个工作代码是这样的。你真的需要看看指针和它们的工作方式。 在这里您可以看到我在数组的开头有一个指针 ->pointing-

#include <stdio.h>


int numero(int* array, int size);
int* recursive_count(int* array, int size , int* counter );


int main()
{
    int vektor[100];
    int* vekt_ptr = &vektor[0];
    int i, madhesia;
    int counter;
    counter=0;

    /* Input size of array */
    printf("Madhesia e vektorit: ");
    scanf("%d", &madhesia);

    /* Input array elements */
    printf("Elementet: ");
    for (i = 0; i < madhesia; i++)
    {
        scanf("%d", &vektor[i]);
    }

    //int ret = numero(vekt_ptr, madhesia);
    recursive_count(vekt_ptr, madhesia , &counter );
    int ret = counter;
    printf("\nTotal negative elements in array = %d", ret);

    return 0;
}

int numero(int* array, int size)
{
    int count = 0;
    int j;
    for (j = 0; j < size; j++)
    {
        if (array[j] < 0)
        {
            count++;
        }
    }

    return count;
}

int* recursive_count(int* array, int size , int* counter )
{
    size--;
    if(array[size] < 0 )
    {
        (*counter)++;
    }
    if(size==0)
    {
        return NULL;
    }
    return recursive_count(array++, size , counter );
}

假设您要动态创建一个长度为 X 的数组。 编译器将为您的数组保留一些内存,具体取决于长度。 你初始化你的数组,比如说 [2][45][1][-5][99] 当您调用该函数时,您必须传递它在内存中的存储位置。 int* vekt_ptr = &vektor[0]; -s 会给出 0x56c2e0 之类的东西。 这个数字就是你的数组的地址,也就是数组的起始地址。这等于第一个字节的地址。 所以当你的函数开始时,它知道你的数组从哪里开始以及它有多长。

【讨论】:

  • 1) 对您的更改的一些描述(即什么和为什么)会改善您的答案,并且 2) 根本不需要 vekt_ptr - 直接使用 vektor 即可
  • 是的描述和解释正在更新。确实 int* ptr 不是必需的,但我用它来向他说明他必须做什么。
  • 你可以直接传递 &vektor[0] - 或者与 &vektor[0] 相同的 vektor。
  • @TsakiroglouFotis 我不同意使用vekt_ptr 可以让任何事情变得更清楚。对我来说,这只会增加混乱。 OP 似乎很清楚 vektor 可以直接传递,所以为什么要通过引入不必要的变量来混淆 OP。
  • 这实际上是迭代方法,递归方法是从自身内部调用自身的方法。
【解决方案2】:

将 numero() 的函数原型放在 main() 之前,以便能够调用它。用类型声明函数参数:

int numero(int array[], int size);

int main() {
...

【讨论】:

  • 我还要加:int numero(array, size) --> int numero(int* array, int size)
【解决方案3】:

一些可能的实现:

int iterativeCountNegativeIntegers (int *array, int size)
{
    int result = 0;
    for (int i = 0; i < size; ++ i)
         if (array[i] < 0)
             result += 1;
    return result;
}

int recursiveCountNegativeIntegers (int *array, int size)
{
    if (size == 0)
        return 0;

    int partial = *array < 0;
    return partial + recursiveCountNegativeIntegers(array+1, size-1);
}

相同,精简:

int iterativeCountNegativeIntegers_1 (int *array, int size)
{
    int result = 0;
    while (--size >= 0)
         result += *array++ < 0;
    return result;
}


int recursiveCountNegativeIntegers_1 (int *array, int size)
{
    return (size == 0) ? 0
      : (*array < 0) + recursiveCountNegativeIntegers_1(array+1, size-1);
}

【讨论】:

    【解决方案4】:

    对于根据 C 标准的初学者,不带参数的函数 main 应声明为

    int main( void )
    

    程序中使用的任何函数都应在使用前声明。

    函数定义的这个函数声明

    int numero(array, size)
    {
        // ...
    }
    

    无效,因为参数arraysize的类型未定义。

    对于数组的大小和元素的数量,最好使用无符号整数类型,例如size_t 或至少unsigned int

    程序可以如下所示

    #include <stdio.h>
    
    #define N   100
    
    size_t iterative_numero( const int array[], size_t size );
    size_t recursive_numero( const int array[], size_t size );
    
    int main( void )
    {
        int vektor[N];
        size_t madhesia = 0;
    
        /* Input size of array */
        printf("Madhesia e vektorit: ");
        scanf("%zu", &madhesia);
    
        if ( N < madhesia ) madhesia = N;
    
        /* Input array elements */
        printf("Elementet: ");
        for ( size_t i = 0; i < madhesia; i++ )
        {
            scanf( "%d", &vektor[i] );
        }
    
        size_t ret = iterative_numero(vektor, madhesia );
        printf("\nTotal negative elements in array = %zu\n", ret);
        ret = recursive_numero(vektor, madhesia );
        printf("Total negative elements in array = %zu\n", ret);
    
        return 0;
    }
    
    size_t iterative_numero( const int array[], size_t size )
    {
        size_t count = 0;
    
        for ( size_t i = 0; i < size; i++)
        {
            if ( array[i] < 0 )
            {
                count++;
            }
        }
    
        return count;
    }
    
    size_t recursive_numero( const int array[], size_t size )
    {
        return size == 0 ? 0 : ( array[0] < 0 ) + recursive_numero( array + 1, size - 1 );
    }
    

    程序输出可能看起来像

    Madhesia e vektorit: 10
    Elementet: 0 -1 2 -3 4 -5 6 -7 8 -9
    
    Total negative elements in array = 5
    Total negative elements in array = 5
    

    【讨论】:

      【解决方案5】:

      首先你所做的是迭代方法,而不是递归。这里我从主函数中调用了一个递归函数。

      #include <stdio.h>
      
      int main()
      {
      int vektor[100];
      int i, madhesia;
      
      /* Input size of array */
      printf("Madhesia e vektorit: ");
      scanf("%d", &madhesia);
      
      /* Input array elements */
      printf("\nElementet: ");
      for (i = 0; i < madhesia; i++)
      {
          scanf("%d", &vektor[i]);
      }
      
      printf("\nno of elements:%d",madhesia);
      printf("\n");
      
      for (i = 0; i < madhesia; i++)
      {
          printf("%d", vektor[i]);
      }
      printf("\n");
      i=0;
      
      int ret = numero(vektor,madhesia,0,i);
      printf("\nTotal negative elements in array = %d", ret);
      
      return 0;
      }
      
      int numero(int array[],int size,int count,int j)
      {
       if (j<=size-1)
      {
      if(array[j]<0)
          {
              count++;
              j++;
              numero(array,size,count,j);
      }
      
      else
      {
         j++;
         numero(array,size,count,j);
      
       }
       }
      
      return count;
      }
      

      【讨论】:

        【解决方案6】:
        #include<stdio.h>
        
        int numero(int *, int);    //Function Prototype (1)
        
        int main()      //Return Type (2)
        {
            int vektor[100];
            int i, madhesia;
            printf("Madhesia e vektorit: ");
            scanf("%d", &madhesia);
            printf("Elementet: ");
            for (i = 0; i < madhesia; i++)
            {
                scanf("%d", &vektor[i]);
            }
            int ret = numero(vektor, madhesia);
            printf("\nTotal negative elements in array = %d", ret);
            return 0;
        }
        
        int numero(int* array,int size)        //Parameters Data Type (3)
        {
            int count = 0;
            for (int j = 0; j < size; j++)
            {
                if (array[j] < 0)
                {
                    count++;
                }
            }
            return count;
        }
        

        错误:

        1. 你在“main()”之后声明了函数,所以程序不知道有函数,所以你必须在“main()”之前给出函数原型,以便程序知道前面有函数.
        2. 您错过了“main()”的返回类型,它是整数。
        3. 在函数声明中忘记写参数的数据类型。

        注意:数组总是通过引用传递,所以它必须接受一个整数指针而不是一个普通的整数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-03
          • 1970-01-01
          • 1970-01-01
          • 2014-02-08
          相关资源
          最近更新 更多