Python: esercizi sulla ripetizione

Ivan Slavinsky

1. costruire un programma che accetta da tastiera dei numeri finché viene inserito il valore 0; man mano li visualizza.

2. costruire un programma che accetta da tastiera dei caratteri e li conti. L'inserimento si interrompe quando il numero dei caratteri inseriti diventa 10;

3. dato un elenco di nomi con le rispettive città, conta quanti sono quelli di Milano;

4. dato un elenco di prodotti con i rispettivi prezzi, conta quanti sono quelli che hanno il prezzo superiore a 100€.

5. Dato un elenco di prodotti con descrizione e prezzo, calcolare l'incremento del prezzo secondo una percentuale fornita da tastiera. Comunicare per ciascun prodotto la descrizione ed il prezzo incrementato.

6. Calcolare il consumo medio di carburante di un elenco di veicoli utilizzando come dati di input i valori dei Km percorsi e dei litri di carburante per ciascun veicolo.

7. Riscrivere il seguente frammento di codice usando l'istruzione for

a=0
while a<=10:
     print(a)
     a=a+1

8. Riscrivere il seguente frammento di codice utilizzando l'istruzione for

a=0
while a<=10:
     a=a+1
print(a)

9. costruire un programma che accetta da tastiera un elenco di N pezzi e li sommi. Alla fine fornisce il totale dei pezzi inseriti.

10. Dato un elenco di 20 studenti della prima classe della scuola superiore, con voto finale della scuola media, calcolare il valore medio dei voti.

11. Dati N studenti partecipanti ad una gara sportiva di velocità (nome studente, categoria, tempo) visualizzare il tempo dello studente vincitore (tempo minimo) tra gli studenti della categoria allievi.

12. Dati N modelli di cilomotori e motoclicli (nome del modello, cilindrata, prezzo), visualizzare il prezzo massimo tra i modelli di cilindrata superiore a 50 cc.

Pubblicato in Senza categoria | Lascia un commento

Esempio di CPM terza parte-->Total Float e cammino critico

Si parte adesso dal seguente diagramma di flusso:

Il calcolo dei TF è dato dalla differenza tra la LS -ES

TF=LS-ES

TF1=0

TF2=0

TF3=1

TF4=0

TF5=0

Le attività con TF=0 sono dette critiche.

Quindi il percorso critico risulta:

 

Pubblicato in Senza categoria | Lascia un commento

GPOI: esempio di CPM seconda parte-->date al più tardi

Si parte dal seguente CPM:

Si analizza l'attività 4 e non la 3 perché è l'unica che una sola "coda" mentre l'attività 3 ne ha 3 e si analizzerà solo quando si hanno le LS/LF delle altre "code".

Attività 4<--5 è FS

LF4=LS5-Vincolo-1=10+3-1=12

LS4=LF4-DUR4+1=12-2+1=11

Attività 2<--4 è FF

LF2=LF4-Vincolo-1=12-1-1=10

LS2=LF2-DUR2+1=10-7+1=4

Quindi si è in questa situazione:

Adesso posso cominciare ad analizzare il nodo 3.

Attività 3<--5 è SF

LS3=LF5-Vincolo-1=12-0-1=11

in generale

LS=LF-DUR+1

LF3=LS3+DUR3-1=11+5-1=14

Attività 3<--4 è FS

LF3=LS4-Vincolo-1=11-0-1=10

Attività 3<--2 è SS

LS3=LS2-Vincolo-1=4+1-1=4

in generale

LS=LF-DUR+1

LF3=LS3+DUR3-1=4+5-1=8

LF3=min(8;10;14)=8

per cui LS3=8-5+1=4

Si è in questa situazione

Devo calcolare adesso  LF del nodo 1

Attività 1<--2 è FS

LF1=LS2-Vincolo-1=4-0-1=3

Attività 1<--3 è FS

LF1=LF3-Vincolo-1=4+1-1=4

LF1=min(3;4)=3

LS1=LF1-DUR+1=3-3+1=1

Ho la seguente conclusione

 

Pubblicato in Senza categoria | Lascia un commento

GPOI: esempio di CPM prima parte-->date al più presto

Dato il seguente schema si parte fissando le date al più presto.

Si parte dall'attività1

EF1=1+3-1=3

Attività 2 o 3? L'attività 2 ha due frecce in entrata per cui analizzo l'attività 3.

1-->3 è FS

ES3=EF1+Vincolo+1=3-1+1=3

EF3=ES3+DUR3-1=3+5-1=7

Adesso analizzo l'attività 2

Attività 1->2 è FS

ES2=EF1+Vincolo+1=3+0+1=4

Attività 3->2 è SS

ES2=ES3+Vincolo+1=3-1+1=3

devo prendere il max tra le due date

ES2=max(4;3)=4

EF2=ES2+DUR2-1=4+7-1=10

Si è arrivati quindi alla seguente situazione:

Analizzo l'attività 4

Attività 2->4 è FF

EF4=EF2+Vincolo+1=10+1+1=12

in generale

EF4=ES4+DUR-1

ES4=EF4-DUR+1=12-2+1=11

Attività 3->2 è FS

ES4=EF3+Vincolo+1=7+0+1=8

devo prendere il max tra le due date

ES4=max(8;11)=11

EF4=ES4+DUR-1=11+2-1=12

Analizzo l'attività 5

Attività 4->5 è FS

ES5=EF4+Vincolo+1=12-3+1=10

Attività 3->5 è SF

EF5=ES3+Vincolo+1=3+0+1=4

ES5=EF5-DUR5+1=4-3+1=2

devo prendere il max tra le due date

ES5=max(2;10)=10

EF5=ES5+DUR-1=10+3-1=12

Si ha quindi il seguente schema finale.

Il progetto finisce dopo 12 giorni e si vuole che coincida anche con la data di fine al più tardi e la data di inizio al più tardi LS coincide con la ES.

 

Pubblicato in Senza categoria | Lascia un commento

Costruttore di una classe (parola chiave this, new)

ivan slavinsky

Esiste un metodo particolare che ha lo stesso nome della classe di partenza: questo è il costruttore della classe, ovvero il metodo che viene automaticamente invocato quando si istanzia un oggetto a partire dalla classe stessa. 

Esso serve per allocare un'opportuna area di memoria e dedicarla all'oggetto che si è creato o meglio si è istanziato.

Uno delle caratteristiche fondamentali del linguaggio Java è la rimozione automatica degli oggetti non più utilizzati liberando lo sviluppatore software da questa incombenza. Tutti gli oggetti istanziati, in un programma Java, sono individuati da un riferimento alla posizione che occupano nello Heap.

Heap: significa letteralmente cumulo, ossia è l'area di memoria nella quale sono allocati gli oggetti istanziati a partire dalle classi utilizzando la parola chiave new del lingiaggio; all'inizio dell'esecuzione di un programma lo heap viene allocato in base ad una dimensione predeterminata, ma nel corso dell'esecuzione la dimensione si adatta dinamicamente al numero ed alla dimensione deglo oggetti creati.

La JVM attiva periodicamente la garbage collector (letteralmente "raccoglitore di spazzatura") che è in grado di rilevare gli oggetti non più riferiti per recuperare l'area di memoria da essi occupata per renderla nuovamente disponibile.

Questo esempio mette in evidenza moltissime cose:

public class costruttore {
private int a;
private int b;

public costruttore(int a, int b) {
this.a=a;
this.b=b;
}

public int area() {
int c;
c=a*b;
return c;
}

public static void main(String[] args) {
costruttore x;
x= new costruttore(3,4);
System.out.println(x.area());
}

}

 

  • Ho definito due variabili private

private int a;
private int b;

significa che possono essere viste solo all'interno della classe costruttore e tutti i suoi metodi possono usarle. Per meglio capire la differenza; la variabile c, che è usata nel metodo area, esiste solo nel metodo area ma non può essere usata nel metodo main perché non è visibile.

  • ecco il costruttore

public costruttore(int a, int b) {
this.a=a;
this.b=b;
}

usa lo stesso nome della classe, gli argomenti del metodo costruttore devono essere dello stesso tipo delle variabili private precedentemente definite e pure con lo stesso nome

(provate a cambiare il tipo e mettere un nome diverso! Si vedrà che non si riesce a creare l'oggetto)

la parola this permette l'assegnazione alla variabile a del metodo costruttore del valore a della classe quando viene istanziata. In pratica si passa al metodo costruttore i valori di a e di b, come in una normale funzione e l'area di memoria acquisisce quel valore.

  • nella funzione main inizializzo con opportuni valori gli oggetti della classe costruttore.

x= new costruttore(3,4);

la parola chiave new chiama il metodo costruttore passandogli i valori 3 e 4.

Pubblicato in Senza categoria | Lascia un commento

Java: strutture di controllo del flusso (if-else, switch-case, while, do-while, for)

ivan slavinsky

Questo esempio contempla al suo interno tutte le strutture di controllo applicate al linguaggio JAVA.

import java.io.InputStreamReader;
import java.io.BufferedReader ;
import java.io.IOException;

public class strutture {

public static void main(String[] args) {
int a,n;
a=0;
n=0;
System.out.println("inserisci un numero intero");
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
try {
a = Integer.parseInt(input.readLine());
}
catch (Exception e) {
e.printStackTrace();
}
/**
* Struttura di controllo if
*/
if (a>0)
System.out.println("a positivo");
else
System.out.println("a negativo");

System.out.println("inserisci un numero intero");
BufferedReader input2 = new BufferedReader(new InputStreamReader(System.in));
try {
n = Integer.parseInt(input2.readLine());
}
catch (Exception e) {
e.printStackTrace();
}

/**
* struttura di controllo switch
*/
switch (n) {
case 1:
System.out.println("hai inserito 1");
break;
case 2:
System.out.println("hai inserito 2");
break;
default:
System.out.println("Non hai inserito nè 1 nè 2");
break;
}

/**
* struttura di controllo for
*/
int k=2;
System.out.println("Tabellina del 2 su una riga");
for(int j=1;j<11;j++)
System.out.print(k*j+" ");

System.out.println();

/**
* If nidificati
*/
System.out.println("Tavola pitagorica");

for(int j=1;j<11;j++)
{
for (int m=1;m<11;m++)
System.out.print(j*m+" ");
System.out.println();
}

int d,g;
d=5;
g=0;
/**
* Ripetizione precondizionale
*/
System.out.println("Ripetizione precondizionale");

System.out.println("inserisci un numero intero come password");
BufferedReader input15 = new BufferedReader(new InputStreamReader(System.in));
try {
g = Integer.parseInt(input15.readLine());
}
catch (Exception e) {
e.printStackTrace();
}

while(g!=d)
{
System.out.println("inserisci un numero intero come password");
BufferedReader input17 = new BufferedReader(new InputStreamReader(System.in));
try {
g = Integer.parseInt(input17.readLine());
}
catch (Exception e) {
e.printStackTrace();
}
}

/**
* Ripetizione condizionale
*/
System.out.println("Ripetizione condizionale");

do {
System.out.println("inserisci un numero intero come password");
BufferedReader input20 = new BufferedReader(new InputStreamReader(System.in));
try {
g = Integer.parseInt(input20.readLine());
}
catch (Exception e) {
e.printStackTrace();
}

} while (g!=d);

}

}

Pubblicato in Senza categoria | Lascia un commento

Progettazione orientata agli oggetti

ivan slavinsky

Si consideri un'automobile.

Essa è caratterizzata:

  • dal colore,
  • dalla cilindrata,
  • dalle caratteristiche degli interni,
  • dalla dimensione

Essa ha alcune funzioni:

  • si accende e si spegne
  • va più o meno veloce
  • trasposta una o più persone

Per definire il modello ho effettuato:

  1. un'astrazione sui dati mediante le sue caratteristiche (attributi)
  2. un'astrazione funzionale individuando le azioni che può compiere (operazioni)

Queste due astrazioni sono alla base dell'approccio orientato agli oggetti OO (Object Oriented), sia in relazione alla progettazione OOD  (Object Oriented Design) sia alla programmazione (OOP, Object Oriented Programming).

In pratica un dato è caratterizzato da:

  • insieme di valori
  • insieme di operazioni

Con l'espressione tipo di dato astratto ADT (Abstract Data Type) ci si riferisce a un tipo di dato completamente specificato, ma indipendentemente da una sua particolare implementazione.

Lo sviluppatore si occuperà dei contenuti informativi (dati o attributi) che per le operazioni specifiche associate al tipo di dato (metodi)

CLASSE

Il concetto di classe è alla base della progettazione e programmazione orientate agli oggetti.

Una classe rappresenta un modello formale per la descrizione di un certo tipo di oggetti definendone gli attributi, i metodi e le caratteristiche dell'interfaccia.

Le funzionalità sono chiamate METODI

Le componenti informative (dati) sono proprietà o ATTRIBUTI

Nella programmazione OO la creazione di un oggetto ha come conseguenza due azioni fondamentali:

  • allocare un'area di memoria per la memorizzazione dell'oggetto stesso;
  • inizializzare i valori degli attributi che costituiscono la componente informativa dell'oggetto--> COSTRUTTORE della classe.

UML

Per schematizzare una classe si usa la rappresentazione UML (Unified Modeling Language).

il simbolo + e - distingue il fatto che le componenti sono pubbliche o private.

  • nella prima sezione, a partire dall'alto, si inserisce il nome della classe;
  • la seconda sezione è relativa alla definizione degli attributi (proprietà)
  • la terza ed ultima sezione è relativa alla definizione delle operazioni  (metodi).

Per ogni metodo, oltre al suo livello di visibilità (pubblica o privata) è necessario definire:

  • i nomi e i tipi degli eventuali parametri e il loro ruolo (in/out/in-out)
  • il tipo dell'eventuale valore restituito

EREDITARIETA'

Si possono creare nuove classi a partire da classi già esistenti ereditandone le caratteristiche (attributi e/o metodi), aggiungendone di nuove o ridefinendone alcune. L'ereditarietà è finalizzata alla creazione di gerarchie di classi e grazie a essa si estende la possibilità di riutilizzare componenti comuni a più classi della stessa gerarchia.

Si definisce una classe generale o (classe base o superclasse) avente la funzione di definire le caratteristiche comuni a uno specifico insieme di oggetti. Le caratteristiche della classe generale potranno quindi essere ereditate o estese da altre classi (classi derivate o sottoclassi) che integreranno le caratteristiche della classe base con elementi specifici.

POLIMORFISMO

Utilizzando il polimorfismo è possibile ottenere comportamenti e risultati diversi invocando gli stessi metodi a carico di oggetti diversi.

Il polimorfismo è fondato sulla possibilità di ridefinire nelle classi derivate i comportamenti originali dei metodi ereditati dalla classe base; in questo modo è possibile ottenere metodi in grado di operare in modo appropriato su oggetti di diversa tipologia.

Ad esempio definisco una classe figura_geometrica ed all'interno di essa un metodo per il calcolo dell'area. Poi definisco tante figure geometriche con all'interno la classe calcolo area che si adatta alla singola figura geometrica.

METODI ASTRATTI

Il funzionamento dell'ereditarietà e del polimorfismo nei linguaggi di programmazione OO prevede esplicitamente la ridefinizione nelle sottoclassi derivate e i metodi definiti in una superclasse; in alcuni casi l'implementazione di un metodo in una classe base diviene puramente formale.

Ad esempio nel caso dell'area di una figura il metodo calcola area è vuota nel senso che la sua definizione viene poi demandata alle classi derivate.

I metodi con questa caratteristica prendono il nome di metodi astratti.

Classi che presentano uno o più metodi astratti sono definite classi astratte.

Pubblicato in Senza categoria | Lascia un commento

Python: indentazione

ivan slavinsky

Dopo aver introdotto l'IF e successivamente il FOR, per indentazione si intende la necessità di incolonnare in maniera corretta tutto ciò che è compreso nell'IF o nella ricorsone (For o while).

In pratica in Python tutto ciò che è posto sulla stessa colonna viene interpretato come all'interno di un unico blocco di comandi.

Ad esempio:

IF (a>b)
        print("prima riga")
         print ("seconda riga")
print("terza riga)

 

In questo brevissimo pezzo di codice, si nota come a video vengono scritte la prima e la seconda riga solo se a>b e comunque scrive anche l'ultima.

 

Questo pezzo di codice invece cosa fa?

IF (a>b)
        print("prima riga")
         print ("seconda riga")
         print("terza riga)

scrive le tre righe solo se a>b.

Pubblicato in Senza categoria | Lascia un commento

C++: Esercizi sulla ripetizione

Ivan Slavinsky

1. costruire un programma che accetta da tastiera dei numeri finchè viene inserito il valore 0; man mano li visualizza.

2. costruire un programma che accetta da tastiera dei caratteri e li conti. L'inserimento si interrompe quando il numero dei caratteri inseriti diventa 10;

3. dato un elenco di nomi con le rispettive città, conta quanti sono quelli di Milano;

4. dato un elenco di prodotti con i rispettivi prezzi, conta quanti sono quelli che hanno il prezzo superiore a 100€.

5. Dato un elenco di prodotti con descrizione e prezzo, calcolare l'incremento del prezzo secondo una percentuale fornita da tastiera. Comunicare per ciascun prodotto la descrizione ed il prezzo incrementato.

6. Calcolare il consumo medio di carburante di un elenco di veicoli utilizzando come dati di input i valori dei Km percorsi e dei litri di carburante per ciascun veicolo.

7. Riscrivere il seguente frammento di codice usando l'istruzione for

a=1;
while (a<=10) {
cout<<a<<endl;
a++;
}

8. Riscrivere il seguente frammento di codice utilizzando l'istruzione for

a=1
while(a<=10) a++
cout<<a<<endl;

9. costruire un programma che accetta da tastiera un elenco di N pezzi e li sommi. Alla fine fornisce il totale dei pezzi inseriti.

10. Dato un elenco di 20 studenti della prima classe della scuola superiore, con voto finale della scuola media, calcolare il valore medio dei voti.

11. Dati N studenti partecipanti ad una gara sportiva di velocità (nome studente, categoria, tempo) visualizzare il tempo dello studente vincitore (tempo minimo) tra gli studenti della categoria allievi.

12. Dati N modelli di cilomotori e motoclicli (nome del modello, cilindrata, prezzo), visualizzare il prezzo massimo tra i modelli di cilindrata superiore a 50 cc.

Pubblicato in Senza categoria | Lascia un commento

C++: ciclo do ...while

Ivan Slavinsky

La struttura di ripetizione si presenta con la forma do...while

do {
cout < "il mese: ";
cin>>mese;
} while (mese <1 || mese >12}

solo quando il mese digitato è compreso tra 1 e 12 l'esecuzione del programma procede con l'istruzione successiva while

RIPETIZIONE PRECONDIZIONALE

Nel lingiaggio C++ la ripetizione precondizionale, si presenta con l'istruzione while:

while(condizione) {
istruzioni;
}

mentre la condizione si mantiene vera, viene eseguita la sequenza di istruzioni (racchiuse tra le parentesi graffe)

Per esempio se si vuole far entrare da tastiera un elenco di numeri, segnando la fine dell'elenco con il numero 0, si può utilizzare il seguente pezzo di codice:

int numero;

cout << "inserire un numero (0=fine): ";

cin>>numero;

while(numero!=0)
{
..
}
cout<<"Inserire un numero (0=fine): ";
cin>> numero;
}

Pubblicato in Senza categoria | Lascia un commento