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

Quiz[Problem]

Ostatnio zmodyfikowano 2008-10-03 10:54
Autor Wiadomość
Duninho
Temat założony przez niniejszego użytkownika
Quiz[Problem]
» 2008-10-02 21:47:31
Ostatnio mam jakieś wątpliwości co do tego czy umiem przeczytane już lekcje, no i jak się okazuje, nie do końca.
Piszę sobie dlatego proste programy by utrwalić wiedzę i -w razie znalezienia jakiś braków- uzupełnić ją.
C/C++
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
int main()
{
    int punkty = 0, b, odp;
    string a;
    string c;
   
    cout << "Odpowiedz na pytania, tak, to jest quiz. Nie, to nie jest sen." << endl;
    cout << "[1] Stolica Polski: ";
    getline( cin, a );
    odp += 1;
   
    if( a == "Warszawa" || a == "warszawa" )
    {
        punkty += 1;
    }
   
    cout << "[2] 46+54=x - podaj x w tym rowaniu. : ";
    cin >> b;
    odp += 1;
   
    if( b == 100 )
    {
        punkty += 1;
    }
   
    cout << "[3] Monty Python. W ktorym filmie wystepowali rycerze mowiacy 'NI'?" << endl << " (odp. z malych liter i bez polskich znakow): ";
    getline( cin, c );
    odp += 1;
   
    if( c == "monty python i swiety graal" )
    {
        punkty += 1;
    }
    if( odp == 3 )
    {
       
        cout << "Laczna ilosc punktow wynosi: " << punkty << endl;
        getch();
    }
    getch();
    return( 0 );
}
No więc mamy prosty kod quizu (nie ukończony więc kilka zmiennych nie ma sensu), problem polega na tym, że odpalony program olewa "getline(cin,c);" i całą resztę kodu i przechodzi od razu do sumowania punktów. Zdaję sobie sprawę, że problem jest łatwy albo jak kto woli banalny ale pomoc by się przydała w tej sprawie (to jest powód dla którego tu piszę jakby nie patrzyć) :).
P-1771
DejaVu
» 2008-10-02 21:53:18
A jaką wartość wprowadzasz w odpowiedzi b?

/edit:
Poprawiony kod:
C/C++
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
int main()
{
    int punkty = 0, b, odp = 0; //inicjacja odp=0
    string a;
    string c;
   
    cout << "Odpowiedz na pytania, tak, to jest quiz. Nie, to nie jest sen." << endl;
    cout << "[1] Stolica Polski: ";
    getline( cin, a );
    odp += 1;
   
    if( a == "Warszawa" || a == "warszawa" )
    {
        punkty += 1;
    }
   
    cout << "[2] 46+54=x - podaj x w tym rowaniu. : ";
    cin >> b;
    cin.sync(); //czyści bufor cin'a
    odp += 1;
   
    if( b == 100 )
    {
        punkty += 1;
    }
   
    cout << "[3] Monty Python. W ktorym filmie wystepowali rycerze mowiacy 'NI'?" << endl << " (odp. z malych liter i bez polskich znakow): ";
    getline( cin, c );
    odp += 1;
   
    if( c == "monty python i swiety graal" )
    {
        punkty += 1;
    }
   
    cout << "Laczna ilosc punktow wynosi: " << punkty << endl; //punkty zawsze chcemy raczej wyświetlać
    getch();
    return( 0 );
}
P-1772
Duninho
Temat założony przez niniejszego użytkownika
» 2008-10-02 22:45:01
Byłbym wdzięczny jeszcze za wyjaśnienie w jakiej sytuacji i czemu trzeba czyścić bufor cina. Lubię wiedzieć co piszę ;)
P-1778
DejaVu
» 2008-10-02 22:52:29
Bufor czyścisz wtedy, gdy nie chcesz mieć 'śmieci' ze strumienia wczytując nowe dane. W Twoim przykładzie gdy wczytywałeś liczbę, polecenie cin>>b; wczytało Ci liczbę, a w buforze został znak nowej linii (enter). W związku z tym kolejny wiersz getline(cin,c); wziął wszystkie pozostałe dane w buforze i napotkał w nim znak nowego wiersza, co dla niego oznaczało, że wiersz został już wczytany.

/edit:
Przykładowo:
C/C++
int liczba;
cin >> liczba;
string tekst;
getline( cin, tekst );
cout << "tekst = \"" << tekst << "\"" << endl;
Jeśli podczas podawania liczby wpiszesz:
123 aaa bbb ccc koniec wiersza
to w strumieniu cin pozostaną wszystkie dane, które występują po liczbie. Jeśli chcesz ich się pozbyć czyścisz bufor wywołując metodę cin.sync();.
P-1780
Duninho
Temat założony przez niniejszego użytkownika
» 2008-10-03 08:10:27
Hmm, jeszcze tylko jedna sprawa i już wszystko z tego tematu będzie wyjaśnione. Jak zrobić by podczas sprawdzania wartości string przez if nie brał pod uwagę wielkości liter. Chodzi o to by odpowiedzi typy "WaRSzawA" były tak samo poprawne jak "Warszawa" czy "warszawa".
P-1785
DejaVu
» 2008-10-03 10:54:31
Jest funkcja int tolower(int znak); która zamienia duże litery na małe litery. Możesz w związku z tym po wczytaniu tekstu przejść po jego wszystkich znakach pętlą i zastąpić duże małymi. Tu jest manual:
http://www.cppreference.com/wiki/c/string/tolower

Zakładaj nowe tematy, ponieważ ten jest defacto offtopic'em i żaden użytkownik nie będzie szukał odpowiedzi w tym temacie jak ignorować wielkość znaków.
P-1786
« 1 »
  Strona 1 z 1