0

配列はコードで定義されており、元の配列の正の数が元の配列の負の数よりも大きい場合は、配列内の正の数を数えて新しい配列を作成し、すべての正の数を挿入する必要があります。反対の場合 (負の数が正の数よりも大きい場合、新しい配列を作成し、すべての負の数を挿入します)

等しい場合 (正の数と負の数)、新しい配列を作成し、最初にすべての正の数を挿入し、次にすべての負の数を挿入します。

*関数内で malloc.. を使用して配列を作成する必要があります。

コード :

#include <stdio.h>
#define n 10
void func(int *arr)
{
    int i,j,c1=0,c2=0,mat;
    for(i=0;i<n;i++)
    {
        if (*arr>=0) c1++;
        else c2++;
        arr++;
    }
    if(c1>c2)
    {
        mat=(int *)malloc(c1*sizeof(int));
        for(i=0;i<c1;i++)
        if(*arr>0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
    }
        else   if(c2>c1)
     {
        mat=(int *)malloc(c2*sizeof(int));
        for(i=0;i<c2;i++)
        if(*arr<0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
    }
    else
    {
        mat=(int *)malloc((c1+c2)*sizeof(int));
        for(i=0;i<n;i++)
        if(*arr>0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
        for(i=0;i<n;i++)
        if(*arr<0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
    }
}
main()
{
    int array={6,3,5,-5,4,3,-6,-9,6,-16};
    int *arr=array;
    func(arr);
}
4

3 に答える 3

0

次の変更を加えて(アイデア全体を維持しようとしていますが)、現在は機能していると思います:1. mat は int ではなく int* であり、返されて解放されarrます例) 3. より多くのテスト ケース。

それが良い解決策であることを願っています、頑張ってください!

#include <stdio.h>
#include <malloc.h>

#define n 10
int* func(int *arr, int* size)
{
int i,j=0,c1=0,c2=0;
int* mat;
for(i=0;i<n;i++)
{
    if (arr[i]>=0) c1++;
    else c2++;
    //arr++;
}
if(c1>c2)
{
    *size = c1;
    mat=(int *)malloc(c1*sizeof(int));
    for(i=0;i<n;i++)
    if(arr[i]>=0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
}
    else   if(c2>c1)
 {
     *size = c2;
    mat=(int *)malloc(c2*sizeof(int));
    for(i=0;i<n;i++)
    if(arr[i]<0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
}
else
{
    *size = c1+c2;
    mat=(int *)malloc((c1+c2)*sizeof(int));
    for(i=0;i<n;i++)
    if(arr[i]>=0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
    for(i=0;i<n;i++)
    if(arr[i]<0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
}

    return mat;
}
void main()
{
//int array[n]={6,3,5,-5,4,3,-6,-9,6,-16};
//int array[n]={6,-2,-5,4,3,-6,-9,6,-16, -1};
int array[n]={-6,3,5,-5,4,3,-6,-9,6,-16};
int *arr=array;
int size;
int* mat = func(arr, &size);
for (int i = 0; i < size; ++i)
    printf("%d ", mat[i]);
printf("\n");
free(mat);
}
于 2013-05-21T14:04:48.873 に答える
0

このプログラムには、2 つの最も一般的なプログラミング エラーがあります。

1.) mat=(int *)malloc(c1*sizeof(int));

mat整数として宣言されます。malloc割り当てられたメモリへの void ポインターを返し、それを整数ポインターに型キャストします。したがってmat、整数ではなく整数へのポインタにする必要があります。の宣言は以下のようにmatする必要があります。

int *mat;

2.)arr++;

配列算術演算ではなく、配列インデックスを使用して配列にアクセスします。

配列演算では、配列arrの最後を指します。次に をインクリメントarrすると、クラッシュの原因となった可能性のある配列の範囲外にアクセスしようとしています。

于 2013-05-22T06:07:59.103 に答える