Post con tag 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 >

Effettuare un lavoro periodico con la classe Timer del C#

La classe System.Timers.Timer consente di eseguire, periodicamente, un metodo scelto.
Il suo utilizzo è abbastanza semplice:

using System;
using System.Timers;

namespace test
{
	class MainClass
	{
		private static int toDelete = 0;

		public static void Main (string[] args)
		{
			Console.WriteLine(
				">> Esempio Timer << " +
			    "[premi un tasto per terminare]");

			Timer timer = new Timer();
			timer.Interval = 1000.0;
			timer.Elapsed += new ElapsedEventHandler(TimerEvent);
			timer.Enabled = true;

			Console.Read();
			timer.Enabled = false;
			Console.WriteLine("\nFine");
		}

		public static void TimerEvent(Object sender, ElapsedEventArgs e)
		{

			String timestamp = e.SignalTime.ToString();

			for(int i=0; i < toDelete; i++)
			{
				Console.Write("\b");
			}

			toDelete = timestamp.Length;
			Console.Write(timestamp);
		}
	}
}

La classe Dictionary di C#

La classe Dictionary, contenuta nel namespace System.Collections.Generic, rappresenta una collezione di chiavi-valori.
Essendo implementata come una tabella hash, ottenere un valore a partire da una chiave ha complessità vicina O(1) (dipende comunque anche dalla qualità dell’algoritmo di hash definito per il tipo chiave).

Dictionary una classe generica, ed è dunque necessario specificare la classe della chiave e quella del valore:

using System;
using System.Collections.Generic;

namespace test
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			Dictionary<String, String> dict =
				new Dictionary<String, String>();
		}
	}
}

Continua >

C#: la parola chiave “is”

La keyword is consente di sapere, a runtime, se un oggetto è compatibile con un tipo specificato.
Essa restituisce true se l’oggetto in esame non è null e se è possibile sottoporlo a cast verso il tipo specificato senza che venga sollevata un’eccezione.

Continua >

C#: le proprietà

In C#, le proprietà sono membri che forniscono un meccanismo semplificato di lettura e scrittura dei campi di una classe.
Solitamente si utilizzano le proprietà per accedere ai campi privati (anche se possono essere utilizzati anche per campi pubblici), al posto dei metodi setter/getter (il tipico approccio di Java).

Continua >

L’istruzione “using” del C#

L’istruzione using del C# è utilizzata per definire un ambito all’esterno del quale uno o più oggetti verranno eleminati.
L’oggetto fornito all’istruzione using deve necessariamente implementare l’interfaccia System.IDisposable (e, di conseguenza, il metodo Dispose, che rilascerà le risorse).
Si esce dall’ambito definito da using quando termina il blocco o in presenza di un’eccezione.

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 >

Leggere un file al contrario in C

La lettura di un file in C avviene in maniera unidirezionale, dall’inizio alla fine. Per leggere un file al contrario, è necessario utilizzare la funzione di posizionamento fseek:

int fseek ( FILE * stream, long int offset, int origin );

dove stream è un puntatore ad un oggetto FILE, offset è l’offset, in byte, da origin.
origin è un intero che rappresenta la posizione. E’ possibile utilizzare le seguenti tre costanti:

SEEK_SET Inizio del file
SEEK_END Fine del file
SEEK_CUR Posizione corrente

Il valore di ritorno della funzione è 0 se ha avuto successo, un valore non nullo altrimenti.

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 >