Łatwy program wyliczający średnią ważoną w C++

0

Witajcie. Jestem co prawda na studiach humanistycznych, ale ostatnio zainteresowało mnie programowanie :P
Chciałem więc napisać prosty program wyliczający średnią ocen na podstawie punktów ECTS (średnia ważona)
Uporałem się z wszystkimi problemami, poza jednym - obliczenie średniej z dokładnością do jednego miejsca po przecinku.
Niestety, nie potrafię zmienić typu zmiennych, gdyż cały program zaczyna mi świrować.
Nie muszę dodawać, że jestem naprawdę zielony ;P

#include <iostream>

using namespace std;

int ilosc_ocen, srednia, suma, oceny, suma_ects;
double ocena [500], ects [500];

int main()
{
    cout << "Witaj, powiedz z ilu ocen chcesz liczyc srednia: ";
    cin >> ilosc_ocen;

        for(oceny=1; oceny<=ilosc_ocen ; oceny ++)
        {

            cout << "Podaj " << oceny << " ocene: ";
            cin >> ocena [oceny] ;
            cout << "Podaj ilosc punktow ECTS za te ocene:  ";
            cin >> ects [oceny];
        }

        for(oceny=1; oceny<=ilosc_ocen ; oceny ++)
        {
            suma+=ocena[oceny]*ects[oceny];
            suma_ects+=ects[oceny];

        }

            srednia=suma/suma_ects;
            cout << "Twoja srednia, wynosi: " << srednia << endl;
    return 0;
}
 
0

Z czepialstwa: skąd wiesz że łatwy skoro sobie z nim nie poradziłeś?

Prosty, w sensie błahy, trywialny. Wpisuję ocenę, dwie pętle i mam wynik. Nie wiem czy zapisanie liczby z przecinkiem jest trudne w programowaniu, ale wydaj mi się, że łatwe, niestety ja do tego jeszcze nie doszedłem.

0

Nie używaj zmiennych globalnych, wszystkie te zmienne powinny być w main.

Wszystko oprócz oceny i ilosc_ocen powinno być double, inaczej na każdym kroku wyniki są obcięte do liczby całkowitej.

0
twonek napisał(a):

Nie używaj zmiennych globalnych, wszystkie te zmienne powinny być w main.

Wszystko oprócz oceny i ilosc_ocen powinno być double, inaczej na każdym kroku wyniki są obcięte do liczby całkowitej.

Wielkie dzięki. Naprawdę :)
Wyjaśnisz mi tak na chłopski rozum czemu "oceny" i "ilosc_ocen" nie może być w double?

0

Oceny chyba moga byc double np 3.5 ale ilosc ocen nie bo chyba nie bedziesz podawal 3.5 oceny?

0
Czarny Pomidor napisał(a):

Oceny chyba moga byc double np 3.5 ale ilosc ocen nie bo chyba nie bedziesz podawal 3.5 oceny?

Już sobie to przeanalizowałem. I jest dokładnie odwrotnie.
Wiadomo, że zdrowy rozsądek nie pozwoli nam liczyć średnią z trzech i pół oceny (ale komputer o tym nie wie).
Zabroni on natomiast działania na niemożliwych do stworzenia okienkach, w końcu nie można stworzyć następującej bazy danych w jednym wymiarze:
x[3,75]

0
#include <iostream>
#include <iomanip>

using namespace std;



int main()
{
    int ilosc_ocen=0, oceny=0, suma_ects=0;
    double srednia=0.0, suma=0.0;

    cout << "Witaj, powiedz z ilu ocen chcesz liczyc srednia: ";
    cin >> ilosc_ocen;

    double ocena[ilosc_ocen], ects [ilosc_ocen];

        for(oceny=1; oceny<=ilosc_ocen ; oceny ++)
        {

            cout << "Podaj " << oceny << " ocene: ";
            cin >> ocena [oceny] ;
            cout << "Podaj ilosc punktow ECTS za te ocene:  ";
            cin >> ects [oceny];

            suma += ocena[oceny]*ects[oceny];
            suma_ects +=ects[oceny];

        }
            srednia=suma/suma_ects;
            cout << "Twoja srednia, wynosi: " << fixed <<setprecision(1) << srednia << endl;
    return 0;
}

do kodu dołączam bibliotekę "iomanip", żeby móc skorzystać z funkcji setprecision() użytej w cout, dzięki czemu wyświetla się określona przeze mnie ilość cyfr po przecinku.
Kiedy korzystasz ze zmiennych lokalnych (tak jak u mnie), to musisz je wyzerować, ponieważ mogą się w nich znajdować "śmieci" - przypadkowe liczby.
tablice typu double ocena i ects zdefiniowałem po wpisaniu ilości ocen, dzięki czemu zaoszczędzona została pamięć, bo zajmują tyle ile jest ocen typu double, a nie 500 :)
niepotrzebnie skorzystałeś z dwóch pętli, ponieważ wszystko można było zrobić na jednej.
w cout użyłem instrukcji fixed, żeby wyświetlić liczbę w notacji normalnej, a następnie użyłem funkcji setprecision(1), żeby wyświetlić liczbę do jednego miejsca po przecinku.

Mam nadzieję, że pomogłem i pozdrawiam.

0

Zmień na :

 double ocena [500], ects [500], suma, suma_ects, srednia; 

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