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

XII ćwiczenie.

Ostatnio zmodyfikowano 2009-11-03 00:19
Autor Wiadomość
DejaVu
» 2009-10-22 19:38:17
Padł jakiś długi wywód, ale bez konkretnego pytania. Co Ci konkretnie nie działa? Która linijka kodu nie działa lub której linijki nie rozumiesz?
P-11059
naiL
Temat założony przez niniejszego użytkownika
» 2009-10-22 21:20:48
Może te dwa ostatnie wpisy faktycznie do tematu i na temat.:-(
W telegraficznym skrócie. Dodałem do przedstawionego kodu przed wierszem cin >> wybor zasugerowane w temacie kolegi Mariuis'a cin.clear() i cin.sync(). Poprawiło się to że program nie blokuje się. Ale dalej:
#1. program wykonuje wszystko cacy jeśli wybierać 1-5.
#2. program po uruchomieniu na czysto przy próbie oszustwa i podaniu głupot pokazuje "nic z menu" ale poddaje dalej go próbie czy wybór nie jest literą
C/C++
else
     cout << "Nic z menu";

if( isalpha( wybor ) )
{
    cout << ", na dodatek to nie cyfry";
    getch();
}
co ma spowodować "Dopisanie" do komunikatu "Nic z menu"+", na dodatek to nie cyfry".
Po wprowadzeniu litery nie działa. pokazuje się jedynie "Nic z menu".
#3. program sprawdza wybujałym if'em wybór:

C/C++
if( !isalpha( wybor ) &&( wybor == 1 || wybor == 2 || wybor == 3 || wybor == 4 || wybor == 5 ) )

po uruchomieniu na czysto przy próbie oszustwa i podaniu głupot innych niż to co z menu czyli np "123" pokazuje po sprawdzeniu i działa wspomniany else->"nic z menu"... ale głupoty zaczynają się pojawiać kiedy wprowadzam "1234". niby nic wielkiego ale "122" czy "1234" daje inny wynik niż "123". Zadziwiające.
Jaka jest różnica analizowania przez komputer wprowadzenia "444" vs "666"???

#4. Problem jak u kolegi Mariuis'a który po dodaniu cin clearów nie znika
mianowicie po pierwszym uruchomieniu i podaniu cyfry 1-4 (5-wyjście) program pokazuje wybór. następny wprowadzony wybór jest literą dla oszustwa i pokazuje ostatni wybór.
hmm... no nie wiem jak to prościej opisać.
Nie szukam przepisu "tak ma wyglądać kod i koniec", bo faktycznie na forum jest kilka razy zaprezentowany przez kolegów. Napisany od podstaw poza pauzą i tym liczeniem cykli(z cplusplus ripp). Szukam raczej gdzie zbłądziłem w rozumowaniu.
Dlaczego po pierwszym wyborze 1-4 kolejny wybór "literowy" wykonuje ostatni 'case'? Co pamięta, że wybór wcześniej miał wartość konkretną. Czy cin << ma jakiś stos czy coś? Wpisując w wybór cyfry(liczby.. 6,7,8 itd do 123(122 daje inny wynik dlaczego?)) podobnie.
Jeśli wpisze 123 wyświetla "nic z menu". dalej wybór litera... powtórka
Jeśli wpisze 1234 wyświetla "nic z menu i to nie cyfry" dalej wybór litera ... powtórka ale tego drugiego wyboru.
błądzę w ciemnościach.
P-11060
DejaVu
» 2009-10-22 21:29:16
Co ja mogę Ci zaproponować żebyś mógł samodzielnie naprawić ten błąd... hm... wykomentuj za pomocą /* */, większość kodu i testuj jego małe fragmenty. Ja bym tak podchodził do szukania przyczyny błędu Twojego programu na dzień dobry.

/edit:
A dzisiaj nie mam czasu, więc jak coś to jutro zerknę.
P-11061
naiL
Temat założony przez niniejszego użytkownika
» 2009-10-23 13:03:32
Zamieniłem typ "wybor" z int na char. Poprawa i to bardzo.
W sumie można by było sprawę zamknąć. Wszystko działa do momentu pobrania dwucyfrowych wyborów(gdyby menu było większe o 5 pozycji wybór "11"="1" tak samo "1blabla"="1"). no i oczywiście (cin >> wybór).get(); bo przy wyborze cin >> wybor; "45" program wykonuje 4-tą pozycje menu od razu z 5-cio minutową pauzą:).
 Problem ale to chyba raczej na przyszłość: jak nauczyć program, żeby rozpoznawał
1 od 11 i odwrotnie. Jak ma rozpoznawać "1b2z3d4u5r6y" i żeby wypisał komunikat "helloł? to jakiś mix".
thx.
P-11069
GoldWolf
» 2009-10-28 20:16:07
Rozwiązaniem twojego problemu jest:
C/C++
if( !( wybor == - 1 ) ) {
    //    cout << tab[0][1]; wyświetla to co ma być wyświetlane
    cin >> znak; // znak to zmienna czar
    while( int( znak ) < 48 || int( znak ) > 57 ) {
        wybor = znak;
        cout << "Nie podano cyfry, sprobuj ponownie\n";
        cin >> znak;
    }
   
    if( int( znak ) == 49 )
         wybor = 1;
    else if( int( znak ) == 50 )
         wybor = 2;
    else if( int( znak ) == 51 )
         wybor = 3;
    else if( int( znak ) == 52 )
         wybor = 4;
    else if( int( znak ) == 53 )
         wybor = 5;
    else
         wybor = 0;
   
}
Oczywiście musisz to zaadoptować do swojego przykładu.
Ja też traktuje to w ramach hobby, więc daleko mi do największych na tym forum.

Bardzo podoba mi się sposób w jaki wychodzisz z programu, lepszego bym nie wymyślił.
P-11143
malan
» 2009-10-28 20:26:43
Jeśli pozwolisz trochę się przyczepię do kodu ;p:
C/C++
if( int( znak ) == 49 )
     wybor = 1;
else if( int( znak ) == 50 )
     wybor = 2;
else if( int( znak ) == 51 )
     wybor = 3;
else if( int( znak ) == 52 )
     wybor = 4;
else if( int( znak ) == 53 )
     wybor = 5;
else
     wybor = 0;

=
C/C++
if( int( znak ) >= 49 && int( znak ) <= 53 )
     wybor = int( znak ) - 48;
else
     wybor = 0;

;)
P-11145
Elaine
» 2009-10-28 20:37:00
Jeśli panowie pozwolą, to i ja się przyczepię:
C/C++
if( znak >= '1' && znak <= '5' )
     wybor = znak - '0';
else
     wybor = 0;
Kody ASCII są mało czytelne i niewygodne, można użyć literałów znakowych, poza tym konwersje na int są całkowicie zbędne.
P-11146
naiL
Temat założony przez niniejszego użytkownika
» 2009-11-02 23:55:03
witam! Mile zaskoczony jestem podpowiedziami.
 Wstyd się przyznać nie odrobiłem pracy domowej jeszcze z rozdziału gdzie jest int(wybor) gdzie wybor jest typu char. Przeglądałem sobie tylko. Pobudza mnie to tylko do nauki. A to chyba dobrze.
 
 Myślę tak sobie czy nie wprowadzić tutaj typu string do pobierania wyboru.
Chodzi mi o wyeliminowanie próby wprowadzenia nie tyle litery co dłuższego wyrażenia. np "123" "blablabla". Przy typie char podanie "123" wykona i tak case '1'.
taki sprawdzacz napisałem sobie na boku. może da radę to jakoś uprościć ale programik pokazuje o co mi chodzi... :)
C/C++
#include <string>
#include <iostream>
#include <conio.h>
int main()
{
   
    using namespace std;
    string wybor;
    for(;; )
    {
        cout << "wprowad" << char( 171 ) << " ";
       
        ( cin >> wybor ).get();
        if( wybor.size() > 1 )
        {
            int liczba_liter = 0;
            for( int i = 0; i <= wybor.size(); i++ )
            {
               
                if( isalpha( wybor[ i ] ) ) liczba_liter++;
               
            }
            if( liczba_liter >= 1 && liczba_liter != wybor.size() )
            {
                cout << "to jaki" << char( 152 ) << " mix?? ";
            }
            if( liczba_liter = 0 )
                 cout << "mia" << char( 136 ) << "a by" << char( 134 ) << " jedna cyfra";
           
        }
        if( !isalpha( wybor[ 0 ] ) && wybor.size() == 1 )
             cout << "brawo...Dzi" << char( 169 ) << "kuj" << char( 169 );
       
        else
             cout << "no mia" << char( 136 ) << "a by" << char( 134 ) << " cyfra 1-0 a nie co" << char( 152 ) << " co wprowadzi" << char( 136 ) << "e" << char( 152 );
       
        cout << "\n";
       
    }
    getch();
    return( 0 );
}
Pokłopotam się troche potem, żeby to wkleić do programiku i żeby działało ze switch'em który już mam gotowy. Tylko denerwuję się sam na siebie że dreptam w miejscu.
Myślę, że można temat zamknąć. Ale ten int(char) i odwrotnie... już wiem jak sobie poradzić z polskimi literkami. codziennie coś nowego.
Pozdrawiam.
P-11256
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona