Esercizi
description
Transcript of Esercizi
1© Piero Demichelis
Esercizi
2© Piero Demichelis
Equazione di II grado
Legge i coefficienti a, b e c
a = 0?
b = 0?
c = 0?
Equazione indetermina
ta
Equazione impossibile
Equazione di I grado: x= -(c / b)
delta = b*b – 4*a*c
delta = 0?
Radice doppia x = -(b / (2 * a))
w = 2*aw
1= -(b / w)
w2= / w
delta < 0?
Radice complesse coniugate: x = w
1± j
w2
Radice reali: x
1= w
1+ w
2 x
2= w
1-
w2
delta| |
si
si
si
no
no
no
no
no si
si
3© Piero Demichelis
Equazione di II grado
#include <stdio.h>#include <math.h>
float a, b, c, delta;float x1, x2, w, w1, w2, mdelta;
main(){ printf ("Coeff. a = "); /* legge i tre coefficienti a, b, c
*/ scanf ("%f",&a); printf ("\nCoeff. b = "); scanf ("%f",&b); printf ("\nCoeff. c = "); scanf ("%f",&c);
4© Piero Demichelis
Equazione di II grado
if (a == 0) /* a = 0? */ { /* si, non è di II grado! */ if (b == 0) /* b = 0? */ if (c == 0) /* si, non è neppure di I grado! */ printf ("\nEquazione indeterminata\n"); else printf ("\nEquazione impossibile\n"); else { /* b diverso da 0; è di I grado! */ x1 = - (c / b); printf (“\nEquazione di I grado: x = %f\n", x1); } } else /* a è diverso da 0; è di II grado! */
5© Piero Demichelis
Equazione di II grado
{ /* a è diverso da 0 è di II grado! */ delta = b * b - 4 * a * c; w = 2 * a; w1 = - (b / w); mdelta = delta; if (mdelta < 0 ) mdelta = - mdelta; w2 = sqrt (mdelta) / w; / * radice quadrata del discriminante
*/ if (delta == 0) /* discriminante nullo? */ printf (“\nRadice doppia: x=%f\n", w1); /* si */ else { /* no, il discriminante è diverso da 0 */ if (delta < 0) /* discriminante < 0? */ { /* si */ printf ("\nRadici complesse e coniugate:\n"); printf ("parte reale= %f ", w1); printf (" parte immag.= %f\n", w2); }
6© Piero Demichelis
Equazione di II grado
else { /* no, discriminante > 0 */ x1 = w1 + w2; /* calcola le due soluzioni
*/ x2 = w1 - w2; printf ("\n Radici reali: x1= %f\n x2= %f\n", x1, x2); } } /* chiusura dell’else di “if (delta == 0) “
*/ } /* chiusura dell’else di “if (a == 0) “
*/} /* fine del main */
7© Piero Demichelis
Lire / Euro
Programma per la conversione Lire/Euro e viceversa. L'input del programma sia la lettera L per Lire o E per Euro, seguita da uno spazio e dalla cifra da convertire: nel primo caso un'intero lungo, nel secondo caso un reale.
Esempio di esecuzione:
> Introduci la richiesta:
>L 15000000
>15000000 lire corrispondono a 7746.85 euro
8© Piero Demichelis
Lire / Euro
• Analisi.
A seconda che il primo parametro introdotto (che è un carattere) sia ‘L’ oppure ‘E’ occorre eseguire in modo differenziato la lettura successiva:
di un intero lungo se era ‘L’;di un float se era ‘E’;
La lettura va pertanto suddivisa in due fasi: dapprima si legge un carattere e poi, in base al valore di questo carattere, si esegue la lettura di un intero o di un float.
9© Piero Demichelis
Lire / Euro
#include <conio.h> /* solo per Turbo C */#include <stdio.h>
#define rapp 1936.27
main(){long int lire;double euro;char carat; clrscr(); /* solo per Turbo C */printf ("\nIntrodurre la richiesta: ");scanf ("%c", &carat); /* legge un carattere */
10© Piero Demichelis
Lire / Euro
if (carat == 'L') { /* è L? */ scanf ("%ld", &lire); /* si, legge le lire */ euro = (float)lire / rapp; /* converte in euro */ printf ("\n%ld lire equivalgono a %lf euro\n", lire, euro); }else if (carat == 'E') { /* non è L, è E? */ scanf ("%lf ", &euro); /* si, legge gli euro */ lire = (int)(euro * rapp); /* converte in lire */ printf ("\n%lf euro equivalgono a %ld lire\n", euro, lire); } else /* non è né L né E, errore! */ printf ("\nCarattere non lecito\n");}
11© Piero Demichelis
Anno bisestile
Scrivere un programma che legga da tastiera un valore intero rappresentante un anno e stabilisca se è o meno un anno bisestile.
Si ricordi che un anno per essere bisestile deve essere divisibile per 4 ma non per 100 a meno che sia divisibile per 400.
Ad esempio il 2004 è un anno bisestile così come il 2000 mentre non lo è il 1900.
12© Piero Demichelis
Anno bisestile
• Uso una variabile logica che chiamo bisestile, posta al valore vero se l’anno è bisestile, al valore falso altrimenti.
• Pseudocodice
Ipotizzo che non sia bisestile (bisestile = falso); divisibile per 4 ?
• si, ipotizzo sia bisestile (bisestile = vero);• divisibile anche per 100 ?
si, divisibile per 400 ? se no non è bisestile (bisestile = falso);
Visualizzo il risultato
13© Piero Demichelis
Anno bisestile
#include <conio.h> /* solo per Turbo C */
#include <stdio.h>
#define falso 0
#define vero 1
main()
{
int anno;
int bisestile;
clrscr(); /* solo per Turbo C */
printf ("\nIntrodurre l’anno: ");
scanf ("%d", &anno);
bisestile = falso; /* ipotizza che non sia bisestile */
14© Piero Demichelis
Anno bisestile
if ((anno % 4) == 0) { bisestile = vero; /* divisibile per 4: potrebbe essere bisestile
*/ if ((anno % 100) == 0) /* divisibile per 100? */ { if ((anno % 400) != 0) /* si, divisibile per 400? */
bisestile = falso; /* no, non bisestile */ } }if (bisestile) printf ("\n Bisestile!");else printf ("\n Non Bisestile!");}
15© Piero Demichelis
Fattoriale
Realizzare un programma per il calcolo del fattoriale.Si ricorda che il fattoriale è definito come:
n! = n · (n-1) · (n-2)….. · 2 · 1
• con 0! = 1
legge da tastiera il valore di n (compreso tra 0 e val_max);
Inizializza fattoriale (cioè il risultato) a 1; finché n è maggiore di zero:
• moltiplica fattoriale per n ed attribuisci il risultato a fattoriale;• decrementa n di un unità;
visualizza fattoriale.
16© Piero Demichelis
Fattoriale
#include <stdio.h>
#define val_max 12
main (){long int n, totale;
printf (“\nFattoriale di: ");scanf ("%ld", &n);
totale = 1;
17© Piero Demichelis
Fattoriale
if ((n >= 0) && (n <= val_max)) { while (n > 0)
{ totale *= n; n--;
} printf ("\nFattoriale di %ld = %ld\n", n, totale);else { printf ("\nFattoriale non calcolabile, "); printf ("introdurre valori compresi tra 0 e %d", val_max); }}
18© Piero Demichelis
MCD
Scrivere un programma in linguaggio C che prenda in input da tastiera tre numeri interi e ne calcoli il massimo comune divisore.
Il massimo comune divisore è il più grande tra i divisori comuni ai tre numeri.
Le soluzioni possibili sono numerose, più o meno eleganti, ne proponiamo due:
1. con un indice che cresce da 1 a uno qualsiasi dei tre numeri si cerca i divisori comuni: l’ultimo trovato è il mcd;
2. si cerca il minimo tra i tre numeri e poi, a partire da quel minimo e decrementando a ogni ciclo si cerca il primo divisore comune che è proprio il mcd.
19© Piero Demichelis
MCD (1a soluzione)
#include <stdio.h>
main(){int x1, x2, x3, ind, mcd, min;printf ("\nIntroduci il primo numero: ");scanf ("%d", &x1);printf ("\nIntroduci il secondo numero: ");scanf ("%d", &x2); printf ("\nIntroduci il terzo numero: ");scanf ("%d", &x3); for (ind = 1; ind <= x1; ind++) if ((x1 % ind) == 0 && (x2 % ind) == 0 && (x3 % ind) == 0)
mcd = ind;printf("\nMCD = %d", mcd);}
20© Piero Demichelis
MCD (2a soluzione)
#include <stdio.h>#define falso 0#define vero 1
main(){int x1, x2, x3, trovato, mcd, min;
printf ("\nIntroduci il primo numero: ");scanf ("%d", &x1); min = x1;printf ("\nIntroduci il secondo numero: ");scanf ("%d", &x2);if (x2 < min) min = x2;
21© Piero Demichelis
MCD (2a soluzione)
printf ("\nIntroduci il terzo numero: ");scanf ("%d", &x3);if (x3 < min) min = x3;
trovato = falso;while (!trovato) if ((x1%min == 0) && (x2%min == 0) && (x3%min == 0)) { mcd = min; trovato = vero; } else min--;
printf ("\nMCD = %d", mcd);
22© Piero Demichelis
Matrice
• Realizzare un programma in C che richieda da tastiera due interi M e N e generi una matrice M x N. Gli elementi della matrice (ai,j), con i che varia
da 1 a M e j che varia da 1 a N, devono essere calcolati mediante la relazione:
• ai,j = i * j
• Infine occorre visualizzare la matrice sottoforma di tabellina.
• Esempio: se N = 2 e M = 3 si deve visualizzare:
1 2 3
2 4 6
23© Piero Demichelis
Matrice
#include <stdio.h>#include <stdlib.h>
#define NMAX 30
int main (){ int matrice[NMAX][NMAX]; int righe, col, i, j;
printf ("\nNumero di righe: "); scanf ("%d",&righe); printf ("\nNumero di colonne: "); scanf ("%d",&col);
24© Piero Demichelis
Matrice
for (i=1; i <= righe; i++)
for (j=1; j <= col; j++) {
matrice[i][j] = i*j; printf (" %4d ", matrice[i][j]); } printf ("\n");} /* fine programma */
Oppure (senza usare la struttura dati matrice):
for (i=1; i <= righe; i++) for (j=1; j <= col; j++) printf (" %4d ", i * j); printf ("\n");} /* fine programma */
25© Piero Demichelis
Matrice (2)
• Leggere da tastiera la dimensione di una matrice quadrata di numeri interi.
• Successivamente leggere ancora da tastiera i valori di tutti gli elementi della matrice.
• Infine calcolare e visualizzare la somma degli elementi della diagonale principale e il valor medio degli elementi della diagonale secondaria
26© Piero Demichelis
Matrice (2)
#include <stdio.h>#include <conio.h>#define MAX 10 /* dimensione massima */
void main(){ int num_r, riga, col; int matrix[MAX][MAX]; long sommaprinc=0; long sommasec=0; clrscr(); printf (“\nDimensione della matrice: "); scanf ("%d", &num_r);
27© Piero Demichelis
Matrice (2)
/* Riempimento della matrice */ for (riga=1; riga<=num_r; riga++) for (col=1; col<=num_r; col++) { printf ("\nelemento %d %d : ", riga, col); scanf ("%d", &matrix[riga][col]); } /* Somma gli elementi sulle due diagonali */ for (riga=1; riga<=num_r; riga++) { sommaprinc += matrix[riga][riga]; sommasec += matrix[riga][num_r+1-riga]; }
28© Piero Demichelis
Matrice (2)
/* Visualizza risultati */ printf ("\nLa somma è %ld", sommaprinc); printf ("\nLa media è %lf",
(double)sommasec/(double)num_r);}
29© Piero Demichelis
Coseno
• Realizzare una funzione per il calcolo del coseno di un angolo espresso in radianti. Utilizzare allo scopo lo sviluppo in serie:
• Realizzare inoltre il programma di prova che confronti il valore dalla funzione di libreria cos(x) col valore calcolato con lo sviluppo in serie.
2 4 6
cos 12! 4! 6!
x x xx
30© Piero Demichelis
Coseno
• Osservando la formula dello sviluppo in serie si vede come ogni termine può essere ricavato dal precedente come per il seno, con la relazione ricorrente:
• La differenza sta nelle inizializzazioni:
il primo termine ora vale 1 il denominatore n parte da 0
. .
1 2
x xfatt fatt prec
N N
31© Piero Demichelis
Coseno
#include <stdio.h>#include <math.h>
/* prototipo della funzione */double cosenox(double x);
main(){double angolo;printf (“\nAngolo in radianti: ");scanf ("%lf", &angolo);printf ("\nCoseno di %lf = %lf", angolo, cosenox(angolo));printf("\nLa funzione di libreria fornisce %lf ", cos(angolo));}
32© Piero Demichelis
Coseno
/* funzione per il coseno x */ double cosenox(double x){const double soglia = 0.00005;double accosenx, termine, termass, n;
/* Inizializzazione variabili */termine = 1; /* primo termine */n = 0; /* denominatore */accosenx = 1; /* accumulatore di risultato */termass = 1; /* valore assoluto del primo termine */
33© Piero Demichelis
Coseno
while (termass > soglia) {/* contributo del nuovo termine */ termine *= -x * x /((n+1) * (n + 2));/* accumula in accosenx */ accosenx += termine;/* aggiorna il denominatore */ n += 2;/* ricava valore assoluto del termine appena calcolato */ termass = fabs(termine); }return (accosenx);}
34© Piero Demichelis
MCD di un insieme di numeri
• Leggere da tastiera la quantità di numeri sui quali ricercare successivamente il MCD.
• Leggere poi quei numeri salvandoli in un vettore (di interi) e successivamente calcolare e visualizzare il MCD.
• Analisi:
Il problema è simile al precedente basta estendere la ricerca del divisore comune. Anziché tre numeri siamo ora in presenza di una serie di numeri la cui consistenza non è nota al momento della scrittura del programma. Risulta pertanto indispensabile memorizzare la sequenza in un vettore di dimensioni opportune
il controllo sul resto ottenuto dalla divisione tra ogni numero e il divisore (presunto MCD) dovrà necessariamente essere gestito tramite un ciclo (for è il più adatto).
35© Piero Demichelis
MCD di un insieme di numeri
#include <conio.h>#include <stdio.h>
#define falso 0#define vero 1
main(){int num, vett[100], mcd, min, i;int trovato, noresto;
clrscr();
printf ("\nSu quanti numeri calcolo il MCD?: ");scanf ("%d", &num);
36© Piero Demichelis
MCD di un insieme di numeri
/* Legge i num numeri previsti mediante un ciclo for *//* contemporaneamente trova il minimo controllando *//* il loro valore man mano che vengono introdotti */
min = 32767; /* massimo valore per un intero */
for (i = 0; i < num; i++) { printf ("\nIntroduci il numero di indice %d: ", i); scanf ("%d", &vett[i]); if (vett[i] < min) min = vett[i]; }
37© Piero Demichelis
MCD di un insieme di numeri
trovato = falso; while (!trovato) { noresto = vero; for (i = 0; i < num; i++) if (vett[i] % min != 0) noresto = falso; if (noresto) { mcd = min; trovato = vero; } else min--; } printf ("\nMCD = %d", mcd);}
38© Piero Demichelis
Esempio: giorni nell’anno
• Realizzare un programma che legga da tastiera l’anno di riferimento e la sigla del primo giorno di quell’anno (1 gennaio) composta dai primi tre caratteri del nome (ad esempio: 2003 mer) e visualizzi sul video una tabella in cui sono indicati, per ogni mese dell’anno, quante volte occorre ciacun giorno della settimana.
Si rammenta che sono bisestili gli anni divisibili per 4 ma, tra quelli multipli di 100, solo quelli che sono divisibili per 400.
39© Piero Demichelis
Esempio: giorni nell’anno
Esempio di tabella in uscita:
2003
gen feb mar apr mag giu lug ago set ott nov dic
lun 4 4 mar 4 4mer 5 ecc.gio 5ven 5sab 4dom 4
40© Piero Demichelis
Esempio: codice 2 su 5
Generare tutti i codici 2 su 5 (5 bit, di cui due bit devono essere a 1 e tre bit a zero), li si memorizzi in un'opportuna base dati e li si visualizzi sul videoterminale.
(Si rammenti che i codici binari possono essere visti come numeri interi (senza segno), per cui è sufficiente generare tutti i codici di 5 bit e poi scartare quelli che non soddisfano la condizione di avere 2 bit ad uno e 3 a zero.)
Successivamente confrontare i codici a due a due e, per ciascuna coppia, confrontare i bit a parità di posizione, conteggiando il numero di bit diversi tra di loro (il numero di bit diversi viene detto distanza tra i codici). Il programma calcoli e stampi il massimo e il minimo della distanza tra i codici.