Anno accademico 2001-2002

Politecnico di Torino – sezione di Alessandria

Laboratorio di Informatica

 

10-10-2001

Corso A            Corso B

 

Concetto di modello:  risultati, dati, limiti, algoritmo

 

Esempi proposti e risolti insieme con discussione.

 

Problema: Risoluzione equazione 2° grado

 

Risultati:

nessuna soluzione, due soluzioni  distinte, due soluzioni coincidenti.

Dati:

a, b, c

Limiti:

 

a < > 0

 

Algoritmo:

 

            leggi a, b, c

            se a = = 0

                        errore nei dati

            altrimenti

                        calcola delta  à delta = b^2 – 4*a*c

                        se delta < 0

                                    scrivi nessuna soluzione

                        altrimenti

                                    x1 = (-b + radice(delta)) / (2 * a)

                                    x2  = (-b -  radice(delta)) / (2 * a)

                                    scrivi x1, x2

 


 

Problema: dati 3 numeri, indicare il tipo di triangolo

 

risultato:

triangolo eq, iso, scaleno, nessun triangolo

dati:

l1, l2, l3

limiti:

l1 > 0 AND  l2 > 0  AND    l3 > 0

Algoritmo:

 

            RIPETI

                        LEGGI l1, l2, l3

            SINO A QUANDO l1 > 0 AND  l2 > 0  AND    l3 > 0

            SE   l1+l2 > l3   and  l2+l3>l1  and  l1+l3>l2

                        Scrivi triangolo

                        Se l1 = = l2 and l2 = = l3

                                    Scrivi equilatero

                        Altrimenti

                                    Se l1 == l2  or  l2==l3  or  l3== l1

                                                Scrivi iso

                                    Altrimenti

                                                Scrivi scaleno

            Altrimenti

                        Scrivi non è un triangolo

 

 


17-10-2001

Corso A                      Corso B

 

Problema: Dati 3 numeri individuare il tipo di triangolo

 

Obiettivo.

Risultato.

Dati:

Limiti:

 

Classificare eventualmente i triangoli

Scaleno, eq, is, non triangolo

l1, l2, l3

l1, l2, l3 > 0

L3 < l1 + l2    AND    l1 < l2 + l3   AND      l2 < l1 + l3

 

ripeti

LEGGI  l1, l2, l3

Fino a quando l1 > 0  AND  l2 > 0 AND l3 > 0

 

Se        L3 >= l1 + l2    OR   l1 >=l2 + l3  

                                     OR   l2 >= l1 + l3

                        SCRIVI non è un triangolo

altrimenti

            Se l1 == l2 AND l2 == l3

                        Scrivi triangolo equilatero

            altrimenti

            Se l1 == l2 OR l2 == l3 OR l3 == l1

                                               Scrivi triangolo is

                                   Altrimenti

                                               Scrivi triangoloScaleno

 

do {

               scanf(“%d %d %d”, &l1, &l2, &l3);

}while( (l1 <=0) || (l2 <=0) || (l3 <= 0) );

 

 

if( (l3 >= l1 + l2) || (l1 >=l2 + l3) || (l2 >= l1 + l3 ) )

                               printf(“non è un triangolo”);

 

else

             if (( l1 == l2 ) && ( l2 == l3 ))

                printf(“triangolo equilatero”);

 

else

                if ((l1 == l2) || (l2 == l3)

                || (l3 == l1))

                               printf(“triang. Is”);

            else

                           printf(“triang. scal”);

 

 

Utilizzo Turbo C++ per il test del programma.

 


24-10-2001

Corso A  Corso B

 

Rappresentazione dei numeri con notazione scientifica.

 

Problema: Verifica proprietà associativa

 

Risultato:

Dati:

r1 r2   con r1 = (a+b)+c   r2=a+(b+c)

a, b, c

Algoritmo:

 

 

 

 

 

Leggi a, b, c

 

R1 = a + b

R1 = r1 + c

 

R2 = b + c

R2 = a + r2

 

Srivi r1, r2

 

 

#include <stdio.h>

main() {

            float r1, r2, a, b, c;

 

            printf("ok. ");

            scanf("%f %f %f", &a, &b, &c);

            r1 = a + b;

            r1 = r1 + c;

           

 

              r2 = b + c;

            r2 = a + r2;

           

              printf("R1 = %f \n", r1);

            printf("R2 = %f \n", r2);

}

 

 

Testato il programma con 1e20, -1e20, 12345

 

 

 

Problema: calcolo dell’errore relativo

 

Discussione del codice con particolare riferimento ai due cicli while.

 
main() {
               double err1=1.0, err2;
 
               while( (1 + err1) > 1) 
                         err1 = err1 / 2;
 
               while( (1 + err1) == 1) {
                              err2 = err1; 
                              err1 = err1 * 1.01;
               }
printf("Errore relativo 1 = %e\nErrore relativo 2 = %e\n", err1, err2);
}

                                               Solo Corso A

 

 

Problema: dati n numeri contare i pari e i dispari.

 

Risultati:

Dati:

Limiti:

pari, dispari

n, numero

n > 0

Algoritmo:

 

 

 

 

Leggi n

Mentre n < 0

            Scrivi errore

            Leggi n

 

Per n volte

            Leggi numero

            Se resto = 0

                        Pari ++

            Altrimenti

                        Dispari ++

 

Scrivi pari dispari

 

#include <stdio.h>

main() {

      int n, numero, pari =0, dispari =0, i;

 

       scanf("%d", &n);

       while( n < 0 ) {

                  printf(" errrrrrorrrre");

                  scanf("%d", &n);

       }

       for(i=1 ; i<= n; i++){

                  scanf("%d", &numero);

                  if( numero % 2  == 0)

                        pari++;

                  else

                        dispari++;

       }

       printf("I pari sono %d \n", pari);

       printf("I dispari sono %d \n", dispari);

}

 

 

 


Solo Corso B

 

Risoluzione equazione di 2° grado

 

 

 

 

 

 

 

leggo a, b, c

Se a == 0

                Errore nei dati

altrimenti

                calcolo delta

                se delta < 0

                               scrivo impossibile

                altrimenti

                               x1 = (-b + radice(delta)) / (2 * a)

x2 = (-b - radice(delta)) / (2 * a)

                            scrivi x1, x2

 

#include <stdio.h>

#include <math.h>

 

main() {

                float a, b, c, delta, x1, x2;

 

                scanf("%f %f %f", &a, &b, &c);

                if (a == 0) printf("errore nei dati");

               

              else {

                               delta = b * b - 4 * a *c;

                               if(delta < 0) printf(" eq impossibile ");

 

                               else {

                                               x1 = (- b + sqrt(delta) ) / ( 2 * a );

                                               x2 = (- b - sqrt(delta) ) / ( 2 * a );

                                               printf("x1 = %f\n", x1);

                                               printf("x2 = %f\n", x2);

                           }

                }

}

 

               

Il programma è stato testato con vari valori.

Discussione con 1, 10000, -1 perché una soluzione = 0.

 

 


31-10-2001

Corso A  Corso B

 

Puntualizzazione sui tipi predefiniti

 

char

short int

int

long int

unsigned char

unsigned short int

unsigned int

unsigned long int

float

double

---

---

 

Corso A

 

Problema: calcolare la media aritmetica di n numeri.

 

Risultato:

Dati:

Limiti:

Algoritmo:

 

media

n numero

n > 0

 

 

 

 

 

 

 

 

leggi n

mentre n<0

            leggi n

per n volte

            leggi numero

            somma = somma + numero

 

media = somma / n

scrivi media

 

#include <stdio.h>

main() í

         int n, i;

         float soma=0, media, numero;

 

          scanf(“%d”, &n);

          while (n <= 0)

                   scanf(“%d”, &n);

          for(i=1; i<=n; i++) í

                   scanf(“%f”,&numero);

                   somma = somma + numero;

         ý

          media = somma / n;

          printf(“media = %f\n”, media);

ý

 

 


 

Ricordando che la funzione scanf  restituisce il numero di conversioni corrette che è riuscita a compiere, il problema precedente si può risolvere nel seguente modo:

 

#include <stdio.h>

main() í

         int n=0;

         float soma=0, media, numero;

 

          while ( scanf(“%f”, &numero) == 1) í

                   n++;

                   somma = somma + numero;

         ý

          media = somma / n;

          printf(“media = %f\n”, media);

ý

 

 

Per interrompere la lettura dei dati si deve scrivere ctrl^ d sui computer UNIX e ctrl^ z in ambiente MICROSOFT.

 

 

Corso B

Problema: dati n numeri contare i pari e i dispari.

 

Risultato:

Dati:

Limiti:

Algoritmo:

pari dispari

n numero

n > 0

 

 

 

 

 

 

 

leggi n

mentre n < 0

            leggi n

per n volte

            leggi numero

            se è_pari(numero)

                     pari++

            altrimenti

                     dispari++

 

scrivi pari dispari

 

#include <stdio.h>

main() í

         int n, i, pari=0, dispari=0, numero;

        

 

          scanf(“%d”, &n);

          while (n <= 0)

                   scanf(“%d”, &n);

          for(i=1; i<=n; i++) í

                   scanf(“%f”,&numero);

                   if(numero % 2 == 0)

                             pari++;

                   else

                             dispari++;

         ý

          printf(“\npari = %d\dispari = %d\n”, pari,dispari);

ý

 

 

Ricordando che la funzione scanf  restituisce il numero di conversioni corrette che è riuscita a compiere, il problema precedente si può risolvere nel seguente modo:

 

#include <stdio.h>

main() í

         int pari=0, dispari=0, numero;

 

          while ( scanf(“%f”, &numero) == 1)

                   if(numero % 2 == 0)  pari++;

                   else  dispari++;

          printf(“\npari = %d\dispari = %d\n”, pari,dispari);

ý

 

 

Per interrompere la lettura dei dati si deve scrivere ctrl^ d sui computer UNIX e ctrl^ z in ambiente MICROSOFT.

 

 

                                     Corso A             Corso B

 

Problema: contare le vocali tra n caratteri

 

Risultato:

Dati:

Limiti:

vocale

n, caratteri

n >0

 

 

 

 

 

 

 

leggi n

mentre n<0

            leggi n

per n volte

            leggi carattere

            if(vocale(carattere))

                         vocale++

 

 

 

 

 

 

scrivi vocale

#include <stdio.h>

main() í

         int n, i, vocale=0;

         char carattere;

 

          scanf(“%d”, &n);

          while (n <= 0)

                   scanf(“%d”, &n);

          for(i=1; i<=n; i++) í

                   scanf(“%c”,&carattere);

                   if( (carattere==’A’)||(carattere==’E’)||

                        (carattere==’I’)||(carattere==’U’)||

                        (carattere==’O’)||

                        (carattere==’a’)||(carattere==’e’)||

                        (carattere==’i’)||(carattere==’u’)||

                        (carattere==’o’) )

                              vocale++;

         ý

          printf(“media = %d\n”, vocale);

ý

 

 


7-11-2001

Corso B

 

Problema: dati n numeri calcolare la media aritmetica. Risolto come in precedenza.

 

Corso A         Corso B

 

Problema: Dati n numeri calcolare la media aritmetica dei pari.

 

Risultato:

Dati:

Limiti:

Algoritmo:

media

   n, numero

n>0

 

 

 

 

 

 

 

leggi n

mentre n < 0

            leggi n

per n volte

            leggi numero

            se è_pari(numero)

                 pari++

                 somma = somma + numero

 

media = somma / pari

scrivi media

 

#include <stdio.h>

main() í

         int n, i, pari=0, numero;

         float somma, media;

 

          scanf(“%d”, &n);

          while (n <= 0)

                   scanf(“%d”, &n);

          for(i=1; i<=n; i++) í

                   scanf(“%f”,&numero);

                   if(numero % 2 == 0)

                             pari++;

                             somma=somma+numero;

         ý

          media=somma/pari;

          printf(“\media = %f \n”, media);

ý

 

Versione con interruzione dei dati:

 

#include <stdio.h>

main() í

         int pari=0, numero;

         float somma, media

 

          while ( scanf(“%f”, &numero) == 1)

                   if(numero % 2 == 0)  í

                            pari++;

                            somma=somma+numero;

         ý

          media=somma/pari;

          printf(“\media = %f \n”, media);

ý

 

 

Cosa succede se si dichiara int somma    ?


14-11-2001

Corso A  Corso B

 

Introduzione function attraverso esempi.

 

Problema: calcolare n!

Definizione di fattoriale

 

0! --> 1

1! --> 1

n! -->  n*(n-1)! à n*(n-1)*(n-2)* .......* 1

 

Risultato: fatt

Dati: n

Limite: n > 0

 

Algoritmo:

            leggi n

            mentre n < 0

                        leggi n

            fatt = fattoriale( n )

            scrivi fatt

 

dove fattoriale calcola il fattoriale di n. Supponiamo in un primo tempo di avere a disposizione questa funzione, simile q uella utilizzata in un esercizio precedente ( sqrt ) per il calcolo della radice quadrata.

 

Codifica in c

 

main(){

            int n;

            long fatt;

            scanf(“%d”, &n);

            while ( n < 0 )

                        scanf(“%d”, &n);

            fatt = fattoriale( n );

            printf(“Il fattoriale di %d è %ld \n”, n, fatt);

}

 

fattoriale è una funzione che deve essere definita. Il concetto di funzione è già conosciuto dalla matematica: una relazione tra insiemi che gode di particolari proprietà. Nel caso di fattoriale è una relazione tra int e long. Dato in ingresso un numero int positivo calcola il corrispondente long applicando la definizione di fattoriale:

 

            long fattoriale( int n ) {

                        long f = 1;

                        if( (n == 0) || (n == 1) ) return 1;            /* inutile. Perchè?  */

                        for( ; n > 1; n--)

                                    f = f * n;

                        return f;

            }


Problema: calcolare a ^ n con n intero positivo ed a qualunque.

 

Risultato: r

Dati: a n

Limiti: n > 0

 

Algoritmo:

 

            leggi a

            leggi n

            mentre n < 0

                        leggi n

            r = eleva( a, n )

            scrivi r

 

Codifica in c

 

main() {

            int n;

            double a, r ;

 

            scanf(“%f”, &a);

            scanf(“%d”, &n);

            while( n < 0 )

                        scanf(“%d”, &n);

            r = eleva( a, n );

            printf(“ %f ^ %d = %f \n”, a, n, r);

}

 

eleva è così definita:

 

double eleva( double a, int n ) {

            double r = 1 ;

 

            for( ; n > 0 ; n--)

                        r = r * a;

            return r;

}

 

Questa funzione non prevede il caso 0^0, forma indeterminate. Come si può modificare?