Program do sprawdzenia, działa jednak nie do końca prawidłowo.

0

Witam,

Napisałem taki program

#include <iostream>
using namespace std;

bool spr (int a1)
{
    bool spr1 = cin.good();
    return spr1;
}
int main ()
{
    int a;
    cout<< "1)silnik \n2)okno\n3)kolo\n4)Koniec" << endl;
    do
    {
        do
        {
            cin.clear();
            cin.sync();
            cin >> a;
            spr (a);
        }while (spr == false );

        switch (a)
        {
            case 1:
                cout << "git"<<endl;
                break;
            case 2:
                cout << "przejebanE!"<<endl;
                break;
            case 3:
                cout << "buahahhaha"<<endl;
                break;
            case 4:
                cout<< "koniec!!!"<<endl;
                break;
            default:
                cout<< "zle dane !!   Podaj jeszcze raz !!!"<< endl;
                break;
        }
        if ( a == 4 )
            break;
    }while (1);

} 

Wszystko chodzi, jednak gdy w stumieniu wejścia wpisze zły znak np@, program idzie tak jakby dalej i wyświetla instrukcje "cout<< "zle dane !! Podaj jeszcze raz !!!"<< endl;" której nie powinien dlatego że pętla z strumieniem wejściowym powinna się wykonywać aż zostanie podane prawidłowe wartości zawarte w int, a funkcja spr zwróci true,

Niewiem zapewne czegoś niewiem lub do końca jak to działa więc na moją logikę powinno to być tak
złe dane -> jeszcze raz wczytuja i tak aż wczyta dobrą, i nie powinno wyświetlać tego bloku cout<< "zle dane !! Podaj jeszcze raz !!!"<< endl;

0

Zabezpieczenie przed wpisywaniem liter

bool spr (int a1)
{
    bool spr1 = cin.good();
    return spr1;
}

Co to jest w ogóle!?

0

nadal nie rozumie :-/ a to co zacytowales to sprawdzanie czy jest dobrze wpisane

0

cin.good() i to twoje spr - Jedna linijka tak czy tak przy użyciu

1

ale dlaczego moja metoda działa tak a nie inaczej ?

Metodę to masz w klasie, to co popełniłeś to funkcja.
A dlaczego działa tak, a nie inaczej?
Ano przyjrzyj jej się:
Masz jakiś parametr a1, który jest liczbą (a z którego i tak nie korzystasz) oraz zwracasz wynik cin.good() .
Wywołujesz ją w kodzie korzystając z spr (a);, ale nigdzie zwracanego wyniku nie zapisujesz.
Dalej masz while (spr == false );, czyli traktujesz tę funkcję, jakby była zmienną i robisz porównanie nie-wiadomo-czego z false.

0

hmm,
przerobiłem program i działa dobrze-wyrzyciłem tą moją nieszczęsną funkcje spr

#include <iostream>
using namespace std;


int main ()
{
    int a;
    bool spr;
    cout<< "1)silnik \n2)okno\n3)kolo\n4)Koniec" << endl;
    do
    {
        do
        {
            cin.clear();
            cin.sync();
            cin >> a;
            spr = cin.good();
            if (spr == false)
                cout << "NIE MA TAKIEJ OPCJI!   Wprowadz dane jeszcze raz!"<<endl;
        }while (spr == false );

        switch (a)
        {
            case 1:
                cout << "git"<<endl;
                break;
            case 2:
                cout << "przejebanE!"<<endl;
                break;
            case 3:
                cout << "buahahhaha"<<endl;
                break;
            case 4:
                cout<< "koniec!!!"<<endl;
                break;
            default:
                cout<< "zle dane !!   Podaj jeszcze raz !!!"<< endl;
                break;
        }
        if ( a == 4 )
            break;
    }while (1);

} 

A możecie mi powiedzieć jak napisać funkcje która bd użyteczna, przykładowo chciałbym ją wielokrotnie użyć i nie pisac za każdym razem tego samego tylko właśnie wklepać nazwe i jazda :)

0

A możecie mi powiedzieć jak napisać funkcje która bd użyteczna

Osobną funkcję możesz zrobić np.z tego:

        do
        {
            cin.clear();
            cin.sync();
            cin >> a;
            spr = cin.good();
            if (spr == false)
                cout << "NIE MA TAKIEJ OPCJI!   Wprowadz dane jeszcze raz!"<<endl;
        }while (spr == false );

A tę zmienną a zwracać poprzez jej wynik.

0

Jak menu będą ci się rozrastać to ma sens napisać coś uniwersalnego w stylu:

#include <iostream>
using namespace std;

struct Menu;
void submenu(const Menu*);
void crt(const Menu*) { cout<<"Create something"<<endl<<endl; }
void add(const Menu*) { cout<<"Add something"<<endl<<endl; }
void del(const Menu*) { cout<<"Delete something"<<endl<<endl; }
void rptvert(const Menu*) { cout<<"Show verticaly"<<endl<<endl; }
void rpthorz(const Menu*) { cout<<"Show horizontaly"<<endl<<endl; }
void load(const Menu*) { cout<<"Load from file"<<endl<<endl; }
void save(const Menu*) { cout<<"Save to file"<<endl<<endl; }

const struct Menu { const char *text; void (*fun)(const Menu*); const Menu *sub; }
  RptMenu[]=
    {
     {"Pionowo",rptvert},
     {"Poziomo",rpthorz},
     {"Wroc"},
    },
  MainMenu[]=
    {
     {"Nowy",crt},
     {"Dodaj",add},
     {"Usun",del},
     {"Pokaz (sub)",submenu,RptMenu},
     {"Wczytaj z pliku",load},
     {"Zapisz do pliku",save},
     {"Koniec"},
    }
  ;

void submenu(const Menu *menu)
  {
   cout<<endl;
   while(true)
     {
      cin.sync();
      unsigned n=0;
      const Menu *tmp=menu;
      while(tmp->fun) cout<<(++n)<<": "<<(tmp++)->text<<endl;
      cout<<"0: "<<tmp->text<<endl<<"wybor: ";
      unsigned m;
      if((cin>>m)&&(m<=n))
        {
         if(!m) break;
         const Menu *tmp=menu+m-1;
         tmp->fun(tmp->sub);
        }
      else
        {
         cin.clear();
         cout<<"Nie ma takiej opcji"<<endl<<endl;
        }
     }
   cout<<endl;
  }

int main()
  {
   submenu(MainMenu);
   return 0;
  }

Do każdej funkcji da się dorzucić dodatkowy parametr wskaźnik/referencje na obiekt.

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