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

Nie wiem co zrobić, aby program jeszcze raz zapytał o źle wpisaną zmienną

0 głosów
692 wizyt
pytanie zadane 20 września 2015 w C i C++ przez Quiku Obywatel (1,370 p.)

Witajcie, 
Na wstępie chciałbym się przywitać, jestem tu nowy, zacząłem uczyć się C++ z kursu Mirosława na YT.
Aktualnie jestem przy 5 odcinku, i napotkałem mały problem. 
Program który piszę, ma za zadanie obliczyć średnią z 5 ocen. Chciałem jednak go udoskonalić, jakoś poszerzyć umiejętności, chcę żeby po wpisaniu liczby która nie jest oceną (0, 7 itp.) program wypisał na ekranie że liczba jest zła, po czym poprosił o ponowne jej wprowadzenie. Nie wiem jednak jak to zrobić. 

Moje wypociny:
 

#include <iostream>
#include <windows.h>

using namespace std;

float oceny[5];
int main()
{
    cout << "Program do obliczania sredniej z 5 ocen." << endl;
    Sleep(1000);

 for(int i=0; i<5; i++)
 {
    cout <<"Podaj " <<i+1 <<" ocene:" <<endl;
    cin >>oceny[i];
    Sleep(1000);

    if(oceny[i] < 1 )
       {
         cout <<"Podales za mala ocene!"  <<endl;
       }
    else if(oceny[i] > 6)

        {
            cout <<"Podales za duza ocene!" <<endl;
        }
}
    cout <<(oceny[0]+oceny[1]+oceny[2]+oceny[3]+oceny[4])/5 <<endl;
return 0;
}


Proszę o grzeczność, wiem że prawdopodobnie napisałem coś źle albo bardzo okrężnie, ale jestem żółtodziobem. 

 

5 odpowiedzi

+1 głos
odpowiedź 20 września 2015 przez Patrycjerz Mędrzec (192,320 p.)

Użyj continue:

#include <iostream>
#include <windows.h>
 
using namespace std;
 
float oceny[5];
int main()
{
    cout << "Program do obliczania sredniej z 5 ocen." << endl;
    Sleep(1000);
 
 for(int i=0; i<5; i++)
 {
    cout <<"Podaj " <<i+1 <<" ocene:" <<endl;
    cin >>oceny[i];
    Sleep(1000);
 
    if(oceny[i] < 1 )
       {
         cout <<"Podales za mala ocene!"  <<endl;
         i--;
	     continue;
       }
    else if(oceny[i] > 6)
 
        {
            cout <<"Podales za duza ocene!" <<endl;
            i--;
	        continue;
        }
}
    cout <<(oceny[0]+oceny[1]+oceny[2]+oceny[3]+oceny[4])/5 <<endl;
return 0;
}

Umożliwia on przeskoczenie wszystkich poleceń za nim i przejście na początek pętli, w której jest wywołany.

komentarz 20 września 2015 przez Quiku Obywatel (1,370 p.)
Dziękuję, teraz program działa dokładnie tak jak chciałem :)
+1 głos
odpowiedź 20 września 2015 przez NoName Mądrala (5,640 p.)

no wszystko super ;) tylko musisz pobrać tą ocenę jeszcze raz skoro jest nie prawidłowa ;)

 

if(oceny[i] < 1 )
       {
         cout <<"Podales za mala ocene!"  <<endl;
cin>>oceny[i];
       }
    else if(oceny[i] > 6)
 
        {
            cout <<"Podales za duza ocene!" <<endl;
cin>>oceny[i];
        }

i już ;) to Ci sprawdzi warunek tylko raz

jeśli chcesz cały czas sprawdzać poprawność to zrób pętle while  w stylu

while(oceny[i]<1 && oceny[i]>6)
{
cout<<"zla ocena, podaj jeszcze raz"<<endl;
cin>>oceny[i];
}

 

komentarz 20 września 2015 przez Quiku Obywatel (1,370 p.)
Co do tego to muszę rozgryść jeszcze :D Ta pętla ma być zamiast mojej FOR, tak?
komentarz 20 września 2015 przez NoName Mądrala (5,640 p.)
w forze, ale już chyba zauważyłeś na dole ;)
+1 głos
odpowiedź 20 września 2015 przez baszmest Gaduła (3,080 p.)
edycja 21 września 2015 przez baszmest

Myśle, że mógłbys użyć pętli while (wewnątrz tej pętli for). W tej pętli while zakodowane byłoby podawanie oceny i sprawdzanie, czy jest poprawna. Warunkiem konczącym pętle podawania oceny mogło by być np.

while (ocena[i] <1 || ocena[i] >6)
{
 //kod
}

 

komentarz 20 września 2015 przez baszmest Gaduła (3,080 p.)

eh, spóźniłem się wink

komentarz 20 września 2015 przez Quiku Obywatel (1,370 p.)
Ale przynajmniej wiem że WHILE ma być w FOR :D Sprawdzę to, zrobię w ten sposób co mówiliście, nie zaszkodzi mi więcej wiedzy
+1 głos
odpowiedź 20 września 2015 przez Waszek Gaduła (4,130 p.)

Według mnie, najfajniejszym sposobem jest wykorzystanie pętli do while. Dzięki temu, nie będziesz musiał wczytywać raz sam oceny :)

do {
cout << "Podaj ocenę: ";
cin >> oceny[i];
} while (oceny[i] < 1 || oceny[i] > 6);

Przeanalizuj to sobie na spokojnie. Pamiętaj, że ta pętla wykonuje się przynajmniej raz :)

komentarz 20 września 2015 przez Quiku Obywatel (1,370 p.)

Wykonuje się min raz, bo najpierw się wykonuje, a później sprawdza warunek ;) Pamiętam. 
Zrobiłem to tak jak napisałeś, 

 

#include <iostream>
#include <windows.h>

using namespace std;

float oceny[5];
int i;
int main()
{
    cout << "Program do obliczania sredniej z 5 ocen." << endl;
    Sleep(1000);

 for(int i=0; i<5; i++)
{
 do {
cout << "Podaj ocenę: ";
cin >> oceny[i];
} while (oceny[i] < 1 || oceny[i] > 6);
}
    cout <<(oceny[0]+oceny[1]+oceny[2]+oceny[3]+oceny[4])/5 <<endl;
return 0;
}

Ale teraz mam mętlik w głowie. Program działa, kiedy wpiszę złą liczbę to pyta jeszcze raz, ale nie zwraca mi uwagi. Gdzie w tej wersji programu mam wrzucić frazę "zła liczba"?

komentarz 21 września 2015 przez baszmest Gaduła (3,080 p.)

w petli do while, zaraz po cin>>oceny[i] uzyj if, aby sprawdzic warunek i wypisac odpowiedni komunikat

komentarz 21 września 2015 przez Quiku Obywatel (1,370 p.)
Perfekto! Zrobiłem ten program na 3 sposoby, i teraz każdy działa :)
0 głosów
odpowiedź 21 września 2015 przez Quiku Obywatel (1,370 p.)

Dziękuję wszystkim za pomoc :D W końcu doszedłem do tego co chciałem, program sumuje poprawnie wpisane zmienne, i wynik to suma/5 a nie (oceny[1] +oceny[2]...) /5. Umieszczam kod, dla potomnych.

#include <iostream>
#include <windows.h>

using namespace std;

float oceny[5], suma=0;
int main()
{
cout << "Program do obliczania sredniej z 5 ocen." << endl;
Sleep(1000);

    for(int i=0; i<5; i++)
{
cout <<"Podaj " <<i+1 <<" ocene:" <<endl;
cin >>oceny[i];
Sleep(1000);

    if(oceny[i] < 1 )
{
cout <<"Podales za mala ocene!"  <<endl;
cout <<"Podaj " <<i+1 <<" ocene:" <<endl;
cin >>oceny[i];
suma = suma + oceny[i];
cout <<"Suma to " <<suma <<endl;
}
   else if(oceny[i] > 6)
{
cout <<"Podales za duza ocene!" <<endl;
cout <<"Podaj " <<i+1 <<" ocene:" <<endl;
cin >>oceny[i];
suma = suma + oceny[i];
cout <<"Suma to " <<suma <<endl;
}
    else
{
suma = suma + oceny[i];
cout <<"Suma to " <<suma <<endl;
}

}
cout <<"Srednia to " <<suma/5 <<endl;
return 0;
}

 

komentarz 21 września 2015 przez Patrycjerz Mędrzec (192,320 p.)

OK, ale ten program nie ma nadal zabezpieczenia przed wielokrotnym wprowadzeniem złej wartości. Użyj pętli do while w pętli for, lub, jak ja pisałem, continue.

Podobne pytania

+1 głos
2 odpowiedzi 329 wizyt
pytanie zadane 27 sierpnia 2015 w C i C++ przez niezalogowany
+1 głos
0 odpowiedzi 600 wizyt
0 głosów
1 odpowiedź 170 wizyt

93,425 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 pasjonatów

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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...