dwie tablice

0

Zadanie brzmi następująco: Dane są dwie tablice int A[] int B[] uzupełnione losowymi wartościami.
Napisz funkcje która wypisze elementy (bez powtórzeń) znajdujące się tylko w A[] i nie znajdujące się w B[].

Czy dobrze to zrobiłem ?
void takieSame(int A[],int B[])
{
int AA[rozmiar]={0};
for(int i=0; i<rozmiar; i++)
{
for(int j=0; j<rozmiar; j++)
{
if(A[i]==B[j])
{
AA[A[i]]=1;

        }

    }

}
int C[rozmiar]={0};

for(int i=0; i<rozmiar; i++)
{
if(AA[A[i]]==0)
{
C[i]=A[i];
}

}

int D[rozmiar]={0};
for(int i=0; i<rozmiar; i++)
{
if((C[i]!=0)&&(D[C[i]]==0))
{
printf("%3d",C[i]);
D[C[i]]=1;
}

}

}

2
  1. W C++ nie ma VLA.
  2. Można to zrobić w średnim czasie O(n*log(n)), a nie od razu kwadratowym.
0
Wielki Krawiec napisał(a):

Czy dobrze to zrobiłem ?
Nie rozumiem, sądzisz że kompilator cię okłamuje?

0

Nie wiem czemu nie daje na wyjsciu 0 nawet jesli jest w A[] i nie ma w B[]

0

Ogolnie sypie sie jezeli w tablicach wystepuje 0

0

O jakim występowaniu 0 mówisz, jeżeli to nawet nie ma szansy się skompilować?

1

Dlaczego nikt nie odpowiada w moim wątku?

Dziwi mnie, że chce Wam się w to wgryzać w obecnym formacie :P

2
if(AA[A[i]]==0)

To nie ma sensu. Generalnie cały ten kod jest jakiś dziwny, ale zwłaszcza ten fragment. Tablica AA ma rozmiar rozmiar, podczas gdy przecież w tablicy A[i] mogą występować dowolne liczby (na przykład trzy miliony pięćset tysięcy osiem), zatem na 99% odwołujesz się poza zakres tej tablicy.
W ogóle źle podchodzisz do problemu - zacznij od rozrysowania sobie na kartce, wraz z paroma przykładami etc., a nie od razu piszesz kod.

0

Może źle sformułowałem pytanie : Liczby losowe ale z małego zakresu np.<0-10>, rozmiar jest const int = 15.
To może ktoś napisze jakieś alternatywne rozwiązanie w prosty zrozumiały sposób byłbym bardzo wdzięczny.

0

Nie chodzi o to, abyśmy pisali za Ciebie, tylko abyś Ty się nauczył rozwiązywać problemy :P
Jak mówiłem: wypisz sobie dwie listy losowych liczb na kartce i wymyśl coś sensownego, choćby obserwując swoje własne postępowanie próbując wypisać liczby zgodnie z poleceniem.

0
  1. Po kiego rozmiar 15 tablicy AA[] kiedy zakres jest <0-10> ?
  2. Czemu zakładasz że A[] i B[] mają rozmiar 15?
  3. Wiesz może na jakim forum można za bycie bardzo wdzięcznym dostać nowy samochód? Albo remont mieszkania zrobić?
0

void (int A[10], int B[10])
Jakimi warunkami to wszystko spiąć, żeby w C[] były liczby wystepujace tylko w A[] i nie wystepujace w B[]?

0

Warunkami nie można niczego spinać.

1
Wielki Krawiec napisał(a):

void (int A[10], int B[10])
Jakimi warunkami to wszystko spiąć, żeby w C[] były liczby wystepujace tylko w A[] i nie wystepujace w B[]?

Zainteresuj się std::set_difference. http://en.cppreference.com/w/cpp/algorithm/set_difference

0

Wiem, że muszę zrobić to w dwóch pętlach i przyrównywać A[i] do B[j] i później nic sensownego nie moge wymyslić

1

W najbardziej podstawowej wersji (czyli z tym przyrównywaniem będącym niestety złożonością kwadratową) musiałbyś mieć dodatkową mapę int -> unsigned int mapującą liczby z ilością ich wystąpień.

0

Rozumiem , że podając mi rozwiązanie na tacy niczego mnie nie nauczycie, ale jutro mam kolokwium i tylko tego zadania nie potrafię rozwiązać.

0

No kurczę już praktycznie masz wszystko na tacy.

0

void takieSame(int A[10], int B[10])
{ int C[10]={0};
int ile=0;
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
{
if(A[i]!=B[j])
{
ile++;
}
if(ile==10)
{
C[i]=A[i];
}

    }

} 

Teraz dobrze w o to chodzi ?

1

Nie masz pojęcia co piszesz i zaczynasz zgadywać.
Naprawdę, zacznij od algorytmu na kartce.

2

Programowanie metodą wstawiania losowych instrukcji w losowych miejscach - z góry skazane na porażkę.

0

void takieSame(int A[10], int B[10])
{ int C[10]={0};
int ile=0;
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
{
if(A[i]!=B[j])
{
ile++;
}
if(ile==10)
{
C[i]=A[i];
}

    }
    ile=0;
} 

teraz w C[i] zapisuja mi sie te ktore sa tylko w a[i]? co jest zle ?

0

Wypisz sobie na kartce dwie listy po dziesięć losowych liczb i wykonuj wszystko na nich tak, jakbyś był komputerem - zgodnie z Twoim algorytmem. Szybko zobaczysz, gdzie masz błąd (albo w każdym razie połapiesz się, co się dzieje w tym kodzie).

Edit: w sumie to lepiej dwie listy po cztery liczby, mniej roboty (16 iteracji).

0

Ok wychodzi mi ze dobrze. Z pierwszym elementem tablicy A[] porównuje wszystkie elementy B[], liczę porównania,
jeśli pierwszy element A[] jest rozny od wszystkich elementow w B[] to zapisuje go w C[]
zeruje licznik i robie to samo dla nastepnego elementu z A itd ?

1

W takim razie odpal debugier i złap w którym miejscu twoje rozumowanie różni się od rozumowania kompilatora.

0

Nie rozumiem w czym jest bład bo kompiluje sie i wedlug mnie dziala poprawnie ?

0

A wg kompilatora nie, więc znajdź na czym polega rozbieżność waszych zdań - między innymi na tym polega nauka.

0

OK dzieki za pomoc :P

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