Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Lekcja. 21] Program siedzi w pętli.

Ostatnio zmodyfikowano 2015-01-27 16:42
Autor Wiadomość
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. "

C/C++
#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.

C/C++
if( tablica[ t ] == tablica[ u ] )
{
    return true;
   
}
P-125577
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.

P-125586
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.
P-125596
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


P-125603
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ą
C/C++
if( k <= 0 )
{
    return false;
}
, zaś kolejne już nie, bo natrafiają na if'a
C/C++
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ć.
P-125608
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ść
 
P-125612
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!
P-125618
« 1 »
  Strona 1 z 1