[C]-Struktury, operacje wejścia/wyjścia
Ostatnio zmodyfikowano 2014-12-09 08:22
Vixos Temat założony przez niniejszego użytkownika |
[C]-Struktury, operacje wejścia/wyjścia » 2014-12-08 19:33:30 Mam takie zadanie do zrobienia i się chce zapytać czy dobrze to zrobiłem. Proszę rozszerzyć program o następujące funkcje: - zapis i odczyt całego magazynu w trybie binarnym - funkcja zwalniająca pamięć przydzieloną na towary w magazynie. Funkcja jednocześnie usuwa wszystkie towary z magazynu. To jest ten program #include <cstdio> #include <cstring>
struct Towar { char nazwa[ 32 ]; float cena; float cena_jednostkowa; };
void ustaw( Towar * t, const char n[], float cena, float cj ) { strcpy( t->nazwa, n ); t->cena = cena; t->cena_jednostkowa = cj; } struct Magazyn { int stan; Towar * towary[ 1000 ]; };
void init( Magazyn * m ) { m->stan = 0; for( int i = 0; i < 1000; ++i ) m->towary[ i ] = 0; }
Towar * utworz( const char n[], float cena, float cj ) { Towar * t = new Towar; ustaw( t, n, cena, cj ); return t; }
bool dodaj( Magazyn * m, const char n[], float cena, float cj ) { if( m->stan >= 1000 ) { return false; } m->towary[ m->stan++ ] = utworz( n, cena, cj ); return true; }
void wypisz( Magazyn * m, FILE * fp ) { fprintf( fp, "%d\n", m->stan ); for( int i = 0; i < m->stan; ++i ) wypisz( m->towary[ i ], fp ); }
void wczytaj( Magazyn * m, FILE * fp ) { fscanf( fp, "%d", & m->stan ); getc( fp ); for( int i = 0; i < m->stan; i++ ) { m->towary[ i ] = new Towar; wczytaj( m->towary[ i ], fp ); } }
A tutaj napisałem te funkcje void wypiszbinarnie( Magazyn * m, FILE * fp ) { fwrite( &( m->stan ), sizeof( int ), 1, fp ); for( int i = 0; i < m->stan; ++i ) fwrite( m->towary[ i ], sizeof( Towar ), 1, fp ); }
void wczytajbinarnie( Magazyn * m, FILE * fp ) { fread( &( m->stan ), sizeof( int ), 1, fp ); for( int i = 0; i < m->stan, i++ ) fread( m->towary[ i ], sizeof( Towar ), 1, fp ); }
bool usun( Magazyn * m, int numerTowaru ) { if( numerTowaru < 0 or numerTowaru >= m->stan ) return 0; if( numerTowaru < m->stan - 1 ) m->towary[ numerTowaru ] = m->towary[ m->stan - 1 ]; m->stan--; return 1; }
|
|
darko202 |
» 2014-12-09 08:22:21 wycofuję się z tego co zauważyłem wcześniej. daje się wypełnić magazyn main { Magazyn m; init( & m ); m.towary[ 0 ] = utworz( " xxx", 2.34, 2.1 ); dodaj( & m, " xxx", 2.34, 2.1 ); dodaj( & m, " xxx", 2.34, 2.1 ); dodaj( & m, " xxx", 2.34, 2.1 ); cout << m.towary[ 2 ]->cena << " " << m.towary[ 2 ]->cena_jednostkowa << " " << m.towary[ 2 ]->nazwa << " \n";
funkcje wypisz, wczytaj, wczytajbinarnie zawierają błędy nie można konwertować 1 argumentu Towar na Magazyn funkcja usun 1- wycieki pamięci - zadeklarowałeś wcześniej pamięć new Towar 2. zakładasz że możesz otrzymać stan < 0, co będzie jak znów zapełnisz magazyn 1 towar pewnie zginie. |
|
« 1 » |