Jak naprawić problem z błędnie działającą pętlą?

Odpowiedz Nowy wątek
2018-10-05 14:01
0

Mam problem. Chciałem napisać program rysujący dowolny prostokąt. Udało mi się ale teraz chcę napisać zabezpieczenie przed wpisywaniem błędnych danych.
Zabezpieczenie działa ale po wpisaniu złej wartości potem nie pokazuje jednej lini kodu. Program z czytuje poprawnie ale wyświetla źle.
screenshot-20181005140039.png

do
        {   
        cout << "Podaj szerokosc: ";cin>>a;
            while(!(cin>>a) || (a>100) || !(cin>>b) || (b>20))
            {
        cout << "Zle. ";
                cout << "\nPodaj szerokosc: ";cin>>a;
            if(cin.fail())
            {

            }
            else
            {  
        cout << "Podaj wysokosc: ";cin>>b;
        }
        cin.clear();
                cin.sync();
            }

        if((a<0) || (b<0) || (a==0) || (b==0) || (a>100) || (b>20))
        {
            cout << "Podales zle wymiary. Wartosci musza byc dodatnie. Ale nie wiecej niz 100x20. Sproboj jeszcze raz." << endl;
        }
        else
        {

        }

        }   while((a<0) || (b<0) || (a==0) || (b==0) || (a>100) || (b>20));

Tutaj jest cały kod

#include <iostream>
#include <windows.h>
using namespace std;
    int a,b,c,wolno,normalnie,szybko,x;
int main()
{
    cout << "Witaj w programie rysujacym prostokat.(Maksymalnie 100x20)" << endl;

       do
        {   cout << "Podaj szerokosc: ";cin>>a;
            while(!(cin>>a) || (a>100) || !(cin>>b) || (b>20))
            {cout << "Zle. ";
            cout << "\nPodaj szerokosc: ";cin>>a;
            if(cin.fail())
            {

            }
            else
            {  cout << "Podaj wysokosc: ";cin>>b;

            }

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

        if((a<0) || (b<0) || (a==0) || (b==0) || (a>100) || (b>20))
        {
            cout << "Podales zle wymiary. Wartosci musza byc dodatnie. Ale nie wiecej niz 100x20. Sproboj jeszcze raz." << endl;
        }
        else
        {

        }

        }   while((a<0) || (b<0) || (a==0) || (b==0) || (a>100) || (b>20));

    cout << "" << endl;
    wolno = 100;
    normalnie = 50;
    szybko = 10;

    for(int g=0;g<a;g++)
    {
        Sleep(50);
        cout << "*";
    }
    cout << "" << endl;
    for(int j=0;j<b-2;j++)
    {
        Sleep(50);
        for(int i=0;i<1;i++)
        {
            cout <<"*";
            Sleep(50);
            for(int k=0;k<a-2;k++)
            {
                cout <<" ";
                Sleep(50);
            }
            if(a>1)
            {
             cout <<"*";
            Sleep(50);
            }
            else
            {

            }

        }
            cout << "" << endl;
    }
    if(b>1)
    {
      for(int g=0;g<a;g++)
    {
        Sleep(50);
        cout << "*";
    }

    }
    else
    {

    }

    cout << "" << endl;
    cin.sync();
    cin.get();
    return 0;
}
edytowany 1x, ostatnio: Wezmir, 2018-10-05 14:04

Pozostało 580 znaków

2018-10-05 16:01
1

Hej - pytasz "Jak naprawić", więc spróbuję Ci podpowiedzieć. Sam sobie rzuciłeś kłody pod nogi wrzucając pętlę w pętle, w jeszcze jedną pętlę - zupełnie niepotrzebnie. Dodatkowo, puste ify i elsy - bardzo zaciemniają i nie wiadomo o co chodzi. Dobre formatowanie też bardzo pomaga przy czytaniu kodu. :)

Ogólnie - przede wszystkim, robisz coś takiego:

 cout << "Podaj szerokosc: ";
cin>>a;
while(!(cin>>a) 

Czyli oczekujesz wartości dwa razy - to Ci mocno psuje.

Postaraj się to jeszcze raz przeanalizować, uprościć. Wystarczy Ci jedna pętla do-while, słowo kluczowe continue i trzy ify.

A jak chcesz mojego (być może pokracznego, ale chyba działającego zgodnie z Twoimi oczekiwaniami) gotowca, to daj znać. :)

Pozostało 580 znaków

2018-10-05 16:07
0

Dzięki za pomoc. Odezwę się na pw bo rozumiem o co ci chodzi ale tak nie do końca.

Pozostało 580 znaków

2018-10-05 16:25

Do calkowitego wyczyszczenia buffora używaj:

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

Jeśli widzisz mój błąd to mnie popraw.
Pisanie błędnych wypowiedzi utrwala złe praktyki.
Kiedyś możesz dostać do ręki mój kod.

Pozostało 580 znaków

2018-10-05 17:53
1
  • Podziel program na funkcje. Będzie łatwiej i dla Ciebie i dla czytających:
  • Rysowanie możesz zredukować do jednej pętli jeśli odpowiednio spreparujesz stringi.
  • Zamiast windowsowego Sleep lepiej użyć std::this_thread::sleep_for z <thread>

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0