Fondamenti di informatica – A.A. 2013/2014 Laboratorio 2 – Costrutti Integrate a partire da slide di Alberto Quattrini Li 2012/2013 Avvio dei PC Se non acceso, avviare il PC Il PC si avvierà in ambiente Windows Avviare l'applicazione Internet Explorer Si presenterà una schermata nera: Virtual Desktop Inserire i propri Codice Persona e Password Tra le applicazioni che saranno disponibili selezionare NX Client Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 2 Programma di oggi Rivedremo molto brevemente la sintassi di alcuni costrutti visti ad esercitazione: ● Strutture di selezione: • if/else • switch ● Strutture di iterazione: • while • do while • for ● Condizioni ● Operatori di incremento (++) e decremento (--) ● Esercizi ● Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 3 Selezione – costrutto if 4 Permette una scelta nell'esecuzione Sceglie se eseguire delle istruzioni oppure altre sulla base del valore di verità assunto da una condizione Sintassi if (condizione) { /* istruzioni condizione vera*/ } else{ /* istruzioni condizione falsa*/ } Note: Si possono omettere le graffe se si ha una sola "istruzione" all'interno del blocco Blocco else non obbligatorio Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 5 Selezione – Operatori per condizioni Operatori in una condizione C Significato della condizione in C = if (x == y) Se x è uguale a y … ≠ if (x != y) Se x è diverso da y … > if (x > y) Se x è maggiore di y … < if (x < y) Se x è minore di y … ≥ if (x >= y) Se x è maggiore o uguale a y … ≤ if (x <= y) Se x è minore o uguale a y … && if (esp1 && esp2) Se esp1 AND esp2 … || if (esp1 || esp2) Se esp1 OR esp2 … ! if (!esp) Se NOT esp … Operatori di uguaglianza Operatori relazionali Operatori logici Figura riadattata del Deitel & Deitel Attenzione all'operatore di uguaglianza “==” e non “=”! Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Selezione – Esempi condizioni 6 Nel laboratorio precedente c'era un esercizio in cui si chiedeva all'utente di inserire un carattere maiuscolo Supponiamo che il carattere ricevuto sia contenuto nella variabile cm Qual è la condizione che è vera se e solo se cm è maiuscolo? cm deve stare tra i caratteri A e Z (estremi inclusi) Come lo andiamo a scrivere in linguaggio C? cm >= 'A' && cm <= 'Z' Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Selezione – costrutto switch Permette una scelta tra più valori costanti Sintassi switch (variabile) { case cost1: /* istruzioni */ break; case cost2: /* istruzioni */ break; default: /* istruzioni */ break; } Note: Attenzione al break Graffe non necessarie per racchiudere il blocco di istruzioni all'interno di ogni case Possibile omettere caso default Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 7 Selezione – costrutto switch Permette una scelta tra più valori costanti Sintassi switch (variabile) { case cost1: /* istruzioni */ break; case cost2: /* istruzioni */ break; default: /* istruzioni */ break; } Note: Attenzione al break Graffe non necessarie per racchiudere il blocco di istruzioni all'interno di ogni case Possibile omettere caso default Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 8 Selezione – costrutto switch Permette una scelta tra più valori costanti Sintassi switch (variabile) { case cost1: /* istruzioni */ break; case cost2: /* istruzioni */ break; default: /* istruzioni */ break; } Note: Attenzione al break Graffe non necessarie per racchiudere il blocco di istruzioni all'interno di ogni case Possibile omettere caso default Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 9 Selezione – costrutto switch Permette una scelta tra più valori costanti Sintassi switch (variabile) { case 1: /* istruzioni */ break; case 2: /* istruzioni */ break; default: /* istruzioni */ break; } Note: Attenzione al break Graffe non necessarie per racchiudere il blocco di istruzioni all'interno di ogni case Possibile omettere caso default Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 10 Selezione – costrutto switch Permette una scelta tra più valori costanti Sintassi switch (variabile) { case 'a': /* istruzioni */ break; case 'b': /* istruzioni */ break; default: /* istruzioni */ break; } Note: Attenzione al break Graffe non necessarie per racchiudere il blocco di istruzioni all'interno di ogni case Possibile omettere caso default Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 11 Selezione – costrutto while Ripete un blocco di istruzioni, mentre la condizione è vera Sintassi while (condizione) { /* istruzioni */ } Note: Attenzione alle condizioni: cicli infiniti Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 12 Selezione – costrutto do...while Ripete un blocco di istruzioni Mentre una condizione è vera Condizione verificata alla fine del blocco Prima iterazione sempre eseguita Sintassi do { /* istruzioni */ } while (condizione); Note: Attenzione alle condizioni: cicli infiniti Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 13 Selezione – costrutto for 14 Ripete un blocco di istruzioni, mentre la condizione è vera Sintassi for (inizializzazione contatore; condizione; aggiornamento contatore) { /* istruzioni */ } Note: Simile al ciclo while for solitamente utilizzato quando il numero di iterazioni è conosciuto in anticipo Attenzione alle condizioni: cicli infiniti Esempio: int i; for (i = 0; i < n; i++) { printf("i=%d\n", i); } Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Operatori incremento/decremento Operatore incremento (++) Pre-incremento: ++c Post-incremento: c++ Operatore decremento (--) Pre-decremento: --c Post-decremento: c-Esempio: c=5; var = c++; var = ? c = ? • var = 5 e c = 6 c=5; var = ++c; var = ? c = ? • var = 6 e c = 6 Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 15 Indentazione 16 Visto che ci possono essere diversi livelli di annidamento, è importante l'indentazione del codice, ovvero aggiungere spazi per tabulare correttamente il codice, a seconda del livello di annidamento Esempio for (inizializzazione contatore; condizione; aggiornamento contatore) { /* istruzioni blocco for */ if (condizione2){ /* istruzioni blocco if */ } } Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Debugging - Richiamo Stampate a video i valori delle variabili utilizzando le printf Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 17 ESERCIZI 18 Potete scaricare gli esercizi dal seguente link: ftp://ftp.elet.polimi.it/users/Marco.Rocco/ Scaricate il file esercizi_lab2.pdf Potete andare avanti finché riuscite, ognuno può andare alla propria velocità Vi interromperemo di tanto in tanto per vedere alcuni aspetti problematici e/o importanti nella risoluzione dei diversi esercizi proposti Verso metà lezione faremo una pausa di 10 minuti Comandi utili: cd, ls, pwd, gcc nomefile.c -o nome_eseguibile ./nome_eseguibile Evitate di mettere spazi nei nomi dei file Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Problema 1 19 Ricevere da tastiera un carattere Verificare se il carattere ricevuto è Maiuscolo Se non fosse Maiuscolo, stampare un messaggio di errore e chiedere un nuovo carattere all'utente Ripetere il tutto finché l'utente non inserisce un carattere maiuscolo Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Programmazione - Input Analizziamo meglio l'ultimo problema: Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 20 Programmazione - Input 21 Cosa è accaduto? L'utente ha inserito nello stdin: c \n La scanf ha consumato il primo carattere, ora lo stdin contiene: \n La seconda scanf cerca un carattere nello stdin e lo trova senza doverlo chiedere nuovamente all'utente, in seguito alla scanf lo stdin diventa: Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Programmazione - Input Analizziamo meglio l'ultimo problema: Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 22 Programmazione - Input Cosa è accaduto? L'utente ha inserito nello stdin: c \n La scanf ha consumato il primo carattere, ora lo stdin è: \n L'istruzione aggiunta consuma tutto lo stdin: La seconda scanf cerca un carattere nello stdin, non lo trova e quindi attende che l'utente lo immetta: C \n La scanf consuma il carattere: \n Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 23 Problema 2 – Maggiore, minore e media 24 Scrivere un programma che prendendo numeri positivi inseriti da tastiera (per terminare il processo di inserimento dei dati, l'utente deve digitare -1) – Trovi il maggiore – Trovi il minore – Calcoli la media Provate a scriverlo in due differenti versioni: Usando la struttura di iterazione while Usando la struttura di iterazione: for Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Problema 2 – Maggiore, minore e media Sappiamo già che il valore minimo che assume max è 0 Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 25 Problema 2 – Maggiore, minore e media Contatore numeri ricevuti Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 26 Problema 2 – Maggiore, minore e media Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 27 Problema 2 – Maggiore, minore e media Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 28 Problema 2 – Maggiore, minore e media Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 29 Problema 2 – Maggiore, minore e media Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 30 Problema 2 – Maggiore, minore e media Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 31 Problema 2 – Maggiore, minore e media float int Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 32 Problema 2 – Maggiore, minore e media Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 33 Problema 3 – Carta Sasso Forbice Scrivere un programma per il gioco “carta sasso e forbice” bisogna far scegliere una strategia casuale al computer ed inserire la propria dopo un numero di round definito dall'utente restituisce il numero di partite vinte, perse e pareggiate Per gli appassionati di ... Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 41 Problema 3 - Considerazioni srand(unsigned int seed) + rand() “For every different seed value used in a call to srand, the pseudo-random number generator can be expected to generate a different succession of results in the subsequent calls to rand.” Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 42 Problema 3 - Considerazioni Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 43 Problema 3 - Considerazioni Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 44 Problema 3 - Considerazioni Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 45 Problema 3 - Considerazioni Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 46 Problema 4 - Fattoriale 54 Si chieda all'utente di inserire un numero intero e poi se ne calcoli il fattoriale Si ricorda che: – n! = n * (n -1) * (n – 2) * … * 1 – 0! = 1 Cosa accade se provate a calcolare 12! (= 479001600)? Cosa accade se provate a calcolare 13! (= 6227020800)? Perché? Se si è presentato un problema avete idea di come risolverlo? Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Variabili – Modificatori Tipi Oltre ai già noti tipi di dato: char, int, float e double Ad alcuni di essi è possibile applicare dei modificatori: short long signed unsigned short è applicabile a: int long è applicabile a: int e double signed e unsigned sono applicabili a: char e int Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 55 Variabili – Modificatori Tipi: short e long 56 short e long L'obiettivo di questi modificatori è di cambiare il numero di bit dedicati alla rappresentazione di un intero, rispetto a quanti dedicati dal tipo int bit(short int) <= bit(int) <= bit(long int) <= bit(long long int) Quanti bit vengono effettivamente utilizzati dipende dalla macchina che si sta utilizzando, ma ci sono alcuni vincoli: bit(short int) >= 16 bit(int) >= 16 bit(long int) >= 32 bit(long long int) >= 64 Sulla macchina che state utilizzando ora: bit(short int) = 16, bit(int) = 32, bit(long int) = 32 e bit(long long int) = 64 bit(double) = 64, bit(long double) = 80 Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Variabili – Modificatori Tipi: signed e unsigned 57 signed signed char e signed int sono equivalenti a char e int, rispettivamente char assume valori tra -128 e 127 int (16 bit) assume valori tra -32768 e 32767 unsigned Ci permette di rappresentare solo numeri positivi (senza segno) unsigned char può assumere valori tra: 0 e 255 unsigned int (16 bit) può assumere valori tra: 0 e 65535 Esempio dichiarazione: unsigned int x; Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Problema 4 - Fattoriale Per stampare un long int il carattere spericificatore è %ld Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 58 Problema 5 - Determinare il giorno 59 L'utente fornisce una data: giorno/mese/anno Verificare che la data inserita sia ammissibile (es. 40/5/2010 non è ammissible, 29/2/2013 non è ammissibile) Calcolare che giorno (lunedì, martedì, ...) era/sarà in quella data Aiuti: 1) Un anno è bisestile se e solo se è divisibile per 4 e non è divisibile per 100, a meno che non sia divisibile per 400 2) Come calcolare il giorno, una volta nota la data? Algoritmo di Gauss Calcolare m: m = 11 se gennaio, m = 12 se febbraio, m = mese - 2 per tutti gli altri mesi Calcolare y: y = anno – 1 se gennaio o febbraio, y = anno altrimenti giornosettimana=( giorno+⌊ 2.6∗m−0.2 ⌋+4∗( y mod 4)+5∗( y mod 100)+6∗( y mod 400)) mod 7 giornosettimana (0 = Domenica, 1 = Lunedì, …, 6 = Sabato) Laboratorio di Fondamenti di Informatica – A.A. 2013/2014 Problema 6 - Ricevere numero da input 60 Si ipotizzi che l'utente voglia inserire un numero, ma lo faccia inserendo una cifra alla volta (es. per scrivere 123, l'utente inserirà prima 1, poi 2 e poi 3). In questo modo ogni cifra deve essere ricevuta singolarmente dall'algoritmo L'utente comunica la terminazione dell'inserimento delle cifre tramite il carattere 'e' Obiettivo del programma: ricevere le cifre scritte dall'utente e ricostruire il numero che l'utente voleva inserite AIUTO: 345 = 3 * 100 + 4 * 10 + 5 Laboratorio di Fondamenti di Informatica – A.A. 2013/2014