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

Czyszczenie strumienia i pętla do

Ostatnio zmodyfikowano 2012-12-06 17:56
Autor Wiadomość
qwaler
Temat założony przez niniejszego użytkownika
Czyszczenie strumienia i pętla do
» 2012-12-05 21:12:27
Niestety mój program nie chce działać poprawnie. Chciałbym wyeliminować błąd z wprowadzeniem pod int znaku. Jednak gdy wprowadzam go robi się sieczka :(. Uczę się sam i jestem na samym początku nauki. Proszę o pomoc ;)

C/C++
#include <cstdlib>
#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
    int a, b;
    cout << "Program sprawdzajacy czy a jest podzielne przez b" << endl << endl;
    do
    {
        cout << "Podaj liczbe a: ";
        cin >> a;
        if( cin.fail() == 0 )
             cin.clear();
       
        cin.sync();
    } while( cin.fail() == 1 );
   
    cin.clear();
    cin.sync();
   
    do
    {
        cout << "Podaj liczbe b ( b != 0 ): ";
        cin >> b;
        if( cin.fail() == 1 )
             cin.clear();
       
        cin.sync();
    } while( b == 0 ); //powtarza, kiedy zostanie podane 0
   
   
   
    if( a % b == 0 )
         cout << endl << " Liczba " << a << " jest podzielna przez " << b << endl << endl;
    else
         cout << endl << " Liczba " << a << " NIE jest podzielna przez " << b << endl << endl;
   
    cin.clear();
    cin.sync();
    return main();
}
P-70411
jsc
» 2012-12-05 22:45:20
Może trzeba usunąć te czyszczenia, które są po za pętlami?
P-70414
Mrovqa
» 2012-12-06 08:05:39
C/C++
return main();
Wiesz co to robi? Ta linijka wywołuje funkcję main, dzięki czemu masz nieskończoną rekurencję. No dobra - w praktyce skończoną do czasu braku miejsca na stosie - crash. Zamień to na:
C/C++
return 0;
P-70417
qwaler
Temat założony przez niniejszego użytkownika
» 2012-12-06 14:29:05
Chciałem żeby tak się działo, ale coś chyba z tą pętlą jest nie tak.
P-70426
krzyk
» 2012-12-06 14:37:43
1: Jeśli jest fail to musisz wykonać clear i sync,więc ten if jest niepotrzebny.
2: Czyścisz strumień tuż przed sprawdzeniem czy fail(zawsze będzie false),lepiej będzie to zrobić przed pobraniem z konsoli.
3: Przydałoby sie też sprawdzanie poprawności dla licby b.

C/C++
cout << "Podaj liczbe a: ";

cin.clear();
cin.sync();

cin >> a;
P-70427
qwaler
Temat założony przez niniejszego użytkownika
» 2012-12-06 15:20:21
Zrobiłem takie coś:

C/C++
#include <cstdlib>
#include <cstdio>
#include <iostream>

using namespace std;

int main()
{
    int a, b;
    cout << "Program sprawdzajacy czy a jest podzielne przez b" << endl << endl;
    do
    {
        cout << "Podaj liczbe a: ";
        cin >> a;
        if( cin.fail() == 1 )
             cin.clear(), cin.sync();
       
    } while( a == 0 );
   
    cin.clear();
    cin.sync();
   
    do
    {
        cout << "Podaj liczbe b ( b != 0 ): ";
        cin >> b;
        if( cin.fail() == 1 )
             cin.clear(), cin.sync();
       
    } while( b == 0 ); //powtarza, kiedy zostanie podane 0, badz litera
   
    if( a % b == 0 )
         cout << endl << " Liczba " << a << " jest podzielna przez " << b << endl << endl;
    else
         cout << endl << " Liczba " << a << " NIE jest podzielna przez " << b << endl << endl;
   
    cin.clear();
    cin.sync();
    return main();
}


Jedynym mankamentem jest, że jeśli podam 0 jako "a" powraca do początku pętli.
P-70430
SeaMonster131
» 2012-12-06 16:47:26
C/C++
do
{
    ...
   
} while( a == 0 );

Ciekawe dlaczego :) Skoro dałeś taki warunek w pętli, to aplikacja właśnie tak działa.
P-70448
qwaler
Temat założony przez niniejszego użytkownika
» 2012-12-06 17:56:06
No wiem, że tak jest. Na razie tak chciałem. Może warunek dla a = 0 i osobną funkcję. Poza tym nie pomagacie mi zbytnio ;)
P-70452
« 1 »
  Strona 1 z 1