Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Linguaggio C, Informatica B, Appunti di Informatica Per Aerospaziali

Parte di C di informatica B, corso accademico 24/25

Tipologia: Appunti

2024/2025

Caricato il 09/04/2026

kendi-bega
kendi-bega 🇮🇹

2 documenti

1 / 19

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
INFORMATICA B
Informatica = la disciplina che si occupa di rappresentare ed elaborare l’informazione, che può essere riguardo l’età, esami, dati di
temperatura, o di qualsiasi altro tipo.
Information Technology = incorpora, oltre all’informatica, gli aspetti hardware e di comunicazione.
I primi calcolatori (macchine di calcolo) hanno avuto inizio nell’800, ma nel ‘900, per scopi bellici sono nati i calcolatori
programmabili, cioè quelli che non hanno un compito prefissato, su cui ci si può costruire programmi.
Il primo calcolatore programmabile è stato l’ENIAC, che occupava un’intera stanza e aveva una capacità di calcolo e di memoria
altamente già superata al giorno d’oggi. Esso era costituito da componenti che si danneggiavano quotidianamente e l’attività di
programmazione era molto fisica (si spostavano cavi).
Il computer di Dadda (1954) è stato il primo computer arrivato in Europa (UK già avanzata).
Al giorno d’oggi i dispositivi elettronici sono diventati di uso quotidiano, difatti si parla di un fenomeno definito come Internet
delle cose, cioè quella rete di dispositivi fisici dotati di sensori, software e connettività di rete, che permettono loro di raccogliere
ed esprimere informazioni scambiandole con altri dispositivi. Un esempio di IoT è il cloud.
Definizioni
Informatica = studio sistematico degli algoritmi che descrivono e trasformano l’informazione
si occupa della teoria, dell’analisi, della progettazione, della realizzazione, dell’applicazione, della verifica di
efficienza e di correttezza degli algoritmi.
Algoritmo = sequenza di passi che portano alla realizzazione di un compito, ad esempio: istruzioni di montaggio di uno scaffale.
Esecutore = ciò che deve essere in grado di comprendere ed eseguire un algoritmo.
Calcolatore = ciò che è in grado di eseguire algoritmi descritti in linguaggio macchina (sequenza di 0 e 1).
Ovviamente ci deve essere una corrispondenza tra sequenza di cifre e operazioni, convenzionata quando il calcolatore è stato
costruito.
Linguaggio macchina = insieme di istruzioni (sequenza di bit) che il calcolatore può eseguire.
Programma = compilatore in grado di operare delle trasformazioni da un linguaggio più vicino a noi al linguaggio macchina.
= algoritmo descritto in un linguaggio comprensibile dal calcolatore.
Compilatore = mediatore tra un programma scritto in un linguaggio di alto livello e il programma in linguaggio macchina.
ci permette di arrivare a un programma comprensibile al calcolatore.
N.B il compilatore è esso stesso un programma eseguito dal calcolatore.
L’i n te rp r et e = d u ra nt e l ’e s ec uz i on e, le gg e o gn i i st r uz io n e e l a t ra du c e in co ma n di i n l in g ua gg i o ma c ch in a p er il c a lc ol a to re .
il programma viene trasformato in linguaggio macchina durante l’esecuzione, invece di farlo prima.
Ambienti di programmazione = forniscono gli strumenti a supporto della programmazione.
offrono editor per scrivere i programmi, compilatori per creare codici oggetto per ogni parte del
programma.
Debugger = componente che permette di capire come si comporta il programma durante la sua esecuzione. Utile durante un errore
del programma.
Struttura del calcolatore (modello di Von Neumann)
Un calcolatore è costituito da:
- Unità di elaborazione\processore\CPU è il cuore del calcolatore che esegue le singole istruzioni
- Memoria centrale\Random access memory\RAM che memorizza le informazioni su cui sto lavorando (utile per
recuperare dati e immagazzinarli). È come se fosse un insieme di celle a cui si può accedere direttamente
- Bus, elemento di collegamento tra unità di elaborazione e memoria centrale
- Interfacce periferiche, permettono il collegamento con l’ambiente esterno (di input o di output)
- Periferiche come tastiera, mouse, telecamera, hanno ciascuna una specifica interfaccia che le collegano al bus
- Unità di memorizzazione di massa\HDD\hard disk, luogo dove vengono memorizzate e conservate grandi quantità di
dati. Si tratta di una periferica che salva i dati a lungo termine.
La CPU dice alla RAM di darle un dato che si trova in una specifica cella e lei è in grado di accedere a qualsiasi cella senza
nessun vincolo.
SSD: solid state disk, tecnologia relativamente nuova che rende gli HDD veloci.
La capacità di memorizzazione viene espressa attraverso i byte.
4,5 GHz è la frequenza di lavoro della CPU.
Il Bluetooth e WIFI sono rete di comunicazioni.
Ls scheda grafica è una periferica di output, al giorno d’oggi sono dei piccoli calcolatori.
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13

Anteprima parziale del testo

Scarica Linguaggio C, Informatica B e più Appunti in PDF di Informatica Per Aerospaziali solo su Docsity!

INFORMATICA B

Informatica = la disciplina che si occupa di rappresentare ed elaborare l’informazione, che può essere riguardo l’età, esami, dati di temperatura, o di qualsiasi altro tipo. Information Technology = incorpora, oltre all’informatica, gli aspetti hardware e di comunicazione. I primi calcolatori (macchine di calcolo) hanno avuto inizio nell’800, ma nel ‘900, per scopi bellici sono nati i calcolatori programmabili, cioè quelli che non hanno un compito prefissato, su cui ci si può costruire programmi. Il primo calcolatore programmabile è stato l’ENIAC, che occupava un’intera stanza e aveva una capacità di calcolo e di memoria altamente già superata al giorno d’oggi. Esso era costituito da componenti che si danneggiavano quotidianamente e l’attività di programmazione era molto fisica (si spostavano cavi). Il computer di Dadda (1954) è stato il primo computer arrivato in Europa (UK già avanzata). Al giorno d’oggi i dispositivi elettronici sono diventati di uso quotidiano, difatti si parla di un fenomeno definito come Internet delle cose, cioè quella rete di dispositivi fisici dotati di sensori, software e connettività di rete, che permettono loro di raccogliere ed esprimere informazioni scambiandole con altri dispositivi. Un esempio di IoT è il cloud. Definizioni Informatica = studio sistematico degli algoritmi che descrivono e trasformano l’informazione si occupa della teoria, dell’analisi, della progettazione, della realizzazione, dell’applicazione, della verifica di efficienza e di correttezza degli algoritmi. Algoritmo = sequenza di passi che portano alla realizzazione di un compito, ad esempio: istruzioni di montaggio di uno scaffale. Esecutore = ciò che deve essere in grado di comprendere ed eseguire un algoritmo. Calcolatore = ciò che è in grado di eseguire algoritmi descritti in linguaggio macchina (sequenza di 0 e 1). Ovviamente ci deve essere una corrispondenza tra sequenza di cifre e operazioni, convenzionata quando il calcolatore è stato costruito. Linguaggio macchina = insieme di istruzioni (sequenza di bit) che il calcolatore può eseguire. Programma = compilatore in grado di operare delle trasformazioni da un linguaggio più vicino a noi al linguaggio macchina. = algoritmo descritto in un linguaggio comprensibile dal calcolatore. Compilatore = mediatore tra un programma scritto in un linguaggio di alto livello e il programma in linguaggio macchina. ci permette di arrivare a un programma comprensibile al calcolatore. N.B il compilatore è esso stesso un programma eseguito dal calcolatore. L’interprete = durante l’esecuzione, legge ogni istruzione e la traduce in comandi in linguaggio macchina per il calcolatore. il programma viene trasformato in linguaggio macchina durante l’esecuzione, invece di farlo prima. Ambienti di programmazione = forniscono gli strumenti a supporto della programmazione. offrono editor per scrivere i programmi, compilatori per creare codici oggetto per ogni parte del programma. Debugger = componente che permette di capire come si comporta il programma durante la sua esecuzione. Utile durante un errore del programma. Struttura del calcolatore (modello di Von Neumann) Un calcolatore è costituito da:

  • Unità di elaborazione\processore\CPU è il cuore del calcolatore che esegue le singole istruzioni
  • Memoria centrale\Random access memory\RAM che memorizza le informazioni su cui sto lavorando (utile per recuperare dati e immagazzinarli). È come se fosse un insieme di celle a cui si può accedere direttamente
  • Bus, elemento di collegamento tra unità di elaborazione e memoria centrale
  • Interfacce periferiche, permettono il collegamento con l’ambiente esterno (di input o di output)
  • Periferiche come tastiera, mouse, telecamera, hanno ciascuna una specifica interfaccia che le collegano al bus
  • Unità di memorizzazione di massa\HDD\hard disk, luogo dove vengono memorizzate e conservate grandi quantità di dati. Si tratta di una periferica che salva i dati a lungo termine. La CPU dice alla RAM di darle un dato che si trova in una specifica cella e lei è in grado di accedere a qualsiasi cella senza nessun vincolo. SSD: solid state disk, tecnologia relativamente nuova che rende gli HDD veloci. La capacità di memorizzazione viene espressa attraverso i byte. 4,5 GHz è la frequenza di lavoro della CPU. Il Bluetooth e WIFI sono rete di comunicazioni. Ls scheda grafica è una periferica di output, al giorno d’oggi sono dei piccoli calcolatori.

MEMORIA CENTRALE

  • Si può vedere come una sequenza di celle, ciascuna delle quali contiene una sequenza di cifre binarie che rappresentano un’informazione (ad esempio un numero).
  • Il numero di bit di una cella è fissato, tutte le celle di una memoria hanno la stessa dimensione.
  • In generale il numero di bit che si può inserire in una cella di memoria è una potenza di due.
  • Al giorno d’oggi ogni cella può avere una dimensione di 64 bit.
  • La parola è il numero di bit di una cella, che è un multiplo del byte.
  • Ogni cella può essere identificata dal suo indirizzo. La CPU può specificare l’indirizzo di una cella per andare a prelevare o inserire dati da tale cella.
  • Si tratta di una memoria volatile, se non alimentata elettricamente viene cancellata.
  • Rispetto alla memoria utilizzata per i dischi (che è persistente) è una memoria ad accesso più veloce ma anche più costosa. 0 1023 UNITÀ DI ELABORAZIONE Elementi attivi:
  • ALU = elemento che fa i calcoli
  • CU = coordinatrice che determina il funzionamento della CPU \ da i comandi per attivare le 3 fasi di esecuzione.
  • Clock = emette un segnale periodico costante, dà il ritmo alla CPU, che a ogni periodo del clock completa un’operazione (2,9 GHz). Elementi passivi:
  • Registri = servono per immagazzinare le informazioni strettamente necessarie per l’esecuzione dell’operazione corrente.
  • AR e DR = servono a interagire con altri elementi del calcolatore. Sono direttamente collegati al Bus,
  • AR = immagazzina indirizzi, viene specificato l’indirizzo di un dato che si trova in memoria
  • DR = contiene dati
  • PC = sorta di segnalibro che tiene traccia della successiva istruzione da eseguire (situata in una cella della RAM).
  • CIR = registro che contiene l’istruzione che la CPU svolge in quel particolare momento.
  • INTR = registro in cui le periferiche possono indicare, modificare il registro stesso per indicare un cambiamento del proprio stato. Le periferiche hanno un loro comportamento, non sincronizzato con il calcolatore, perciò, è necessario introdurre dei meccanismi che consentano alle periferiche di avvisare la CPU quando si ha un nuovo dato.
  • SR = tramite tra bus interno e ALU, permette di sapere come è andato l’ultimo calcolo eseguito dalla ALU.
  • A – B = registri operandi che contengono gli operandi e il risultato che la ALU svolge. Le linee orizzontali e verticali rappresentano un bus interno alla CPU. Un registro e una cella di memoria possono contenere un solo dato alla volta, cioè una sequenza di bit. Cambiare 1 bit = cambiare dato.

In questo esempio servono 10 bit per rappresentare gli indirizzi di tutte le celle disponibili: 210 = 1024 (una kiloparola)

Se si ha una limitazione riguardo al numero di bit e si vuole lavorare con dati che occuperebbero più bit come si fa? Vi è proprio una scienza del calcolo numerico che si occupa di decomporre la rappresentazione del numero e del calcolo in modo tale che sia gestibile. ISTRUZIONI ESEGUIBILI DALLA CPU

  • Leggere da una periferica e scrivere su una periferica
  • Scambiare informazioni con la RAM (caricare in uno dei registri della CPU un dato presente nella RAM \ immagazzinare nella RAM un dato presente in un registro della CPU))
  • Svolgere operazioni aritmetiche (le ALU offre le operazioni)
  • Istruzioni di salto che ci permettono di costruire programmi più sofisticati Tali serie di istruzioni possibili dovranno essere codificate nel calcolatore come sequenze di bit: 0100000000001000 010000 0000001000 Codice operativo Operando In una macchina semplice utilizziamo l’istruzione come unico operando (in una più complessa possiamo avere più operandi). Perciò, durante la decodifica la CU controllerà il codice operativo per capire a quale istruzione corrisponda. Operando = dato su cui si lavora, l’indirizzo di memoria del calcolatore. Per far sì che l’esecuzione di un’istruzione avvenga:
  • Il programma deve trovarsi nella memoria centrale (a ciò si occupa il sistema operativo) e deve essere già disponibile in un linguaggio macchina
  • Ogni istruzione è memorizzata in una cella (in una variabile)
  • Altre celle sono disponibili per immagazzinare i dati
  • La CPU deve essere pronta a eseguire il programma (il sistema operativo gioca un ruolo importante)

ESEMPIO con operazione aritmetica Innanzitutto, dobbiamo acquisire i dati da una periferica, essi vengono messi nella RAM, poi dovremmo prenderli e metterli nei registri operandi della CPU. Infine, potremmo fare l’operazione di somma.

Acquisizione primo numero

  1. Fase fetch Premessa - -> l’indirizzo della prima istruzione viene messo in PC (program counter) dal sistema operativo. La CU comanda la fase, che consiste nel portare il valore che si trova nel program counter alla AR, poi la CU manda alla RAM il comando “ load ”. La RAM vede passare sul bus indirizzi questa cella e riconosce il comando load. Perciò fornisce la sequenza di bit che vede nell’indirizzo (0000) alla DR della CPU tramite il bus dati. La CU, infine, invia la sequenza di bit alla CIR. La fase di fetch si conclude quando il componente sommatore aggiunge un 1 al valore del program counter, in modo tale che la prossima istruzione da eseguire sia quella immediatamente seguente.
  2. Fase decodifica La CU prende il codice operativo dell’istruzione e riconosce l’operazione definita come “acquisizione dati da periferica”. Perciò, la CU saprà che dovrà occuparsi di coordinare i passaggi necessari per acquisire un dato dalla periferica e memorizzarlo nell’indirizzo della memoria che corrisponde all’operando dell’istruzione.
  3. Fase di esecuzione Supponiamo che la periferica sia già pronta e abbia la sequenza di bit nella PDR. La CU manda attraverso il bus control il comando alla periferica per acquisire il dato, che verrà trasferito in DR. La CU fa si che l’adress registrer abbia l’indirizzo giusto. Poi, trasferisce il dato alla memoria tramite l’operazione di “ store ”. Successivamente per acquisire il secondo numero avviene la stessa cosa (sempre con l’incremento di 1 della sequenza del program counter). Infine, avviene la somma dei due numeri acquisiti, essa non ha bisogno di un indirizzo.

Il linguaggio C

  • Rispetto al linguaggio macchina, offre la possibilità di scrivere i programmi in modo più semplice e vicino al modo umano.
  • Gli elementi del programma (celle di memoria, istruzioni) sono associati a simboli --> vengono definiti VARIABILI.
  • Le istruzioni sono espresse in modo più vicino al linguaggio naturale e, nel mentre, consente di sviluppare programmi eseguibili dal calcolatore (la traduzione è automatica).
  • Molto utilizzato nell’industria (se si ha un problema si può controllare su stackoverflow.com) La macchina astratta esecutrice di programmi in C Standard input e output: insieme di celle su cui posso memorizzare i dati che vengono gestite come una coda. Il primo dato inserito nella coda sarà quello che verrà prelevato e inserito nella memoria centrale (e così via di seguito gli altri dati). Le celle di memoria possono essere di vario tipo (vi sono vari tipi di variabili). LE ISTRUZIONI
  • Scrittura su standard output e lettura da standard input
  • Operazioni aritmetico/logiche eseguite sui dati in memoria (non vi è la preoccupazione dei registri)
  • Assegnamento del risultato di un’espressione a una variabile ( perimetro = base * altezza )
  • Istruzioni composte che cambiano il flusso di controllo che sono i cicli e le istruzioni di selezione
  1. Dichiarazione di variabili utilizzate nel programma, specificandone il tipo (int = intero) Lo si fa per spiegare come farà la macchina a codificare la variabile, visto che vi sono diversi tipi di variabili. Il tipo di variabile determinerà anche quante celle di memoria fisica saranno necessarie per contenere tale variabile
  2. Operazione di acquisizione dati da periferica: scanf( “%d”, &primo); “%d” : stringa di controllo racchiusa da doppi apici che indica il tipo di dato da acquisire (in questo caso il dato da leggere da standard input deve essere di tipo intero). &primo : variabile che ospita il dato. & : operatore che indica l’indirizzo della memoria fisica su cui si troverà la variabile primo, cioè nell’indirizzo di primo.
  3. Operazione di somma: il risultato dell’espressione “primo + secondo” verrà assegnato a somma
  4. Operazione di stampa: printf( “%d”, somma); La printf non ha bisogno dell’indirizzo di quella variabile, ma deve semplicemente conoscere il valore. In caso aggiungessimo & nella printf verrebbe stampato l’indirizzo.

Obblighi sintattici: #include : libreria che contiene un insieme di programmi/funzioni che noi possiamo utilizzare (standard input e output). int main ( ) int : il programma restituisce attraverso il sistema operativo un valore intero, cioè lo 0 (return 0) se non vi sono errori. main : parola chiave con che indica l’inizio del programma ( ) : contengono parametri che il sistema operativo manderà in esecuzione (parte NON AFFRONTATA) { } : delimitano il blocco di istruzioni che costituisce il main, possono essere utilizzate per delimitare cicli o istruzioni di selezione ; : ogni istruzione deve essere conclusa dal punto e virgola Istruzioni di OUTPUT Stampa di una stringa (sequenza di caratteri)

  • printf(“ciao”); Stampa del valore di una variabile
  • printf(“%d”, s); Stampa del risultato di un’espressione
  • printf(“%d”, s+25); Stampa di singoli caratteri
  • printf(“%c”, ‘a’);
  • printf(“%c”, var); /* char var = ‘ciao’ ; */
  • printf(“Ciao %d %d” , secondo, primo) Istruzione di SELEZIONE – IF if (condizione) se la condizione è vera istruzione 1; esegui istruzione 1 else istruzione 2 ; altrimenti esegui istruzione 2 istruzione che segue l’if ; in ogni caso, esegui istruzione di if Esempi: #include Int main ( ) { int x, y, z; scanf(“%d”, &x); scanf(“%d”, &y); if (x>y) { z = x; } else { z = y; printf(“%d”, z); } return 0; } La ramificazione else è opzionale: int numero; printf(“ Inserisci numero: “); scanf(“%d”, &numero); if ( numero < 0) numero *= – 1; printf(“%d”, numero); Istruzioni di INPUT
  • scanf(“%c”, &b)
  • scanf(“%d %c”, &a &b) Esempio: somma di due numeri #include int main ( ) { int primo, secondo, risultato; printf(“Inserisci primo numero: ”); scanf(“%d”, &primo); printf( “Inserisci secondo numero: ”); scanf(“%d”, &secondo); printf(“%d + %d” = %d\n”, primo, secondo, primo + secondo); risultato = primo + secondo: printf(“Il risultato è %d”, risultato); return 0; } Se voglio far capire che i due valori sono uguali devo: #include int main ( ) { int x, y, z; scanf(“%d\n %d”, &x, &y); if (x > y) { /creo un blocco di istruzioni/ z = x; printf( “%d”, z); } else if ( x = = y) { printf(“ I due valori sono uguali”); } else z = y; printf(“%d”, z); return 0; }

Compito: Acquisisci da standard input una sequenza di 10 numeri e scrivi su standard output il valore massimo e minimo della sequenza. #include int main ( ) { int x, max, min, contatore; contatore = 0; while (contatore < 10) { printf(“Numero %d: ”, contatore + 1); scanf( “%d”, &x); if(contatore = =0) { max = x; /quando leggi primo numero, inizializza sia max che min con quel numero/ min = x; } else { if (x > max) { max = x; } if ( x < min) { min = x; } } contatore = contatore + 1; } printf(“valore massimo: %d\n, max); printf(“valore minimo: %d\n, min); return 0; } Le variabili Tipi di dato : insieme di valori ed insieme di operazioni applicabili ad esso. Ad esempio “tipo intero” significa fare riferimento a un insieme di valori caratterizzanti di questo tipo (intero) + un insieme di operazioni associate a questi valori. Ogni tipo di dato ha associata una rappresentazione nella memoria del calcolatore. Per ogni variabile in C è necessario specificare il tipo. Vantaggi:

  • Si conosce a priori l’insieme dei valori che possono essere assegnati a quella variabile
  • Il compilatore può determinare a priori la dimensione della variabile (il numero di celle necessarie nella memoria fisica)
  • Al caricamento in memoria del programma si può riservare lo spazio necessario per la variabile
  • Il compilatore può segnalare un uso scorretto della variabile Classificazione:
  1. IL TIPO INTERO Posso sapere quanti bit occupano le variabili Tipi predefiniti Tipi definiti dall’utente Tipi semplici int, char, float, … Tipo enumerativo Tipi strutturati - array, struct, …

Esempio di uso degli interi

  1. IL TIPO CARATTERE
    • I caratteri vengono rappresentati mediante la codifica ASCII
    • Ad ogni carattere è associato un numero
    • In C un carattere occupa 1 byte
    • È possibile applicare ai caratteri le stesse operazioni applicabili agli interi
    • Vi sono caratteri speciali: \ n = per andare a capo \ t = per spostare verso destra \ 0 = per determinare dove termina una stringa Esempi di uso dei caratteri: stampa carattere e codice ASCII #include int main( ) { char carattere; scanf(“%c”, &carattere); printf(“carattere %c con codice ASCII %d\n, carattere, carattere); printf(“carattere seguente %c con codice ASCII %d\n, carattere + 1, carattere + 1); return 0; } Crea un programma che legge una sequenza di caratteri terminata dal carattere ‘0’ e trasforma tutte le lettere alfabetiche minuscole nelle corrispondenti lettere maiuscole. #include int main( ) { char car; scanf(“%c”, &car); while(car != ‘z’) { if(car >= ‘a’ && car <= ‘b’) car = car – ‘a’ + ‘A’; /* la differenza tra car maiuscolo e car minuscolo è sempre pari a 32 */ printf(“%c”, car); scanf(“%c”, &car); } return 0; }

3. REALI – TIPO FLOAT

  • Sono rappresentati in modo approssimativo in base alla quantità di memoria che si può occupare float : occupa 4 byte, ha una precisione di 6 cifre decimali e valori nell’intervallo [ 1038 , 10-^38 ] double : occupa 8 byte, ha una precisione di 15 cifre decimali e valori nell’intervallo [ 10^308 , 10-^308 ] long double : occupa 16 byte, ha una precisione di 34 cifre decimali e valori nell’intervallo [ 10^4932 , 10-^4932 ] Reale in virgola fissa: 345. Reale in virgola mobile: 3.452336 x 10^2 Per esprimere in C una virgola mobile: LA TIPIZAZZIONE Assegnare un tipo alle variabili serve a verificare che esse vengano usate correttamente. In C sono eseguibili tutte le espressioni ed assegnamenti se tutte le variabili coinvolte hanno tipi compatibili. Regole di compatibilità : data l’espressione x (operatore) y
  • Se x ed y sono di tipi eterogenei, l’operando di tipo inferiore viene convertito temporaneamente al tipo superiore
  • int < long < unsigned int < unsigned long < float < double < long double
  • variabili char e short vengono sempre convertite in int
  • tali regole valgono anche per gli assegnamenti: 5.0/9 /* si effettua la divisione tra float */ LE COSTANTI Consente di usare simboli e non valori numerici nel programma, per renderlo più flessibile. #define --> #define MAX_NUM 10 GESTIONE BUFFER DI INPUT Quando uso tipi diversi è possibile riscontare problemi causati da come viene gestito il buffer di input:
  • “quando premo invio dopo aver inserito un valore, il tasto invio (\n) resta nel buffer di input” Ciò accade specialmente con la variabile “char” usato dopo le variabili “int” o “float”. A volte accade con la variabile “stringa” e con “fgets( )”. Soluzione:
  • aggiungere lo spazio prima di %c --> scanf(“ %c”, &indirizzo)
  • usare getchar ( ) per pulire il buffer --> getchar( ); scanf(“%c”, &indirizzo) LE RIDEFINIZIONI DI TIPO Possibilità di ridefinire un tipo a partire da un vecchio tipo, ad esempio posso prendere il tipo intero e utilizzarne la struttura per definirne uno nuovo con le sue stesse caratteristiche. Utile quando si costruisce un programma in cui vi sono tipi di informazioni, magari tutti interi, ma rappresentano cose diverse.
  • typedef int colore;
  • colore col;
  1. IL TIPO ENUMERATIVO Si elencano esplicitamente tutti i valori numerabili appartenenti al tipo.
  • typedef enum {lunedì, martedì, mercoledì, giovedì, venerdì, sabato, domenica} giorniSettimana;
  • typedef enum {false, true} boolean; Il compilatore associa ai valori di un tipo enumerativo un corrispondente valore intero (lunedì = 0, martedì = 1, mercoledì = 2, …) Perciò, è possibile applicare tutte le operazioni definite per gli interi secondo una relazione di precedenza definita dall’ordine di enumerazione dei valori.

Esempio:

  1. I TIPI STRUTTURATI Tipi i cui dati sono ottenuti dall’aggregazione di altri dati, come ad esempio può essere un archivio di informazioni su studenti. In C i tipi strutturati vengono definiti dal programmatore sfruttando tre costruttori di tipo:
    • array
    • struct
    • union (non affrontate) 5.1. GLI ARRAY § Un array è una sorta di cassettiera di cui si possono aprire i cassetti e inserire contenuti informativi, e dove i singoli cassetti possono contenere un'unica informazione alla volta. § Le celle dell’array (i cassetti) devono contenere informazioni omogenee; ad esempio, posso definire un array di interi dove ogni cella avrà un’informazione di tipo intero. § Ogni cella di array è accessibile indicandone il numero d’ordine. Dichiarazione di un array: § La sua dimensione è fissata nel momento di dichiarazione e non è modificabile durante l’esecuzione del programma. § Di solito la sua dimensione (numero di celle) viene definita come un valore numerico o una costante. § typedef <[dimensione di array]> Esempio: acquisizione di una sequenza di interi e stampa in ordine inverso #include #define MAX_NUM 10 /* dichiarazione di costante */ typedef int sequenza [MAX_NUM]; /*definizione di tipo */ 1. int main ( ) { int i; sequenza seq; /* dichiarazione di variabile array */ printf (“ Inserisci %d numeri interi\n”, MAX_NUM); /* acquisizione dei dati */ 2. i = 0; while (i < MAX_NUM) { scanf ( %d, &seq[ i ]) ; i++; } 3. printf (“Stampa dei numeri in ordine inverso: ”); /* stampa in ordine inverso */ MAX_NUM - 1 i - - ; 4. while ( i>= 0 ) { printf ( “%d”, seq[ i ]) ; i - - ; } printf (“\n”); return 0; }
    1. ho dichiarato il tipo sequenza che è un array di 10 interi
    2. (“ Inserisci %d numeri interi\n”, MAX_NUM) ” = inserisci 10 numeri interi
    3. &seq[ i ] ”= indirizzo di una cella di memoria della variabile seq
    4. Senza “ i- - ” prima del ciclo “ while ” il programma proverrebbe a leggere “ seq[10] ” e saremmo in una condizione di overflow. Potremmo scrivere anche “ i = MAX_NUM – 1 ”.

ATTENZIONE:

Riempimento di un array – PROBLEMA delle celle vuote #include #define MAX_NUM 10 typedef int sequenza [MAX_NUM]; int main ( ) { sequenza array1; sequenza array2; int i; int j = 0; printf(“Inserisci %d numeri\n”, MAX_NUM); for(i = 0; i < MAX_NUM; i++) { scanf(“%d”, &array1[i]); if( array1[i]%2= =0) { array2[j] = array 1 [i]; j++; } } for (i=0; i MAX_NUM_CHAR+1] Esempio: individuare le sottosequenze “ab”, “ae”, “ai”

Esempio 2: Scrivere un programma completo che acquisisce una stringa e verifica che sia una palindrome

  • Acquisizione di una frase con più parole

5.3. LE STRUCT

Contiene più informazioni eterogenee contemporaneamente