C++

C/C++: generazione di un numero pseudo-random

L’header stdlib.h (cstdlib in C++), contiene al suo interno la funzione:

int rand(void)

che permette la generazione di un numero random, compreso tra 0 e RAND_MAX, che dipende da un seme, definibile attraverso la funzione:

void srand ( unsigned int seed );

Continua >

C/C++: aggiornamento della percentuale di progresso con il carattere backspace

Sebbene il C/C++ non fornisca strumenti (perlomeno portabili) per la gestione della console, possiamo utilizzare il carattere ‘\b’ di backspace per cancellare qualcosa scritto precedentemente e per scriverci di nuovo. Questo può essere utile nella gestione del progresso di un task, ad esempio, mediante la stampa della percentuale.
In questo esempio mostreremo come sovrascrivere la vecchia percentuale stampata a favore della corrente:

Continua >

C++: copia di un file

Il programma che segue permette la copia di un file.
Da linea di comando, viene passato un file di origine, uno di destinazione ed eventualmente la dimensione del buffer di lettura/scrittura.

Continua >

C++: classi astratte e polimorfismo

Talvolta, può essere necessario creare un tipo di dato non inteso per essere istanziato, ma da essere utilizzato nel meccanismo di ereditarietà come classe base per fornire un’interfaccia pubblica alle altre classi. Tali classi sono dette astratte, a differenza delle classi che possiamo utilizzare per istanziare degli oggetti, dette concrete.

Le classi astratte non possono, come detto, istanziare oggetti, perchè risultano incomplete. Spetterà alle classi derivate definire le parti mancanti.
Dal punto di vista logico, una classe astratta è troppo generica per essere utilizzata direttamente. Il classico esempio è quello della classe Shape, da cui derivano, ad esempio, le classi Square e Triangle.
Disegnare uno Shape ci risulta impossibile. E’ necessario definire tale funzionalità, compito che spetta alle classi derivate.

Continua >

C++ e CGI: parsing della stringa di query

Lo standard CGI prevede la variabile d’ambiente QUERY_STRING che contiene il valore della query richiesta dal client.
Se il client richiede la pagina:


http://localhost/split.cgi?nome=Antonio&eta=21&nazione=Italia

la stringa di query è nome=Antonio&eta=21&nazione=Italia.
Notiamo come questa stringa sia un insieme di elementi <chiave, valore>.

Continua >

C++: l’algoritmo for_each della STL

L’algoritmo for_each, definito nell’header algorithm, è utilizzato per applicare una funzione ad ogni elemento all’interno del range [first, last):

template <class InputIterator, class Function>
   Function for_each (InputIterator first, InputIterator last, Function f);

Continua >

Mischiare un container in C++

La STL fornisce un utile funzione che che consente di mescolare gli elementi all’interno di una sequenza:

template <class RandomAccessIterator>
void random_shuffle (
    RandomAccessIterator first,
    RandomAccessIterator last
);

template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle (
  RandomAccessIterator first,
  RandomAccessIterator last,
  RandomNumberGenerator& rand
);

Continua >

Accumulare i valori in un container

La STL fornisce la funzione generica accumulate che consente di accumulare, ad un valore iniziale, gli elementi di una sequenza. L’operazione di default è la somma degli elementi. Può essere comunque utilizzata una funzione binaria:

template <class InputIterator, class T>
   T accumulate ( InputIterator first, InputIterator last, T init );

template <class InputIterator, class T, class BinaryOperation>
   T accumulate ( InputIterator first, InputIterator last, T init,
                  BinaryOperation binary_op );

dove first e last rappresentano l’inizio e la fine della sequenza, init è il valore iniziale mentre binary_op è una funzione binaria.

Continua >

C++: conversione di un numero in stringa e viceversa con le Boost

La libreria Boost offre, nell’header lexical_cast.hpp, la funzione generica lexical_cast, che consente di convertire un numero in una stringa e viceversa:

namespace boost
{
    class bad_lexical_cast;
    template<typename Target, typename Source>
      Target lexical_cast(const Source& arg);
}

Continua >

Alberi binari di ricerca

Un albero binario di ricerca è una struttura dati organizzata ad albero binario e può essere definita utilizzando dei nodi contenenti i campi left, right, parent, che puntano rispettivamente al figlio sinistro, al figlio destro e al nodo padre, più una chiave key e gli eventuali dati satellite.
La radice dell’albero sarà l’unico nodo ad avere il campo parent settato a NULL mentre i nodi foglia avranno sia left che right settati a NULL.

Continua >