Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti...

31
1 A.A. 2013/2014 Docente: A. Saetti Fondamenti di Programmazione Fondamenti di Programmazione - Università degli Studi di Brescia Ingegneria dellAutomazione Industriale Ingegneria Elettronica e delle Comunicazioni Alessandro Saetti Marco Sechi e Andrea Bonisoli (email: {alessandro.saetti,marco.sechi,andrea.bonisoli}@unibs.it) Università degli Studi di Brescia A.A. 2013/2014

Transcript of Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti...

Page 1: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

1A.A. 2013/2014Docente: A. Saetti

Fondamenti di Programmazione

Fondamenti di Programmazione - Università degli Studi di Brescia

Ingegneria dell’Automazione IndustrialeIngegneria Elettronica e delle Comunicazioni

Alessandro SaettiMarco Sechi e Andrea Bonisoli

(email: {alessandro.saetti,marco.sechi,andrea.bonisoli}@unibs.it)

Università degli Studi di Brescia

A.A. 2013/2014

Page 2: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

2A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizi sui cicli (1º parte)

3. Scrivere un programma C che• Acquisisca da tastiera 2 frazioni• Stampi a video la somma delle frazioni ridotta ai minimi termini.

(Suggerimento: Per ridurre una frazione ai minimi termini per prima cosa calcolare il MCD.)

2. Scrivere un programma C che• Acquisisca da tastiera date fintantoché la data immessa è diversa da

0/0/0

• Stampi a video la data che viene prima nel calendario

1. Scrivere un programma C che• Acquisisca da tastiera numeri interi fintantoché i numeri immessi

sono positivi.• Determini (stampando a video un messaggio) se i numeri immessi

sono pari oppure dispari

Page 3: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

3A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Scrivere un programma C che• Acquisisca da tastiera numeri interi fintantoché i numeri immessi

sono positivi.• Determini (stampando a video un messaggio) se i numeri immessi

sono pari oppure dispari

Esercizio 1.1

Page 4: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

4A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.1Esercizi sui vettori – 1°parte

#include <stdio.h>#include <stdlib.h>/* Nome: main

* Scopo: Stampa numeri pari e dispari* Input: --* Output: 0 se il programma termina correttamente*/

int main(){

. . .system("pause");return(0);

}

Scrivere un programma C che

• Acquisisca da tastiera numeri interi

fintantoché i numeri immessi sono positivi.

• Determini (stampando a video un

messaggio) se i numeri immessi sono pari

oppure dispari

Impostiamo la struttura iniziale

del nostro programma C

inserendo eventuali commenti

printf(" – DETERMINA I NUMERI PARI/DISPARI - \n"); // Titoloprintf("Inserisci numeri interi positivi (negativo o 0 per terminare):\n");do {

printf("==> "); scanf("%d", &n);// istruzioni per determinare se e’ pari o dispari . . .

} while(n > 0);

Scrivere un programma C che

• Acquisisca da tastiera numeri interi fintantoché i numeri immessi

sono positivi.

• Determini (stampando a video un messaggio) se i numeri immessi

sono pari oppure dispari

Implementiamo la prima

parte della consegna

// Dichiarazione delle variabili . . . int n;

Dichiariamo

le variabili

necessarie

La funzione system esegue il

comando passato come argomento.

system() richiede <stdlib.h>.

Page 5: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

5A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.1Esercizi sui vettori – 1°parte

Verifichiamo la

correttezza della parte

appena scritta provando

a compilarla ed eseguirla

. . . // se n <= 0 non valuto se pari o dispari

if (n > 0)if (n % 2 == 0)

printf("%d e' pari!\n", n); else

printf("%d e' dispari!\n", n);. . .

Scrivere un programma C che

• Acquisisca da tastiera numeri interi

fintantoché i numeri immessi sono

positivi.

• Determini (stampando a video un

messaggio) se i numeri immessi sono

pari oppure dispari

Adesso compiliamo ed eseguiamo il nostro programma. Un esempio di output potrebbe

essere il seguente:

L’espressione a % bfornisce il resto della

divisione (quindi un

intero!) tra a e b. Ad

esempio 7 % 3

restituisce 1

Proseguiamo con lo sviluppo, sicuri di ripartire da una situazione sintatticamente e

semanticamente corretta.

Page 6: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

6A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.1Esercizi sui cicli – 1°parte

Soluzione completa:/************************************************** ************************

* Nome: lab1-pari_dispari.c ** Autore: Alessandro Saetti ** Data: 16/2/10 **************************************************** ***********************/

#include <stdio.h>#include <stdlib.h>

/* Nome: main* Scopo: Stampa numeri pari e dispari* Input: --* Output: 0 se il programma termina correttamente*/

int main() {

int n;

printf(" – DETERMINA I NUMERI PARI/DISPARI - \n");printf("Inserisci numeri interi positivi (negativoo 0 pe r terminare):\n");do {

printf("==> "); scanf("%d", &n);if (n > 0)

if(n % 2 == 0) printf("%d e' pari!\n", n);

elseprintf("%d e' dispari!\n", n);

} while(n > 0);

system("pause");return(0);

}

INPUT

OUTPUT

VALUTO SE PARI

Page 7: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

7A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.2

Scrivere un programma C che• Acquisisca da tastiera date fintantoché la data immessa è

diversa da 0/0/0

• Stampi a video la data che viene prima nel calendario

Page 8: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

8A.A. 2013/2014

Leggo la data usando il carattere

/ come separatore

Spiego come immettere le date

Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.2Esercizi sui cicli – 1°parte

Scrivere un programma C che

- Acquisisca da tastiera date fintantoché la data

immessa è diversa da 0/0/0

- Stampi a video la data che viene prima nel

calendario (quella più vecchia)

Impostiamo la struttura di

partenza del nostro programma C

Scrivere un programma C che

- Acquisisca da tastiera date fintantoché la data immessa è diversa da 0/0/0

- Stampi a video la data che viene prima nel calendario (quella più vecchia)

printf("-->");scanf("%d/%d/%d",&g,&m,&a);

} while (gg != 0 || mm != 0 || aa != 0);

// Determino se è la data minima

#include <stdio.h>#include <stdlib.h>/* Nome: main

* Scopo: Calcola e stampa la data minima* Input: --* Output: 0 se il programma termina correttamente*/

int main(){

. . .system("pause");return(0);

}

// Dichiarazione delle variabili . . . int aa,mm,gg;

printf("Immetti date (gg/mm/aa):\n");

Dichiaro via via le variabili necessarie

do {

Lascio in sospeso la parte relativa alla

determinazione della data minima

Se non corrisponde alla data di stop

0/0/0 ripeto l’operazione di lettura

Page 9: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

9A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.2Esercizi sui cicli – 1°parte

printf("-->");scanf("%d/%d/%d",&g,&m,&a);

} while (gg != 0 || mm != 0 || aa != 0);

// Determino se è la minima

// Dichiarazione delle variabili . . . int aa,mm,gg;

printf("Immetti date (gg/mm/aa):\n");

do {

Scrivere un programma C che

- Acquisisca da tastiera date fintantoché la data immessa è diversa da 0/0/0

- Stampi a video la data che viene prima nel calendario (quella più vecchia)

L’inizializzazione delle variabili relative alla data minima può essere

fatta utilizzando i valori massimi che tali variabili possono assumere.

Dichiaro ed inizializzo le variabili usate per

memorizzare la data minima corrente

Mentre procediamo con la

lettura valutiamo se la

data appena letta

gg/mm/aa (che deve

essere diversa da 0/0/0!)

risulta minore rispetto a

quella minima attuale

min_gg/min_mm/min_aa.

Se così è aggiorno la data

minima attuale con

gg/mm/aa.

Determinazione della data minima corrente

Stampo la data minima della sequenza letta

// Variabili per la data minima

if (aa > 0 && mm > 0 && gg > 0) {

if (aa < min_aa) {min_aa = aa;min_mm = mm;min_gg = gg;

} else if (aa == min_aa && mm < min_mm) {min_mm = mm;min_gg = gg;

} else if (aa == min_aa && mm == min_mm && gg < min_gg)min_gg = gg;

}

printf("%d/%d/%d\n",min_gg,min_mm,min_aa);

// OUTPUT

// Dichiarazione variabili . . .int min_aa=100,min_mm=13, min_gg=32;

Page 10: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

10A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.2Esercizi sui cicli – 1°parte

Soluzione completa:/************************************************** ************************

* Nome: lab2-date.c ** Autore: Alessandro Saetti ** Data: 16/2/10 **************************************************** ***********************/

#include <stdio.h>#include <stdlib.h>

/* Nome: main* Scopo: Calcola e stampa la data minima* Input: --* Output: 0 se il programma termina correttamente*/

int main() {int gg, mm, aa, min_aa = 100, min_mm = 13, min_gg= 32;

printf("Immetti date (gg/mm/aa):\n");do {

printf("-> ");scanf("%d/%d/%d", &gg, &mm, &aa);if (aa > 0 && mm > 0 && gg > 0) {

if (aa < min_aa) {min_aa = aa;min_mm = mm;min_gg = gg;

} else if (aa == min_aa && mm < min_mm) {min_mm = mm;min_gg = gg;

} else if (aa == min_aa && mm == min_mm && gg < min_gg)min_gg = gg;

}} while(gg != 0 || mm != 0 || aa != 0);

printf("La data minima e': %d/%d/%d\n", min_gg, min_ mm, min_aa);

system("pause");return(0);

}

INPUT

OUTPUT

VALUTO

LA DATA

MINIMA

Page 11: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

11A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.3

Scrivere un programma C che• Acquisisca da tastiera 2 frazioni• Stampi a video la somma delle frazioni ridotta ai minimi termini.

(Suggerimento: Per ridurre una frazione ai minimi termini per prima cosa calcolare il MCD.)

Page 12: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

12A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.3Esercizi sui cicli – 1°parte

Scrivere un programma C che

- Acquisisca da tastiera 2 frazioni

- Stampi a video la somma delle frazioni ridotta ai

minimi termini.

(Suggerimento: Per ridurre una frazione ai minimi

termini per prima cosa calcolare il MCD.)

Impostiamo la solita struttura di

partenza di un programma C

Scrivere un programma C che

- Acquisisca da tastiera 2 frazioni

- Stampi a video la somma delle frazioni ridotta ai

minimi termini.

(Suggerimento: Per ridurre una frazione ai minimi

termini per prima cosa calcolare il MCD.)

#include <stdio.h>#include <stdlib.h>/*

* Nome : main* Scopo : Stampa la frazione somma * ridotta ai minimi termini* Input : --* Output: 0 se il programma termina * correttamente*/

int main(){

. . .system("pause");return(0);

}

printf("Digita la 1^ frazione (A/B): ");scanf("%d/%d", &num1, &den1);printf("Digita la 2^ frazione (C/D): ");scanf("%d/%d", &num2, &den2);

e dichiaro le variabili necessarie.

// Dichiarazione delle variabili . . . int num1, num2, den1, den2;

Implementiamo la prima parte

della consegna (INPUT)

Imposto le istruzioni di input . . .

Page 13: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

13A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.3Esercizi sui cicli – 1°parte

num = num1 * den2 + num2 * den1;den = den1 * den2;

Scrivere un programma C che

- Acquisisca da tastiera 2 frazioni

- Stampi a video la somma delle frazioni ridotta ai minimi termini.

(Suggerimento: Per ridurre una frazione ai minimi termini per

prima cosa calcolare il MCD.)

Calcolo la frazione somma . . .

e aggiungo le nuove variabili utilizzate.// Dichiarazione delle variabili . . . int num, den;den

num

denden

dennumdennum

den

num

den

num =+=+2*1

1*22*1

2

2

1

1

Scrivere un programma C che

- Acquisisca da tastiera 2 frazioni

- Stampi a video la somma delle frazioni ridotta ai minimi termini.

(Suggerimento: Per ridurre una frazione ai minimi termini per

prima cosa calcolare il MCD.)

Per ridurre ai minimi termini basta dividere

il numeratore e il denominatore per il

massimo comune divisore tra num e den.

Quindi aggiungo le variabili appena utilizzate.

// Dichiarazione delle variabili . . . int min, mcd, i;

for (i = 1; i <= min ; i++)if ( num % i == 0 && den %i == 0)

mcd = i;

Per determinare il MCD tra num e den

posso seguire questa procedura:

ALGORITMO ALTERNATIVO PER DETERMINARE IL MCD:

a) imposto mcd=minimo(num,den)

b) Se mcd==1 allora termino saltando allo step d)

c) Se num e den sono divisibili per mcd allora mcd è il MCD e termino

saltando a d) altrimenti decremento mcd e ripeto lo step corrente c)

d) Fine.

Memorizzo nella variabile min il valore più

basso tra il numeratore e denominatore della

frazione somma.

if (num > den)min = den;

elsemin = num;

Partendo da 1 fino a min estraggo tutti i divisori sia

di num che di den. L’ultimo divisoretrovato è il MCD.

Stampo la frazione

somma ridottaprintf ("Frazione somma ridotta: %d/%d\n\n", num/mcd, den/mcd);

Page 14: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

14A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.3Esercizi sui cicli – 1°parte

Soluzione

completa:

/************************************************** ************************* Nome: lab4-frazioni.c ** Autore: Alessandro Saetti ** Data: 16/2/10 **************************************************** ***********************/

#include <stdio.h>#include <stdlib.h>/*

* Nome: main* Scopo: Stampa la frazione somma ridotta ai minimi termi ni* Input: --* Output: 0 se il programma termina correttamente*/

int main() {

int num1, num2, den1, den2, num, den, min, mcd, i;printf("Digita la 1^ frazione (A/B): ");scanf("%d/%d", &num1, &den1);printf("Digita la 2^ frazione (C/D): ");scanf("%d/%d", &num2, &den2);num = num1 * den2 + num2 * den1;den = den1 * den2;if (num > den)

min = den;else

min = num;for (i = 1; i <= min ; i++)

if ( num % i == 0 && den %i == 0)mcd = i;

printf ("Frazione somma ridotta: %d/%d\n\n", num/mcd, den/mcd);system("pause");return(0);

}

INPUT

OUTPUT

CALCOLO LA

FRAZIONE SOMMA

E LA RIDUCO AI

MINIMI TERMINI

Page 15: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

15A.A. 2013/2014Docente: A. Saetti

Esercizi sui vettori (2º parte)

Fondamenti di Programmazione - Università degli Studi di Brescia

4. Scrivere un programma C che• Inizializzi un vettore di 1000 elementi con numeri casuali compresi

tra 1 e 100 (estremi inclusi).• Calcoli la media dei numeri presenti nel vettore.

5. Scrivere un programma C che• Acquisisca da tastiera un numero intero positivo n, ripetendo

l’acquisizione qualora il numero fosse negativo o superiore a 1023.• Stampi a video la conversione di n in base 2. (Suggerimento:

Utilizzare un vettore per memorizzare i resti delle divisioni.)

6. Scrivere un programma C che• Inizializzi e stampi a video una matrice M di 10 righe e 20 colonne

con numeri casuali interi compresi tra 0 ed 1; • Inizializzi e stampi un vettore di 10 elementi con i numeri interi

corrispondenti alla rappresentazione decimale dei numeri binari che compaiono (con notazione posizionale) sulle righe della matrice M.

Page 16: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

16A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.4

Scrivere un programma C che• Inizializzi un vettore di 1000 elementi con numeri casuali compresi

tra 1 e 100 (estremi inclusi).• Calcoli la media dei numeri presenti nel vettore.

Page 17: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

17A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.4Esercizi sui vettori – 2°parte

Scrivere un programma C che

- Inizializzi un vettore di 1000 elementi con

numeri casuali compresi

tra 1 e 100 (estremi inclusi).

- Calcoli la media dei numeri presenti nel

vettore.

Impostiamo la solita struttura di

partenza di un programma C

Scrivere un programma C che

- Inizializzi un vettore di 1000 elementi con numeri casuali compresi tra 1 e 100 (estremi inclusi).

- Calcoli la media dei numeri presenti nel vettore.

for (i=0; i < DIM; i++)vet[i] = rand() % 100+1;

Aggiungiamo a S in successione i

valori che vengono via generati

#include <stdio.h>#include <stdlib.h>/*

* Nome: main* Scopo: Stampa la media dei numeri in un vettore* Input: --* Output: 0 se il programma termina correttamente*/

int main(){

. . .system("pause");return(0);

}

// Dichiarazione delle variabili . . .#define DIM 1000;int i, vet[DIM];

Ricordiamoci di dichiarare le variabili utilizzate

Per generare i numeri casuali sfruttiamo la funzione rand()

Page 18: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

18A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.4Esercizi sui vettori – 2°parte

Scrivere un programma C che

- Inizializzi un vettore di 1000 elementi con numeri casuali compresi tra

1 e 100 (estremi inclusi).

- Calcoli la media dei numeri presenti nel vettore.

somma=0;for (i=0; i < DIM; i++){

vet[i] = rand() % 100 + 1;somma += vet[i];

}

Calcoliamo la

somma totale dei

valori generati

casualmente.

Nel ciclo for aggiungiamo le istruzioni che ci

consentono di calcolare la somma totale dei

valori generati

#include <stdio.h>. . .// Dichiarazione variabili . . .int somma;float media;. . .

Dichiariamo le variabili

media = (float)somma / DIM;printf("Media: %.2f\n\n", media);

Poiché la variabile somma è un int, per evitare

di perdere nella divisione tra interi la parte

decimale, effettuo un cast (conversione di tipo)

a float della variabile somma

Per ottenere la media

divido la somma totale

per il numero DIM di

valori generati.

Per evitare che rand() generi

sempre la stessa sequenza

inizializzo il generatore dei

numeri casuali con la

funzione srand()

srand(time(NULL));

#include <time.h>

Page 19: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

19A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.4Esercizi sui vettori – 2°parte

Soluzione

completa:

/************************************************** ************************* Nome: lab1-media.c ** Autore: Alessandro Saetti ** Data: 23/2/10 **************************************************** ***********************/

#include <stdio.h>#include <stdlib.h>#include <time.h>#define DIM 1000/*

* Nome: main* Scopo: Stampa la media dei numeri in un vettore* Input: --* Output: 0 se il programma termina correttamente*/

int main() {

int i, vet[DIM], somma = 0;float media;srand(time(NULL));for (i=0; i < DIM; i++) {

vet[i] = rand() % 100 + 1;somma += vet[i];

}media = (float)somma / DIM;printf("Media: %.2f\n\n", media);

system("pause");return 0;

}

Page 20: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

20A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.5

Scrivere un programma C che• Acquisisca da tastiera un numero intero positivo n, ripetendo

l’acquisizione qualora il numero fosse negativo o superiore a 1023.• Stampi a video la conversione di n in base 2. (Suggerimento:

Utilizzare un vettore per memorizzare i resti delle divisioni.)

Page 21: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

21A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.5Esercizi sui vettori – 2°parte

Scrivere un programma C che

- Acquisisca da tastiera un numero intero

positivo n, ripetendo

l’acquisizione qualora il numero fosse negativo

o superiore a 1023.

- Stampi a video la conversione di n in base 2.

(Suggerimento:

Utilizzare un vettore per memorizzare i resti

delle divisioni.).

Impostiamo la struttura di

partenza di un programma C

Ripeto finché i

valori digitati

sono fuori

dall’intervallo

[0,1023]

Scrivere un programma C che

- Acquisisca da tastiera un numero intero positivo n, ripetendo l’acquisizione qualora il numero fosse negativo o superiore a 1023.

- Stampi a video la conversione di n in base 2. (Suggerimento: Utilizzare un vettore per memorizzare i resti delle divisioni.).

#include <stdio.h>#include <stdlib.h>/*

* Nome: main* Scopo: Stampa conversione base 2* Input: --* Output: 0 se il programma termina correttamente*/

int main(){

. . .system("pause");return(0);

}

Leggo il numero

} while (dec<0 || dec>1023);

// Dichiarazione variabili . . . int dec;

Dichiarazione

variabili

do {

printf("-> ");scanf("%d", &dec);

printf("Immetti un intero (<1024 e >=0)):\n"); Spiego cosa

voglio

Se non appartiene a

[0,1023] ripeto la lettura

Page 22: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

22A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.5Esercizi sui vettori – 2°parte

bin[n] = dec % 2;dec = dec /2;n++;

Scrivere un programma C che

- Acquisisca da tastiera un numero intero positivo n, ripetendo l’acquisizione qualora il numero fosse negativo o superiore a 1023.

- Stampi a video la conversione di n in base 2. (Suggerimento: Utilizzare un vettore per memorizzare i resti delle divisioni.).

Per ottenere la

rappresentazione in base 2

estraggo la sequenza dei

resti della divisione per 2 e

li memorizzo in un array.

Stampo poi in ordine

inverso tale sequenza.

for (i = n-1; i >=0; i--) printf("%d", bin[i]);

printf("\n\n");

int n=0, bin[10], i;

- Calcolo il resto della divisione per 2 e

lo aggiungo nell’array bin

- Determino il nuovo quoziente dec

Dichiarazione e inizializzazione variabili

Stampo in ordine inverso

la sequenza dei resti

Se il nuovo quoziente dec non è zero

calcolo il resto successivo

do {

printf("Conversione in base 2 di %d: ", dec);

} while (dec != 0);

Page 23: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

23A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.5Esercizi sui vettori – 2°parte

Soluzione

completa:

/************************************************** ************************* Nome: lab2-dectobin.c ** Autore: Alessandro Saetti ** Data: 23/2/10 **************************************************** ***********************/

#include <stdio.h>#include <stdlib.h>/*

* Nome: main* Scopo: Stampa conversione base 2* Input: --* Output: 0 se il programma termina correttamente*/

int main() {int dec, bin[10], i, n = 0;printf("Immetti un intero (positivo minore di 1024):\n") ; do {

printf("-> ");scanf("%d", &dec);

} while(dec < 0 || dec > 1023);printf("Conversione in base 2 di %d: ", dec);do {

bin[n] = dec % 2;dec = dec /2;n++;

} while (dec != 0);for (i = n-1; i >=0; i--)

printf("%d", bin[i]);printf("\n\n");

system("pause");return 0;

}

Page 24: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

24A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.6Scrivere un programma C che

• Inizializzi e stampi a video una matrice M di 10 righe e 20 colonne con numeri casuali interi compresi tra 0 ed 1;

• Inizializzi e stampi un vettore di 10 elementi con i numeri interi corrispondenti alla rappresentazione decimale dei numeri binari che compaiono (con notazione posizionale) sulle righe della matrice M.

Page 25: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

25A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.6Esercizi sui vettori – 2°parte

Scrivere un programma C che

- Inizializzi e stampi a video una matrice M di 10

righe e 20 colonne con numeri casuali interi

compresi tra 0 ed 1;

- Inizializzi e stampi un vettore di 10 elementi con

i numeri interi corrispondenti alla

rappresentazione decimale dei numeri binari che

compaiono (con notazione posizionale) sulle

righe della matrice M

Impostiamo la struttura di

partenza del nostro programma

Scrivere un programma C che

- Inizializzi e stampi a video una matrice M di 10 righe e 20 colonne

con numeri casuali interi compresi tra 0 ed 1;

- Inizializzi e stampi un vettore di 10 elementi con i numeri interi

corrispondenti alla rappresentazione decimale dei numeri binari che

compaiono (con notazione posizionale) sulle righe della matrice M

for (i=0; i < DIM1; i++) {

for (j=0; j < DIM2; j++){

M[i][j]=rand()%2;printf("%2d",M[i][j]);

}printf("\n");

}

#include <stdio.h>#include <stdlib.h>/* Nome : main

* Scopo : Stampa conversioni in base 10 di numeri* binari su righe di matrice* Input : --* Output: 0 se il programma termina correttamente*/

int main(){

. . .system("pause");return(0);

}

Genero dei numeri casuali 0 o 1, li stampo

per controllo e li memorizzo nella matrice M.

Se inizializzo la sequenza casuale con

srand(time(NULL)) posso ottenere, per ogni

esecuzione, delle sequenze di bit sempre

differenti.

int M[DIM1][DIM2], i, j;Ricordiamoci di dichiarare le variabili utilizzate

Memorizziamo i valori generati in una matrice DIM1xDIM2

#define DIM1 10#define DIM2 20

Page 26: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

26A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.6Esercizi sui vettori – 2°parte

#include <math.h>. . . for (i=0; i < DIM1; i++) {

for (j=0; j < DIM2; j++)V[i]+=M[i][j]*powf(2,DIM2-j-1);

printf("Conversione decimale per riga #%d: %d\n", i +1, V[i]);}

Scrivere un programma C che

- Inizializzi e stampi a video una matrice M di 10 righe e 20 colonne con numeri casuali interi compresi tra 0 ed 1;

- Inizializzi e stampi un vettore di 10 elementi con i numeri interi corrispondenti alla rappresentazione decimale dei numeri

binari che compaiono (con notazione posizionale) sulle righe della matrice M

float powf(float b, float x) => richiede #include <math.h>

Per evitare che durante

la compilazione appaia

l’avvertimento:

[Warning] converting to

`int' from `float‘

mettiamo un cast a int

prima della funzione

powf()

Per ogni riga i-esima della matrice M calcolo la somma di potenze (decrescente!) di 2

dove i coefficienti sono costituiti dagli elementi sulla riga i-esima della matrice. Tale

valore viene poi memorizzato in V[i].

Page 27: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

27A.A. 2013/2014Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia

Esercizio 1.6Esercizi sui vettori – 2°parte

Soluzione

completa:

/************************************************** ************************* Nome: lab4-bintodec.c ** Autore: Alessandro Saetti ** Data: 23/2/10 **************************************************** ***********************/

#include <stdio.h>#include <stdlib.h>#include <math.h>#define DIM1 10#define DIM2 20/* Nome: main

* Scopo: Stampa conversioni in base 10 di numeri binari su righe di matrice* Input: --* Output: 0 se il programma termina correttamente*/

int main() {int M[DIM1][DIM2], i, j, V[DIM1]={0};for (i=0; i < DIM1; i++) {

for (j=0; j < DIM2; j++) {M[i][j]=rand()%2;printf("%2d",M[i][j]);

}printf("\n");

}for (i=0; i < DIM1; i++) {

for (j=0; j < DIM2; j++) {V[i]+=M[i][j]*powf(2,DIM2-j-1);

}printf("Conversione decimale per riga #%d: %d\n", i+1, V[i]);

}system("pause");return(0);

}

Page 28: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

28A.A. 2013/2014Docente: A. Saetti

Esercizi sui cicli (per casa)

Fondamenti di Programmazione - Università degli Studi di Brescia

1. Scrivere un programma C che:• Acquisisca da tastiera numeri interi fintantoché il numero

immesso è negativo.• Stampi a video i primi 5 anni bisestili superiori al numero

acquisito. (Suggerimento: Un anno è bisestile se è divisibile per 4 ma non per 100 eccetto per quegli anni divisibili per 400).

2. Scrivere un programma C che:• Acquisire da tastiera la lunghezza dei tre lati di un triangolo

fintantoché le lunghezze acquisite non sono positive e non soddisfano la disuguaglianza triangolare (la somma del lato maggiore è inferiore alla somma degli altri lati)

• Stampi il perimetro del triangolo. (Suggerimento: Ad ogni iterazione calcolare il massimo lato acquisito e la somma degli altri due dati)

Page 29: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

29A.A. 2013/2014Docente: A. Saetti

Esercizi sui cicli (per casa)

Fondamenti di Programmazione - Università degli Studi di Brescia

3. Scrivere un programma C che• Acquisire da tastiera un numero intero n (ripetendo l’acquisizione

finché vengono immessi numeri negativi)• Acquisire successivamente da tastiera n numeri interi • Stampare a video la media degli n numeri acquisiti

4. Scrivere un programma C che• Acquisisca da tastiera due numeri interi corrispondenti al numero di giorni in un

mese ed al giorno della settimana in cui il mese inizia.• Stampi a video il calendario del mese. Ad esempio:

Inserire il numero di giorni del mese: 31Inserire il giorno della settimana in cui il mese inizia (1=Domenica, 7=Sabato): 3D L M M G V S

1 2 3 4 56 7 8 9 10 11 1213 14 15 16 17 18 19

20 21 22 23 24 25 2627 28 29 30 31

Page 30: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

30A.A. 2013/2014Docente: A. Saetti

Esercizi sui vettori (per casa)

Fondamenti di Programmazione - Università degli Studi di Brescia

5. Scrivere un programma C che:• Inizializzi un vettore di 100 elementi con numeri casuali compresi

tra -50 e 50• Stampi a video il minimo numero n nel vettore per il quale esista

un solo numero nel vettore più piccolo di n

6. Scrivere un programma C che• Acquisisca da tastiera un numero intero n maggiore di 10 e minore

di 100, ripetendo l’acquisizione qualora il numero non rispettasse i requisiti richiesti.

• Inizializzi un vettore di 20 elementi con numeri casuali compresi tra 10 ed n.

• Stampi a video il numero contenuto nel vettore con il maggior numero di divisori.

Page 31: Fondamenti di Programmazione - Appunti di INFORMATICA · 2014. 3. 9. · Docente: A. Saetti Fondamenti di Programmazione - Università degli Studi di Brescia A.A. 2013/2014 2 Esercizi

31A.A. 2013/2014Docente: A. Saetti

Esercizi sui vettori (per casa)

Fondamenti di Programmazione - Università degli Studi di Brescia

7. Scrivere un programma C che• Inizializzi e stampi a video una matrice M di 4 righe e 3

colonne con numeri casuali interi compresi tra 1 e 9;• Stampi a video la somma delle righe e la somma delle

colonne di M

8. Scrivere un programma C che• Inizializzi e stampi a video una matrice M di 4 righe e 5

colonne con numeri casuali interi compresi tra 1 e 9; • Inizializzi un vettore V con 5 numeri interi acquisiti da

tastiera;• Stampi a video il prodotto (righe per colonne) tra la

matrice M e il vettore V.