• 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(;;)

Object Storage Arubacloud
0 głosów
710 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 791 wizyt
pytanie zadane 8 października 2019 w C i C++ przez rel Początkujący (340 p.)
0 głosów
1 odpowiedź 516 wizyt
pytanie zadane 29 października 2020 w Java przez stronek1899 Nowicjusz (160 p.)
+2 głosów
2 odpowiedzi 283 wizyt
pytanie zadane 25 kwietnia 2022 w Java przez cfaniaczek Nowicjusz (200 p.)

92,555 zapytań

141,404 odpowiedzi

319,557 komentarzy

61,940 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...