Programowanie obiektowe - problem z dynamiczną tablicą stringów w klasie
Ostatnio zmodyfikowano 2013-03-04 23:02
Monika90 |
» 2013-03-04 22:19:41 Da się bez std::vector, po prostu z wektorem jest łatwiej. Dziwię się, że trzymasz ilość przedmiotów w osobnej tablicy, dodaj pole ilosc_przedmiotow do struktury Student. |
|
karpiq Temat założony przez niniejszego użytkownika |
» 2013-03-04 22:34:35 Dodałem ilość przedmiotów do struktury. #include <iostream> #include <string> using namespace std;
class Student { public: string * Przedmioty; int ilosc_przedmiotow; string Imie; string Nazwisko; int Nr_albumu; float Srednia; Student() { } };
void nowy( Student * tab, int rozmiar ) { int i, j, n; Student * kopia = new Student[ rozmiar ]; j = 0; for( i = 0; i < rozmiar; i++ ) { kopia[ i ].Imie = tab[ i ].Imie; kopia[ i ].Nazwisko = tab[ i ].Nazwisko; kopia[ i ].Nr_albumu = tab[ i ].Nr_albumu; kopia[ i ].Srednia = tab[ i ].Srednia; kopia[ i ].Przedmioty = new string[ tab[ i ].ilosc_przedmiotow ]; j = 0; do { kopia[ i ].Przedmioty[ j ] = tab[ i ].Przedmioty[ j ]; j++; } while( j < tab[ i ].ilosc_przedmiotow ); } Student * tablica = new Student[ rozmiar + 1 ]; for( i = 0; i < rozmiar; i++ ) { tablica[ i ].Imie = kopia[ i ].Imie; tablica[ i ].Nazwisko = kopia[ i ].Nazwisko; tablica[ i ].Nr_albumu = kopia[ i ].Nr_albumu; tablica[ i ].Srednia = kopia[ i ].Srednia; tablica[ i ].Przedmioty = new string[ tab[ i ].ilosc_przedmiotow ]; j = 0; do { tablica[ i ].Przedmioty[ j ] = kopia[ i ].Przedmioty[ j ]; j++; } while( j < tab[ i ].ilosc_przedmiotow ); } cout << "Dodawanie nowego studenta" << endl << endl; cout << endl << "Student nr. " << i << endl << "Imie: "; cin >> tablica[ i ].Imie; cout << "Nazwisko: "; cin >> tablica[ i ].Nazwisko; cout << "Nr. albumu: "; cin >> tablica[ i ].Nr_albumu; cout << "Srednia: "; cin >> tablica[ i ].Srednia; cout << "Ilosc przedmiotow: "; cin >> n; tab[ i ].ilosc_przedmiotow = n; tablica[ i ].Przedmioty = new string[ n ]; for( j = 0; j < n; j++ ) { cout << "Przedmiot nr. " << j + 1 << ": "; cin >> tablica[ i ].Przedmioty[ j ]; } system( "pause" ); }
void wypisz( Student * tab, int rozmiar ) { int i, j; for( i = 0; i < rozmiar; i++ ) { cout << "Student nr. " << i + 1 << endl; cout << "Imie: " << tab[ i ].Imie << endl; cout << "Nazwisko: " << tab[ i ].Nazwisko << endl; cout << "Nr. albumu: " << tab[ i ].Nr_albumu << endl; cout << "Srednia: " << tab[ i ].Srednia; j = 0; do { cout << endl << "Przedmiot nr. " << j + 1 << ": "; cout << tab[ i ].Przedmioty[ j ]; j++; } while( j < tab[ i ].ilosc_przedmiotow ); cout << endl << endl; system( "pause" ); system( "cls" ); } }
int main() { int j, i, n, K; cout << "Podaj liczbe studentow: "; cin >> K; system( "cls" ); Student * tablica = new Student[ K ]; for( i = 0; i < K; i++ ) { cout << endl << "Student nr. " << i + 1 << endl << "Imie: "; cin >> tablica[ i ].Imie; cout << "Nazwisko: "; cin >> tablica[ i ].Nazwisko; cout << "Nr. albumu: "; cin >> tablica[ i ].Nr_albumu; cout << "Srednia: "; cin >> tablica[ i ].Srednia; cout << "Ilosc przedmiotow: "; cin >> n; tablica[ i ].ilosc_przedmiotow = n; tablica[ i ].Przedmioty = new string[ n ]; for( j = 0; j < n; j++ ) { cout << "Przedmiot nr. " << j + 1 << ": "; cin >> tablica[ i ].Przedmioty[ j ]; } system( "cls" ); } int x = 1; do { int menu; system( "cls" ); cout << "1. Dodanie nowego studenta" << endl; cout << "2. Wyswietlenie danych" << endl; cout << "3. Zapisanie danych do student.txt" << endl; cout << "4. Wylacza program i kasuje dane." << endl; cin >> menu; switch( menu ) { case 1: system( "cls" ); nowy( tablica, K ); K++; break; case 2: system( "cls" ); wypisz( tablica, K ); break; case 3: system( "cls" ); break; case 4: x = 2; break; } } while( x != 2 ); return 0; }
Ale dalej nie wiem dlaczego program nie wyświetla nowych danych. |
|
Monika90 |
» 2013-03-04 22:47:08 Ale dalej nie wiem dlaczego program nie wyświetla nowych danych. |
To dlatego, że kod w main nic nie wie o tym, że w funkcji nowy alokowałeś nową tablicę. Mógłbyś np. zwracać wskaźnik do tej nowoalokowanej tablicy: Student * nowy( Student * tab, int rozmiar ) { return tablica; }
case 1: system( "cls" ); tablica = nowy( tablica, K ); K++;
Poza tym, Twój program w ogóle nie zwalnia żadnej pamięci, którą przydzielił. Musisz dodać delete[] w wielu miejscach. |
|
karpiq Temat założony przez niniejszego użytkownika |
» 2013-03-04 23:02:16 Działa ;) Dziękuje wszystkim za pomoc!
|
|
1 2 « 3 » |