Esercizi

40
1 © Piero Demichelis Esercizi

description

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 - PowerPoint PPT Presentation

Transcript of Esercizi

Page 1: Esercizi

1© Piero Demichelis

Esercizi

Page 2: 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

Page 3: Esercizi

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);

Page 4: Esercizi

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! */

Page 5: Esercizi

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); }

Page 6: Esercizi

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 */

Page 7: Esercizi

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

Page 8: Esercizi

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.

Page 9: Esercizi

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 */

Page 10: Esercizi

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");}

Page 11: Esercizi

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.

Page 12: Esercizi

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

Page 13: Esercizi

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 */

Page 14: Esercizi

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!");}

Page 15: Esercizi

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.

Page 16: Esercizi

16© Piero Demichelis

Fattoriale

#include <stdio.h>

#define val_max 12

main (){long int n, totale;

printf (“\nFattoriale di: ");scanf ("%ld", &n);

totale = 1;

Page 17: Esercizi

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); }}

Page 18: Esercizi

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.

Page 19: Esercizi

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);}

Page 20: Esercizi

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;

Page 21: Esercizi

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);

Page 22: Esercizi

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

Page 23: Esercizi

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);

Page 24: Esercizi

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 */

Page 25: Esercizi

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

Page 26: Esercizi

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);

Page 27: Esercizi

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]; }

Page 28: Esercizi

28© Piero Demichelis

Matrice (2)

/* Visualizza risultati */  printf ("\nLa somma è %ld", sommaprinc); printf ("\nLa media è %lf",

(double)sommasec/(double)num_r);}

Page 29: Esercizi

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

Page 30: Esercizi

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

Page 31: Esercizi

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));}

Page 32: Esercizi

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 */

Page 33: Esercizi

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);}

Page 34: Esercizi

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).

Page 35: Esercizi

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);

Page 36: Esercizi

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]; }

Page 37: Esercizi

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);}

Page 38: Esercizi

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.

Page 39: Esercizi

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

Page 40: Esercizi

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.