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

Drzewko :)

Ostatnio zmodyfikowano 2010-05-19 20:31
Autor Wiadomość
bartek483
Temat założony przez niniejszego użytkownika
Drzewko :)
» 2010-05-19 18:17:01
Witamm

Mam problem z drzewem wielowartosciowym, i nie wiem czy metoda WczytajPlik() jest niepoprawna czy Wyswietl(). Czy moglby ktos zerknac w moj kod i podpowiedziec? Z gory dzieki :)
C/C++
// wielowka.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

class NODE
{
public:
    NODE() { }
    NODE( std::string nazwa, const char typ )
        : _nazwa( nazwa )
        , _typ( typ )
    { }
    void DodajWezel( std::string nazwa, std::string Rodzic, const char typ );
    void Wyswietl( NODE * node );
    void WczytajPlik( NODE * node );
    ~NODE() { }
   
private:
    vector < NODE * > _dzieci; // _dzieci _Rodzica
    std::string _nazwa; // _nazwa == _Rodzic (!)
    char _typ;
    std::string _nazwaSformatowana;
};

void NODE::DodajWezel( std::string nazwa, std::string Rodzic, const char typ )
{
    if( Rodzic == _nazwa ) _dzieci.push_back( new NODE( nazwa, typ ) );
    else for( size_t i = 0; i < _dzieci.size(); ++i ) _dzieci[ i ]->DodajWezel( nazwa, Rodzic, typ );
   
}

void NODE::Wyswietl( NODE * node )
{
    for( size_t i = 0; i < _dzieci.size(); ++i ) { // zamiana wyrazu z podkresleniem na bez podkreslenia
        for( size_t j = 0; j < _nazwa.size(); ++j ) { // _nazwaDformatowana = _nazwa (!)
            if( _nazwa[ j ] == '_' ) _nazwaSformatowana[ j ] = ' ';
            else _nazwaSformatowana[ j ] = _nazwa[ j ];
           
        }
    }
   
    if( node->_typ == 'd' ) {
        cout << "+[ " << _nazwaSformatowana << " ]\n";
        for( size_t i = 0; i < _dzieci.size(); ++i ) Wyswietl( node->_dzieci[ i ] );
       
    }
    else if( node->_typ == 's' ) cout << "* " <<( node->_nazwa ) << '\n';
   
}

void NODE::WczytajPlik( NODE * node )
{
    ifstream plik;
    plik.open( "plik.txt", ios::in );
   
    std::string _rodzic, _dziecko;
    char _typ;
   
    if( plik.good() ) {
        plik >> _dziecko;
        plik >> _rodzic;
        plik >> _typ;
       
        node = new NODE( _dziecko, _typ );
        //node->DodajWezel( _dziecko, _rodzic, _typ );
        while( !plik.eof() ) {
            plik >> _dziecko;
            plik >> _rodzic;
            plik >> _typ;
           
            DodajWezel( _dziecko, _rodzic, _typ );
        }
        cout << "Wczytano zawartosc pliku ..\n";
    }
    else cout << "File not found .. \n";
   
    plik.close();
}

int _tmain( int argc, _TCHAR * argv[] )
{
    NODE p;
    p.WczytajPlik( & p );
    p.Wyswietl( & p );
   
    _getch();
    return 0;
}

PS: Moglby jakis mod wstawic znaczniki? bo kurde znowu zapomnialem ;/
P-17011
madmike44
» 2010-05-19 18:20:51
P-17012
bartek483
Temat założony przez niniejszego użytkownika
» 2010-05-19 18:38:20
Dzieki za znaczniki, a co do porgramu ma ktos jakis pomysl?
P-17015
malan
» 2010-05-19 19:20:54
Coś namieszałeś z tą klasą. Funkcja wyświetl powinna wyglądać mniej więcej np. tak:
C/C++
void NODE::Wyswietl( void )
{
    std::cout << typ << ", " << nazwa << ", " << nazwaSformatowana;
    //itd...
}
Ty przesyłasz do niej obiekt i na nim coś próbujesz zrobić... Na dodatek jest to obiekt, którym tą funkcję wywołujesz. Coś nie tak chyba? :)
Poczekaj na opinię kogoś z większym doświadczeniem, ale na moje to powinieneś to przebudować :).
P-17017
bartek483
Temat założony przez niniejszego użytkownika
» 2010-05-19 20:31:49
Problem rozwiazany :D zmienilem metode wczytaj na :

C/C++
void WczytajPlik()
{
    ifstream plik;
    plik.open( "plik.txt", ios::in );
   
    std::string _Rodzic, _nazwaPod;
    char _typ;
   
    if( plik.good() ) {
        plik >> _nazwaPod;
        plik >> _Rodzic;
        plik >> _typ;
       
        NODE p( _nazwaPod, _typ );
        while( !plik.eof() ) {
            plik >> _nazwaPod;
            plik >> _Rodzic;
            plik >> _typ;
           
            if( plik.eof() ) break;
           
            p.DodajWezel( _nazwaPod, _Rodzic, _typ );
           
        }
        cout << "Poprawnie wczytano plik ..\n\n";
        p.Wyswietl( & p );
    }
    else cout << "Nie znaleziono pliku ..\n";
   
    plik.close();
}
P-17020
« 1 »
  Strona 1 z 1