Program wczytywanie danych

0
 #include <iostream>

using namespace std;

class Przyjmowanie_zamowien
{
    string danie;
    int czas_przygotowania;
    int cena;
public:
    Przyjmowanie_zamowien(string nazwa="brak", int czas=0, int koszt=0)
        :danie(nazwa), czas_przygotowania(czas), cena(koszt) {}
    // Przyjmowanie_zamowien & operator=(Przyjmowanie_zamowien &);
    friend ostream & operator << (ostream & ekran, Przyjmowanie_zamowien &p);
    friend  istream & operator >>(istream & ekran, Przyjmowanie_zamowien &p);




};
/*Przyjmowanie_zamowien & Przyjmowanie_zamowien::operator=(Przyjmowanie_zamowien &)
{}*/

ostream & operator <<(ostream & ekran, Przyjmowanie_zamowien &p)
{
    ekran << "Nazwa dania " <<p.danie <<" czas przygotowania "
          <<p.czas_przygotowania << " jego cena: " << p.czas_przygotowania;
    return ekran;

}

istream & operator >>(istream & ekran, Przyjmowanie_zamowien &p)
{
    ekran >> p.danie>>p.cena>> p.czas_przygotowania;
    return ekran;

}

int main()
{

    int a =1;
    int i =0;

    
    while(a >0)
    {


        Przyjmowanie_zamowien *k;
        Przyjmowanie_zamowien *pom;
        string pom_nazwa ="brak";
        int pom_czas, pom_cena;
        blad:


        cout <<"\n\nAby zamknac program nacisnij 9\n"
             "Aby wczytac dane nacisnij 1: \n"
             "Aby odczytac dane nacisnij 2"<<endl;
        cin >> a;
        if( a != 9 && a != 1 && a != 2)
        {
            a=1;
            cout <<"Wybrałes zla opcje";
            goto blad;
        }

        // WCZYTYWANIE DANYCH
        if(a == 1)
        {
            cout <<"Podaj Nazwe Dania, czas i cene ";
          
            pom = new Przyjmowanie_zamowien[i+1];

            if(i==0)
                k = new Przyjmowanie_zamowien[i+1];
            if(i >=1)
            {
                for(int j=0; j<i; j++)
                {
                    pom[j]=k[j];
                    
                }
            }

            i++;
            delete [] k;
            k = new Przyjmowanie_zamowien[i];

            for(int j=0; j<i; j++)
            {
                k[j]=pom[j];
            }


            cin >> k[i-1];

            delete [] pom;

        }

        
        // ODCZYTYWANIE
        if(a == 2)
        {
            for(int j=0; j<i; j++)
                cout << k[j] <<endl;

        }
        
        
        // KONIEC PROGRAMU
        if(a == 9)
        {
            break;
        }






    }
    return 0;
}



Witam,
Wyżej podałem kod aplikacji. Bawię się trochę programowaniem i tworze aplikacje czysto edukacyjne. Mam taki problem. Mam menu i proszę użytkownika o podanie
1: w celu wczytania danych
2: w celu odczytu danych
9: w celu wyłączenia aplikacji
Aplikacja wysypuje się kiedy użytkownik poda literę zamiast liczby. Proszę o pomoc jak obejść kiedy użytkownik poda literę żeby program upomniał użytkownika o błędzie danych. Jaki warunek stworzyć.
Pozdrowienia.

2

Spróbuj użyć getline w pętli while, przy okazji pozbędziesz się tego kłującego w oczy goto, którego nie powinno się w ogóle używać w programowaniu.

string line; 
while( getline( cin, line ) && line != "1" && line != "2" && line != "9" )
 {
        cout << "Wybrałes zla opcje" << endl;
 }
0
if(cin >> a)
{
   cout<<"Wybrano opcje "<<a<<endl;
   while(cin.get()!='\n\) {} // wywalamy resztę z bufora klawiatury
}
else
{
   cin.clear(); // czyścimy flagi
   while(cin.get()!='\n\) {} // wywalamy resztę z bufora klawiatury
   cerr<<"Miałeś podać liczbę"<<endl;
}
0
#include <iostream>
#include <vector>

using namespace std;

class Przyjmowanie_zamowien
{
    string danie;
    int czas_przygotowania;
    int cena;
public:
    Przyjmowanie_zamowien(string nazwa="brak", int czas=0, int koszt=0)
        :danie(nazwa), czas_przygotowania(czas), cena(koszt) {}
    // Przyjmowanie_zamowien & operator=(Przyjmowanie_zamowien &);
    friend ostream & operator << (ostream & ekran, Przyjmowanie_zamowien &p);
    friend  istream & operator >>(istream & ekran, Przyjmowanie_zamowien &p);




};
/*Przyjmowanie_zamowien & Przyjmowanie_zamowien::operator=(Przyjmowanie_zamowien &)
{}*/

ostream & operator <<(ostream & ekran, Przyjmowanie_zamowien &p)
{
    ekran << "Nazwa dania " <<p.danie <<" czas przygotowania "
          <<p.czas_przygotowania << " jego cena: " << p.cena<<endl<<endl;
    return ekran;

}

istream & operator >>(istream & ekran, Przyjmowanie_zamowien &p)
{
    int b =1;
    while( b!=0)
    {
        cout <<"Podaj nazwe dania, czas i koszt"<<endl;
        if(ekran >> p.danie>>p.cena>> p.czas_przygotowania)
        {
            return ekran;

        }
        else
        {
            ekran.clear();
            while(ekran.get()!='\n') {}
            cerr <<"Podales niepoprawne dane"<<endl;
            b=1;

        }
    }


}

int main()
{
    Przyjmowanie_zamowien przyjecie;


    vector<Przyjmowanie_zamowien> MyVector;
    vector<Przyjmowanie_zamowien>::iterator pos = MyVector.begin();
//    MyVector.push_back("kielba",1, 3);



    int a=5;
    while( a != 0)
    {
        cout <<"Wczytanie danych 1"<<endl;
        cout <<"Wypisanie dancyh 2" <<endl;
        cout << "Zamkniecie aplikacji 0" <<endl;

        if(cin >>a)
        {


            if(a == 1)
            {
                cin >>przyjecie;
                MyVector.push_back(przyjecie);
            }
            if(a == 2)
            {
                for(int i=0; i< MyVector.size(); i++ )
                {
                    cout << MyVector[i];
                }
            }

        }
        else
        {
            cin.clear();
            while(cin.get() !='\n') {}
            a=5;
            cerr <<"Podales nie poprawne dane" <<endl;
        }
    }

    return 0;
}

Dziękuję bardzo za cenne informacje. Przerobiłem mój program i teraz nie wywala błędów.
Jeśli można coś zrobić lepiej proszę bardzo o opinie. Pozdrowienia ;)

0
#include <iostream>
#include <vector>

using namespace std;

class Przyjmowanie_zamowien
{
    string danie;
    int czas_przygotowania;
    int cena;
public:
    Przyjmowanie_zamowien(string nazwa="brak", int czas=0, int koszt=0)
        :danie(nazwa), czas_przygotowania(czas), cena(koszt) {}
    // Przyjmowanie_zamowien & operator=(Przyjmowanie_zamowien &);
    friend ostream & operator << (ostream & ekran, Przyjmowanie_zamowien &p);
    friend  istream & operator >>(istream & ekran, Przyjmowanie_zamowien &p);




};
/*Przyjmowanie_zamowien & Przyjmowanie_zamowien::operator=(Przyjmowanie_zamowien &)
{}*/

class Interfejs
{
    Przyjmowanie_zamowien wsk;
    vector<Przyjmowanie_zamowien> MyVector;
    int a;
public:
    void Dodaj_element();
    void Wyswietl_Tablice();
    Interfejs(): a(5)
    {


        while( a != 0)
        {
            cout <<"Wczytanie danych 1"<<endl;
            cout <<"Wypisanie dancyh 2" <<endl;
            cout << "Zamkniecie aplikacji 0" <<endl;

            if(cin >>a)
            {
                switch(a)
                {
                case 1:
                    Dodaj_element();
                    break;
                case 2:
                    Wyswietl_Tablice();

                    break;
                case 0:
                    cout <<"Zamykamy...";
                    break;
                default:
                    cout <<"Nie znam takiego numeru";
                    break;
                }
            }
            else
            {
                cin.clear();
                while(cin.get() !='\n') {}
                a=5;
                cerr <<"Podales nie poprawne dane" <<endl;
            }

        }
    }




};

void Interfejs::Dodaj_element()
{
    cin >>wsk;
    MyVector.push_back(wsk);
}

void Interfejs::Wyswietl_Tablice()
{
    for(int i=0; i< MyVector.size(); i++ )
    {
        cout << MyVector[i];
    }

}
ostream & operator <<(ostream & ekran, Przyjmowanie_zamowien &p)
{
    ekran << "Nazwa dania " <<p.danie <<" czas przygotowania "
          <<p.czas_przygotowania << " jego cena: " << p.cena<<endl<<endl;
    return ekran;

}

istream & operator >>(istream & ekran, Przyjmowanie_zamowien &p)
{
    int b =1;
    while( b!=0)
    {
        cout <<"Podaj nazwe dania, czas i koszt"<<endl;
        if(ekran >> p.danie>>p.cena>> p.czas_przygotowania)
        {
            return ekran;

        }
        else
        {
            ekran.clear();
            while(ekran.get()!='\n') {}
            cerr <<"Podales niepoprawne dane"<<endl;
            b=1;

        }
    }


}

int main()

{
    Interfejs p;


    return 0;
}

Witam kolejna wersja poprawiona. Co sądzicie ?

0

Kilka spostrzeżeń dotyczących kodu:

  • przenieś główną logikę programu znajdującą się w pętli while z konstruktora Interfejs do osobnej funkcji składowej tej klasy np. Uruchom.
    Stąd też w main() po utworzeniu obiektu Interfejs trzeba będzie dodać p.Uruchom();
  • przesuń definicje zmiennych a oraz wsk w miejsce gdzie będą rzeczywiście używane i nadaj im nazwy, które coś będą znaczyły.
0

Dziękuję wszystkim bardzo za trafna krytykę ;) Będę miał chwilę czasu to zmodyfikuję program i zobaczymy co powiecie. Pozdrowienia

0
_13th_Dragon napisał(a):

https://4programmers.net/Forum/C_i_C++/244988-ponowny_wybor_opcji_instrukcja_switch?p=1100492#id1100492

Analizowałem twój podany kod i nie mogę zrozumieć pewnej kwestii. Skopiowałem kawałek kodu i go za komentuję.
Jak masz chwilę i możesz mi wytłumaczyć, będę wdzięczny.

if((ret==1)&&(w<nr))
        {
         tmp=menu+(w+nr-1)%nr;   // nie rozumiem tego
         
         if(tmp->menu)
           {
            printf("\n");
            RunMenu(tmp->text,tmp->menu,sd);
           }
         else if(tmp->exec)
           {
            printf("\n");
            tmp->exec(sd,tmp->opt);
           }
         else break;
        }
0
foczka669 napisał(a):
         tmp=menu+(w+nr-1)%nr;   // nie rozumiem tego

w - wybrany numer przez użytkownika 1,2,3 ... 0
natomiast w menu numeracja 0,1,2,3 ...

(0+nr-1)%nr == nr-1 // ostatni numer w menu, czyli koniec
(1+nr-1)%nr == 0
(2+nr-1)%nr == 1
(3+nr-1)%nr == 2
...
menu+x == &menu[x]

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