APPUNTI SUL LINGUAGGIO C

Slides:



Advertisements
Presentazioni simili
Fondamenti di Informatica
Advertisements

UNIVERSITA’ DI MILANO-BICOCCA LAUREA MAGISTRALE IN BIOINFORMATICA
Uso avanzato di C.
Nel C non esiste un dato primario di tipo stringa; queste sono rappresentate con un array monodimensionale di caratteri (tipo char). Così per definire.
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Iterazione A. Ferrari.
Procedure e funzioni ricorsive
MATLAB.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Informatica Generale Marzia Buscemi
Algoritmi in C++ (1) da completare
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
ESERCITAZIONE N. 5 ESERCIZIO N. 1 Autore: Biagio Brattoli S I Corso.
Esercizi su alberi binari
Tail recursion: esempio
Esercizi su alberi binari di ricerca
Esercizi su strutture dinamiche Fondamenti di Programmazione Canale AD a.a. 2009/2010.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 6 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
Informatica di base A.A. 2003/2004 Algoritmi e programmi
Università degli Studi di Bergamo Facoltà di Lingue e Letterature Straniere Facoltà di Lettere e Filosofia A.A Informatica generale 1 Appunti.
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Esercizi vari Esercizi.
CORSO DI PROGRAMMAZIONE II
CORSO DI PROGRAMMAZIONE II
Algoritmi e Strutture Dati Valutazione del tempo di esecuzione degli algoritmi.
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
APPUNTI SUL LINGUAGGIO C
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente)
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su alberi binari
Algoritmo SelectSort Invariante di ciclo: ad ogni passo
Esercitazioni sui File Nicola Fanizzi - DIB Corso (B) di Programmazione CdL in Informatica – I livello A.A. 2003/2004.
Algoritmi su Tipi Semplici
Array Ricerca Ordinamento Fusione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.
Strutture di controllo in C -- Flow Chart --
Esercizi C sui tipi definiti dall’utente
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
Esercizi C su array e matrici
Le liste dinamiche La ricorsione
OPERAZIONI CON STRINGHE Le operazioni più interessanti da fare, per ora, con le stringhe sono: determinare la lunghezza della stringa, cioè quanti caratteri.
Le funzioni.
Calcolo del Massimo Comun Divisore
Programmazione di Calcolatori
Esercizi su File.
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
ESERCIZI.
Tail recursion: esempio
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Ricerca sequenziale in un array di interi
ND-partizione (A) n   A  somma  0 M  1/2 (  a i ) for i  1 to n do S[i]  choice ({true, false}) if S[i] then somma  somma + a i if somma > M then.
Programmazione Strutturata
1 Esempi domande di esame. 2 Dato il seguente programma #include int main(){ int *p,j=9,i=5; p=&j; *p=i; printf("%d %d %d\n", i,j,*p); scanf("%d",p);/*
Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni – BCOR Ingegneria Elettronica – BELR Introduzione al C Esercitazione 5 D. Bloisi, A.
ALGORITMI Un algoritmo è un insieme di istruzioni: -ordinate -non ambigue -effettivamente computabili.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (II) Istruzioni e strutture di controllo.
Soluzione 6: Algoritmo Quicksort
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta.
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi.
Algoritmo per il calcolo del maggiore tra tre numeri qualsiasi Francesco PUCILLO matr
Luca Chichisola1 Dal problema al programma LUCA CHICHISOLA.
CICLO DO – WHILE LINGUAGGIO C.
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C Esercizi sugli array e strutture
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi
Transcript della presentazione:

APPUNTI SUL LINGUAGGIO C Corso di Calcolatori Elettronici APPUNTI SUL LINGUAGGIO C Esercitazione I Esercizi di base

Esercizio: Scrivere un programma per calcolare il massimo tra 10 numeri forniti dall’utente. n1 n10 n2 n3 a b ni max

Pseudocodifica ► scriviamo una procedura per calcolare il massimo tra due numeri MAX(a,b) if a>b then massimo ← a else massimo ← b return massimo ► scriviamo una procedura che calcola il massimo tra 10 numeri MAXtot() i ← 2 Leggi(a) Leggi(b) massimo ← MAX(a,b) while i < 10 do Leggi(a) massimo ← MAX(massimo,a); i ← i + 1

Pseudocodifica ► algoritmo principale begin massimo ← Maxtot() Stampa(massimo) end

Programma C #include <stdio.h> int MAX(int a, int b) { int massimo; if (a>b) massimo=a; else massimo=b; return massimo; } int MAXtot() { int a, i=2, massimo; scanf("%d", &a); scanf("%d", &massimo); massimo = MAX(a,massimo); while (i<10) { printf("Inserire un numero:"); scanf("%d", &a); Massimo = MAX(massimo,a); i++; return massimo; main() { printf("Il numero massimo inserito e’: %d\n", MAXtot());

Array Oss. N sia una costante (per esempio 15). Esercizio: Data una lista di N numeri (un array di N elementi) stampare il minimo e il massimo elemento tra gli N forniti da input. Oss. N sia una costante (per esempio 15).

Pseudocodifica ► scriviamo una procedura per calcolare il massimo in un vettore MAX(vet) max ← vet[0] for i ← 1 to 15 do if vet[i] > max then max = vet[i] return max ► scriviamo una procedura per calcolare il minimo in un vettore MIN(vet) min ← vet[0] do if vet[i] < min then min = vet[i] return min

Pseudocodifica ► algoritmo principale begin Leggi(vet) massimo ← MAX(vet) minimo ← MIN(vet) Stampa(minimo) Stampa(massimo) end

Array include <stdio.h>; #define N 15 /* è noto a tutti che la dimensione del vettore è N */ int minimo (int vet[]) { int i, min; min = vet[0]; for (i = 1; i<N; i ++) if (vet[i]<min) min = vet[i]; return min; } int massimo (int vet[]) { int i, max; max = vet[0]; if (vet[i]>max) max = vet[i]; return max;

Array main () { int i, a[N]; printf ("Scrivi %d numeri interi\n", N); for (i = 0; i<N; i++) scanf ("%d", &a[i]); printf ("Il minimo vale %d e il massimo è %d\n", minimo(a), massimo(a)); }

Array Dati N valori interi forniti in ordine qualunque, stampare in uscita l'elenco dei valori dati in ordine crescente. Oss. N sia una costante (per esempio 15). Vettore di elementi di un certo tipo, sul quale è definita una relazione d’ordine totale : – Selection sort, o ordinamento per minimi successivi: – Ad ogni passo seleziona il minimo nel vettore e lo pone nella prima posizione, richiamandosi ed escludendo dal vettore il primo elemento.

Array Primo livello di specifica: – leggi gli elementi – ordina il vettore – stampa il vettore ordinato • Secondo livello di specifica per l’ordinamento while (<il vettore ha più di una componente>) { <individua il minimo nel vettore corrente in posizione posmin> <scambia se necessario il primo elemento del vettore corrente con quello in posizione posmin > <considera come vettore corrente quello precedente tolto il primo elemento> }

Array posmin 2 5 1 -1 posmin -1 5 1 2 -1 5 1 2 Vettore corrente [0] [1] [2] [3] 2 5 1 -1 posmin [0] [1] [2] [3] [0] [1] [2] [3] -1 5 1 2 -1 5 1 2 Vettore corrente

Pseudocodifica ► scriviamo una procedura per ordinare un vettore tramite l’insertion sort SORT(vet) for j ← 0 to lenght(vet) do posmin ← j min ← vet[j] ► mi calcolo posmin for i ← j to lenght(vet) do if vet[i] < min then min ← vet[i] posmin ← i ► verifico se il posmin è cambiato e quindi scambio if posmin ≠ j then vet[posmin] ← vet[j] vet[j] ← min

Pseudocodifica ► algoritmo principale begin Leggi(vet) SORT(vet) Stampa(vet) end

Array #include <stdio.h> #define N 15 void leggi(int a[]) { int i; printf ("Scrivi %d interi\n", N); for (i = 0; i < N; i++) scanf ("%d", &a[i]); } void scrivi(int a[]) { printf ("Vettore ordinato:\n"); printf ("%d \t", a[i]);

Array void sort (int vet[]) { int j, i, posmin, min; for (j=0; j < N; j++) { posmin=j; min = vet[j]; for (i=j+1;i<N; i++) if (vet[i]<min) { min=vet[i]; posmin=i; } if (posmin != j) { /*scambio */ vet[posmin]=vet[j]; vet[j]= min;

Array main () { int i, a[N]; leggi(a); sort(a); scrivi(a); }

Array Dati N valori interi forniti in ordine qualunque, stampare in uscita l'elenco dei valori dati in ordine crescente. Oss. N sia una costante (per esempio 15). Vettore di elementi di un certo tipo, sul quale è definita una relazione d’ordine totale : – Merge Sort

Merge Sort dividi fondi

Merge Sort Assumiamo di avere un vettore A Indichiamo con p e r gli indici di estremo (primo e ultima posizione) q rappresenta l’indice di pivot per dividere una sequenza p < q < r A[p..q] e A[q+1..r] sono ordinati MERGE(A,p,q,r) per fondere MERGE-SORT(A,p,r) per ordinare

► scriviamo la procedura di fusione MERGE(A,p,q,r) i ← p j ← q+1 k ← 1 while i <= q and j <= r do if A[i] <= A[j] then APP[k] ← A[i] i ← i + 1 else APP[k] ← A[j] j ← j + 1 k ← k + 1 if i = q+1 then for i ← j to r do APP[k] ← A[i] k ← k+1 else for j ← i to q do APP[k] ← A[j] k ← 1 for i ← p to r do A[i] ← APP[k]

► scriviamo la procedura di ordinamento MERGE-SORT(A,p,r) if p < r then q ← (p+r)/2 MERGE-SORT(A,p,q) MERGE-SORT(A,q+1,r) MERGE(A,p,q,r) ► scriviamo il blocco principale begin Leggi(vet) MERGE-SORT(vet,1,lenght(vet)) Stampa(vet) end

Array #include <stdio.h> #define N 15 void leggi(int a[]) { int i; printf ("Scrivi %d interi\n", N); for (i = 0; i < N; i++) scanf ("%d", &a[i]); } void scrivi(int a[]) { printf ("Vettore ordinato:\n"); printf ("%d \t", a[i]);

void Merge(int A[], int iniziale, int mediano, int finale) { /* Fonde i due sottovettori ordinati di A da iniziale a mediano e da mediano+1 a finale in un unico sottovettore ordinato. */ int B[100]; /* vettore di appoggio */ int primo, secondo, appoggio, da_copiare; primo = iniziale; secondo = mediano + 1; appoggio = iniziale; while (primo <= mediano && secondo <= finale) { if (A[primo] <= A[secondo]) { B[appoggio] = A[primo]; primo++; } else { B[appoggio] = A[secondo]; secondo++; appoggio++;

if (secondo > finale) /* e‘ finito prima il secondo sottovettore; copia da A in B tutti gli elementi del primo sottovettore fino a mediano */ for (da_copiare = primo; da_copiare <= mediano; da_copiare++) { B[appoggio] = A[da_copiare]; appoggio++; } else /* e‘ finito prima il primo sottovettore copia da A in B tutti gli elementi del secondo sottovettore fino a finale */ for (da_copiare = secondo; da_copiare <= finale; da_copiare++) { /* ricopia tutti gli elementi da iniziale a finale da B ad A */ for (da_copiare = iniziale; da_copiare <= finale; da_copiare++) A[da_copiare] = B[da_copiare]; } /* MergeVettore */

void MergeSort(int A[], int iniziale, int finale) { /* Ordina gli elementi del vettore A di indice compreso tra iniziale e finale usando l’algoritmo di ordinamento per fusione. */ int mediano; if (iniziale < finale) { /* l’intervallo da iniziale a finale, estremi inclusi comprende almeno due elementi */ mediano = (iniziale + finale) / 2; MergeSort(A, iniziale, mediano); MergeSort(A, mediano+1, finale); Merge(A, iniziale, mediano, finale); } } /* MergeRicorsivo */ main(){ /* Ordina i primi n elementi del vettore A usando l’algoritmo di ordinamento per fusione. */ int A[100]; leggi(A); MergeSort(A, 0, N-1); scrivi(A); } /* MergeSort */

Array Dati N valori interi forniti in ordine qualunque, stampare in uscita l'elenco dei valori dati in ordine crescente. Oss. N sia una costante (per esempio 15). Vettore di elementi di un certo tipo, sul quale è definita una relazione d’ordine parziale : – Heap Sort

Heap Un Heap è un albero bilanciato rappresentato mediante un array. Ad ogni nodo dell’albero è associato un indice 1 : 2 3 4 5 6 7 8 9 10 8 3 5 9 1 4 7 6 2

Heap Un Heap è una struttura dati composta da un array che possiamo considerare come un albero binario quasi completo. Ad ogni nodo dell’albero è associato un indice 1 : 9 2 3 8 7 4 5 6 7 6 2 4 5 8 9 10 5 1 9 8 7 6 2 4 5 1

Heap in C Utiliziamo una convenzione: In posizione [0] indichiamo il numero di elementi dell’Heap (hp) In posizione [N-1] indichiamo la lunghezza N dell’array PARENT(i), LEFT(i) e RIGHT(i) restituiscono gli indici del padre, figlio sinistro, figlio destro del nodo in posizione i. 1 : 9 2 3 8 7 4 5 6 7 6 2 4 5 8 9 10 5 1 10 9 8 7 6 2 4 5 1 .. 99

► scriviamo le procedure di navigazione dell’HEAP PARENT(i) return i/2 LEFT(i) return 2i RIGHT(i) return 2i+1

Heapify Due Tipi di HEAP MAX-HEAP: A[PARENT(i)] > A[i] MIN-HEAP: A[PARENT(i)] < A[i] Si vuole conservare tale proprietà di HEAP.

► Scriviamo la procedura di MAX-HEAPIFY MAX-HEAPIFY(A,i) l ← LEFT(i) r ← RIGHT(i) if l < A[0] and A[l] > A[i] then massimo ← l else massimo ← i if r < A[0] and A[r] > A[massimo] then massimo ← r if massimo ≠ i then “scambia A[i] con A[massimo]” MAX-HEAPIFY(A,massimo)

► Dato un Array qualsiasi vogliamo convertirlo in un MAX-HEAP BUILD-MAXHEAP(A) A[0] ← lenght(A) for i ← lenght(A)/2 downto 1 do MAX-HEAPIFY(A,i) Proprietà che le foglie in un heap partono dall’indice n/2, con n numero di nodi

► Dato un Array qualsiasi vogliamo ordinarlo con l’HEAP-SORT HEAPSORT(A) BUILD-MAXHEAP(A) for i ← lenght(A) downto 2 do “scambia A[1] con A[i]” A[0] ← A[0] - 1 MAX-HEAPIFY(A,1)

#include <stdio.h> #define N 100 // PARENT(i), LEFT(i), RIGHT(i) e scambia int PARENT(int i) { return (i/2); } int LEFT(int i) { return 2*i; int RIGHT(int i){ return (2*i)+1; void scambia(int HEAP[], int ind1, int ind2){ int appo; appo = HEAP[ind1]; HEAP[ind1]=HEAP[ind2]; HEAP[ind2]=appo;

void MAXHEAPIFY(int HEAP[], int i){ int largest; int l = LEFT(i); int r = RIGHT(i); if ((l <= HEAP[0]) && (HEAP[l] > HEAP[i])) largest = l; else largest = i; if ((r <= HEAP[0]) && (HEAP[r] > HEAP[largest])) largest = r; if (largest != i) { scambia(HEAP,i,largest); MAXHEAPIFY(HEAP,largest); }

void BUILD_MAXHEAP(int HEAP){ int i; HEAP[0] = HEAP[N-1]; for (i=(HEAP[N-1]/2);i>0;i--) MAXHEAPIFY(HEAP,i); }

void HEAP_SORT(int HEAP[]) { int i; BUILD_MAXHEAP(HEAP); for(i=HEAP[N-1];i>1;i--) { scambia(HEAP,1,i); (HEAP[0])--; MAXHEAPIFY(HEAP,1); }

APPUNTI SUL LINGUAGGIO C Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi di base FINE