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

[XI. Tworzenie warunków złożonych if ... else] Problem z trzecim ćwiczeniem

Ostatnio zmodyfikowano 2010-08-12 13:56
Autor Wiadomość
ricardo83
Temat założony przez niniejszego użytkownika
[XI. Tworzenie warunków złożonych if ... else] Problem z trzecim ćwiczeniem
» 2010-08-10 12:24:54
Witam
moje kolejne pytanie odnosi sie odnosnie trzeciego cwiczenia, a mianowicie programu "kolo fortuny". Ja natomiast nieco utrudnilem sobie zadanie: 1 uzytkownik wprowadza slowo ktore chcialby zeby drugi uzytkownik odgadl, natomiast 2 uzytkownik bedzie wprowadzal 1 literke i program bedzie sprawdzal czy dana literka wystapila i ile razy. Zostala rowniez wprowadzona druga tablica (ktora na poczatku dzialania programu-przed wprowadzeniem przez uzytkownika pierwszej literki) sklada sie z samych kropek (zalozenie jest takie ze 2 tablica-ta wykropkowana i 1 tablica-ta ze slowem do odgadniecia maja taki sam rozmiar, w innym wypadku petla nigdy sie nie zakonczy gdyz ciagi zawsze beda rozne). Ale tu pojawia sie problem w dzialalnosci programu(jako dowod prezentuje wydruki z konsoli):
-jak uzytkownik wprowadzi 1 znak jako "slowo" do odgadniecie to okazuje sie ze ta 2 tablica nie sklada sie z 1 znaku tylko z 3,
Wprowadz slowo do odgadniecia:
r
Jak zostalo zaczytane r
Tu wstawimy kropki
.
.@G
odgadywane slowo i=3-jak uzytkownik wprowadzi 2 znaki jako "slowo" do odgadniecie to okazuje sie ze ta 2 tablica nie sklada sie z 2 znakow tylko z 3,
Wprowadz slowo do odgadniecia:
ri
Jak zostalo zaczytane ri
Tu wstawimy kropki
..
..\
odgadywane slowo i=3-przy wprowadzeniu 3 znakow 2 tablica sklada sie o dziwo z 3 znakow
Wprowadz slowo do odgadniecia:
ric
Jak zostalo zaczytane ric
Tu wstawimy kropki
...
...
odgadywane slowo i=3-kiedy uzytkownik wprowadzi 4 znaki 2 tablica sklada sie z 5 znakow
Wprowadz slowo do odgadniecia:
rica
Jak zostalo zaczytane rica
Tu wstawimy kropki
....
....m
odgadywane slowo i=5-przy wprowadzeniu 5 znakow 2 tablica znowu ma poprawny rozmiar (czyli zgodny z 1 tablica)
Wprowadz slowo do odgadniecia:
ricar
Jak zostalo zaczytane ricar
Tu wstawimy kropki
.....
.....
odgadywane slowo i=5
Moje pytanie brzmi nastepujaco. Czemu wystepuja takie rozbieznosci w rozmiarach tablic znakowych? Moze wynika to z jakiejs definicji tablic znakowych albo po prostu uczynilem jakis blad w kodzie :(
Jakby ktos znal odpowiedz na powyzsze pytanie prosze o odpowiedz :)

Pozdrawiam

Kod:
C/C++
#include <iostream>
#include <cstring>
#include "ddtconsole.h"

using namespace std;
using namespace ddt::console;

int main()
{
    //zmienna tablicowa ktora przechowuje odgadywane slowo
    char wprowadz_slowo[ 30 ];
   
   
    int i;
    int k; //zmienna ktora bedzie inkrementowana jak tylko znajdziemy dana literke w tabelce wprowadz_slowo
    int w; //ilosc znakow tablicy odgadywane_slowo
   
    //zmienna znakowa do ktorej bedzie zaczytywana literka ktorej bedziemy szukali w tablicy wprowadz_slowo
    char szukaj;
   
    cout << "Wprowadz slowo do odgadniecia:\n";
    cin >> wprowadz_slowo;
    cout << "Jak zostalo zaczytane " << wprowadz_slowo << endl;
    //clrscr();
   
    //w petli while bedziemy sprawdzac ile jest znakow az do napotkania symbolu konca wiersza
    //"i" oznacza ile jest znakow w tablicy
    i = 0;
    while( wprowadz_slowo[ i ] != '\0' )
    {
       
        i++;
        //if (wprowadz_slowo[i]!='\0') i++;
       
    }
    w = i;
   
    //w tej tablicy beda przechowywane kolejne odgadywane literki
    char odgadywane_slowo[ w ];
   
   
    //do tablicy wstawiamy kropki (.)
    cout << "Tu wstawimy kropki \n";
    for( int j = 0; j < w; j++ )
    {
        odgadywane_slowo[ j ] = '.';
        cout << odgadywane_slowo[ j ];
    }
    cout << endl << odgadywane_slowo << endl;
   
    //chcemy sie dowiedziec ile de facto znakow ma tablica
    //odgadywane_slowo
    i = 0;
    while( odgadywane_slowo[ i ] != '\0' )
    {
       
        i++;
        //if (wprowadz_slowo[i]!='\0') i++;
       
    }
    cout << "odgadywane slowo i=" << i << endl;
   
    //jesli uzytkownikowi uda sie znalezc wszystkie litery ktore wchodza w sklad tablicy "wprowadz_slowo"
    //uzupelni tym samym tablice "odgadywane_slowo"
    //i petla while zakonczy swoje dzialanie gdy ciagi znakow
    //"wprowdz_slowo" oraz "odgadywane_slowo" beda identyczne
    while( strcmp( wprowadz_slowo, odgadywane_slowo ) != 0 )
    {
        cout << "Jaka literke w tekscie chcesz wyszukac?\n";
       
        //wprowadz jakiej literki szukamy
        cin >> szukaj;
        i = 0;
        k = 0;
        //przeszukujemy tablice "wprowadz_slowo" az do momentu napotkania znaku "konca ciagu"
        while( wprowadz_slowo[ i ] != '\0' )
        {
            //jesli wprowadzony znak jest taki sam jak i-elemnent z tablicy "wprowadz_slowo"
            if( szukaj == wprowadz_slowo[ i ] )
            {
                //to do i-elementu tablicy "odgadywane_slowo" dopisz wprowadzony przez uzytkownika znak
                odgadywane_slowo[ i ] = szukaj;
                //i zwieksz licznik ktory powie nam ile razy dana literka sie pojawila
                k++;
            }
            i++;
        }
        cout << "\nLiterka " << szukaj << " wystapila " << k << endl;
        cout << "Nasze slowo wyglada nastepujaco " << odgadywane_slowo << endl;
    }
    cout << "BRAWO odgadles szukane slowo: " << odgadywane_slowo << endl;
   
    return 0;
}
P-20671
ison
» 2010-08-10 13:03:05
problem pojawia się gdyż nie masz na końcu znaku zerowego, który oznacza koniec napisu

zastąp:
C/C++
char odgadywane_slowo[ w ];
tym
C/C++
char odgadywane_slowo[ w + 1 ];

i tuż po tym forze
C/C++
for( int j = 0; j < w; j++ )
{
    odgadywane_slowo[ j ] = '.';
    cout << odgadywane_slowo[ j ];
}
dopisz
C/C++
odgadywane_slowo[ w ] = '\0';
P-20673
ricardo83
Temat założony przez niniejszego użytkownika
» 2010-08-10 13:29:23
dziala :)
dziekuje ison:)

mam jeszcze jedno pytanie odnosnie deklarowania tablicy. Niektore podreczniki do c++ zalecaja aby znany byl rozmiar tablicy w momencie kompilacji. W tym programie rozmiar tablicy otrzymujemy po wpisaniu ciagu znakow. Ale wszystko wydaje sie dzialac prawidlowo. Czy istnieje taka mozliwosc ze przy bardziej zaawansowanych operacjach i nie deklarowaniu rozmiaru tablicy wystapia jakies bledy?

Pozdrawiam
P-20674
Elaine
» 2010-08-10 15:15:14
Jeśli implementacja tego rozszerzenia (VLA są poprawne w C99, ale nie w ANSI C ani C++, to jest wyłącznie rozszerzenie GCC) jest skopana (czyli istnieje bug w kompilatorze, całkiem realne jeśli chodzi o starsze wersje GCC) ALBO tablica będzie zbyt duża (a stos jest zwykle mały, tablice o nieznanym w czasie kompilacji rozmiarze na stosie to zwykle kiepski pomysł), to faktycznie może coś się posypać.
P-20680
programator
» 2010-08-11 11:23:24
Człowieku, tablice char już dawno wyszły z mody:)
Używaj biblioteki <string> (nie musisz się martwić o rozmiar słowa, a do tego masz ogromne możliwości operacji na tym słowie lub tekście):)
Zachęcam do przeczytania rozdziału o tej bibliotece w kursie C++.
P-20692
lenrokskate
» 2010-08-11 11:31:59
Człowieku, tablice char już dawno wyszły z modywesoły
Używaj biblioteki <string> (nie musisz się martwić o rozmiar słowa, a do tego masz ogromne możliwości operacji na tym słowie lub tekście)wesoły
Zachęcam do przeczytania rozdziału o tej bibliotece w kursie C++.

super, tylko, że jak trzeba napisać coś w C (np. WinAPI) to zrobisz FacePalma - trzeba umieć używać wszystkich technik
P-20693
malan
» 2010-08-11 12:44:01
c_str() i rzutowanie do czegoś jest, co nie?
P-20695
lenrokskate
» 2010-08-11 14:15:08
ale w C string zadziała?
P-20696
« 1 » 2
  Strona 1 z 2 Następna strona