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

Proste zadanie ze średnią i pętlą for(;;)

Aruba Cloud - Virtual Private Server VPS
0 głosów
1,050 wizyt
pytanie zadane 14 września 2019 w C i C++ przez Filip Rerek Nowicjusz (190 p.)

Cześć! Robię zadanie ze średnią - 5. odc kursu Pana Mirosława Zelenta. Postanowiłem je trochę rozszerzyć - mianowicie niech program przerwie liczenie i pojawi się stosowny komunikat, kiedy pojawi się ocena większa, niż 6, bo przecież nie można takiej otrzymać. Jednak ma dać użytkownikowi drugą szansę na wprowadzenie tej cyfry:

1) albo od początku, kasując wszystkie inne cyfry - jednak mój program wyświetla komunikat, że cyfra jest większa i liczy dalej

2) albo tylko w tej linijce, w której został popełniony błąd (cyfra większa niż 6), ale to już kompletnie nie wiem, czy to jest możliwe 

Postanowiłem wykorzystać do tego pętlę for(;;), jednak coś jest nie tak. Może to kwestia tablic? I tego, że "i" się inkrementuje, przez co program liczy dalej?

#include <iostream>
#include <cstdlib>

using namespace std;

float oceny[5], srednia, suma;

int main()

{
    for(;;)

   {
       for(int i=1; i<=5; i++)

       {
           cout<<"Wprowadz "<<i<<". cyfre: ";
           cin>>oceny[i];

           suma=suma+oceny[i]; //suma+=oceny[i];
           srednia=suma/5;


       if (oceny[i]>6)

       {
           cout<<"Ocena nie moze byc wyzsza, niz '6', sprobuj ponownie."<<endl;
       }}

       cout<<endl<<"Suma ocen wynosi: "<<suma<<endl;
       cout<<"Srednia ocen wynosi: "<<srednia<<endl;
       exit(0);
   }

    return 0;
}

 

Dzięki za każdą odpowiedź, pozdro!

2 odpowiedzi

+1 głos
odpowiedź 14 września 2019 przez Inn Gaduła (4,300 p.)
wybrane 17 września 2019 przez Filip Rerek
 
Najlepsza

mianowicie niech program przerwie liczenie i pojawi się stosowny komunikat, kiedy pojawi się ocena większa, niż 6, bo przecież nie można takiej otrzymać.

 Zazwyczaj taki efekt uzyskujemy za pomocą pętli while.

while( oceny[i] > 6 )
{
   cout << "Ocena nie moze byc wyzsza, niz '6'" << endl;
   cout << "Wprowadz " << i << ". cyfre: ";
                   
   cin >> oceny[i];
}

 

 

 

komentarz 16 września 2019 przez Filip Rerek Nowicjusz (190 p.)

Wszystko wydaje się ok, ale niestety po zliczeniu sumy okazuje się, że program nie bierze w ogóle wprowadzonej korekty - zapamiętana zostaje i tak niepoprawna, przekraczająca '6' cyfra. Próbowałem zmienić na (i+1) lub (i-1), lecz wtedy wszystko się zapętla i nie kończy.

#include <iostream>
#include <cstdlib>

using namespace std;

float oceny[5], srednia, suma=0;

int main()
{

    for (int i=1; i<=5; i++)

    {
        cout<<"Wpisz "<<i<<". ocene: ";
        cin>>oceny[i];


    suma+=oceny[i];
    srednia=suma/5;

    while(oceny[i]>6)

    {
        cout<<"Ocena nie moze byc wyzsza niz '6'. Wpisz ponownie "<<i<<". ocene: ";
        cin>>oceny[i];
    }

    }

    cout<<endl<<"Suma ocen wynosi: "<<suma<<endl;
    cout<<"Srednia ocen wynosi: "<<srednia<<endl;
    exit(0);

    return 0;
}

 

Kiedy zamiast:

while(oceny[i]>6)

    {
        cout<<"Ocena nie moze byc wyzsza niz '6'. Wpisz ponownie "<<i<<". ocene: ";
        cin>>oceny[i];
    }

 

Napiszę:

 

while(oceny[i]>6)

    {
        cout<<"Ocena nie moze byc wyzsza niz '6'. Wpisz ponownie "<<i<<". ocene: ";
        cin>>oceny[i+1];
    }

 program się sypie. 

 

Jakieś pomysły, jak zrobić, żeby program zapamiętał wprowadzaną korektę?

komentarz 16 września 2019 przez Inn Gaduła (4,300 p.)
edycja 16 września 2019 przez Inn
suma+=oceny[i];
srednia=suma/5;

daj to po pętli while.

W twoim kodzie przed sprawdzaniem czy liczba jest mniejsza od 7 liczysz sume.

komentarz 16 września 2019 przez Filip Rerek Nowicjusz (190 p.)
#include <iostream>
#include <cstdlib>

using namespace std;

float oceny[5], srednia, suma;

int main()
{

    //for(;;)

    {for (int i=0; i<=4; i++)

    {
        cout<<"Wpisz "<<i+1<<". ocene: ";
        cin>>oceny[i];

    while(oceny[i]>6)

    {
        cout<<"Ocena nie moze byc wyzsza niz '6'. Wpisz ponownie "<<i+1<<". ocene: ";
        cin>>oceny[i];

        suma+=oceny[i];
        srednia=suma/5;
    }

    }

    cout<<endl<<"Suma ocen wynosi: "<<suma<<endl;
    cout<<"Srednia ocen wynosi: "<<srednia<<endl;
    exit(0);}

    return 0;
}

 

Tak już próbowałem, ale zauważyłem, że wtedy podlicza TYLKO to, co zostało wprowadzone jako korekta, zamiast cyfry większej od '6'.

komentarz 16 września 2019 przez Inn Gaduła (4,300 p.)
#include <iostream>
#include <cstdlib>

using namespace std;

float oceny[5], srednia, suma=0;

int main()
{

    for (int i=1; i<=5; i++)

    {
        cout<<"Wpisz "<<i<<". ocene: ";
        cin>>oceny[i];



        while(oceny[i]>6)

        {
            cout<<"Ocena nie moze byc wyzsza niz '6'. Wpisz ponownie "<<i<<". ocene: ";
            cin>>oceny[i];
        }

        suma+=oceny[i];
        srednia=suma/5;

    }

    cout<<endl<<"Suma ocen wynosi: "<<suma<<endl;
    cout<<"Srednia ocen wynosi: "<<srednia<<endl;
    exit(0);

    return 0;
}

Spróbuj w ten sposób.

komentarz 16 września 2019 przez Filip Rerek Nowicjusz (190 p.)
Zauważyłem, że w wypadku, kiedy umieszczamy działania wewnątrz pętli while, nie ma znaczenia, czy jest [i] czy [i+1]; zawsze liczy TYLKO wprowadzoną korektę jako sumę. Wydaje mi się, że działania nie mogą być w pętli while. Będę kombinował inaczej :P
komentarz 16 września 2019 przez Inn Gaduła (4,300 p.)
Co jest nie tak w powyższym kodzie? podaj dane testowe dla których coś nie pasuje a postaram Ci pomóc, na ten moment nie wiem zbytnio o co chodzi.
komentarz 17 września 2019 przez Inn Gaduła (4,300 p.)
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{

    double Oceny[5];
    double Suma = 0;

    for(int i = 0; i < 5; i++)
    {
        cout<< "Wpisz " << i+1 <<". ocene: ";
        cin >> Oceny[i];

        while ( Oceny[i] > 6 )
        {
            cout << "Ocena nie moze byc wyzsza niz '6'. Wpisz ponownie " << i << ". ocene: ";
            cin >> Oceny[i];
        }

        Suma = Suma + Oceny[i];
    }

    cout << endl << "Suma ocen wynosi: " << Suma << endl;
    cout << "Srednia ocen wynosi: " << Suma/5 <<endl;

    return 0;
}

Masz tutaj mój kod, zauważyłem też, że twoja pętla for zaczyna się od 1 a przypominam, że indeksy tablicy zaczynamy od 0.

komentarz 17 września 2019 przez Filip Rerek Nowicjusz (190 p.)

Po prostu obliczenia musza być PO pętli while, a nie W pętli while :) wszystko mam! W Twoim jest jeden błąd, zamiast:

    while(oceny[i]>6)

    {
        cout<<"Ocena nie moze byc wyzsza niz '6'. Wpisz ponownie "<<i<<" ocene: ";
        cin>>oceny[i];
    }

    suma+=oceny[i];
    srednia=suma/5;

    }

powinno być:

    while(oceny[i]>6)

    {
        cout<<"Ocena nie moze byc wyzsza niz '6'. Wpisz ponownie "<<i+1<<" ocene: ";
        cin>>oceny[i];
    }

    suma+=oceny[i];
    srednia=suma/5;

    }

teraz wyświetla i liczy tak, jak powinno :D

 

Dzięki, trzymaj się!

 

Cały kod:

#include <iostream>
#include <cstdlib>

using namespace std;

float oceny[5], srednia, suma;

int main()
{

    for (int i=0; i<5; i++)

    {
        cout<<"Wpisz "<<i+1<<". ocene: ";
        cin>>oceny[i];

    while(oceny[i]>6)

    {
        cout<<"Ocena nie moze byc wyzsza niz '6'. Wpisz ponownie "<<i+1<<" ocene: ";
        cin>>oceny[i];
    }

    suma+=oceny[i];
    srednia=suma/5;

    }

    cout<<endl<<"Suma ocen wynosi: "<<suma<<endl;
    cout<<"Srednia ocen wynosi: "<<srednia<<endl;

    return 0;
}

 

0 głosów
odpowiedź 14 września 2019 przez MsMaciek123 Pasjonat (24,760 p.)
Gdy użytkownik wpisze złą ocenę, zmniejsz i o 1

i--;

Przed exit(0); zresetuj sumę, suma=0;
komentarz 14 września 2019 przez DragonCoder Nałogowiec (36,500 p.)
A cala reszta?

Zmienne globalne, przestrzen nazw, petla nieskonczona, zamiast while z warunkiem, wtedy uniknie się tez exit(0). Tablice i strumienie tez bym wyczyscil na wszelki wypadek
komentarz 14 września 2019 przez MsMaciek123 Pasjonat (24,760 p.)
On nie prosił o porady, a zaraz mnie zwyzywa, po co to mówię.
komentarz 16 września 2019 przez Filip Rerek Nowicjusz (190 p.)

@MsMaciek123, jeżeli wyzeruję sumę, to nie podliczy w ogóle wprowadzonej korekty, tylko cyfry wpisane za 1. razem. 

 

#include <iostream>
#include <cstdlib>

using namespace std;

float oceny[5], srednia, suma=0;

int main()
{

    for(;;)

    {for (int i=0; i<=4; i++)

    {
        cout<<"Wpisz "<<i+1<<". ocene: ";
        cin>>oceny[i];


    suma+=oceny[i];
    srednia=suma/5;

    if(oceny[i]>6)

    {
        cout<<"Ocena nie moze byc wyzsza niz '6'. Wpisz ponownie "<<i+1<<". ocene: ";
        cin>>oceny[i-1];
        suma=0;
    }

    }

    cout<<endl<<"Suma ocen wynosi: "<<suma<<endl;
    cout<<"Srednia ocen wynosi: "<<srednia<<endl;
    exit(0);}

    return 0;
}

 

Podobne pytania

0 głosów
2 odpowiedzi 1,015 wizyt
pytanie zadane 8 października 2019 w C i C++ przez rel Początkujący (340 p.)
0 głosów
1 odpowiedź 846 wizyt
pytanie zadane 29 października 2020 w Java przez stronek1899 Nowicjusz (160 p.)
+2 głosów
2 odpowiedzi 555 wizyt
pytanie zadane 25 kwietnia 2022 w Java przez cfaniaczek Nowicjusz (200 p.)

93,326 zapytań

142,323 odpowiedzi

322,391 komentarzy

62,655 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...