Tecniche iterative. Walter Didimo

Documenti analoghi
Istruzioni di Controllo. Emilio Di Giacomo e Walter Didimo

Istruzioni di controllo. Walter Didimo

Stringhe. Walter Didimo

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Array di array. Walter Didimo

Introduzione all uso degli oggetti in Java (parte II) Walter Didimo

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

E9 Esercizi sul Capitolo 9 Array

E17 Esercizi sugli Array in Java

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

System.out.print("\tATTENZIONE: hi inserito un valore non valido!\n");

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

E7 Esercizi sul Capitolo 7 Realizzazione di Classi

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Primo esempio di un programma Java

Uso di metodi statici. Walter Didimo

Realizzare un applicazione console che stampi la somma dei primi n numeri dispari oppure pari (a scelta dell operatore). import java.io.

La Ricorsione. Carla Binucci e Walter Didimo

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Dicembre Alcune Soluzioni

Note ed esercizi aggiuntivi

Lezione 4 Casting, stringhe e caratteri, operatori relazionali, espressioni e variabili booleane

3. un metodo che restituisce l elenco delle matricole di tutti gli studenti del corso;

Array. Emilio Di Giacomo e Walter Didimo

import java.io.*; char sceltautente = '_'; boolean condizionesn = true; boolean condizionedowhile = true; boolean condizioneprogramma = true;

import java.io.*; Pag. 1 di 15

Esempi di programmi. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa E01. A. Miola Settembre 2007

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Array. Definizione e utilizzo di vettori

Programmazione in Java (I modulo) Lezione 11: Metodi della classe Math

// Variabile utilizzata per eseguire una nuova elaborazione del programma senza riavviarlo.

Preparazione allo Scritto di Programmazione

Introduzione all uso degli oggetti in Java (parte I) Walter Didimo

Programmazione. Cognome... Nome... Matricola... Compitino del 24 novembre 2008

E18 Esercizi su ereditarietà e polimorfismo

import java.io.*; System.out.print("\tInserire il tasso di spesa: ");

import java.io.*; double massa = 0.0; double velocità = 0.0; double coefficienteattrito = 0.0; int numeroveicoli = 0;

// Variabile utilizzata esclusivamente nei cicli DO... WHILE per la verifica dei dati. Pag. 1 di 12

Laboratorio di programmazione

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esercizi su array di array

import java.io.*; public class EU4_24 { private int stimaoreesecuzionelavori;

L istruzione while. while (condition) istruzione

// Dichiarare le variabili d'istanza e i metodi di lettura e scrittura delle stesse utilizzando il reference predefinito THIS. //... //... //... //...

Alcuni Soluzioni. Fornire la specifica di un algoritmo risolutivo utilizzando lo pseudocodice visto a lezione.

Esempio: Tombola! Vogliamo progettare una applicazione che realizza il gioco della tombola Versione semplificata: un banco, un

A. Ferrari. informatica. Java basi del linguaggio. Alberto Ferrari Informatica

import java.io.*; System.out.print("\tInserire l\'altezza (in CM) delle piastrelle: "); stringainput = tastiera.readline();

import java.io.*; class Quadrato implements FigureGeometrichePiane { private double lato;

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Anno Accademico 2003/04. Docente modulo 1: Annalisa De Bonis. Ripete l esecuzione di statement fino a che la condizione e` verificata

// Variabile utilizzata per eseguire una nuova elaborazione del programma senza riavviarlo.

import java.io.*; boolean condizioneciclo = true;

import java.io.*; public class EU4_23 { private double prezzoacquisto; private double percentualeguadagno;

import java.io.*; public class EU4_25 { private String prodottoalimentare = new String();

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

Algoritmi di Ricerca. Esempi di programmi Java

Esercitazione Fondamenti di Informatica 2

Esempi di Problemi Iterativi

COGNOME NOME MATRICOLA DATA

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Pag. 1 di 7. import java.io.*;

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Algoritmi di Ricerca. Esempi di programmi Java

import java.io.*; System.out.print("\tInserire il valore (in OHM) della resistenza \"R1\": ");

Esempi di Problemi Iterativi

Programmazione A.A Costrutti di base. ( Lezione XII, parte I ) Gestione dell input. Prof. Giovanni Gallo Dr.

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Fondamenti di Informatica T-1. Variabili, costanti e operazioni Selezione

Metodi statici. Dichiarazione e chiamata di metodi statici

Lezione 6 programmazione in Java

Capitolo 16 Iterazione

Problema index index memorizzare tutti i valori della sequenza ma se i valori dovessero essere mille?

Programmazione I. 11 gennaio Considerate la seguente gerarchia di classi (rappresentata mediante un diagramma UML): +f(double x):

Esercizi sul modello Runtime di Java e sulla ricorsione (Fondamenti di Informatica 2 Walter Didimo) (Soluzioni)

Fondamenti di Informatica T-1

5 - Istruzioni condizionali

Corso di Laurea Ingegneria Civile Elementi di Informatica. Esercizi. Carla Limongelli. Esercizi 1

Capitolo 5. Array e collezioni. c 2005 Pearson Education Italia Capitolo 5-1 / 61

Cast implicito. Il cast è fatto automaticamente quando un tipo più basso viene assegnato ad un tipo più alto. byte short int long float double

Esercitazione n 2. Obiettivi

Somma di due numeri interi

Array di array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 03. A. Miola Febbraio 2008

Programmazione. Cognome... Nome... Matricola... Compitino del 24 novembre 2011

CORSO DI PROGRAMMAZIONE

Programmazione in Java (I modulo) Lezione 4

IL LINGUAGGIO JAVA. Introduzione alla sintassi di Java La sintassi formalizza le regole sintattiche per scrivere frasi ben formate

import public static boolean int boolean false boolean false boolean false boolean false true false

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

Transcript:

Tecniche iterative Walter Didimo

Tecniche iterative In questa lezione svolgeremo alcuni esercizi di definizione di classi con metodi che usano istruzioni condizionali istruzioni iterative Gli esercizi svolti serviranno tra l altro ad illustrare alcune classiche tecniche iterative

La classe NumeroNaturale Vogliamo realizzare una classe NumeroNaturale, in base alle seguenti specifiche: un oggetto NumeroNaturale rappresenta un numero naturale la classe NumeroNaturale ha un costruttore che consente di creare un oggetto che rappresenta un numero naturale specificato la classe NumeroNaturale avrà un certo insieme di metodi di istanza che serviranno a verificare se il numero rappresentato ha certe proprietà

Classe NumeroNaturale: : lo scheletro class NumeroNaturale { private int numero; // il numero rappresentato /* Costruttore: crea un NumeroNaturale che rappresenta il numero specificato */ public NumeroNaturale (int num) { /* Restituisce true se il numero è primo */ public boolean isprimo () { /* Restituisce true se il numero è perfetto */ public boolean isperfetto () { /* Visualizza tutti i divisori interi sulla finestra di output specificata */ public void stampadivisori (OutputWindow out) {

Classe NumeroNaturale: : costruttore class NumeroNaturale{ private int numero; // il numero rappresentato /* Costruttore: crea un NumeroNaturale che rappresenta il numero specificato */ public NumeroNaturale (int num) { this.numero = num;

Classe NumeroNaturale: isprimo Prima soluzione uso di un ciclo for public boolean isprimo (){ boolean primo; if (this.numero > 1){ primo = true; for (int i=2; i<this.numero; i++) if (this.numero%i == 0) primo = false; else primo = false; return primo; Scandisce tutti i potenziali divisori fino al numero stesso (escluso) Il ciclo non si arresta se trova un divisore

Classe NumeroNaturale: isprimo Seconda soluzione uso di un ciclo for più breve public boolean isprimo (){ boolean primo; if (this.numero > 1){ primo = true; int radice = (int)math.sqrt(this.numero); for (int i=2; i<=radice; i++) if (this.numero%i == 0) primo = false; else primo = false; return primo; Scandisce i potenziali divisori fino alla radice quadrata del numero Il ciclo non si arresta se trova un divisore

Classe NumeroNaturale: isprimo Terza soluzione uso di un ciclo while public boolean isprimo (){ boolean primo; if (this.numero > 1){ primo = true; int radice = (int)math.sqrt(this.numero); int i = 2; while (primo && i<=radice){ if (this.numero%i == 0) primo = false; i++; else primo = false; return primo; Scandisce i potenziali divisori fino alla radice quadrata del numero Il ciclo si arresta appena trova un divisore

Classe NumeroNaturale: isperfetto Un numero è perfetto se è pari alla somma dei suoi divisori interi (escluso ovviamente il numero stesso) I primi numeri perfetti sono: 6, 28, 496,

Classe NumeroNaturale: isperfetto Prima soluzione uso di un ciclo for public boolean isperfetto (){ boolean perfetto; int somma = 0; Scandisce tutti i potenziali divisori interi e ne calcola la somma for (int i=1; i<=this.numero/2; i++) if (this.numero%i == 0) somma += i; if (somma == this.numero) perfetto = true; else perfetto = false; return perfetto;

Classe NumeroNaturale: isperfetto Seconda soluzione uso di un ciclo while public boolean isperfetto (){ Scandisce tutti i boolean perfetto; potenziali divisori interi int somma = 0; e ne calcola la somma int i=1; while (somma<=this.numero && i<=this.numero/2){ if (this.numero%i == 0) somma += i; i++; if (somma == this.numero) perfetto = true; else perfetto = false; return perfetto; Il ciclo di arresta se la somma supera il numero

Classe NumeroNaturale: stampadivisori In questo caso è necessario guardare tutti i potenziali divisori, senza ulteriori condizioni di arresto public void stampadivisori (OutputWindow out){ for (int i=1; i<=this.numero/2; i++) if (this.numero%i==0) out.writeln (i);

Uso della classe NumeroNaturale Vediamo ora una classe, ProvaNumeroNaturale, che usa le funzionalità della classe NumeroNaturale Il metodo main della classe ProvaNumeroNaturale svolge queste azioni: fa inserire all utente un numero naturale n dice all utente se n è primo o meno visualizza all utente tutti i numeri perfetti fino ad n visualizza all utente tutti i divisori interi di n

La classe ProvaNumeroNaturale class ProvaNumeroNaturale{ public static void main (String[] args){ /* Acquisice un numero naturale e crea un oggetto NumeroNaturale */ InputWindow in = new InputWindow (); int num = in.readint("inserisci un naturale"); NumeroNaturale naturale = new NumeroNaturale(num); /* Dice se il numero è primo */ OutputWindow out = new OutputWindow (); if (naturale.isprimo ()) out.writeln ("Il numero è primo"); else out.writeln ("Il numero non è primo"); (continua)

La classe ProvaNumeroNaturale /* Visualizza i numeri perfetti fino a num */ out.writeln ( Numeri perfetti fino a + num + : ); for (int i=1; i<=num; i++){ NumeroNaturale nat = new NumeroNaturale (i); if (nat.isperfetto ()) out.write (i + ); /* Visualizza i divisori interi di num */ out.writeln(); out.writeln ( Divisori interi di + num : ); naturale.stampadivisori (out); // fine main // fine classe

La classe AnalizzatoreDiStringa Come ulteriore esercizio, vogliamo ora realizzare una classe AnalizzatoreDiStringa in base alle seguenti specifiche un oggetto AnalizzatoreDiStringa rappresenta una stringa, che gli viene passata all atto della sua creazione un oggetto AnalizzatoreDiStringa avrà dei metodi che permettono di ottenere alcune utili informazioni sulla stringa che esso rappresenta

AnalizzatoreDiStringa: : scheletro class AnalizzatoreDiStringa{ /* la stringa rappresentata */ private String stringa; /* costruttore */ public AnalizzatoreDiStringa (String s){ /* restituisce la frequenza del carattere c */ public int frequenza (char c){ /* restituisce il numero di vocali nella stringa */ public int numerovocali (){ /* restituisce il numero di consonanti nella stringa */ public int numeroconsonanti (){ /* visualizza le frequenze dei caratteri 'a'--'z', nella finestra specificata*/ public void stampafrequenzeaz (OutputWindow out)

AnalizzatoreDiStringa: : costruttore /* costruttore */ public AnalizzatoreDiStringa (String s){ this.stringa = s; Il costruttore deve solo copiare il riferimento alla stringa passatagli come parametro nella variabile di istanza dell oggetto

AnalizzatoreDiStringa: : frequenze /* restituisce la frequenza di un carattere */ public int frequenza (char c){ int f = 0; for (int i=0; i<this.stringa.length(); i++){ char ch = this.stringa.charat(i); if (ch==c) f++; return f; Nel ciclo viene calcolata la frequenza del carattere c, e viene memorizzata nella variabile f

AnalizzatoreDiStringa: numerovocali /* restituisce il numero di vocali nella stringa */ public int numerovocali (){ int vocali = 0; String temp = this.stringa.touppercase(); for (int i=0; i<temp.length(); i++){ char ch = temp.charat(i); if ((ch == 'A') (ch == 'E') (ch == 'I') (ch == 'O') (ch == 'U')) vocali++; return vocali; Converte tutti i caratteri in maiuscolo, per non dover distinguere tra minuscole e maiuscole

AnalizzatoreDiStringa: numeroconsonanti /* restituisce il numero di consonanti nella stringa */ public int numeroconsonanti(){ int consonanti = 0; String temp = this.stringa.touppercase(); for (int i=0; i<temp.length(); i++){ char ch = temp.charat(i); if ((ch>=66 && ch<=68) (ch>=70 && ch<=72) (ch>=74 && ch<=78) (ch>=80 && ch<=84) (ch>=86 && ch<=90)) consonanti++; return consonanti; Il confronto è fatto sulle posizioni occupate dalle consonanti nell alfabeto Unicode 2.0

AnalizzatoreDiStringa: stampafrequenzeaz /* visualizza le frequenze dei caratteri 'a'--'z', nella finestra specificata*/ public void stampafrequenzeaz (OutputWindow out){ for (char c='a'; c<='z'; c++){ int f = 0; // frequenza del carattere c for (int i=0; i<this.stringa.length(); i++){ char ch = this.stringa.charat(i); if (ch==c) f++; out.writeln ("frequenza di " + c + " = " + f); for annidati: il più esterno scandisce i caratteri da a a z ; il più interno scandisce i caratteri della stringa (il for più interno è eseguito ad ogni nuovo ciclo del for esterno)

Cicli for annidati: un esempio for (char c='a'; c<='z'; c++){ int f = 0; // frequenza del carattere c for (int i=0; i<this.stringa.length(); i++){ char ch = this.stringa.charat(i); if (ch==c) f++; a b c d e f. z c i a o m o n d o this.stringa

Cicli for annidati: un esempio for (char c='a'; c<='z'; c++){ int f = 0; // frequenza del carattere c for (int i=0; i<this.stringa.length(); i++){ char ch = this.stringa.charat(i); if (ch==c) f++; a b c d e f. z c i a o m o n d o this.stringa

Cicli for annidati: un esempio for (char c='a'; c<='z'; c++){ int f = 0; // frequenza del carattere c for (int i=0; i<this.stringa.length(); i++){ char ch = this.stringa.charat(i); if (ch==c) f++; a b c d e f. z c i a o m o n d o this.stringa

AnalizzatoreDiStringa: stampafrequenzeaz /* visualizza le frequenze dei caratteri 'a'--'z', nella finestra specificata soluzione più elegante */ public void stampafrequenzeaz (OutputWindow out){ for (char c='a'; c<='z'; c++){ out.writeln ("frequenza di " + c + " = " + this.frequenza(c)); Viene riusato il metodo frequenze scritto in precedenza (il ciclo del calcolo della frequenza di un carattere è incapsulato nel metodo)

Glossario dei termini principali Termine Numero perfetto Frequenza di un carattere Significato Un numero intero la cui somma dei divisori è uguale al numero stesso Numero di occorrenze di un carattere in una stringa