[C] Program scalający tablice


(Mydoom92) #1

Witam! Muszę napisać program, w którym użytkownik do dwóch tablic wprowadza liczby. Zbiory te następnie muszą być posortowane. Następnie posortowane zbiory muszą być scalone w jeden ułożone w kolejności bez używania sortowania (stosując zasadę jeśli element Zb1 większy od elementu Zb2 to zapisuje element z tego pierwszego, gdy inaczej, to element z tego drugiego. Napisałem, jednak nie wiem czemu program nie działa poprawnie, proszę o pomoc.

#include 

#include 


void babel(int table[30], int size);


int main()

{

  int a,b,k=0,p,d,x=0,z=0,temp,i;

  int *memory1, *memory2, *memory3;


  printf("Podaj ile elementow ma pierwszy zbior?\n");

  scanf("%d", &a);

  printf ("\n");

  memory1=(int*)calloc(a,sizeof(int));


  if(memory1==NULL)

  exit(1);


  printf("Podaj ile elementow ma drugi zbior?\n");

  scanf("%d", &b);

  printf ("\n");

  memory2=(int*)calloc(b,sizeof(int));


  if(memory2==NULL)

  exit(1);


  for( p=0; p
       {

       printf("Podaj %d element pierwszego zbioru \n", p+1);

       scanf("%d", &memory1[p]);

       printf ("\n");

       }   


  for( d=0; d
       {

       printf("Podaj %d element drugiego zbioru \n", d+1);

       scanf("%d", &memory2[d]);

       printf ("\n");

       }


  memory3=(int*)calloc(a+b,sizeof(int));


  if(memory3==NULL)

  exit(1);


  babel(memory1,a);

  babel(memory2,b);


do

{

	 if (memory1[x] < memory2[z] || memory1[x] == memory2[z])

 {

	 temp=memory1[x];

	 x++;

 }

else

	{

	    temp=memory2[z];

		z++;

	}

	 memory3[k]=temp;

	 k++;

}

while(k



babel(memory3,a+b);


  printf("Tak wyglada zbior 1: \n");

  for( p=0; p
       {

       printf("%d \t", memory1[p]);

       }


  printf("\n Tak wyglada zbior 1: \n");

    for( d=0; d
       {

       printf("%d \t", memory2[d]);

       }


printf("\n Tak wyglada zbior scalony: \n");

    for( i=0; i
       {

       printf("%d \t", memory3[i]);

       }


 free(memory1);

 free(memory2);

 free(memory3);



  system("PAUSE");	

  return 0;

}



void babel(int table[30], int size)

{

        int i, j, temp;

        for (i = 0; i
                for (j=0; j
                        {

                                if (table[j] > table[j+1])

                                {

                                        temp = table[j+1];

                                        table[j+1] = table[j];

                                        table[j] = temp;

                                }

                        }

}



[/code]

Problem polega na tym, że sortuje ok, tylko pokazuje zły element numer jeden, nie wiem dlaczego :wink:


(Copycona) #2

Ja się odniosę jeszcze do tego, jak była pętla for :wink:

Pod dopisaniu takich testów do pętli for:

    for (i=0; i<(a+b); i++)    {        printf("test: x = %d, z = %d\n", x, z);        if ((memory1[x]  memory2[z]) || (memory1[x] == memory2[z]))        {            puts("jestem 1");

(Pablo_Wawa) #3

Zakładam, ze funkcja sortująca babel działa poprawnie (nie analizowałem, ale wygląda na dobra).

Pierwszy błąd masz po tym kodzie:

babel(memory1,a);

  babel(memory2,b);

Otóż nie inicjalizujesz zmiennych x i z (na wartości 0). <== EDIT: sorry, nie zauważyłem - jest to na początku Drugim błędem jest brak kontroli, czy zmienne te (x i z) nie doszły do końca wielkości tablicy (odpowiednio a i b) - można to robić albo w for, albo w if (patrz uwaga na końcu). Dodatkowo zamiast kodu

if (memory1[x] > memory2[z] || memory1[x] == memory2[z])

użyj po prostu

if (memory1[x] >= memory2[z])

Musisz uważać by wartości x lub z nie wyszły poza rozmiary tablic - wtedy należy przepisywać elementy tylko z drugiej tablicy.

EDIT: widze, że ktoś był szybszy i Ci poprawił pętlę for.


(Mydoom92) #4

Dzięki za pomoc :wink:, faktycznie nie zauważyłem, że użyłem nie tego znaku. Aczkolwiek nie wpadłbym na to, żeby kontrolować x i z :wink:


([alex]) #5

Pętlę scalającą da się uprościć do:

for (i=x=z=0;i
     {

      if((z>=b)||(memory1[x]<=memory2[z])) memory3[i]=memory1[x++];

      else memory3[i]=memory2[z++];

     }[/code]

Ale nie jest to najwydajniejszy sposób, lepiej zrobić dłuższym kodem ale wydajniejszym:

[code]i=x=z=0;