Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
BulgaraCeha slovacaCroataEnglezaEstonaFinlandezaFranceza
GermanaItalianaLetonaLituanianaMaghiaraOlandezaPoloneza
SarbaSlovenaSpaniolaSuedezaTurcaUcraineana

BiografiaBiologiaBotanicaChimicaComputerComunicazioneCostruzioneDiritto
EducazioneElettronicaFisicaGeografiaGiochiGrammaticaIngegneriaLetteratura
LibriMarketingMatematicaMedicinaMusicaNutrizionePsicologiaRicette
SociologiaStoriaVarie

TESINA DI SISTEMI

computer



+ Font mai mare | - Font mai mic



DOCUMENTE SIMILARE



TESINA DI

SISTEMI

1.0 – LA PROGRAMMAZIONE IN C

A – Origini del linguaggio di programmazione C

Nel 1963, in Inghilterra, durante un progetto che coinvolgeva ricercatori di Cambridge e dell'UniversitÀ di Londra, fu sviluppato un linguaggio chiamato CPL, cioÈ ``Combined Programming Language''. CPL era basato su Algol 60, uno dei primi linguaggi di programmazione moderni ben definiti. Quattro anni piÙ tardi, nel 1967, un programmatore di Cambridge, Martin Richards, creÒ BCPL, ``Basic CPL'' e BCPL diede origine a un altro linguaggio, che divenne noto con la singola lettera B. Il linguaggio B fu ripreso ai Laboratori Bell, dove Ken Thompson e Dennis M. Ritchie lo modificarono e lo ridenominarono NB. All'inizio degli anni '70, Thompson utilizzÒ NB per riscrivere la parte basilare di Unix per la seconda edizione. Poco tempo dopo, a partire dall'NB, Ritchie sviluppÒ il C, che divenne presto il linguaggio per scrivere nuove utility e applicazioni oltre al Sistema Operativo. Questo nuovo linguaggio, oltre ad essere ad alto livello e strutturato, offriva costruttivi che permettevano di manipolare i bit e i byte e di interagire direttamente con l'hardware. Concepire un linguaggio di programmazione completamente nuovo non avrebbe permesso di avvalersi direttamente dei pregi dell'esistente e non avrebbe garantito il superamento di tutti i difetti; inoltre avrebbe richiesto molto piÙ tempo.

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 632
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved