C++ objektowy - średnia ocen studenta

0

witam,

mam pewien kłopot nie umiej Sobie z nim poradzić, bo nie wiem na czym polega błąd. t ma być program obiektowy c++, ma obliczać średnią podanych ocen i zamieniać ocenę na zadanej pozycji (tego nie wiem jak zaimplementować w kalsach), czy ktoś mi pomoże:

// subject.cpp : Ten plik zawiera funkcję „main”. W nim rozpoczyna się i kończy wykonywanie programu.
//

#include <iostream>
#include <ctime>

using namespace std;

class subject
{
public:
    subject(int nr_indeksu, int l_rating);
    ~subject();

    double calcRating();             // oblicza srednia arytmetyczna ocen
    bool success();                  // okresla czy student otrzyma zaliczenie
    void getRating(double rat);      // dodaje nowa ocene
    void chanRating(double rat, int id);  // zmienia ocene
    void get();                        // wypisuje na ekranie informacje

protected:

private:
    double* rating;                     // oceny studenta
    int n_index;                     // numer indeksu studenta
    int n_rating;                    // liczba wprowadzonych ocen
    int l_rating;                     // maksymalna liczba ocen
};



int main()
{

    cout << "Wtiamy w programie do obliczania sredniej oceny!\n";

    int ix, nR;
    double R;


    cout << "podaj nr indeksu: ";
    cin >> ix;

    cout << "Ile ocen bedziemy brali pod uwage: ";
    cin >> nR;

    subject cr(ix, nR);
    srand(time(NULL));
    
    for (int i = 0; i < nR; i++)
        cr.calcRating(rand() % 5);


    cout << "Srednia ocen " << cr.calcRating() << endl;

    if (cr.success())
        cout << "Zaliczone" << endl;
    else
        cout << "Nie zaliczone" << endl;

    cr.chanRating(3.0, nR);

    cout << "Srednia ocen " << cr.calcRating() << endl;

    if (cr.success())
        cout << "Zaliczone" << endl;
    else
        cout << "Nie zaliczone" << endl;

    cr.get();

    return 0;
}

// Uruchomienie programu: Ctrl + F5 lub menu Debugowanie > Uruchom bez debugowania
// Debugowanie programu: F5 lub menu Debugowanie > Rozpocznij debugowanie

subject::subject(int n_index, int l_rating) : n_index(n_index), l_rating(l_rating) {
    rating = new double[l_rating];
}

subject::~subject() {
    delete[] rating;
}

double subject::calcRating() {
    double average = 0;
    for (int i = 0; i < n_rating; i++)
        average += rating[i];
    return average / n_rating;
}

bool subject::success() {
    double average = calcRating();
    if (average >= 3.0)
        return true;
    else
        return false;
}

void subject::getRating(double rat) {

    if (n_rating >= l_rating)
        std::cout << "Za duzo ocen" << std::endl;
    rating[n_rating++] = rat;
}

void subject::chanRating(double rat, int id) {
    if (id > n_rating)
        std::cout << "Nieprawidlowy indeks" << std::endl;
    rating[id] = rat;
}

void subject::get() {
    std::cout << "Student legitymacja nr = " << n_index << std::endl;
    std::cout << "W semestrze otrzymal nastepujace oceny : ";
    for (int i = 0; i < n_rating; i++)
        std::cout << rating[i] << ", ";
    std::cout << std::endl;
    std::cout << "Srednia ocen = " << calcRating() << std::endl;
    if (success())
        std::cout << "Semestr zaliczony" << std::endl;
    else
        std::cout << "Semestr nie zaliczony" << std::endl;
}
1

Błąd polega na tym, że próbujesz wywołać z parametrem metodę bezparametrową.

cr.calcRating(rand() % 5);

Poza tym zmień nazwy metod, które w niektórych przypadkach oznaczają zupełnie coś innego niż robią w rzeczywistości : np. getRating na addRating

0

Najpierw poraw to co już Masz, naming: klasa z małej litery, getRating - dodaje nową ocenę??, chyba set, albo add i raczej grade, bo grading to u Ciebie cała tablica ocen.
calcRating nie bierze parametrów, a zapodajesz mu: rand() % 5 ?? Od zero do cztery, to chyba nie miała być ocena. Jak testujesz to najpierw wypełnij tę rating ocenami, potem sprawdzaj średnią.
Nazwa klasy sugeruje, że jest to przedmiot, a nie może tak być gdyż jest tylko jedna tablica ocen; w tym układzie klasa powinna nazywać się Student, albo przemyśl cały ten design.

0

dziękuje za pomoc, zrobiłem mały krok do przodu:

main.cpp

// sub.cpp : Ten plik zawiera funkcję „main”. W nim rozpoczyna się i kończy wykonywanie programu.
//

#include <iostream>
#include <ctime>
#include "sub.h"


using namespace std;

int main()
{

    cout << "Witamy w programie do obliczania sredniej oceny!\n";

    int ix, nR;

    cout << "podaj nr indeksu: ";
    cin >> ix;

    cout << "Ile ocen bedziemy brali pod uwage: ";
    cin >> nR;


    sub s1(ix, nR);
    double O;
    for (int i = 0; i < nR; i++)
        cin >> O;
        s1.getRating(O);




    cout << "Srednia ocen " << s1.cals1ating() << endl;

    if (s1.success())
        cout << "Zaliczone" << endl;
    else
        cout << "Nie zaliczone" << endl;

    s1.chanRating(3.0, nR);

    cout << "Srednia ocen " << s1.cals1ating() << endl;

    if (s1.success())
        cout << "Zaliczone" << endl;
    else
        cout << "Nie zaliczone" << endl;

    s1.get();

    return 0;
}

// Uruchomienie programu: Ctrl + F5 lub menu Debugowanie > Uruchom bez debugowania
// Debugowanie programu: F5 lub menu Debugowanie > Rozpocznij debugowanie

sub.h

#define SUB_H

class sub
{
public:
    sub(int nr_indeksu, int l_rating);
    ~sub();

    double cals1ating();             // oblicza srednia arytmetyczna ocen
    bool success();                  // okresla czy student otrzyma zaliczenie
    void getRating(double rat);      // dodaje nowa ocene
    void chanRating(double rat, int id);  // zmienia ocene
    void get();                        // wypisuje na ekranie informacje

protected:

private:
    double* rating;                     // oceny studenta
    int n_index;                     // numer indeksu studenta
    int n_rating;                    // liczba wprowadzonych ocen
    int l_rating;                     // maksymalna liczba ocen
};


sub.cpp
#include "sub.h"
#include<iostream>


using namespace std;

sub::sub(int n_index, int l_rating) : n_index(n_index), l_rating(l_rating) {
    rating = new double[l_rating];
}

sub::~sub() {
    delete[] rating;
}

double sub::cals1ating() {
    double average = 0;
    for (int i = 0; i < n_rating; i++)
        average += rating[i];
    return average / n_rating;
}

bool sub::success() {
    double average = cals1ating();
    if (average >= 3.0)
        return true;
    else
        return false;
}

void sub::getRating(double rat) {

    if (n_rating >= l_rating)
    cout << "Za duzo ocen" << endl;
    rating[n_rating++] = rat;
}

void sub::chanRating(double rat, int id) {
    if (id > n_rating)
        std::cout << "Nieprawidlowy indeks" << std::endl;
    rating[id] = rat;
}

void sub::get() {
    std::cout << "Student legitymacja nr = " << n_index << std::endl;
    std::cout << "W semestrze otrzymal nastepujace oceny : ";
    for (int i = 0; i < n_rating; i++)
        std::cout << rating[i] << ", ";
    std::cout << std::endl;
    std::cout << "Srednia ocen = " << cals1ating() << std::endl;
    if (success())
        std::cout << "Semestr zaliczony" << std::endl;
    else
        std::cout << "Semestr nie zaliczony" << std::endl;
}

Program liczy średnią, ale nie przekazuje tablicy i jej nie pokazuje

4

Niezbyt odpowiem na pytanie, ale przyczepię się detalu - jak masz sytuację

if (cośtam)
    return true;
else
    return false;

to możesz to zamienić na

return cośtam;

i będzie to nie tylko czytelniejsze, odda też lepiej intencję kodu.

U Ciebie konkretniej to by było

bool subject::success() {
    double average = calcRating();
    return average >= 3.0;
}
0

Program liczy średnią, ale nie przekazuje tablicy i jej nie pokazuje

Co ma pokazywać i w którym miejscu? I ta nazwa zmiennej, O!!

0

to ocena

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