Jak złaczyć dwie tablice?

0

Jak złączyć 2 tablice posortowane niemalejąco w jedn,ą zapisując do tablicy trzeciej.....
dostajemy 2 posortowane, i wynikiem ma być trzecia tablica także posortowana składająca się z 2 poprzednich
Nie wiem jak to zrobić

2

Iterujesz po obu, kopiując mniejszy element, aż do końca obu tablic. Inkrementujesz tylko wskaźnik tej, z której skopiowałeś.

2

http://stackoverflow.com/a/19719407
Tutaj zakładają, że tablice mają ten sam rozmiar, ale nie powinno być problemem zmiana, by te początkowe tablice miały różne rozmiary.

0

zrobiłem ale sie program zawiesza :(

#include <stdio.h>
#define n_1 2
#define n_2 3

void merge(int tab1[], int tab2[], int tab3[], int amount)
{
    int amount_t1 = 0, amount_t2 = 0;
    int i = 0, j;
    while (tab1[i++] != '\0')
        ++amount_t1;
    i = 0;
    while (tab2[i++] != '\0')
        ++amount_t2;
    if (amount_t1 > amount_t2) {
        for (i = 0; i < amount_t2; ++i)
            if (tab1[i] < tab2[i] || tab1[i] == tab2[i])
                tab3[i] = tab1[i];
        for (i = 0; i + amount_t2 < amount; ++i)
            tab3[i] = tab1;
    }
    else {
        for (i = 0; i < amount_t1; ++i)
            if (tab1[i] < tab2[i] || tab1[i] == tab2[i])
                tab3[i] = tab1[i];
        for (i = 0; i + amount_t1 < amount; ++i)
            tab3[i] = tab2;
    }
    for (i = 0; i < 5; ++i)
        printf("%d\t", tab3[i]);
}
int main(int argc, char* argv[])
{

    int amount = n_1 + n_2;
    int tab1[n_1] = { 2, 4 };
    int tab2[n_2] = { 1, 3, 7 };
    int tab3[n_1 + n_2];
    merge(tab1, tab2, tab3, amount);

    return 0; 
0

Tablice nie są zakończone zerem. C-stringi są. Musisz przekazać wielkości tablic do funkcji.

0

no i wykodziłe, mogłem zajrzeć wcześniej do wykładu ;-; ,rozumiem o co chodziło z tymi wskażnikami
No i jest probem, bo działa poprawnie ale nie jak tablice są różnej długości

#include <stdio.h>
#define n_1 3
#define n_2 2

void merge(int tab1[], int tab2[], int tab3[], int n1, int n2)
{
    int amount = n1 + n2;
    int i = -1;
    int *W1 = tab1, *W2 = tab2; //dlaczego jak wpisywałem &tab1 to program się wkurzał ? to jest uzyskanie adresu adresu tablicy?
    while (++i < amount) {
        
        if(*W1 == *W2) {
            tab3[i] = *W1;
            ++*W1;
            ++*W2;
           }
        if (*W1 > *W2) {
            tab3[i] = *W2;
            ++W2;
        }
        else {
            tab3[i] = *W1;
            ++W1;
        }
    }

    for (i = 0; i < 5; ++i)
        printf("%d\t", tab3[i]);
}
int main(int argc, char* argv[])
{

    int amount = n_1 + n_2;
    int tab1[n_1] = { 2, 2, 5 };
    int tab2[n_2] = { -5, 4 };
    int tab3[n_1 + n_2];
    merge(tab1, tab2, tab3, n_1, n_2);

    return 0;
}
0

//tutaj musi być warunek az do wyczerpania jakies tablicy ale nie wiem jak to zrobic ->

#include <stdio.h>
#define n_1 3
#define n_2 2

void merge(int tab1[], int tab2[], int tab3[], int n1, int n2)
{
    int amount = n1 + n2, end_Ofsmaller;
    int i = -1;
    int *W1 = tab1, *W2 = tab2, *longer;
    if(n1 > n2) end_Ofsmaller = n2;
    else end_Ofsmaller = n1;

   for( i = 0; i < end_Ofsmaller; ++i) {// tutaj musi być warunek az do wyczerpania jakies tablicy ale nie wiem jak to zrobic
        if(*W1 == *W2) {
            tab3[i] = *W1;
            ++*W1;
            ++*W2;
           }
        if (*W1 > *W2) {
            tab3[i] = *W2;
            ++W2;
        }
        else {
            tab3[i] = *W1;
            ++W1;
        }
    }

    if(end_Ofsmaller == n2 )
        while (++end_Ofsmaller < amount)
        tab3[end_Ofsmaller] = tab1[end_Ofsmaller];

    else
        while (++end_Ofsmaller < amount)
        tab3[end_Ofsmaller] = tab2[end_Ofsmaller];
    for (i = 0; i < amount; ++i)
        printf("%d\t", tab3[i]);
}
int main(int argc, char* argv[])
{

    int amount = n_1 + n_2;
    int tab1[n_1] = { 2, 2, 5 };
    int tab2[n_2] = { -5, 4 };
    int tab3[n_1 + n_2];
    merge(tab1, tab2, tab3, n_1, n_2);

    return 0;
}
 
0

"//dlaczego jak wpisywałem &tab1 to program się wkurzał ? to jest uzyskanie adresu adresu tablicy?" - bo nazwa tablicy to wskaźnik na jej pierwszy element, jak dasz &tab1 to tak jakbyś chciał wyłuskać adres wskaźnika (podwójny wskaźnik).
Jak nie wiesz dlaczego źle złącza ci tablice o różnych rozmiarach to sobie wypisz jakie kolejne wartości przyjmują zmienne pod adresami W1 i W2:
2 -5 (2 > -5)
2 4 ( 2 < 4)
2 4 (2 < 4)
5 4 (5 > 4)
5 2 (5 > 2)
czyli zgodnie z działaniem tego programu wpisze ci do tablicy kolejno: -5, 2, 2, 4, 2.
Jak widać takie porównania nie za bardzo działają dla tablic o różnych rozmiarach.

1

A czy nie lepiej jest zamiast inicjalizować zmienną iteracyjną int i jedną dla wszystkich pętli w ten sposób:

 int i;
for (i=0; ...){
...
}
for(i=0;...){
...
}

, inicjalizować int i dla każdej pętli z osobna w ten sposób:

 for (int i=0; ....){
...
}
 for (int i=0; ....){
...
}

?
Ten drugi "nawyk" wydaje mi się dużo lepszy.

0

memcpy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1