• Non ci sono risultati.

La selezione binaria

N/A
N/A
Protected

Academic year: 2021

Condividi "La selezione binaria"

Copied!
16
0
0

Testo completo

(1)

Andrea Marin

Universit`a Ca’ Foscari Venezia Laurea in Informatica Corso di Programmazione part-time

a.a. 2011/2012

(2)

Introduzione

I L’esecuzione di tutte le istruzioni in sequenza pu`o non `e sufficiente per risolvere anche problemi molto semplici

I Supponiamo di voler scrivere un programma che acquisisca da standard input due numeri interi (dividendo e divisore) e scriva su standard output il loro quoziente e resto

(3)

Divisione (sol. errata)

#i n c l u d e < s t d i o . h>

i n t d i v i s o r e , d i v i d e n d o , q u o z i e n t e , r e s t o ; i n t main ( ) {

s c a n f ( ‘ ‘ % d ’ ’ , &d i v i d e n d o ) ; s c a n f ( ‘ ‘ % d ’ ’ , & d i v i s o r e ) ;

q u o z i e n t e = d i v i d e n d o / d i v i s o r e ; r e s t o = d i v i d e n d o % d i v i s o r e ;

p r i n t f ( ‘ ‘ I l q u o z i e n t e e %d m e n t r e i l r e s t o e %d \ n ’ ’ , q u o z i e n t e , r e s t o ) ; r e t u r n 0 ;

(4)

I Supponiamo che nell’input stream troviamo i numeri 17 e 6

I dividendo avr`a valore 17 e divisore 6

I quoziente assume valore 3 dopo l’assegnamento

I resto assume calore 1 dopo l’assegnamento

I Ma il programma funziona sempre?

I Quando la variabile divisore assume valore 0 si ha un errore run-time di divisione per zero

I Per evitare questo dobbiamo svolgere le divisioni soloseil divisore ha valore diverso da 0

(5)

La struttura grafica

I La struttura del condizionale consente di eseguire unbloccodi istruzioni

se una certa condizione `e soddisfatta, un altrobloccoaltrimenti

Possibili esecuzione:

I BLOCCO1 → BLOCCO2 → BLOCCO4 (se il test `e soddisfatto)

I BLOCCO1 → BLOCCO3 → BLOCCO4 (se il test non `e soddisfatto)

(6)

La condizione (o test)

I Idealmente la condizione dovrebbe essere un’espressione di tipo boolean

I In tal caso, un ramo viene scelto se l’espressione ha valore true, l’altro se l’espressione ha valore false

I In C l’espressione che d`a la condizione `e di tipo int con la consueta codifica dei valori booleani

I Valore = 0 ⇒ condizione non soddisfatta

I Valore 6= 0 ⇒ condizione soddisfatta

(7)

Ancora sull’esempio della divisione

(8)

Struttura sintattica del condizionale in C

i f ( e x p ) BLOCCO1 ; e l s e

BLOCCO2 ; dove:

I exp `e un’espressione di tipo intero

I BLOCCO1 `e una o pi`u istruzioni (nel qual caso racchiuse tra graffe) eseguite solo se exp ha un valore diverso da 0 (true)

I BLOCCO2 `e una o pi`u istruzioni (ne qual caso racchiuse tra graffe) eseguite solo se exp ha valore 0 (false)

I Attenzione: la parteelsedel condizionale pu`o essere assente

(9)

Nidificazione dei condizionali

I Supponiamo di voler scrivere un programma che acquisito un input intero stampi se esso `e positivo, negativo o nullo

I Una sola selezione a due vie non basta!

I In questi casi si sfrutta il fatto che un bloccoche compare nei rami del condizionale pu`o a sua volta contenere altri

condizionali

(10)

Esempio

(11)

Codice

#i n c l u d e < s t d i o . h>

i n t x ;

i n t main ( ) {

s c a n f ( ‘ ‘ % d ’ ’ , &x ) ; i f ( x > 0 ) {

p r i n t f ( ‘ ‘ P o s i t i v o \ n ’ ’ ) ; }

e l s e {

i f ( x == 0 ) {

p r i n t f ( ‘ ‘ N u l l o \ n ’ ’ ) ; }

e l s e {

p r i n t f ( ‘ ‘ N e g a t i v o \ n ’ ’ ) ; }

(12)

If aritmetico

I C mette a disposizione un costrutto chiamato if-aritmetico

I A differenza del condizionale appena visto, l’if-artimetico `e un’espressione

I Sintassi dell’espressione:

( e x p 1 ) ? e x p 2 : e x p 3 ;

I exp1 ha tipo int, exp2 e exp3 sono espressioni con lo stesso tipo

I il valore dell’espressione `e quello di exp2 se il valore di exp1 `e diverso da 0, `e quello di exp3 se il valore di exp1 `e uguale a 0

(13)

Calcolo del modulo

#i n c l u d e < s t d i o . h>

f l o a t x ; i n t main ( ) {

s c a n f ( ‘ ‘ % f ’ ’ , &x ) ; x = ( x > 0 ) ? x : −x ;

p r i n t f ( ‘ ‘ % f \ n ’ ’ , x ) ; r e t u r n 0 ;

}

(14)

Esercizi

1. Leggere due valori float da standard input e memorizzarli in variabili distinte. Quindi scambiare il valore delle due variabili.

2. Letti due valori int da standard input stamparli sullo standard output in ordine crescente

3. Letti tre valori float da standard input stampare su standard output il maggiore

4. Letti tre valori double da standard input dire se possono essere tre lunghezze dei lati di un triangolo. (Condizione necessaria e sufficiente `e che la lunghezza del lato maggiore sia inferiore alla somma delle lunghezze dei due lati pi`u piccoli).

(15)

Scambio di variabili

#i n c l u d e < s t d i o . h>

f l o a t x , y , s u p p o r t o ; i n t main ( ) {

s c a n f ( ‘ ‘ % f ’ ’ ,& x ) ; s c a n f ( ‘ ‘ % f ’ ’ ,& y ) ; /∗ e s e g u o l o s c a m b i o ∗/

s u p p o r t o = x ; x = y ;

y = s u p p o r t o ; . . .

}

(16)

Stampare il pi` u grande di tre valori (alternative?)

#i n c l u d e <s t d i o . h>

f l o a t x , y , z ; i n t main ( ) {

/∗ l e g g i x , y , z ∗/

. . .

i f ( x > y ) { i f ( x > z ) {

p r i n t f ( ‘ ‘ % f ’ ’ , x ) ; }

e l s e {

p r i n t f ( ‘ ‘ % f ’ ’ , z ) ; }

} e l s e {

i f ( y > z ) { p r i n t f ( ‘ ‘ % f ’ ’ , y ) ; }

e l s e {

p r i n t f ( ‘ ‘ % f ’ ’ , z ) ; }

} r e t u r n 0 ; }

Riferimenti

Documenti correlati

Esercizio 30 Si calcoli il centro di massa di una lamina omogenea a forma di quarto di corona circolare di raggio interno r e raggio esterno R. (Sol. 4πR 15

Ora, la lunghezza di un lato di un triangolo non supera la somma delle lunghezze degli

Ora, la lunghezza di un lato di un triangolo non supera la somma delle lunghezze degli altri due... dove r e’ uno

ovvero i tre segmenti che congiungono i vertici di ogni angolo con lato opposto ad essi, e che dividono gli angoli in due parti uguali, creeranno un punto interno che si

HA TUTTI I LATI DI LUNGHEZZA DIVERSA E TUTTI GLI ANGOLI DI AMPIEZZA DIVERSA.

Rettangolo - quadrato - trapezio isoscele: problema 2 (da S.Linardi, R.Galbusera, Percorsi di Geometria, Mursia, 1993). Un rettangolo (ABCD), un quadrato (EFGH) e un trapezio

Dati due segmenti AB e CD per disegnare la loro somma bisogna renderli adiacenti mentre per disegnare la differenza bisogna sovrapporli facendo coincidere un estremo (vedi

Con riferimento alla stessa figura del teorema delle proiezioni: In un triangolo qualsiasi il quadrato di un lato è uguale alla somma dei quadrati degli altri due diminuita del doppio