Asvarox93 Temat założony przez niniejszego użytkownika |
[Lekcja. 21] Program siedzi w pętli. » 2015-01-26 20:35:05 Witam serdecznie, Od 17 walczę z tym zadaniem, jednak nie mogę sobie poradzić. Gdzieś popełniłem błąd jednak nie bardzo wiem jak go rozwiązać. Prosiłbym was o pomoc, jednak nie proszę o gotowca, tylko o rady, tak abym samodzielnie uporał się z problemem. Z góry dziękuje, za stracony czas dla kogoś takiego jak ja:). @EDIT Przeprasza, zapomniałem podać treści zadania: "Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje. " #include <iostream> #include <cstdlib> #include <ctime>
void PobranieLiczbOdU( int tab[] ) { for( int i = 0; i < 3; i++ ) { std::cout << "Podaj " << i + 1 << " liczbe: " << std::endl; std::cin >> tab[ i ]; } }
int losowanie() { return(( rand() % 30 ) + 1 ); }
bool CzyElementNieZostalWylosowa( int tablica[], int k, int u ) { if( k <= 0 ) { return false; } int t = 0; do { if( tablica[ u ] == tablica[ t ] ) { return true; } t++; } while( t < 3 ); return false; } int wyborelementutab( int liczbalos ) { if( liczbalos > 10 ) { return 0; } else if( liczbalos >= 10 && liczbalos < 20 ) { return 1; } else { return 2; } } int main() { srand( time( NULL ) ); int tablica[ 3 ]; int liczbalos, k = 0, u = 0;; PobranieLiczbOdU( tablica ); do { liczbalos = losowanie(); u = wyborelementutab( liczbalos ); if( CzyElementNieZostalWylosowa( tablica, k, u ) == false ) { std::cout << "Twoja " << k + 1 << " liczba to:" << tablica[ u ] << std::endl; k++; } } while( k < 3 ); system( "Pause" ); } Próbuje sprawdzić, czy któryś z elementów tablicy się powtarza, jednak w funkcji "bool CzyElementNieZostalWylosowa" napotykam problem. Nie wiem dokładnie jak ma wyglądać to sprawdzenie, dlatego użyłem sposobu powyżej, jednak nie przechodzi. Zauważyłem, że problem występuje w tym if'ie, jednak nie wiem jak go zniwelować. Po prostu jestem za głupi, albo ślepy. if( tablica[ t ] == tablica[ u ] ) { return true; } |
|
darko202 |
» 2015-01-26 22:27:49 dużo napisałeś, ale nie napisałeś na czym polega problem. np. jaką funkcjonalność realizujesz ? co jest inaczej i dlaczego tak uważasz.
|
|
Asvarox93 Temat założony przez niniejszego użytkownika |
» 2015-01-27 10:40:42 Poprawiłem treść pierwszego postu, dlatego mam nadzieję, że teraz będzie wszystko jasne. Problem nadal pozostał i nie wiem jak go rozwiązać, jeśli ktoś wie, to proszę o wskazówki. |
|
darko202 |
» 2015-01-27 14:52:53 problemem jest to, że nie realizujesz polecenia "losuje 2 z nich bez powtórzeń"
w programie losujesz indeks w tablicy i sprawdzasz czy jest w tablicy komórka o takim indeksie
musisz zmienić podejście np. :
A. 1. losować indeks (lub liczbę) 2. sprawdzić w dodatkowej tablicy czy indeks (lub liczba) był już wylosowany 3. nie była zapamiętać w dodatkowej tablicy a wszystko w pętli
oczywiście masz 2 liczby dlatego można to zrobić prościej, ale zawsze myśl przyszłościowo (tablica n elementowa, k losowań unikalnych)
B. stworzysz strukturę strukt dane { int liczba, bool losowana };
stworzysz tablicę tej struktury wylosujesz liczby i dopiszesz do tej tablicy liczba=losowana(), losowana=false sprawdzasz tablicę i w kolejnych obrotach zmieniasz wartość losowa = true
|
|
Asvarox93 Temat założony przez niniejszego użytkownika |
» 2015-01-27 15:23:59 Ja myślałem zrobić to w sposób taki, że użytkownik podaje 3 liczby, które zapisywane są w tablicy int tablica[ 3 ]; , po czym za pomocą funkcji int losowanie() i int wyborelementutab( int liczbalos ) losowany jest indeks, który wpada do funkcji bool CzyElementNieZostalWylosowa( int tablica[], int k, int u ) , gdzie sprawdzany jest, czy nie został już wcześniej wylosowany. Jeśli nie, to wypisuje wartość tablicy z danym indeksem. Jednak, gdzieś popełniłem błąd, bądź źle napisałem kod, przez co pierwszy indeks przechodzi za pomocą if( k <= 0 ) { return false; } , zaś kolejne już nie, bo natrafiają na if'a if( tablica[ u ] == tablica[ t ] ) { return true; } , którego zadaniem powinno być sprawdzenie, czy indeks, który został na nowo wylosowany, nie powtarza się. I nie wiem jak to rozwiązać. |
|
darko202 |
» 2015-01-27 15:59:56 1. >>Jednak, gdzieś popełniłem błąd, bądź źle napisałem kod, przez co pierwszy indeks przechodzi za pomocą
odpowiedz na pytanie, przy pierwszym losowaniu przekazujesz do funkcji k = ? //int liczbalos, k = 0, u = 0;;
spełnia on warunek if (k<=0) więc zwraca return false
2. >>zadaniem powinno być sprawdzenie, czy indeks, który został na nowo wylosowany, nie powtarza się. I nie wiem jak to rozwiązać.
napisałem Ci odpowiedz na ten problem przeczytaj jeszcze raz i zastanów się,
aby sprawdzić (porównać) musisz mieć z czym ? a pierwszego wylosowanego indeksu nie zapamiętujesz, więc co sprawdzasz ? :)
funkcja nie jest zła - realizuje tylko inną funkcjonalność
|
|
Asvarox93 Temat założony przez niniejszego użytkownika |
» 2015-01-27 16:42:21 Racja, nie zauważyłem, że ni zapisuje sobie indeksów. Problem rozwiązany, dziękuje Ci darko202. Kiedyś muszę postawić Ci piwko! |
|
« 1 » |