Dubbio c++

di il
4 risposte

Dubbio c++

Salve, ho risolto la seguente traccia:
1 Traccia
Realizzare e completare in C++ la seguente classe che implementa metodi operanti su un albero n-ario.
Prevedere una funzione main che contenga una procedura di inserimento automatico e successivamente il
test dei metodi implementati.
template<class _value_type>
class util_n_tree{
/* Restituisce il numero di foglie presenti nell’albero n-ario T */
int n_leaf(const tree< _value_type > &T);
/* Restituisce il numero di nodi in T di livello k */
int n_level(const tree< _value_type > &T, int k);
};
nel seguente modo:
#ifndef UTIL_N_TREE_H_
#define UTIL_N_TREE_H_

#include "albero.h"
#include <iostream>

template<class _value_type>
class util_n_tree
{
public:
    typedef typename Albero< _value_type >::nodo nodo;
    /* Restituisce il numero di foglie presenti nell’albero n-ario T */
    int n_leaf(const Albero< _value_type > &T);
    /* Restituisce il numero di nodi in T di livello k */
    int n_level(const Albero< _value_type > &T, int k);
private:
    void n_leaf(const Albero< _value_type > &T, nodo n, int &sum_leaves);
    void n_level(const Albero< _value_type > &T, nodo n, int &sum_leaves, int lev);
};

template<class _value_type>
int util_n_tree<_value_type>::n_leaf(const Albero< _value_type > &T)
{
    int sum = 0;

    if(!T.vuoto())
        n_leaf(T, T.radice(), sum);

    return sum;

}

template<class _value_type>
void util_n_tree<_value_type>::n_leaf(const Albero< _value_type > &T, nodo n, int &sum_leaves)
{
    if (T.foglia(n))
        sum_leaves += 1;
    if(!T.foglia(n))
        n_leaf(T, T.primo_figlio(n), sum_leaves);
    if(!T.ultimo_fratello(n))
        n_leaf(T, T.fratello_succ(n), sum_leaves);
}

template<class _value_type>
int util_n_tree<_value_type>::n_level(const Albero< _value_type > &T, int k)
{
    int sum = 0;

    if(!T.vuoto())
        n_level(T, T.radice(), sum, k);

    return sum;
}

template<class _value_type>
void util_n_tree<_value_type>::n_level(const Albero< _value_type > &T, nodo n, int &sum_leaves, int lev)
{
    if (T.livello(n) == lev)
        sum_leaves += 1;
    if(!T.foglia(n))
        n_level(T, T.primo_figlio(n), sum_leaves, lev);
    if(!T.ultimo_fratello(n))
        n_level(T, T.fratello_succ(n), sum_leaves, lev);
}

#endif // UTIL_N_TREE_H_
Tutto funziona, ma vorrei sapere se è stata una scelta adeguata inserire come membri privati le seguenti sottofunzioni:
void n_leaf(const Albero< _value_type > &T, nodo n, int &sum_leaves);
void n_level(const Albero< _value_type > &T, nodo n, int &sum_leaves, int lev);
Potrei migliorare in qualche modo il codice? Grazie.

4 Risposte

  • Re: Dubbio c++

    Se hai l'obbligo di usare quei prototipi, devi usare le variabili static dentro i metodi , opportunamente inizializzate e con il valore di inizializzazione ripristinato alla fine delle chiamate quando hai il risultato finale
  • Re: Dubbio c++

    In questo modo quindi? come faccio a resettare il valore sum_leaves?
    template<class _value_type>
    int util_n_tree<_value_type>::n_leaf(const Albero< _value_type > &T)
    {
        int sum;
    
        if(!T.vuoto())
            sum = n_leaf(T, T.radice());
    
        return sum;
    
    }
    
    template<class _value_type>
    int util_n_tree<_value_type>::n_leaf(const Albero< _value_type > &T, nodo n)
    {
        static int sum_leaves = 0;
        if (T.foglia(n))
            sum_leaves += 1;
        if(!T.foglia(n))
            n_leaf(T, T.primo_figlio(n));
        if(!T.ultimo_fratello(n))
            n_leaf(T, T.fratello_succ(n));
        return sum_leaves;
    }
    altra soluzione che mi è venuta in mente (senza usare variabile static):
    template<class _value_type>
    int util_n_tree<_value_type>::n_leaf(const Albero< _value_type > &T)
    {
        int sum_leaves = 0;
    
        if(!T.vuoto())
            sum_leaves = n_leaf(T, T.radice(), sum_leaves);
    
        return sum_leaves;
    
    }
    
    template<class _value_type>
    int util_n_tree<_value_type>::n_leaf(const Albero< _value_type > &T, nodo n, int sum_leaves)
    {
        if (T.foglia(n))
            sum_leaves += 1;
        if(!T.foglia(n))
            sum_leaves = n_leaf(T, T.primo_figlio(n), sum_leaves);
        if(!T.ultimo_fratello(n))
            sum_leaves = n_leaf(T, T.fratello_succ(n), sum_leaves);
        return sum_leaves;
    }
  • Re: Dubbio c++

    Se comunque hai deciso di non rispettare la consegna dell'esercizio introducendo altri metodi, tanto vale lasciare il codice funzionante così come è...
  • Re: Dubbio c++

    Ok ma usando le variabili static avrei la possibilità di non creare ulteriori metodi ? Se si, come ?
Devi accedere o registrarti per scrivere nel forum
4 risposte