Strona 1 z 2 12 OstatniOstatni
Pokaż wyniki od 1 do 12 z 22
Program liczący objętość walca
  1. #1
    Użytkownik
    Dołączył
    26.04.2008
    Posty
    97
    Wątków
    29
    Siła reputacji
    9

    Domyślnie Program liczący objętość walca

    Otóż zrobiłem programik ,który liczy objętość walca, zapętliłem go także. Mam pytanie jak wygląda instrukcja, która gdy użytkownik wpisuje promień i wysokość sprawdzała by czy wpisuje liczby. W przeciwnym razie gdyby użytkownik wpisał np. jakąś litererę toby wyświetliła komunikat.
    #include <cstdlib>
    #include <iostream>
    #include<conio.h>
    using namespace std;
    main()
    {
    cout<<"Program liczacy objetosc walca.Przyblizenie liczby pi wynosi 3,14"<<endl;
    int Wysokosc;
    int Promien;
    float Objetosc;
    cout<<"Podaj wysokosc";
    cin>>Wysokosc;
    cout<<"Podaj promien";
    cin>>Promien;
    Objetosc=3.14*Promien*Promien*Wysokosc;
    cout<<"Objetosc wynosi:"<<Objetosc<<endl;
    //Na dole jest petla
    for (int i = 1; i <= 1000; i++)
    {
    int odpowiedz;
    cout<<"Czy chcesz policzyc objetosc jeszcze raz?tak(1) czy nie(dowolny znak)";
    cin>>odpowiedz;
    if(odpowiedz==1)
    {
    cout<<"Podaj wysokosc";
    cin>>Wysokosc;
    cout<<"Podaj promien";
    cin>>Promien;
    Objetosc=3.14*Promien*Promien*Wysokosc;
    cout<<"Objetosc wynosi:"<<Objetosc<<endl;
    }
    else
    {
    cout<<"Dziekuje za wspolprace";
    getch();
    break;
    }
    }
    }
    Uwaga: To jest stary temat
    Ta dyskusja jest starsza niż 90 dni. Informacje w niej zawarte mogą już nie być aktualne

  2. #2
    Aktywny Użytkownik Awatar matek3005
    Dołączył
    19.10.2008
    Posty
    363
    Wątków
    3
    Siła reputacji
    11

    Domyślnie Odp: Program liczący objętość walca

    Kod:
    #include <iostream>
    #include <limits>
    
    int main()
    {
        int a;
        while(!(std::cin >> a))
        {
            std::cerr << "blad strumienia" << std::endl;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
        std::cout << a;
        return 0;
    }
    albo czytaj do string'a ale jest to o wiele brzydszym rozwiązaniem.

  3. #3
    Użytkownik
    Założyciel Tematu

    Dołączył
    26.04.2008
    Posty
    97
    Wątków
    29
    Siła reputacji
    9

    Domyślnie Odp: Program liczący objętość walca

    A mógłby ktoś bardziej wytłumaczyć ten kawałek:
    while(!(cin >> a))
    {
    cerr << "blad strumienia" << endl;
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    Dopiero skończyłem instrukcje sterujące. Nie rozumiem co oznacz ten ! w while i jaki jest warunek przerwania pętli. Nie wiem też co oznaczają te dalsze intrukcje. Bardzo proszę o wyltłumaczenie.

  4. #4
    Aktywny Użytkownik Awatar matek3005
    Dołączył
    19.10.2008
    Posty
    363
    Wątków
    3
    Siła reputacji
    11

    Domyślnie Odp: Program liczący objętość walca

    Kod:
    int main()
    {
        int b;
        bool a = cin >> b;
        cout << boolalpha << a;
    
        return 0;
    }
    1. zobacz jaką wartość przyjmuje zmienna 'a' w zależności od stanu strumienia, czyli wprowadź poprawne dane oraz złe (np litery) i zobacz co wypisze. Pętla while wykonuje się do momentu gdy logiczne działanie w jego warunku nie przyjmie fałszu (czyli wykonuje się gdy jest prawdziwe) Operator "!" jest logicznym operatorem negacji.

    2. cerr standardowy strumień błędów, możesz spokojnie zamienić na cout.

    3. cin.clear(); - w momencie gdy strumień znajduje się w stanie błędu ustawia tzw flagę błędu. wywołanie cin.clear() (jako argument domyślny przyjmuje goodbit) oznacza usunięcie wszystkich flag błędów.

    4. cin.ignore() (w powyższej postaci) usuwa ze strumienia znaki do jego końca lub do napotkania znaku nowej linii.

    Na przyszłość zachęcam do skorzystania z poniższej strony:
    Kod:
    http://www.cplusplus.com/reference/
    
    co do clear:
    http://www.cplusplus.com/reference/iostream/ios/clear/
    
    oraz ignore:
    http://www.cplusplus.com/reference/iostream/istream/ignore/
    limits znajdziesz już sobie sam w podanym linku (jeśli cie to zainteresuje)
    pozdrawiam

  5. #5
    Użytkownik
    Założyciel Tematu

    Dołączył
    26.04.2008
    Posty
    97
    Wątków
    29
    Siła reputacji
    9

    Domyślnie

    A znasz może jakieś polskie strony na temat tego ??Mój angielski nie jest dostatecznie dobry by zajmować się takimi dziedzinami.
    P.S Czyli można by też tak powiedzieć, że po podaniu przez nas zmiennej, program jeżeli jest to liczba widzi true, ale operator negacji zmienia to na false i instrukcja nie jest wykonywana. Jeśli napiszemy jakieś słowa to while uznaje jako false, a operator zmienia na true i instrukcja jest wykonywana
    P.S 2
    Przekształciłem ten program, działa jak pierwszy
    #include <iostream>
    #include <limits>
    #include <conio.h>
    using namespace std;
    int main()
    {
    int a;
    while(!(cin >> a))
    {
    cerr << "blad strumienia" << endl;
    goto tutaj;
    }

    cout<<a;
    tutaj:
    getch();
    return 0;
    }
    Ostatnio edytowane przez polkom21 ; 25.03.2011 o 16:06 Powód: §II.7. Pisanie post pod postem zamiast edycji posta.

  6. #6
    Aktywny Użytkownik Awatar matek3005
    Dołączył
    19.10.2008
    Posty
    363
    Wątków
    3
    Siła reputacji
    11

    Domyślnie Odp: Program liczący objętość walca

    Strzeż się goto, najlepiej nigdy go nie używaj. Gdyby nie było tego operatora negacji, to program wciąż by cie prosił o podanie danych do czasu gdy nie pojawi się błąd lub strumień nie napotka eof.
    Ostatnio edytowane przez matek3005 ; 24.03.2011 o 22:35

  7. #7
    Użytkownik
    Założyciel Tematu

    Dołączył
    26.04.2008
    Posty
    97
    Wątków
    29
    Siła reputacji
    9

    Domyślnie Odp: Program liczący objętość walca

    Szczerze mówiąc nie wiem jak zastąpić to goto. Mógłbyś powiedzieć jakiej instrukcji należy użyć i czemu tego goto mam się strzec?

  8. #8
    Aktywny Użytkownik Awatar matek3005
    Dołączył
    19.10.2008
    Posty
    363
    Wątków
    3
    Siła reputacji
    11

    Domyślnie Odp: Program liczący objętość walca

    Cytat Zamieszczone przez kolarz3 Zobacz posta
    Szczerze mówiąc nie wiem jak zastąpić to goto. Mógłbyś powiedzieć jakiej instrukcji należy użyć i czemu tego goto mam się strzec?
    Kod:
    co do goto
    Nie wiem co próbujesz osiągnąć. Masz narzędzia teraz pomyśl jak ich użyć. Na tym polega programowanie.

    pozdrawiam.

  9. #9
    Użytkownik
    Założyciel Tematu

    Dołączył
    26.04.2008
    Posty
    97
    Wątków
    29
    Siła reputacji
    9

    Domyślnie Odp: Program liczący objętość walca

    #include <iostream>
    #include <conio.h>
    using namespace std;
    int main()
    {
    int a;
    while(!(cin >>a) )
    {
    cout << "blad strumienia" << endl;
    getch();
    break;
    }
    if(a=false)
    {
    cout<<a;
    getch();
    }
    return 0;
    }
    Stworzyłem coś takiego. Jest tylko jeden problem. Gdy podaje złe dane to wszystko jest ok. Ale gdy zmienną jest liczba dzieje się coś dziwnego. Program nie wykonuje żadnej instrukcji. Powinien wykonać instrukcje if, ponieważ w instrukcji while liczba otrzymuje wartość false, a dzięki temu potwierdzony jest warunek że a = false.

  10. #10
    Aktywny Użytkownik Awatar matek3005
    Dołączył
    19.10.2008
    Posty
    363
    Wątków
    3
    Siła reputacji
    11

    Domyślnie Odp: Program liczący objętość walca

    W if powinieneś stosować operator porównania, a nie przypisania. Żeby nie robić takich błędów możesz warunek zapisać tak:
    Kod:
    if(false = a)
    wtedy się to nawet nie skompiluje przez co od razu dostrzeżesz błąd.

    Oczywiście poprawnie wyglądać to powinno tak:
    Kod:
    if(false == a)
    lub if(a == false)

  11. #11
    Użytkownik
    Założyciel Tematu

    Dołączył
    26.04.2008
    Posty
    97
    Wątków
    29
    Siła reputacji
    9

    Domyślnie Odp: Program liczący objętość walca

    Dałem znak równości i ten sam problem co poprzednie. Postanowiłem zrobić coś takiego if(!(a==false)) i z wielkim zdziwieniem okazało się, że liczba przed instrukcją if ma wartość true i do tego nie wykonuje instrukcji while. Czemu tak się dzieje?

  12. #12
    Aktywny Użytkownik Awatar matek3005
    Dołączył
    19.10.2008
    Posty
    363
    Wątków
    3
    Siła reputacji
    11

    Domyślnie Odp: Program liczący objętość walca

    Kolego, weź jakąś książeczkę do c++ i poczytaj bo tak to ja ci mogę odpowiadać w nieskończoność, a nie o to tu chodzi. Ty do zmiennej 'a' wprowadzasz dane z wejścia więc jeśli podasz wartość różną od zera, zmienna 'a' będzie zawsze miała wartość 'true' (bo tak to już jest, że 0 == false) - spróbuj przypisać 'a' 0 na wejściu i zobacz czy warunek po pętli się wykona czy nie. Natomiast while wykonuje się tylko raz bo nie czyścisz flagi błędu oraz bufora - pisałem ci wyżej jak to masz robić to mnie olałeś.

    W każdym bądź razie uzyskałeś pomoc, o którą prosiłeś więc jak dla mnie jest eot.

    pozdrawiam

Strona 1 z 2 12 OstatniOstatni