7. Napisz program, do którego użytkownik przekazuje w momencie uruchomienia dowolną liczbę
argumentów typu całkowitego (dla wygody ograniczyć się do maks. kilkunastu liczb i niech wszystkie
liczby będą dodatnie). Program ma utworzyć tablicę o rozmiarze określonym przez pierwszy
argument, której kolejnymi elementami będą wszystkie występujące dalej argumenty (poza tym
pierwszym). Program ma wpisać utworzoną tablicę na ekran (w dowolnej przejrzystej formie), a
następnie sprawdzić ile razy wpisana została do tablicy wartość unikatowa (taka, która pojawia się w
tablicy tylko jeden raz) i wyświetlić liczbę tych unikatowych wartości na ekranie.
Wariant trudniejszy: program oprócz wyświetlenia liczby unikatowych wartości ma również
wyświetlić wszystkie te wartości na ekranie. Należy pamiętać, że dla różnych tablic może być ich
różna liczba.
Przetestuj napisany program dla różnych danych wprowadzanych przez użytkownika.
Przykładowy wynik działania programu dla argumentów na wejściu: 7 2 4 4 5 6 7 2
Utworzona tablica: [ 2 4 4 5 6 7 2 ]
Wartości unikatowe:
5 6 7
Łącznie wartości unikatowych: 3
int rozmiar = Integer.parseInt(args[0]);
int tab[]=new int[rozmiar]; // tablica ma args[0] elementow o wartosciach dodatnich
System.out.print("Utworzona tablica: [ ");
for(int i = 0; i < rozmiar; i++)
{
tab[i] = Integer.parseInt(args[i+1]);
System.out.print(tab[i]+" ");
}
System.out.println("]");
boolean unikat;
int ile_unikatow = 0;
//int wartosc = 0;
for(int i = 0; i < rozmiar; i++)
{
unikat = true;
//wartosc = tab[i];
for(int j = 0; j < rozmiar; j++)
{
if(tab[i]==tab[j] && i!=j)
{
unikat = false;
}
}
if(unikat == true)
{
ile_unikatow++;
System.out.print(tab[i]+" ");
}
}
System.out.print("\nLacznie wartosci unikatowych: "+ile_unikatow);
Rozwiązanie skopiowałem z odpowiedzi i trochę je zmodyfikowałem (sam nie umiałem tego wymyślić).
Pytania dotyczą drugiej pętli for:
1 - dlaczego początkowo ustawiamy wartość unikat na true i dlaczego musimy to zrobić wewnątrz pętli for a nie możemy od razu przy inicjalizacji zmiennej?
2 - dlaczego pierwszy if ma być w zagnieżdżonym forze a drugi poza nim?
3 - czemu program działa poprawnie bez tworzenia zmiennej wartość i dobrze wypisuje:
if(unikat == true)
{
ile_unikatow++;
System.out.print(tab[i]+" ");
}
?
2 - "Cały program jest tak skonstruowany, że pętla zewnętrzna bierze jako naszą aktualnie sprawdzaną liczbę każdą kolejną" - tego zdania nie rozumiem i nie wiem teraz dlaczego drugi if ma być poza zagnieżdżonym forem
3 - int rozmiar = Integer.parseInt(args[0]);
int tab[]=new int[rozmiar]; // tablica ma args[0] elementow o wartosciach dodatnich
System.out.print("Utworzona tablica: [ ");
for(int i = 0; i < rozmiar; i++)
{
tab[i] = Integer.parseInt(args[i+1]);
System.out.print(tab[i]+" ");
}
System.out.println("]");
boolean unikat;
int ile_unikatow = 0;
//int wartosc = 0;
System.out.println("Wartosci unikatowe: ");
for(int i = 0; i < rozmiar; i++)
{
unikat = true; // kazda liczba na poczatku sprawdzania jest unikatem
//wartosc = tab[i];
for(int j = 0; j < rozmiar; j++)
{
if(tab[i]==tab[j] && i!=j)
{
unikat = false;
}
} // ?????????????
if(unikat == true)
{
ile_unikatow++;
System.out.print(tab[i]+" ");
}
}
System.out.print("\nLacznie wartosci unikatowych: "+ile_unikatow);
Ale przecież powyższy program wypisuje też konkretne unikaty, a nie ma zmiennej wartosc
2 - z w każdym obiegu jednej pętli jedną liczbą przyjmujemy jako referencyjną, czyli taką, do której będziemy porównywać wszystkie inne. I teraz żeby zrobić to porównanie, musimy dać drugą pętlę, w której każda inna liczba oprócz referencyjnej po kolei będzie porównywana z liczbą referencyjną.
3 - to najwyraźniej nie jest konieczna, może została gdzieś omyłkowo w kodzie niewyrzucona ;)
2 - czyli jaka liczba jest tą zmienną/liczbą referencyjną? Nie rozumiem dlaczego to tak działa
Każda kolejna z całej tablicy.
1 - możemy to zrobić od razu, ale we wnętrzu pętli na początku każdego obiegu i tak chcemy mieć unikat = true (każda kolejna liczba na początku sprawdzania jest unikatem)
2 - ten if w zagnieżdżonym forze przyrównuje kolejną liczbę do aktualnie sprawdzanej. Cały program jest tak skonstruowany, że pętla zewnętrzna bierze jako naszą aktualnie sprawdzaną liczbę każdą kolejną, a pętla wewnętrzna dla aktualnie wybranej sprawdzanej liczby przyrównuje ją do każdej innej z tablicy.
3 - Bo zmienna wartość służyła w trudniejszej wersji programu do wypisania tych unikatowych wartości na ekranie. Jeśli robimy wersję łatwiejszą, to ona nie jest konieczna, samo sprawdzanie liczby unikatów musi też oczywiście dobrze działąć.