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

Problem z pętlą

Ostatnio zmodyfikowano 2013-04-15 20:05
Autor Wiadomość
MisiekFazi
Temat założony przez niniejszego użytkownika
Problem z pętlą
» 2013-04-15 16:31:17
Otóż nie wiem czemu w funkcji jest opuszczana pętla i przechodzi dalej
C/C++
#include <iostream>
using namespace std;

int wczytajLiczbe()
{
    double a;
    char b;
    do
    {
        cin >> a;
        b = a;
        if( b = a );
       
        else
             cout << "Podales zle dane " << endl;
       
        clear.sync();
       
    } while( b != a );
   
}

int main()
{
    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}
P-80593
m4tx
» 2013-04-15 17:01:49
1. Nie zwracasz żadnej wartości we
wczytajLiczbe()
.
2.
if( b = a );
 - znak równości (=) to operator przypisania, nie porównania. I tak swoją drogą - skoro w przypadku, gdy warunek jest prawdziwy i tak nic nie robisz, to można po prostu zanegować:
if( b != a )
 lub:
if( !( b == a ) )
3. Nie możesz porównywać 2 zmiennych o różnych typach, to nie PHP (tzn. możesz, ale porównywanie chara z doublem nie ma najmniejszego sensu).
4. Jaki sens ma w ogóle to przypisywanie? Jak chcesz sprawdzić, czy użytkownik podał liczbę, sprawdzaj flagi błędów.
5. Funkcja ma zwracać wartość typu
int
, a ty używasz tylko
double
 i
char
...
6.
char
 może przechować tylko 1 znak, przy 2- i więcej-cyfrowych liczbach sobie nie powczytujesz.
7. Ten kod kompiluje Ci się bez warningów? :) Jeśli tak to włącz sobie najwyższy level warningów w ustawieniach IDE.
8. » KursyKurs C++ kurs.
P-80595
MisiekFazi
Temat założony przez niniejszego użytkownika
» 2013-04-15 18:20:02
Tak wiem że nie było powrotu (zwrotu ) bo gdy się coś psuło to sprawdzałem czy jest to spowodowane. Ale i po poprawieniu nic się nie zmieniło lub nadal o czymś nie pamiętam.

C/C++
#include <iostream>
using namespace std;

int wczytajLiczbe()
{
    int a;
    do
    {
        cin >> a;
        if( !cin.good() );
       
        cout << "Podales zle dane " << endl;
        cin.clear();
        cin.sync();
    } while( cin.fail() );
   
    return a;
}

int main()
{
    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}
P-80601
Bajt
» 2013-04-15 19:43:00
Po if'ie masz nie mieć średnika. Poza tym, kiedy masz więcej niż jedną linijkę instrukcji w if'ie to dajesz klamry. Może cały czas, wczytujesz poprawne dane?
P-80616
MisiekFazi
Temat założony przez niniejszego użytkownika
» 2013-04-15 19:59:11
No nie najpierw daje liczbę a potem literę i tak na przekór kończy program ale wypisuje że dana była zła.

C/C++
#include <iostream>
using namespace std;

int wczytajLiczbe()
{
    int a;
    do
    {
        cin >> a;
        if( !cin.good() )
        {
            cout << "Podales zle dane " << endl;
            cin.clear();
            cin.sync();
        }
    } while( cin.fail() );
   
    return a;
}

int main()
{
    std::cout << "Podaj liczbe: ";
    int liczba = wczytajLiczbe();
    std::cout << "Podales liczbe: " << liczba << std::endl;
    return 0;
}
P-80617
m4tx
» 2013-04-15 20:03:07
No nie najpierw daje liczbę a potem literę i tak na przekór kończy program ale wypisuje że dana była zła.
No bo jak czyścisz flagi błędów w tym
if
ie to one są już wyczyszczone, gdy dochodzi do sprawdzenia warunku
while( cin.fail() );
. Ponieważ flagi błędów są już wyczyszczone, to i
fail()
 zwróci
false
. Rozwiązanie? Możesz np. czyścić flagi na początku pętli do..while.
P-80618
MisiekFazi
Temat założony przez niniejszego użytkownika
» 2013-04-15 20:05:38
Ok dziękuję bardzo za pomoc . Działa
P-80620
« 1 »
  Strona 1 z 1