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

Rozdział 21 - zadanie domowe pierwsze

Ostatnio zmodyfikowano 2016-08-17 11:40
Autor Wiadomość
Speedwaymonia93
Temat założony przez niniejszego użytkownika
Rozdział 21 - zadanie domowe pierwsze
» 2016-08-16 18:21:00
Witajcie!
Proszę o pomoc!
Oto mój kod ale nie działa bo przy kompilacji wyskakują mi błędy opisane w komentarzu do linijki gdzie się pojawia:
Z góry dzięki za pomoc :)

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <limits>

void wczytaj_liczbe( int tablica_poczatkowa[], int ilosc_liczb )
{
    std::cout << "Podaj: " << ilosc_liczb << " liczby: " << std::endl;
   
    int i = 0;
    do
    {
        std::cin.clear();
        std::cin.sync();
        std::cin >> tablica_poczatkowa[ i ];
        i++;
    } while( i < ilosc_liczb );
   
}

void wylosuj( int tablica_koncowa[], int ile_wylosowac )
{
    int i = 0;
    do
    {
        tablica_koncowa[ i ] =( std::rand() & ile_wylosowac );
        i++;
    } while( i < ile_wylosowac );
   
}

bool porownanie_tablic( int tablica_poczatkowa[], int tablica_koncowa[], int ile_wylosowac )
{
    int i = 0;
    do
    {
        if( tablica_poczatkowa[ i ] == tablica_koncowa[ ile_wylosowac ] )
             return true;
       
        i++;
    } while( i < ile_wylosowac );
   
    return false;
   
}

int wypisz_wynik( int tablica_koncowa[], int ile_wylosowac )
{
    int i = 0;
    do
    {
        std::cout << tablica_koncowa[ i ] << ",";
        i++;
    } while( i < ile_wylosowac );
   
}
int main()
{
    srand( time( NULL ) );
    int tablica_poczatkowa1[ 3 ];
    int tablica_koncowa1[ 2 ];
    int indeks = 0;
    int wczytaj = wczytaj_liczbe( tablica_poczatkowa1, 3 );
   
    do
    {
        std::cout << "Podales nastepujce liczby: " << wczytaj << ",";
        indeks++;
       
    } while( indeks < 3 );
   
    do
    {
        int ile_wylosowac1 = 0;
        int i = 0;
        int wynik_losowania = wylosuj( tablica_koncowa1[], 2 ); // expected primary-expression before ']' token
        if( porownanie_tablic( tablica_poczatkowa1, tablica_koncowa1, ile_wylosowac1 ) == false )
        {
            tablica_koncowa1[ ile_wylosowac1 ] = tablica_poczatkowa1; // invalid conversion from 'int*' to 'int'
            ile_wylosowac1++;
        }
       
    } while( ile_wylosowac1 < 2 ); // 'ile_wylosowac1' was not declared in this scope
   
    wypisz_wynik( tablica_koncowa1, 2 );
   
    return 0;
}
P-150944
carlosmay
» 2016-08-16 18:34:04
C/C++
do
{
    int ile_wylosowac1 = 0;
    int i = 0;
    int wynik_losowania = wylosuj( tablica_koncowa1[], 2 ); // nawias kwadratowy nie potrzebny
    if( porownanie_tablic( tablica_poczatkowa1, tablica_koncowa1, ile_wylosowac1 ) == false )
    {
        tablica_koncowa1[ ile_wylosowac1 ] = tablica_poczatkowa1; // nie można przypisać wskaźnika do zmiennej
        // (próbujesz przypisać adress tablicy od elmenetu drugiej tablicy)
        ile_wylosowac1++;
    }
   
} while( ile_wylosowac1 < 2 ); // 'ile_wylosowac1' jest zadeklarowane wewnątrz pętli, więc nie jest znane poza jej klamrą

P-150945
Speedwaymonia93
Temat założony przez niniejszego użytkownika
» 2016-08-16 19:11:49
ok dwa błędy poprawiłam. Nadal nie wiem jednak jak poprawić ten gdzie przypisuje wynik jednej tablicy do drugiej

P-150946
carlosmay
» 2016-08-16 20:36:59
Kopiowanie jednej tablicy do drugiej std::copy(),
jeśli tylko jedną wartość to przypisz element z jednej tablicy do elementu drugiej.

C/C++
int t1[ 2 ] { 1, 2 };
int t2[ 2 ] { };
t2[ 0 ] = t1[ 1 ];
t2[ 1 ] = t1[ 0 ];
 Teraz tablica t2 ma wartości w odwrotnej kolejności do t1.
P-150947
Speedwaymonia93
Temat założony przez niniejszego użytkownika
» 2016-08-17 10:40:20
Poprawiłam jedną rzecz w kodzie (zaznaczyłam w komentarzu) ale program nie działa tak jak powinien, tzn:
Każe mi podać trzy liczby i to jest ok ale potem wyświetla komunikat "Podałeś następujące liczby: 0. Podałeś następujące liczby: 0,2,3". Czyli program w ogóle nie losuje mi liczb z tych które wpisuje. Już nie wiem co jest nie tak. Oto kod:

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <limits>

int wczytaj_liczbe( int tablica_poczatkowa[], int ilosc_liczb )
{
    std::cout << "Podaj: " << ilosc_liczb << " liczby: " << std::endl;
   
    int i = 0;
    do
    {
        std::cin.clear();
        std::cin.sync();
        std::cin >> tablica_poczatkowa[ i ];
        i++;
    } while( i < ilosc_liczb );
   
}

int wylosuj( int tablica_koncowa[], int ile_wylosowac )
{
    int i = 0;
    do
    {
        tablica_koncowa[ i ] =( std::rand() & ile_wylosowac );
        i++;
    } while( i < ile_wylosowac );
   
}

bool porownanie_tablic( int tablica_poczatkowa[], int tablica_koncowa[], int ile_wylosowac )
{
   
    int i = 0;
    do
    {
        if( tablica_poczatkowa[ i ] == tablica_koncowa[ ile_wylosowac ] )
             return true;
       
        i++;
    } while( i < ile_wylosowac );
   
    return false;
   
}

int wypisz_wynik( int tablica_koncowa[], int ile_wylosowac )
{
    int i = 0;
    do
    {
        std::cout << tablica_koncowa[ i ] << ",";
        i++;
    } while( i < ile_wylosowac );
   
}
int main()
{
    srand( time( NULL ) );
    int tablica_poczatkowa1[ 3 ];
    int tablica_koncowa1[ 2 ];
    int indeks = 0;
    int wczytaj = wczytaj_liczbe( tablica_poczatkowa1, 3 );
   
    do
    {
        std::cout << "Podales nastepujce liczby: " << wczytaj << ",";
        indeks++;
       
    } while( indeks < 3 );
   
    int ile_wylosowac1 = 0;
   
    do
    {
        int i = 0;
        int wynik_losowania = wylosuj( tablica_koncowa1, 2 );
        if( porownanie_tablic( tablica_poczatkowa1, tablica_koncowa1, ile_wylosowac1 ) == false )
        {
            tablica_koncowa1[ ile_wylosowac1 ] = tablica_poczatkowa1[ i ]; // !!! DOPISAŁAM [i]. !!!
            ile_wylosowac1++;
        }
       
    } while( ile_wylosowac1 < 2 );
   
    wypisz_wynik( tablica_koncowa1, 2 );
   
    return 0;
}
P-150948
carlosmay
» 2016-08-17 11:40:53
Losujesz indeksy z rozmiaru pierwszej tablicy, i umieszczasz je w drugiej tablicy, następnie wykorzystujesz drugą tablicę jako indeksy do wypisania liczb z pierwszej tablicy.
Łatwiej napisać kod (mam nadzieję, że jest dość czytelny).
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <numeric>
using namespace std;

int pobierzLiczbe()
{
    int liczba { };
    while( !( cin >> liczba ) ) {
        cin.clear();
        cin.ignore( numeric_limits < streamsize >::max(), '\n' );
    }
    cin.ignore( numeric_limits < streamsize >::max(), '\n' );
    return liczba;
}

void wypelnijTablice( int tablicaUzytkownika[], size_t rozmiar )
{
    for( size_t i = 0; i < rozmiar; ++i ) {
        tablicaUzytkownika[ i ] = pobierzLiczbe();
    }
}

int wylosujIndeks( int start, int stop )
{
    return rand() %( stop - start );
}

bool czyBylWylosowanyIndeks( int indeks, int tablicaWylosowanychIndeksow[], size_t aktualnyRozmiar )
{
    if( aktualnyRozmiar <= 0 ) {
        return false;
    }
   
    for( size_t i = 0; i < aktualnyRozmiar; ++i ) {
        if( indeks == tablicaWylosowanychIndeksow[ i ] ) {
            return true;
        }
    }
   
    return false;
}

void wypiszWylosowaneLiczby( int tablicaUzytkownika[], int tablicaWylosowanychIndeksow[], size_t rozmiarTablicyIndeksow ) {
    for( size_t i = 0; i < rozmiarTablicyIndeksow; ++i ) {
        cout << tablicaUzytkownika[ tablicaWylosowanychIndeksow[ i ] ] << ' ';
    }
}

int main()
{
    srand( time( 0 ) );
    constexpr size_t rozmiarTablicyUzytwnika = 3;
    constexpr size_t rozmiarTablicyWylosowanychIndeksow = 2;
    int tablicaUzytkownika[ rozmiarTablicyUzytwnika ];
    int tablicaWylosowanychIndeksow[ rozmiarTablicyWylosowanychIndeksow ];
    int wylosowanyIndeks { };
   
    wypelnijTablice( tablicaUzytkownika, rozmiarTablicyUzytwnika );
   
    size_t licznik { };
    do {
        wylosowanyIndeks = wylosujIndeks( 0, rozmiarTablicyUzytwnika );
        if( !czyBylWylosowanyIndeks( wylosowanyIndeks, tablicaWylosowanychIndeksow, licznik ) ) {
            tablicaWylosowanychIndeksow[ licznik ] = wylosowanyIndeks;
            ++licznik;
        }
    } while( licznik < rozmiarTablicyWylosowanychIndeksow );
   
    wypiszWylosowaneLiczby( tablicaUzytkownika, tablicaWylosowanychIndeksow, rozmiarTablicyWylosowanychIndeksow );
}
P-150949
« 1 »
  Strona 1 z 1