C++ . Losowanie elementu tablicy. Dev C++ 5.4.2

Witam!

Mam problem z moim programem, a mianowicie: moim zadaniem jest napisanie koła fortuny itd… 

Widać nie ty to pisałeś, elementy losuje się w funkcjach. Wystarczy zmienić tym zwracany i cout na return.

Ja to pisałem, ale robię to wszystko metodą prób i błędów, gdyż nie do końca rozumiem wszystkie właściwości, konsultuje się ze znajomymi itp. Jak do tej pory udało mi się zrobić to losowanie i teraz muszę wylosowany element tablicy zmienić na podkreślniki.(Postanowiłem zrobić program bez funkcji, gdyż nie potrafiłem sobie z nimi poradzić, a teraz przynajmniej mi losuje). I pojawił się kolejny problem, wylosowany zostaje element tablicy, ale kiedy próbowałem zamienić na podkreślniki, wyskoczyły mi jedynie 2 linijki podkreślone po czym wyskoczył mi komunikat że program przestał działać. Wzorowałem się na programie znalezionym w internecie. Tutaj jest kod i moje pytanie, jak zmienić dany wylosowany element na te właśnie podkreślniki bądź gwiazdki, wiem, że nie jest to trudne, ale chciałbym zapytać i prosić o wmiare względną odpowiedź, żebym zrozumiał cokolwiek :). Z góry dziękuję i przepraszam, żę tutaj takimi banałami śmiece na forum.

*Jestem nowicjuszem i mam bardzo małe pojęcie o programowaniu, proszę o wyrozumiałość ^^

 

char * stolicet[3];
   int s;
            
            stolicet[0] = "berlin";
            stolicet [1] = "warszawa";
            stolicet [2] = "paryz";
            srand (time(0));
            s = rand() % 3 ;  // s-stolice
            cout << stolicet[s]<< endl; // pokazuje wylosowany wyraz
            
            int i1;
            int k1;  //zmienna ktora bedzie inkrementowana jak tylko znajdziemy dana literke w tabelce wprowadz_slowo
            int w1;  //ilosc znakow tablicy odgadywanie
            i1 = 0;
            while( stolicet[s] [i1] != '\0')
            {i1++;
            }
            w1=i1;
            char odgadywanie [w1];
            
            for( int j = 0; j < w1; j++ )
           {
           odgadywanie[j] = '_';
  cout << odgadywanie [j];
           }
            cout << endl << odgadywanie << endl;

Zamień char * na stringa, będzie łatwiej:

#include <string>
string stolicet[3];

Ilość znaków stringa to

string abc;
abc.length;

Do znaku w stringu dostaniesz się tak samo jak do elementu w tablicy:

Kiedy zmieniam typ tablicy na string dalsza część programu przestaje mi działać, więc chyba wolałbym pozostać przy char *.

*Wiem, że muszę teraz policzyć ilość znaków w wylosowanym wcześniej wyrazie[elemencie tablicy], ale nie wiem jak to zrobić, rozumiem działanie pętli, którą zamieściłem wyżej, jednak nie do końca, wiem co ona robi i na jakiej zasadzie jednak nie rozumiem, czemu nie działa mi kiedy podaje element losowy tablicy, czy ktoś mógłby mi to wytłumaczyć?

Nie bardzo rozumiesz samej idei zmiennej. Ty w tej zmiennej trzymasz ilość znaków. Korzystając z char* masz coś takiego:

jakiś ciąg znaków\0

Oznacza ciąg jakiś ciąg znaków. Zakończenie to \0 określa to znak końca dla ciągu znaków. Inkrementując zmienną po każdym znaku liczysz ich ilość i to właśnie w zmiennej i1 masz ilość znaków.

Weź pod uwagę, że korzystając z string nie musisz w ogóle mieć tej pętli (jak wspomniał kolega wyżej)

Zdaje sobie sprawę, że na stringach wystarczy prosta komenda jednak, kiedy próbowałem to zmienić dalsza część programu nie chciała się kompilować, więc postanowiłem pozostać przy char*. Biorę się dalej do roboty i postaram się zrozumieć :). Bo na ten moment nie jest to sytuacja bez wyjścia, tylko trzeba coś zmienić i będzie poprawnie działało na char* , tak? :slight_smile:

 

 *          int i1;

            int k1;  

            int w1; 

            i1 = 0;

            while( stolicet[i1] != ‘\0’)

            {i1++;

            }

            w1=i1;

            cout << "Liczba znakow hasla to: " << i1 << endl;

 

Ten kod poprawnie liczy ilość znaków wylosowanego elementu tablicy stolicet. Czy ktoś mógłby napisać kod/ modyfikacje która od razu zastąpi mi te x liter podkreślnikami? Przepraszam, żę jestem taki upierdliwy, ale jakoś słabo mi to idzie.

Reszta kodu się nie kompiluje, bo string z biblioteki string nie zawiera znaku końcowego \0. Ogólnie to będzie wyglądać jakoś tak:

for(int i = 0; i < stolicet.length(); i++)

{

stolicet = ‘_’;

}

Skoro chcesz utrudniać sobie życie ok niech ci będzie char*.

Ty tutaj nie masz nic zastępować. Załóżmy że masz ciąg znaków stolicet

Zamiast while użyj i1=strlen(stolicet), zadeklaruj sobie tablicę 

char wyraz[s+1]

 (+1 bo chcesz mieć też koniec linii), wypełnij ją podkreślnikami i zakończ końcem linii

for(int i=0;i<5;wyraz[i]='_',i++);
wyraz[5]='\0';

Potem będziesz zamieniać poszczególne litery jeśli będą zgadzać się z wzorcem.

@drobok on po prostu ma za stary kompilator i stringi źle działają. Najlepiej jak zainstaluje coś nowoczesnego.

Wyskakuje błąd, że strlen jest niezadeklarowane.

To dodaj “inklady”:

#include <stdio.h>
#include <string.h>

Zapomniałem dodać, że projekt powinienem napisać, bez używania bibliotek niestandardowych.

Jakby to powiedzieć - skoro nie musisz ich osobno pobierać, to nie są to biblioteki niestandardowe. Były dołączone do kompilatora.

Temat do zamknięcia, poradziłem sobie uzpełnei inaczej.