Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Programowanie obiektowe - problem z dynamiczną tablicą stringów w klasie

Ostatnio zmodyfikowano 2013-03-04 23:02
Autor Wiadomość
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.
P-77697
karpiq
Temat założony przez niniejszego użytkownika
» 2013-03-04 22:34:35
Dodałem ilość przedmiotów do struktury.

C/C++
#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.
P-77698
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:
C/C++
Student * nowy( Student * tab, int rozmiar )
{
    //...
    return tablica;
}

//a w main:
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.
P-77700
karpiq
Temat założony przez niniejszego użytkownika
» 2013-03-04 23:02:16
Działa ;)
Dziękuje wszystkim za pomoc!
P-77701
1 2 « 3 »
Poprzednia strona Strona 3 z 3