In questo articolo realizzeremo degli esercizi con Algobuild.
Esercizio 1 con Algobuild
Conoscendo il prezzo di un oggetto (prezzo) e i soldi a disposizione nel proprio portafoglio, determinare se è possibile acquistare o no l’oggetto. Inoltre, se è possibile, verificare se e quanti soldi rimangono nel portafoglio dopo l’acquisto.
Questo semplice algoritmo si risolve quindi con le strutture di selezione.
Ellisseper l’inizio e per la fine;
Parallelogramma per inserire l’input, ovvero in questo caso per prendere il prezzo e i soldi a disposizione e per visualizzare in output il risultato;
Rettangolo per compiere le operazioni;
Romboper effettuare un test che può essere vero o falso. In questo caso si effettua un solo test.
Procedimento
Innanzitutto chiediamo in input il prezzo del prodotto e i soldi a disposizione. Quindi le due variabili che prenderemo in input sono prezzo e soldi.
Dopo controlliamo se il prezzo è maggiore dei soldi, cioè: prezzo>soldi.
Se è vero non è possibile acquistare il prodotto e visualizziamo il messaggio in output. Altrimenti se è falso vuol dire che il prezzo è minore o uguale ai soldi, dunque è possibile comprare l’oggetto.
In quest’ultimo caso calcoliamo quanto resterà nel portafoglio semplicemente facendo la differenza tra i soldi che abbiamo e il prezzo del prodotto: d=soldi-prezzo.
N.B. Ricordiamo che l’opposto di > è <=, non <.
Risoluzione con Algobuild
Presentiamo adesso la soluzione all’algoritmo proposto con Algobuild.
Questo è uno dei semplici esercizi con Algobuild che volevo proporvi oggi.
Esercizio 2 con Algobuild
Un’agenzia noleggia auto ai propri clienti a 30€ al giorno. Se i giorni di noleggio sono maggiori di 6 si applica uno sconto del 10% sul totale. Calcolare il prezzo da pagare.
Anche questo semplice algoritmo si risolve con le strutture di selezione:
Ellisseper l’inizio e per la fine;
Parallelogramma per inserire l’input, ovvero in questo caso i giorni e per visualizzare in output il totale da pagare;
Rettangolo per compiere le operazioni, ed assegnare un valore alla costante prezzo;
Romboper effettuare un test che può essere vero o falso. In questo caso si effettua un solo test.
Procedimento
Chiediamo in input i giorni e assegniamo a prezzo il valore di 30. Notate che prezzo non è un input ma un valore costante, quindi si deve utilizzare il rettangolo.
Dopo facciamo un test sui giorni e se sono minori o uguali a 6 calcoliamo il prezzo senza sconto, altrimenti effettuiamo uno sconto del 10% sul totale.
Allego quindi l’esercizio completo creato con Algobuild.
Questi sono solo alcuni semplici esercizi con algobuild, più avanti ne presenterò degli altri.
Implementiamo il quick sort in C, un algoritmo di ordinamento che così come il merge sort segue il metodo divide et impera. Il quick sort è un algoritmo che viene utilizzato per ordinare i dati in un vettore (array).
Cioè è basato su questa tecnica:
Divide: Si suddivide il problema in sotto-problemi più piccoli;
Impera: si risolvono i problemi in maniera ricorsiva (ovvero un algoritmo che richiama se stesso);
Combina: al fine di ottenere il risultato finale si combina l’output ottenuto dalle precedenti chiamate ricorsive.
Il Quick Sort è infatti un algoritmo ricorsivo che ha, generalmente, prestazioni migliori tra quelli basati su confronto.
In questo algoritmo la ricorsione viene fatta non dividendo il vettore in base agli indici ma in base al suo contenuto.
Prima di risolvere l’algoritmo del quick sort in C, studiamo l’idea di base:
Si sceglie l’elemento centrale del vettore (detto pivot) e lo si memorizza in una variabile
a sinistra si mettono gli elementi >= pivot
a destra si mettono gli elementi < pivot
si ordina ricorsivamente la parte destra e la parte sinistra.
La procedura che divide in due parti il vettore si chiama partition.
Chiaramente la scelta del pivot non è legata necessariamente al primo elemento, potrebbe anche essere l’ultimo o il mediano oppure essere un elemento random.
Esempio del quick sort in C
Scegliamo come Pivot il primo elemento, dunque Pivot=4.
Dobbiamo avere a sinistra gli elementi minori di Pivot, a destra gli elementi maggiori.
Facciamo partire l’indice i da sinistra ovvero dal primo elemento e l’indice j da destra ovvero dall’ultimo elemento.
Per comodità ci riferiremo a primoe ultimo per vedere in dettaglio tutti i passaggi.
Dapprima avremo:
Pivot=4 (si trova in posizione i)
primo=4
ultimo=8
Ci chiediamo Pivot è minore di ultimo? Cioè 4 è minore di 8?
Si, allora procedo e sposto l’indice j (perchè a destra devo avere gli elementi maggiori, quindi non devo scambiarli!)
Quindi avremo:
Pivot=4 (si trova in posizione i)
primo=4
ultimo=3
Ci poniamo allora la domandaPivot è minore di ultimo?
No, allora sposto Pivot in posizione j, cioè in ultimo.
Quindi avrò il terzo passaggio:
Pivot=4 (si trova in posizione j)
primo=3
ultimo=4
Adesso Pivotè in posizione indicata dall’indice j, dunque sposto l’indice i.
Mi chiedo Pivotè maggiore di primo?
Si, allora sposto l’indice i. E continuo spostando l’indice i fino all’elemento 5.
Quindi avrò:
Pivot=4 (si trova in posizione j)
primo=5
ultimo=4
Mi chiedo ancora Pivot è maggiore di primo?
No, allora sostituisco Pivot nella posizione di primo.
Quindi avrò:
Pivot=4 (si trova in posizione i)
primo=4
ultimo=5
Come in figura sotto:
Adesso Pivot si trova in posizione i, facciamo muovere j.
Cioè Pivotè minore di ultimo? Si allora sposto l’indice j e avrò:
Pivot=4 (si trova in posizione i)
primo=4
ultimo=0
Pivotè minore di ultimo?
No allora li scambiamo. Avremo:
Pivot=4 (si trova in posizione j)
primo=0
ultimo=4
Quindi ci chiediamo Pivot è maggiore di primo?
Si, allora spostiamo l’indice i e avremo la situazione:
Pivot=4 (si trova in posizione i)
primo=4
ultimo=2
Adesso chiediamo: Pivotè minore di primo?
Si allora l’indice i coinciderà con j.
Adesso che abbiamo a destra gli elementi maggiori del Pivot e a sinistra gli elementi minori dobbiamo procedere con l’ordinamento dei due sotto-array procedendo allo stesso modo.
Sviluppo dell’algoritmo Quick Sort in C
#include<stdio.h>
#define MAX 100
int insert_array(int a[]) {
int n, i;
printf("Quanti elementi?: ");
scanf("%d", &n);
for (i=0; i<n; i++) {
printf("elemento %d: ", i);
scanf("%d", &a[i]);
}
return(n);
}
void stampa_array(int a[], int n) {
int i;
for (i=0; i<n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return;
}
void quicksort(int a[MAX],int primo,int ultimo){
int i, j, pivot, temp;
/*pivot -- inizialmente il pivot è il primo elemento
primo e ultimo sono le due variabili che servono per scorrere l'array
*/
if(primo<ultimo){
pivot=primo;
i=primo;
j=ultimo;
while(i<j){
while(a[i]<=a[pivot]&&i<ultimo)
i++;
while(a[j]>a[pivot])
j--;
if(i<j){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
temp=a[pivot];
a[pivot]=a[j];
a[j]=temp;
quicksort(a,primo,j-1);
quicksort(a,j+1,ultimo);
}
}
int main(){
int n, a[MAX],i;
n = insert_array(a);
printf("Array iniziale: ");
stampa_array(a,n);
quicksort(a,0,n-1);
printf("Array ordinato con quick-sort: ");
stampa_array(a,n);
return 0;
}
Il tempo di esecuzione del quick sort è proporzionale a n log n dunque è molto inferiore a n2.
Chiaramente quella presentata è solo un esempio di possibile implementazione del quick sort in C.