400 likes | 632 Views
Esercizi. Equazione di II grado. Legge i coefficienti a , b e c. a = 0?. si. no. b = 0?. delta = b*b – 4*a*c. si. no. c = 0?. delta = 0?. Equazione di I grado: x= -(c / b). si. no. no. si. w = 2*a w 1 = -(b / w) w 2 = / w delta < 0?. Radice doppia
E N D
Equazione di II grado Legge i coefficienti a, b e c a = 0? si no b = 0? delta = b*b – 4*a*c si no c = 0? delta = 0? Equazione di I grado:x= -(c / b) si no no si w = 2*a w1= -(b / w) w2= / w delta < 0? Radice doppia x = -(b / (2 * a)) Equazione indeterminata Equazione impossibile no si Radice reali: x1= w1+ w2 x2= w1- w2 Radice complesse coniugate: x = w1± j w2
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);
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! */
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); }
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 */
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
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.
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 */
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"); }
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.
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
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 */
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!"); }
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.
Fattoriale #include <stdio.h> #define val_max 12 main () { long int n, totale; printf (“\nFattoriale di: "); scanf ("%ld", &n); totale = 1;
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); } }
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: • con un indice che cresce da 1 a uno qualsiasi dei tre numeri si cerca i divisori comuni: l’ultimo trovato è il mcd; • 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.
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); }
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;
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);
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
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);
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 */
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
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);
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]; }
Matrice (2) /* Visualizza risultati */ printf ("\nLa somma è %ld", sommaprinc); printf ("\nLa media è %lf",(double)sommasec/(double)num_r); }
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.
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
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)); }
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 */
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); }
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).
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);
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]; }
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); }
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.
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 4 mer 5 ecc. gio 5 ven 5 sab 4 dom 4
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.