CATEGORII DOCUMENTE |
Bulgara | Ceha slovaca | Croata | Engleza | Estona | Finlandeza | Franceza |
Germana | Italiana | Letona | Lituaniana | Maghiara | Olandeza | Poloneza |
Sarba | Slovena | Spaniola | Suedeza | Turca | Ucraineana |
DOCUMENTE SIMILARE |
|
TESINA DI
SISTEMI
1.0 –
A – Origini del linguaggio di programmazione C
Nel
B – Elementi di un programma in C
Per definire un linguaggio in modo univoco e chiaro È necessario descriverne con un adatto formalismo la sintassi (regole di combinazione dei singoli elementi lessicali e significativi) e la semantica (significato delle parole).
Sia per la sintassi sia per la semantica verrÀ data una descrizione in linguaggio comune. Un programma C È costituito da elementi alfanumerici che possono essere sia simboli sia entitÀ elementari definiti da chi scrive il programma: identificatori, numeri, stringhe, etichette, commenti. Le entitÀ elementari sono costituite da lettere e cifre. Vi È differenza tra lettere minuscole e maiuscole (il linguaggio È case-sensitive) per quel che riguarda l’interpretazione del programma da parte del compilatore. Le lettere utilizzabili sono:
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Le cifre utilizzabili sono:
C – Gli identificatori
Gli identificatori sono una sequenza di lettere e/o di cifre e tale sequenza deve cominciare necessariamente con una lettera. Un identificatore viene definito liberamente da chi programma; un identificatore non deve contenere segni di interpunzione né spazi e non deve essere uguale a una parola chiave del linguaggio. I commenti in un programma C vengono definiti dai caratteri /* e */. Il primo per l’apertura dei commenti, il secondo per la chiusura.
D – I file di intestazione
Generalmente i sorgenti C sono file aventi estensione “.C” o “.CPP”. Tuttavia si troveranno sicuramente alcuni file con estensione “.H”. Questi file sono detti file di interstazione (header file, da cui l’estensione “.H”). Essi vengono utilizzati nel programma principale utilizzando la direttiva di inclusione:
#include “nomefile.h” oppure #include <nomefile.h>
Dove “nomefile.h” È il nome di un file con estensione “.H”. L’uso di “<” e “>” al posto dei doppi apici fa in modo che il compilatore cerchi tale file in una directory standard. L’uso della direttiva #include si rende di fatto necessaria in ogni programma: infatti tutte le funzioni di I / O, molte funzioni matematiche e altre funzioni di sistema non fanno parte del linguaggio C, ma sono contenute in librerie esterne; i file “.H” contengono macroistruzioni, variabili e costanti necessarie per l’uso di tali librerie (per es. il file header “stdio.h” contiene una serie di definizioni necessarie alla libreria standard contenente le funzioni di I / O).
E – Il diagramma di flusso
Per poter eseguire una programmazione corretta e fluida in tutti i suoi passaggi, bisogna prima creare un diagramma di flusso con evidenziati i passaggi fondamentali del programma. Per eseguirlo vi sono alcune regole fondamentali da ricordare:
F – Sintassi del programma
#include <stdio.h> /*Includo la libreria delle funzioni I/O
Void main ()
else
prinf(“Il numero %d È minore di %d”,a,b);
s=a+b; /*Somma le due variabili
printf(La somma È %d”,s); /*Scrivo cosÃŒ la somma a video
G – Conclusioni
Riassumendo si seguito le motivazioni per cui il linguaggio C, ha raggiunto la popolaritÀ che ha raggiunto come linguaggio di programmazione:
dimensioni ridotte
utilizzo frequente di chiamate a funzioni
loose typing (a differenza del Pascal)
linguaggio strutturato
programmazione a basso livello facilmente disponibile
implementazione dei puntatori (ampio uso di puntatori per memoria,
vettori, strutture e funzioni)
Il C e' ora diventato un linguaggio professionale ampiamente utilizzato per
varie ragioni:
ha strutture di alto livello
puÒ maneggiare attivitÀ di basso livello
produce programmi efficienti
puÃ’ essere compilato su un'ampia gamma di computer
Il suo principale inconveniente e' quello di avere un metodo scadente per
l'identificazione di errori, che puÃ’ escluderne l'utilizzo ai principianti.
Comunque con un minimo di diligenza si puÃ’ risolvere elegantemente questo
problema, in quanto si possono violare le regole del C non appena si sono
imparate (non molti linguaggi lo permettono). Nel caso in cui venga fatto
correttamente e con attenzione, questo porta a sfruttare le potenzialitÀ
della programmazione C.
Lo standard per i programmi C in origine era dato dalle caratteristiche messe
a punto da Brian Kernighan. Al fine di rendere il linguaggio piÙ accettabile
a livello internazionale, venne messo a punto uno standard internazionale
chiamato ANSI C (American National Standards Institute).
H – Esercizio per esame finale
Creare un programma che permetta il calcolo del perimetro e dell’area di un triangolo.
G – Sintassi del programma
#include <stdio.h> /*Includo la lib delle funz I/O
#include <math.h> /*Includo la lib delle funz Matematiche
Void main ()
1.0 – IL SISTEMA BINARIO
A – Origini del sistema binario
Tutti i sistemi di numerazione adottati sono
sistemi posizionali perché, secondo la posizione occupata, il numero assume un
valore diverso. Qualunque sia la base del sistema un numero viene espresso a
mezzo delle cifre significative e delle potenze della base.
La struttura interna di questi sistemi coincide, cambia l’aritmetica, le leggi
della moltiplicazione, dell’addizione.
Il 'sistema binario' fa la sua prima apparizione nel 1600 nello
scritto del matematico inglese Thomas Hariot. Nel 1703 venne eseguita da
Liebnitz una codificazione piÙ precisa a livello matematico e presentata
all’Associazione delle Scienze d’Inghilterra.
È un sistema a base 2 avendo solo due cifre significative: 0 e 1.
Col minimo delle cifre possiamo metterci in corrispondenza con lo stato di un
elaboratore che in effetti riconosce solo due situazioni: spento e acceso,
cioÈ 0 e 1. Di contro siamo costretti a rappresentare numeri piccoli
utilizzando una quantitÀ esagerata di cifre. È un sistema usato
per la logica interna dell’elaboratore dei dati, mentre per rappresentare
quella esterna vengono usati altri due sistemi, uno a base 8, che utilizza 8
cifre, detto, ottale oppure uno a base 16 chiamato esadecimale.
Un ulteriore esempio chiarirÀ tali concetti.
Se prendiamo in esame il numero 3725 possiamo
affermare che È uguale alla somma di:
3000 + 700 + 20 + 5 cioÈ: 3 x
1000 (103) + 7 x 100 (102) + 2 x 10 (101) + 5
x 100
Riassumendo:
3x103 7x102 2x101 5x100
La sua posizione viene quindi fornita dalle potenze della base.
Ogni colonna nel binario va di due in due e non di dieci in dieci, quindi
avremo 2, 4, 8, 16, 32 ecc. al posto di 1, 10, 100, 1000, ecc.
Dal momento perÃ’ che abbiamo a disposizione due sole cifre, 0 e 1,
appena superiamo 1 ci portiamo nella colonna seguente, percorrendo velocemente
le colonne.
Di conseguenza, riportando le cifre del
sistema decimale nella posizione del binario, otteniamo la seguente tabella:
Per rappresentare quindi il numero 3725 in sistema binario bisogna eseguire il seguente calcolo:
3725 : 2 = 1862,5 (Tuttavia si scrive il numero 1862 senza resto e si mette un 1 sotto al 3725)
cioÈ:
232 : 2 = 116 : 2 = 58 : 2 = 29 : 2 = 14 : 2 = 7 : 2 = 3 : 2 = 1
1 0 1 1 0 0 0 1 0 1 1
Il numero codificato quindi in binario comparirÀ automaticamente conteggiando i resti partendo da dx verso sx. e cioÈ:
3725=111010001101
In un numero binario si possono identificare i seguenti bit principali:
MSB LSB
Dove MSB stÀ per Most Significant Bit, e LSB stÀ per Least Significant Bit, tradotti in lingua italiana sono appunto “Bit PiÙ Significativo” e “Bit Meno Significativo”. Infatti nel caso in cui bisogna confrontare due numeri binari, basta semplicemente verificare il primo bit a sx per capire quale dei due numeri sia il piÙ alto. Anche guardando il bit meno significativo si puÃ’ capire rapidamente se il numero convertito in decimale sarÀ pari o dispari, infatti con l’ultimo numero come 0 si otterrÀ un numero pari, mentre con 1 si otterrÀ un numero dispari.
Per eseguire una conversione di un numero da sistema binario a sistema decimale, bisogna eseguire l’operazione inversa, e cioÈ la moltiplicazione. Infatti bisogna moltiplicare ogni numero binario per il suo decimale relativo, e cioÈ:
10 9 8 7 6 5 4 3 2 1 0
1 x 2 + 1 x 2 + 1 x 2 + 0 x 2 + 1 x 2 + 0 x 2 + 0 x 2 + 0 x 2 + 1 x 2 + 1 x 2 + 0 x 2 + 1 x 2
che riscritto nella sua interezza diventerÀ:
1 x 2048 + 1 x 1024 + 1 x 512 + 0 x 256 + 1 x 128 + 0 x 64 + 0 x 32 + 0 x 16 + 1x 8 + 1 x 4 +0 x 2 + 1 x 1
facendo i calcoli:
B – Somma in codice binario
Per effettuare una normale somma in codice binario, bisogna prima verificare la regola elencata qui sotto:
1 + 1 = 0 con il riporto di 1
1 + 1 + 1 = 1 con il riporto di 1
Quindi per eseguire una semplice somma (es. 5 + 6 = 11) bisogna effettuare i seguenti passaggi:
1011 r.
C – Differenza in codice binario
Per quanto riguarda invece la differenza, È la medesima operazione, invece che dare il “resto” al numero successivo, si chiede il “prestito”. Ecco qui di seguito la tabella riassuntiva:
0 - 1 = 1 con il prestito di 1 dal bit con il peso superiore
(es. 10 – 4 = 6)
0100 =
0110 r.
D – Complemento ad 1 (C.A.1)
Sotto il
termine di complemento ad 1 di un numero binario si intende la differenza tra
la configurazione di tutti '1' del codice ed il numero dato.
Il complemento ad 1 di 'A' È simbolicamente indicato dall'apice 1 che
precede la variabile 'A'; es: 1A
Per il calcolo si procede nel modo
indicato dalla definizione.
es. sia A = '0110 1101' la configurazione binaria di cui si vuole calcolare il
complemento a 1:
1111 1111 - (configurazione con tutti i bit a '1')
0110 1101 = (A)
----- ----- -----
1001 0010 (1A = complemento ad 1 di A)
Quindi: 1'0110 1101' =
'1001 0010'.
Da notare che non e' un caso particolare che il risultato coincida con la
configurazione negata di A (not A). Infatti vale sempre la relazione:
A = not(A)
pertanto, calcolare il complemento ad 1 di 'A' equivale a dire di
calcolare la negazione di 'A'.
CioÈ deriva direttamente dal fatto che sottrarre il bit 'x' da 1,
dÀ come risultato 'x' negato, ossia not(x).
E – Complemento ad 2 (C.A.2)
Il
complemento a 2 di un numero, e' uguale alla sua sottrazione da 2N,
dove con 'N' si e' indicato il numero di bit impiegati per la rappresentazione
del codice.
Il numero da complementare deve essere minore di 2(N-1)
Il complemento a 2 di 'A' e' simbolicamente indicato dall'apice 2 che precede
la variabile 'A'; es. 2A
In definitiva: 2A = 2N - A
es.
Rappresentazione dei numeri a 8 bit: N = 8
2N = 28 = 256 = '1 0000 0000'
2(N-1) = 27 = 128 = '1000 0000'
I numeri da rappresentare in
complemento a 2 devono quindi essere minori di 128, ossia <= '0111 1111'.
In realtÀ esiste un'eccezione.
Per il calcolo si procede nel modo indicato dalla definizione.
es. sia A = '0110 1101' la configurazione binaria di cui si vuole calcolare il
complemento a 2:
1 0000 0000 - (configurazione corrispondente a 28)
0110 1101 = (A)
----- ----- -------
1001 0011 (2A = complemento a 2 di A)
Non e' affatto casuale che il complemento a 2 di un numero sia maggiore
di 1 del complemento a 1 dello stesso numero.
Infatti 2N = '1 0000 0000' = '1111 1111' + 1
Quindi
A = 2N - A = 100000000 - A = (11111111 + 1) - A = (11111111 - A) + 1 = 1A + 1
CONCLUSIONI
Dato il numero: 101100
NUMERO IN COMPLEMENTO AD 1
(sarÀ quindi esattamente il suo opposto)
NUMERO IN COMPLEMENTO AD 2
100 (per la prima parte in nero rimarrÀ tale, fino ad incontrare il primo 1,
dopo di che il resto, scritto in rosso, cambierÀ il suo stato.)
F – I numeri relativi
Nel sistema binario È possibile rappresentare non solo i numeri assoluti, ma anche quelli relativi e cioÈ i numeri positivi e negativi.
G – Rappresentazione in modulo e segno (M&S)
Il metodo piÙ immediato per esprimere i numeri relativi È quello di usare il bit piÙ significativo (MSB) per indicare il segno, (convenzionalmente 0 corrisponde al segno + ed 1 al segno – ) e gli altri bit per rappresentare il modulo, cioÈ il valore assoluto del numero. Si considerino ad esempio numeri a otto bit (1 byte); togliendo il bit del segno, si hanno a disposizione 7 bit con cui si possono rappresentare 2 elevato alla settima e cioÈ 128 numeri, da 0 a 127. In questa rappresentazione, il numero binario 10000011, ad esempio, corrisponde a – 3, mentre 00000011 corrisponde a + 3, ecc.
La successione dei numeri, esprimibili con un byte, dal piÙ negativo al piÙ positivo È riportata nella successiva tabella. Si noti come con questa rappresentazione dei numeri relativi, siano presenti due zeri: 00000000 o 0 positivo e 10000000 o 0 negativo.
RAPPRESENTAZIONE IN MODULO E SEGNO
| |||||||||
2.0 – IL SISTEMA OTTALE
A – Altri sistemi di numerazione e codici
Dagli esempi visti nel paragrafo precedente, appare evidente quanto sia laborioso operare sui numeri binari, specialmente quando i bit che li compongono sono parecchi. Per ovviare a questo inconveniente sono stati introdotti due sistemi di numerazione, l’ottale e l’esadecimale, il cui impiego consente di ottenere un notevole alleggerimento del formalismo binario.
B – Il sistema ottale
Il sistema ottale, È un sistema di numerazione di tipo posizionale pesato a base otto; impiega per tanto 8 cifre, da 0 a 7. I numeri maggiori di 7 vengono rappresentati con modalitÀ analoghe a quelle del sistema decimale, tenendo conto perÒ che in questo caso i pesi relativi ad ogni posizione sono potenze di 8, crescenti a partire dalla cifra piÙ a destra del numero. Pertanto il numero ottale 2643 (in base otto) puÒ essere scomposto nel seguente modo:
= 2 x 8³ + 6 x 8² + 4 x 8¹ + 3 x 8° = 2 x 512 + 6 x 64 + 4 x 8 + 3 x 1 = 1443 (in base 10)
C – Il sistema esadecimale
Il sistema esadecimale, utilizzerÀ quindi una base 16, tuttavia questa sarÀ composta da numeri e da lettere. Precisamente sarÀ formata da numeri che vanno da 0 a 9 e lettere che vanno dalla A alla F.
Come mostra la tabella sotto:
A |
|
B |
|
C |
|
D |
|
E |
|
F |
A2D9 = X10
16
A x 16³ + 2 x 16² + D x 16¹ + 9 x 16° = 10 x 16³ + 2 x 16² + 13 x 16¹ + 9 x 1 = 41689
FF = 255
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 673
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved