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

Różne wyniki w pętli i poza nią

Object Storage Arubacloud
0 głosów
148 wizyt
pytanie zadane 14 maja 2019 w C i C++ przez mozartcpp Nowicjusz (140 p.)
edycja 14 maja 2019 przez mozartcpp

Witam serdecznie

Mam następujący problem mam różne wyniki poza pętlą i w pętli. Jest jeszcze problemem że liczby poza pętlą są bardzo niewymierne. Nie wiem gdzie leży błąd. Będę bardzo wdzięczny jak ktoś mnie naprowadzi gdzie szukać rozwiązania, albo pomoże rozwiązać.

Program ma liczyć średnią z uwzględnieniem ects, "srednia" itp miało mi pomóc znaleźć rozwiązanie, wszakże coś nie wyszło.

#include <iostream>
#include <fstream>

struct oceny
{
    std::string subject;
    float ocena[20];
    float ects[20];
    int i=0;
    float suma_ocen = 0;
    float suma_ects = 0;
    float srednia;
};
int main()
{   oceny studia;
    std::cout << "Jesli chcesz zakonczyc napisz: koniec" << std::endl;

    while (studia.subject != "koniec")
    {
    std::cout << "Nazwa przedmiotu: " << std::endl;
    std::cin >> studia.subject;
    std::cin.get();


    if (studia.subject != "koniec")
    {
        std::cout << "Podaj ocene: " << std::endl;
        std::cin >> studia.ocena[studia.i];
        std::cout << "Ilosc ecetesow: " << std::endl;
        std::cin >> studia.ects[studia.i];
    }

    else
        {
            std::cout << "Koniec wpisywania" << std::endl;

        };


    studia.suma_ocen += studia.ocena[studia.i]*studia.ects[studia.i];
    studia.suma_ects += studia.ects[studia.i];
    std::cout << "suma ocen petla " <<  studia.suma_ocen << std::endl;

    studia.i ++;
    }; 

    studia.srednia = studia.suma_ocen / studia.suma_ects;
    std::cout << "srednia " << studia.srednia << std::endl;
    std::cout << "suma ects " <<   studia.suma_ects << std::endl;
    std::cout << "ilosc przedmitow: " <<  studia.i << std::endl;


    return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 14 maja 2019 przez Szfierzak Gaduła (3,750 p.)
edycja 14 maja 2019 przez Szfierzak

Zwróć uwagę, że fragment kodu:

    studia.suma_ocen += studia.ocena[studia.i]*studia.ects[studia.i];
    studia.suma_ects += studia.ects[studia.i];
    std::cout << "suma ocen petla " <<  studia.suma_ocen << std::endl;
 
    studia.i++;

wykona się nawet po wpisaniu "koniec". Jakie są wartości w studia.ocena[studia.i] oraz  studia.ects[studia.i] w momencie kiedy ktoś wpisze "koniec"? Dodajesz jakieś śmieci, bo nie przypisałeś wartości do tych pól tablicy.  

komentarz 15 maja 2019 przez mozartcpp Nowicjusz (140 p.)

Bardzo dziękuję, w weekend jeszcze raz nad tym przysiądę i pomyślę jak z tego wybrnąć. Jeszcze tylko dopytam, "jakieś śmieci" to masz na myśli to co nie ma przypisanej wartości jak wpiszę "koniec" -  studia.ocena[studia.i] oraz  studia.ects[studia.i] ? Czy wstawienie tam if rozwiąże ten problem?

komentarz 16 maja 2019 przez Szfierzak Gaduła (3,750 p.)

Dokładnie tak. Inkrementujesz studia.i na sam koniec pętli, dlatego po wpisaniu koniec ma ona wartość o jeden większą niż jest obecnie wprowadzona liczba przedmiotów. Kiedy sumujesz oceny i ects'y w ostatniej iteracji, tzn. po napisaniu koniec to i wskazuje zawsze na element tablicy do którego nie wczytałeś danych, czyli śmieci(dla testów stwórz sobie zwykłą tablice np. float tab[10], nic do niej nie przypisuj, tylko przy pomocy pętli for spróbuj przeczytać). Poza tym inkrementowanie w zaproponowany przez Ciebie sposób ma inną wadę, co jeśli użytkownik wprowadzi 20 przedmiotów?? - powiększysz i do wartości 20, wtedy przy kolejnej iteracji program wykrzyczy błąd, że wyszedłeś poza zakres zadeklarowanej tablicy. Być może trzeba też kontrolować, ile przedmiotów wprowadził użytkownik i w razie całkowitego  uzupełnienia tablicy nie pozwolić na dalsze wpisywanie, i przerwać pętlę, np. przy pomocy break.

Czy wstawienie tam if rozwiąże ten problem?

To zależy od warunku if'a, ale zwróć uwagę, że w pętli masz już jednego if'a i trochę modyfikując kod możesz rozwiązać problem, np. wrzucenie powyższego problematycznego kawałka kodu(suma i inkrementacja) do if'a pod wczytywanie danych od użytkownika.

Podobne pytania

0 głosów
2 odpowiedzi 1,135 wizyt
pytanie zadane 1 stycznia 2020 w C i C++ przez Adrian234 Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 832 wizyt
pytanie zadane 22 lutego 2017 w C i C++ przez ChiriChiri Obywatel (1,260 p.)
0 głosów
0 odpowiedzi 168 wizyt

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 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!

...