Tablica dynamiczna + struktura
Ostatnio zmodyfikowano 2011-05-31 21:27
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:
#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 ]; 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 ]; 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 :) |
|
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 Kontener tablicy (std::vector). |
|
draculeq Temat założony przez niniejszego użytkownika |
» 2011-05-29 21:57:01 Wielkie dzięki :) |
|
draculeq Temat założony przez niniejszego użytkownika |
» 2011-05-31 16:29:48 Poradziłem sobie z tym co tu napisałem :) |
|
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 |
|
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.) |
|
« 1 » |