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

Dziedziczenie, referencje, przyjaźń

VPS Starter Arubacloud
0 głosów
134 wizyt
pytanie zadane 21 stycznia 2020 w C i C++ przez wisniowaty Nowicjusz (200 p.)

Witam,

realizuje zadanie z C++ a mianowicie stwarzam taki program-dziennik studencki, gdzie tworze tablicę studentów oraz przypisuje do nich ocenę. W momencie gdy chce wczytać dane z tablicy w funkcji wyświetlającej podsumowanie - nie pobiera mi danych z tablicy. Gdzie popełniam błąd? Kod poniżej.

#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
#include <cstdlib>
#include <time.h>
#include <limits>

using namespace std;



class Elektrotechnika
    {
    public:
        string kierunek ="Wydzial uczelni - IPR Elektrotechnika";
    };


class Student : public Elektrotechnika
    {
        int liczba;
        double suma = 0;
        double srednia;
        int nr_indeksu;
        string imie_studenta;
        string nazwisko_studenta;
        public:
        friend void wczytaj_indeks(Student &w);
        void wyswietl(Student&);
        void wylicz(Student&);
    };

void Student::wyswietl(Student& k1)
    {
        cout << "*************************************" << endl;
        cout << "Dla studenta: " << k1.imie_studenta << " " <<k1.nazwisko_studenta << " ";
        cout << "o numerze indeksu: " << k1.nr_indeksu << endl;
        cout << "Srednia ocen wynosi: " << srednia << endl;
        cout << "*************************************" << endl;

    }
 void wczytaj_indeks(Student &w)
    {
        int x;
        cout << "Podaj ilosc studentow: ";
        cin >> x;
            if (x <= 0)
            {
                cout << "Musisz podac liczbe dodatnia. Wprowadz jeszcze raz: ";
                cin>> x;
            }
        Student * p = 0;
        p = new Student[x];
        for( int i = 0; i < x; i++ )
            {
            cout << "Podaj imie i nazwisko studenta wraz z numerem indeksu: ";
            cin >> p[i].imie_studenta >> p[i].nazwisko_studenta >> p[i].nr_indeksu;
            }
    }


void Student::wylicz(Student & s)
    {
    int x;
    double* tab;
    cout << "Podaj ilosc ocen jaka zdobyl student: ";
        cin >> x;

        if (x <= 0)
        {
                cout << "Ilosc ocen musi byc dodatnia. Wprowadz jeszcze raz  ";
                cin >> x;
        }

        tab = new double[x];


        for(int i = 0; i < x; ++i)
        {
                cout << "Podaj ocene: ";
                cin >> tab[i];

                if(tab[i] < 2 || tab[i] > 5)
                {
                    cout << "To nie jest ocena!  ";
                    cout << "Podaj ocene jeszcze raz: ";
                    cin >> tab[i];
                }
        }

        for(int i = 0; i < x; ++i)
        {
         s.suma += tab[i];
        }

        s.srednia=s.suma/x;

    }

int main(int argc, char* argv[])

{
    cout << "Dziennik eStudent 2020 - Projekt na zaliczenie" << endl;

    Student Studentowy;
    cout << "Obecnie: "<< Studentowy.kierunek << endl << endl << endl;
    wczytaj_indeks(Studentowy);
    Studentowy.wylicz(Studentowy);
    Studentowy.wyswietl(Studentowy);
    system("PAUSE");
    return 0;
}

 

komentarz 22 stycznia 2020 przez j23 Mędrzec (195,220 p.)

W Student::wylicz masz wyciek - nigdzie nie zwalniasz tab. Tam ta tablica nie jest w ogóle potrzebna, a jak już musi być, to lepiej użyć std::vector.

komentarz 22 stycznia 2020 przez mokrowski Mędrzec (156,260 p.)
Hmm.. a poprzez:

class Student : public Elektrotechnika

.. chcesz wyrazić że Student jest kierunkiem? Czy ... nabiera charakteru kierunku? :) To ostatnie... niby prawda, ale raczej nie w ten sposób się to implementuje.

Dobrze... poważniej. Student może zwierać atrybut z przydzielonym działem/kierunkiem a nie z niego dziedziczyć.

Masz głęboki błąd koncepcyjny. Trochę bez sensu jest poprawiać w takim przypadku błędy implementacji (bo jeszcze się da poprawić kod).

1 odpowiedź

+1 głos
odpowiedź 21 stycznia 2020 przez Adrian1999 Nałogowiec (34,570 p.)
wybrane 22 stycznia 2020 przez wisniowaty
 
Najlepsza

Zmienna p jest zmienną lokalną. Więc po wykonaniu się programu wszystko co jest wewnątrz funkcji "wczytaj_indeks" zostanie skasowane. Zauważ że nic nie robisz ze zmienną którą przekazujesz. Przebuduje zaraz aplikację tak aby działała, tylko że będzie wyglądać o wiele inaczej.

Ps
Kod jest cholernie nieczytelny, o wiele byś ułatwił sprawę mi i sobie prawdopodobnie, gdybyś przynajmniej nazywał zmienne tak by było wiadome czym one są i do czego służą.

Kod gotowy, masz strasznie pogmatwany sposób myślenia. Na drugi raz podaj w ogóle założenia by móc Cię pokierować. Bo jeżeli miał być użyty wskaźnik, był zakaz vectorów etc to warto wiedzieć. Oferuję skasować całą aplikacje, cały kod. I zacząć od nowa, bo strasznie ciężko się po tym poruszać. Wprowadziłem kilka modyfikacji, ale też cenię swój czas i nie poprawiałem wszystkiego tylko starałem się zrobić tak aby działało. Dodatkowo masz błąd, w przypadku gdy wpisuje się w ocenie "1", dwa razy. To program raz informuje o błędzie a drugi raz już leci dalej. 

#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <time.h>
#include <limits>

using namespace std;



class Elektrotechnika
{
public:
	string kierunek = "Wydzial uczelni - IPR Elektrotechnika";
};


class Student : public Elektrotechnika
{
	int liczba;
	double suma = 0;
	double srednia;
	int nr_indeksu;
	string imie_studenta;
	string nazwisko_studenta;
public:
	friend void wczytaj_indeks(Student& w);
	void wyswietl(Student&);
	void wylicz(Student&);
};

void Student::wyswietl(Student& k1)
{
	cout << "*************************************" << endl;
	cout << "Dla studenta: " << k1.imie_studenta << " " << k1.nazwisko_studenta << " ";
	cout << "o numerze indeksu: " << k1.nr_indeksu << endl;
	cout << "Srednia ocen wynosi: " << srednia << endl;
	cout << "*************************************" << endl;

}
void wczytaj_indeks(Student& Student)
{
	// To tutaj nie może być, wczytujesz indeks JEDNEGO studenta
	/*
	int NumberOfStudents;
	cout << "Podaj ilosc studentow: ";
	cin >> NumberOfStudents;
	if (NumberOfStudents <= 0)
	{
		cout << "Musisz podac liczbe dodatnia. Wprowadz jeszcze raz: ";
		cin >> NumberOfStudents;
	}
	for (int i{ 0 }; i < NumberOfStudents; i++)
	{*/
		cout << "Podaj imie i nazwisko studenta wraz z numerem indeksu: ";
		cin >> Student.imie_studenta >> Student.nazwisko_studenta >> Student.nr_indeksu;
	//}
}


void Student::wylicz(Student& s)
{
	int x;
	double* tab;
	cout << "Podaj ilosc ocen jaka zdobyl student: ";
	cin >> x;

	if (x <= 0)
	{
		cout << "Ilosc ocen musi byc dodatnia. Wprowadz jeszcze raz  ";
		cin >> x;
	}

	tab = new double[x];


	for (int i = 0; i < x; ++i)
	{
		cout << "Podaj ocene: ";
		cin >> tab[i];

		if (tab[i] < 2 || tab[i] > 5)
		{
			cout << "To nie jest ocena!  ";
			cout << "Podaj ocene jeszcze raz: ";
			cin >> tab[i];
		}
	}

	for (int i = 0; i < x; ++i)
	{
		s.suma += tab[i];
	}

	s.srednia = s.suma / x;

}

int main(int argc, char* argv[])

{
	cout << "Dziennik eStudent 2020 - Projekt na zaliczenie" << endl;

	std::vector<Student> Students;
	// nie wiem jaki sens ma ta linijka poniżej, czemu wywołujesz funkcję elementu który jest całkowicie pusty
	//cout << "Obecnie: " << Studentowy.kierunek << endl << endl << endl;
	//
	//
	int NumberOfStudents;
	cout << "Podaj ilosc studentow: ";
	cin >> NumberOfStudents;
	if (NumberOfStudents <= 0)
	{
		cout << "Musisz podac liczbe dodatnia. Wprowadz jeszcze raz: ";
		cin >> NumberOfStudents;
	}
	for (int i{ 0 }; i < NumberOfStudents; i++)
	{
		Student TempStudent;
		Students.push_back(TempStudent);
		wczytaj_indeks(Students[i]);
	}
	for (auto& Student : Students)
	{
		Student.wylicz(Student);
		Student.wyswietl(Student);
	}
	system("PAUSE");
	return 0;
}

 

komentarz 22 stycznia 2020 przez wisniowaty Nowicjusz (200 p.)
Dziękuję, właśnie problem tego typu był taki, że mamy nie używać vectorów, mieliśmy to zrobić na tablicach. Początkowo zrobiłem to na jednej tablicy (tylko przechowywanie ocen), ale pojawił się zamysł zrobienia jeszcze zrobienia, ale tablicy z studentami i tutaj już z dwiema tablicami miałem problem, żeby jedno do drugiego się odwoływało.
komentarz 22 stycznia 2020 przez wisniowaty Nowicjusz (200 p.)

@Adrian1999,

Kod początkowy miał postać:

#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
#include <cstdlib>
#include <time.h>
#include <limits>

using namespace std;



class Elektrotechnika
    {
    public:
        string kierunek ="Wydzial uczelni - IPR Elektrotechnika";
    };


class Student : public Elektrotechnika
    {
        int liczba;
        double suma = 0;
        double srednia;
        int nr_indeksu;
        string imie_studenta;
        string nazwisko_studenta;
        public:
        friend void wczytaj_indeks(Student &w);
        void wyswietl(Student&);
        void wylicz(Student&);
    };

void Student::wyswietl(Student& k1)
    {
        cout << "*************************************" << endl;
        cout << "Dla studenta: " << k1.imie_studenta << " " <<
k1.nazwisko_studenta << " ";
        cout << "o numerze indeksu: " << k1.nr_indeksu << endl;
        cout << "Srednia ocen wynosi: " << srednia << endl;
        cout << "*************************************" << endl;

    }
 void wczytaj_indeks(Student &w)
    {
    cout << "Podaj imie studenta: " ;
    cin >> w.imie_studenta;
    cout << "Podaj nazwisko studenta: " ;
    cin >> w.nazwisko_studenta;
    cout << "Podaj nr indeksu: " ;
    cin >> w.nr_indeksu;
    }


void Student::wylicz(Student & s)
    {
    int x;
    double* tab;
    cout << "Podaj ilosc ocen jaka zdobyl student: ";
        cin >> x;

        if (x <= 0)
        {
                cout << "Ilosc ocen musi byc dodatnia. Wprowadz jeszcze raz  ";
                cin >> x;
        }

        tab = new double[x];


        for(int i = 0; i < x; ++i)
        {
                cout << "Podaj ocene: ";
                cin >> tab[i];

                if(tab[i] < 2 || tab[i] > 5)
                {
                    cout << "To nie jest ocena!  ";
                    cout << "Podaj ocene jeszcze raz: ";
                    cin >> tab[i];
                }
        }

        for(int i = 0; i < x; ++i)
        {
         s.suma += tab[i];
        }

        s.srednia=s.suma/x;

    }

int main(int argc, char* argv[])

{
    cout << "Dziennik eStudent 2020 - Projekt na zaliczenie" << endl;

    Student Studentowy;
    cout << "Obecnie: "<< Studentowy.kierunek << endl << endl << endl;
    wczytaj_indeks(Studentowy);
    Studentowy.wylicz(Studentowy);
    Studentowy.wyswietl(Studentowy);
    system("PAUSE");
    return 0;
}

Z tym, że chciałem to rozwinąć jako tworzenie wielu studentów a nie jeden

Podobne pytania

0 głosów
1 odpowiedź 88 wizyt
pytanie zadane 26 marca 2016 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 580 wizyt
pytanie zadane 28 kwietnia 2020 w C i C++ przez Adrian Maj Nowicjusz (160 p.)
0 głosów
1 odpowiedź 226 wizyt
pytanie zadane 13 marca 2020 w C i C++ przez edwardkraweznik Dyskutant (9,930 p.)

93,013 zapytań

141,977 odpowiedzi

321,266 komentarzy

62,355 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 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...