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

Proste zadanko na strukturach

Ostatnio zmodyfikowano 2013-06-16 22:18
Autor Wiadomość
Sheil
Temat założony przez niniejszego użytkownika
Proste zadanko na strukturach
» 2013-06-16 18:49:09
Witam, mam problem z nastepującym zadaniem:
Napisac strukture Figura zawierajaca nazwe, ilosc bokow i dlugosci tych bokow z czego funkcje maja wygladac tak jak w przedstawionym przeze mnie kodzie.
Funkcje: wczytaj, sortuj (wedlug paradygmatu boolowskiego), usunac. (w zadaniu byly jeszce 2 funkcje ale ich nie ruszalem bo reszta i tak nie dziala)
program się kompiluje ale nie dziala tak jak powinien, tworzy się jakaś nieskończona pętla albo problemy z pamiecią lub jeszce cos innego. Sam nie wiem, byłbym wdzięczny jakby ktos mnie nakierował w czym jest problem.

C/C++
#include <iostream>
#include <string>
#include <fstream>

using namespace std;


struct Figura
{
    string nazwa;
    int ilosc;
    int * dl_boku;
   
};

bool wczytaj( const char * nazwa, Figura *& tablica, int & ilosc_figur );
void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) );
bool pred( const Figura & a, const Figura & b );
int main( int argc, char ** argv )
{
    Figura * tablica = 0;
    int ilosc_figur = 0;
    if( wczytaj( argv[ 1 ], tablica, ilosc_figur ) )
    {
        sortuj( tablica, ilosc_figur, pred );
    }
   
}
void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) );
bool wczytaj( const char * nazwa, Figura *& tablica, int & ilosc_figur )
{
    ifstream pwej;
    pwej.open( nazwa );
    if( !pwej )
    {
        cerr << "blad wczytania pliku";
        return false;
    }
    pwej >> ilosc_figur;
    // tu juz jeden blad znalazlem, ale nadal nie dziala, nie
    //wypisuje figury z najwieksza liczba bokow w funkcji sortuj i program sie nie //konczy. hmm
    tablica = new Figura[ ilosc_figur ];
    for( int i = 0; i < ilosc_figur; i++ )
    {
        pwej >> tablica[ i ].nazwa >> tablica[ i ].ilosc;
        tablica[ i ].dl_boku = new int[ tablica[ i ].ilosc ];
       
        for( int j = 0; j < tablica[ i ].ilosc; j++ )
        {
            pwej >> tablica[ i ].dl_boku[ j ];
        }
       
    }
    pwej.close();
    return true;
}
void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) )
{
    Figura pomoc;
    int i = 0;
    for(; i < ilosc_figur; i++ )
    {
        for( int j = 0; j < ilosc_figur; j++ )
        {
            if( pred );
            else
            {
                pomoc = tablica[ i ];
                tablica[ i ] = tablica[ j ];
                tablica[ j ] = pomoc;
            }
           
        }
       
    }
    cout << "najwiekszy jest: " << tablica[ i ].nazwa;
   
}
bool pred( const Figura & a, const Figura & b )
{
    if( a.ilosc > b.ilosc ) return true;
    else
    {
        return false;
    }
   
}
void usun( Figura *& tablica, int & liczba_figur )
{
    for( int i = 0; i < liczba_figur; i++ )
         delete[] tablica[ i ].dl_boku;
   
    delete[] tablica;

// EDIT
gapa jestem :) nie podalem jak powinien wygladac plik tekstowy:

5 // liczba figur
trapez 4 2 2 1 1// kolejno nazwa, liczba bokow i dlugosci tych bokow
prostokat 2 4 3

itp.
P-85703
zimniok
Dla 3 figur
» 2013-06-16 20:30:17
Przesyłam kod zmodyfikowany do wczytania 3 figur z pliku "figury.txt".

W funkcji sortuj nie były podane argumenty dla funkcji porównującej pred.

Na twoim miejscu stworzyłbym nową zmienną "największy" zamiast wywalać iterator przed pętle for. Moim zdaniem jest to nieintuicyjne i dlatego pojawiał się błąd - program próbował wywołać cout<< "najwiekszy jest: " << tablica[ i ].nazwa<<endl i tym samym wychodził poza zakres tablicy.

Zawartość pliku figury.txt:
C/C++
3
osmiokat 8 4 4 4 4 4 4 4 4
prostokat 4 2 2 1 1
trapez 4 2 3 1 1

Zawartość pliku źródłowego:
C/C++
#include <iostream>
#include <string>
#include <fstream>

using namespace std;


struct Figura
{
    string nazwa;
    int ilosc;
    int * dl_boku;
   
};

bool wczytaj( const char * nazwa, Figura *& tablica, int & ilosc_figur );
void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) );
bool pred( const Figura & a, const Figura & b );
void wypisz( Figura * tablica, int ilosc_figur )
{
    for( int i = 0; i < ilosc_figur; i++ )
    {
        cout << tablica[ i ].nazwa << endl;
        cout << tablica[ i ].ilosc << ": ";
        for( int j = 0; j < tablica[ i ].ilosc; j++ )
             cout << tablica[ i ].dl_boku[ j ] << " ";
       
        cout << endl;
    }
}
int main( int argc, char ** argv )
{
    Figura * tablica;
    int ilosc_figur = 2;
    if( wczytaj( "figury.txt", tablica, ilosc_figur ) )
    {
        wypisz( tablica, ilosc_figur );
        sortuj( tablica, ilosc_figur, pred );
        wypisz( tablica, ilosc_figur );
    }
   
}
void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) );
bool wczytaj( const char * nazwa, Figura *& tablica, int & ilosc_figur )
{
    ifstream pwej;
    pwej.open( nazwa );
    if( !pwej )
    {
        cerr << "blad wczytania pliku";
        return false;
    }
    pwej >> ilosc_figur;
    // tu juz jeden blad znalazlem, ale nadal nie dziala, nie
    //wypisuje figury z najwieksza liczba bokow w funkcji sortuj i program sie nie //konczy. hmm
    tablica = new Figura[ ilosc_figur ];
    for( int i = 0; i < ilosc_figur; i++ )
    {
        pwej >> tablica[ i ].nazwa >> tablica[ i ].ilosc;
        tablica[ i ].dl_boku = new int[ tablica[ i ].ilosc ];
        for( int j = 0; j < tablica[ i ].ilosc; j++ )
        {
            pwej >> tablica[ i ].dl_boku[ j ];
        }
       
    }
    pwej.close();
    return true;
}
void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) )
{
    Figura pomoc;
    int i = 0;
    for(; i < ilosc_figur; i++ )
    {
        for( int j = 0; j < ilosc_figur; j++ )
        {
            if( pred( tablica[ i ], tablica[ j ] ) );
            else
            {
                pomoc = tablica[ i ];
                tablica[ i ] = tablica[ j ];
                tablica[ j ] = pomoc;
            }
           
        }
       
    }
    cout << "najwiekszy jest: " << tablica[ i - 1 ].nazwa << endl;
   
}
bool pred( const Figura & a, const Figura & b )
{
    if( a.ilosc > b.ilosc ) return true;
    else
    {
        return false;
    }
   
}
void usun( Figura *& tablica, int & liczba_figur )
{
    for( int i = 0; i < liczba_figur; i++ )
         delete[] tablica[ i ].dl_boku;
   
    delete[] tablica;
}


 
P-85708
Sheil
Temat założony przez niniejszego użytkownika
» 2013-06-16 22:18:45
Dziękuje ślicznie, zrozumiałem na czym mój błąd polegał :) Program mi się krzaczył ponieważ z mojego niedopatrzenia nie wpisałem tyle figur ile powinno być w pliku tekstowym, zamiast 5 jak to w moim pliku było, wpisałem 4 :) wtedy już bym zauważył inne błędy :)
P-85713
« 1 »
  Strona 1 z 1