Scarica Fondamenti di informatica e più Appunti in PDF di Fondamenti di informatica solo su Docsity! I vari tipi di variabili: ogni tipo ha un proprio spazio di memoria e modalità di rappresentazione dell’informazione. Int (numeri interi con segno): short, long, unsigned Int (%d), short (%hd), unsigned int (%u), unsigned short (%hu), long (%ld), unsigned long (%ld); Tipo razionale: float o double (razionali con segno) float<double<long double Float (%f), double (%lf) Tipo di carattere: char (simboli nella tabella ASCII) (%c); costanti : #define nome n, const int char n; enumerativi: consente di elencare una sequenza di valori simbolici che una variabile puo assumere; enum (LUN,MAR,MER,GIO,VEN,SAB,DOM}giorno; si può usare negli assegnamenti e nelle istruzioni dei cicli. Ridefinizione di tipo: ridefinisce una tipo di dato con un nome nuovo -> typedef <vecchio.tipo><nuovo.tipo> prima del main. Conversione di tipo (casting): regole automatiche di conversione: int<long<unsigned long<long long<float<double<long double Array: consente di memorizzare serie di dati dello stesso tipo Array di carattere: char nome[], char str[4]=”tre”; affinchè un array sia trattato come una stringa al suo interno ci deve essere un carattere ‘\0’ detto terminatore. Per l’assegnamento caratteri tra “” e solo i fase di inizializzazione con strcopy(<nome>,”…”) posso assegnarlo dopo. Per leggere e scrivere stringhe si usa /s char nome[] Matrice: array multidimensionale Struct: tipo strutturato, memorizza una colleziome di elementi di diverso tipo. Funzioni : strlen(s), strcmp(s1,s2), strcopy(s1,s2); Per dichiarare una funzione: int fattoriale(int n){…return tot}, per usare una funzione serve dichiarare il prototipo nella zona di definizione. Prototipo: int fattoriale (int), definisce il nome della funzione, il parametro di ritorno, e i parametri di input; passaggio di parametri: altro tipo di dato per manipolizzare indirizzi di memoria delle variabili sono i puntatori. Il nome della variabile indica il contenuto nella cella di memoria. (&) permette di ottenere l’indirizzo di memoria della prima parola dell’area di memoria associata alla variabile. Una variabile di tipo puntatore, contiene un indirizzo di memoria. Passaggio per valore: se il tipo di parametro è <tipo>. Il parametro formale è di tipo <tipo>, il valore del parametro attuale è copiato nel parametro formale e la funzione usa/modifica l’area di memoria del parametro formale. (senza effetto su quello attuale) Passaggio per riferimento (o indirizzo): se il tipo del parametro è <tipo> il parametro formale è di tipo <tipo>*, l’indirizzo del parametro attuale è copiato nel parametro formale e la funzione usa/modifica l’area di memoria associata al parametro formale (con effetto su quello attuale) Chiamata funzione: r=f(v1,v1,…,&vr,&vr2,…); parametri di tipo struct passati per valore: il contenuto del parametro attuale è copiato nel parametro formale e si può modificare dal record di attivazione. Parametri di tipo struct passati per riferimento: viene copiato l’indirizzo di memoria del parametro attuale nel record di attivazione di quello formale e quindi la funzione. Le funzioni possono ritornare puntatori: sempre sbagliato ritornare un puntatore a una variabile locale ad una funzione (record di attivazione viene rimosso) sempre possibile ritornare la costante NULL; sempre possibile ritornare un puntatore ad un elemento presente nel chiamante. Ricorsione: richiama se stesso. Se un parametro di una funzione ricorsiva è di tipo puntatore, ogni chiamata alla funzione puo modificare la stessa istanza di variabile. Booleani: 0 falso, 1 vero; Memoria dinamica: allocare la quantità di memoria necessaria (calloc, malloc, realloc) e poi rilasciare la memoria precedentemente allocata (free). Dopo aver allocato una memoria devo sempre rilasciarla con free e allocarla nuovamente a NULL; Calloc: void *callocl(int num_elem,int dim_elem); restituisce dei puntatori alla memoria allocate o ritorna NULL se non riesce ad allocare la quantità di memoria richiesta. Es: t_ricevuta *u u=(t_ricevuta*) calloc(10, sizeof(t_ricevuta)); Malloc: void *malloc(int dim_totale); mi da la memoria totale e quindi poi posso inizializzare gli elementi; Realloc: void *realloc(void *ptr, int dim_totale); modifica la dimensione di un blocco di memoria puntato da ptr a dim_ totale bytes e copia il contenuto (tutto o una parte) puntato da ptr nella nuova area di memoria; realloc per aggiungere int *u= (int*) realloc (u, (n_elem+1)*seizeof(int)); n_elem=n_elem+1 per togliere int *u= (int*) realloc (u, (n_elem-1)*seizeof(int)); n_elem=n_elem-1 conversione numeri: conversione da base B a base B’ con B<B’ 1) applicare definizione posizionale di numero 2) somma+base B’ es: B=3 B’=5 213= 2 x 31+51 x 30= 115+15=125 conversione da base B a base B’ con B>B’ 1) applicare definizione posizinale di numero 2)calcolare i resti della divisione intera per B’. (cn-1cn-2…c0)=cn-1 x Bn-1 + cn-2 x Bn-2 + … + c1 x B1 + c0 x B0 = (cm-1 cm-2 … c0)B’ es: 38:5->3. 7:5->2. 1:5->1. 123 es: 19:2->1. 9:2->1. 4:2->0. 2:2->0. 1:2=1. 10011 Moltiplicare un numero per la base di riferimento → aggiunta di uno 0 a destra Dividere per la base di riferimento → troncamento di una cifra a destra Bit di segno (il primo bit non ha valore numerico): Il primo bit a sinistra rappresenta il segno del numero (bit di segno), i bit rimanenti rappresentano il valore ● 0 per il segno positivo, 1 per il segno negativo. Complemento a 2: Il primo bit a sinistra ha peso negativo, mentre tutti gli altri bit hanno peso positivo La sequenza di bit: (cn-1 cn-2 ... c0)C2 = -cn-1⋅2n-1 + cn-2⋅2n-2 + ... + c1⋅21+ c0⋅20 Dato un numero N in binario, calcolare il suo opposto -N 1) Invertire tutti i bit 2)Sommare 1 Es: 0110c2 = -0⋅23 + 1⋅22 + 1⋅21 + 0⋅20 = 610. ● Per calcolare -610 1) Inverto 0110c2 → 1001 2) (1001 + 1)c2 1001 + 1= 1010c2 → -1⋅23 + 0⋅22 + 1⋅21 + 0⋅20 = (-8 + 2)10 = -610 Se D10 ≥ 0: ● Converti D10 in binario naturale. ● Aggiungi 0 a sinistra Se D10 < 0: ● Trascura il segno e converti D10 in binario naturale. ● Premetti il bit 0 alla sequenza di bit ottenuta ● Calcola l’opposto del numero così ottenuto, secondo la procedura di inversione in C2 Es: ● 5710 = 1110012 = 0111001c2 ● -5710 = (0111001 + 1)c2 = (1000110 + 1)c2 = 1000111c2 M>0 bit per la mantissa m E>0 per l’esponente e Es 1). m = 112 ed e = 0112. n = 0,112 ✕ 2011 = (2-1+2-2) ✕ 2011 = 610 2) m = 112 ed e = 1111112. n = 0,112 ✕ 2111111= (2-1+2-2) ✕ 2111111 = 0,75 ✕ 263 3) m = 112 ed e = 12. n = 0,112 ✕ 21 = (2-1+2-2) ✕ 21 = 0,75 ✕ 21