Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Problem z pętlą - wyczyszczenie bufora cin


voidbit

Rekomendowane odpowiedzi

Opublikowano

Witam,

 

Męczę Symfonie i w jednym z zadan z rozdzialu wskazniki mam problem z jednym przykładem. Jeśli miescimy sie w limicie operacji program dziala poprawnie. Jesli wychodzimy poza limit wpadamy w niekonczaca sie petle. Podejrzewam ze powodem jest fakt ze bufor cin nie jest wyczyszczony bo tutaj:

        if (i >= limit)
        {
            cout << "\nBlad! Osiagnieto maksymalny limit operacji!\n\n\n";
            continue;
        }

przechodzimy do poczatku petli jak nam limit operacji wyniesie >= 5. Jednak program od razu po wyswieleniu zapytania "Wybierz odpowiednia akcje..." przechodzi dalej a nie czeka na wprowadzenie wartosci przez uzytkownika. cin.clear() i cin.ignore() oraz cin.sync() nie pomagają .

Jako że temp już jest zadane przechodzi dalej, i znow dochodzi do tego if'a. Wartosc zmiennej i sie nie zmienila i znow przeskakujemy do poczatku gdzie cin jest ignorowane z jakiegos powodu.

 

 

Ponizej tresc zadania:

LXIII. Napisz program imitujący
pracę robota przemysłowego. Powinien mieć on sześć funkcji
odpowiadających za elementarne ruchy robota.
Wszystkie te funkcje powinny być wywoływane bez żadnego argumentu, a zwracać rezultat typu bool.
Ich ciało zawierać powinno wypis na ekran wyjaśniający co dana funkcja, robi. Na przykład funkcja bool obrot_w_prawo() powinna wypisać na ekranie tekst "Obrot ramienia w prawo". Wartość rezultatu ma służyć, że operacja się powiodła w naszym przypadku - zawsze niech będzie zwracana wartość true. Niech gdzieś w funkcji main pojawi się menu pozwalające wybrać jedną z sześciu operacji. Po wybraniu jednej z tych operacji adres odpowiedniej funkcji powinien zostać zapisany w tablicy wskaźników do funkcji. W ten sposób powinno się zapamiętywać skomplikowaną operację składającą się z maksymalnie 20 ruchów robota. W menu powinna być komenda "wykonać", na skutek której wszystkie operacje, w kolejnosci w jakiej były wybierane z menu i składowane w tablicy, powinny zostać wykonane(czyli ich funkcje uruchomione). Jeśli w menu wybierze się komende "koniec" - program się kończy.

 

#include <iostream>
#include <conio.h>
#include <string>
#include <limits>
#include <cstdio>

using namespace std;

bool obrot_w_prawo();
bool obrot_w_lewo();
bool podniesienie_prawego_ramienia();
bool podniesienie_lewego_ramienia();
bool wystrzelenie_rakiet();
bool zrzut_balastu();

const int limit = 5;

bool (*tab_wsk[limit])();


int main()
{
    int i = 0, temp = 999;
    do
    {
        cout << "Wybierz odpowiednia akcje.\n1. Obrot w prawo\n2. Obrot w lewo\n3. Podnisienie prawego ramienia\n4. Podnisienie lewego ramienia\n5. Wystrzelenie rakie\n6. Zrzucenie balastu\n0. Wykonaj sekwencje komend!\n9. Zakoncz\n\nAkcja: ";
        cin >> temp;

        switch (temp)
        {
        case 1:
            tab_wsk[i] = &obrot_w_prawo;
            break;
        case 2:
            tab_wsk[i] = &obrot_w_lewo;
            break;
        case 3:
            tab_wsk[i] = &podniesienie_prawego_ramienia;
            break;
        case 4:
            tab_wsk[i] = &podniesienie_lewego_ramienia;
            break;
        case 5:
            tab_wsk[i] = &wystrzelenie_rakiet;
            break;
        case 6:
            tab_wsk[i] = &zrzut_balastu;
            break;
        case 9:
            cout << "\nWyjscie\n";
            break;
        case 0:
            cout << "######################################\n";
            cout << "Wykonujemy polecenia!\n";
            for (int j = 0; j < i; j++)
            {
                tab_wsk[j]();
                cout << endl;
            }
            cout << ">>>>>>> Reset operacji! >>>>>>>\n";
            i = 0;
            cout << "######################################\n";
            cout << endl;
            continue;
        default:
            cout << "\nNieprawidlowa akcja!\n\n" << "\tTemp: " << temp;
            continue;
        }


        if (i >= limit)
        {
            cout << "\nBlad! Osiagnieto maksymalny limit operacji!\n\n\n";
            continue;
        }

        cout << "Pozostalo operacji: " << limit - (++i) << "\n\n";
    }
    while (temp != 9);

    getch();
}


bool obrot_w_prawo()
{
    cout << "Obracam sie w prawo!";
    return true;
}

bool obrot_w_lewo()
{
    cout << "Obracam sie w lewo!";
    return true;
}

bool podniesienie_prawego_ramienia()
{
    cout << "Podnosze prawie ramie!";
    return true;
}

bool podniesienie_lewego_ramienia()
{
    cout << "Podnosze lewe ramie!";
    return true;
}

bool wystrzelenie_rakiet()
{
    cout << "Odpalam rakiety!";
    return true;
}

bool zrzut_balastu()
{
    cout << "Zrzucam balast!";
    return true;
}

Z góry dziękuję wszystkim za pomoc!

void_bit.jpg

Opublikowano

 

 if (i >= limit)
        {
            cout << "\nBlad! Osiagnieto maksymalny limit operacji!\n\n\n";
            break;  // powinno smigac ;] 
       }

Break bedzie dzialal ale nie chcemy przerywac dzialania programu tylko chcemy uzytkownikowi dac mozliwosc wyboru: czy chcesz uruchomic sekwencje komend czy wyjsc. Mozna by oczywiscie bylo kod odpowiedzialny za to umiescic w tym if'ie ale to bedzie bez sensu bo juz jest powyzej.

void_bit.jpg

Opublikowano


 

 

 

 

do

{

 

 

if (i >= limit)

{

cout << "\nBlad! Osiagnieto maksymalny limit operacji!\n\n\n";

 

do

{

cout << "\nWybierz opcje :\n0.Uruchomienie\n9.Koniec";

cin>>temp;

}

while((temp!=0)&&(temp!=9));

 

}

else

{

cout << "\nPozostalo operacji: " << limit - (i+1) <<"\n";

cout << "Wybierz odpowiednia akcje.\n1. Obrot w prawo\n2. Obrot w lewo\n3. Podnisienie prawego ramienia\n4. Podnisienie lewego ramienia\n5. Wystrzelenie rakie\n6. Zrzucenie balastu\n0. Wykonaj sekwencje komend!\n9. Zakoncz\n\nAkcja: ";

cin >> temp;

}

 

switch (temp)

{

case 1:

tab_wsk = &obrot_w_prawo;

break;

case 2:

tab_wsk = &obrot_w_lewo;

break;

case 3:

tab_wsk = &podniesienie_prawego_ramienia;

break;

case 4:

tab_wsk = &podniesienie_lewego_ramienia;

break;

case 5:

tab_wsk = &wystrzelenie_rakiet;

break;

case 6:

tab_wsk = &zrzut_balastu;

break;

case 9:

cout << "\nWyjscie\n";

break;

case 0:

cout << "######################################\n";

cout << "Wykonujemy polecenia!\n";

for (int j = 0; j < i; j++)

{

tab_wsk[j]();

cout << endl;

}

cout << ">>>>>>> Reset operacji! >>>>>>>\n";

i = 0;

cout << "######################################\n";

cout << endl;

continue;

default:

cout << "\nNieprawidlowa akcja! " << "\tTemp: " << temp<<"\n\n";

continue;

}

 

i++;

 

 

}

while (temp != 9);

 

Opublikowano

@up

Dziala, reput!

 

Jednak ciekawi mnie czemu w mojej wersji nie przechodzilo. Nie widze powodu dla ktorego program ignorowal instrukcje cin. Oprocz tego ze w buforze zostaly jakies smieci (jednak czyszczenie bufora nie przynioslo skutku).

void_bit.jpg

Opublikowano

@up

Dziala, reput!

 

Jednak ciekawi mnie czemu w mojej wersji nie przechodzilo. Nie widze powodu dla ktorego program ignorowal instrukcje cin. Oprocz tego ze w buforze zostaly jakies smieci (jednak czyszczenie bufora nie przynioslo skutku).

Tak w nawiasie to powiem Ci ze twoj kod dziala u mnie poprawnie xD

Opublikowano

Tak w nawiasie to powiem Ci ze twoj kod dziala u mnie poprawnie xD

Hmm xD Cos mi swita... Kompilowalem to w Visual Studio i nie dziala :P

Jak teraz skompilowalem minGW w Code::Blocks to działa bez zarzutu xD

 

Dzieki za pomoc! Czyli nie byl to blad logiczny tylko jakas fanaberia kompilatora MS.

void_bit.jpg

Weteran
Opublikowano

Dzieki za pomoc! Czyli nie byl to blad logiczny tylko jakas fanaberia kompilatora MS.

Spojrzałem na kod i pierwsze co zauważyłem to #include <conio.h>. Jeśli chcesz żeby kod działał na każdym kompilatorze, to nie korzystaj z tej biblioteki. Nie jest ci ona do niczego potrzebna.

Opublikowano

@up

<conio.h> uzylem zeby mozna bylo wlasnie na kazdym kompilatorze kompilowac w tym na linuxie :P bo korzystam z getch(). System("PAUSE") nie uzywam. Ewentualnie moglem dac cin.get().

 

Sprawa jest tym dziwniejsza ze:

minGW - bezproblemowa kompilacja i dzialanie

Kompilowane bezposrednio w Visual Studio - tez wszystko ok

 

Compilowane kompilatorem Visual Studio ale przez linie komend ( cl source.cpp)

Program ignoruje cin w kolejnym obiegu petli i wpada w nieskonczona....

void_bit.jpg

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...