• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pętla while, for zakonczenie dzialania i przejscie do nastepnego punktu

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
908 wizyt
pytanie zadane 23 maja 2017 w C i C++ przez aksikar Nowicjusz (130 p.)

Mam taki kod:

void wektor::pobieranie_danych()
{
	cout << "Podaj pierwszą składową: " << endl;
	cin >> x;
	cout << "Podaj drugą składową: " << endl;
	cin >> y;
	cout << "Podaj trzecią składową: " << endl;
	cin >> z;

Chcę tu zrobić taką petlę, w której po wprowadzeniu znaku program będzie kontynuowal tą petlę(znaku nie można wprowadzać)  ,do momentu wprowadzenia liczby ma przejść do następnego couta.  I tak do następnego. Jak to zapisac?

komentarz 23 maja 2017 przez OfftheCode Gaduła (4,050 p.)
Nie do końca rozumiem pytanie, a chciałbym Ci pomóc, mógłbyś spróbować wytłumaczyć dokładniej ?
komentarz 23 maja 2017 przez aksikar Nowicjusz (130 p.)
Jak podam w pierwszym cout (np. a )to ma nie przerywac programu tylko kontynuować ten pierwszy cout. Dopiero kiedy wprowadzimy liczbe ma przejść do następnego couta. Wiem, ze trzeba to zrobić za pomocą pętli.
komentarz 23 maja 2017 przez Chess Szeryf (76,710 p.)

Powienieneś chyba napisać if'a + continue + break.

http://en.cppreference.com/w/cpp/language/if

http://en.cppreference.com/w/cpp/language/continue

http://en.cppreference.com/w/cpp/language/break

Jak chcesz pętlą, to dodaj do tego jakąś pętlę while, do-while, czy for i tyle.

komentarz 23 maja 2017 przez OfftheCode Gaduła (4,050 p.)
Okej czyli chcesz wymusić wprowadzenie liczby do zmiennej, a w innym przypadku powtórzyć wprowadzenie jeśli ktoś wprowadzi np literę tak ?
komentarz 23 maja 2017 przez Knayder Nałogowiec (37,640 p.)
Zabawa z cinem nie jest taka prosta.
Musisz za każdym razem sprawdzić czy są jakieś flagi błędu, potem wyczyścić bufor, no i na końcu wyczyścić flagi błędów.
Więcej z tym zabawy niż pożytku. Więc jeżeli nie masz zadania w którym musisz KONIECZNIE sprawdzać poprawność, to olej to.
komentarz 23 maja 2017 przez aksikar Nowicjusz (130 p.)
Tak

4 odpowiedzi

+1 głos
odpowiedź 23 maja 2017 przez Molester Bywalec (2,920 p.)
cout << "Podaj pierwszą składową: " << endl;
    while(!(cin >> x)){
    cout << "Wprowadzono cos innego niz liczbe." << std::endl;
    cin.clear();    
    cin.ignore( 1000, '\n' );   
    }    
     
     
    cout << "Podaj drugą składową: " << endl;
     while(!(cin >> y)){
    cout << "Wprowadzono cos innego niz liczbe." << std::endl;
    cin.clear();    
    cin.ignore( 1000, '\n' );  
     }
    
    cout << "Podaj trzecią składową: " << endl;
    while(!(cin >> z)){
    cout << "Wprowadzono cos innego niz liczbe." << std::endl;
    cin.clear();    
    cin.ignore( 1000, '\n' );    
    }
    

 

komentarz 23 maja 2017 przez Molester Bywalec (2,920 p.)

Zamiast 

cin.ignore( 1000, '\n' );  możesz dać 

 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');   

Z dołączoną biblioteką <limits>

komentarz 23 maja 2017 przez aksikar Nowicjusz (130 p.)
Mógłbyś wytlumaczyc jak to dziala po kolei?
komentarz 23 maja 2017 przez Molester Bywalec (2,920 p.)

x jest liczbą całkowitą.

Dopóki input (x) jest różny od oczekiwanego (różny od int). Wyczyść flagi błędu (cin.clear();) tak żeby przyszłe operacje wejścia były możliwe. Oraz wczytuj i ignoruj  1000 znaków, dopóki nie napotkasz znaku nowej lini (cin.ignore( 1000, '\n' );) 

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

to w pewnym uproszczeniu  ignoruj wszystki znaki (nie tylko 1000)

komentarz 24 maja 2017 przez aksikar Nowicjusz (130 p.)
Dziękuję bardzo, działa :)
+1 głos
odpowiedź 24 maja 2017 przez mokrowski Mędrzec (156,480 p.)

Ten kod posiada bardzo podobne 3 sekcje (wyświetl komunikat, wprowadź jakieś dane, jak nie są poprawne warto jakoś reagować). Jeśli zapiszesz to tak jak to zrobiłeś, będziesz łamał regułę DRY. Kod kwalifikuje się do wydzielenia do funkcji.

#include <iostream>
#include <limits>
#include <string>

int readValue(const std::string& message) {
    int value;
    
    do {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << message;
        std::cin >> value;
        if(!std::cin) {
            std::cout << "Wprowadzono nieprawidłową wartość. "
                << "Spróbuj jeszcze raz.\n";
        } 
    } while(!std::cin);

    return value;
}

int main() {
    int a = readValue("Podaj pierwszą składową: ");
    int b = readValue("Podaj drugą składową: ");
    int c = readValue("Podaj trzecią składową: ");

}

0 głosów
odpowiedź 23 maja 2017 przez tangarr Mędrzec (155,140 p.)

Jeżeli dobrze zrozumiałem twoją intencję to chcesz zabezpieczyć program przed wprowadzeniem błędnych danych.
Jeżeli tak to ten kod powinien ci pomóc:
 

void wektor::pobieranie_danych()
{
    do {
        cout << "Podaj pierwszą składową: " << endl;
        cin >> x;
    } while (cin.bad());
    do {
        cout << "Podaj drugą składową: " << endl;
        cin >> y;
    } while (cin.bad());
    do {
        cout << "Podaj trzecią składową: " << endl;
        cin >> z;
    } while (cin.bad());
}

 

komentarz 23 maja 2017 przez aksikar Nowicjusz (130 p.)
Nie działa, od razu kończy program, a ja chce żeby kontynuowalo wprowadzanie pierwszej składowej itd. Ale dobrze zrozumiałeś.
komentarz 23 maja 2017 przez Knayder Nałogowiec (37,640 p.)
XXX
0 głosów
odpowiedź 23 maja 2017 przez Chess Szeryf (76,710 p.)

Nie wiem, czy dobrze zrozumiałem, ale może coś takiego:

int main()
{    int x;

    do{
        cin>>x;
        if(x==1){
            cout<<"wpisales niepoprawna liczbe, podaje jesz raz"<<endl;

        }else{
            cout<<"Koniec programu, wpisales prawidlowa liczbe inna od 1."<<endl;
        }


    } while(x==1);
}

 

Podobne pytania

0 głosów
1 odpowiedź 1,458 wizyt
pytanie zadane 10 lutego 2017 w PHP przez Kichu Nowicjusz (170 p.)
+1 głos
2 odpowiedzi 189 wizyt
0 głosów
1 odpowiedź 979 wizyt
pytanie zadane 16 marca 2020 w C i C++ przez Oxhoft Nowicjusz (150 p.)

93,194 zapytań

142,206 odpowiedzi

322,051 komentarzy

62,519 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 3053p. - dia-Chann
  2. 2998p. - Łukasz Piwowar
  3. 2993p. - Łukasz Eckert
  4. 2970p. - CC PL
  5. 2930p. - Tomasz Bielak
  6. 2907p. - Łukasz Siedlecki
  7. 2890p. - rucin93
  8. 2692p. - Adrian Wieprzkowicz
  9. 2645p. - Mikbac
  10. 2485p. - Marcin Putra
  11. 2461p. - Michał Telesz
  12. 2418p. - Michal Drewniak
  13. 2156p. - Anonim 3619784
  14. 1733p. - rafalszastok
  15. 1650p. - Mariusz Fornal
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...