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

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;
}

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ć. :)

0

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

1

Do calkowitego wyczyszczenia buffora używaj:

std::cin.clear();
std::cin.ignore(std::numeric_limits<size_t>::max(), '\n');
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>

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