Lezione 2 - Introduzione a .Net e C#

2,083 views
1,902 views

Published on

Seconda lezione del corso di introduzione a C# ed all'ambiente .NET tenuto presso ENAIP FVG di Udine.
Introduzione al linguaggio ed ai costrutti fondamentali di c#.

Un ringraziamento particolare a Stefano Mizzaro e Paolo Coppola

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,083
On SlideShare
0
From Embeds
0
Number of Embeds
195
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Lezione 2 - Introduzione a .Net e C#

  1. 1. + Lezione 2 – Introduzione a .NET Dr. Paolo Casoto, Ph.D - 2012
  2. 2. + Credits I lucidi di questa lezione sono stati redatti dal Dr. Paolo Casoto nel 2012. Sono rilasciati con licenza Creative Commons Attribuzione, non commerciale e non opere derivate. Dr. Paolo Casoto, Ph.D - 2012
  3. 3. + Istruzioni di dichiarazione  Istruzioni utilizzate per dichiarare una nuova variabile.  Ed eventualmente inizializzarla, soprattutto nei casi particolari che abbiamo visto nella lezione precedente  E’ possibile dichiarare in una istruzione unica più variabile, seppure dello stesso tipo.  Le variabili sono visibili da tutte le istruzioni all’interno di un blocco o dei blocchi in esso annidati  Non posso dichiarare una variabile assegnandovi un identificativo già utilizzato nello stesso blocco  Ottengo un errore in fase di compilazione Dr. Paolo Casoto, Ph.D - 2012
  4. 4. + Istruzioni con espressioni  Le espressioni possono, a tutti gli effetti, essere utilizzate all’interno di una istruzione, quando modificano una variabile o eseguono, al loro interno, una chiamata:  Assegnamento a variabile  Invocazione di un metodo  Istanziazione di un nuovo oggetto  x = 1 + 2;  y = Math.Max (x, 5);  Console.WriteLine (y);  sb = new StringBuilder();  Quando invoco un metodo che non modifica lo stato del programma ma restituisce solo un valore, devo necessariamente memorizzare tale valore all’interno di una variabile  Altrimenti è del tutto inutile… Dr. Paolo Casoto, Ph.D - 2012
  5. 5. + Sequenza di istruzioni  Ogni istruzione “atomica” termina con un punto e virgola ;  Si possono raggruppare più istruzioni per farle diventare come un’unica istruzione con le parentesi graffe {}  Definisco un blocco di codice  Uno spazio = più spazi = tabulazione = ritorno carrello (a capo)  Incolonnare per leggibilità  Aggiungere spazi (2, 4) ad ogni {  Togliere spazi ad ogni }  { a fine riga  } su riga isolata
  6. 6. + Selezione (IF / IF-ELSE)  IF / IF - ELSE  Alternativa: fai o questo o quello  Se la condizione è vera esegue un insieme di istruzioni, altrimenti esegue un blocco di istruzioni alternative  Condizione: espressione booleana  E.g.: risultato di una espressione con operatori logici  I blocchi di istruzioni da eseguire possono essere di differente natura, fra tutte le possibili sequenza  Cicli, selezioni annidate, assegnamenti, et al. Dr. Paolo Casoto, Ph.D - 2012
  7. 7. + Esempio
  8. 8. + Forma generale if (C) I1  if ed else sono parole riservate else  C è una condizione (espressione booleana) I2  I1 e I2 sono istruzioni  Eventualmente composte (fra {}) if (C) {  Le graffe sono indispensabili solo per istruzioni I1; composte I2;  Ma metterle sempre è una buona abitudine. } else {  La parte else può anche non esserci I3; I4;  Incolonnamento e graffe }  Rientrare il ramo if e il ramo else  Incolonnare l’else sotto l’if corrispondente if (C) I1
  9. 9. + IF / IF - ELSE I1 I2 I3 false true C true C I2 I1 false I
  10. 10. + Esercizi sul costrutto IF-ELSE  Esercizio 1: Scrivere un programma che visualizza se un numero intero di input è positivo o negativo  Esercizio 2: Scrivere un programma che visualizza se un numero intero di input è positivo o negativo ed incrementa di uno il suo valore assoluto.  Esercizio 3: Scrivere un programma che visualizza se un numero intero di input è pari o dispari  Esercizio 4: Scrivere un programma che visualizza se un numero intero di input è positivo, negativo o uguale a 0
  11. 11. + Annidare le istruzioni IF / IF-ELSE  E’ possibile annidare una istruzione di selezione binaria all’interno del corpo di un’altra istruzione binaria più esterna.  Sia all’interno del ramo if sia all’interno del ramo else  Annidamenti dell’IF  Annidamenti dell’ELSE  In una sequenza di IF annidati l’ultimo else fa sempre riferimento all’ultimo IF  Se la regola non ci dà quello che vogliamo, usiamo le {}  Attenzione alla difficoltà di lettura che genera un uso scorretto o parziale delle parentesi
  12. 12. + Esempioif (x >= 0) if (x < 10) Console.WriteLine("positivo e minore di 10"); if (x >= 0) if (x < 10) Console.WriteLine("positivo e minore di 10"); else Console.WriteLine("positivo e maggiore= di 10");if (x >= 0) if (x < 10) Console.WriteLine("positivo e minore di 10"); else Console.WriteLine("negativo");
  13. 13. + Preferire gli annidamenti else  Non raggiungono il margine destro:  } else if tutto su una riga if (!C1) I3; if (C1) if (C2) { else if (!C2) if (C3) I2; I1; else if (C3) } else I1; I2; else I3;
  14. 14. + Selezione n-aria: SWITCH-CASE  Selezione fra più di due alternative, preferibile alle lunghe catene di IF / IF – THEN  Maggiore leggibilità, maggiore pulizia del codice  Non abusatene! Vi spiegherò il perché fra qualche lezione  Forma generale: switch (E) { E può rappresentare un case V1: I1; break; tipo intero, una stringa case V2: I2; break; o una ENUMERAZIONE ... case Vn: In; break; default: I; break; }
  15. 15. + EsempioCodice da eseguire perciascuna condizione,interrotto dalla istruzionedi salto break
  16. 16. + Esempio (in forma più sintetica rispetto al precedente) Codice da eseguire nel caso di più istruzioni, interrotto dalla istruzione di salto break
  17. 17. + SWITCH ed IF a confronto  Il costrutto SWITCH-CASE è di certo più generale perché consente una selezione n-aria, non solo binaria  Tuttavia, al tempo stesso, si rivela meno generale poiché legato ad una condizione di uguaglianza del tipo E==Vi  Al contrario nella condizione del costrutto IF posso avere qualsiasi tipo di espressione logica.  E.g.: x > 0  Il costrutto SWITCH-CASE è vincolato, inoltre, dallo specifico tipo assunto dalla variabile che funge da guardia  Non posso applicarlo ad un mio oggetto generico di tipo X
  18. 18. + Esempio
  19. 19. + Iterazione  Blocco contenente una sequenza di istruzioni che può essere ripetuta più volte  Una condizione booleana, detta GUARDIA, coordina la possibile ripetizione del blocco di istruzioni, in modalità differenti fra loro in accordo con la tipologia di ciclo.  La condizione booleana può essere anche composta, grazie a catene di operatori logici  (A && B || (C && !D))  La sequenza di istruzioni, se contenente più di una istruzione, deve essere racchiusa fra parentesi graffe.  In modo del tutto analogo al costrutto IF / IF-ELSE
  20. 20. + Iterazione e ciclo WHILE  4 tipologie di cicli:  WHILE  DO WHILE  FOR  FOR EACH  Il ciclo WHILE esegue il blocco di istruzioni al suo interno fino a quando la guardia dello stesso assume valore TRUE  Quando la guardia cambia il proprio valore, l’esecuzione del ciclo termina e si esce dal corpo del ciclo WHILE  Le istruzioni all’interno del corpo del ciclo while devono modificare la guardia o il ciclo opererebbe in eterno  Eccezione nel caso della programmazione distribuita. Dr. Paolo Casoto, Ph.D - 2012
  21. 21. + Esempio GUARDIA Corpo del ciclo
  22. 22. + IF e WHILE a confronto if (C) while (C) I I1 true true C C false false I I
  23. 23. + Esempio i = 1; while (i <= 10) {Cosa fanno questi due if (i % 2 == 0)frammenti di codice ? Console.WriteLine(i); i = i + 1; } i = 1; while (i <= 10) { if (i % 2 != 0) i = i + 1; Quale dei due secondo else { voi è preferibile ? Console.WriteLine(i); i = i + 1; } }
  24. 24. + Esempio Entrambi i frammenti utilizzando un ciclo WHILE per la stampa dei numeri PARI compresi fra 2 e 10… MA LO POSSIAMO MIGLIORARE ? i = 2; while (i <= 10) { Console.WriteLine(i); i = i + 2; } Più sintetico nella scrittura e con un numero inferiore di interazioni
  25. 25. + Realizziamo un piccolo Esempio programma per il calcolo della media di un insieme di voti while ("ci sono ancora voti") { "Leggi il prossimo voto"; "Aggiungi a media"; } I voti sono espressi con i "Stampa media / 10"; letterali O (ottimo = 10), B (buono = 8), S (sufficiente = 6) ed I (insufficiente = 4) Definiamo l’idea in PSEUDOCODICE Dr. Paolo Casoto, Ph.D - 2011
  26. 26. + La seconda versioneclass Voti { public static void Main (string[] args) { "azzera media"; "inizializza i"; while (i <= 10) { "Leggi voto"; Ancora PSEUDOCODICE if (voto == O) ma con maggior "Aggiungi 10 a media"; dettaglio else if (voto == B) "Aggiungi 8 a media"; else if (voto == S) "Aggiungi 6 a media"; else if (voto == I) "Aggiungi 4 a media"; "incrementa i"; } "Stampa media / 10"; }} Dr. Paolo Casoto, Ph.D - 2011
  27. 27. + La terza versione Dallo PSEUDOCODICE al codice vero e proprio …ed ora compiliamo il tutto Dr. Paolo Casoto, Ph.D - 2011
  28. 28. + Possiamo migliorare ulteriormente il nostro esempio ?if (voto == O) media = media + 10; switch (voto) {else if (voto == B) case O: media = media + 8; media = media + 10;else if (voto == S) break; media = media + 6; case B:else if (voto == I) media = media + 8; media = media + 4; break;i = i + 1; case S: media = media + 6; break; case I: media = media + 4; break; } Dr. Paolo Casoto, Ph.D - 2011
  29. 29. + Esercizi con il ciclo WHILE ed i costrutti di selezione  Scrivete un programma per la visualizzazione dei primi 10 numeri in ordine inverso (da 10 ad 1)  Scrivete un programma che visualizza tutti i numeri fra 1 e 100 che siano multipli di 2 e di 3 i = 1; i = 6; while (i <= 100) { while (i <= 100) { if (i % 2 == 0 && i % 3 == 0) Console.WriteLine(i); Console.WriteLine(i); i = i + 1; i = i + 6; } I multipli di 2 e 3 non } sono anche multipli di 6 ? Dr. Paolo Casoto, Ph.D - 2011
  30. 30. + Esercizio Cosa fa il seguente programma ?class CicloWhile { public static void main (String[] args) { int i = 1; while (i <= 10) Mi raccomando, fate Console.WriteLine(i); attenzione alle parentesi i = i + 1; !!! Console.WriteLine ("Fine stampa"); }} Dr. Paolo Casoto, Ph.D - 2011
  31. 31. + Il costrutto DO/WHILE  Costrutto del tutto analogo al WHILE, con una unica differenza nell’ordine di esecuzione e di valutazione della guardia C  Il controllo del valore di C viene effettuato alla fine dell’iterazione, anziché all’inizio  Con while (C) I, può verificarsi che I non sia eseguita neanche una volta  Con do I while (C), sicuramente I è eseguita almeno una volta  Utilizzo meno frequente del WHILE e, soprattutto, simulabile mediante il WHILE stesso Dr. Paolo Casoto, Ph.D - 2011
  32. 32. + WHILE e DO/WHILE a confronto do { while (C) I I } while (C); 1° Esecuzione “certa” di I true C I false I C true false Dr. Paolo Casoto, Ph.D - 2011
  33. 33. + Realizziamo un piccolo Esempio programma per la stampa dei primi 10 numeri con il ciclo DO WHILE i = 1; do { Console.WriteLine(i); i = i + 1; } while (i <= 10); i = 0; do { i = i + 1; Console.WriteLine(i); } while (i < 10); Oppure Dr. Paolo Casoto, Ph.D - 2011
  34. 34. + Simulare il DO/WHILE con il WHILE Devo garantire la prima esecuzione del blocco di istruzioni I, indipendentemente dalla valutazione della guardia C I; while (C) { I } do { I } while (C); boolean primo; primo = true; while (primo || C) { primo = false; I; } Dr. Paolo Casoto, Ph.D - 2011
  35. 35. + Simulare il WHILE con il DO / WHILE Devo verificare C prima di accedere al corpo del DO / WHILE. Per farlo posso utilizzare un costrutto di selezione binaria, cioè il costrutto IF if (C) while (C) { do { I I } } while (C); Più complesso rispetto al caso Dr. Paolo Casoto, Ph.D - 2011 precedente
  36. 36. + Esempio di utilizzo di DO / WHILE: controllo input do { c = Char.Parse(Console.ReadLine()); } while ((c != n) && (c != s)); Scenario tipico di utilizzo di DO- WHILE quando è necessario leggere da un flusso e determinare un eventuale carattere di conclusione Dr. Paolo Casoto, Ph.D - 2011
  37. 37. + Il ciclo FOR for( A ; B ; C ){ I } ClausolaClausola di iterattivainizializzazione Clausola condizionale Se la clausola condizionale è rispettata si procede all’esecuzione del blocco di istruzioni I Dr. Paolo Casoto, Ph.D - 2011
  38. 38. + Esempi for (i = 0; i <= 10; i = i + 1){ Console.WriteLine(i); } for (i = 0; i <= 10; i = i + 1) { Console.Write(i + " "); Console.WriteLine(i * i); } Dr. Paolo Casoto, Ph.D - 2011
  39. 39. + Significato del FOR  La semantica del ciclo FOR è quindi for(Init; C; Inc) I dove:  Nell’istruzione di inizializzazione Init viene inizializzato il valore di una variabile di controllo  Se la condizione di iterazione C è true, il corpo del ciclo (I) viene eseguito  Al termine dell’esecuzione di I viene eseguita l’istruzione di incremento Inc  La variabile di controllo del ciclo è modificata ad ogni iterazione dalla condizione di incremento  La modifica determinata dalla condizione di incremento DEVE essere “percepibile” anche a livello della condizione di controllo Dr. Paolo Casoto, Ph.D - 2011
  40. 40. + FOR e WHILE a confronto  Si può simulare un for con un while: I1;for (I1; C; I2) while (C) { I3; I3; I2; }  Prima la condizione C  L’incremento I2 alla fine Dr. Paolo Casoto, Ph.D - 2011
  41. 41. + Vantaggio del ciclo FOR  Gestione unitaria della variabile di controllo  Inizializzazione  Incremento  Controllo  Con un while o con un do/while invece devo “cercare” la variabile di controllo all’interno del corpo del ciclo  E anche la dichiarazione può essere fatta insieme all’inizializzazione. Dr. Paolo Casoto, Ph.D - 2011
  42. 42. + Dichiarazione delle variabili di controllo  Si può dichiarare la variabile di controllo del ciclo nell’intestazione del FOR: for (int i = 0; i <= 10; i = i + 2) Console.WriteLine(i);  È comodo, ma attenzione: i “esiste” solo nel corpo del FOR for (int i = 0; i <= 10; i = i + 2) Console.WriteLine(i); Console.WriteLine(i); Qui i non è visibile, otterremo un errore di compilazione Dr. Paolo Casoto, Ph.D - 2011
  43. 43. + Incrementi e decrementi…  L’incremento può non essere unitario… for (i = 0; i <= 10; i = i + 2) Console.WriteLine(i);  O non essere necessariamente un incremento for (i = 10; i >= 1; i = i - 1) Console.WriteLine(i); Dr. Paolo Casoto, Ph.D - 2011
  44. 44. + Errori tipici Quello che sembra nel corpo del for non lo è… for (int i = 0; i <= 10; i = i + 1); Console.WriteLine(i); for (int i = 10; i <= 1; i = i - 1) Console.WriteLine(i); Attenzione: se decremento devo invertire la condizione !!! Dr. Paolo Casoto, Ph.D - 2011
  45. 45. + Uso del ciclo FOR  Non modificate la variabile di controllo nel corpo del for  Meglio utilizzare, in tal caso, il WHILE  Fate attenzione ad un caso specifico, la rimozione di un elemento mentre state scorrendo una lista di oggetti.  E’ un tipico caso di errore per alterazione delle condizioni di controllo for ( ; ; ) while (true) I I Dr. Paolo Casoto, Ph.D - 2011
  46. 46. + Operatori di incremento e decremento  Le forme più tipiche dell’istruzione di incremento in un for sono i=i+1ei=i-1  2 “istruzioni” più comode  ++i (o --i): pre-incrementa (decrementa) i  i++ (o i--): post-incrementa (o decrementa) I  Ma NON sono istruzioni!  ++ e -- sono operatori, e quindi ++I sono espressioni !!! Dr. Paolo Casoto, Ph.D - 2011
  47. 47. + I cicli sono a tutti gli effetti istruzioni  Quindi possono essere usati come elementi all’interno di espressioni for (int i = 1; i <= 10; i++) Console.WriteLine(i); for (int i = 10; i >= 1; i--) Console.WriteLine(i);  Pre e post: quanto vale i? int a, i; int a, i;i = a; a = 5; a = 5; a=a+1;a=a+1; i = a++; i = ++a; i = a; Dr. Paolo Casoto, Ph.D - 2011
  48. 48. + Cicli annidati  Cicli all’interno di altri cicli for (i = 1; i <= 5; i++) { for (j = 1; j <= 10; j++){ Console.Write(+);} Console.WriteLine(); } for (i = 1; i <= 5; i++) { for (j = 1; j <= i; j++){ Console.Write(+);} Console.WriteLine(); } Annidare i cicli ci consente di lavorare come se si trattassero di scatole impilate Dr. Paolo Casoto, Ph.D - 2011
  49. 49. + Il costrutto FOR-EACH  Consente di iterare all’interno di una collezione di oggetti e valori, senza la necessità di operare a livello di indici o di condizioni  E.g.: devo scorrere il contenuto di una lista, eseguendo la medesima operazione su tutti gli elementi.  La lista, in .NET, può essere vista come un qualunque oggetto di tipo enumerabile  Stringhe, array, collezioni, o più in generale tutti gli oggetti che implementano l’interfaccia IEnumerable…  Ma cosa è una interfaccia ? Lo vedremo insieme nel corso delle prossime lezioni. Dr. Paolo Casoto, Ph.D - 2012
  50. 50. + Esempio foreach(String studente in studenti){ Console.WriteLine(studente); } Variabile con l’elemento corrente Oggetto Tipo degli oggetti IEnumerable della lista rispetto al quale iterare Dr. Paolo Casoto, Ph.D - 2012
  51. 51. + Quale istruzione utilizzare?  Selezione (if o switch)  Condizione e numero di alternative  Iterazione (while, do/while, for)  for: cicli “standard”  Variabile di controllo che assume valori equidistanti fino a una soglia  Numero di iterazioni noto a priori  while, do/while: almeno un’iterazione? Dr. Paolo Casoto, Ph.D - 2011
  52. 52. + Altri errori tipici (1/2)i = 1; Condizionewhile (i != 10) { irraggiungibile Console.WriteLine(i); i = i + 2;} i = 0; while (i <= 10) { Console.WriteLine(i); } Manca l’aggiornamento della guardia !!! Dr. Paolo Casoto, Ph.D - 2011
  53. 53. + Altri errori tipici (2/2) Chi stampa correttamente i numeri da 1 a 10 ?i = 1; i = 1;do { do { Console.WriteLine(i); i++; i++; Console.WriteLine (i);} while (i < 10); } while (i < 10);i = 0; i = 1;do { while (i <= 10) { i++; Console.WriteLine (i); Console.WriteLine (i); i++;} while (i < 10); } i = 0;for (i = 1;i <= 10;i++) while (i <= 9) { Console.WriteLine (i); i++; Console.WriteLine (i); } Dr. Paolo Casoto, Ph.D - 2011
  54. 54. + Diagrammi di flusso strutturati Dr. Paolo Casoto, Ph.D - 2011
  55. 55. + Le istruzioni di salto  L’istruzione di salto è composta da due elementi:  Etichetta (label): apposta alla riga di destinazione del salto  “goto” o “jump”  if e salto permettono di simulare tutti i cicli  Ma è vero anche il viceversa? • Sequenza • Sequenza • Selezione vs. • Selezione • Salto • Iterazione Dr. Paolo Casoto, Ph.D - 2011
  56. 56. + 3 domande… 1. Iterazione vs. salto: Si perde qualcosa senza il salto? 2. While, do/while e for: servono tutte e tre? 3. Perché introdurre i cicli quindi se il salto è sufficiente? Dr. Paolo Casoto, Ph.D - 2011
  57. 57. + … e 3 risposte 1. Con l’iterazione e senza il salto si riescono a rappresentare gli stessi algoritmi (Böhm e Jacopini 1966) 2. Con una sola fra while, do/while e for si simulano le altre 2 (Böhm e Jacopini 1966) 3. I salti vanno a ridurre la comprensibilità del codice portando a fenomeni come il cosiddetto spaghetti logic / spaghetti programming (Dijkstra 1968) Dr. Paolo Casoto, Ph.D - 2011
  58. 58. + break e continue  Interrompono un ciclo (il ciclo che li racchiude)  break: esce dal ciclo  continue: passa all’iterazione successiva  (“dopo la }” e “prima della }”)  Parole riservate  Istruzioni  Etichettati Dr. Paolo Casoto, Ph.D - 2011
  59. 59. + Esempifor (int i = 1; i <= 10; i++) { if (i == 5) Esco dal ciclo break; Console.WriteLine(i);}Console.WriteLine("Fuori dal ciclo");Passo all’iterazionesuccessiva del ciclo for (i = 1; i <= 10; i++) { if (i == 5) continue; Console.WriteLine (i); } Console.WriteLine("Fuori dal ciclo"); Dr. Paolo Casoto, Ph.D - 2011
  60. 60. + Esempio di break etichettato pippo: { for (int i = 1; i <= 10; i++) { for (int j = 1; j <= 10; j++) { Console.WriteLine (*); if ((i == 7) && (j == 9)) break pippo; } Console.WriteLine (); } } Dr. Paolo Casoto, Ph.D - 2011
  61. 61. + Un esercizio  Scrivere un programma per calcolare il massimo comun divisore di due numeri naturali  Facciamolo insieme…  Diciamo, per fissare le idee, che i due numeri sono memorizzati nelle variabili x e y Dr. Paolo Casoto, Ph.D - 2011
  62. 62. + Prima idea  Usiamo un ciclo che fa assumere alla variabile i tutti i valori da 1 fino al minimo dei due numeri x ey  Per ogni valore di i verifichiamo se i è un divisore sia di x sia di y  Se lo è, lo memorizziamo in una variabile mcd  L’ultimo divisore che troviamo (che memorizziamo in mcd) è il massimo Dr. Paolo Casoto, Ph.D - 2011
  63. 63. + Prima versione"Per i che va da 1 al minimo fra x e y""se i divide x e y allora metto i in mcd""Stampo mcd"for (i = 1; i <= "minimo fra x e y"; i++) { if ("i e un divisore di x e y") mcd = i;} IF contratto TROPPO"Stampo mcd" COMPLESSOfor (i = 1; i <= ((x < y)? x : y); i++) { if ((x % i == 0) && (y % i == 0)) mcd = i;}Console.WriteLine(mcd); Dr. Paolo Casoto, Ph.D - 2011
  64. 64. + Seconda idea  Invece di incrementare i e “aspettare” di trovare l’ultimo divisore… facciamo “al contrario”?  Il ciclo che fa assumere a i tutti i valori dal minimo di x e y fino a 1  Per ogni valore di i verifichiamo se i è un divisore sia di x sia di y  Il primo divisore che troviamo è il massimo Dr. Paolo Casoto, Ph.D - 2011
  65. 65. + Seconda versionefor (i = ((x < y)? x : y); i >= 1; i--) if ((x % i == 0) && (y % i == 0)) { mcd = i; break; }Console.WriteLine(mcd);mcd = 1;i = ((x < y)? x : y);while (i >= 1 && mcd == 1) { if ((x % i == 0) && (y % i == 0)) mcd = i; i--;}Console.WriteLine(mcd); Dr. Paolo Casoto, Ph.D - 2011
  66. 66. + Confronto  Quale delle due idee che abbiamo implementato è la migliore ?  La seconda è più “veloce”  Nella prima i deve assumere sempre tutti i min(x,y) valori  Nella seconda assume tutti i min(x,y) valori solo se x e y sono primi fra loro  Meno iterazioni del ciclo = più veloce  Meno iterazioni = meno valori assunti da i Dr. Paolo Casoto, Ph.D - 2011
  67. 67. + Terza idea  Cisono altri valori di i che possiamo escludere?  Ci sono valori di i che non sono senz’altro un MCD?  Datoun numero k, quanto grande è, al massimo, il suo massimo divisore?  Se escludiamo k stesso il suo massimo divisore è k/2 Dr. Paolo Casoto, Ph.D - 2011
  68. 68. + Terza versione Riduce significativamente il numero di iterazioni min = ((x < y)? x : y); if ((x % min == 0) && (y % min == 0)) mcd = min; else for (i = min/2; i >= 1; i--) if ((x % i == 0) && (y % i == 0)) { mcd = i; break; Esco dal ciclo } Console.WriteLine(mcd); Dr. Paolo Casoto, Ph.D - 2011
  69. 69. + Quarta idea  Idea completamente diversa, basata su una proprietà algebrica (Euclide)  Se x = y -> mcd(x,y) = x = y  Se x > y -> mcd(x,y) = mcd(x – y, y)  Possiamo sfruttarla per decrementare x e y fino a quando sono uguali Dr. Paolo Casoto, Ph.D - 2011
  70. 70. + Quarta versione  Più elegante  Più sintetico  Più efficiente while (x != y) if (x > y) x = x - y; else y = y - x; Console.WriteLine(x); Dr. Paolo Casoto, Ph.D - 2011
  71. 71. + Quinta versione  Fare più volte x = x - y è equivalente a fare un’unica volta x =x%y  Quando l’ultimo resto è zero, un numero è multiplo dell’altro, e il risultato è nell’altra variabile  Esempi di while ≠ for… while (x != 0 && y != 0) if (x > y) x = x % y; else y = y % x; Console.WriteLine(x==0?y:x); Dr. Paolo Casoto, Ph.D - 2011
  72. 72. + Gli array x Variabile: 12.34  Scatola  Con nome, valore e tipo a Array:  Sequenza di scatole, ognuna delle quali 12.34  “Ha un nome” 3.14  Contiene un valore  È di un tipo 0.43 3E-12 0.98 Dr. Paolo Casoto, Ph.D - 2011 0.01
  73. 73. + temperature Esempio 0 20.5 1 20.0  Programma che deve memorizzare 10 2 19.8 valori di temperatura  Uso 10 variabili double temperatura1, 3 19.4 temperatura2, …, temperatura10? 4 20.4  Uso un array temperature di 10 posizioni 5 21.6 di double  Posso comunque accedere ad ogni singola 6 22.0 “scatola” tramite la posizione (la prima, la 7 21.9 seconda, …) 8 21.0 9 21.1 Dr. Paolo Casoto, Ph.D - 2011
  74. 74. + temperature Tradotto in C# 0 20.5double[] temperature;temperature = new double[10]; 1 20.0temperature[0] = 20.5;temperature[1] = 20.0; 2 19.8temperature[2] = 19.8;temperature[3] = 19.4; 3 19.4temperature[4] = 20.4; 4 20.4temperature[5] = 21.6;... 5 21.6Console.Write(temperature[1]);Console.Write(temperature[5]); 6 22.0...temperature[5] = temperature[4]; 7 21.9temperature[5] = temperature[5]+1;temperature[5+1] = temperature[5]; 8 21.0... 9 21.1 Dr. Paolo Casoto, Ph.D - 2011
  75. 75. + Sintassi  Dichiarazione  tipo[] nome;  Es.: double[] temperature;  Allocazione  nome = new tipo[lunghezza];  Es.: temperature = new double[10];  Uso  nome[posizione]  Es.: temperature[5+1] = temperature[5]; Dr. Paolo Casoto, Ph.D - 2011
  76. 76. + Vantaggio degli array  Gestione uniforme  E.g.: azzerare tutte le temperaturetemperature[0] = 0;temperature[1] = 0;temperature[2] = 0;...temperature[9] = 0; for (int i = 0; i < 10; i++) temperature[i] = 0; Dr. Paolo Casoto, Ph.D - 2011
  77. 77. + Gestione uniforme  Calcolare la media delle temperature double[] temperature; temperature = new double[10]; double media = 0; ... for (int i = 0; i < 10; i++) { media = media + temperature[i]; } Console.WriteLine(media/10);  Fatelo con le 10 variabili…  … e poi fatelo per 100 temperature… Dr. Paolo Casoto, Ph.D - 2011
  78. 78. + Dichiarazione  Simile alle dichiarazioni di variabili  Si usano le []  dopo il tipo (meglio! “Array di tipo…”)  o dopo il nome int[] a1; int a1[], i; int i; char a2[], a3[], c; char[] a2, a3; double a4[]; char c; double[] a4; Dr. Paolo Casoto, Ph.D - 2011
  79. 79. + Allocazione: la parola riservata new  Non c’era per le variabili, serve per allocare la memoria necessaria per gli elementi  Si usano a1 = new int[10];  new a2 = new char[12];  [lunghezza] a3 = new char[5]; (numero di elementi) a4 = new double[7];  Dichiarazione e allocazione si possono fare insieme int a1[] = new int[10], i; char a2[] = new char[12], a3[] = new char[5], c; double[] a4 = new double[7]; Dr. Paolo Casoto, Ph.D - 2011
  80. 80. + Inizializzazione  È possibile assegnare valori iniziali a un array int[] giorniMese = {31,28,31,30,31,30,31,31,30,31,30,31}; int[] giorniMese; giorniMese={31,28,31,30,31,30,31,31,30,31,30,31}; int[] giorniMese; giorniMese = new int[] {31,28,31,30,31,30,31,31,30,31,30,31}; Dr. Paolo Casoto, Ph.D - 2011
  81. 81. + Utilizzo degli array ed accesso alle componenti  Ogni posizione opera esattamente come una qualsiasi variabile  (si può anche lavorare su tutto un array)  Si usano le [ ] e un indice (un’espressione algebrica con risultato in numeri interi)  L’indice può essere un’espressione, come nel caso del ciclo FOR  L’indice del primo elemento è 0 (zero)!!! a1[4] = 5; if (a1[4] > i) { a2[10] = p; a4[0] = a4[1]; } Dr. Paolo Casoto, Ph.D - 2011
  82. 82. + La proprietà Length  C’è modo di sapere la lunghezza di un array  Il numero di locazioni al suo interno  nomearray.Length  Senza parentesi, è una proprietà  Vedremo nelle prossime lezioni cosa si intende in C# con il concetto di proprietà char[] a = new char[12]; char[] b = {a, s, d}; Console.WriteLine(a.Length); Console.WriteLine(b.Length); Console.WriteLine(b[b.Length – 2]); Console.WriteLine(b[a.Length/6]); Dr. Paolo Casoto, Ph.D - 2011
  83. 83. + Osservazioni  Ilprimo elemento di un array ha indice ZERO  L’ultimo elemento di un array a ha indice a.length – 1  Nei cicli for che “spazzolano” un array a,  i < a.length invece di i <= a.length - 1 Dr. Paolo Casoto, Ph.D - 2011
  84. 84. + Utilizzare le costanti per definire le le dimensioni degli array int[] a = new int[10];  Modifiche più semplici nel secondo caso const int N = 10; int[] a = new int[N];  (es.: da 10 a 1000…)  Ma possiamo comunque eseguire cicli senza paura grazie alla proprietà Lengthfor (int i = 0; i < N; i++)... for (int i = 0; i < a.Length; i++) ... Dr. Paolo Casoto, Ph.D - 2011
  85. 85. + Esercizi Dr. Paolo Casoto, Ph.D - 2012
  86. 86. + Esercizi 1. Azzerare un array di int , diciamo di nome a (ossia, assegnare zero a tutti gli elementi di a) 2. Assegnare 0, 1, 2, … agli elementi di a 3. Incrementare di 1 ogni elemento dell’array a 4. Assegnare 1 agli elementi di a di indice dispari e 2 a quelli di indice pari Dr. Paolo Casoto, Ph.D - 2011
  87. 87. + Esercizi  Azzerare un array di int for (int i = 0; i < a.length; i++) a[i] = 0;  Assegnare 0, 1, 2, … agli elementi di a for (int i = 0; i < a.length; i++) a[i] = i;  Incrementare di 1 ogni elemento dell’array a for (int i = 0; i < a.length; i++) a[i] = a[i] + 1; // o a[i]++, o ++a[i] Dr. Paolo Casoto, Ph.D - 2011
  88. 88. + Esercizi  Assegnare 1 agli elementi di a di indice dispari e 2 a quelli di indice pari for (int i = 0; i < a.length; i++) if (i % 2 != 0) a[i] = 1; else a[i] = 2; for (int i = 0; i < a.length; i++) a[i] = (i % 2 != 0) ? 1 : 2; for (int i = 0; i < a.length; i++) a[i] = 2 - (i % 2); Dr. Paolo Casoto, Ph.D - 2011
  89. 89. + Domande ??? Grazie a tutti per l’attenzione Dr. Paolo Casoto, Ph.D - 2012

×