fondamenti di programmazione - appunti di informatica · 2014. 3. 9. · docente: a. saetti...
Post on 22-Jan-2021
9 Views
Preview:
TRANSCRIPT
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
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
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
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>.
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.
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
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
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
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;
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
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.)
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 . . .
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);
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
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.
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.
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()
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>
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;
}
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.)
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
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);
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;
}
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.
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
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].
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);
}
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)
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
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.
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.
top related