+    Lezione 3 – Introduzione a    .NET                  Dr. Paolo Casoto, Ph.D - 2012
+    Credits    I lucidi di questa lezione sono stati redatti dal Dr. Paolo Casoto    nel 2012. Sono rilasciati con licenz...
+    Array bidimensionali (matrici)        Tabelle        Esempio:            Memorizzare tutte le temperature dell’ann...
+ Array bidimensionali (matrici)                  0    1   2   …   31    0          0                              1      ...
+    Array multidimensionali in C#       In C# vi sono due tipologie di utilizzo degli array per la        rappresentazio...
+    Array rettangolari: sintassi       Inizializzazione fra parentesi quadre, come per gli array        monodimensionali...
+    Array jagged: sintassi     Inizializzazionefra parentesi quadre, come per      gli array monodimensionali, con l’uti...
+    Array jagged: sintassi       Attenzione: in C# se utilizziamo i Jagged Array non è si        definisce mai, in fase ...
+    Array bidimensionali come array di    array      Array bidimensionale =        Array i cui elementi sono a loro vol...
+    Array bidimensionali = array di array
+    Array multidimensionali jagged        Array di array di array di …        Si usa una coppia di [] per ogni dimensio...
+    Lavorare su matrici      Spesso (ma non sempre!) si usano cicli for       annidati (“spazzolano” tutta la matrice)  ...
+    Esempi con matrici (1/3)       Esempio: azzerare la        riga k-esima di una        matrice                k      ...
+    Esempi con matrici (2/3)                                          k        Azzerare la         colonna k-esimafor (i...
+    Esempi con matrici (3/3)        Azzerare la diagonalefor (int i = 0; i < m.length; i++)  for (int j = 0; j < m[i].le...
+    Esempi classici con array      Inversione di un array      Ricerca lineare      Ordinamento per selezione      Ri...
+    Inversione di un array        Scambiare di posto gli elementi di un array unidimensionale         (vettore):        ...
+    L’algoritmo (1/2)        Prima versione            Considero il primo e l’ultimo e li scambio            Considero...
+    L’algoritmo (2/2)        Ancora meglio            Scambio a[0] con a[a.Length-1-0]            Scambio a[1] con a[a...
+    Come scambiare 2 variabili (1/2)        3 bicchieri, etichettati con A, B e C        In A c’è acqua, in B c’è vino,...
+    Come scambiare 2 variabili (2/2)        3 variabili a, b e c        Voglio “scambiare” a e b (mettere il valore di ...
+    Come scambiare 2 elementi di un    array        Voglio “scambiare” a[i] e a[j]. Come faccio?            temp = a[i]...
+    Il programma finale/* Programma per invertire un array */class InversioneArray {  public static void Main (string[] a...
+    Ricerca lineare                                           a                                                          ...
+    Ricerca linearefor(i=0; i<a.Length; i++)if(a[i] == x){"trovato"break;}"A seconda se trovato o meno, stampo..."boolean...
+    Ordinamento       Ordinare un array (o altro…)           Problema classico           Molto frequente       Vari a...
+    Ordinamento per selezione (1/3)        Prendo (“Seleziono”) l’elemento minimo e lo metto in prima         posizione ...
+    Ordinamento per selezione (2/3)        Alla fine della prima passata, il primo elemento è ordinato        Ripeto: p...
+    Ordinamento per selezione (3/3)        Ora il pezzo di array formato dai primi due elementi è ordinato        Prend...
+    Ordinamento per selezione       Ho quindi bisogno di 2 indici           i per indicare le “passate”           j pe...
+     Il codice/* Ordinamento per selezione */class OrdinamentoSelezione {  public static void Main (string[] args) {    c...
+    Ricerca binaria                                      a                                                     0         ...
+    Procedimento       Accedo all’elemento mediano (quello in mezzo), chiamiamolo        a[m]       3 possibilità:     ...
+ Schema del procedimento                            m   a[m]                                           p                 ...
+    Quindi    2  indici p e q che delimitano la parte di array in      cui cercare     All’inizio, p = 0 e q = a.Length...
+ /* Ricerca binaria. Assume l’array ordinato*/  class RicercaBinaria {    public static void Main (string[] args) {      ...
+    Esempi con matrici        Somma di due matrici m1 e m2 in una terza matrice m (stesse         dimensioni)2 1 …      ...
+    Prodotto di matrici        C[i][j] =   k A[i][k]*B[k][j]
+    Il codice...for (int i = 0; i < N; i++)  for (int j = 0; j < N; j++)    C[i][j] = 0;  for (int i = 0; i < N; i++)    ...
+    Metodo       Cos’è un metodo ?           A livello informale possiamo definirlo come una “parte di            progr...
+    Esempio       Definizione e uso       Parametri           formali (prezzo, sconto) e attuali (y, 10.5)static doubl...
+    Esempio completo (1/3)    class EsempioDiMetodo {        static double Sconto(double p, double s) {          return (...
+    Esempio completo (2/3)    class EsempioDiMetodo {        static double Sconto(double p, double s) {          return (...
+    Esempio completo (3/3)    class EsempioDiMetodo {      static double ApplicaSconto(double p, double s) {        retur...
+    Due tipi di metodi        Funzioni            Restituiscono un risultato            E.g.: Sconto        Procedure...
+    Definizione metodo        Al di fuori del Main (e dentro il class)        Intestazione (prima riga)            sta...
+    Uso del metodo    1. Decidere i parametri attuali       Gli argomenti    2. Invocarlo con il nome       E.g.: class...
+    Struttura programma C#      class ... {        static <tipo> <id> (<parametri>) {          ...        }          stat...
+    Esecuzione di programma con    metodi       L’esecuzione comincia dal main         Anche il Main è un metodo! (part...
+    Un altro esempio    class EsempioDiMetodo2 {        static char ConvertiInMaiuscolo(char c) {          if (c < a || c...
+    Parametri        Formali          Usati alla definizione per definire cosa fa un metodo          F(x) = 2x2 + 4x +...
+    Associazione fra parametri attuali    e parametri formali        All’invocazione il valore del parametro attuale vie...
+    Cosa succede?    class Parametri {        static void Inc(int x) {          x++;        }        public static void M...
+    Perché       Passaggio parametri per valore       Il valore del parametro attuale viene copiato nel parametro      ...
+    Metodo (…) per incremento    class Parametri {        static int Inc(int x) {          return (x + 1);        }      ...
+    Forziamo il passaggio per    riferimento anche per i tipi valore        Dr. Paolo Casoto, Ph.D - 2012
+    Forziamo il passaggio per    riferimento anche per i tipi valore       C# consente di forzare il passaggio dei tipi ...
+    Il modificatore params       Utilizzando il modificatore params sull’ultimo parametro        di un metodo, possiamo ...
+    Perché i metodi sono utili        Sintesi            Stesse operazioni da ripetere in più punti del programma      ...
+    Esempio       Scrivere un metodo per stampare una matrice bidimensionale            class StampaMatrice {           ...
+    Esercizi    Dr. Paolo Casoto, Ph.D - 2012
+    Esercizio 1        Scrivere un metodo che dice se un numero n è primo o no        Ossia, che riceve come parametro ...
+    Idea       Guardo tutti i numeri minori di n (ciclo su i)           Escluso l’1           Basta arrivare a n/2    ...
+    Primo.csclass Primo{  public static void Main (String[] args){    Console.WriteLine("Inserisci un numero intero --> "...
+    Prova (Traccia) di esecuzione        Simulare il comportamento dell’interprete        Molto utile quando un program...
+    Esercizio 2        Quale valore viene restituito se si invoca Abc(4)?                    static int Abc(int x) {    ...
+    Esercizio 3        Quale valore viene restituito se si invoca Abc(8)?         static int Abc(int x) {           int ...
+    Esercizio 4       Quattro amici (Pino, Rino, Dino e Tino) stanno giocando a un        gioco da tavola con un dado a ...
+    Esercizio 5    class PinoRinoDinoTino2 {      public static void Main(String[] args) {        int dado;        dado =...
+    Esercizio 5       Attenzione! Il secondo assegnamento non deve essere un        letterale, ma unespressione e le due...
+    Esercizio 6       Scrivete il programma SommeAlleElementari. Quando si        fanno le somme in colonna si scrive un...
+    Esercizio 7       Modificate il programma precedente utilizzando        loperatore condizionale per fare in modo che...
+    Domande ???    Grazie a tutti per    l’attenzione                    Dr. Paolo Casoto, Ph.D - 2012
Upcoming SlideShare
Loading in …5
×

Lezione 3 - Introduzione a .net

1,222 views
1,094 views

Published on

Terza 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#. Array, matrici, algoritmi che utilizzano matrici ed array, metodi e parametri.

Un ringraziamento particolare a Stefano Mizzaro e Paolo Coppola

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

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

No notes for slide

Lezione 3 - Introduzione a .net

  1. 1. + Lezione 3 – 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. + Array bidimensionali (matrici)  Tabelle  Esempio:  Memorizzare tutte le temperature dell’anno  Accedere poi alla temperatura del 20 ottobre  Soluzione scomoda:  Array t di 366 posizioni (non usiamo t[0])  Contare: 31+28+31+30+31+30+31+31+30+20=293  Soluzione comoda:  Tabella (matrice) 12x31, accedo con t[10, 20]
  4. 4. + Array bidimensionali (matrici) 0 1 2 … 31 0 0 1 1 2 2 … … … 12 …  t[293] ?? …  t[10, 20] …  t[OTTOBRE, 20] … … 365
  5. 5. + Array multidimensionali in C#  In C# vi sono due tipologie di utilizzo degli array per la rappresentazione di strutture dati multidimensionali  Array rettangolari  Vere e proprie matrici, dichiarate utilizzando, all’interno del costrutto [] le virgole per determinare il numero di dimensioni del blocco di dati  Sono una peculiarità di C#  Array Jagged  Array di array: un elemento della matrice può essere visto come un elemento all’interno dell’array delle righe della matrice  Concetto tipico di array in Java Dr. Paolo Casoto, Ph.D - 2012
  6. 6. + Array rettangolari: sintassi  Inizializzazione fra parentesi quadre, come per gli array monodimensionali, ma con l’utilizzo delle virgole per ciascuna dimensione.  int[,] matrice = new int[12,2];  Il primo è il numero di righe, il secondo il numero di colonne  Per accedere ai valori della matrice utilizzo il doppio indice  t[10, 20]  Il primo è indice di riga, il secondo di colonna  Per ottenere la lunghezza di ciascuna dimensione utilizzo il metodo array.GetLength(i) dove i è l’indice della dimensione
  7. 7. + Array jagged: sintassi  Inizializzazionefra parentesi quadre, come per gli array monodimensionali, con l’utilizzo delle parentesi per ciascuna dimensione.  int[][] matrice = new int[2][];  Ilprimo è il numero di righe, il secondo il numero di colonne  Peraccedere ai valori della matrice utilizzo il doppio indice  t[10][ 20]  Il primo è indice di riga, il secondo di colonna
  8. 8. + Array jagged: sintassi  Attenzione: in C# se utilizziamo i Jagged Array non è si definisce mai, in fase di inizializzazione, la dimensione dell’array interno  Gli array interni sono inizializzati a null e devono essere a loro volta inizializzati  Possono differire per lunghezza gli uni dagli altri  Matrice potenzialmente non rettangolare. int[][] matrice = new int[][] { new int[] {0,1,2}, new int[] {3,4,5}, new int[] {6,7,8} Dr. Paolo Casoto, Ph.D - 2012 };
  9. 9. + Array bidimensionali come array di array  Array bidimensionale =  Array i cui elementi sono a loro volta degli array  Per comodità lo si rappresenta come una matrice/tabella
  10. 10. + Array bidimensionali = array di array
  11. 11. + Array multidimensionali jagged  Array di array di array di …  Si usa una coppia di [] per ogni dimensione  Es.:  double[][][] a;  a = new double[10][100][1000];  …a[0][0][0] … a[9][99][999] …  Utilità  Temperature di tutte le ore  double[][][] t; t = new double[13][32][24]; ... t[DICEMBRE][25][0] ...
  12. 12. + Lavorare su matrici  Spesso (ma non sempre!) si usano cicli for annidati (“spazzolano” tutta la matrice)  .Length di una matrice dà il numero di righe  .Length su un elemento dà il numero di colonne (un elemento è un array!)  Esempio: assegnare 1 a tutti gli elementi di una matrice for (int i = 0; i < m.Length; i++) for (int j = 0; j < m[i].Length; j++) m[i][j] = 1;
  13. 13. + Esempi con matrici (1/3)  Esempio: azzerare la riga k-esima di una matrice k bidimensionale mfor (int i = 0; i < m.Length; i++) for (int j = 0; j < m[i].Length; j++) if (i == k) m[i][j] = 0;for (int j = 0; j < m[k].Length; j++) m[k][j] = 0;
  14. 14. + Esempi con matrici (2/3) k  Azzerare la colonna k-esimafor (int i = 0; i < m.Length; i++) for (int j = 0; j < m[i].length; j++) if (j == k) m[i][j] = 0;for (int i = 0; i < m.Length; i++) m[i][k] = 0;
  15. 15. + Esempi con matrici (3/3)  Azzerare la diagonalefor (int i = 0; i < m.length; i++) for (int j = 0; j < m[i].length; j++) if (i == j) m[i][j] = 0;for (int i = 0; i < m.length; i++) m[i][i] = 0;
  16. 16. + Esempi classici con array  Inversione di un array  Ricerca lineare  Ordinamento per selezione  Ricerca binaria  Somma di matrici  Prodotto di matrici
  17. 17. + Inversione di un array  Scambiare di posto gli elementi di un array unidimensionale (vettore): 0  Il primo e l’ultimo 1  Il secondo e il penultimo  Andiamo avanti fino a fermarci a metà 2 … a.Length-2 a.Length-1
  18. 18. + L’algoritmo (1/2)  Prima versione  Considero il primo e l’ultimo e li scambio  Considero il secondo e il penultimo e li scambio  …  Fino a metà array  Meglio  Scambio a[0] con a[a.Length - 1]  Scambio a[1] con a[a.Length - 2]  Scambio a[2] con a[a.Length - 3]  …  Fino a metà array
  19. 19. + L’algoritmo (2/2)  Ancora meglio  Scambio a[0] con a[a.Length-1-0]  Scambio a[1] con a[a.Length–1-1]  Scambio a[2] con a[a.Length–1-2]  … Fino a metà array  Ancora meglioPer i da 0 a (a.Length – 1) / 2 Scambio a[i] con a[a.Length-1-i]
  20. 20. + Come scambiare 2 variabili (1/2)  3 bicchieri, etichettati con A, B e C  In A c’è acqua, in B c’è vino, C è vuoto  Voglio “scambiare” A e B (mettere il vino in A e l’acqua in B). Come faccio?  Verso A in C  Verso B in A  Verso C in B 2. A B 1. 3. C
  21. 21. + Come scambiare 2 variabili (2/2)  3 variabili a, b e c  Voglio “scambiare” a e b (mettere il valore di a in b e viceversa). Come faccio?  c = a; // "Verso" A in C  a = b; // "Verso" B in A  b = c; // "Verso" C in B 2. a b 1. c 3.
  22. 22. + Come scambiare 2 elementi di un array  Voglio “scambiare” a[i] e a[j]. Come faccio?  temp = a[i];  a[i] = a[j];  a[j] = temp; 2. a[i] a[j] 1. 3. temp
  23. 23. + Il programma finale/* Programma per invertire un array */class InversioneArray { public static void Main (string[] args) { int[] a = new array[10]; int temp, i; for (i = 0; i < a.Length; i++) a[i] = Int32.Parse(Console.ReadLine()); for (i = 0; i <= (a.Length - 1) / 2; i++) { temp = a[i]; a[i] = a[a.Length - 1 - i]; a[a.Length - 1 - i] = temp; } for (i = 0; i < a.Length; i++) Console.WriteLine(a[i]); }}
  24. 24. + Ricerca lineare a 0 1  Dati  Un array a di int … x  Un intero x i  Dire se x compare in a, e in che posizione  Procedimento  Scorro l’array dall’inizio alla fine  Fermandomi se trovo un elemento uguale a x
  25. 25. + Ricerca linearefor(i=0; i<a.Length; i++)if(a[i] == x){"trovato"break;}"A seconda se trovato o meno, stampo..."boolean trovato = false;for (i = 0; i < a.Length; i++)if (a[i] == x) { trovato = true; break;}}if (trovato){ Console.WriteLine(i);}else{ Console.WriteLine("Non trovato");}
  26. 26. + Ordinamento  Ordinare un array (o altro…)  Problema classico  Molto frequente  Vari algoritmi  Vediamone uno: ordinamento per selezione (Selection Sort)
  27. 27. + Ordinamento per selezione (1/3)  Prendo (“Seleziono”) l’elemento minimo e lo metto in prima posizione  In realtà, li scambio…  In realtà, spazzolo tutto l’array, scambiando gli elementi (a[0] e a[i]) quando ne trovo “più piccoli” (a[i] < a[0]) 0 1 2 … N-1a 0 1 2 … N-1 a
  28. 28. + Ordinamento per selezione (2/3)  Alla fine della prima passata, il primo elemento è ordinato  Ripeto: prendo (“Seleziono”) l’elemento minimo della parte restante e lo metto in 2a posizione 0 1 2 … N-1a 0 1 2 … N-1 a
  29. 29. + Ordinamento per selezione (3/3)  Ora il pezzo di array formato dai primi due elementi è ordinato  Prendo (“Seleziono”) l’elemento minimo della parte restante e lo metto in 3a posizione  … e così via, fino a fine array 0 1 2 … N-1a 0 1 2 … N-1 a
  30. 30. + Ordinamento per selezione  Ho quindi bisogno di 2 indici  i per indicare le “passate”  j per “spazzolare” l’array ad ogni passata  i sta fermo mentre j varia -> cicli annidati 0 1 2 3 4 … N-1 a j i
  31. 31. + Il codice/* Ordinamento per selezione */class OrdinamentoSelezione { public static void Main (string[] args) { char temp; char[] a = new char[10]; for (int i = 0; i < a.Length; i++) a[i] = Char.Parse(Console.ReadLine()); for (int i = 0; i < a.Length - 1; i++) for (int j = i; j < a.Length; j++) if (a[i] > a[j]) { temp = a[i]; a[i] = a[j]; a[j] = temp; } for (int i = 0; i < a.Length; i++) Console.WriteLine(a[i]); }}
  32. 32. + Ricerca binaria a 0 1  Dati  Un array ordinato a di int … x  Un intero x i  Dire se x compare in a, e in che posizione  L’avere un array ordinato ci consente un algoritmo “migliore” (più efficiente) della ricerca lineare
  33. 33. + Procedimento  Accedo all’elemento mediano (quello in mezzo), chiamiamolo a[m]  3 possibilità:  a[m] == x ho trovato  a[m] < x posso scartare la prima metà  a[m] > x posso scartare la seconda metà  In un colpo solo, elimino metà array!  Poi ripeto il procedimento sulla metà, poi sulla metà della metà, ecc.
  34. 34. + Schema del procedimento m a[m] p m a[m] p q p qx m a[m] q p q
  35. 35. + Quindi 2 indici p e q che delimitano la parte di array in cui cercare  All’inizio, p = 0 e q = a.Length – 1  Elemento mediano fra p e q: m = p + (q-p)/2 = (p+q)/2  Condizione di ripetizione  a[m] != x & p <= q  Se a[m]<x, p = m+1  Se a[m]>x, q = m-1
  36. 36. + /* Ricerca binaria. Assume l’array ordinato*/ class RicercaBinaria { public static void Main (string[] args) { int p, q, m; char x; char[] a; ... p = 0; q = a.Length - 1; do { m = (p + q) / 2; if (a[m] < x) p = m + 1; if (a[m] > x) q = m - 1; } while (a[m] != x && p <= q); if (a[m] == x) Console.WriteLine(x+" in posizione "+m); else Console.WriteLine (x + " non trovato"); } }
  37. 37. + Esempi con matrici  Somma di due matrici m1 e m2 in una terza matrice m (stesse dimensioni)2 1 … 3 2 … 5 3 … + = for (int i = 0; i < m.Length; i++) for (int j = 0; j < m[i].Length; j++) m[i][j] = m1[i][j] + m2[i][j];
  38. 38. + Prodotto di matrici  C[i][j] = k A[i][k]*B[k][j]
  39. 39. + Il codice...for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) C[i][j] = 0; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) for (int k = 0; k < M; k++) C[i][j] = C[i][j] + A[i][k] * B[k][j];...
  40. 40. + Metodo  Cos’è un metodo ?  A livello informale possiamo definirlo come una “parte di programma con un nome”  Metodi  Già definiti  Console.WriteLine, Console.ReadLine  double x = Math.sin(Math.PI/2)  Altre istruzioni oltre a dichiarazioni, assegnamento e strutture di controllo programmazione strutturata  Definiti dal programmatore  StampaDatiStudente, MoltiplicaMatrici, …  “Estendere il linguaggio C# con nuove istruzioni”
  41. 41. + Esempio  Definizione e uso  Parametri  formali (prezzo, sconto) e attuali (y, 10.5)static double ApplicaSconto(double prezzo, double sconto) { return (prezzo*(100-sconto)/100);}...double x, y;...x = ApplicaSconto(y,10.5);
  42. 42. + Esempio completo (1/3) class EsempioDiMetodo { static double Sconto(double p, double s) { return (p*s/100); } public static void Main (String[] args) { double prezzo, risultato; prezzo = Double.Parse(Console.ReadLine()); risultato = Sconto(prezzo, 5); Console.WriteLine("Lo sconto su "+ prezzo+" e: "+risultato); } }
  43. 43. + Esempio completo (2/3) class EsempioDiMetodo { static double Sconto(double p, double s) { return (p*s/100); } public static void Main (String[] args) { double prezzo; prezzo = Double.Parse(Console.ReadLine()); Console.WriteLine("Lo sconto su "+ prezzo+" e: "+sconto(prezzo, 5)); } }
  44. 44. + Esempio completo (3/3) class EsempioDiMetodo { static double ApplicaSconto(double p, double s) { return (p*(100-s)/100); } static double Sconto(double p, double s) { return (p-ApplicaSconto(p,s)); } public static void Main (String[] args) { double prezzo; prezzo = Double.Parse(Console.ReadLine()); Console.WriteLine("Lo sconto su "+ prezzo+" e: "+sconto(prezzo, 5); }
  45. 45. + Due tipi di metodi  Funzioni  Restituiscono un risultato  E.g.: Sconto  Procedure  “Fanno qualcosa”, generano un effetto  E.g.: Console.WriteLine  O misti  Fanno qualcosa e restituiscono un risultato  OrdinaArray, AzzerraArray
  46. 46. + Definizione metodo  Al di fuori del Main (e dentro il class)  Intestazione (prima riga)  static (per ora, ne riparleremo)  Tipo del risultato restituito (void se procedura)  Nome del metodo  Parametri formali e loro tipi (separati da “,”)  Corpo (fra graffe - obbligatorie)  Cosa fa e come lo fa  return termina esecuzione (e restituisce valore)
  47. 47. + Uso del metodo 1. Decidere i parametri attuali  Gli argomenti 2. Invocarlo con il nome  E.g.: classe Triangolo  Definisce metodi che poi noi usiamo
  48. 48. + Struttura programma C# class ... { static <tipo> <id> (<parametri>) { ... } static <tipo> <id> (<parametri>) { ... } public static void Main (String[] args) { ... } static <tipo> <id> (<parametri>) { ... } static <tipo> <id> (<parametri>) { ... } }
  49. 49. + Esecuzione di programma con metodi  L’esecuzione comincia dal main  Anche il Main è un metodo! (particolare)  Invocazione  Si passa all’esecuzione del contenuto del metodo  Associazione parametri  Esecuzione istruzioni del metodo  … fino al return o alla fine del metodo  Poi l’esecuzione ritorna al chiamante, all’istruzione successiva
  50. 50. + Un altro esempio class EsempioDiMetodo2 { static char ConvertiInMaiuscolo(char c) { if (c < a || c > z) return(c); else return ((char) (c + A - a)); } public static void Main (String[] args) { char carattere; do { carattere = Char.Parse(Console.WriteLine()); Console.WriteLine( convertiInMaiuscolo(carattere)); } while (carattere != n); } }
  51. 51. + Parametri  Formali  Usati alla definizione per definire cosa fa un metodo  F(x) = 2x2 + 4x + 9  Attuali  Usati all’invocazione per dire al metodo su quali dati lavorare  F(5), F(5+3), F(5y)
  52. 52. + Associazione fra parametri attuali e parametri formali  All’invocazione il valore del parametro attuale viene assegnato al parametro formale  Come con un assegnamento  I tipi devono essere compatibili, come per un assegnamento  Formale: Left value, variabili  Attuale: Right value, espressioni  Se ci sono più parametri, associazione posizionale (basata sulla posizione)  F(x,y) = 2x2 + 4y + 9xy  F(4,7)
  53. 53. + Cosa succede? class Parametri { static void Inc(int x) { x++; } public static void Main (String[] args) { int y = 0; Inc(y); Console.WriteLine(y); } }
  54. 54. + Perché  Passaggio parametri per valore  Il valore del parametro attuale viene copiato nel parametro formale  Ma sono 2 variabili diverse  Come per un assegnamentopublic static void Main (String[] args) { int x, y = 0; x = y; y++; Console.WriteLine(x);}
  55. 55. + Metodo (…) per incremento class Parametri { static int Inc(int x) { return (x + 1); } public static void main (String[] args) { int y = 0; y = Inc(y); Console.WriteLine(y); } }
  56. 56. + Forziamo il passaggio per riferimento anche per i tipi valore Dr. Paolo Casoto, Ph.D - 2012
  57. 57. + Forziamo il passaggio per riferimento anche per i tipi valore  C# consente di forzare il passaggio dei tipi valore per riferimento  Come se si trattasse a tutti gli effetti di un tipo riferimento  Utilizziamo due tipologie di modificatore:  ref: passaggio dei valori di input per riferimento  out: passaggio dei valori di output per riferimento  E.g.: indico al metodo in quali variabili devono essere collocati i valori di output del metodo  Le variabili ref devono essere inizializzate prima di essere passate come argomenti al metodo  Nel caso delle variabili out non è necessario Dr. Paolo Casoto, Ph.D - 2012
  58. 58. + Il modificatore params  Utilizzando il modificatore params sull’ultimo parametro di un metodo, possiamo indicare che il metodo riceve qualsiasi numero di parametri di quel tipo  Perché solo l’ultimo ???  E’ utilizzabile per realizzare il sovraccarico di un metodo  E’ una funzionalità da utilizzare solo se necessario  Porta ad una difficile leggibilità e manutenibilità del codice.  Può essere rimpiazzato con l’utilizzo di una struttura dati statica (array) o dinamica (List) per il passaggio di un insieme variabile di valori al metodo. Dr. Paolo Casoto, Ph.D - 2012
  59. 59. + Perché i metodi sono utili  Sintesi  Stesse operazioni da ripetere in più punti del programma  Evito ripetizione codice • Errori  Modularità  Scompongo problema (programma) in sottoproblemi (sottoprogrammi)  “Estendo il C# con nuove istruzioni”  [anche se non è il modo migliore, lo vedremo]
  60. 60. + Esempio  Scrivere un metodo per stampare una matrice bidimensionale class StampaMatrice { static void StampaMatrice(int[][] m) { for(int i = 0; i < m.Length; i++){ for (int j = 0; j < m[i].Length; j++) Console.WriteLine(m[i][j] + "t"); Console.WriteLine (); } } public static void Main (String[] args) { int[][] matrice = {{0,1,2},{3,4,5},{6,7,8},{9,10,100}}; StampaMatrice(matrice); } }
  61. 61. + Esercizi Dr. Paolo Casoto, Ph.D - 2012
  62. 62. + Esercizio 1  Scrivere un metodo che dice se un numero n è primo o no  Ossia, che riceve come parametro un numero intero positivo n e restituisce un valore booleano true se il parametro n è un numero primo, false altrimenti  (Scrivete anche un Main che invoca il metodo opportunamente)
  63. 63. + Idea  Guardo tutti i numeri minori di n (ciclo su i)  Escluso l’1  Basta arrivare a n/2  Controllo per ogni i se è un divisore di n  Quando trovo un divisore, n non è primo  Ne basta uno; mi fermo subito  Se non ne trovo, n è primo  Devo guardarli tutti; esco solo alla fine
  64. 64. + Primo.csclass Primo{ public static void Main (String[] args){ Console.WriteLine("Inserisci un numero intero --> "); Console.WriteLine((Primo(Int32.Parse(Console.ReadLine()))?"E": "Non e") + " primo"); }static boolean Primo(int n) { for (int i = 2; i <= n/2; i++) if (n % i == 0) return false; return true; }}
  65. 65. + Prova (Traccia) di esecuzione  Simulare il comportamento dell’interprete  Molto utile quando un programma non funziona  Tecnica:  Ci si scrivono tutte le variabili  Si esegue un’istruzione alla volta segnandosi  il valore che le variabili assumono man mano  Il punto a cui è giunta l’esecuzione  SI FA MOLTA ATTENZIONE PERCHÉ È FACILISSIMO SBAGLIARE!!!
  66. 66. + Esercizio 2  Quale valore viene restituito se si invoca Abc(4)? static int Abc(int x) { int y = 4; int k = 2; while (x >= y) { k = k+1; if (k > y) for (int i = 0; i<2; i = i+1) x = x-1; else y = y-1; } return y + x + k; }
  67. 67. + Esercizio 3  Quale valore viene restituito se si invoca Abc(8)? static int Abc(int x) { int y = 6; int k = 2; while (x >= y) { k = k+1; if (k > y) for (int i = 0; i<4; i = i+1) x = x-1; else y = y-3; } return y + x + k; }
  68. 68. + Esercizio 4  Quattro amici (Pino, Rino, Dino e Tino) stanno giocando a un gioco da tavola con un dado a quattro facce.  Completate il seguente programma per far stampare il nome del giocatore a seconda del valore della variabile dado:  se dado vale 0 tocca a Pino,  se vale 1 tocca a Rino e così via fino a 3.class PinoRinoDinoTino { public static void Main(String[] args) { int dado; dado = ...; Console.WriteLine("Tocca a "); Console.WriteLine(... ? ... : (... ? ... : (... ? ... : ...))); }} Dr. Paolo Casoto, Ph.D - 2012
  69. 69. + Esercizio 5 class PinoRinoDinoTino2 { public static void Main(String[] args) { int dado; dado = ...; Console.WriteLine("Tocca a "); Console.WriteLine(... ? ... : (... ? ... : (... ? ... : ...))); dado = ...; Console.WriteLine("Poi tocca a "); Console.WriteLine(... ? ... : (... ? ... : (... ? ... : ...))); } } Modificate il seguente programma per far stampare il nome del prossimo giocatore e Dr. Paolo Casoto, Ph.D - 2012 di quello successivo.
  70. 70. + Esercizio 5  Attenzione! Il secondo assegnamento non deve essere un letterale, ma unespressione e le due istruzioni di stampa devono essere identiche. Assegnate, con il primo assegnamento, 2 a dado e verificate che il programma stampi  Tocca a Dino Poi tocca a TinoModificate solo il primo assegnamento per far stampare  Tocca a Tino Poi tocca a Pino Dr. Paolo Casoto, Ph.D - 2012
  71. 71. + Esercizio 6  Scrivete il programma SommeAlleElementari. Quando si fanno le somme in colonna si scrive una cifra come risultato ed eventualmente si ha un riporto. Ad esempio:  5 + 7 =Scrivo 2 e riporto 1. Completate il codice qui sotto: class SommeAlleElementari { public static void Main(String[] args) { int cifra1; int cifra2; cifra1 = ...; cifra2 = ...; Console.WriteLine("Scrivo "+...+" e riporto "+...); } }
  72. 72. + Esercizio 7  Modificate il programma precedente utilizzando loperatore condizionale per fare in modo che la scritta "e riporto ..." compaia solo se cè effettivamente un riporto.  Ad esempio se cifra1 e cifra2 sono rispettivamente 2 e 3, loutput del programma deve essere "Scrivo 5" e non "Scrivo 5 e riporto 0" come nellesercizio precedente. Dr. Paolo Casoto, Ph.D - 2012
  73. 73. + Domande ??? Grazie a tutti per l’attenzione Dr. Paolo Casoto, Ph.D - 2012

×