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

Tablica dynamiczna + struktura

Ostatnio zmodyfikowano 2011-05-31 21:27
Autor Wiadomość
draculeq
Temat założony przez niniejszego użytkownika
Tablica dynamiczna + struktura
» 2011-05-29 21:18:02
Mam problem z strukturą, ponieważ tworze baze danych zawierającą: ucznia, przedmioty, oceny. gdzie oceny można dopisywać i nie umiem sobie poradzić z tablicą dynamiczną ocen.
Zrobiłem coś takiego:
C/C++
#include <iostream>
#include <conio.h>
#include <fstream>
#include <windows.h>

using namespace std;

struct DDT
{
   
    string imie;
    string nazwisko;
    int ilosc[ 3 ];
    string przedmiot[ 3 ];
    int * oceny[ 3 ];
   
};

void menu()
{
   
    cout << "Witam w bazie danych. Co chcesz zrobic?" << endl << endl;
    cout << "1. Wyswietl uczniow." << endl;
    cout << "2. Wyswietl uczniow i ich oceny" << endl;
    cout << "3. Sortowanie" << endl;
    cout << "4. Przeladuj" << endl;
    cout << "5. Dodaj oceny" << endl;
    cout << "" << endl;
    cout << "" << endl;
    cout << "" << endl;
    cout << "" << endl;
    cout << "" << endl;
}


void wczytajdane( struct DDT dane[] )
{
    int a;
    ifstream klasa( "oceny.txt", ios::in | ios::out );
   
    { for( int i = 0; i < 5; i++ )
        {
            klasa >> dane[ i ].imie;
            klasa >> dane[ i ].nazwisko;
            for( int j = 0; j < 3; j++ )
            {
                klasa >> dane[ i ].przedmiot[ j ];
                klasa >> dane[ i ].ilosc[ j ];
                a = dane[ i ].ilosc[ j ];
               
                //  dane[i].oceny= new int[3];
                for( int k = 0; k < a; k++ )
                {
                    dane[ i ].oceny[ i ] = new int[ a ];
                   
                    klasa >> dane[ i ].oceny[ j ][ k ];
                }
            }
           
        }
    }
}

void wypiszuczniow( struct DDT dane[] )
{
   
    for( int i = 0; i < 5; i++ )
    {
        cout << dane[ i ].imie << " ";
        cout << dane[ i ].nazwisko << endl;
       
       
    }
}

void wypiszzocenami( struct DDT dane[] )
{
   
    for( int i = 0; i < 5; i++ )
    {
        cout << dane[ i ].imie << " ";
        cout << dane[ i ].nazwisko << endl;
        for( int j = 0; j < 3; j++ )
        {
            cout << dane[ i ].przedmiot[ j ] << ": ";
            for( int k = 0; k < dane[ i ].ilosc[ j ]; k++ )
            {
                cout << dane[ i ].oceny[ k ] << " ";
            }
            cout << endl;
        }
        cout << endl;
       
    }
   
}




int main()
{
    DDT dane[ 5 ];
    //wczytajdane(dane); 
    int a;
    do
    {
        system( "cls" );
        menu();
        a = getch();
       
        switch( a )
        {
        case '1':
            {
                system( "cls" );
                cout << "Uczniowie" << endl << endl;
                wypiszuczniow( dane );
                getch();
                break;
            }
        case '2':
            {
                system( "cls" );
                wypiszzocenami( dane );
                getch();
                break;
            }
        case '4':
            {
                system( "cls" );
                wczytajdane( dane );
                getch();
                break;
            }
        }
    } while( a != 27 );
   
    return 0;
}

plik txt ocen: http://www.speedyshare.com/files/28706995/Oceny.txt

moją ideą było odczytywanie imienia, nazwiska, nazwy przedmiotu, ilości ocen z niego , n-ocen ...
Oceny chce zapisywać w 2 wymiarach tj.  pierwszy: przedmiot drugi: oceny z niego.
Problem tkwi gdzieś w tablicy dynamicznej. Proszę o pomoc :)
P-33635
absflg
» 2011-05-29 21:50:06
W dużym skrócie: za każdym razem gdy okazuje się, że potrzebna jest tablica większa niż nasza, należy zalokować w pamięci nową, większą. Przepisać do niej całą starą tablicę. Usunąć starą tablicę. Dodać element.

Jeżeli lokowanie dynamiczne tablic to nie jakiś wymóg (praca domowa itd.) to lepiej skorzystać z gotowej klasy vector » Kurs STL, C++Kontener tablicy (std::vector) lekcja.
P-33641
draculeq
Temat założony przez niniejszego użytkownika
» 2011-05-29 21:57:01
Wielkie dzięki :)
P-33644
draculeq
Temat założony przez niniejszego użytkownika
» 2011-05-31 16:29:48
Poradziłem sobie z tym co tu napisałem :)
P-33694
draculeq
Temat założony przez niniejszego użytkownika
» 2011-05-31 19:33:14
Dalej mam problem z tym programem,
w notatniku mam mieć Imię Nazwisko i oceny z przedmiotów. I siedzie już dobre trochę nad problemem zaimportowania ocen, wiem że wygodnie jest vector'em, ale mam problem z tym jak to zrobić. Robiąc to na if'ach gdzieś się gubię i generalnie nie wychodzi, a próbowałem jeszcze żeby pierwsza cyfra była ilością ocen z przedmiotu pierwszego ale w tym też się gubiłem ;/ i nie mam więcej pomysłów jak to dobrze rozwiązać...

Macie jakieś sugestie?

//wróciłem do 3 "zmiennych ilościowych" i mi wyszło :D
P-33702
absflg
» 2011-05-31 21:27:36
Możesz pobierać oceny "do oporu" i uznać, że po nich następuje nazwa nowego przedmiotu. Pobieraj dane do zmiennej int - jak skończy się to błędem to znaczy, że dalej nie ma liczby. Zwykle wystarczy umieścić to w warunku
if( stream >> var ) { }
 wykona blok jeżeli nie będzie błędu we wprowadzaniu, więc możesz tak na przykład (umieszczając w bloku
break;
) wyjść z pętli gdy skończą się liczby. ( Operator >> dla strumieni zwraca NULL jeżeli wyniknie błąd w trakcie operacji, a NULL jest uznawane w C++ za fałsz w operacjach logicznych.)
P-33713
« 1 »
  Strona 1 z 1