[:it]Operatori ed operandi e commenti[:]

[:it]

Eupalinos Ugajin

Assegnare un valore ad una variabile significa riempire la variabile con un qualcosa; questo qualcosa può essere un numero (intero positivo o negativo, reale).

Ad esempio l’istruzione:

a = a+1

incrementa di 1 il valore di a

b = x + y

la somma tra x ed y viene inserita in b.

Gli operatori più conosciuti sono:

somma +

differenza –

prodotto *

divisione /

elevamento a potenza **

altre funzione sono presenti nel seguente link

funzioni matematiche

Per utilizzare le funzioni matematiche bisogna aggiungere all’inizio del programma:

import math

e poi per accedere alla singola funzione, ad esempio radice quadrata si deve scrivere

math.sqrt(x)

I commenti sono preceduti dal carattere #[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Assegnazione dei valori alle variabili[:]

[:it]

Eupalinos Ugajin

Assegnare un valore a delle variabili significa riempire la variabile scritta a sinistra con quello che si scrive a sinistra.

variabile = valore;

esempi:

area = raggio * raggio *3,14;

si noti che gli operatori aritmetici sono quelli tradizionali associati alle quattro operazioni

somma +

sottrazione –

moltiplicazione *

divisione :

Si possono usare espressioni anche di questo tipo

i = i +1 ;

dove si aggiunge alla i di sinistra il valore della i precedente.

Ad esempio:

i=10;
i= i +1;
cout<<i;

mostrerà a video 11.

in C++ si può anche scrivere

i++;

si incrementa sempre di 1 la variabile ossia

scrivere

i=i+1;

è equivalente a scrivere

i++;

quest’ultima scrittura è quella usata più comunemente;

Ecco le equivalenze tra i vari operatori di assegnamento:

Operatore Utilizzo Esempio Istruzione equivalente
++ Incremento unitario x++; x=x+1;
Decremento unitario x–; x=x-1;
+= Incremento x+=y; x=x+y;
-= Decremento x-=y; y=x-y;
*= Moltiplicazione x*=y; y=x*y;
/= Divisione x/=y; x=x/y;
%= Resto della divisione tra interi x%=y; x=x%y;

Si devono conoscere anche le seguenti funzioni matematiche che sono presenti nella libreria cmath che deve essere inclusa nel programma:

#include <cmath>

  • pow(x,y) per indicare x con esponente y (da notare che x e y devono essere di tipo double come pure il risultato) Ad esempio pow(x,2.0) come si vede essendo di tipo double bisogna mettere il 2.0
  • sqrt(x) calcolo della radice quadrata
  • ceil(x) indica il valore di un numero arrotondato all’intero superiore
  • floor(x) si ottiene un numero senza parte decimale

[:]

Pubblicato in Senza categoria | 2 commenti

[:it]Variabili e Costanti[:]

[:it]

eupalinos ugajin

Perché usare delle variabili in programmazione?

Esse sono necessarie per eseguire un’operazione tutte quelle volte in cui il programma elabora qualcosa. Se voglio effettuare la somma tra due numeri associo ad essi due lettere ed è sufficiente poi scrivere

a+b

si chiede in input il valore di a e di b e poi si lancia il programma che effettua tale somma.

ecco alcune definizioni di variabili usate in C++

bool A;

unsigned char;

int;

Associo adesso la seguente tabella che elenca i tipi di variabile che possono essere usati e la relativa dimensione:

Tipo Definizione intervallo Bit occupati
booleani bool true/false 8
caratteri unsigned char da 0 a 255 8
char da -128 a 127 8}}
wchar_t carattere stesso 16
interi unsigned short int da 0 a 65.535 16
short int da -32.768 a 32.767 16
int da -32.767 a +32.767 32
unsigned long int da 0 a 4.294.967.295 32
lon int da -2.147.438.648 a 2.147.438.647 32
reali float da 1,17549435 \cdot 10^{-38} a 1,17549435 \cdot 10^{+38} 32
double da  2,2250738585072014 \cdot 10^{-308} a 1,7976931348623157 \cdot 10^{+308} 64
long double da 3,4 \cdot 10^{-4932} a 1,1 \cdot 10^{+4932} 80

una costante invece è una variabile che non può cambiare mai il suo valore durante tutta l’esecuzione del programma.

const double PIGRECO=3.14;

Per convenzione il nome delle variabili deve essere scritto con lettere maiuscole.

Questo semplice programma permette di visualizzare le dimensione dei principali tipi di dati.

#include<iostream>
using namespace std;
int main()
{
cout<<“Dimensine dei numeri interi: “<<sizeof(int)<<” byte \n”;
return 0;
}[:]

Pubblicato in Senza categoria | 2 commenti

[:it]Dettagli primo progamma[:]

[:it]#include <iostream>

Un programma che richiede dei dati in input e poi darli in output ha la necessità di conoscere come tale processo possa avvenire. Esso avviene inserendo all’interno del programma un’apposita libreria che include tutto il necessario per operare coni dati di input ed output.

Quando si deve cambiare una ruota ad un’automobile si ha la necessità di avere una chiave inglese per svitare i bulloni.

Ci si deve portare dietro la chiave inglese ossia includere nel bagagliaio la chiave inglese; la stessa cosa per un programma esso per mostrare a video l’esito o per immettere dei dati ha la necessità di includere la libreria iostream.

std::cin>>a;

Le parole riservate di un linguaggio sono quelle indispensabili perché possa funzionare.

Ad esempio, in un’automobile non posso usare i pneumatici di un camion e quindi uso quegli standard; in maniera analoga, le parole, caratteristiche del linguaggio, non possono essere cambiate.

Tali parole sono contenute in namespace (spazio dei nomi): il nome del contenitore si chiama std (abbreviazione di standard) e per accedervi si usa appunto std::

using namespace std;

Per evitare di ripetere il nome del namespace, si può scrivere una dichiarazione iniziale nel programma, con la quale si specifica che si intende usare un determinato namespace e i nomi in esso contenuti.

main()

questo è il nucleo del programma all’interno del quale avviene la vera e propria elaborazione.

Quindi tutte le istruzioni vengono racchiuse dalla coppia di parentesi grafe {}

{ Alt+ 123 AltGr+Shift+[
} Alt+125 AltGr+Shif+]

la presenza di parentesi tonde sono necessarie perché esse potranno racchiudere degli argomenti che possono essere usate dalla funzione.

Come in matematica le funzioni in informatica assumono o elaborano dei dati in input per fornire dei dati in output.

return 0

significa che la funzione main() se non produce errori ritornerà un valore 0 al sistema operativo o 1 se ve ne sono stati.

int i;

la variabile che viene usata dal programma potrà essere solo di tipo intero.

cin>> i;

indica la lettura dei dati dalla tastiera (input)

cout<<i;

indica la visualizzazione dell’output a video[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Geany: ambiente di sviluppo per C++ su UBUNTU[:en]Am[:de]Am[:]

[:it]Geany è un ambiente di sviluppo che consente di scrivere un programma in C++.

Il vantaggio di usare questo editor è:

  • man mano che si digita il codice le parole riservate del linguaggio assumono colori diversi, tale fatto permette una veloce identificazione di eventuali errori lessicali (insieme delle parole riconosciute dal linguaggio) ed anche sintattiche (modalità per scrivere le frasi)
  • compilazione del sorgente
  • esecuzione del sorgente.

Ecco come si presenta la schermata di questo IDLE

  • Per vedere le parole nei vari colori è necessario fornire all’IDLE il tipo di file che si sta editando, nel caso specifico bisogna salvarlo con estensione .CPP ad esempio ES1.CPP
  • Per compilare il programma si preme F8
  • Per creare il file eseguibile si preme F9
  • Per eseguire il file su una schermata si preme F5
  • per scrivere una parentesi grafa { si usa la combianazione ALTGR+SHIFT+[ o ATGR+SHIFT+]

[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Esercizi[:]

[:it]

Jacek Jerka

  1. Utilizzare la notazione compatta (i++, i+=j)  per calcolare:
    1. incrementa di uno la variabile
    2. decrementa di uno la variabile
    3. sommo tra due variabili
    4. differenza tra due variabili
    5. prodotto tra due variabili
    6. divisione tra due variabili
  2. Calcolare il doppio di un numero fornito da tastiera
  3. Dato il lato, trovare il perimetro e l’area di un quadrato
  4. Dato il raggio, calcolare la circonferenza e l’area del cerchio
  5. Scrivere il programma per scambiare il contenuto di due variabili )occorre usare una terza variabile temporanea)
  6. Calcolare la misura dell’ipotenusa di un triangolo rettangolo, noti i cateti
  7. date le età di tre persone, calcolare l’età media delle persone
  8. scrivere un programma che richieda in input le coordinate di due punti e scriva le coordinate del punto medio del segmento che unisce i due punti
  9. scrivere un programma che richieda in input le coordinate di due punti e che scriva l’equazione della retta passante per essi ( va escluso, a priori, che la retta risulti verticale).
  10. dato il prezzo di un prodotto e la percentuale di sconto, calcolare il prezzo scontato
  11. dato in input il valore di un deposito bancario e il tasso di interesse annuo, calcolare gli interessi maturati dopo 25 giorni
  12. scrivere un programma che, ricevute in input le misure delle diagonali di un rombo, calcoli il perimetro e l’area

[:]

Pubblicato in Senza categoria | 2 commenti

[:it]Ambiente UBUNTU e C++[:]

[:it]

Jacek Yerka

Un ambiente di sviluppo molto presente è UBUNTU, una distribuzione Linux molto utile e simile ad un ambiente di sviluppo Windows.

Per poter sviluppare un programma in C++ vi sono molti IDE o IDLE (Integrated DeveLopment Enviroment) ma il più usato è sicuramente Geany, presente nella cartella programmi di UBUNTU.

Una volta terminata l’editazione del programma lo si deve compilare scrivendo:

g++ -Wall -g nomeprpgramma.cpp -o nomeproramma

per eseguire il programma appena compilato si usa il comando

./nomeprogramma[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Codifica di canale FEC o ARQ[:]

[:it]

David Hettinger

La semplice rilevazione dell’errore fa sì che si richieda la ritrasmissione del pacchetto ossia

ARQ che è acronimo di Automatic Request.

Caratteristiche del canale ARQ:

  • canale bidimensionale
  • si adotti un protocollo tramite cui avviene il colloquio fra trasmettitore e ricevitore.

Il trasmettitore:

  • suddivide il messaggio che riceve dalla sorgente in blocchi di k bit  memorizza ogni blocco prima della trasmissione
  • per ogni blocco si calcola il CRC, lo si accoda ai bit informativi e invia il blocco codificato di n bit sul canale
  • attente una risposta dal ricevitore

Il ricevitore:

  • controlla la sequenza di bit contenuta in un blocco codificato
  • se non rileva errori invia al trasmettitore un riscontro positivo ACK (ACKnowledge); il trasmettitore cancella dalla propria memoria i blocchi giunti correttamente al ricevitore.
  • se il controllo dà esito negativo, (NACK Negatie Acknowledge), si richiede al trasmettitore di ritrasmettere il singolo pacchetto.

Esso può andare bene quando la ritrasmissione del messaggio è ininfluente considerando la velocità di trasmissione del mezzo, la sua banda e la capacità di elaborazione del segnale in entrata ed in uscita.

Nel caso in cui si volesse oltre che rilevare l’errore anche cercare di correggerlo, senza richiedere la ritrasmissione allora si parla di:

FEC acronimo della sigla inglese Forward Error Correction.

Uno stesso tipo di codice può essere utilizzato per rivelare o per correggere errori a seconda dell’architettura del sistema di codifica/decodifica utilizzato

Inoltre entrambi i codici inseriscono della ridondanza nel messaggio trasmesso.[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Codifica di canale: controllo di parità – CRC [:]

[:it]

David Hettinger

La codifica di canale prepara il pacchetto di bit per la trasmissione sulla linea.

Tale codifica deve permettere al ricevente di verificare se i bit trasmessi siano uguali a quelli ricevuti e nel caso o correggerli o richiedere la ritrasmissione del pacchetto.

Si aggiungono dei bit ridondanti, che consentono, una volta giunti a destinazione, di verificare se ci sono stati errori.

Controllo di parità

Il Controllo di parità (VRC Vertical Redundancy Check) consiste nell’aggiungere un bit supplementare (detto bit di parità) ad un certo numero di bit di dati chiamato code word (generalmente 7 bit, per formare un byte con il bit di parità) il cui valore (0 o 1) è uguale al numero totale di bit a 1 cioè pari.

Per essere più chiari: in una sequenza di 8 bit il numero di 1 presenti deve essere sempre in numero pari e chi fa jolly è sempre il primo posto che rimane 0 se il numero di 1 nelle altre sette posizioni è pari mentre diventa 1 se il numero d bit nelle altre sette posizioni è dispari.

Prendiamo l’esempio seguente:

In questo esempio, il numero di bit di dati a 1 è pari, il bit di parità è quindi posto a 0. Nell’esempio seguente, invece, dato che i bit di dati sono dispari, i bit di parità è a 1:

Immaginiamo ormai che dopo la trasmissione il bit di peso minore (il bit posto a destra) del byte precedente sia vittima di un’interferenza:

Il bit di parità non corrisponde più alla parità del byte: un errore è rilevato.

Tuttavia, se due bit (o un numero pari di bit) arriva a modificarsi simultaneamente durante il trasporto dei dati, nessun errore sarà allora rilevato:

Il sistema di controllo di parità rileva solo gli errori in numero dispari, pari quindi solamente al 50% degli errori totali. Questo sistema di rilevamento degli errori possiede anche l’inconveniente maggiore di non correggere gli errori rilevati (il solo mezzo è di esigere la ritrasmissione del byte errato).

CRC

Tra gli algoritmi più conosciuti è il CRC ossia Cyclic Redundancy Check che contiene degli elementi ridondanti rispetto al frame, che permettono di rilevare gli errori, ma anche di ripararli.

Il CRC prevede la generazione di una stringa di bit di controllo che viene normalmente trasmessa assieme ai dati.

Si deve dividere il frame di partenza per un frame generatore. Al frame di partenza si concatena il resto della divisione e lo trasmette.

Il ricevente divide il frame ricevuto per il generatore e se il resto è nullo allora il pacchetto ricevuto è privo di errori.

I codici generatori sono conosciuti sia dal ricevente che dal generatore.

Ad esempio si vuole trasmettere

0xa3 0xac  con il codice generatore 0x1a.

ossia in binario

1010 0011 1010 1100 con codice generatore 1101 0

Si aggiungono tanti bit al frame di partenza quanti sono quelli del divisore – 1.

1010 0011 1010 1100 0000 questo è il frame di partenza

  • Si valuta che il divisore ci sta nel dividendo non quando il dividendo è realmente maggiore del divisore, ma quando ha lo stesso ordine di grandezza, vale a dire quando il suo bit più significativo vale 1.
  • La sottrazione per ridurre il dividendo và fatta senza riporti, quindi si riduce ad un’operazione di Exclusive Or (XOR).

Ad esempio i primi passi sono:

1010 0011 1010 1100 0000
1101 0
0111 0

Abbiamo eseguito l’XOR tra i primi bit del dividendo ed il divisore, ottenendo il primo resto.

1010 0011 1010 1100 0000
1101 0|
0111 00

quindi si effettua la somma, se la prima cifra non è 1 non si porta giù un’altra cifra.

Alla fine si troverà come resto:

1010

ed il messaggio o frame trasmesso sarà:

1010 0011 1010 1100 1010.

I polinomi generatori più frequentemente usati sono:

CCITT-32: 0x04C11DB7 (ethernet)= x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + \
x8 + x7 + x5 + x4 + x2 + x + 1

CCITT-16: 0x1021 = x16 + x12 + x5 + 1

CRC-16: 0x8005 = x16 + x15 + x2 + 1

XMODEM-16: 0x8408 = x16 + x15 + x10 + x3

12bit-CRC: 0x80f = x12 + x11 + x3 + x2 + x + 1

10bit-CRC: 0x233 = x10 + x9 + x5 + x4 + x + 1

8bit-CRC: 0x07 = x8 + x2 + x + 1

[:]

Pubblicato in Senza categoria | Lascia un commento

[:it]Codifica di sorgente:a lunghezza fissa, a lunghezza variabile (codice di Huffmann)[:]

[:it]Lo schema di un canale trasmissivo può essere visto come segue:

La codifica di sorgente ha il compito di trasformare un messaggio scritto ad esempio in una tastiera in una sequenza di bit.

Tale trasformazione può essere a lunghezza fissa (codice ASCII) o a lunghezza variabile (ad esempio codifica di Huffmann)

Ci sono i pregi e i difetti per entrambi i tipi di decodifica.

Codice ASCII.

Esso permette la codifica dei caratteri in 8 bit. Utilizzando la definizione di distribuzione a ripetizione avendo un alfabeto di 2 cifre per 8 bit in tutto si ha 2^{8}=256 combinazioni diverse.

Codice Huffmann

Il codice di Huffman costruisce una tabella di codifica-decodifica utilizzando un numero di bit differente a seconda della probabilità che si ha di trovare uno specifico valore.

Utilizzando meno bit per i codici più probabili, e più bit per quelli meno diffusi, si può risparmiare memoria.

E’ il codice migliore per ottimizzare l’entropia, è il metodo più efficiente per la compressine dei dati. (pkzip, jpeg, mp3).

Per creare la giusta codifica si usa uno schema ad albero

Ecco la spiegazione dell’algoritmo:

  • si ordinano i simboli in ordine decrescente di probabilità
  • i due valori più piccoli creano le prime due foglie (leaf node) e si sommano creando il primo nodo. A ramo di sinistra si associa sempre il valore 0 ed al ramo di destra il valore 1.
  • si ordinano nuovamente i valori.
  • i due valori più piccoli si sommano creando ancora un nodo, Al ramo di sinistra si associa il valore 1, al ramo di destra il valore 0.
  • il processo continua finchè non vi sono più simboli o probabilità associati al relativo simbolo.

Esempio

Sia dato un file formato da 120 caratteri con la seguente frequenza di caratteri (attenzione parlare di frequenza o probabilità di un carattere è uguale)

carattere a b c d e f
frequenza 57 13 12 24 9 5

Se si usasse un codice a lunghezza fissa si dovrebbe usare una stringa di bit lunga 3 in quanto essa è l’unica che possa contenere la codifica di 6 caratteri, infatti 2^{3}=8

carattere a b c d e f
codice fisso 000 001 010 011 100 101

Siccome vi sono 120 caratteri da trasmettere 120 \cdot 3 =360 bit

Utilizzando invece la codifica a lunghezza variabile si ha:

carattere a b c d e f
frequenza 57 13 12 24 9 5
codice variabile 0 101 100 111 1101 1100

Bastano 57 \cdot 1+13 \cdot 3+12 \cdot 3+24\cdot 3+9\cdot 4 + 5 \cdot 4 =260 bit

Spiegazione di come si crea il codice variabile.

  • ordino i valori dal meno frequente al più frequente:
f:5 e:9 c:12 b:13 d:24 a:57
  • sommo gli ultimi due f:5+e:9=14
  • creo due foglie con il ramo 0 a sinistra 0 ed il ramo 1 a destra
  • ordino la sequenza:

  • sommo gli ultimi due c:12+b:13=25
  • creo due foglie con il ramo 0 a sinistra e il ramo 1 a destra
  • ordino la sequenza
  • sommo gli ultimi due 14+d:24=38
  • creo un nuovo nodo
  • ordino la sequenza

  • sommo gli ultimi due 25+38=63
  • creo un nuovo nodo
  • ordino la sequenza

  • sommo gli ultimi 2 a:57+63=120
  • creo l’ultimo nodo

Adesso come si legge il codice?

  • o partendo dal basso e poi invertendo i bit: ad esempio f: 0011 lo inverto 1100
  • o partendo dall’alto (root) ed arrivando a tutte le radici
carattere a b c d e f
frequenza 57 13 12 24 9 5
codice variabile 0 101 100 111 1101 1100

Come avviene la decodifica?

Siccome nessuna parola codice è prefisso di un’altra, la prima parola codice del file codificato risulta univocamente determinata.

Ad esempio trasmetto 0101100, comincio a leggere da sinistra verso destra. Prendo i primi 4 caratteri, non corrisponde a nessuna cifra, prendo i primi tre ancora nessuna, prendo il primo e corrisponde ad a, elimino lo 0 rimane

101100

1011 non corrisponde a nessun carattere,

101 corrisponde alla b

rimane 100 che corrisponde alla c

per cui il messaggio è abc.[:]

Pubblicato in Senza categoria | Lascia un commento