Raccolta di alcuni esercizi proposti nei temi d esame di Informatica 1 nell anno accademico 2000/01

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Raccolta di alcuni esercizi proposti nei temi d esame di Informatica 1 nell anno accademico 2000/01"

Transcript

1 Raccolta di alcuni esercizi proposti nei temi d esame di Informatica 1 nell anno accademico 2000/01 Esercizio 1 Simulare l esecuzione di ciascuna delle 5 chiamate a sottoprogrammi, limitandosi alla descrizione dei valori stampati tramite le printf. int vara = 100; int proc1(int); int proc2(int *); int proc3(int); void proc4(int, int*); main() { int varb=0, varc=50; /* situazione iniziale */ printf ("\n0) vara = %d, varb = %d, varc = %d ", vara, varb, varc); /* passo 1 */ varb = proc1(varc); printf ("\n1) vara = %d, varb = %d, varc = %d ", vara, varb, varc); /* passo 2 */ varb = proc2(&varc); printf ("\n2) vara = %d, varb = %d, varc = %d ", vara, varb, varc); /* passo 3 */ varb = proc3(varc); printf ("\n3) vara = %d, varb = %d, varc = %d ", vara, varb, varc); /* passo 4 */ varc = proc1(vara); printf ("\n4) vara = %d, varb = %d, varc = %d ", vara, varb, varc); int proc1(int par) { vara=vara+1; par = par - 10; return (par); int proc2(int *par) { *par = *par - 10; return (*par); int proc3(int par) { int vara; vara = par + 1; return (vara); 07/10/ :

2 Esercizio 2 Sia dato un vettore di strutture contenenti ciascuna la distanza tra due città A e B (inseriti dall utente). L utente inserisce il nome della città rispetto alla quale desidera conoscere la città più vicina, in base ai dati contenuti nell array di strutture. Visualizzare la città più vicina a quella specificata e la distanza tra le due città. #define N_CITTA 10 /* questa struttura contiene la distanza tra due citta' */ typedef struct { char cittaa[20]; char cittab[20]; int distanza; distanze; main() { distanze dati[n_citta]; /* vettore con le distanze tra varie citta */ char cercare[20]; /* nome della citta' da esaminare */ /* inserimento dei dati nell'array di strutture */ for (i=0;i<n_citta;i++) { printf("citta A [%d]:",i); scanf(" %s",dati[i].cittaa); printf("citta B [%d]:",i); scanf(" %s", dati[i].cittab); printf("distanza [%d]:",i); scanf(" %d", &dati[i].distanza); /* richiesta nome della citta' da esaminare */ printf("citta da esaminare :"); scanf(" %s", cercare); /* corpo del programma */ NOTA: Si supponga che le distanze non superino il valore Esercizio 3 Una lista circolare è una lista dinamica in cui l ultimo elemento punta al primo. Si scriva la procedura InvertiListaCirc che, ricevendo come parametro una lista circolare, la inverte senza creare un altra lista. Esercizio 4 Un Testo è rappresentato come un array di caratteri. Una Parola è rappresentata come un array di caratteri. Si scriva la funzione CercaParola che, ricevendo un Testo e una Parola come parametri, ricerca la Parola nel Testo: se la Parola viene trovata, ne restituisce la posizione (del primo carattere) nel Testo; in caso contrario viene restituito il valore 1. 07/10/ :

3 Esercizio 5 Il tipo ListaCifre, sotto definito, rappresenta un numero espresso in una base di numerazione b tramite una lista dinamica: ad esempio la sequenza rappresenta il numero duecentouno in base dieci e il numero dieci in base tre. Si realizzi la procedura DaDecimaleABase che costruisce la lista, passata per indirizzo, che rappresenta un numero decimale d in base b (si, utilizzi l intestazione sotto riportata). Due punti in più a chi fornisce una corretta soluzione ricorsiva. struct EL { int cifra; struct EL *prox; ; typedef struct EL ElemCifra; typedef ElemCifra *ListaCifre; void DaDecimaleABase (unsigned int d, unsigned int b, ListaCifre *ListPointer) { Esercizio 6 Spiegare i meccanismi della produzione di spazzatura (garbage) e dei riferimenti fluttuanti (dangling references) relativi alla programmazione tramite puntatori. Esercizio : 1 1: 1 1 2: : : : : : Nel triangolo di Tartaglia, ogni elemento (posto nella riga r e nella posizione p diversa da r e da 0) è dato dalla somma dei due elementi che occupano le posizioni p-1 e p sulla riga precedente (r-1). Per p=0 oppure p=r, l elemento è pari a 1. Si scriva la funzione Tartaglia che, ricevendo un parametro int riga e un parametro int posizione, calcola l elemento del triangolo di Tartaglia nella riga e nella posizione corrispondente. Ad esempio Tartaglia(2,0) restituisce 1, mentre Tartaglia(6,4) restituisce 15. Esercizio 8 Un Polinomio (di grado N) sia rappresentato da un array di N+1 float in cui ogni elemento rappresenta il coefficiente del termine il cui grado è dato dall indice dell elemento stesso. Un GrandePolinomio (di grado 2N) sia rappresentato da un array di 2N+1 float. Si scriva la funzione SommaPol che, ricevendo due Polinomi come parametri, restituisca un Polinomio dato dalla somma dei due Polinomi. Si scriva la funzione ProdottoPol che, ricevendo due Polinomi come parametri, restituisca un GrandePolinomio dato dal prodotto dei due Polinomi. Esercizio 9 Un Testo è rappresentato tramite una lista dinamica di caratteri. Una Parola è rappresentata da una lista dinamica di caratteri. Si scriva la funzione ricorsiva CercaParola che riceve un Testo e una Parola come parametri, cerca nel Testo i caratteri che costituiscono la Parola: i caratteri trovati possono anche essere separati da altri caratteri nel Testo, ma devono apparire nell ordine in cui appaiono nella Parola. La funzione deve restituire una lista di puntatori alle posizioni in cui i caratteri trovati appaiono nel Testo. Ad esempio, la parola botte nel testo vitroveretebenecolfruttodellaviteseneeviteretelabusonellavita si trova nelle posizioni indicate in grassetto, mentre la parola barile non si trova. 07/10/ :

4 Esercizio 10 Si consideri un file NOMI contenente dei record relativi all anagrafica di un certo numero di persone. I record all interno di tale file NON sono mantenuti ordinati rispetto al cognome. Vengono invece mantenute delle liste di record che raggruppano le anagrafiche relative alle persone che hanno il cognome che inizia con la stessa lettera. Ci saranno quindi tante liste di record quante sono le lettere dell alfabeto (considerare solo le maiuscole). Ogni record, quindi, oltre ai campi relativi all informazione vera e propria (cognome e nome), contiene un puntatore alla posizione assoluta nel file, del record successivo. L ultimo record di ciascuna lista contiene come posizione al record successivo il valore 1. Per sapere qual è il primo record di ogni lista, si ricorre a un secondo file, INDICE, che riporta per ogni lettera dell alfabeto, la posizione assoluta nel file NOMI del primo record della relativa lista. Se nel file NOMI non sono presenti anagrafiche relative a cognomi che iniziano con una certa lettera, il valore associato a tale campo per tale lettera sarà uguale a 1. Il file INDICE contiene sempre un record per ogni lettera. Sono date le strutture dei record dei due file: typedef struct { char lettera; long lista; rec_indice; typedef struct { char cognome[20]; char nome[20]; long succ; rec_nome; INDICE A 132 B -1 C 44 Z 0 NOMI ZULIANI CARLO -1 CRIPPA LUIGI 308 GIROLDI GIACOMO 352 ABATE FRANCO 660 CROTTA GIUSEPPE -1 MONTI MAURO 847 ANTERI PAOLO 2244 CROSIO ALDO 176 GUTTUSO IRENE -1 ROSSI GIOVANNI 1155 Nell esempio sopra riportato si vede come, partendo dal record relativo alla lettera C nel file INDICE, è possibile risalire al primo record del file NOMI associato a un cognome che inizia con la lettera C (CRIPPA, alla posizione 44) e da questo, tramite il proprio puntatore, ai successivi (CROSIO e CROTTA). Si scriva un programma che, richiesta all utente una lettera dell alfabeto (considerata sempre maiuscola) ricopi, utilizzando la struttura sopra esposta, i record del file NOMI che iniziano con quella lettera in una lista dinamica. Non è accettata la soluzione che legge il file sequenzialmente. Si descriva a parole cosa comporterebbe l inserimento nel file NOMI di una nuova anagrafica. Si ricerchi la soluzione che minimizza il numero di accessi ai file. Esercizio 11 Una Matrice (quadrata di ordine N) sia rappresentata da un array di N array di N float. Si scriva la funzione SommaMat che, ricevendo due Matrici come parametri, restituisca una Matrice data dalla somma delle due Matrici. Si scriva la funzione ProdottoMat che, ricevendo due Matrici come parametri, restituisca una Matrice data dal prodotto delle due Matrici. 07/10/ :

5 Esercizio 12 Simulare l'esecuzione di ciascuna delle 4 chiamate a sottoprogrammi, limitandosi alla descrizione dei valori stampati tramite le "printf". int X = 60; int p1(int); int p2(int *); int p3(int); main() { /* situazione iniziale */ int Y = 0, Z = 30; printf ("\n0) X = %d, Y = %d, Z = %d ", X, Y, Z); /* passo 1 */ X = p1(z); printf ("\n1) X = %d, Y = %d, Z = %d ", X, Y, Z); /* passo 2 */ Y = p2(&z); printf ("\n2) X = %d, Y = %d, Z = %d ", X, Y, Z); /* passo 3 */ Y = p3(z); printf ("\n4) X = %d, Y = %d, Z = %d ", X, Y, Z); /* passo 4 */ Y = p2(&y); printf ("\n5) X = %d, Y = %d, Z = %d ", X, Y, Z); int p1(int par) { par = par - 10; return (par); int p2(int *par) { X = *par; *par = *par - 5; return (X); int p3(int par) { int X; X = par + 1; printf("\n3) X = %d", ); return (X); Esercizio 13 Un singolo elemento di una ListaDinamica è costituito da un campo Info, contenente un carattere, e un campo Punt contenente il puntatore al successivo elemento (non sono contenuti puntatori a elementi precedenti). Scrivere una procedura InvertiDopoAster che scandisce la lista alla ricerca dell elemento il cui campo Info è il carattere * e inverte tra loro i due elementi successivi nella Lista stessa senza modificare il campo Info di alcun elemento. 07/10/ :

6 Esercizio 14 Simulare l'esecuzione di ciascuna delle 4 chiamate a sottoprogrammi, limitandosi alla descrizione dei valori stampati tramite le "printf". int vara = 12, varb = 25; int proc1(int *par) { *par = *par - 7; return (23); proc2(int *varx, int vary) { int varb; *varx = vary; varb = *varx + vary; int proc3(int vara) { int varz = 17; vara = vara + varz return (vara); main() { int varc = 63; /* situazione iniziale */ printf ("\n0) vara = %d, varb = %d, varc = %d ", vara, varb, varc); /* passo 1 */ varc = proc1(&vara); printf ("\n1) vara = %d, varb = %d, varc = %d ", vara, varb, varc); /* passo 2 */ proc2(&vara, varc); printf ("\n2) vara = %d, varb = %d, varc = %d ", vara, varb, varc); /* passo 3 */ varb = proc3(varc); printf ("\n3) vara = %d, varb = %d, varc = %d ", vara, varb, varc); /* passo 4 */ varb = proc1(&varb); printf ("\n4) vara = %d, varb = %d, varc = %d ", vara, varb, varc); Esercizio 15 Un singolo elemento di una ListaDinamica è costituito da un campo Info, contenente un dato numerico, e un campo Punt contenente il puntatore al successivo elemento (non sono contenuti puntatori a elementi precedenti). Si scriva la procedura ricorsiva InvertiLista che, ricevendo come parametro una Lis adinamica, t la inverte senza creare un altra lista, restituendo il puntatore alla lista invertita. 07/10/ :

7 Esercizio 16 Scrivere un programma C che esegua la seguente funzionalità. Si legge da tastiera una sequenza di n interi positivi (massimo 100 numeri; la sequenza termina quando l'utente inserisce il numero 0); dopo avere letto tutti i numeri, per ogni numero letto viene stampato, ogni volta su una riga diversa e da sinistra verso destra, un numero di asterischi pari al numero in questione. Esempio di funzionamento del programma: Inserisci numero (0 per terminare): 3 Inserisci numero (0 per terminare): 6 Inserisci numero (0 per terminare): 3 Inserisci numero (0 per terminare): 5 Inserisci numero (0 per terminare): 0 *** ****** *** ***** #include <stdio.h> #define MAX_NUM 100 main(){ unsigned int dati[max_num], dato_corr; int i, j, n_dati; n_dati = 0; do { printf("inserisci numero (0 per terminare): "); scanf("%u", &dato_corr); if (dato_corr!= 0) { dati[n_dati] = dato_corr; n_dati++; while (dato_corr!= 0 && n_dati < MAX_NUM); for( i=0 ; i<n_dati ; i++ ){ for( j=0 ; j<dati[i] ; j++ ){ printf("*"); printf("\n"); 07/10/ :

8 Esercizio 17 Definire un tipo di dati che contiene le informazioni riguardanti un esame sostenuto da un qualunque studente universitario. Queste informazioni si compongono di: nome dell'esame (nessun nome è più lungo di 40 caratteri), codice alfanumerico (al massimo 6 lettere, per esempio AG0012), voto compreso tra 18 e 30 e lode (sia lo studente a decidere un'opportuna rappresentazione dell'eventuale lode; non sono ammessi i mezzi voti), numero di crediti associati all'esame (sono ammesse le frazioni di credito, per esempio 7,5). Definire quindi un tipo di dati che contiene le informazioni riguardanti la carriera scolastica di uno studente universitario. Di ogni studente si vogliono memorizzare le seguenti informazioni: nome (si suppone che un nome non sia composto da più di 50 lettere), matricola (un numero naturale), data di immatricolazione, numero di esami sostenuti, lista degli esami sostenuti, essendo un singolo esame descritto come in precedenza. Ogni studente può sostenere al massimo 29 esami. (se si ritiene utile, si possono definire altri tipi di dati, di supporto a quelli richiesti) typedef enum{false, true bool; typedef struct { unsigned short giorno; unsigned short mese; unsigned int anno; tipo_data; typedef struct { char nome[40]; char codice[6]; unsigned short voto; bool lode; float crediti; tipo_esame; typedef struct { char nome[50]; unsigned int matricola; tipo_data data_immatricolazione; tipo_esame esami[29]; unsigned short numero_esami; tipo_studente; 07/10/ :

9 Esercizio 18 Si scriva un programma che: Legge, carattere per carattere, una sequenza di parole scritte una di seguito all altra, consistenti di sole lettere dell alfabeto (non necessariamente appartenenti al vocabolario italiano), separate tra loro da uno o più spazi. La sequenza è poi terminata dal carattere speciale ETX (End of text). Riscrive le parole lette, una per riga ma in ordine inverso. Ogni parola consta al più di 20 caratteri; la sequenza di parole ne contiene al più 200. Qualora la sequenza contenga un carattere non ammissibile (ad esempio una cifra o un segno di interpunzione), oppure una parola sia più lunga di 20 caratteri, oppure la sequenza contenga più di 200 parole, l esecuzione del programma deve essere interrotta e deve essere prodotto sullo standard output un adeguato messaggio di errore. Ad esempio, in corrispondenza del file di ingresso (sullo SatndardInput): Alfa Giovanni domani ajjjhs poiche sempreverde hjjrstty sss ETX L uscita corrispondente deve essere: sss hjjrstty sempreverde poiche ajjjhs domani Giovanni Alfa Esercizio 19 Si vuole definire un modulo che realizza le funzioni di un archivio di fatture. Ogni fattura è descritta dalle seguenti informazioni: codice della fattura (codice alfanumerico di 8 caratteri); nome dell intestatario della fattura (al massimo 80 caratteri); importo della fattura; data di emissione della fattura. L archivio è memorizzato in maniera permanente in un file. Le funzioni che è possibile realizzare sull archivio sono: apertura di un archivio, identificato da una stringa di caratteri (se c è un archivio precedentemente aperto, questo viene preventivamente chiuso; in caso di mancata apertura ritorna un codice di errore); chiusura dell archivio (in caso di mancata chiusura ritorna un codice di errore); inserimento di una nuova fattura nell archivio (se l inserimento fallisce ritorna un codice di errore); stampa del contenuto dell archivio; riposizionamento all inizio dell archivio per una nuova lettura sequenziale (se non c è nessun archivio aperto ritorna un codice di errore); lettura sequenziale del prossimo elemento dell archivio (se non ci sono più fatture da leggere nell archivio, o se non ho ancora aperto alcun archivio ritorna un codice di errore); ricerca di una fattura secondo il suo codice (se la fattura cercata non esiste, o se non c è alcun archivio aperto ritorna un codice di errore). 07/10/ :

10 Si definisca l interfaccia (il file header del C, non l implementazione!) corrispondente al modulo sopra descritto. Si scriva un main che apre l archivio Fatture2000, e calcola l importo totale delle fatture emesse alla ditta FilippiniImpianti, stampando il risultato a video. Si implementi la funzione di lettura sequenziale del prossimo elemento dell archivio (realizzato tramite un file). Se l implementazione fa uso di variabili globali, darne la definizione; mostrare anche la clausola include per le librerie necessarie per realizzare la funzione. Si disegni un diagramma che rappresenti la struttura delle dipendenze tra i moduli (mostrare anche le dipendenze tra i moduli definiti dall utente e quelli della libreria standard del C). Nell implementazione del main e della funzione di lettura sequenziale è possibile usare le librerie standard del C viste a lezione (<stdio.h>, <stdlib.h>, <string.h>, ecc.). Ci appoggiamo ad un modulo usertypes.h che contiene un po di definizioni di tipi utili: /* usertypes.h */ typedef enum {false, true bool; typedef struct { unsigned short giorno; unsigned short mese; unsigned int anno; TipoData; L header del modulo archiviofatture e il seguente: /* archiviofatture.h */ #include "usertypes.h" #define MAX_CODICE 8 #define MAX_INTESTATARIO 80 typedef struct { char codice[max_codice+1]; char intestatario[max_intestatario+1]; unsigned long int importo; TipoData data; TipoFattura; /* le stringhe 'codice' e 'intestatario' sono piu' lunghe del necessario di un carattere per fare spazio al carattere '\000' di terminazione stringa */ bool apri (char *nomearchivio); bool chiudi(); bool inserisci_fattura (TipoFattura fattura); void stampa_archivio (); bool vai_inizio(); bool lettura_sequenziale (TipoFattura *fattura_letta); bool ricerca_fattura (TipoFattura *fattura_letta, char *codice); Il main desiderato ha la seguente codifica: 07/10/ :

11 /* mainfatture.c */ #include <string.h> #include <stdio.h> #include "archiviofatture.h" main () { TipoFattura fattura; unsigned long totale = 0; if (apri("fatture2000")) { vai_inizio(); while (lettura_sequenziale(&fattura)) { if (strcmp(fattura.intestatario, "FilippiniImpianti") == 0) totale += fattura.importo; printf("totale fatturato all'azienda FilippiniImpianti = %lu\n", totale); if (!chiudi()) printf("errore in fase di chiiusura dell'archivio\n"); else { printf("errore in fase di apertura archivio\n"); L implementazione della funzione leggi_sequenziale è la seguente (preceduta dalla definizione della variabile globale archivio, che è quella su cui tutte le funzioni del modulo implicitamente lavorano): #include "archiviofatture.h" #include <stdio.h> #include <string.h> /* questa libreria in realtà è usata da altre funzioni */ static FILE *archivio; bool lettura_sequenziale (TipoFattura *fattura_letta){ if (archivio == NULL) return false; if (feof(archivio)) return false; if(fread(fattura_letta, sizeof(tipofattura), 1, archivio)!= 1) return false; return true; Il grafo delle dipendenze tra i moduli è il seguente: mainfatture archiviofatture usertypes.h string.h stdio.h 07/10/ :

12 Esercizio 20 Si consideri la seguente dichiarazione typedef struct { int campo1; int campo2; int campo3; int campo4; struttura; Si scriva una funzione che riceva un parametro di tipo struttura e produca come risultato un valore dello stesso tipo in cui i campi risultino invertiti (il valore di campo4 si trovi in campo1, quello di campo3 in campo2, ecc.) Si trasformi poi la funzione in una procedura che esegua la medesima operazione sulla variabile di tipo struttura che le è passata come parametro. Parte 1. struttura InvertiStruttura (struttura param) { struttura varloc; varloc.campo1 = param.campo4; varloc.campo2 = param.campo3; varloc.campo3 = param.campo2; varloc.campo4 = param.campo1; return varloc; Parte 2. void ProcInvertiStruttura(struttura { struttura varloc; *param) varloc.campo1 = param->campo4; varloc.campo2 = param->campo3; varloc.campo3 = param->campo2; varloc.campo4 = param->campo1; param->campo4 = varloc.campo4; param->campo3 = varloc.campo3; param->campo2 = varloc.campo2; param->campo1 = varloc.campo1; Esercizio 21 Si considerino la tradizionale dichiarazione struct EL { int Info; struct EL *Prox; ; typedef struct EL ElemLista; typedef ElemLista *ListaDiInteri e la seguente funzione 07/10/ :

13 int sconosciuta (ListaDiInteri Lista) /*???*/ { x = 0; cursore = Lista; while (cursore!= NULL) { if (cursore->info > x) x = cursore->info; cursore = cursore->prox; return x; Si dica qual è il risultato della funzione sconosciuta quando vengono eseguite le seguenti chiamate: sconosciuta (L1) sconosciuta (L2) L1 ed L2 essendo, rispettivamente le liste rappresentate nella figura seguente. L L2 In generale, qual è il risultato prodotto dalla funzione per una generica lista di interi? Parte facoltativa Si ricodifichi la funzione sconosciuta in forma ricorsiva. Parte 1. La funzione produce come risultato 18, quando applicata alla lista L1 e 0 quando applicata a L2. In generale essa il valore massimo contenuto nella lista se essa contiene almeno un numero positivo; 0 in caso contrario (lista vuota o contenente solo numeri non positivi). Parte 2. (facoltativa) Si definisca in primo luogo la funzione ausiliaria int max(int p1, int p2) { if (p1 > p2) return p1; else return p2; successivamente la funzione sconosciuta può essere ricodifcata come segue, in forma ricorsiva int sconosciuta (ListaDiInteri Lista) /* la funzione produce il valore massimo contenuto nel parametro Lista se essa contiene almeno un numero positivo; 0 in caso contrario */ { if (Lista == NULL) return 0; else return (max(lista->info, sconosciuta(lista->prox)); 07/10/ :

14 Esercizio 22 Si vuole scrivere un programma che tiene traccia del numero di CD acquistati per ogni mese dell anno nell arco di 10 anni. Definire un tipo TipoDatiCD che contiene i dati di ogni CD: il titolo (lungo al massimo 50 caratteri), l autore (massimo 60 caratteri), l anno di pubblicazione, il numero di copie acquistate (anche più di una, se per esempio si vuole fare un regalo). Definire un tipo di dato CDAcqInMese che contiene l elenco dei CD comprati in un dato mese (si può assumere che non vengano acquistati più di 50 diversi titoli al mese) ed il numero di titoli diversi acquistati in quel mese. Definire una variabile globale elencocd che contiene l elenco dei CD acquistati mese per mese negli anni dal 1990 al Se si fa uso di tipi accessori, anche questi vanno definiti. Scrivere un main che, senza curarsi di come viene inizializzata la variabile elencocd (che supponiamo già caricata con i dati di interesse), esegue le seguenti operazioni: chiede all utente di inserire un anno (compreso tra 1990 e 1999); per ogni trimestre di quell anno (Gen-Mar, Apr-Giu, Lug-Set, Ott-Dic) stampa a video il numero di CD (contando anche le copie multiple dello stesso titolo) acquistati in quel periodo. #include <stdio.h> #define MAX_L_TITOLO 50 #define MAX_L_AUTORE 60 #define MAX_TIT_IN_MESE 50 typedef struct { char titolo[max_l_titolo]; char autore[max_l_autore]; int anno; int n_copie; TipoDatiCD; typedef struct { TipoDatiCD cd[max_tit_in_mese]; int n_titoli; CDAcqInMese; /* Le righe di 'elencocd' corrispondono agli anni dal 90 al 99, le colonne ai 12 mesi di ciascun anno */ CDAcqInMese elencocd[10][12]; main () { int anno; int i, j, k, totale_cd_trimestre; do { printf("inserisci un anno compreso tra 1990 e 1999: "); scanf("%d", &anno); while (anno < 1990 anno > 1999); /* tramuto l'anno interno nella riga corrspondente dell'array doppio 'elencocd' */ anno = anno ; /* il ciclo piu' esterno conta i trimestri, quello piu' interno i mesi del trimestre */ for( i=0 ; i<4 ; i++ ) { totale_cd_trimestre = 0; for( j=0 ; j<3 ; j++) { /* conto il numero di CD acquistati nel mese i*3+j e li aggiungo al totale del trimestre*/ for( k=0 ; k<elencocd[anno][i*3+j].n_titoli ; k++){ totale_cd_trimestre += elencocd[anno][i*3+j].cd[k].n_copie; printf("totale CD del trimestre n. %d dell'anno %d: %d\n", i+1, anno+1990, totale_cd_trimestre); 07/10/ :

15 Esercizio 23 Si vuole costruire una libreria che manipola triangoli in un piano cartesiano. Ogni triangolo è definito dalle coordinate x ed y dei suoi 3 punti. Parte a. Scrivere l interfaccia (non l implementazione) libtriangoli.h della libreria suddetta; questa definisce i tipi TipoTriangolo e TipoPunto, ed offre tutte e sole le seguenti funzioni: leggi_triang : chiede all utente di inserire da tastiera le coordinate dei punti del triangolo e ritorna un elemento di tipo TipoTriangolo; se l utente inserisce un triangolo degenere (per esempio se due punti coincidono) viene ritornato (non stampato a video!!!) un codice di errore; is_rettangolo : ritorna vero/falso a seconda che il triangolo passatole sia rettangolo o no; is_isoscele : ritorna vero/falso a seconda che il triangolo passatole sia isoscele o no; is_equilatero : ritorna vero/falso a seconda che il triangolo passatole sia equilatero o no; area_triang : ritorna l area del triangolo passatole; perim_triang : ritorna il perimetro del triangolo passatole; simili : riceve in ingresso due triangoli, e ritorna vero/falso a seconda che questi siano simili oppure no; circocentro : ritorna il punto che è il centro della circonferenza circoscritta al triangolo passatole come parametro; incentro : ritorna il punto che è il centro della circonferenza inscritta al triangolo passatole come parametro; stampa_triang : stampa a video le coordinate dei punti del triangolo passatole come argomento. Parte b Scrivere un main che, utilizzando le funzioni della libreria libtriang.h, esegue (nell ordine) le seguenti operazioni: legge le coordinate di 10 triangoli e li memorizza (se l utente immette le coordinate di un triangolo non valido, le coordinate vanno reimmesse); analizza i triangoli immessi a 2 a 2: per ogni coppia di triangoli simili stampa, di ogni triangolo della coppia, le coordinate dei punti ed il perimetro. Parte c Implementare la funzione (e solo quella!!!) perim_triang della libreria libriang.h; per l implementazione di questa funzione si ricorda che la libreria standard math.h offre, tra le altre, le funzioni sqrt e pow, le quali hanno le seguenti segnature: double sqrt (double n); double pow (double a, double b); e calcolano rispettivamente la radice quadrata di n e a b (si ricorda anche che la lunghezza di un segmento i cui estremi hanno coordinate (x1, y1) (x1, y2) è data da (x1 x2) 2 +(y1 y2) 2 ) 07/10/ :

16 parte a /* libtriangoli.h */ typedef struct { double x; double y; TipoPunto; typedef struct { TipoPunto v1; TipoPunto v2; TipoPunto v3; TipoTriangolo; typedef enum {false, true bool; bool leggi_triang ( TipoTriangolo *tr ); bool is_rettangolo ( TipoTriangolo tr ); bool is_isoscele ( TipoTriangolo tr ); bool is_equilatero ( TipoTriangolo tr ); double area_triang ( TipoTriangolo tr ); double perim_triang ( TipoTriangolo tr ); bool simili ( TipoTriangolo tr1, TipoTriangolo tr2 ); TipoPunto circocentro ( TipoTriangolo tr ); TipoPunto incentro ( TipoTriangolo tr ); void stampa_triang ( TipoTriangolo tr ); parte b /* maintriangoli.c */ #include <stdio.h> #include "libtriangoli.h" main (){ TipoTriangolo triangoli[10]; int i, j; i = 0; while (i<10){ printf("inserisci le coordinate del triangolo n. %d\n", i+1); if(leggi_triang(&triangoli[i])) { i++; else { printf("triangolo errato, reimmettilo\n"); for(i=0 ; i<9 ; i++){ for(j=i+1 ; j<10 ; j++){ if (simili(triangoli[i], triangoli[j])){ printf("i triangoli con le seguenti coordinate sono simili:\n"); printf("triangolo 1:\n"); stampa_triang(triangoli[i]); printf("triangolo 2:\n"); stampa_triang(triangoli[j]); 07/10/ :

17 parte c /* libtriangoli.c */ #include <math.h> #include "libtriangoli.h" double perim_triang(tipotriangolo tr){ double l1, l2, l3; l1 = sqrt(pow(tr.v1.x-tr.v2.x, 2)+pow(tr.v1.y-tr.v2.y, 2)); l2 = sqrt(pow(tr.v2.x-tr.v3.x, 2)+pow(tr.v2.y-tr.v3.y, 2)); l3 = sqrt(pow(tr.v3.x-tr.v1.x, 2)+pow(tr.v3.y-tr.v1.y, 2)); return l1+l2+l3; Esercizio 24 Si consideri il seguente programma: #include <stdio.h> #include <stdlib.h> main () { int **P; int *Q; Q = malloc(sizeof(int)); P = &Q; **P = 5; *Q = 4; printf( il valore finale di **P è %d \n, **P); Si dica, spiegandone brevemente le ragioni, quale sarà l output del programma. Parte facoltativa Si risolva lo stesso esercizio per la seguente variazione del programma precedente: #include <stdio.h> #include <stdlib.h> typedef int *Pint; main () { int **P; int *Q; int x; x = 27; Q = malloc(sizeof(int)); P = malloc(sizeof(pint)); *P = Q; **P = 4; Q = &x; P = &Q; *Q = 5; printf( il valore finale di **P è %d e quello di x è %d \n, **P, x); Dopo la malloc e l assegnazione P = &Q in memoria si crea una situazione come indicato in figura: 07/10/ :

18 P Q **P = 5 produce la situazione successiva seguente: P Q 5 *Q = 4 però riscrive il valore 4 nella stessa cella dove era stato scritto 5. Perciò il risultato finale è l output seguente: il valore finale di **P è 4. parte facoltativa Dopo l esecuzione delle istruzioni x = 27; Q = malloc(sizeof(int)); P = malloc(sizeof(pint)); *P = Q; si è creata la situazione seguente: P Q x Assegnando a Q l indirizzo di x e a P quello di Q, si ottiene l effetto che l assegnamento *Q = 5 sostituisce 5 a 27 in x. Ma x è anche puntata da **P. Quindi il risultato finale è l output seguente: il valore finale di **P è 5 e quello di x è 5. Esercizio 25 Realizzare un programma che legge da tastiera (e memorizza) una sequenza di caratteri alfabetici minuscoli (letti ad uno ad uno), terminata dal carattere #; se l utente inserisce un carattere non valido (un carattere maiuscolo, un numero o un simbolo che non sia #), il carattere non va memorizzato; la sequenza può essere lunga al massimo 100 elementi (escluso lo #). Il programma riproduce sullo standard output la sequenza di caratteri, convertendone il contenuto secondo la cifratura ROT-13. Questa cifratura prevede che ad ogni carattere che rappresenta la lettera tra le 26 dell'alfabeto in posizione i si sostituisca la lettera in posizione i+13 (mod 26). Ad esempio, digitando la sequenza di caratteri testodiprova#, il programma deve stampare la stringa di caratteri grfgbqvcebin. Si noti come applicando un numero pari di volte la trasformazione si riottenga il testo di partenza. #include <stdio.h> #define MAX_NUM 100 main(){ char dati[max_num], dato_corr, trasf; int i, j, n_dati; n_dati = 0; do { printf("inserisci carattere alfabetico (# per terminare, massimo %d caratteri): ", MAX_NUM); scanf(" %c", &dato_corr); if (dato_corr <= 'z' && dato_corr >= 'a') { dati[n_dati] = dato_corr; n_dati++; while (dato_corr!= '#' && n_dati < MAX_NUM); printf("\nsequenza trasformata:\n"); for( i=0 ; i<n_dati ; i++ ){ trasf = 'a' + (dati[i]+13 - 'a') % 26; printf("%c", trasf); printf("\n"); 27 07/10/ :

19 Esercizio 26 Si vuole scrivere una libreria che manipola i dati dei giocatori di squadre di calcio. Ogni giocatore è definito dal suo NOME (massimo 20 caratteri), COGNOME (massimo 30 caratteri), DATA DI NASCITA, NAZIONALITA (massimo 15 caratteri). Ogni squadra ha un nome (massimo 20 caratteri), ed è composta da al massimo 30 giocatori. Parte a Scrivere l interfaccia (non l implementazione) libcalcio.h della libreria suddetta; questa definisce i tipi TipoGiocatore e TipoSquadra (più eventualmente il TipoData, se si ritiene utile), ed offre tutte e sole le seguenti funzioni: leggi_giocatore : chiede all utente di inserire da tastiera i dati relativi ad un giocatore e ritorna un elemento di tipo TipoGiocatore; se l utente inserisce dei dati non validi (per esempio se il nome è vuoto) viene ritornato (non stampato a video!!!) un codice di errore; leggi_squadra : chiede all utente di inserire da tastiera i dati relativi ai giocatori di una squadra e ritorna un elemento di tipo TipoSquadra; se l utente inserisce dei dati non validi viene ritornato un codice di errore; conf_data_nascita : riceve in ingresso due giocatori, e ritorna 1 se giocatore1 è più vecchio di giocatore2, 0 se i due giocatori hanno la stessa età, 1 se giocatore2 è più vecchio di giocatore1 ; conf_nazionalita : riceve in ingresso due giocatori, e ritorna 1 se la nazionalità di giocatore1 precede quella di giocatore2 in ordine alfabetico, 0 se i due giocatori hanno la stessa nazionalità, 1 se la nazionalità di giocatore1 segue quella di giocatore2 in ordine alfabetico (per esempio francese viene prima di italiana in ordine alfabetico); ordina_squadra : riceve in ingresso una squadra ed un codice intero; se il codice è 0, restituisce un elemento TipoSquadra con gli stessi giocatori della squadra in ingresso, ma ordinati dal più giovane al più vecchio; se invece il codice è diverso da 0, restituisce un elemento TipoSquadra con gli stessi giocatori della squadra in ingresso, ma questa volta ordinati secondo la nazionalità in ordine crescente; stampa_giocatore : stampa a video i dati del giocatore passatole come argomento. stampa_squadra : stampa a video i dati della squadra passatale come argomento. Parte b Scrivere un main che, utilizzando le funzioni della libreria libcalcio.h, esegue nell ordine le seguenti operazioni: legge i dati relativi ai giocatori di una squadra di calcio e li memorizza (se l utente immette una squadra non valida, le coordinate vanno reimmesse); riordina i giocatori della squadra secondo l età, quindi stampa a video i dati della squadra così riordinata. Parte c Implementare la funzione (e solo quella!!!) ordina_squadra della libreria libcalcio.h; per l implementazione di questa funzione è lecito (anzi consigliato) usare le altre funzioni offerte dalla libreria libcalcio.h; come algoritmo di ordinamento si usi pure quello che si preferisce. 07/10/ :

20 parte a /* libcalcio.h */ #define MAX_NOME_GIOC 20 #define MAX_COGNOME_GIOC 30 #define MAX_NAZIONALITA 15 #define MAX_NOME_SQUADRA 20 #define MAX_GIOCATORI 30 typedef struct { unsigned short giorno; unsigned short mese; unsigned anno; TipoData; typedef struct { char nome[max_nome_gioc+1]; char cognome[max_cognome_gioc+1]; TipoData data_nascita; char nazionalita[max_nazionalita+1]; TipoGiocatore; typedef struct { char nome[max_nazionalita+1]; TipoGiocatore giocatori[max_giocatori]; unsigned short n_giocatori; TipoSquadra; typedef enum {false, true bool; bool leggi_triang ( TipoGiocatore *giocatore ); bool leggi_squadra ( TipoSquadra *squadra ); int conf_data_nascita ( TipoGiocatore giocatore1, TipoGiocatore giocatore2 ); int conf_nazionalita ( TipoGiocatore giocatore1, TipoGiocatore giocatore2 ); TipoSquadra ordina_squadra ( TipoSquadra squadra, int codice_ord ); void stampa_giocatore ( TipoGiocatore giocatore ); void stampa_squadra ( TipoSquadra squadra ); parte b /* maincalcio.c */ #include <stdio.h> #include "libcalcio.h" main (){ TipoSquadra squadra; while (!leggi_squadra(&squadra)){ printf("squadra inserita non valida, riprova\n"); stampa_squadra(ordina_squadra(squadra, 0)); 07/10/ :

21 parte c /* libcalcio.c */ #include "libcalcio.h" TipoSquadra ordina_squadra ( TipoSquadra squadra, int codice_ord ) { TipoGiocatore temp; bool ordinato; int i; while(ordinato == false){ ordinato = true; for ( i=0 ; i<squadra.n_giocatori-1 ; i++ ){ if ( codice_ord == 0 ) { if (conf_data_nascita(squadra.giocatori[i], squadra.giocatori[i+1]) < 0) { temp = squadra.giocatori[i]; squadra.giocatori[i] = squadra.giocatori[i+1]; squadra.giocatori[i+1] = temp; ordinato = false; else { if (conf_nazionalita(squadra.giocatori[i], squadra.giocatori[i+1]) > 0) { temp = squadra.giocatori[i]; squadra.giocatori[i] = squadra.giocatori[i+1]; squadra.giocatori[i+1] = temp; ordinato = false; Esercizio 27 Si ha la funzione ricorsiva: int Elabora( int n1, int n2 ) { int a, b; a = n1 + 1; b = n2-1; if (b <= 0) return a; else return Elabora(a,b); Descrivere l'esecuzione della funzione in seguito all'invocazione Elabora(4,3). La sequenza di chiamate ricorsive della funzione Elabora è la seguente: Elabora(4,3) Elabora(5,2) Elabora(6,1) Alla fine il valore ritornato dalla chiamata Elabora(4,3) è 7. 07/10/ :

22 Esercizio 28 Data una funzione calcola: int calcola( int *a, int b, int *c) { *a = *a * 2; b = b * 2; *c = *c - 2; return *a + b + *c; Qual è l'output del seguente frammento di programma? int z; int *y; int x; y = &x; z = 1; *y = 2; x = 3; z = calcola(&z,x,y); printf("%d, %d",z,x); Il frammento di codice stampa, nell ordine, i valori 9, 1. Infatti, prima della chiamata di calcola, z ha valore 1, y contiene l indirizzo di x, ed x vale 3 (quindi *y vale anch esso 3). Durante l esecuzione di calcola, x passa da 3 ad 1 con l istruzione *c = *c 2. z viene anch esso modificato (è passato per indirizzo), ma questa modifica viene poi annullata quando, al termine di calcola, il valore ritornato dalla funzione è assegnato a z. Poiché calcola ritorna 9 (la funzione era stata chiamata con z=1, x=3, *y=3), z alla fine vale 9. Esercizio 29 Scrivere un programma che legge da tastiera delle righe di caratteri (di lunghezza massima 100 caratteri). Per ogni riga letta, il programma conta il numero di occorrenze di ogni vocale (sia che appaia in caratteri maiuscoli che in quelli minuscoli). Quando l'utente immette una riga vuota, il programma stampa un istogramma verticale (dall'alto al basso) con tanti asterischi quante sono le occorrenze di ogni vocale. Per esempio, se l'utente immette le seguenti righe: NEL mezzo DEL cammin DI nostra vita<enter> mi RITROVAI per una SELVA oscura<enter> CHE la diritta via era SMARRITA<enter> <enter> Il programma stampa il seguente istogramma 07/10/ :

23 AEIOU ***** ***** **** **** *** *** *** * * * * * * * * * #define MAX_RIGA 100 #include <stdio.h> main() { char riga[max_riga+1]; unsigned int counter[5]; int i; /* inizializzo i contatori */ for( i=0 ; i<5 ; i++ ) counter[i] = 0; printf("inserisci riga di caratteri (max %d elementi):\n", MAX_RIGA); gets(riga); while(riga[0]!= '\000') { for( i=0 ; riga[i]!= '\000' ; i++ ) { if ( riga[i] == 'a' riga[i] == 'A' ) counter[0] += 1; else if ( riga[i] == 'e' riga[i] == 'E' ) counter[1] += 1; else if ( riga[i] == 'i' riga[i] == 'I' ) counter[2] += 1; else if ( riga[i] == 'o' riga[i] == 'O' ) counter[3] += 1; else if ( riga[i] == 'u' riga[i] == 'U' ) counter[4] += 1; printf("inserisci riga di caratteri (max %d elementi):\n", MAX_RIGA); gets(riga); printf("\naeiou\n"); while ( counter[0] > 0 counter[1] > 0 counter[2] > 0 counter[3] > 0 counter[4] > 0 ) { if (counter[0] > 0) { printf("*"); counter[0] -= 1; else { printf(" "); if (counter[1] > 0) { printf("*"); counter[1] -= 1; else { printf(" "); if (counter[2] > 0) { printf("*"); counter[2] -= 1; else { printf(" "); 07/10/ :

24 if (counter[3] > 0) { printf("*"); counter[3] -= 1; else { printf(" "); if (counter[4] > 0) { printf("*"); counter[4] -= 1; else { printf(" "); printf("\n"); Esercizio 30 Si vuole scrivere un modulo Dizionario che gestisce un dizionario di parole in italiano. Questo modulo offre un tipo TipoParola (che rappresenta una parola) ed un tipo ListaDiParole (una struttura dati a lista per contenere un numero arbitrario di parole), ma nasconde all utente l implementazione del dizionario in sè. TipoParola contiene il segno della parola (cioè la parola in sè, per esempio cane ; si ricorda che nella lingua italiana la parola con segno più lungo è precipitevolissimevolmente, di 26 lettere), il suo significato (lungo al massimo 200 caratteri), ed la forma della parola (le possibili forme sono: verbo, nome, aggettivo, avverbio, preposizione, articolo, interiezione). Parte a Scrivere l interfaccia (non l implementazione) Dizionario.h del suddetto modulo; questa definisce i tipi TipoParola e ListaDiParole (più eventualmente il tipo TipoFOrma) ed offre tutte e sole le seguenti funzioni: leggi_parola : chiede all utente di inserire da tastiera i dati relativi ad una parola e ritorna un elemento di tipo TipoParola; se l utente inserisce dei dati non validi (per esempio se la parola è vuota) viene ritornato (non stampato a video!!!) un codice di errore; aggiungi_parola : riceve in ingresso un elemento di tipo TipoParola e lo aggiunge al dizionario (se la parola già esiste nel dizionario questo rimane invariato); se la parola passata non è valida viene ritornato un codice di errore; trova_definizione : riceve in ingresso il segno di una parola, e ritorna il TipoParola che ne contiene la definizione; se la parola passata in ingresso non è presente nel dizionario viene ritornato un codice di errore; trova_sinonimi : riceve in ingresso un TipoParola, e ritorna una lista di parole sinonimi di quella passata; la lista ritornata è vuota se la parola in ingresso non è presente nel dizionario. Parte b Scrivere un main che, utilizzando le funzioni del modulo Dizionario.h, legge i dati relativi ad una parola (se i dati immessi non sono validi devono essere reimmessi), verifica se la parola esiste nel dizionario e, se non esiste, la aggiunge al dizionario stesso. Parte c Dare la definizione della variabile dizionario del file Dizionario.h: questa variabile contiene tutte le parole del dizionario e va implementata come un array di liste (una lista per ognuna delle 26 lettere dell alfabeto). Implementare la funzione (e solo quella!!!) trova_definizione del modulo Dizionario.h; le parole, nelle liste della variabile dizionario, possono essere memorizzate secondo l ordine alfabetico oppure no, è una scelta implementativa del programmatore. 07/10/ :

25 parte a /* Dizionario.h */ #define MAX_PAROLA 26 #define MAX_DESCR 200 typedef enum {verbo, nome, agg, avv, prep, art, inter TipoForma typedef struct { char segno[max_parola+1]; char significato[max_descr+1]; TipoForma forma; TipoParola; typedef struct EL { TipoParola el; struct EL *next; ElemListaDiParole; typedef ElemListaDiParole *ListaDiParole; typedef enum {false, true bool; bool leggi_parola ( TipoParola *parola ); bool aggiungi_parola ( TipoParola parola ); bool trova_definizione ( char segno[], TipoParola *parola ); ListaDiParole trova_sinonimi ( TipoParola parola); parte b /* maindizionario.c */ #include <stdio.h> #include "Dizionario.h" main (){ TipoParola parola, temp; while (!leggi_parola(&parola)){ printf("parola inserita non valida, riprova\n"); if (!trova_definizione(parola.segno, &temp) { aggiungi_parola(parola); 07/10/ :

26 parte c /* Dizionario.c */ #include "Dizionario.h" #include <string.h> ListaDiParole dizionario[26]; /* suppongo che le liste non siano ordinate */ bool trova_parola_in_lista ( char segno[], ListaDiParole lista, TipoParola *parola ) { if (lista == NULL) return false; if ( strcmp(segno, lista->el.segno) == 0 ){ *parola = lista->el; return true; else { return trova_parola_in_lista ( segno, lista->next, parola ); bool trova_definizione ( char segno[], TipoParola *parola ) { if ( segno[0] >= a && segno[0] <= z ) { return trova_parola_in_lista( segno, dizionario[p[0] a ], parola ); else if ( segno[0] >= A && segno[0] <= Z ) { return trova_parola_in_lista( segno, dizionario[p[0] A ], parola ); else { return false; Esercizio 31 Si ha la funzione ricorsiva: void Elabora( unsigned int i ) { if (i <= 1) { printf("%u\n", i); else { printf("%u", i % 2); Elabora( i / 2 ); Descrivere l'esecuzione della funzione in seguito all'invocazione Elabora(10), specificando che cosa rimane visualizzato sullo schermo alla fine dell esecuzione. La sequenza di chiamate ricorsive della funzione Elabora è la seguente: 07/10/ :

27 Elabora(10) Elabora(5) Elabora(2) Elabora(1) Alla fine rimane visualizzata la seguente sequenza di valori: La funzione Elabora infatti calcola in maniera ricorsiva la rappresentazione binaria (scritta con la cifra meno significativa a sinistra) del numero passatole. Esercizio 32 Data una funzione calcola: int calcola(int *a, int b, int *c) { *a = *a * b; b = b * 2; *c = *a - b; return *a + b + *c; ed il seguente programma: main() { int z; int *y; int x; y = &x; z = -1; *y = 1; x = 2; z = calcola(y,x,&z); Mostrare lo stato delle variabili x, y e z al termine dell'invocazione di calcola. Alla fine del main, la variabile x contiene il valore 4, la y punta a x, quindi *y a sua volta vale 4, mentre z vale 8. Infatti, prima della chiamata di calcola, z ha valore -1, y contiene l indirizzo di x, ed x vale 2 (quindi *y vale anch esso 3). Durante l esecuzione di calcola, x passa da 2 ad 4 con l istruzione *a = *a * b. z viene anch esso modificato (è passato per indirizzo), ma questa modifica viene poi annullata quando, al termine di calcola, il valore ritornato dalla funzione è assegnato a z. Poichè calcola ritorna 8 (la funzione era stata chiamata con z=-1, x=2, *y=2), z alla fine vale 8. 07/10/ :

28 Esercizio 33 Si consideri un computer la cui celle di memoria sono di 32 bit. Si ipotizzi che le istruzioni siano composta da due campi (codice_operativo, indirizzo) e che il primo dei due campi occupi 8 bit. Quante celle di memoria sono indirizzabili direttamente dalle istruzioni del computer? Supponendo che i bit del campo indirizzo identifichino non la cella che contiene l operando, ma la cella che (con i suoi 32 bit) contiene l indirizzo dell operando. Quante celle di memoria sono indirizzabili in tal caso dalle istruzioni del computer? Esercizio 34 Si considerino le seguenti dichiarazioni di un programma C: typedef struct { double c; int a[100]; pippo; int a; float b; pippo c; int d; int* e; e = &d; typedef struct { int c; float a[100]; pippo; int a; double b; pippo c; int d; int* e; e = &d; Si ipotizzi che: Una variabile intera occupi 2 bytes (1 parola). Una variabile float occupi 4 bytes (2 parole). Una variabile double occupi 8 bytes (4 parole). Nell allocare memoria, le variabili a, b, c, d, e siano memorizzare a partire dalla cella (parola) di indirizzo 100. A quale valore viene inizializzata la variabile e? Esercizio 35 Si considerino i seguenti frammenti di (pseudo)programma: int y, sum; float dato; leggi y; while (1) { leggi un insieme di dati interi e calcolane la somma sum; if (sum == 0) break; dato= y/sum; stampa dato int y, sum; float dato; leggi y; while (1) { leggi un insieme di dati interi e calcolane la somma sum; if (sum == 0) continue; dato= y/sum; stampa dato 07/10/ :

29 Si trasformino i due casi in frammenti che non contengano istruzioni "break" e "continue", ma solo "if" e "while" o "do-while". (scrivere i nuovi programmi nella colonna destra della tabella) Esercizio 36 Quale sarà il valore di sum dopo aver eseguito ognuno dei seguenti cicli annidati? sum = 0; for (i = 0; i <= 10; i++) for (j = 0; j <= 10; j++) sum = sum + i ; sum = 0; j = 0; do { j++; for (i = 5; i > j; i--) sum = sum + (i+j); while (j < 11); Esercizio 37 Le seguenti strutture dati descrivono le categorie di dipendenti in un azienda, le rispettive paghe orarie, e l archivio dei dati di tutti i 100 dipendenti dell azienda typedef enum {dirigente, quadro, impiegato, operaio categoria; int pagaoraria [4]; /* associa a ogni categoria la paga oraria: pagaoraria[0] è quella dei dirigenti etc. */ typedef struct { char nome[30]; /* nome e cognome del lavoratore */ categoria ruolo; /* categoria del lavoratore */ int oresettimanali; /* ore di lavoro settimanale */ dipendente; dipendente archivio[100]; Scrivere un frammento di codice che per ogni dipendente stampi nome e cognome e paga settimanale. Esercizio 38 Codificare una funzione int contarip(char *str, char c) che conti il numero di ripetizioni di un carattare (il secondo parametro) in una stringa (il primo parametro). La funzione deve essere codificata in due versioni: una prima che faccia uso di istruzioni iterative e una seconda che sfrutti il meccanismo della ricorsione. Esercizio 39 Con riferimento alle seguenti dichiarazioni typedef struct el { int info; struct el * prox; ElemLista; typedef ElemLista * ListaDiElem; si codifichi una funzione int sommatoria (ListaDiElem p) che calcoli e restituisca al programma chiamante la somma dei valori interi memorizzati nei nodi della lista ricevuta come parametro. 07/10/ :

30 Esercizio 40 Si consideri la seguente dichiarazione: typedef enum{bianco, Rosso, Verde, Blu, Nero Colore ; Quale tra questi potrebbe essere l'effetto della chiamata della funzione malloc(sizeof(colore))? dealloca una quantità di memoria pari a 5 celle di memoria; alloca una cella di memoria e ne restituisce l'indirizzo; alloca 5 celle di memoria e ne restituisce il puntatore; alloca 5 celle di memoria che puntano a un oggetto di tipo Colore. Esercizio 41 Scrivere un file di interfaccia che contenga le dichiarazioni di tipi e funzioni relative alla gestione di un calendario. Esso deve includere dichiarazioni per il tipo data che individua univocamente un giorno, il tipo giornosettimana che corrisponde ai sette giorni della settimana una funzione precede che, ricevendo due parametri di tipo data rappresentanti due giorni, stabilisce se il primo dei due precede temporalmente il secondo, e restituisce al chiamante un valore di verità rappresentante questa condizione; una funzione a valore intero distanza che, ricevendo due parametri di tipo data rappresentanti due giorni, calcola e restituisce al chiamante la loro distanza temporale in termini di numero di giorni; una funzione giornosett che, ricevendo come parametro un valore di tipo data, stabilisce a quale giorno della settimana essa corrisponde e restituisce tale valore al chiamante. Esercizio 42 Scrivi il numero N di lettere che compongono il tuo cognome. quante celle di memoria sono indirizzabili da un computer con istruzioni il cui campo indirizzo ha un numero di bit pari a N? converti N in binario. Esercizio 43 Riscrivi il seguente frammento di codice usando solo cicli while. s = 0; for (i = 0; i < 10; i++) { n = 0; for (j = 0; j <= i; j++) { n = n + 1; s = s + n; Quanto vale la variabile s al termine dell esecuzione del codice? 07/10/ :

31 Esercizio 44 Date le seguenti strutture di dati typedef struct { int codice; int votoriportato; esame; typedef struct { char nome[30]; esame esamisostenuti[30]; datistudente; datistudente archiviostudenti[100]; scrivi un frammento di codice che stampi (su una riga distinta) il nome e la votazione media solo per gli studenti che hanno riportato una votazione media maggiore o uguale a 24,5. Assumendo che variabili dei tipi di dati semplici occupino una cella di memoria, quante celle di memoria occupa la variabile archiviostudenti nell esercizio precedente? int i, j; float media; for ( i = 0; i < 100; i++ ) { media = 0.0; for ( j = 0; j < 30; j++ ) { media = media + archiviostudenti[i].esamisostenuti[j].votoriportato; media = media / 30.0 if ( media >= 24.5 ) printf ( \n %s ha la media del %f, archiviosudenti[i].nome, media); Esercizio 45 Che cosa produce nel programma seguente la chiamata della funzione boh? #define tot 100; main() { int v[tot]; void boh (int* a); /*prototipo della funzione*/... boh(v);... void boh(int* a) { int i; for(i=0; i<tot; i++) *(a+i)=0; Risposta: Pone a zero tutti gli elementi del vettore v. Esercizio 46 Data la seguente funzione ricorsiva, indicare qual è il valore calcolato dalla funzione in termini di un generico parametro a, assunto positivo. 07/10/ :

Funzioni in C. Violetta Lonati

Funzioni in C. Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Funzioni - in breve: Funzioni Definizione di funzioni

Dettagli

Introduzione alla programmazione in C

Introduzione alla programmazione in C Introduzione alla programmazione in C Testi Consigliati: A. Kelley & I. Pohl C didattica e programmazione B.W. Kernighan & D. M. Ritchie Linguaggio C P. Tosoratti Introduzione all informatica Materiale

Dettagli

Esercizi di programmazione in C

Esercizi di programmazione in C Esercizi di programmazione in C Esercizio 1 Scrivere un programma in linguaggio C che legga da tastiera una sequenza di lunghezza ignota a priori di numeri interi positivi. Il programma, a partire dal

Dettagli

Breve riepilogo della puntata precedente:

Breve riepilogo della puntata precedente: Breve riepilogo della puntata precedente: 1. In C, il passaggio dei parametri alle funzioni avviene sempre per copia, ovvero il valore del parametro viene copiato all'interno della variabile che rappresenta

Dettagli

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1) Strutture Strutture e Unioni DD cap.10 pp.379-391, 405-406 KP cap. 9 pp.361-379 Strutture Collezioni di variabili correlate (aggregati) sotto un unico nome Possono contenere variabili con diversi nomi

Dettagli

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante

Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante Esercizio 0 Scambio lettere Scrivere la funzione void scambiolettere(char *dest, char *lettere, int p_o_d) che modifichi la stringa destinazione (dest), sostituendone i caratteri pari o dispari (a seconda

Dettagli

Informatica 1. Prova di recupero 21 Settembre 2001

Informatica 1. Prova di recupero 21 Settembre 2001 Informatica 1 Prova di recupero 21 Settembre 2001 Si risolvano i seguenti esercizi. Ai fini della determinazione del voto finale il loro punteggio andrà sommato al punteggio del laboratorio. Il tempo complessivo

Dettagli

Caratteri e stringhe Esercizi risolti

Caratteri e stringhe Esercizi risolti Esercizi risolti 1 Esercizio: Conta vocali e consonanti Scrivere un programma in linguaggio C che legga una frase introdotta da tastiera. La frase è terminata dall introduzione del carattere di invio.

Dettagli

La struttura dati ad albero binario

La struttura dati ad albero binario La struttura dati ad albero binario L albero è una struttura dati nella quale le informazioni sono organizzate in modo gerarchico, dall alto verso il basso. Gli elementi di un albero si chiamano nodi,

Dettagli

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it www.cs.unicam.it/massimo.callisto

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it www.cs.unicam.it/massimo.callisto Università degli studi di Camerino Scuola di scienze e tecnologia - Sezione Informatica Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it www.cs.unicam.it/massimo.callisto LEZIONE

Dettagli

Problem solving elementare su dati vettoriali

Problem solving elementare su dati vettoriali Problem solving elementare su dati vettoriali Introduzione Verifiche su sequenze di dati Selezione o ricerca di dati 2 2006 Politecnico di Torino 1 Introduzione (1/2) I problemi di verifica consistono

Dettagli

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0 Rappresentazione dei numeri I numeri che siamo abituati ad utilizzare sono espressi utilizzando il sistema di numerazione decimale, che si chiama così perché utilizza 0 cifre (0,,2,3,4,5,6,7,8,9). Si dice

Dettagli

http://esamix.labx Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( )

http://esamix.labx Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( ) Materiale di ausilio utilizzabile durante l appello: tutto il materiale è a disposizione, inclusi libri, lucidi, appunti, esercizi svolti e siti Web ad accesso consentito in Lab06. L utilizzo di meorie

Dettagli

Introduzione al Linguaggio C

Introduzione al Linguaggio C Introduzione al Linguaggio C File I/O Daniele Pighin April 2009 Daniele Pighin Introduzione al Linguaggio C 1/15 Outline File e dati Accesso ai file File I/O Daniele Pighin Introduzione al Linguaggio C

Dettagli

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti) (Esercizi Tratti da Temi d esame degli ordinamenti precedenti) Esercizio 1 L'agenzia viaggi GV - Grandi Viaggi vi commissiona l'implementazione della funzione AssegnaVolo. Tale funzione riceve due liste

Dettagli

Allocazione dinamica della memoria - riepilogo

Allocazione dinamica della memoria - riepilogo Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica In breve Storage duration Allocazione dinamica della

Dettagli

RICERCA DI UN ELEMENTO

RICERCA DI UN ELEMENTO RICERCA DI UN ELEMENTO Si legga da tastiera un array di N elementi (N stabilito dall utente) Si richieda un elemento x il programma deve cercare l elemento x nell array Se l elemento è presente, deve visualizzare

Dettagli

Alcune regole di base per scrivere un programma in linguaggio C

Alcune regole di base per scrivere un programma in linguaggio C Alcune regole di base per scrivere un programma in linguaggio C Un programma il linguaggio C (listato) viene scritto in formato testo ed archiviato in un file: *.c Per scrivere un listato C si utilizza

Dettagli

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007 Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007 Dott.Davide Di Ruscio Dipartimento di Informatica Università degli Studi di L Aquila Lezione del 08/03/07 Nota Questi lucidi sono tratti

Dettagli

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12}; ESERCIZI 2 LABORATORIO Problema 1 Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12}; Chiede all'utente un numero e, tramite ricerca

Dettagli

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio 1-La memoria dinamica La scrittura di un programma (indipendentemente dal linguaggio adottato) deve sempre tener conto

Dettagli

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE NOME: COGNOME: ============================================================== Esercizio 1 ci sono tante "righe"; non è detto servano tutte...

Dettagli

Corso di Fondamenti di Informatica

Corso di Fondamenti di Informatica Corso di Fondamenti di Informatica I tipi strutturati: gli array e le strutture Claudio De Stefano - Corso di Fondamenti di Informatica 1 arrays un array (o vettore) è una sequenza di oggetti dello stesso

Dettagli

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Dipartimento di Elettronica, Informazione e Bioingegneria Informatica B Sezione D Franchi Alessio Mauro,

Dettagli

Algoritmi di Ricerca. Esempi di programmi Java

Algoritmi di Ricerca. Esempi di programmi Java Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare

Dettagli

Gestione dei File in C

Gestione dei File in C Gestione dei File in C Maurizio Palesi DIIT Università di Catania Viale Andrea Doria 6, 95125 Catania mpalesi@diit.unict.it http://www.diit.unict.it/users/mpalesi Sommario In questo documento saranno introdotte

Dettagli

Esempio: Array di struct

Esempio: Array di struct Esempio: Array di struct Scrivere un programma C che definisca la struttura esame, composta dal nome dell esame (stringa) e dal voto (intero). Si leggano poi da terminale n esami, con n definito dall utente

Dettagli

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori Gli array Array e puntatori Laboratorio di Informatica I un array è un insieme di elementi (valori) avente le seguenti caratteristiche: - un array è ordinato: agli elementi dell array è assegnato un ordine

Dettagli

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Università di Roma Tre Facoltà di Scienze M.F.N. Corso di Laurea in Matematica Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Marco Liverani (liverani@mat.uniroma3.it)

Dettagli

Variabili e tipi di dato

Variabili e tipi di dato Variabili e tipi di dato Tutte le variabili devono essere dichiarate, specificandone il tipo La dichiarazione deve precedere l uso Il tipo è un concetto astratto che esprime: L allocazione di spazio per

Dettagli

I puntatori e l allocazione dinamica di memoria

I puntatori e l allocazione dinamica di memoria I puntatori e l allocazione dinamica di memoria L allocazione delle variabili Allocazione e rilascio espliciti di memoria Le funzioni malloc e free 2 2006 Politecnico di Torino 1 Allocare = collocare in

Dettagli

Laboratorio di programmazione

Laboratorio di programmazione Laboratorio di programmazione Lezione VI Tatiana Zolo tatiana.zolo@libero.it 1 LE STRUCT Tipo definito dall utente i cui elementi possono essere eterogenei (di tipo diverso). Introduce un nuovo tipo di

Dettagli

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C Università di Roma Tre Dipartimento di Matematica e Fisica Corso di Laurea in Matematica Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C Marco Liverani (liverani@mat.uniroma3.it)

Dettagli

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni Dall Algoritmo al Programma Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni IL PROGRAMMA Gli algoritmi sono modelli di descrizione astratti e per controllarne il funzionamento devono essere

Dettagli

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30' Prima di cominciare: si scarichi dal sito http://esamix.labx il file StartKit5.zip contenente i file necessari (solution di VS2008 e progetto compresi). Avvertenze per la consegna: apporre all inizio di

Dettagli

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Dipartimento di Elettronica, Informazione e Bioingegneria Informatica B Sezione D Franchi Alessio Mauro,

Dettagli

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a. 2009-10. prof.

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a. 2009-10. prof. Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 009-10 prof. Viviana Bono Blocco 9 Metodi statici: passaggio parametri, variabili locali, record

Dettagli

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main Paolo Torroni Dipartimento di Elettronica, Informatica e Sistemistica Università degli

Dettagli

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C CORSO DI LABORATORIO DI INFORMATICA CORSO DI LAUREA IN SDM ANNO ACCADEMICO 2011-2012 Docente: R. Sparvoli Esercitazioni: R. Sparvoli, F. Palma OTTAVA ESPERIENZA DI LABORATORIO L elaborazione dei files

Dettagli

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo. DALLE PESATE ALL ARITMETICA FINITA IN BASE 2 Si è trovato, partendo da un problema concreto, che con la base 2, utilizzando alcune potenze della base, operando con solo addizioni, posso ottenere tutti

Dettagli

dall argomento argomento della malloc()

dall argomento argomento della malloc() Allocazione dinamica Quando? Tutte le volte in cui i dati possono crescere in modo non prevedibile staticamente a tempo di sviluppo Un array con dimensione i fissata a compile-time non è sufficiente È

Dettagli

ESAME SCRITTO DI ELEMENTI DI INFORMATICA E PROGRAMMAZIONE. 27 Gennaio 2015

ESAME SCRITTO DI ELEMENTI DI INFORMATICA E PROGRAMMAZIONE. 27 Gennaio 2015 COGNOME E NOME: MATRICOLA: Civile Ambiente e Territorio Non si possono consultare manuali, appunti e calcolatrici. Esercizio 1: [3 punto] Rappresentare i numeri 36 e 91 (in base 10) in notazione binaria

Dettagli

Esempi di algoritmi. Lezione III

Esempi di algoritmi. Lezione III Esempi di algoritmi Lezione III Scopo della lezione Implementare da zero algoritmi di media complessità. Verificare la correttezza di un algoritmo eseguendolo a mano. Imparare a valutare le prestazioni

Dettagli

Appello di Informatica B

Appello di Informatica B Politecnico di Milano Facoltà di Ingegneria Industriale 19 febbraio 2004 Appello di Informatica B Prof. Angelo Morzenti - Prof. Vincenzo Martena Cognome e nome: Matricola: Tipo di prova: recupero I prova

Dettagli

Fondamenti di Informatica 2

Fondamenti di Informatica 2 Fondamenti di Informatica 2 della prova scritta del 28 Febbraio 2006 Esercizio 1 (4 punti) Date le seguenti variabili int A[] = 2,3,7,-2,5,8,-4; int N = 7; int min = 3; int i; Scrivere la porzione di codice

Dettagli

ESERCIZI DI PROBLEM SOLVING E COMPOSIZIONE DEI DIAGRAMMI DI FLUSSO per le classi terza

ESERCIZI DI PROBLEM SOLVING E COMPOSIZIONE DEI DIAGRAMMI DI FLUSSO per le classi terza ESERCIZI DI PROBLEM SOLVING E COMPOSIZIONE DEI DIAGRAMMI DI FLUSSO per le classi terza vers.3 in lavorazione Docente SAFFI FABIO Contenuti 01.Esercizi generici sul diagramma di flusso - flow chart... 2

Dettagli

PROGRAMMA SVOLTO DI INFORMATICA ANNO SCOLASTICO 2013/2014. DOCENTE: Villani Chiara

PROGRAMMA SVOLTO DI INFORMATICA ANNO SCOLASTICO 2013/2014. DOCENTE: Villani Chiara LICEO SCIENTIFICO STATALE "FILIPPO LUSSANA" V i a A n g e l o Ma j, 1 2 4 1 2 1 B E R G A M O 035 237502 Fax: 035 236331 Sito e contatti: www.liceolussana.com Codice fiscale: 80026450165 PROGRAMMA SVOLTO

Dettagli

Compito di Fondamenti di Informatica

Compito di Fondamenti di Informatica Compito di Fondamenti di Informatica In un magazzino viene utilizzato un archivio informatico, nel quale vengono memorizzate le informazioni relative ai prodotti contenuti nel magazzino e che ne permette

Dettagli

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO 2014 2015 17.XI.2015

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO 2014 2015 17.XI.2015 APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO 2014 2015 17.XI.2015 VINCENZO MARRA Indice Esercizio 1 1 Conversione di un numero naturale in base b.

Dettagli

Record in C: il costruttore struct.

Record in C: il costruttore struct. Record in C: il costruttore struct. Le variabili di tipo record e i nuovi tipi record si dichiarano in C tramite il costruttore di tipo struct:. ::= ;

Dettagli

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

void funzioneprova() { int x=2; cout<<dentro la funzione x=<<x<<endl; } FUNZIONI 57. Cosa servono le funzioni? A spezzare il programma in diverse parti relativamente indipendenti fra loro, ovvero interagenti sono attraverso i parametri di input ed IL VALORE di uscita. In questo

Dettagli

Introduzione al linguaggio C Gli array

Introduzione al linguaggio C Gli array Introduzione al linguaggio C Gli array Vettori nome del vettore (tutti gli elementi hanno lo stesso nome, c) Vettore (Array) Gruppo di posizioni (o locazioni di memoria) consecutive Hanno lo stesso nome

Dettagli

Programmazione dinamica

Programmazione dinamica Capitolo 6 Programmazione dinamica 6.4 Il problema della distanza di edit tra due stringhe x e y chiede di calcolare il minimo numero di operazioni su singoli caratteri (inserimento, cancellazione e sostituzione)

Dettagli

INFORMATICA 1 L. Mezzalira

INFORMATICA 1 L. Mezzalira INFORMATICA 1 L. Mezzalira Possibili domande 1 --- Caratteristiche delle macchine tipiche dell informatica Componenti hardware del modello funzionale di sistema informatico Componenti software del modello

Dettagli

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) 12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica,

Dettagli

10 - Programmare con gli Array

10 - Programmare con gli Array 10 - Programmare con gli Array Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it

Dettagli

GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL

GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL GUIDA RAPIDA BOZZA 23/07/2008 INDICE 1. PERCHÉ UNA NUOVA VERSIONE DEI MODULI DI RACCOLTA DATI... 3 2. INDICAZIONI GENERALI... 4 2.1. Non modificare la struttura dei fogli di lavoro... 4 2.2. Cosa significano

Dettagli

INFORMATICA - I puntatori Roberta Gerboni

INFORMATICA - I puntatori Roberta Gerboni 1 2 I puntatori in C++ Il puntatore un tipo di dato scalare, che consente di rappresentare gli indirizzi delle variabili allocate in memoria. Dominio: Il dominio di una variabile di tipo puntatore è un

Dettagli

Prova di recupero di Informatica B Corsi di Laurea in Ingegneria Meccanica prof. Francesco Amigoni 20 febbraio 2004

Prova di recupero di Informatica B Corsi di Laurea in Ingegneria Meccanica prof. Francesco Amigoni 20 febbraio 2004 Prova di recupero di Informatica B Corsi di Laurea in Ingegneria Meccanica prof. Francesco Amigoni 20 febbraio 2004 Cognome Nome Matricola Indirizzo (Aerospaziale / Meccanica) Recupero prima prova in itinere:

Dettagli

Strutturazione logica dei dati: i file

Strutturazione logica dei dati: i file Strutturazione logica dei dati: i file Informazioni più complesse possono essere composte a partire da informazioni elementari Esempio di una banca: supponiamo di voler mantenere all'interno di un computer

Dettagli

Esame del 3 febbraio 2010

Esame del 3 febbraio 2010 Fondamenti di Informatica CdL in Ingegneria Gestionale a.a. 2009/2010 Docente: Andrea Prati Esame del 3 febbraio 2010 Esercizio 1 Vettori Sia data un vettore (array monodimensionale) di interi: int VETT[N];

Dettagli

LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B

LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B 23.XI.2012 VINCENZO MARRA Indice Esercizio 1 1 Menu 1 Tempo: 35 min. 2 Commento 1 2 Esercizio 2 2 Ordinamento e ricerca binaria con la classe

Dettagli

FONDAMENTI di INFORMATICA L. Mezzalira

FONDAMENTI di INFORMATICA L. Mezzalira FONDAMENTI di INFORMATICA L. Mezzalira Possibili domande 1 --- Caratteristiche delle macchine tipiche dell informatica Componenti hardware del modello funzionale di sistema informatico Componenti software

Dettagli

Fondamenti di Informatica T. Linguaggio C: i puntatori

Fondamenti di Informatica T. Linguaggio C: i puntatori Linguaggio C: i puntatori Il puntatore E` un tipo di dato scalare, che consente di rappresentare gli indirizzi delle variabili allocate in memoria. Dominio: Il dominio di una variabile di tipo puntatore

Dettagli

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a. 2006-07 Secondo Compitino 21 Dicembre 2006

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a. 2006-07 Secondo Compitino 21 Dicembre 2006 Studente (Cognome Nome): Matricola: Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a. 2006-07 Secondo Compitino 21 Dicembre 2006 Si noti che le soluzioni ai quesiti saranno considerate

Dettagli

Appunti sulla Macchina di Turing. Macchina di Turing

Appunti sulla Macchina di Turing. Macchina di Turing Macchina di Turing Una macchina di Turing è costituita dai seguenti elementi (vedi fig. 1): a) una unità di memoria, detta memoria esterna, consistente in un nastro illimitato in entrambi i sensi e suddiviso

Dettagli

puntatori Lab. Calc. AA 2007/08 1

puntatori Lab. Calc. AA 2007/08 1 puntatori Lab. Calc. AA 2007/08 1 parametri delle funzioni (dalla lezione scorsa) gli argomenti in C vengono passati by value dalla funzione chiamante alla funzione chiamata la lista degli argomenti viene

Dettagli

Matematica in laboratorio

Matematica in laboratorio Unità 1 Attività guidate Attività 1 Foglio elettronico Divisibilità tra numeri naturali Costruisci un foglio di lavoro per determinare se a è divisibile per b, essendo a e b due numeri naturali, con a

Dettagli

Inizializzazione, Assegnamento e Distruzione di Classi

Inizializzazione, Assegnamento e Distruzione di Classi Inizializzazione, Assegnamento e Distruzione di Classi Lezione 9 Operazioni Automatiche In ogni programma C++ oggetti classe vengono gestiti automaticamente dal compilatore Inizializzati al momento della

Dettagli

EXCEL FUNZIONI PRINCIPALI

EXCEL FUNZIONI PRINCIPALI EXCEL FUNZIONI PRINCIPALI Funzione SE() Sintassi: SE(VERIFICA, VALORE SE VERO, VALORE SE FALSO): verifica un valore e ritorna una risposta in base al risultato vero/falso Esempio: =SE(A2=15; "OK"; "NO")

Dettagli

Concetto di Funzione e Procedura METODI in Java

Concetto di Funzione e Procedura METODI in Java Fondamenti di Informatica Concetto di Funzione e Procedura METODI in Java Fondamenti di Informatica - D. Talia - UNICAL 1 Metodi e Sottoprogrammi Mentre in Java tramite le classi e gli oggetti è possibile

Dettagli

Esercizio 1. Esercizi 5. Esercizio 3. Esercizio 2 CICLI

Esercizio 1. Esercizi 5. Esercizio 3. Esercizio 2 CICLI Esercizi 5 Esercizio 1 Realizzare una funzione che, chiesto all utente un numero intero pari a N, ricavi e stampi a video tutte le terne pitagoriche con i cateti minori o uguali ad N. CICLI Una terna pitagorica

Dettagli

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto: Tipi primitivi Il linguaggio Java offre alcuni tipi di dato primitivi Una variabile di tipo primitivo può essere utilizzata direttamente. Non è un riferimento e non ha senso tentare di istanziarla mediante

Dettagli

AA 2006-07 LA RICORSIONE

AA 2006-07 LA RICORSIONE PROGRAMMAZIONE AA 2006-07 LA RICORSIONE AA 2006-07 Prof.ssa A. Lanza - DIB 1/18 LA RICORSIONE Il concetto di ricorsione nasce dalla matematica Una funzione matematica è definita ricorsivamente quando nella

Dettagli

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa E01 Esempi di programmi A. Miola Ottobre 2011 1 Contenuti Vediamo in questa lezione alcuni primi semplici esempi di applicazioni

Dettagli

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014 Laboratorio di Programmazione 1 1 Docente: dr. Damiano Macedonio Lezione 18 31/03/2014 Funzioni: Dichiarazione e Definizione La dichiarazione di una funzione serve a comunicare al compilatore quali sono

Dettagli

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2010-11 13 settembre 2011

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2010-11 13 settembre 2011 Cognome Nome Matricola Postazione PC Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a. 2010-11 13 settembre 2011 Testo Il database di un videonoleggio è costituito da due vettori paralleli.

Dettagli

Fasi di creazione di un programma

Fasi di creazione di un programma Fasi di creazione di un programma 1. Studio Preliminare 2. Analisi del Sistema 6. Manutenzione e Test 3. Progettazione 5. Implementazione 4. Sviluppo 41 Sviluppo di programmi Per la costruzione di un programma

Dettagli

Programmazione I / Informatica generale Prova scritta 11 Giugno 2008

Programmazione I / Informatica generale Prova scritta 11 Giugno 2008 Programmazione I / Informatica generale Prova scritta 11 Giugno 2008 NOTA: Si trascuri ogni problema legato al tipo ed al valore di ritorno della funzione main. Inoltre, nei programmi è da sottintendere

Dettagli

Le variabili. Olga Scotti

Le variabili. Olga Scotti Le variabili Olga Scotti Cos è una variabile Le variabili, in un linguaggio di programmazione, sono dei contenitori. Possono essere riempiti con un valore che poi può essere riletto oppure sostituito.

Dettagli

Access. Microsoft Access. Aprire Access. Aprire Access. Aprire un database. Creare un nuovo database

Access. Microsoft Access. Aprire Access. Aprire Access. Aprire un database. Creare un nuovo database Microsoft Access Introduzione alle basi di dati Access E un programma di gestione di database (DBMS) Access offre: un supporto transazionale limitato Meccanismi di sicurezza, protezione di dati e gestione

Dettagli

Uso di base delle funzioni in Microsoft Excel

Uso di base delle funzioni in Microsoft Excel Uso di base delle funzioni in Microsoft Excel Le funzioni Una funzione è un operatore che applicato a uno o più argomenti (valori, siano essi numeri con virgola, numeri interi, stringhe di caratteri) restituisce

Dettagli

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008 Se devo memorizzare più valori che sono in qualche modo parenti dal punto di vista logico, posso usare il concetto di vettore di variabili (array). Ad esempio, se devo memorizzare le temperature di tutti

Dettagli

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore. 1 Esercizio 1 1. Immaginate di avere una calcolatore che invece che poter rappresentare i classici due valori per ogni bit (0/1) possa rappresentare 7 valori per ogni bit. (a) Quanti bit gli occorreranno

Dettagli

costruttori e distruttori

costruttori e distruttori costruttori e distruttori Costruttore E un metodo che ha lo stesso nome della classe a cui appartiene: serve per inizializzare un oggetto all atto della sua creazione Ce ne possono essere uno, più di uno,

Dettagli

FORMULE: Operatori matematici

FORMULE: Operatori matematici Formule e funzioni FORMULE Le formule sono necessarie per eseguire calcoli utilizzando i valori presenti nelle celle di un foglio di lavoro. Una formula inizia col segno uguale (=). La formula deve essere

Dettagli

Lezione 8. La macchina universale

Lezione 8. La macchina universale Lezione 8 Algoritmi La macchina universale Un elaboratore o computer è una macchina digitale, elettronica, automatica capace di effettuare trasformazioni o elaborazioni su i dati digitale= l informazione

Dettagli

Introduzione al MATLAB c Parte 2

Introduzione al MATLAB c Parte 2 Introduzione al MATLAB c Parte 2 Lucia Gastaldi Dipartimento di Matematica, http://dm.ing.unibs.it/gastaldi/ 18 gennaio 2008 Outline 1 M-file di tipo Script e Function Script Function 2 Costrutti di programmazione

Dettagli

I file di dati. Unità didattica D1 1

I file di dati. Unità didattica D1 1 I file di dati Unità didattica D1 1 1) I file sequenziali Utili per la memorizzazione di informazioni testuali Si tratta di strutture organizzate per righe e non per record Non sono adatte per grandi quantità

Dettagli

LUdeS Informatica 2 EXCEL. Seconda parte AA 2013/2014

LUdeS Informatica 2 EXCEL. Seconda parte AA 2013/2014 LUdeS Informatica 2 EXCEL Seconda parte AA 2013/2014 STAMPA Quando si esegue il comando FILE STAMPA, Excel manda alla stampante tutte le celle del foglio di lavoro corrente che hanno un contenuto. Il numero

Dettagli

LISTE, INSIEMI, ALBERI E RICORSIONE

LISTE, INSIEMI, ALBERI E RICORSIONE LISTE, INSIEMI, ALBERI E RICORSIONE Settimo Laboratorio LISTE E RICORSIONE SVUOTALISTA: CONSIDERAZIONI Per svuotare una lista si devono eliminare i singoli nodi allocati con la malloc... Come fare? Per

Dettagli

Linguaggio C - Funzioni

Linguaggio C - Funzioni Linguaggio C - Funzioni Funzioni: Il linguaggio C è di tipo procedurale; ogni programma viene suddiviso in sottoprogrammi, ognuno dei quali svolge un determinato compito. I sottoprogrammi si usano anche

Dettagli

MODELLO RELAZIONALE. Introduzione

MODELLO RELAZIONALE. Introduzione MODELLO RELAZIONALE Introduzione E' stato proposto agli inizi degli anni 70 da Codd finalizzato alla realizzazione dell indipendenza dei dati, unisce concetti derivati dalla teoria degli insiemi (relazioni)

Dettagli

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano Gestione della memoria p. 1/11 Programmazione Laboratorio Roberto Cordone DI - Università degli Studi di Milano Tel. 02 503 16235 E-mail: roberto.cordone@unimi.it Ricevimento: su appuntamento Lezioni:

Dettagli

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 3 - Variabili Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di

Dettagli

Il foglio elettronico 5/06/2013

Il foglio elettronico 5/06/2013 Il foglio elettronico 5/06/2013 Che cos'è un foglio elettronico Quando dobbiamo eseguire dei calcoli, rappresentare tabelle, fare disegni, siamo portati naturalmente a servirci di fogli a quadretti perché

Dettagli

Linguaggio C. Fondamenti. Struttura di un programma.

Linguaggio C. Fondamenti. Struttura di un programma. Linguaggio C Fondamenti. Struttura di un programma. 1 La storia del Linguaggio C La nascita del linguaggio C fu dovuta all esigenza di disporre di un Linguaggio ad alto livello adatto alla realizzazione

Dettagli

Editor vi. Editor vi

Editor vi. Editor vi Editor vi vi 1 Editor vi Il vi è l editor di testo standard per UNIX, è presente in tutte le versioni base e funziona con qualsiasi terminale a caratteri Permette di visualizzare una schermata alla volta

Dettagli

Hub-PA Versione 1.0.6 Manuale utente

Hub-PA Versione 1.0.6 Manuale utente Hub-PA Versione 1.0.6 Manuale utente (Giugno 2014) Hub-PA è la porta d ingresso al servizio di fatturazione elettronica verso la Pubblica Amministrazione (PA) a disposizione di ogni fornitore. Questo manuale

Dettagli

Funzioni matlab per la gestione dei file. Informatica B Prof. Morzenti

Funzioni matlab per la gestione dei file. Informatica B Prof. Morzenti Funzioni matlab per la gestione dei file Informatica B Prof. Morzenti File Contenitori di informazione permanenti Sono memorizzati su memoria di massa Possono continuare a esistere indipendentemente dalla

Dettagli