da Cristina | Feb 18, 2019 | Algoritmi in C
Vogliamo realizzare un semplice programma che presi in input 10 numeri mi restituisca la loro somma usando il ciclo for in C.
Ecco il listato completo dell’algoritmo per la somma di 10 numeri usando il ciclo for in C:
#include <stdio.h>
//Somma di 10 numeri usando il ciclo for in C
main()
{
int numero, i;
int somma=0;
for(i=0;i<10;i++) {
printf("inserisci il %d numero: ", i+1);
scanf("%d", &numero);
somma+=numero;
}
printf("la somma e' %d:\n ", somma);
system("PAUSE");
}
Ho utilizzato la forma abbreviata somma+=numero che è equivalente a somma=somma+numero.
Quindi facciamo la dimostrazione passo passo dell’algoritmo sommando solo tre numeri per brevità.
Primo passo:
for(i=0;i<10;i++) i=0 quindi il test i<3 è vero
chiedo il numero ad esempio: n=5
aggiungi a somma il numero: somma=somma+numero=0+5=5
Secondo passo:
for(i=0;i<10;i++) i=1 quindi il test i<3 è vero
chiedo il numero ad esempio: n=-2
aggiungi a somma il numero: somma=somma+numero=5+(-3)=2
Terzo passo:
for(i=0;i<10;i++) i=2 quindi il test i<3 è vero
chiedo il numero ad esempio: n=10
aggiungi a somma il numero: somma=somma+numero=2+10=12
Quarto passo:
for(i=0;i<10;i++) i=3 quindi il test i<3 è falso per cui non si continua con il for e si passa all’istruzione successiva.
Dunque si stampa la somma!
Alcuni link utili
Indice argomenti linguaggio C
La funzione fopen
La funzione fclose
Funzione fprintf
Funzione fscanf
Allocazione dinamica della memoria con malloc
Strutture in C
Typedef struct in C
Esercitazione sulle struct in C
Realizzare un menù di scelta in C
Strutture complesse in C
Come sommare gli elementi della cornice esterna
Come sommare due matrici
Matrice trasposta
Prodotto tra matrici
Ricerca elementi in una matrice
Tavola pitagorica in C
Array multidimensionali
Quick sort in C
Selection sort in C
Merge sort in C
Insertion Sort in C
da Cristina | Feb 18, 2019 | Algoritmi in C
Parliamo adesso delle strutture di controllo iterative, ovvero i cicli.
Quando si desidera ripetere un’operazione un determintato numero di volte si ricorre alle strutture di controllo iterative.
Tipi di strutture di controllo iterative.
Ci sono tre tipi di strutture iterative:
Inoltre, anche i costrutti iterativi, come quelli di selezione, possono essere annidati.
while
Il while è un costrutto pre-condizionale ovvero il controllo della condizione è precedente all’esecuzione delle istruzioni.
La sintassi è la seguente:
while (<Condizione>)
<Istruzione/i>;
dove istruzione/i rappresenta un’istruzione singola oppure un blocco di istruzioni, in quest’ultimo caso sono necessarie le parentesi graffe.
La semantica è la seguente:
- si valuta la Condizione;
- se la condizione è vera, viene eseguita l’Istruzione/i e si ritorna al punto 1;
- se la condizione è falsa l’Istruzione/i non viene eseguita e il controllo passa all’istruzione successiva al while.
Esempio:
Programma che inserisce dieci numeri.
…
int i=0; //inizializzo il contatore a zero
while(i<10)
{
printf(“inserisci un numero: “);
scanf(“%d”, &numero);
i=i+1; //incremento il contatore di uno
}
Il ciclo si fermerà quando i sarà uguale a 9.
do while
Il do … while diversamente dal while, è post condizionale, ovvero valuta la condizione alla fine del ciclo.
Quindi i corpo del ciclo do … while viene eseguito almeno una volta.
La sintassi è la seguente:
do
<Istruzione/i>;
while (<Condizione>);
dove Istruzione/i rappresenta un’istruzione singola oppure un blocco di istruzioni, in quest’ultimo caso sono necessarie le parentesi graffe.
La semantica è la seguente:
- Si esegue l’Istruzione/i;
- Si valuta la Condizione;
- Se la Condizione è vera si ritorna al punto 1;
- Se la Condizione è falsa, il controllo passa all’istruzione successiva al do … while.
Esempio:
Programma che inserisce dei numeri minori di 10
do
{
printf(“inserisci un numero: “);
scanf(“%d”, &numero);
} while (numero<10);
for
Una struttura più potente delle precedenti è il for.
La sintassi è la seguente:
for ([<Espressione1>]; [<Espressione2>];[<Espressione3>])
<Istruzione/i>;
dove:
- Espressione1 è il punto di partenza dell’iterazione, può anche essere un’espressione che inizializza le variabili del ciclo o una dichiarazione di variabili.
- Espressione2 è la condizione che permetterà al ciclo di continuare.
- Espressione3 è di solito un’istruzione di incremento o decremento del contatore.
Istruzione/i indica un’istruzione singola o un blocco di istruzioni racchiuse tra parentesi graffe ed è il corpo dell’iterazione.
Esempio:
for(i=0;i<10;i++)
{
printf(“inserisci un numero: “);
scanf(“%d”, &numero);
}
Link utili:
Fibonacci
Numero primo
Somma di 10 numeri
Media dei numeri in un array
Selection sort
Insertion sort
Quick sort
Merge sort
da Cristina | Feb 18, 2019 | Algoritmi in C
In questa lezione ci eserciteremo con i cicli for annidati in C, cioè studieremo le iterazioni eseguite dentro un’altra iterazione.
Innanzitutto notiamo che nei cicli annidati, il ciclo più esterno esegue N volte il ciclo più interno. Infatti, al suo primo passo, il ciclo esterno mette in esecuzione quello interno. Questo a sua volta esegue il proprio blocco di codice fino alla conclusione. Dopo, al secondo passo, il ciclo esterno rimette in esecuzione quello interno. Ciò si ripete finché il ciclo esterno non termina.
Facciamo subito degli esempi per capirne il funzionamento.
Primo esempio sui cicli for annidati in C
Nel primo esempio che propongo in questa lezione stamperemo 3 righe e 5 colonne con i seguenti dati:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
Il ciclo più esterno viene eseguito quindi 3 volte, l’indice i infatti parte da 0 e arriva a 2. Il ciclo più interno viene eseguito 5 volte infatti l’indice j va da 0 a 4.
Ogni ciclo esterno scrive nella prima riga una sequenza di 5 numeri. La prima volta stampa: (i+1) (i +1) (i +1) (i +1) (i +1) cioè 1 1 1 1 1, dopo va a capo e incrementa i di 1, quindi stampa 2 2 2 2 2, dopo va nuovamente a capo e incrementa i di 1 quindi stampa 3 3 3 3 3.
Poi i diventa 4 e il test (i<3) non è più valido, quindi il programma esce anche dal ciclo for esterno.
Ecco dunque il listato completo che produce 3 righe e 5 colonne:
#include <stdio.h>
main()
{
int i, j;
for(i=0;i<3;i++) {
for (j=0;j<5;j++)
printf("%d ", i+1);
printf("\n");//va a capo
}
system("PAUSE");
}
Secondo esempio sui cicli annidati
In questo secondo esempio vogliamo produrre questo output:
0 1 2 3 4 5 6 7 8 9
10 11....
E così via fino a 100. Quindi vogliamo stampare i numeri da 0 a 100 e andare a capo ogni 10 numeri.
Utilizzeremo questa istruzione i*10+j anche per capire meglio l’uso degli indici.
for(i=0;i<10;i++) { // i=0 test vero
for (j=0;j<10;j++) //j=0 test vero
printf(“%4d “, i*10+j); // stampiamo i*10+j=0*10+0=0
printf(“\n”); //va a capo
Quindi si ripete il ciclo interno
for (j=0;j<10;j++) //i=0 e j=1
printf(“%4d “, i*10+j); // stampiamo i*10+j=0*10+1=1
….
Continuiamo così fino a stampare il 9.
Dopo infatti il ciclo interno si interrompe perchè il test 10<10 è falso.
Allora i si incrementa di 1, quindi avremo:
for(i=0;i<10;i++) { // i=1 test vero
for (j=0;j<10;j++) //j=0 test vero
printf(“%4d “, i*10+j); // stampiamo i*10+j=1*10+0=10
printf(“\n”); //va a capo
….
Si continua il ciclo interno fino a stampare il numero 19.
Al termine stamperemo tutti i numeri da 0 a 100.
Ecco quindi il listato completo:
#include <stdio.h>
main()
{
int i, j;
for(i=0;i<10;i++) {
for (j=0;j<10;j++)
printf("%4d ", i*10+j);
printf("\n");//stampa la prima riga
}
system("PAUSE");
}
Gli esercizi proposti erano solo dei semplici esempi per mostrarvi l’uso dei cicli for annidati in C. Continueremo ad esercitarci anche nelle prossime lezioni.
Alcuni link utili
Indice argomenti linguaggio C
La funzione fopen
La funzione fclose
Funzione fprintf
Funzione fscanf
Allocazione dinamica della memoria con malloc
Strutture in C
Typedef struct in C
Esercitazione sulle struct in C
Realizzare un menù di scelta in C
Strutture complesse in C
Come sommare gli elementi della cornice esterna
Come sommare due matrici
Matrice trasposta
Prodotto tra matrici
Ricerca elementi in una matrice
Tavola pitagorica in C
Array multidimensionali
Quick sort in C
Selection sort in C
Merge sort in C
Insertion Sort in C
da Cristina | Feb 18, 2019 | Algoritmi in C
Realizziamo oggi un semplice algoritmo per il calcolo del massimo tra n numeri in C, utilizzando il ciclo for.
Prendere in input n numeri, calcolare e visualizzare il valore massimo.
Soluzione dell’algoritmo per il calcolo del massimo tra n numeri in C
Presentiamo varie soluzioni all’algoritmo proposto.
Innanzitutto chiediamo in input quanti numeri vogliamo inserire (n) e controlliamo che sia comunque un valore maggiore di zero.
Dopo con un ciclo for inseriamo i numeri. Se l’indice i è uguale a 0 allora vuol dire che il numero inserito è il primo e assegniamo a max il suo valore. Poi per ogni numero controlliamo se il numero inserito è maggiore del massimo e se si allora cambiamo il valore di max.
Infine stampiamo in output il valore massimo così ottenuto.
Ecco dunque il listato completo dell’algoritmo per il calcolo del massimo tra n numeri in C:
#include <stdio.h>
main()
{
int n, i, num, max;
do {
printf("Quanti numeri inserire?: ");
scanf("%d", &n);
}while (n<=0);
for(i=0;i<n;i++)
{
printf("Numero %d:", i+1);
scanf("%d", &num);
if(i==0) max=num;
if(num>max) max=num;
}
printf("Il valore massimo e': %d\n", max);
system("PAUSE");
}
Risoluzione passo passo dell’algoritmo
Immaginiamo di inserire 3 numeri: 9, 11, -2.
Il valore massimo è 11.
Vediamo come lo calcola l’algoritmo che abbiamo proposto:
Quindi n=3
Prima iterazione:
for(i=0;i<n;i++) { // i=0 e il test 0<3 è dunque vero
printf(“Numero %d:”, i+1); //Chiediamo il primo numero
scanf(“%d”, &num); //inseriamo il primo numero 9
if(i==0) max=num; //il test i uguale a zero è vero quindi max=9
if(num>max) max=num; // 9>9 falso
}
Seconda iterazione:
for(i=0;i<n;i++) { // i=1 e il test 1<3 è dunque vero
printf(“Numero %d:”, i+1); //Chiediamo il secondo numero
scanf(“%d”, &num); //inseriamo il secondo numero 11
if(i==0) max=num; //il test i uguale a zero è falso
if(num>max) max=num; //il test 11>9 è vero quindi max=11
}
Terza iterazione:
for(i=0;i<n;i++) { // i=2 e il test 2<3 è dunque vero
printf(“Numero %d:”, i+1); //Chiediamo il terzo numero
scanf(“%d”, &num); //inseriamo il terzo numero -2
if(i==0) max=num; //il test i uguale a zero è falso
if(num>max) max=num; //il test -2>9 è falso
}
Quindi avremo:
for(i=0;i<n;i++) { // i=3 e il test 3<3 è falso
Si esce dal ciclo for e si stampa il valore massimo, cioè 11.
Seconda soluzione dell’algoritmo per il calcolo del massimo tra n numeri in C
Nella seconda soluzione chiediamo di inserire un numero prima del ciclo e assegniamo alla variabile max questo valore. Dopo, dentro il ciclo for basterà confrontare il numero inserito con il valore massimo e se è maggiore lo sostituiamo.
Ecco dunque il listato completo:
#include <stdio.h>
main()
{
int n, i, num, max;
do {
printf("Quanti numeri inserire?: ");
scanf("%d", &n);
}while (n<=0);
printf("Inserisci il 1 numero: ");
scanf("%d", &max);
for(i=1;i<n;i++)
{
printf("Inserisci il %d numero: ", i+1);
scanf("%d", &num);
if(num>max) max=num;
}
printf("Il valore massimo e': %d\n", max);
system("PAUSE");
}
Chiaramente possono esserci altre soluzioni all’algoritmo per il calcolo del massimo tra n numeri in C.
Nelle prossime lezioni affronteremo ancora esercizi utilizzando le strutture iterative.
Alcuni link utili
Indice argomenti linguaggio C
La funzione fopen
La funzione fclose
Funzione fprintf
Funzione fscanf
Allocazione dinamica della memoria con malloc
Strutture in C
Typedef struct in C
Esercitazione sulle struct in C
Realizzare un menù di scelta in C
Strutture complesse in C
Come sommare gli elementi della cornice esterna
Come sommare due matrici
Matrice trasposta
Prodotto tra matrici
Ricerca elementi in una matrice
Tavola pitagorica in C
Array multidimensionali
Quick sort in C
Selection sort in C
Merge sort in C
Insertion Sort in C
da Cristina | Feb 18, 2019 | Algoritmi in C
In questa lezione affronteremo un algoritmo per contare i numeri positivi e negativi in C, utilizzando il ciclo for.
L’algoritmo è molto simile ai due esercizi precedenti, proposti in questo articolo: primi esercizi con il for e anche in questo: numeri pari e dispari.
Il numero 0 non è da considerare positivo e neanche negativo, quindi dobbiamo escluderlo dal conteggio.
Inserire 20 numeri in input, contare separatamente quanti numeri positivi e negativi sono stati inseriti.
Innanzitutto occorre inizializzare a zero le due variabili per il conteggio: contap=0 e contan=0.
Dopo dobbiamo chiedere di inserire un numero in input e lo memorizziamo nella variabile n.
Poi verifichiamo se il numero appena inserito in input è positivo:
se vero incrementiamo la variabile contap;
altrimenti se falso dobbiamo verificare che il numero non sia nullo, prima di incrementare la variabile contan.
quindi inseriamo un altro if che pone la condizione: n<0?
Anche qui abbiamo utilizzato l’operatore di incremento contap++ che equivale a scrivere nella forma classica conta=contap+1 oppure conta+=1. Analogamente per contan++.
Questo procedimento lo iteriamo 20 volte, cioè finché il test diventerà falso.
Infine, con l’istruzione printf, visualizziamo il conteggio dei numeri positivi e quello dei numeri negativi.
Ecco dunque il listato completo per l’algoritmo che conta i numeri positivi e negativi in C:
#include <stdio.h>
main()
{
int n, i;
int contap=0, contan=0;
for(i=0;i<20;i++)
{
printf("inserisci il %d numero: ", i+1);
scanf("%d", &n);
if(n>0)
contap+=1;
else if(n<0)
contan+=1;
}
printf("I numeri positivi sono: %d - I numeri negativi sono: %d\n", contap, contan);
system("PAUSE");
}
Chiaramente questo è una possibile risoluzione all’algoritmo per il conteggio dei numeri positivi e negativi in C. Infatti, poteva anche essere realizzato con il ciclo while, ma in questi casi si preferisce utilizzare il for. Provate pure a farlo e a lasciare un commento nella sezione dedicata, ne discuteremo assieme.
Alcuni link utili
Indice argomenti linguaggio C
La funzione fopen
La funzione fclose
Funzione fprintf
Funzione fscanf
Allocazione dinamica della memoria con malloc
Strutture in C
Typedef struct in C
Esercitazione sulle struct in C
Realizzare un menù di scelta in C
Strutture complesse in C
Come sommare gli elementi della cornice esterna
Come sommare due matrici
Matrice trasposta
Prodotto tra matrici
Ricerca elementi in una matrice
Tavola pitagorica in C
Array multidimensionali
Quick sort in C
Selection sort in C
Merge sort in C
Insertion Sort in C