dzozda |
» 2015-01-25 20:35:48 Pozwolicie, że podczepię się pod temat. Udało mi się rozwiązać większość problemów które wyżej opisujecie, ale z jednym nie mogę sobie poradzić. Podczas wczytywania danych z klawiatury (funkcja wczytaj), sprawdzanie czy liczby się nie powtarzają działa bez zarzutu (funkcja sprawdz), natomiast podczas losowania indeksów tablicy (funkcja losuj) ta sama funkcja sprawdz już nie spełnia swoich założeń. Proszę o pomoc, gdzie leży błąd bo ja nie mam pojęcia... #include <iostream> #include <cstdlib> #include <ctime>
void wczytaj( int itab[], int iroz ); bool sprawdz( int liczba, int itab[], int ile ); int losuj( int itab[], int poz );
using namespace std;
int main() { srand( time( NULL ) ); const int rozmiar = 10; int tab[ rozmiar ]; wczytaj( tab, rozmiar ); losuj( tab, 8 ); }
void wczytaj( int itab[], int iroz ) { int a, i = 0; bool s; do { do { cout << "Podaj liczbe: " << i << endl; cin >> a; s = cin.fail(); cin.clear(); cin.sync(); } while( s ); if( sprawdz( a, itab, iroz ) == false ) { itab[ i ] = a; i++; } else { cout << "Twoja liczba sie powtarza" << endl; } } while( i < iroz ); }
int losuj( int itab[], int poz ) { int los, i = 0; do { los =(( rand() % poz ) + 0 ); if( sprawdz( los, itab, poz ) == false ) { cout << "wylosowano:" << itab[ los ] << endl; i++; } } while( i < poz ); }
bool sprawdz( int liczba, int itab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( itab[ i ] == liczba ) return true; i++; } while( i < ile ); return false; }
[ / code ][ / i ] |
|
darko202 |
» 2015-01-26 08:53:32 1. masz nowy problem tworzysz nowy temat
2. w funkcji losuj masz błędy * brak return * złe losowanie (losujesz liczbę 0-poz), a masz wylosować poz razy * zła logika ( sprawdzasz wylosowaną liczbę (niezależnie od błędu wyżej), ale nie w całej tablicy (tablica 10, a poz = 8)
3. Funkcja wczytaj też błędy *szukasz w całej tablicy czy podana liczba różna niezależnie ile elementów już wprowadziłeś np. 0
4. formatowanie tekstu kod w [cpp] [/cpp] |
|
dzozda |
» 2015-01-26 23:09:26 Ad.1 No właśnie nie mogłem się zdecydować czy zakładać nowy temat, czy się podłączyć... Ad.2 w funkcji losuj masz błędy * brak return * złe losowanie (losujesz liczbę 0-poz), a masz wylosować poz razy * zła logika ( sprawdzasz wylosowaną liczbę (niezależnie od błędu wyżej), ale nie w całej tablicy (tablica 10, a poz = 8) |
OK, to wydaję się być jasne i poprawiłem, ale... 3. Funkcja wczytaj też błędy *szukasz w całej tablicy czy podana liczba różna niezależnie ile elementów już wprowadziłeś np. 0
|
Szczerze to nie widzę, w tym nic złego. OK za pierwszym wczytaniem liczby sprawdzam pustą tablice ale to chyba nie jest duży problem? Ważne, że program spełnia swoje zadanie. Poniżej kod, program działa zgodnie z założeniami. A przynajmniej tak mi się wydaję:P Dzięki i pozdro #include <iostream> #include <cstdlib> #include <ctime>
void wczytaj( int itab[], int iroz ); bool sprawdz( int liczba, int itab[], int ile ); void losuj( int itab[], int iroz, int poz );
using namespace std;
int main() { srand( time( NULL ) ); const int rozmiar = 10; int tab[ rozmiar ]; wczytaj( tab, rozmiar ); losuj( tab, rozmiar, 8 ); return 0; }
void wczytaj( int itab[], int iroz ) { int a, i = 0; bool s; do { do { cout << "Podaj liczbe: " << i << endl; cin >> a; s = cin.fail(); cin.clear(); cin.sync(); } while( s ); if( sprawdz( a, itab, iroz ) == false ) { itab[ i ] = a; i++; } else { cout << "Twoja liczba sie powtarza" << endl; } } while( i < iroz ); }
void losuj( int itab[], int iroz, int poz ) { int tablos[ iroz ]; int los, i = 0; do { los =(( rand() % iroz ) + 0 ); if( sprawdz( los, tablos, iroz ) == false ) { tablos[ i ] = los; cout << "wylosowano:" << itab[ los ] << endl; i++; } } while( i < poz ); }
bool sprawdz( int liczba, int itab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( itab[ i ] == liczba ) return true; i++; } while( i < ile ); return false; }
|
|
darko202 |
» 2015-01-28 21:46:26 1. >> szukasz w całej tablicy czy podana liczba różna niezależnie ile elementów już wprowadziłeś np. 0 jakie to rodzi konsekwencje, W Twoim programie tablica, której używasz nie została zainicjalizowana co oznacza, że zawiera przypadkowe wartości np. 1,8, 73983,.... jeśli użytkownik poda jedną z takich przypadkowych liczb to program zgłosi że liczba została już wprowadzona. oczywiście liczb jest dużo , jest małe prawdopodobieństwo itp. ale faktem jest że program jest błędny. jeśli nadal nie będziesz się takim czymś przejmował to kiedyś zdarzy CI się w bardziej skomplikowanym przypadku a wtedy "adiós héroe" :) 2. w void losuj( int itab[], int iroz, int poz ) masz deklarację tablicy int tablos[ iroz ]; kompilator (Visual Studio 2010) zgłosił w związku z nią następujące błędy Error 2 error C2057: expected constant expression C:\Users\ola\Desktop\test1\test1\test1.cpp 55 1 test1 Error 3 error C2466: cannot allocate an array of constant size 0 C:\Users\ola\Desktop\test1\test1\test1.cpp 55 1 test1 Error 4 error C2133: 'tablos' : unknown size C:\Users\ola\Desktop\test1\test1\test1.cpp 55 1 test1
dlaczego ? deklarujesz tablicę statyczną w domyśle w ten sposób próbujesz zadeklarować tablicę dynamiczną a jak się taką tablicę deklaruje poprawnie ? sprawdzam na http://tutorialeit.pl/tutoriale/cpp/tworzenie-tablic-dynamicznych/32/Tablica dynamiczna jednowymiarowa w C++ tworzona jest w sposób następujący: int *tablica = new int[n]; 3. masz nowy problem tworzysz nowy temat - sprawdź regulamin forum - takie tematy lądują do kosza |
|
dzozda |
» 2015-01-29 19:14:40 Ad 1 W Twoim programie tablica, której używasz nie została zainicjalizowana co oznacza, że zawiera przypadkowe wartości... |
No racja, nie dostrzegłem tak oczywistej rzeczy wcześniej... Czyli muszę najpierw wczytać wszystkie liczby podane przez użytkownika do tablicy a dopiero później sprawdzać czy się jakaś nie powtarza? Jeżeli tak to trochę słabo, bo program dopuszczałby wpisanie 10 takich samych cyfr i dopiero na końcu by poinformował, że liczby się powtarzają... no chyba, że funkcja sprawdź, sprawdzałaby tylko elementy wpisane a całą resztę pomijała... ale jeszcze nie wiem jak to zrobić:P Ad 2 Rozumiem, że kompilator nie zna wielkości tablicy i dlatego się czepia? (pisze w DEVie i nie mam błędów), czyli jak wpisze: int tablos[ 8 ]; To będzie ok? |
|
1 « 2 » |