TERNE PITAGORICHE Obiettivi dell’esercitazione

Slides:



Advertisements
Presentazioni simili
INFORMATICA Altre Istruzioni di I/O
Advertisements

Funzioni e procedure Ogni linguaggio di programmazione ad alto livello mette a disposizione del programmatore questi strumenti, ed il C non è da meno!
Sottoprogrammi: funzioni e procedure
String c++.
3TC – 5/11/2010 Cicli while e do.. While Contatori e Totalizzatori.
Generazione di numeri casuali in Dev C++
Informatica Generale Marzia Buscemi
Introduzione al linguaggio C
Le funzioni.
Dallalgoritmo minimax allalgoritmo alfa-beta. MINIMAX int minimax(stato, livello) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO.
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
Programmazione Procedurale in Linguaggio C++
Tail recursion: esempio
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di Programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli Corso.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
1 Corso di Informatica (Programmazione) Lezione 11 (19 novembre 2008) Programmazione in Java: controllo del flusso (iterazione)
Corso di Laurea in Biotecnologie Informatica (Programmazione)
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
CORSO DI PROGRAMMAZIONE II
CORSO DI PROGRAMMAZIONE II
APPUNTI SUL LINGUAGGIO C
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente) ITERAZIONE: ripetere piu volte una sequenza di operazioni istruzioni: for, while, do.
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Istruzioni Iterative Nicola Fanizzi
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Strutture di controllo in C -- Flow Chart --
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
Le funzioni.
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
DEFINIZIONE DI NUOVE FUNZIONI & STRATEGIE DI COMPOSIZIONE La capacità di definire nuove funzioni permette: di definire nuove operazioni di introdurre variabili.
Programmazione in Java Claudia Raibulet
Javascript 6 Funzioni. Una funzione sarà eseguita in risposta ad un evento o ad una chiamata diretta. Le funzioni possono essere inserite comodamente.
1 ListaDiElem Cancella( ListaDiElem lista, TipoElemento elem ) { ListaDiElem puntTemp; if( ! ListaVuota(lista) ) if( lista–>info == elem ) { puntTemp =
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Programmazione di Calcolatori
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Programmazione di Calcolatori
C. Gaibisso Programmazione di Calcolatori Lezione XIV I vettori Programmazione di Calcolatori: i vettori 1.
Radice quadrata di un numero
Riepilogo Foglio elettronico Excel - Base
C. Gaibisso Programmazione di Calcolatori Lezione XVI Allocazione dinamica della memoria Programmazione di Calcolatori: allocazione dinamica della memoria.
Esercizi Liste.
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Tail recursion: esempio
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Ricerca sequenziale in un array di interi
ND-partizione (A) n   A  somma  0 M  1/2 (  a i ) for i  1 to n do S[i]  choice ({true, false}) if S[i] then somma  somma + a i if somma > M then.
1 Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( ) Laboratorio di programmazione Lezione 11 e 12 -
A LGORITMI DI ORDINAMENTO Cinzia Reverberi. COS’È UN ALGORITMO? Un algoritmo è un insieme ben ordinato di operazioni non ambigue ed effettivamente calcolabili.
Il linguaggio Fortran 90: 3. Procedure e Funzioni
Si vuole realizzare una classe Java PhotoGallery che rappresenta una galleria di fotografie online. Ogni PhotoGallery ha una url (rappresentata da una.
1 Un esempio con iteratore: le liste ordinate di interi.
Oggetti in C# Lezione 2 Metodi e Static Oggetti in C# - Lezione 2.
#include void main() { int a,b,c,; float s, x,x1,x2,delta,alfa,beta; int num[3]; int i; printf("La forma classica dell'equazione di 2° grado è: a*x^2+b*x+c=0\n.
4/5/2015E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo – Algoritmi.
Introduzione a Javascript
La ricorsione.
Strutture di controllo Esercizi!. Utilizzare i metodi: I modi per poter richiamare un metodo, di una classe (ad esempio SavitchIn) sono due. 1) E’ sempre.
Lez 4 (13/14)Elementi di Programmazione1 Strutture di controllo 2.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Operatori di incremento e decremento
Informatica 6 Tipi di dato. Nelle celle di memoria di un calcolatore ci sono solo “0” e “1”, fisicamente realizzati tramite due diversi livelli di tensione.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esercitazione pre 1ma prova in itinere Marco D. Santambrogio – Ver. aggiornata.
TERNE PITAGORICHE Obiettivi dell’esercitazione
Transcript della presentazione:

TERNE PITAGORICHE Obiettivi dell’esercitazione Realizzare programmi che includano semplici funzioni Contenuti tecnici Scrittura e invocazione di funzioni di calcolo con parametri passati by reference. Uso delle funzioni. Metodo di progetto: Raffinamenti successivi

Problema Realizzare un programma che generi e stampi tutte le terne pitagoriche nell'intervallo degli interi (A, B e C formano una terna pitagorica se A2 + B2 = C2). È richiesto che il test venga effettuato da una funzione che restituisca il valore TRUE se la terna passata come parametro è pitagorica, FALSE altrimenti. Suggerimento: attenzione all’overflow della somma!

Analisi Occorre provare per tutti gli a, per tutti i b e per tutti i c se (a,b,c) formano una terna pitagorica. Deve essere a2 (e b2 e c2) < INT_MAX, quindi i valori di a, b e c vanno limitati a

Schema base val_max = sqrt(INT_MAX); for(a = 1; a <= val_max; a++) { for(b = 1; b <= val_max ; b++) for(c = 1; c <= val_max; c++) if(is_terna_pitagorica(a, b, c,)) printf("%d %d %d\n", a, b, c); }

Osservazioni Se a, b e c iniziano tutti da 1, verranno trovate le terne equivalenti: 3, 4, 5 4, 3, 5 5, 4,3 Si ovvia iniziando b da un valore successivo ad a, c da un valore successivo a b.

val_max = sqrt(INT_MAX); for(a = 1; a <= val_max; a++) { for(b = a+1; b <= val_max; b++) for(c = b+1; c <= val_max; c++) if(is_terna_pitagorica(a, b, c)) printf("%d %d %d\n", a, b, c); }

Se si trova un valore di c che soddisfa alla condizione che a, b, e c sono una terna, è inutile continuare i test con i valori successivi di c! Si usa un flag, trovata_terna, per bloccare il ciclo più interno appena si trova una terna.

val_max = sqrt(INT_MAX); for(a = 1; a <= val_max; a++) { for(b = a+1; b <= val_max; b++) trovata_terna = FALSE; for(c = b+1; (c <= val_max) && !trovata_terna; c++) if(is_terna_pitagorica(a, b, c)) printf("%d %d %d\n", a, b, c); trovata_terna = TRUE; }

Funzione is_terna_pitagorica Lo schema int is_terna_pitagorica(int a, int b, int c) { int risultato; int a_quad_piu_b_quad; a_quad_piu_b_quad = a * a + b * b; risultato = (a_quad_piu_b_quad == c * c); return(risultato); }

Osservazione La somma a2 + b2 può dare overflow. In questo caso il confronto con c2 non ha senso Occorre comunicare al programma chiamante questa condizione (oltre all’informazione se è o meno una terna pitagorica): occorre un parametro passato by-reference Trattandosi di una somma tra valori positivi, il test di overflow si esegue controllando se il risultato è negativo

Versione definitiva int is_terna_pitagorica(int a, int b, int c, tipo_risultato *p_stato) { int risultato; int a_quad_piu_b_quad; a_quad_piu_b_quad = a * a + b * b; if(a_quad_piu_b_quad < 0) *p_stato = SI_OVERFLOW; risultato = FALSE; } else *p_stato = NO_OVERFLOW; risultato = (a_quad_piu_b_quad == c * c); return(risultato);

Osservazioni per il main Se per una coppia a, b, si riscontra overflow, è inutile continuare con valori superiori (darebbero overflow a maggior ragione): occorre bloccare i cicli più interni. Il main diventa:

Int main() { int val_max; int condizione; int trovata_terna; val_max = sqrt(INT_MAX); for(a = 1; a <= val_max; a++) condizione = NO_OVERFLOW; for(b = a+1; b <= val_max && condizione == NO_OVERFLOW; b++) trovata_terna = FALSE; for(c = b+1; (c <= val_max) && (condizione == NO_OVERFLOW) && !trovata_terna; c++) if(is_terna_pitagorica(a, b, c, &condizione)) printf("%d %d %d\n", a, b, c); trovata_terna = TRUE; } return EXIT_SUCCESS;

Considerazioni finali Il numero di terne pitagoriche trovato è molto grande, e il programma le stampa tutte: a causa dello scorrimento dello schermo, si rischia di riuscire a vedere solo quelle finali, perdendo quelle iniziali. Soluzione: bloccare lo schermo ogni 23 righe, chiedendo che venga battuto INVIO per continuare. Versione definitiva:

#include <stdio.h> #include <math.h> #include <limits.h> #include <stdlib.h> #define NO_OVERFLOW 0 #define SI_OVERFLOW 1 #define FALSE 0 #define TRUE 1 int is_terna_pitagorica(int a, int b, int c, tipo_risultato *p_stato); Int main() { int a, b, c; int val_max; int condizione; int trovata_terna; int contatore = 0;

val_max = sqrt(MAXINT); for(a = 1; a <= val_max; a++) { condizione = NO_OVERFLOW; for(b = a+1; b <= val_max && condizione == NO_OVERFLOW; b++) trovata_terna = FALSE; for(c = b+1; (c <= val_max) && (condizione == NO_OVERFLOW) && !trovata_terna; c++) if(is_terna_pitagorica(a, b, c, &condizione)) printf("%d %d %d\n", a, b, c); trovata_terna = TRUE; contatore++; if((contatore % 23) == 0) system("PAUSE"); } system(“PAUSE”); return EXIT_SUCCESS;