Lucidi relativi al DVD di Programmazione in C

1598
Programmazione in C

description

Copia integrale dei lucidi presenti nel DVD di Programmazione in C del Politecnico di Torino. Il DVD è visibile on-line all'indirizzo http://corsiadistanza.polito.it/on-line/Prog_in_C/index2.htm

Transcript of Lucidi relativi al DVD di Programmazione in C

  • 1. Programmazione in C

2. Primo programma in CIntroduzione al linguaggio CStruttura minima di un file CSottoinsieme minimale di istruzioniCompilare il primo programmaEsercizi propostiSommario2 3. Riferimenti al materialeTesti Kernighan & Ritchie: capitolo 1 Cabodi, Quer, Sonza Reorda: capitoli 1, 3 Dietel & Dietel: capitolo 1Dispense Scheda: Primo programma in C 3 4. Primo programma in C 5. Genesi del linguaggio CSviluppato tra il 1969 ed il 1973presso gli AT&T Bell Laboratories B. Kernighan e D. Ritchie Per uso interno Legato allo sviluppo del sistema operativo Unix Brian Kernighan Dennis RitchieNel 1978 viene pubblicato The CProgramming Language, primaspecifica ufficiale del linguaggio Detto K&R 5 6. Obiettivi del linguaggioInsieme minimale di costrutti base Semplicit del compilatoreSintassi estremamente sintetica Talvolta cripticaPensato da programmatori per programmatori Elevata efficienza Per nulla user friendlyPortabile Indipendente dalla macchinaDisponibilit di una libreria standard di funzioni 6 7. Evoluzione del linguaggio (1/2)1978, K&R C1989, ANSI C (o C89) Frutto del lavoro di standardizzazione del comitato X3J11 dellAmerican National Standards Institute Standard X3.159-1989 Programming Language C Seconda edizione del K&R7 8. Evoluzione del linguaggio (2/2)1990, ISO C (o C90) Ratifica da parte della International Organization for Standardization dello standard ANSI C ISO/IEC 9899:19901999, ISO C99 Revisione compiuta negli anni 90 INCITS-ANSI/ISO/IEC 9899-1999550 paginehttp://www.open-std.org/jtc1/sc22/wg14/ Supportata da molti (non tutti) i compilatori8 9. Diffusione attualeI linguaggi attualmente pi diffusi al mondosono: C C++, unevoluzione del C Java, la cui sintassi tratta da C++ C#, estremamente simile a Java e C++Il linguaggio C uno dei linguaggi pi diffusiLa sintassi del linguaggio C ripresa da tutti glialtri linguaggi principali9 10. Principali vantaggi del CBasato su relativamente pochi costrutti daapprendereEnorme disponibilit di documentazione edesempiBuona disponibilt di ambienti di sviluppo gratuitiDisponibile su qualsiasi configurazione hardwareElevata efficienza di elaborazioneAdatto a vari tipi di applicazioni Programmi di sistema Elaborazione numerica Programmi interattivi10 11. Principali svantaggi del CScarsa leggibilit di alcuni costruttiFacilit nel commettere errori di programmazione Molti costrutti pericolosi sono permessi dal linguaggio e quindi non vengono segnalati dal compilatore Alcuni errori di digitazione possono causare comportamenti erratiDifficolt nella realizzazione di interfacce graficheComplessit nellelaborazione dei testi11 12. Un esempio#include int main(void void) void{ printf("hello, worldn");return 0;} 12 13. Primo programma in C 14. Struttura minima di un file CApplicazioni C in modo consoleStruttura del programmaCommentiDirettive #includeDefinizione di variabiliCorpo del main 2 15. Struttura minima di un file C 16. Tipi di applicazioni (1/4)Applicazioni grafiche Interazione mediante mouse e finestre Visualizzazione di testi e grafica Elaborazione concorrente4 17. Tipi di applicazioni (2/4)Applicazioni graficheApplicazioni console Interazione mediante Interazione mouse e finestre mediante tastiera Visualizzazione di testi Visualizzazione di e graficasoli caratteri Elaborazione Elaborazione concorrentesequenziale5 18. Tipi di applicazioni (3/4)Applicazioni batch Nessuna interazione utente Compiti lunghi e ripetitivi Elaborazione numerica, trasferimenti in rete 6 19. Tipi di applicazioni (4/4)Applicazioni batchApplicazioni server Nessuna interazione Nessuna interazione utenteutente Compiti lunghi eRealizzano funzioni ripetitividi sistema Elaborazione numerica,Server locali o trasferimenti in rete server Internet 7 20. Applicazioni consoleInterazione utente limitata a due casi Stampa di messaggi, informazioni e dati a video Immissione di un dato via tastieraLinsieme tastiera+video viene detto terminaleNessuna caratteristica graficaElaborazione Sequenziale Interattiva Mono-utente 8 21. Modello di applicazioni consoleProgramma eseguibileVisualizzazioneImmissione dati 9risultati 22. Modello di applicazioni console ScritturaprogrammaProgrammasorgente in CCompilatore C ProgrammaeseguibileVisualizzazioneImmissione dati 10risultati 23. Modello di applicazioni console Scrittura somma.cprogrammaProgrammasorgente in CCompilatore C somma.exe Programmaeseguibile VisualizzazioneImmissione dati11 risultati 24. Compilatore CCompilatore C Traduce i programmi sorgenti scritti in linguaggio C in programmi eseguibili a sua volta un programma eseguibile, a disposizione del programmatore Controlla lassenza di errori di sintassi del linguaggio Non serve allutente finale del programma Ne esistono diversi, sia gratuiti che commerciali12 25. Scritturaprogramma Scrittura del programma Un sorgente C un normale file di testo Si utilizza un editor di testiBlocco NoteEditor specializzati per programmatori 13 26. Editor per programmatoriColorazione ed evidenziazione della sintassiIndentazione automaticaAttivazione automatica della compilazioneIdentificazione delle parentesi corrispondentiMolti disponibili, sia gratuiti che commerciali14 27. ScritturaCompilatore Cprogramma Ambienti integrati Applicazioni software integrate che contengono al loro interno Un editor di testi per programmatori Un compilatore C Un ambiente di verifica dei programmi (debugger) IDE: Integrated Development Environment15 28. Struttura minima di un file C 29. Struttura di un sorgente in C#include int main(void void) void{ int a ;a = 3 ;printf("hello, worldn");printf("the magic number is %dn", a) ;return 0;}17 30. Struttura di un sorgente in C Programma principale#include (funzione main)int main(void void) void{ int a ;a = 3 ;printf("hello, worldn");printf("the magic number is %dn", a) ;return 0;}18 31. Struttura di un sorgente in C#include int main(void void) void{ int a ;a = 3 ;printf("hello, worldn");printf("the magic number is %dn", a) ;return 0;}Parentesi graffe che delimitano il main19 32. Struttura di un sorgente in C#include int main(void void) voidVariabili utilizzatedal programma{ int a ;a = 3 ;printf("hello, worldn");printf("the magic number is %dn", a) ;return 0;}20 33. Struttura di un sorgente in C#include int main(void void) void{ int a ;Istruzioni eseguibilia = 3 ;printf("hello, worldn");printf("the magic number is %dn", a) ;return 0;}21 34. Struttura di un sorgente in CRichiamo delle#include librerie utilizzateint main(void void) void{ int a ;a = 3 ;printf("hello, worldn");printf("the magic number is %dn", a) ;return 0;}22 35. In generale#include delle librerieint main(void void) void{definizione variabiliistruzioni eseguibili} 23 36. Struttura minima di un file C 37. CommentiIl testo presente in un sorgente C deve essereanalizzato dal compilatore C, quindi devesottostare a tutte le regole sintattiche dellinguaggioPer aggiungere annotazioni, commenti,spiegazioni, note, ... si pu usare un commentoallinterno del sorgente /* io sono un commento */25 38. SintassiUn commento una qualsiasi sequenza dicaratteri (anche su pi righe) che: Inizia con la coppia di caratteri /* Termina con la coppia di caratteri */Non permesso annidare commenti Allinterno di un commento non devono comparire i caratteri /*Tutto ci che compreso tra /* e */ vieneignorato dal compilatore C26 39. Esempio/* programma: hello.c autore: fulvio corno *//* accedi alla libreria standard */#include int main(void void) void{ int a ; /* numero magico */a = 3 ; /* assegno un valore *//* salutiamo lutente */printf("hello, worldn") ;printf("the magic number is %dn", a) ;return 0;} 27 40. Spazi bianchiOltre ai commenti, il compilatore ignora tutti glispazi bianchi Spazi tra unistruzione e la successiva Spazi ad inizio linea Spazi intorno alla punteggiatura Righe vuoteLa spaziatura viene utilizzata per rendere ilsorgente C pi ordinato e pi facilmentecomprensibile 28 41. Esempio/* programma: hello.c autore: fulvio corno *//* accedi alla libreria standard */#include int main(void void) void{ int a ; /* numero magico */ a = 3 ;/* assegno un valore *//* salutiamo lutente */ printf("hello, worldn") ;printf("the magic number is %dn", a) ; return 0;}29 42. Esempio/* programma: hello.c autore: fulvio corno *//* accedi alla libreria standard */#include int main(void void) void{ int a ; /* numero magico */ a = 3 ;/* assegno un valore *//* salutiamo lutente */ printf("hello, worldn") ;printf("the magic number is %dn", a) ; return 0;}#include int main(void void) void{ int a ; a = 3 ; printf("hello, worldn") ;printf("the magic number is %dn", a) ; return 0; }30 43. Struttura minima di un file C 44. Librerie di funzioniOgni compilatore C dispone di diverse librerie difunzioni gi pronte per lusoIl programmatore pu utilizzare le funzioni dilibreria necessario dichiarare a quali librerie si vuoleavere accesso Direttive #include ad inizio programma Aggiunge al programma le dichiarazioni di tutte le funzioni di tale libreria, permettendo al programmatore di richiamare tali funzioni32 45. Sintassi#include < NomeLibreria .h>Librerie principali: #include Funzioni di lettura/scrittura su terminale e su file #include Funzioni base per interazione con sistema operativo #include Funzioni matematiche #include Elaborazione di testi33 46. AvvertenzeA differenza della regola generale, nelle direttive#include la spaziatura importante Il carattere # deve essere il primo della riga Pu esserci una sola #include per riga La direttiva #include non va terminata con il ;Dimenticare una #include potr portare aderrori nel corpo del main, quando si chiamerannole funzioni relative34 47. SuggerimentiIniziare sempre il sorgente C con le seguentilinee: /* programma: NomeFile.cautore: NomeAutoreDelProgramma BreveDescrizioneDelProgramma*/ #include #include #include int main(voidvoid)void { . . . . } 35 48. Struttura minima di un file C 49. VariabiliIl programma memorizza le informazioni sullequali lavora allinterno di variabiliOgni variabile caratterizzata da: Tipo di dato Nome Valore correntea35 x-17 37 50. VariabiliIl programma memorizza le informazioni sullequali lavora allinterno di variabiliOgni variabile caratterizzata da: Tipo di dato Nome Valore correntea35 x-17pi3.14 nome fulvio 38 51. Tipo di datoDefinisce linsieme dei valori ammissibili per lavariabile35 Numeri interi, positivi o negativi 3.14Numeri reali fulvioStringhe di testo f Singoli caratteri di testo 39 52. Tipo di datoDefinisce linsieme dei valori ammissibili per lavariabileint 35 Numeri interi, positivi o negativifloat3.14Numeri realifulvio Stringhe di testochar f Singoli caratteri di testo 40 53. NomeIl programmatore assegna un nome a ciascunavariabileDovrebbe rappresentare lo scopo dei valoricontenuti nella variabileSintetico, rappresentativo, mnemonico, facile dascrivere 41 54. Nomi ammissibiliIl primo carattere deve essere una letteraI successivi possono essere lettere o numeriLettere maiuscole e minuscole sono diverseIl simbolo _ viene considerato come una letteraNon devono essere nomi riservati dal linguaggio42 55. Esempi di nomia b a1a2 43 56. Esempi di nomia b a1a2num n N sommamax 44 57. Esempi di nomia b a1a2num n N sommamaxareaperimetro perim 45 58. Esempi di nomia b a1 a2num nN sommamax area perimetroperimn_elementiNelementi risultato46 59. Esempi di nomiab a1a2numnNsommamax areaperimetro perimn_elementi Nelementirisultato trovatonomerisposta47 60. Definizione di variabiliOgni variabile deve essere definita prima dipoterla utilizzareDefinizioni allinizio della funzione mainSintassi della definizione TipoVariabile NomeVariabile ;int main(void void) void{ int a ; int b ; float x ;. . . . . 48} 61. Definizione di variabiliOgni variabile deve essere definita prima dipoterla utilizzareDefinizioni allinizio della funzione mainSintassi della definizione TipoVariabile NomeVariabile ; TipoVariabile NomeVariabile, NomeVariabile ;int main(void void) voidint main(void void) void{{ int a ; int a, b ; int b ; float x ; float x ;. . . . .. . . . .} 49} 62. Valore contenutoOgni variabile, in ogni istante di tempo, possiedeun certo valoreLe variabili appena definite hanno valore ignotoVariabili non inizializzateIn momenti diversi il valore pu cambiarea?tdefinizione 50 63. Valore contenutoOgni variabile, in ogni istante di tempo, possiedeun certo valoreLe variabili appena definite hanno valore ignotoVariabili non inizializzateIn momenti diversi il valore pu cambiare ? a37tdefinizione inizializzazione 51 64. Valore contenutoOgni variabile, in ogni istante di tempo, possiedeun certo valoreLe variabili appena definite hanno valore ignotoVariabili non inizializzateIn momenti diversi il valore pu cambiare ?37 a -4 tdefinizione inizializzazione altra assegnazione 52 65. Valore contenutoOgni variabile, in ogni istante di tempo, possiedeun certo valoreLe variabili appena definite hanno valore ignotoVariabili non inizializzateIn momenti diversi il valore pu cambiare ?37 -4 a-3tdefinizione inizializzazione altraincremento assegnazione53 66. Struttura minima di un file C 67. Istruzioni eseguibiliLa funzione main, dopo le definizioni di variabili,contiene le vere e proprie istruzioni eseguibiliCiascuna istruzione terminata da ;Tutte le istruzioni sono comprese nelle { ... }Le istruzioni vengono eseguite in ordineDopo aver eseguito lultima istruzione, ilprogramma termina55 68. Esempio/* programma: hello.c autore: fulvio corno *//* accedi alla libreria standard */#include int main(void void) void{ int a ; /* numero magico */a = 3 ; /* assegno un valore *//* salutiamo lutente */printf("hello, worldn") ;printf("the magic number is %dn", a) ;return 0;} 56 69. Tipologie di istruzioniIstruzioni operative Lettura datiscanf("%d", &a) ; Stampa risultatiprintf("%d", a) ; Elaborazione numericaa = b + c ;b = b + 1 ;c = 42 ;c = sqrt(a) ;57 70. Tipologie di istruzioniIstruzioni operative Istruzioni di controllo Lettura dati Modificano il controlloscanf("%d", &a) ; di flusso Stampa risultati Scelteprintf("%d", a) ; Iterazioni Elaborazione numericaChiamate a funzionia = b + c ; Interruzioni e saltib = b + 1 ; Predefinite dalc = 42 ;linguaggio Cc = sqrt(a) ; if else whilefor returnswitch casebreak continue 58goto 71. Primo programma in C 72. Sottoinsieme minimale di istruzioniI tipi int e floatIstruzione printf semplificataIstruzione scanf semplificataIstruzione di assegnazioneSemplici espressioni aritmetiche2 73. Sottoinsieme minimale di istruzioni 74. Tipi di datoOgni costante, ogni variabile, ogni espressioneappartiene ad un determinato tipoIl tipo determina Linsieme dei valori che la costante, variabile o espressione pu assumere Linsieme delle operazioni lecite su tali valoriI tipi possono essere Semplici (o scalari): singoli valori Strutturati: insiemi di pi valori semplici 4 75. Il sistema dei tipi CTipo di datoTipi Scalari Tipi Strutturati voidTipi interi Tipi realiEnumerazioniVettorichar floatStruttureintdouble Unionshort / long long Puntatori signed/unsignedFunzioni 5 76. Caratteristiche generaliI valori ammessi per ciascun tipo non sono fissatidallo standardDipendono dal compilatore e dal sistemaoperativo Ampiezza dei tipi di dato naturale per ogni calcolatoreMaggior portabilitMaggior efficienzaNessuna garanzia di uniformit tra piattaformediverse 6 77. Il tipo intIl tipo pi importante del linguaggio C 35Valori interi, positivi o negativi intCodificato in complemento a dueEspresso solitamente su 16 bit oppure 32 bit 16 bit: da 32 768 a +32 767 32 bit: da 2 147 483 648 a +2 147 483 647 In generale: da INT_MIN a INT_MAX#include 7 78. Esempii0int i, j ;int N ;int x ; j2i = 0 ;j = 2 ; NN = 100 ; 100x = -3124 ;x -3124 8 79. Il tipo floatValori reali3.14 Frazionarifloat Esterni allintervallo permesso per i numeri interiCodificato in virgola mobile, singola precisioneEspresso solitamente su 32 bit da 1.17 1038 a 3.40 10+38 circa 6 cifre di precisione In generale: da FLT_MIN a FLT_MAX #include 9 80. Esempi a3.1float a, b ;float pigr ; bfloat Nav, Qe ; 2.0a = 3.1 ;b = 2.0 ;pigr 3.1415pigr = 3.1415926 ;Nav = 6.022e23 ;Qe = 1.6e-19 ; Nav 6.021023Qe 1.61019 10 81. Sottoinsieme minimale di istruzioni 82. Istruzioni di stampaStampa di messaggi informativiStampa di comando a capoStampa di valori di variabiliStampa di valori di espressioni calcolateStampa di messaggi contenenti valori ProgrammaeseguibileVisualizzazionerisultati12 83. Stampa di messaggiprintf("Benvenuton") ;printf("Immetti un numero: ") ;printf("n");BenvenutoImmetti un numero: _13 84. Stampa di variabili printf("%d ", j) ; printf("%dn", N) ; printf("%fn", pigr) ; printf("%fn", Nav) ;2 1003.141593602200013124147500000000.000000 14 85. Stampa di espressioni printf("%dn", i-j) ; printf("%dn", N*2) ; printf("%fn", Nav * Qe) ;-220096352.000000 15 86. Stampa di messaggi e valoriprintf("Risultato=%dn", N*2) ;printf("Angolo = %f radiantin", pigr/4);Risultato=200Angolo = 0.785398 radianti16 87. Sintassi istruzione printf#include printf("formato ", valore/i ) ;Formato: Testo libero (compresi spazi) viene stampato letteralmente Simboli n va a capo Simboli %d stampa un int Simboli %f stampa un floatValore/i: Variabile o espressione Di tipo int o float, corrispondente al simbolo %17 88. Casi particolari (1/2)Per stampare il simbolo % occorre ripeterlo duevolte printf("Sondaggio: %f%%n", pSI ) ;%f stampa pSI%% stampa un simbolo %n va a capo Sondaggio: 43.12%18 89. Casi particolari (2/2) possibile stampare pi di un valore nella stessaistruzione printf("Voti: %d su %dn", voti, tot ) ;primo %d stampa votisecondo %d stampa tot Voti: 18 su 45 19 90. Sottoinsieme minimale di istruzioni 91. Istruzioni di letturaLettura di un valore interoLettura di un valore reale Programmaeseguibile Immissione dati21 92. Lettura di un interoscanf( "%d", &N ) ;21322 93. Lettura di un reale scanf( "%f", &a ) ;12.523 94. Sintassi istruzione scanf#include scanf("formato ", &variabile ) ;Formato: Simboli %d legge un int Simboli %f legge un floatVariabile: Di tipo int o float, corrispondente al simbolo % Sempre preceduta dal simbolo &24 95. SuggerimentoCombinare le istruzioni printf e scanf perguidare lutente nellimmissione dei dati Ogni scanf deve essere preceduta da una printf che indica quale dato il programma si aspettaprintf("Immetti il numero: ");scanf("%d", &N) ;printf("Numero immesso: %dn", N);25 96. Errore frequente Dimenticare il simbolo & nelle istruzioni scanfprintf("Immetti il numero: ");scanf("%d", N) ;forma correttaprintf("Immetti il numero: ");scanf("%d", &N) ; 26 97. Errore frequente Dimenticare le variabili da stampare nelle istruzioni printfprintf("Numero immesso: %dn");forma correttaprintf("Numero immesso: %dn", N); 27 98. Sottoinsieme minimale di istruzioni 99. Assegnazione delle variabiliIl valore di una variabileDeve essere inizializzato, la prima voltaPu essere aggiornato, quante volte si vuolePer assegnare un nuovo valore ad una variabile siusa loperatore =a?37 -4-3tdefinizione inizializzazione altraincremento assegnazione 29 100. Assegnazione di variabiliAssegnazione del valore di una costante i = 0 ; a = 3.0 ;Assegnazione del valore di unaltra variabile i = N ; b = a ;Assegnazione del valore di unespressione j = N i ; b = a * 2 1 ;30 101. Sintassi dellassegnazionevariabile = espressione ;valorevalorea precedentea espressionePasso 1: si valuta il valore correntedellespressionePer tutte le variabili che compaiononellespressione, si usa il valore correntePu comparire anche la stessa variabile oggettodellassegnazionePasso 2: si memorizza tale valore nella variabile,cancellando il valore precedente31 102. EsempiN = 3 ; 32 103. EsempiN = 3 ;a = b ;Non confondere con b = a ;33 104. EsempiN = 3 ;a = b ;Non confondere con b = a ;a = a + 1 ;Incrementa a di ununit34 105. EsempiN = 3 ;a = b ;Non confondere con b = a ;a = a + 1 ;Incrementa a di ununita + 1 = a ;Errore35 106. QuesitoChe operazione svolge il seguente frammento diprogramma?a = b ;b = a ; 36 107. RispostaChe operazione svolge il seguente frammento diprogramma? a = b ; b = a ;Il valore corrente di b viene copiato in a Il valore vecchio di a viene persoIl (nuovo) valore corrente di a (uguale a b) vienericopiato in b (operazione inutile) 37 108. QuesitoCome fare a scambiare tra di loro i valori di duevariabili? a7 b 1238 109. QuesitoCome fare a scambiare tra di loro i valori di duevariabili? a 7b 12 valore valore a12 precedente b 7precedente39 110. Rispostat = a ;a = b ;b = t ;a 7 b 12t?40 111. Rispostat = a ;a = b ;b = t ;a 7 b 12t741 112. Rispostat = a ;a = b ;b = t ;a 12 b 12t742 113. Rispostat = a ;a = b ;b = t ;a 12 b 7t743 114. Sottoinsieme minimale di istruzioni 115. Espressioni aritmeticheOvunque sia richiesto il valore di una variabile, possibile usare unespressione aritmetica Nei valori da stampare con la funzione printf Nei valori da assegnare ad una variabileLe espressioni si possono costruire ricorrendo a: Operatori: + - * / Parentesi: ( ... ) Funzioni di libreria: sqrt(), sin(), cos(), ...45 116. Operatori principaliSomma: a+bSottrazione: a-bMoltiplicazione: a*bDivisione: a/b Divisione intera (risultato troncato) se entrambi gli operandi sono intResto della divisione: a%b Solo tra operandi intCambio di segno: -a 46 117. Alcuni operatori avanzatiIncremento: i++Decremento: N--Conversione ad intero: (int)aConversione a reale: (float)N47 118. Funzioni di libreria#include Funzioni algebriche fabs, sqrt, cbrt, pow, hypot, ceil, floor, round, trunc, fmodFunzioni esponenziali e logaritmiche exp, exp2, log, log10, log2Funzioni trigonometriche e iperboliche cos, sin, tan, cosh, sinh, tanhFunzioni trigonometriche e iperboliche inverse acos, asin, atan, atan2, acosh, asinh, atanh 48 119. ParentesiSi possono costruire espressioni complicate apiacere utilizzando le parentesiPer maggiore leggibilit, abbondare con leparentesi ed usare la spaziatura elincolonnamento in modo ordinatoSi utilizzano sempre le parentesi tondex1 = ( -b + sqrt( b*b 4*a*c ) ) / ( 2*a ) ;A = sqrt( p * (p-a) * (p-b) * (p-c)) ;49 120. Primo programma in C 121. Compilare il primo programmaUn semplice programmaLambiente di sviluppo Dev-C++Codifica del programmaCompilazione e correzione erroriEsecuzione e verifica 2 122. Compilare il primo programma 123. Esercizio Somma due numeriSi realizzi un programma in linguaggio C cheacquisisca da tastiera due numeri interi (detti A eB) e che stampi a video il valore della somma ditali numeriScrittura programmaProgramma sorgente in C4 124. AnalisiSomma due numeriImmetti il primo numero: _5 125. AnalisiSomma due numeriImmetti il primo numero: 18Immetti il secondo numero: _6 126. AnalisiSomma due numeriImmetti il primo numero: 18Immetti il secondo numero: 3La somma di 18 + 3 vale: 217 127. Diagramma di flussoLeggi ALeggi B CalcolaC = A+BStampa C 8 128. Traduzione in C (1/4) int a ;Leggi A scanf("%d", &a) ;Leggi B CalcolaC = A+BStampa C 9 129. Traduzione in C (2/4)Leggi A int b ;Leggi B scanf("%d", &b) ; CalcolaC = A+BStampa C 10 130. Traduzione in C (3/4)Leggi ALeggi B int c ; CalcolaC = A+Bc = a + b ;Stampa C 11 131. Traduzione in C (4/4)Leggi ALeggi B CalcolaC = A+B printf("La somma %d + %d ",a, b) ;Stampa C printf("vale: %dn", c) ; 12 132. Compilare il primo programma 133. Compilatori e IDEOccorre identificare ed installare Un editor (possibilmente per programmatori) Un compilatore Un debuggerOppure trovare un Integrated DevelopmentEnvironment che integri tutte le funzionalitprecedentiEsistono molte soluzioni gratuite 14 134. IDE per C in ambiente WindowsDev-C++http://www.bloodshed.net 15 135. IDE per C in ambiente WindowsV IDEhttp://www.objectcentral.org 16 136. IDE per C in ambiente WindowsCode::Blocks http://www.codeblocks.org17 137. IDE per C in ambiente Windowslcc-win32 http://www.cs.virginia.edu/~lcc-win32/18 138. Interfaccia di Dev-C++19 139. Interfaccia di Dev-C++Men e toolbarEditor programmasorgente Messaggi errore 20 140. Menu principali 21 141. Compilare il primo programma 142. Codifica del programmaA partire dal diagramma di flussoUtilizziamo un editor per immettere le istruzioni CCreiamo un file sorgente somma.cScrittura somma.c programmaProgramma sorgente in C23 143. Codifica Somma due numeriCodifichiamo il programma in Dev-C++ somma.c 24 144. Soluzione proposta (1/2)#include #include somma.cint main(void void) void{int a, b ; /* addendi */int c ; /* somma *//* LEGGI GLI ADDENDI A E B */printf("Somma due numerinn") ;printf("Immetti il primo numero: ") ;scanf("%d", &a) ;printf("Immetti il secondo numero: ") ;scanf("%d", &b) ;25 145. Soluzione proposta (2/2) somma.c/* CALCOLA LA SOMMA */c = a + b ;/* STAMPA IL RISULTATO C */printf("La somma di %d + %d vale: %dn", a, b, c) ;} 26 146. Compilare il primo programma 147. Compilazione del programmaAttivare il compilatoresul programmasomma.csorgente somma.c Programmasorgente in CIl compilatore verificache non ci sianoerrori di sintassiCompilatore CIn assenza di errori,viene generato ilsomma.exe Programmaprogramma eseguibileeseguibilesomma.exe 28 148. Correzione errori di sintassiIl compilatore generauna lista di messaggi di somma.cProgrammaerrore sorgente in CCapire il messaggioIdentificare il puntoCompilatore Cerrato nel programmaTrovare la soluzioneCorreggere ilLista degli erroriprogrammaGenerare una nuovaversione del file 29sorgente 149. Compilazione Somma due numeriCompiliamo il programmasomma.c30 150. Compilare il primo programma 151. Verifica del programmaCi mettiamo nei panni dellutente finaleEseguiamo il programmaVerifichiamo che funzioni correttamente Nei casi normali Nei casi limitesomma.exeProgramma eseguibileVisualizzazioneImmissione dati 32risultati 152. Errori in esecuzioneTipologie di errori possibili: Crash del programma Blocco imposto dal sistema operativo Blocco del programma Ciclo infinito Risultati errati (Quasi) sempre Solo in alcuni casi (con alcuni dati ma non con altri)33 153. Correzione errori di esecuzioneLavoro da detectiveRisalire dai sintomi alle cause delmalfunzionamentoFormulare delle ipotesi sulla causa dellerrore everificarleUna volta trovato lerrore, cercare una soluzioneA seconda della gravit, occorrer modificare Il sorgente C Lalgoritmo risolutivo Lapproccio generale34 154. Correzione errori di esecuzionesomma.c Programmasorgente in CCompilatore Csomma.exe Programmaeseguibile VisualizzazioneImmissione dati risultati 35 155. Verifica Somma due numeriEseguiamo il programma con alcuni dati di prova,verificandone il comportamento corretto 36 156. Primo programma in C 157. Esercizi propostiEsercizio Equazione di primo gradoEsercizio Calcolo di areeEsercizio Somma minuti 2 158. Esercizi proposti 159. Esercizio Equazione di primo gradoData lequazione ax+b=0con a e b inseriti da tastiera, determinare ilvalore di x che risolve lequazione 4 160. AnalisiEQUAZIONE DI PRIMO GRADOa x + b = 0Inserisci il valore di a: 2.5Inserisci il valore di b: 3.2La soluzione dellequazione e:x = -1.280000 5 161. Soluzioneprimogrado.cleggi acalcolax = b/aleggi bstampa x6 162. Esercizi proposti 163. Esercizio Calcolo di areeSi scriva un programma in linguaggio C che, datoun numero reale immesso da tastiera, detto D,calcoli e stampi: Larea del quadrato di lato D Larea del cerchio di diametro D Larea del triangolo equilatero di lato D 8 164. AnalisiCALCOLO DI AREEImmetti il valore di D: 2Le aree calcolate sono:Quadrato di lato 2.000000 = 4.000000Cerchio di diametro 2.000000 = 3.140000Triangolo eq. di lato 2.000000 = 1.732051 9 165. AreeDDA= D 2 aree.cRDD DH 10D 166. AreeDDA= D 2 aree.cR A = R2R=DD2D DH 11D 167. AreeDDA= D 2 aree.cR A = R2R=DD2DHA=D D 2H H = D sin (60) =D = D sin ( 3)= D 3 2 12 168. AvvertenzePer le funzioni matematiche (sin, sqrt, ...)occorre includere math.hGli argomenti delle funzioni trigonometriche(sin, cos, ...) devono essere espressi in radiantiIl calcolo del quadrato si ottiene moltiplicando lavariabile per se stessa: D2 = D DIl valore di deve essere definito dalprogrammatore in unapposita variabile La costante M_PI, definita in math.h, non pi supportata dallo standard ANSI C 13 169. Esercizi proposti 170. Esercizio Somma minuti (1/2)Un consulente deve calcolare il numero di ore eminuti per cui ha lavorato per un clienteIl consulente ha lavorato in due distinte sessionidi lavoro, per ciascuna delle quali ha annotato ilnumero di ore e il numero di minuti impiegati 15 171. Esercizio Somma minuti (2/2)Si scriva un programma in C che, a partire dalleore e minuti della prima sessione di lavoro e dalleore e minuti della seconda sessione di lavoro,calcoli il numero di ore e minuti complessivi16 172. AnalisiSOMMA MINUTISessione di lavoro 1:Numero di ore: 2Numero di minuti: 45Sessione di lavoro 2:Numero di ore: 1Numero di minuti: 30Tempo totale: 4 ore e 15 minuti 17 173. Aritmetica dellorologioDiciamo: ore1, min1 le ore/minuti della prima sessione ore2, min2 le ore/minuti della seconda sessione oretot, mintot le ore/minuti totaliNon possibile semplicemente sommare ore eminuti separatamente, in quanto min1+min2potrebbe essere maggiore di 59Bisogna tener conto del riporto nella somma deiminuti 18 174. Soluzionemintot = (min1 + min2) modulo 60oretot = ore1 + ore2 + riporto minuti.criporto = parte intera di (min1 + min2) / 6019 175. Soluzionemintot = (min1 + min2) modulo 60oretot = ore1 + ore2 + riporto minuti.criporto = parte intera di (min1 + min2) / 60int ore1, ore2, oretot ;int min1, min2, mintot, riporto ;...mintot = (min1 + min2) % 60 ;riporto = (min1 + min2) / 60 ;oretot = ore1 + ore2 + riporto ;20 176. Primo programma in C 177. Argomenti trattatiPresentazione del linguaggio CStruttura base di un file sorgente in CIstruzioni minime per iniziare a programmare Tipi fondamentali int e float Istruzioni fondamentali di input/output Istruzione di assegnazioneOperazioni necessarie per compilare ed eseguireil programma2 178. SuggerimentiAnalizzare sempre il comportamento previsto delprogramma prima di iniziare a scrivere il sorgente Interazione con lutente Risoluzione manuale con carta e pennaAbbondare con i commentiLeggere con attenzione tutti i messaggi di erroree di warning del compilatore, e correggerliVerificare il programma con diversi dati di prova3 179. Materiale aggiuntivoSul CD-ROM Testi e soluzioni degli esercizi trattati nei lucidi Scheda sintetica Esercizi risolti Esercizi propostiEsercizi proposti da altri libri di testo4 180. Programmazione in C 181. Scelte ed alternativeIl controllo di flussoIstruzione if-elseCondizioni complesseIstruzioni if-else annidateIstruzione switchEsercizi propostiSommario 2 182. Riferimenti al materialeTesti Kernighan & Ritchie: capitolo 3 Cabodi, Quer, Sonza Reorda: capitoli 2, 4 Dietel & Dietel: capitoli 2, 3Dispense Scheda: Istruzioni di scelta in C 3 183. Scelte ed alternative 184. Il controllo di flussoConcetto di flusso e di sceltaRappresentazione graficaCondizioni booleane sempliciEsempio 5 185. Il controllo di flusso 186. Flusso di esecuzione lineareIl programma C vieneeseguito, di norma dalla Aprima istruzioneallultimaIl flusso di esecuzione Bquindi normalmente ditipo lineare Cistruzione_A ;istruzione_B ;istruzione_C ; Distruzione_D ; 7 187. EccezioniIn taluni casi il flusso di esecuzione deve variare: in funzione del valore di qualche variabile di ingresso, occorre fare operazioni diverse una certa operazione deve essere ripetuta pi volte alcune parti del programma vengono attivate solo se lutente lo richiede ...In tal caso, il flusso di esecuzione non segue piesattamente lordine di scrittura delle istruzioninel codice sorgente 8 188. ScelteIl tipo pi semplice di flusso non lineare costituito dalle scelte (o alternative) Se il voto minore di 18, allora prenota il prossimo appello, altrimenti vai in vacanza. Se il voto maggiore di 28, prenota il ristorante.9 189. Anatomia di una sceltaUna condizione di scelta caratterizzata da treinformazioni: la condizione che determina la scelta (il voto minore di 18) le operazioni da svolgere qualora la condizione sia vera (prenota il prossimo appello) le operazioni da svolgere qualora la condizione sia falsa (vai in vacanza)Le operazioni potrebbero anche essere assenti10 190. Il controllo di flusso 191. Notazione graficaV FCA B 12 192. Notazione graficaRamo vero CondizioneV FRamo falsoCA BTermine della alternativa (ricongiunzione)13 193. Flussi di esecuzioneV F V FC CA B A B14 194. Flussi di esecuzioneCondizione veraV FIstruzioni V FCeseguite CIstruzioniA B A B non eseguite15 195. Flussi di esecuzioneCondizione falsaV FIstruzioni V FCeseguite CAIstruzioniB A Bnon eseguite16 196. Il controllo di flusso 197. Il concetto di condizioneChe tipo di espressioni si utilizzano per esprimerela condizione C ? devono dare una risposta univocaVeroFalso sono basate sui valori delle variabili del programmaLe espressioni di questo tipo sono dette booleanein quando generano dei valori che rispettano leleggi della logica di Boole (Vero o Falso)18 198. Condizioni di confronto sempliciSpesso le condizioni sono espresse sotto forma diconfrontiConfronto di uguaglianza Uguale DiversoConfronto di ordine Maggiore Minore Maggiore o uguale Minore o uguale19 199. Il controllo di flusso 200. Equazioni di primo gradoAnalizziamo il flusso di esecuzione di unprogramma in grado di risolvere le equazioni diprimo grado:Data lequazione ax+b=0con a e b inseriti da tastiera, determinare ilvalore di x che risolve lequazione21 201. Equazione risolutivaDai corsi di matematica sappiamo che lasoluzione dellequazione: ax+b=0si pu esprimere mediante la formula: x=b/aTale formula valida solo se a0Il programma dovr comportarsi in modo diversoa seconda che a sia nullo o no 22 202. Soluzioneleggi aVF a0?leggi b calcolax = b/astampaerrorestampa x 23 203. Scelte ed alternative 204. if-Istruzione if-elseSintassi dellistruzioneOperatori di confrontoEsercizio proposto di esempioRisoluzione esercizio (parte I)Esecuzione del programmaCompletamento esercizioRisoluzione esercizio (parte II) 2 205. if-Istruzione if-else 206. Istruzioni di scelta in CLoperazione di scelta avviene mediantelistruzione if-elseLe condizioni di scelta possono essere semplici odelaborateLe scelte possono essere liberamente combinatetra loro, annidateIn alcuni casi si pu usare listruzione switch(trattata nella lezione Istruzione switch) 4 207. if- Istruzione if-elseif ( C ){ V FA ;C}else{A BB ;} 5 208. if-Istruzione if-else Condizioneif ( C ){ Ramo veroV FA ; C}else Ramo falso{ A BB ;}6 209. Condizione veraCondizione veraif ( C ){ Istruzionieseguite V FA ;C}else{ Istruzioninon eseguite A BB ;} 7 210. Condizione falsa Condizione falsaif ( C ){Istruzioni non eseguite V FA ; C}else{Istruzioni eseguite A BB ;}8 211. Esempioint a, b ; es-posneg.cprintf("Immetti un numero: ");printfscanf("%d", &a) ;scanfif ( a > 0 ){ printf("positivon") ; printf b = a ;}else{ printf("negativon") ; printf b = -a ;}printf("Il valore assoluto di %d e %d", a, b) ;printf9 212. SuggerimentoAd ogni nuova parentesi graffa aperta {, inseriredegli spazi aggiuntivi ad inizio rigaTale tecnica, detta indentazione, permette unamigliore leggibilit del codice visivamente immediato riconoscere linizio e lafine dei blocchi di istruzioniMolti ambienti di sviluppo hanno funzioni diindentazione automatica o semi-automatica10 213. Note La condizione C pu essere semplice oif ( C ) complessa{Il blocco A pu essereA ;composto da una sola}istruzione, o da pielse istruzioni{Il blocco B pu essereB ;composto da una sola}istruzione, o da pi istruzioni11 214. Caso particolare: istruzione ifV Fif ( C )C{A ;} AManca la condizione else12 215. Esempioes-valabs.cint a ;printf("Immetti un numero: ");printfscanf("%d", &a) ;scanfif ( a < 0 ){ /* negativo, gli cambio segno */ a = -a ;}printf("Il valore assoluto e %d", a) ;printf13 216. Caso particolare: parentesi graffeif ( C )Se il blocco A A ;composto da una solaelseistruzione, allora le{ parentesi graffe relative B ;si possono omettere.} Lo stesso vale per ilblocco B.if ( C ){ A ;if ( C )}A ;elseelse B ; B ;14 217. Esempioes-valabs2.cint a ;printf("Immetti un numero: ");printfscanf("%d", &a) ;scanfif ( a < 0 ) /* negativo, gli cambio segno */ a = -a ;printf("Il valore assoluto e %d", a) ;printf15 218. Errore frequente errato mettere ilsimbolo di punto-e- if ( a > 0 ) ;virgola ; dopoa = -a ;listruzione ifviene interpretato come forma correttaif ( a > 0 )if ( a > 0 )/*nulla*/ ;a = -a ;a = -a ; 16 219. Errore frequente errato fidarsi dellaif ( a > 0 ) sola indentazione printf("neg"); printf a = -a ;viene interpretato comeforma corretta if ( a > 0 )if ( a > 0 ) { printf("neg"); printfprintf("neg");printfa = -a ;a = -a ; }17 220. SuggerimentoAnche se vi una sola istruzione nel bloccovero o nel blocco falso, utilizzare sempre leparentesi graffeIn tal modo il programma sar pi leggibile, esar pi facile aggiungere eventuali nuoveistruzioni senza incappare in errori18 221. if-Istruzione if-else 222. Le condizioniLa condizione C solitamente basata suunoperazione di confronto determinare se una variabile uguale o meno a zero, o a un altro valore costante determinare se una variabile uguale ad unaltra variabile, o diversa, o maggiore, o minore, ... determinare se una espressione, calcolata a partire da una o pi variabili, uguale, diversa, maggiore, minore, ... di una costante, o una variabile, o unaltra espressione 20 223. Operatori di confronto in CUguaglianzaUguale:a == bDiverso: a != bOrdineMaggiore:a > bMinore:a < bMaggiore o uguale: a >= bMinore o uguale: a 3 ) ...if( x*y != y*x ) ...if( a/2 == (a+1)/2 ) ...22 225. Esempiif( a == 0 ) ...if( a == b ) ...if( a < 0 ) ...if( a+b > 3 ) ...if( x*y != y*x ) ...if( a/2 == (a+1)/2 ) ...23 226. Esempiif( a == 0 ) ...if( a == b ) ...if( a < 0 ) ...if( a+b > 3 ) ...if( x*y != y*x ) ...if( a/2 == (a+1)/2 ) ...24 227. Esempiif( a == 0 ) ...if( a == b ) ...if( a < 0 ) ...if( a+b > 3 ) ...if( x*y != y*x ) ...if( a/2 == (a+1)/2 ) ...25 228. Esempiif( a == 0 ) ...if( a == b ) ...if( a < 0 ) ...if( a+b > 3 ) ...if( x*y != y*x ) ...if( a/2 == (a+1)/2 ) ...26 229. Esempiif( a == 0 ) ...if( a == b ) ...if( a < 0 ) ...if( a+b > 3 ) ...if( x*y != y*x ) ...if( a/2 == (a+1)/2 ) ...27 230. Errore frequenteConfondere loperatore/* assegnazione */di assegnazione = con a = b + c ;loperatore diconfronto ==/* confronto */Regola pratica: leif ( a == b+c )...parentesi tonderichiedono ==Regola pratica: il punto- /* assegnazione */e-virgola richiede =a == b + c ;/* confronto */if ( a = b+c )...28 231. if-Istruzione if-else 232. Esercizio Controlla A e BSi scriva un programma in linguaggio C che leggadue numeri da tastiera, detti A e B, e determini leseguenti informazioni, stampandole a video: determini se B un numero positivo o negativo determini se A un numero pari o dispari calcoli il valore di A+B determini quale scelta dei segni nellespressione (A) + (B) porta al risultato massimo, e quale questo valore massimo. 30 233. Struttura generaleLeggi A e BControlla il segno di B Stampa il messaggio opportunoControlla la parit di A Stampa il messaggio opportunoCalcola A+B Stampa il risultato...lultimo punto pi difficile ...ci pensiamo dopo!31 234. Lettura dei datiLeggi A e Bint a, b ;printf("Immetti A");printfscanf("%d", &a) ;scanfprintf("Immetti B");printfscanf("%d", &b) ;scanf 32 235. Controllo del segnoControlla il segno di B Stampa il messaggio opportuno if( if b > 0 ) {printf("B e positivon");printf } else {printf("B e negativo o nullon");printf } 33 236. Controllo della paritControlla la parit di A Stampa il messaggio opportuno if( if a pari ) {printf("A e parin");printf } else {printf("A e disparin");printf } 34 237. Numero pariCome determinare se un numero pari?Calcoliamo la divisione per 2, e controlliamo ilresto Se il resto della divisione per 2 vale 0, allora il numero pari Se il resto della divisione per 2 vale 1, allora il numero dispariIl calcolo del resto si ottiene con loperatore %if(if a pari ) if(if (a % 2) == 0 ) 35 238. if-Istruzione if-else 239. Risoluzione esercizio Controlla A e BRisolviamo interattivamente leserciziocontrolla-ab-v1.c 37 240. if-Istruzione if-else 241. Verifica esercizio Controlla A e BCompiliamo il programmaEseguiamolo con alcuni dati di prova,verificandone il comportamento corretto39 242. if-Istruzione if-else 243. Completamento esercizio Controlla A e BAbbiamo verificato il corretto funzionamentoRimane da implementare il punto: determini quale scelta dei segni nellespressione (A) + (B) porta al risultato massimo, e quale questo valore massimo.Appaiono possibili diverse strategie: Calcolare le 4 combinazioni e scegliere il massimo Riscrivere algebricamente lespressione41 244. Strategia 1La prima strategia prevede di calcolare: R1 = (+A) + (+B) R2 = (+A) + (B) R3 = (A) + (+B) R4 = (A) + (B)Dopo avere calcolato queste 4 variabili, occorreconfrontarle per determinare quale maggiore ditutte le altre.In questo caso inutilmente macchinoso. 42 245. Strategia 2Ragionando algebricamente, la massima sommache si pu ottenere dallespressione (A) + (B)sar quando A positivo B positivoIn altre parole, sufficiente calcolare la sommadei valori assoluti |A| + |B|43 246. Valore assolutoIl valore assoluto di una variabile pari a il valore dellopposto della variabilese la variabile negativa il valore della variabile stessase la variabile positiva44 247. Valore assolutoIl valore assoluto di una variabile pari a il valore dellopposto della variabilese la variabile negativa il valore della variabile stessase la variabile positiva if( if ab) 8 259. Contesto di utilizzoSolitamente gli operatori booleani && || ! siutilizzano allinterno della condizionedellistruzione if, per costruire condizionicomplesse Pi avanti vedremo come si usano anche nella condizione del costrutto whileTali operatori lavorano su operandi chesolitamente sono: Condizioni semplici (es. (a>b)||(a!=1)) Risultati di altri operatori booleani (es. ((a>b)&&(b>c))||(c==0))9 260. Precedenza degli operatoriQuando pi operatori booleani e di confrontosono presenti nella stessa espressione, vengonovalutati come segue: Prima gli operatori di confronto==!= > < >= 0 && b>0 ) 11 262. Esempiif ( a>0 && b>0 ) if ( a0 )if ( a0) )13 264. Esempiif ( a>0 && b>0 ) if ( a0 ) if ( a=a && x0 && b>0 ) if ( a=a && x0 && b>0 ) if ( a=a && x0 && b>0 ) if ( a=a && x0 && b>0 ) if ( a=a && x=a) && (x>=a) && (x=a && x>=a && x=a) && (x>=a) && (x b) &&formaif ( a > b > 0 ) (b > 0) corretta )if ( (a == b) &&formaif ( a==b==c ) (b == c) corretta ) 21 272. Errore frequente errato sottintendere parte di un confronto Esempio: se a o b sono diversi da unoformaif ( a || b != 1 ) correttaif ( (a!=1) || (b!=1) )formaif ( (a||b) != 1 ) corretta 22 273. Condizioni complesse 274. Esercizio Classificazione triangolo 1Si scriva un programma in linguaggio C che leggada tastiera i valori delle lunghezze dei tre lati diun triangolo (detti A, B e C), e determini: se il triangolo equilatero se il triangolo isoscele se il triangolo scaleno se il triangolo rettangoloNota: si assuma, per il momento, che i valori A,B, C descrivano correttamente un triangolo 24 275. Analisi del problemaRicordiamo le condizioni matematiche relative allaclassificazione dei triangoli: Equilatero: le lunghezze dei tre lati A, B, C sono uguali tra loro Isoscele: le lunghezze di [almeno] due dei tre lati A, B, C sono uguali tra loroogni triangolo equilatero anche isoscele Scaleno: le lunghezze dei tre lati A, B, C sono tutte diverse tra loro Rettangolo: possiede un angolo rettovale il teorema di Pitagora 25 276. Espressioni matematiche (I)Equilatero A=B=C (A = B) AND (B = C) AND (A = C) (A = B) AND (B = C)Isoscele (A = B) OR (B = C) OR (A = C)Scaleno (A B) AND (A C) AND (B C)26 277. Espressioni matematiche (II)Rettangolo Teorema di PitagoraIpotenusa2 = Cateto2 + Cateto2 Lipotenusa pu essere uno qualunque dei lati A, B oppure C (A2 = B2+C2) OR (B2 = A2+C2) OR (C2 = A2+B2)27 278. Condizioni in CEquilatero a==b && b==cIsoscele a==b || b==c || a==cScaleno a!=b && b!=c && a!=cRettangolo (a*a == b*b + c*c) || (b*b == a*a + c*c) || (c*c == a*a + b*b)28 279. Condizioni complesse 280. Verifica Classificazione triangolo 1Analizziamo il codice dellesercizio everifichiamone il corretto funzionamento triangolo.c 30 281. Scelte ed alternative 282. if-Istruzioni if-else annidateAnnidamento di istruzioni if-elseOpzionalit del ramo elseCatene if-else if-...-elseEsercizio propostoVerifica della soluzione2 283. if-Istruzioni if-else annidate 284. Scelte annidateNelle istruzioni del VFblocco vero o delC1blocco else, A1possibile inserire altriblocchi di sceltaV FBC2In tal caso la secondascelta risulta annidataA2A3allinterno della primaA44 285. Caso 1C1 vero, C2 veroVF Istruzioni eseguite: C1 A1, A2, A4 A1V FB C2A2A3 A4 5 286. Caso 2C1 vero, C2 veroVF Istruzioni eseguite: C1 A1, A2, A4 A1C1 vero, C2 falsoV FB Istruzioni eseguite:C2 A1, A3, A4A2A3 A4 6 287. Caso 3C1 vero, C2 veroVF Istruzioni eseguite: C1 A1, A2, A4 A1C1 vero, C2 falsoV FB Istruzioni eseguite:C2 A1, A3, A4C1 falso, C2A2A3indifferente Istruzioni eseguite: B A4 7 288. Corretto annidamentoLintero blocco di VFscelta pi interno C1(dalla condizione finoA1al ricongiungimento)deve essereV FBC2completamentecontenuto allinternoA2A3di uno dei rami delblocco pi esternoA48 289. Sintassi Cif ( C1 ){ A1 ;V F C1 if ( C2 ) {A1A2 ; } V F B elseC2 {A3 ; A2A3 } A4 ;} A4else{ B ; 9} 290. Sintassi Cif ( C1 ){ A ; VF C1}elseB1{ B1 ;AVFC2 if ( C2 ) {B2 ;B2 B3 } else {B4B3 ; } B4 ;10} 291. Caso generaleVFC1 A1B1V FVF C2C3A2A3 B2 B3 A4B411 292. Sintassi Cif ( C1 )else{{V FC1 A1 ; B1 ; if ( C2 )if ( C3 )A1 B1 {{V F VFA2 ; B2 ;C2 C3 }} else elseA2A3 B2B3 {{A3 ; B3 ; }}A4 B4 A4 ; B4 ;}} 12 293. Sintassi CUnistruzione if pu comparire ovunque anche allinterno del blocco vero o falso di unaltra istruzione ifOccorre garantire il corretto annidamento delleistruzioni le istruzioni annidate vanno completamente contenute tra le parentesi graffe {...}13 294. EsempioRicordiamo lesercizio sullalgoritmo risolutivodelle equazioni di primo grado ax+b=0La soluzione : x=b/asolo se a0 14 295. Soluzione (parziale)leggi aVF a0?leggi b calcolax = b/astampaerrorestampa x 15 296. EsempioRicordiamo lesercizio sullalgoritmo risolutivodelle equazioni di primo grado ax+b=0La soluzione : x=b/asolo se a0 x = indeterminato (infinite soluzioni)se a=0 e b=0 x = impossibile (nessuna soluzione)se a=0 e b0 16 297. Soluzione (completa)leggi aV F a0?leggi bb=0?V F calcolax = b/a stampa stampa indeterminata impossibilestampa x17 298. Soluzione in C (1/2)#include #include primogrado.cint main(void void) void{float a, b ;float x ; printf("Risoluzione eq. di primo gradon"); printf("Equazione: a x + b = 0n") ; /* Leggi A e B */ printf("Immetti coefficiente a: "); scanf("%f", &a) ; printf("Immetti coefficiente b: "); scanf("%f", &b) ;18 299. Soluzione in C (2/2)if( a != 0 )if{x = - b / a ;printf("La soluzione e x = %fn", x) ;}else{if(if b==0 ){printf("Equazione indeterminatan");}else{printf("Equazione impossibilen");}}}19 300. if-Istruzioni if-else annidate 301. Forme abbreviateRicordiamo che: Se il ramo vero oppure il ramo falso composto da una sola istruzione, allora le parentesi graffe {...} sono opzionali Se il ramo falso non contiene istruzioni, allora la clausola else si pu omettereNel contesto di if annidati, queste regolepossono creare una potenziale ambiguit 21 302. Esempioif(if a>0 ){c = a ;}elseif(if a>0 ){ c = a ;if( b>0 )if{ = elseif(if b>0 )c = b ; c = b ;} elseelsec = 0 ;{c = 0 ;}}22 303. Esempio problematico if( if a>0 ) if( if b>0 ) c = a + b ; else c = 0 ;if(if a>0 )if(if b>0 )c = a + b ;else?c = 0 ; if( if a>0 ) if( if b>0 ) c = a + b ; else c = 0 ; 23 304. RegolaOgni clausola else, in assenza di parentesigraffe che ne esplicitino lattribuzione, daintendersi riferita allistruzione if pi vicina (perla quale non sia ancora stata attribuita unaclausola else)if(if a>0 )if(if a>0 ){if(if b>0 )if(if b>0 )c = a + b ; c = a + b ;elseelsec = 0 ; c = 0 ;}24 305. Suggerimento In presenza di if annidate, conveniente abbondare con le parentesi graffe if( if a>0 ) if( if b>0 ) c = a + b ; else c = 0 ;if(if a>0 ) if( if a>0 ){{if b>0 )if(if( if b>0 )c = a + b ;c = a + b ;}elseelse c = 0 ;c = 0 ;}25 306. if-Istruzioni if-else annidate 307. Catene di istruzioni condizionaliTalvolta occorre verificare, in sequenza, una seriedi condizioni particolari, trovando la primacondizione vera tra quelle possibiliEsempio: Dato un numero intero tra 1 e 12, che rappresenta il mese corrente, stampare il nome del mese per esteso (Gennaio ... Dicembre) 27 308. Soluzioneif( mese == 1 )ifprintf("Gennaion") ;else{ mesi.cif(if mese == 2 )printf("Febbraion") ;else{if(if mese == 3 )printf("Marzon") ;else{if(if mese == 4 )printf("Aprilen") ;else{....... /* continua fino a 12 */}}} 28} 309. Analisi della soluzioneif(if( mese == 1 )printf("Gennaio ("Gennaioprintf("Gennaion") ;else{if( mese == 2 ) if(else printf("Febbraio ("Febbraio printf("Febbraion") ;Annidamento{ if( if( mese == 3 ) else { printf("Marzo ("Marzo printf("Marzon") ;eccessivo if( if( mese == 4 )Scarsa leggibilit printf("Aprile printf("Aprilen") ; ("Aprile else { if( if( mese == 5 ) printf("Maggio ("Maggio printf("Maggion") ; elseDifficile identificazione { if( mese == 6 ) if( printf("Giugno ("Giugno printf("Giugnon") ; else {delle {...} if( if( mese == 7 ) printf("Luglio printf("Luglion") ; ("Luglio else { if( if( mese == 8 ) else { printf("Agosto if(("Agosto printf("Agoston") ; if( mese == 9 ) printf("Settembren") ;printf("Settembre("Settembrecorrispondenti else { if( if( mese == 10 )printf("Ottobre("Ottobreprintf("Ottobren") ; else {if(if( mese == 11 )else{printf("Novembreif(("Novembreprintf("Novembren") ;if( mese == 12 )Esistono formattazioniprintf("Dicembre ("Dicembreprintf("Dicembren") ; }}elseprintf("MESE ERRATO!printf("MESE ERRATO!n") ;migliori? } } } } } } }}} 29 310. Soluzione pi leggibileif( mese == 1 )ifprintf("Gennaion") ;else if( mese == 2 ) ifprintf("Febbraion") ; mesi2.celse if mese == 3 ) if(printf("Marzon") ;else if mese == 4 ) if(printf("Aprilen") ;else if mese == 5 ) if(printf("Maggion") ;............................else if mese == 9 ) if(printf("Settembren") ;else if mese == 10 ) if(printf("Ottobren") ;else if mese == 11 ) if(printf("Novembren") ;else if mese == 12 ) if(printf("Dicembren") ;else 30printf("MESE ERRATO!n") ; 311. In generale...In ogni ramo falso cif ( C1 )una sola istruzione:{A1 ;la if-else annidata } anche se a sua volta else if ( C2 ){ contiene altre istruzioni, A2 ; comunque considerata } una sola istruzioneelse if ( C3 ){ possibile omettere le A3 ;}parentesi nel ramo else ..........else conveniente rimuovere {lindentazioneAn ;}Ricordarsi dellelse finale 31 312. if-Istruzioni if-else annidate 313. Esercizio Classificazione triangolo 2Si scriva un programma in linguaggio C che leggada tastiera i valori delle lunghezze dei tre lati diun triangolo (detti A, B e C), e determini: se il triangolo equilatero se il triangolo isoscele se il triangolo scaleno se il triangolo rettangoloIl programma, prima di classificare il triangolo,controlli se i numeri A, B, C rappresentanocorrettamente un triangolo33 314. AnalisiData una terna di numeri A, B, C, non dettoche si possa costruire un triangolo con talilunghezze dei latiLa lunghezza di ciascun lato deve essere unnumero positivoOgni lato deve essere minore della somma deglialtri dueOgni lato deve essere maggiore della differenzadegli altri dueABCB? AC 34 315. Struttura propostaif (i lati non sono positivi){printf("errore") ;}else if (ogni lato non minore della somma degli altri){printf("errore") ;}else if (ogni lato non maggiore della differenza degli altri){printf("errore") ;}else{/* caso normale */...vedi triangolo.c}35 316. Condizioni booleanei lati non sono positivi a=a+bogni lato non maggiore della differenza deglialtri attenzione: la differenza va presa in valore assoluto! prima di calcolare A-B, occorre verificare che A>B, altrimenti bisogna calcolare B-A 36 317. Condizioni booleane (2)ogni lato non maggiore della differenza deglialtri ( (b>c)&& a C ...11max3-and.c 357. Esercizi proposti 358. Esercizio Equazione di secondo gradoData lequazione a x2 + b x + c = 0con a, b e c inseriti da tastiera, determinare ilvalore (o i valori) di x che risolvono lequazione 13 359. AnalisiRicordiamo la formularisolutiva per le b b 2 4acx1, 2 =equazioni di secondo2agradoLa quantit sottoradice il = b 2 4acdiscriminante Vi sono vari casipossibili se a0 o a=0 se >0, =0 o 0distinte 2aa0Due soluzioni reali b x1 = x2 ==0coincidenti 2aa0Due soluzioni x1, 2 = R iC complesse coniugate0 ) { /* n corretto... procedi! */....vedi lucido seguente.... } else { /* n errato in quanto e n dato[j]6631i>j7-18 84 97 N=1024 620. Errore frequenteNon si pu 035effettuare alcuna17 datooperazione sul 214vettore332 dato = 04 -9 printf(%d,52 dato) 6631Occorre operare sui7-18singoli elementi 84 Solitamente 97 allinterno di un ciclo for N=1025 621. Vettori 622. I vettori in CSintassi della definizioneDefinizione di costantiOperazioni di accesso 2 623. I vettori in C 624. Definizione di vettori in C int dato[10] ;Tipo di dato Nome del Numero di base vettoreelementi 4 625. Definizione di vettori in Cint dato[10] ;Tipo di dato Nome del Numero di base vettoreelementi Stesse regole che valgono per ii Stesse regole che valgono pernomi delle variabili. nomi delle variabili. II nomi dei vettori devono essere nomi dei vettori devono esserediversi dai nomi delle variabili. diversi dai nomi delle variabili. 5 626. Definizione di vettori in C int dato[10] ;Tipo di datoNome delNumero di basevettore elementi int int float float In futuro vedremo: char, struct In futuro vedremo: char, struct6 627. Definizione di vettori in C int dato[10] ;Tipo di dato Nome delNumero di base vettore elementi Intero positivoIntero positivo Costante nota a tempo diCostante nota a tempo di compilazionecompilazione Impossibile cambiarla in seguito Impossibile cambiarla in seguito7 628. Esempiint dato[10] ;float lati[8] ;int numeriprimi[100] ;int is_primo[1000] ;8 629. Esempi0 1int dato[10] ;1 2float lati[8] ; 2 3int numeriprimi[100] ;3 54 7int is_primo[1000] ;511613717819923 1029 1131 1237 ... ...9 630. Esempi0 0int dato[10] ;1 1float lati[8] ; 2 1int numeriprimi[100] ;3 14 0int is_primo[1000] ;5 06 07 18 09 0 10 0 11 1 12 0 ... ... 10 631. Errore frequenteDichiarare un vettore usando una variabileanzich una costanteint N = 10 ;int dato[10] ;int dato[N] ; 11 632. Errore frequente Dichiarare un vettore usando una variabile non ancora inizializzataint N ;int dato[N] ;int dato[10] ;. . .scanf("%d",&N) ;12 633. Errore frequenteDichiarare un vettore usando il nome dellindiceint i ;int dato[i] ; int dato[10] ;. . .for(i=0; i=a && s[pos-1]=A && s[pos-1]=a && s[pos+lr]=A && s[pos+lr]_9 1309. La linea di comando (2/2) possibile passare dei parametri allattivazionedel programmaC:progr>quadrato 5C:progr>quadrato 5 K*****KKKKK*****KKKKK*****KKKKK*****KKKKK*****KKKKKC:progr>_ C:progr>_10 1310. NomenclaturaParametri sulla linea di comando Command line parametersArgomenti del programma Program argumentsParametri di attivazioneParametri del mainArgomenti del mainOpzioni [sulla linea di comando]11 1311. CaratteristicheNumero variabile di parametri Anche nessunoTipo variabile Numeri Caratteri o StringheIl chiamante (sistema operativo) non ha modo disapere quanti parametri servono al programman di che tipo Verranno trattati in modo standardizzato 12 1312. Standardizzazione dei parametriGli argomenti sulla linea di comando vengonotrattati come un vettore di stringheIl programma riceve Una copia del vettore di stringhe Un valore numerico che indica quante stringhe sono presenti 13 1313. EsempiC:progr>quadrato Numero argomenti = 0Numero argomenti = 1C:progr>quadrato 5Argomento 1 = 5Numero argomenti = 2C:progr>quadrato 5 K Argomento 1 = 5Argomento 2 = K14 1314. main()La funzione main() 1315. Parametri formali del main I parametri sulla linea di comando sono disponibili al main attraverso i suoi parametri formali La definizione completa della funzione main :int main(int argc, char *argv[]) ; int Argument count Argument values 16 1316. Il parametro argcint argcNumero di parametri sulla linea di comando Incrementato di uno, in quanto il nome del programma viene considerato come un parametroSe non vi sono argomenti effettivi, vale 1Se vi sono k argomenti effettivi, vale k+1 17 1317. Il parametro argvchar *argv[] un vettore di stringheOgni stringa un parametro del programmaVi sono argc diverse stringheLa prima stringa, argv[0], il nome delprogrammaLa seconda stringa, argv[1], il primoargomento (se esiste)Lultimo argomento in argv[argc-1]18 1318. Esempiargc==1C:progr>quadratoargv[0]=="quadrato"argc==2C:progr>quadrato 5 argv[0]=="quadrato"argv[1]=="5"argc==3argv[0]=="quadrato"C:progr>quadrato 5 Kargv[1]=="5"argv[2]=="K"19 1319. Per capire meglio...#include arg.cint main(int argc, char *argv[]) int{int i ;printf("argc = %dn", argc) ;for(i=0; iint main(int argc, char *argv[]) int{ . . . . . . . . . return 0 ;} 28 1328. La funzione exitEsiste inoltre la funzione di libreria exit,dichiarata in , che assolve allastessa funzione Interrompe lesecuzione del programma Ritorna il valore specificatoIl vantaggio rispetto allistruzione return chepu essere usata allinterno di qualsiasi funzione,non solo del mainvoid exit(int value) ;int29 1329. Esempio#include #include int main(int argc, char *argv[]) int{ . . . . . . . . . exit(0) ;} 30 1330. SuggerimentoRicordare sempre di ritornare un valoreMettere come ultima istruzione del main:exit(0);Per eventuali condizioni di errore (parametriassenti, valori illegali, ...) che non possano esserecorrette dal programma, restituire un valorepositivo: exit(1) ; Tali errori possono essere controllati dallinterno di qualsiasi funzione: la exit interrompe comunque lintero programma31 1331. main()La funzione main() 1332. Esercizio CalcolatriceSi scriva un programma da utilizzarsi comesemplice calcolatrice sulla linea di comandoIl programma, denominato calcola, accetta 3parametri sulla linea di comando Il primo ed il terzo parametro sono degli operandi, espressi come numeri reali Il secondo parametro un operatore, scelto tra +, -, * e /Il programma stampa il risultato corrispondentealloperazione 33 1333. Analisic:progr>calcola 3 + 2Risultato: 5.0000c:progr>calcola 3 * 2Risultato: 6.0000c:progr>calcola 3 $ 2Errore: operatore non riconosciutoc:progr>calcola 3 +Errore: operando mancante34 1334. Soluzione (1/5)calcola.c#include #include #include int main(int argc, char *argv[]) int{double v1, v2 ;char op[20] ;35 1335. Soluzione (2/5)if(argc!=4)if calcola.c{printf("Errore: numero parametriinsufficienten");exit(1) ;}v1 = atof(argv[1]) ;strcpy(op, argv[2]) ;v2 = atof(argv[3]) ; 36 1336. Soluzione (3/5)calcola.cif(strcmp(op, "+")==0)ifprintf("Risultato: %fn", v1 + v2 ) ; if(strcmp(op, "-")==0)else ifprintf("Risultato: %fn", v1 - v2 ) ; if(strcmp(op, "*")==0)else ifprintf("Risultato: %fn", v1 * v2 ) ;37 1337. Soluzione (4/5) calcola.cif(strcmp(op, "/")==0)else if{if(v2==0)if{ printf("Errore: divisione per zeron"); exit(2) ;}else printf("Risultato: %fn", v1 / v2 ) ;} 38 1338. Soluzione (5/5) calcola.celse{printf("Errore: operatorenon riconosciuton") ;exit(3) ;}exit(0) ;} 39 1339. Funzioni 1340. Esercizi propostiEsercizio Confronto tra dateEsercizio QuadratoEsercizio Indovina numero 2 1341. Esercizi proposti 1342. Esercizio Confronto tra dateSi scriva un programma che chieda allutente diinserire due date (giorno, mese, anno) edetermini: Se le date solo uguali Se la prima data precede la seconda Se la prima data segue la secondaIl programma dovr porre particolare attenzionea non accettare date non valide Esempio: 30/02/1984 Esempio: 10/14/20014 1343. AnalisiConfronto tra dateInserisci la PRIMA dataGiorno: 15Mese: 3Anno: 2007Inserisci la SECONDA dataGiorno: 26Mese: 4Anno: 1967La prima data 15/3/2007 SEGUEla seconda data 26/4/1967 5 1344. Controlli1 giorno 311 mese 121900 < anno < 2100Se mese = 4, 6, 9, 11, allora giorno 30Se mese = 2, allora giorno 29Se mese = 2 e lanno non bisestile, alloragiorno 28 Lanno bisestile se multiplo di 46 1345. SoluzioneScrivere una funzione per la lettura della data,che comprenda al suo interno tutti i controlli: void leggidata( int *giorno, int *mese, int *anno ) ;La funzione restituisce, nelle 3 variabili passateby reference, le componenti (giorno, mese, anno)della dataLa funzione garantisce che la data restituita corretta 7 1346. Programma principaleint main(void void) void{int g1, m1, a1 ;date.cint g2, m2, a2 ; printf("Confronto tra datenn") ; printf("Inserisci la PRIMA datan") ; leggidata( &g1, &m1, &a1 ) ; printf("Inserisci la SECONDA datan") ; leggidata( &g2, &m2, &a2 ) ; /* Confronto delle date *//* Confronto delle date */} /* main */ 8 1347. Confronto delle dateif(if g1 == g2 && m1 == m2 && a1 == a2 )printf("Le date sono ugualin") ;else if( a131)ifprintf("Giorno non validon");} while g31 ) ;while( 10 1349. Funzione leggidata (2/5)do {printf("Mese: ") ;scanf("%d", &m) ; date.cif(m12)ifprintf("Mese non validon");} while m12 ) ;while(do {printf("Anno: ") ;scanf("%d", &a) ;if ( a=2100 )printf("Anno non validon") ;} while a=2100 ) ;while( 11 1350. Funzione leggidata (3/5)ok = 1 ;if(if g>30 && (m==4 || m==6 || date.cm==9 || m==11) ){ok = 0 ;printf("Il mese %d non ""ha %d giornin", m, g);}else if ( g>29 && m==2 ){ok = 0 ;printf("Il mese %d non ""ha %d giornin", m, g);} 12 1351. Funzione leggidata (4/5) date.celse if ( g==29 && m==2 && a%4!=0 ){ok = 0 ;printf("Il mese %d non " "ha %d giorni perche " "lanno %d non e bisestilen", m, g, a);} 13 1352. Funzione leggidata (5/5)date.c} while ok==0 ) ;while(*giorno = g ;*mese = m ;*anno = a ; return ;} /* leggidata */ 14 1353. Esercizi proposti 1354. Esercizio Quadrato (1/2)Si scriva un programma, denominato quadrato,che stampi a video un quadrato composto dicaratteri tutti uguali.Il programma riceve due argomenti sulla linea dicomando: Il primo argomento indica la dimensione del quadrato (ossia il numero di righe e colonne di cui composto) Il secondo argomento indica il carattere di cui composto il quadrato 16 1355. Esercizio Quadrato (2/2)Gli argomenti sono opzionali: se il carattere vieneomesso, occorre stampare *. Se anche ladimensione viene omessa, si assuma pari a 317 1356. AnalisiC:progr>quadrato Quadrato 3x3 di *C:progr>quadrato 5 Quadrato 5x5 di *C:progr>quadrato 5 K Quadrato 5x5 di K18 1357. Dal punto di vista del main argc==1C:progr>quadrato argv[0]=="quadrato" argc==2C:progr>quadrato 5argv[0]=="quadrato" argv[1]=="5" argc==3 argv[0]=="quadrato"C:progr>quadrato 5 K argv[1]=="5" 19 argv[2]=="K" 1358. Soluzione (1/4)int main(int argc, char *argv[]) int quadrato.c{int dim ;char ch ;int i, j ;if (argc==1){dim = 3 ;ch = * ;}20 1359. Soluzione (2/4)quadrato.celse if (argc==2){ dim = atoi(argv[1]) ; if( if dim20 ) { printf("Dimens. non validan") ; exit(1) ; } ch = * ;} 21 1360. Soluzione (3/4)else if (argc==3){dim = atoi(argv[1]) ; quadrato.cif(if dim20 ){printf("Dimens. non validan");exit(1) ;}ch = argv[2][0] ;if(strlen(argv[2])!=1)if{printf("Carattere non validon");exit(1) ;}}22 1361. Soluzione (4/4)else{printf("Numero argomenti " quadrato.c "non validon") ;exit(1) ;}for(i=0; i100 ){printf("Numero segreto " "erraton") ;exit(1) ;}printf("INDOVINA IL NUMEROnn");27 1366. Soluzione (3/3)cont = 1 ;do {printf("Tentativo %d: ", cont );scanf("%d", &tent) ; segreto.cif( tent < segreto )ifprintf("Basso...n") ;else if (tent > segreto )printf("Alto...n") ;cont++ ;} while (tent != segreto) ;cont-- ;printf("Indovinato: %d tentativin", cont) ; 28 1367. Funzioni 1368. Argomenti trattatiDefinizione di funzioni in C Prototipo ImplementazionePassaggio di parametri alle funzioni By value By reference VettoriInterfaccia del main Parametri sulla linea di comando Valore di ritorno 2 1369. Tecniche di programmazioneDecomporre il programma in pi funzioni,implementando ciascuna individualmenteIdentificare le parti ripetitive e racchiuderle inapposite funzioniPermette il passaggio di parametri al programmaAnalizzare i parametri passati dallutente 3 1370. Materiale aggiuntivoSul CD-ROM Testi e soluzioni degli esercizi trattati nei lucidi Scheda sintetica Esercizi risolti Esercizi propostiEsercizi proposti da altri libri di testo4 1371. Programmazione in C 1372. I/O Avanzato e FileDefinizione di fileFile di testo in CInput robustoFormattazione avanzataEsercizi propostiSommario 2 1373. Riferimenti al materialeTesti Kernighan & Ritchie: capitolo 7, appendice B Cabodi, Quer, Sonza Reorda: capitoli 3, 8 Dietel & Dietel: capitoli 9, 11Dispense Scheda: I/O Avanzato in C Scheda: Gestione dei file in C3 1374. I/O Avanzato e File 1375. Definizione di fileDirectory e fileFile binari e file di testo 5 1376. Definizione di file 1377. Directory e fileTutti i sistemi operativi permettono di organizzarele informazioni su hard disk secondo la metaforadi cartelle (directory) e fileCartelleFile7 1378. DefinizioniFile: Una sequenza di byte Memorizzata su un disco Caratterizzata da uno specifico nome Contenuta allinterno di una specifica directoryDirectory: Un contenitore di file e di altre directory Caratterizzata da uno specifico nome Contenuta allinterno di unaltra directory8 1379. Identificazione di un filePer identificare un file occorre dunque conoscere: Il nome assegnato al file Il nome della directory in cui esso memorizzatoUna volta identificato un file, possibile accedereal suo contenuto Leggere la sequenza di byte di cui composto Modificare la sequenza di byte di cui composto01001001010010010101101001000101000101011010010100110010101000101101001010001010esercizio.exe C:prog 9 1380. Operazioni permesse sui fileOperazioni generiche Cancellazione di un file esistente Rinominazione di un file esistente Copia di un file, creando un nuovo file con lo stesso nome in una diversa directory Spostamento di un file, equivalente alla copia con cancellazione delloriginaleOperazioni specifiche Creazione di un nuovo file Modifica del contenuto del file10 1381. Operazioni generiche o specificheLe operazioni generiche sono solitamente svolteinteragendo con il sistema operativo, e sipossono applicare a qualsiasi fileLe operazioni specifiche invece coinvolgono ilcontenuto del file, pertanto richiedono programmispecifici per ogni tipologia di file 11 1382. File = Sequenza di byte 12 1383. Tipi di fileIl significato dei byte memorizzati allinterno deifile noto, solitamente, solamente al programmache lo ha creatoSi parla di tipi di file, che sono solitamenteindicati dallestensione (ultime lettere del nomedel file) File prodotto da Microsoft Powerpoint .ppt File prodotto da Microsoft Word .doc File prodotto da Openoffice.Org Writer .odt ... 13 1384. ConseguenzaNon possibile lavorare con file gestiti da altriprogrammi, a meno di non conoscere il formatodel fileEccezione: se il formato del file pubblicamentedocumentato, allora sar possibile leggerlo escriverlo interpretando correttamente i byte Esempio: file di testo (ASCII)La codifica ASCII utilizzata in molti campi: testi(.txt), programmi in C (.c), pagine HTML (.html), ... Esempio: file Acrobat (.pdf)Struttura molto complessa, ma documentata14 1385. Definizione di file 1386. Vista dinsieme dei formati di fileFile File binarioFile ASCII FormatoFormato TestoTesto Linguaggioproprietario standard puroformattato formale.doc.pdf .txt.html .c.psd.zip .csv .xml.xls.jpeg.rtf .java16 1387. Differenze operativeA livello di programmazione, esistono Funzioni generali per accedere ai file Funzioni specifiche per la lettura e la scrittura del contenuto di file binari Funzioni specifiche per la lettura e la scrittura del contenuto di file ASCIIIl corretto funzionamento di un programmadipende dalla perfetta conoscenza del formatodel file stesso 17 1388. Scelta operativaIn questo corso si tratteranno esclusivamente ifile ASCII Pi semplici da comprendere Facili da visualizzare e da creare con qualsiasi editor di testiNotepad o molte sue alternativeLambiente di sviluppo in CSi user indifferentemente la denominazione fileASCII o file di testo18 1389. File di testo puro19 1390. File di testo puro Serie di pi righe Ciascuna riga ha unnumero variabile dicaratteri Solitamente contengono deltesto libero (ad es., initaliano) Concetti di: carattere,parola, frase, riga20 1391. File di testo formattato (es: XML)21 1392. File di testo formattato (es: XML) Linguaggio di programmazione basato su tag Possibile annidamento dei tag Complesso da analizzare, richiede strutture dati avanzate22 1393. File di testo formattato (es: CSV)23 1394. File di testo formattato (es: CSV) Ogni riga un dato Ogni dato rappresentato da pi campi I campi sono separati da un carattere specifico (, o ;) I campi possono essere numerici o testuali Ragionevolmente semplice da analizzare, modificare e creare24 1395. File di testo formattato (custom) 25 1396. File di testo formattato (custom) Formato inventato ad hocper ciascun programmaspecifico Versione semplificata delCSV, dove il separatore lospazio e non vi sonovirgolette delimitatrici il pi semplice da gestire26 1397. I/O Avanzato e File 1398. File di testo in CAccesso ai fileFunzioni fopen/fcloseFunzioni fget*/fput*Funzioni fprintf/fscanfCondizione feof2 1399. File di testo in C 1400. Accesso ai file (1/4)Un programma C pu accedere ad alcuni filepresenti sui dischi del calcolatore File aperto: file al quale attualmente il programma ha accesso File chiuso: file residente su disco al quale attualmente il programma non ha accesso 4 1401. Accesso ai file (2/4)Allatto dellapertura di un file, il programma devedichiarare la modalit di accesso Modalit di lettura: il programma pu leggere il contenuto del file, ma non modificarlo Modalit di scrittura: il programma pu riscrivere da zero il contenuto del file Modalit di aggiunta: il programma pu aggiungere nuove informazioni al file Modalit di lettura/scrittura: tutte le precedentiI successivi accessi al file devono esserecompatibili con la modalit di accesso dichiarata5 1402. Accesso ai file (3/4)Laccesso ai file di testo rigorosamentesequenziale La lettura avviene dalla prima riga allultima, dal primo carattere allultimo In scrittura, ogni riga o carattere scritto vengono posizionati dopo le righe o caratteri scritti in precedenzaA partire dal primo carattere, in modalit di scritturaA partire dallultimo carattere esistente, in modalitdi aggiunta6 1403. Accesso ai file (4/4)Allatto dellapertura di un file, il programma devedichiarare se il file di tipo binario oppure ditesto La differenza consiste solamente nel trattamento speciale del carattere n nel caso dei file di testo In questo corso useremo sempre la modalit testuale7 1404. Stream associato ad un fileIn un programma C, esiste un tipo di datospecifico per rappresentare le informazionirelative ad un file aperto Denominato: file stream (flusso associato ad un file) Tipo di dato: FILE * (definito in )Aprire un file significa quindi creare un nuovostream ed associarlo ad uno specifico file suldisco 8 1405. Significato di streamUna volta che il file aperto, il suo streamrappresenta Un collegamento mediante il quale poter compiere delle operazioni sul contenuto del file Le modalit di accesso scelte (testo/binario, lettura/scrittura/...) La posizione attuale a cui si arrivati nello scrivere o nel leggere il fileOgni operazione sul file avviene chiamando unafunzione che riceve lo stream come parametro 9 1406. Stati di un file Directory Nome fileFile chiusoRisiede su disco,il programma non ha accessoal suo contenuto10 1407. Stati di un file DirectoryApertura del fileStream Nome filePosizione attuale Lettura / ScritturaTesto / Binario File apertoFile chiuso Risiede su disco,Risiede su disco,il programma hail programma accesso al suo non ha accessocontenutoal suo contenutoattraverso lo stream associato 11 1408. Stati di un file DirectoryApertura del fileStream Nome filePosizione attuale Lettura / ScritturaTesto / Binario File apertoFile chiuso Risiede su disco,Risiede su disco,il programma hail programma accesso al suo non ha accessocontenutoal suo contenutoattraverso lo stream associatoChiusura del file 12 1409. Lettura di un fileApertura del fileFile aperto inlettura Posizione iniziale (primo carattere)13 1410. Lettura di un fileApertura del file Leggi riga /Leggi carattereFile aperto inFile aperto inlettura lettura Posizione iniziale Posizione intermedia (primo carattere)(n-esimo carattere) 14 1411. Lettura di un fileApertura del file Leggi riga /Leggi carattereFile aperto inFile aperto inlettura lettura Posizione iniziale Posizione intermedia (primo carattere)(n-esimo carattere) 15 1412. Lettura di un file Apertura del fileLeggi riga /Leggi carattereFile aperto inFile aperto inlettura letturaPosizione inizialePosizione intermedia(primo carattere) (n-esimo carattere) Condizione File aperto in end-of-file letturaLeggi riga /Posizione finaleLeggi carattereChiusura del file(ultimo carattere) 16 1413. Scrittura di un fileApertura del file File aperto inscritturaPosizione iniziale(primo carattere) 17 1414. Scrittura di un fileApertura del file Scrivi riga / Scrivi carattere File aperto inscritturaPosizione iniziale(primo carattere)File aperto inscrittura Posizione intermedia (n-esimo carattere)18 1415. Scrittura di un fileApertura del file Scrivi riga / Scrivi carattere File aperto in Scrivi riga /Scrivi caratterescritturaPosizione iniziale(primo carattere)File aperto inscrittura Posizione intermedia (n-esimo carattere) 19 1416. Scrittura di un fileApertura del file Scrivi riga / Scrivi carattere File aperto in Scrivi riga /Scrivi caratterescritturaPosizione iniziale(primo carattere)File aperto inscritturaLa posizione intermediaPosizione intermediadiviene posizione finale (n-esimo carattere) Chiusura del file 20 1417. Aggiunta ad un fileApertura del file Scrivi riga / Scrivi carattere File aperto in Scrivi riga /Scrivi carattereaggiunta Posizione finale File aperto in(ultimo carattere)aggiunta Posizione intermediaLa posizione intermedia (n-esimo caratterediviene posizione finaledopo lultimo) Chiusura del file 21 1418. Funzioni CTutte le funzioni per laccesso ai file sonocontenute in Funzioni per apertura e chiusura: fopen,fcloseFunzioni per la lettura: fgetc, fgets, fscanfFunzioni per la scrittura: fputc, fputs,fprintfFunzioni per lo stato del file: feof22 1419. File di testo in C 1420. Funzioni fopen e fcloseApertura del file (fopen): La funzione fopen apre un file e restituisce una variabile stream Richiede il nome del file e le modalit di apertura Restituisce una nuova variabile di tipo FILE *Chiusura del file (fclose) Quando il file non pi richiesto, si chiama la funzione fclose che chiude il file Richiede come parametro lo stream, precedentemente restituito da fopen 24 1421. fopen:fopen sintassiVariabile stream di tipo FILE *FILE * f ;...f = fopen( "nomefile", "modo" ) ; Stringa Modalit dicontenente il aperturanome del file (stringa)25 1422. Nome del filef = fopen( "nomefile", "modo" ) ;f = fopen( "dati.txt", "modo" ) ;26 1423. Nome del filef = fopen( "nomefile", "modo" ) ;f = fopen( "dati.txt", "modo" ) ;f = fopen( "c:progdati.txt", "modo" ) ;27 1424. Nome del filef = fopen( "nomefile", "modo" ) ;f = fopen( "dati.txt", "modo" ) ;f = fopen( "c:progdati.txt", "modo" ) ;char nome[20] ;gets(nome) ;f = fopen( nome, "modo" ) ;28 1425. Nome del filef = fopen( "nomefile", "modo" ) ;f = fopen( "dati.txt", "modo" ) ;f = fopen( "c:progdati.txt", "modo" ) ;char nome[20] ;gets(nome) ;f = fopen( nome, "modo" ) ;f = fopen( argv[1], "modo" ) ;29 1426. Modo di aperturaf = fopen( "nomefile", "modo" ) ;Modalit lettura, file di testo "rt" "r"Modalit scrittura, file di testo "wt" "w"Modalit aggiunta, file di testo"at" "a" 30 1427. Effetto della fopen (1/3)Modalit "r"Se il file esiste, viene aperto ed f punta allostream relativo, posizionato in lettura al primocarattereSe il file non esiste, non viene creato nessunostream e f==NULL 31 1428. Effetto della fopen (2/3)Modalit "w"Se il file non esiste, viene creato da zero ed fpunta allo stream relativo, posizionato in scritturaal primo carattereSe il file esiste gi, viene innanzitutto cancellato epoi ricreato da zero, f punta allo stream relativo,posizionato in scrittura al primo carattereSe non possibile creare il file (perch la directorynon esiste, o il disco protetto in scrittura, ...),non viene creato nessuno stream e f==NULL 32 1429. Effetto della fopen (3/3)Modalit "a"Se il file non esiste, viene creato da zero ed fpunta allo stream relativo, posizionato in scritturaal primo carattereSe il file esiste gi, non viene modificato, f puntaallo stream relativo, posizionato in scrittura dopolultimo carattereSe non possibile creare o modificare il file(perch la directory non esiste, o il disco protettoin scrittura, ...), non viene creato nessuno streame f==NULL33 1430. Controllo dellerroreFILE * f ;...f = fopen( "nomefile", "r" ) ;if(if f == NULL ){printf("Impossibile aprire filen");exit(1) ;}34 1431. SuggerimentoOgniqualvolta viene chiamata la funzione fopen, indispensabile subito dopo controllare se ilvalore ritornato non NULL da considerarsi errore una chiamata ad fopendi cui non venga controllato il risultatoIn caso di errore, solitamente convieneinterrompere il programma segnalando un codicedi errore Esempio: exit(1) ;35 1432. fclose:fclose sintassiFILE * f ;...f = fopen( "nomefile", "modo" ) ;.../* accesso al file */fclose(f) ;Variabile stream36 1433. AvvertenzeLa funzione fclose pu essere chiamatasolamente su stream correttamente aperti Mai chiamare fclose se f==NULLDopo la chiusura del file, non pi possibileaccedere allo stream Eventualmente, ri-aprirlo nuovamente 37 1434. Controllo dellerrore La funzione fclose ritorna un valore di tipo intero:int 0, se la; ris chiusura avvenuta con successo...EOF, se la chiusura non stata possibile (adris esempio, disco pieno o rimosso) = fclose(f) ;if(ris!=0)if{ printf("Impossibile chiuderen") ; exit(1) ;}38 1435. SuggerimentoConviene definire due funzioni aggiuntive, chechiamino le funzioni di libreria fopen e fclosee addizionalmente compiano i controlli derroreChiameremo myfopen e myfclose tali funzioniNei programmi chiameremo sempre myfopen emyfclose, e mai direttamente le funzioni dilibreria39 1436. Funzione myfopenFILE * myfopen(char *name, char *mode) char{FILE * f ;f = fopen( name, mode ) ; my.cif (f==NULL){ printf("Impossibile aprire %sn", name) ;exit(1) ;}return f ;} 40 1437. Funzione myfcloseint myfclose(FILE *f){ int ris ; my.cif (f==NULL){ printf("ERRORE INTERNOn") ; exit(1) ;}ris = fclose(f) ;if( ris!=0 )if{ printf("Impossibile chiuderen") ; exit(1) ;}return ris ;} 41 1438. File di testo in C 1439. Lettura e scrittura su fileLettura ScritturaCarattere singolofgetc fputcRiga intera fgetsfputs43 1440. Lettura e scrittura su fileLetturaScritturaCarattere singolofgetcfputcRiga intera fgets fputsLegge prossimo elemento, finoalla fine del file Scrive oaggiunge 44 1441. Lettura e scrittura su fileLetturaScritturaCarattere singolofgetcfputcRiga interafgetsfputsParametro: char Parametro: Legge prossimo stringa elemento, finoalla fine del file Scrive oaggiunge 45 1442. fgetc:fgetc sintassiint ch ;ch = fgetc(f) ;Stream aperto in letturaProssimo carattere del file; EOF se il file finito46 1443. fputc:fputc sintassiint ch ;fputc(ch, f) ; Stream aperto inscrittura o in aggiunta Carattere da aggiungere al file47 1444. fgets:fgets sintassichar str[80] ;fgets(str, 79, f) ; Max numero dicaratteri lettiStringa nella quale viene Stream apertoletta la prossima riga del filein lettura(fino al n compreso)48 1445. Fine del fileLa funzione fgets restituisce un valore NULL seha tentato di leggere oltre la fine del filechar str[80] ;While(While fgets(str, 79, f) != NULL ){/* elabora str */}49 1446. fputs: fputs sintassichar str[80] ;fputs(str, f) ; Stream aperto inscrittura o in aggiunta Stringa da aggiungere al file(solitamente termina con n)50 1447. Esercizio: Frequenza lettereSia dato un file di testo, contenente dei braniscritti da un utenteSi scriva un programma in C che acquisisca sullalinea di comando il nome di tale file, e che stampile frequenze con cui compaiono le varie letteredellalfabetoSi considerino equivalenti le maiuscole e leminuscole, e si ignorino i caratteri di spaziatura epunteggiatura51 1448. Analisi (1/2)manzoni.txtQuel ramo del lago di Como,che volge a mezzogiorno,tra due catene non interrotte di monti,tutto a seni e a golfi,a seconda dello sporgere e delrientrare di quelli, vien, quasia un tratto, a ristringersi, e aprender corso e figura di fiume,tra un promontorio a destra,e unampia costiera dallaltra parte52 1449. Analisi (2/2) manzoni.txtQuel ramo del lago di Como,che volge a mezzogiorno,tra due catene non interrotte di monti,tutto a seni e a golfi,a seconda dello sporgere e delC:prog>frequenza manzoni.txt rientrare di quelli, vien, quasia un tratto, a ristringersi, e aA : 26prender corso e figura di fiume,tra un promontorio a destra,B : 0 e unampia costiera dallaltra parteC : 6D : 12E : 32F : 3G : 7H : 1I : 21J : 0K : 0L : 1353 1450. Soluzioni possibiliOccorre calcolare un vettore di frequenze, in cuiciascuna posizione rappresenti la frequenza diciascuna delle lettere alfabeticheCi sono due approcci possibili alla lettura del file: Soluzione per caratteri: il file viene letto un carattere alla volta, usando la funzione fgetc Soluzione per righe: il file viene letto una riga alla volta, usando la funzione fgets, e tale riga viene poi esaminata con un ciclo interno al programma 54 1451. Soluzione 1: per caratteri (1/3)const int LETT = 26 ;int freq[LETT] ; /* frequenze lettere */FILE * f ;int ch, i ;if (argc!=2){printf("Numero argomenti erraton") ;exit(1) ;}for(i=0; itriangolo tri.txt 60 1457. Soluzione (1/2)FILE * f ; triangolo.cint i, j ;char ch ;if (argc!=2){printf("Numero argomenti erraton") ;exit(1) ;}f = myfopen( argv[1], "w" ) ;61 1458. Soluzione (2/2)for(i=0; i file.txt46 1558. stderrstderr detto lo standard error di unprogrammaNormalmente associato al canale di output delterminale (o della console) nel quale ilprogramma avviato In pratica, il video del P.C. uno stream distinto ed indipendente dastdoutSolitamente loutput di stderr non vienerediretto, per permettere ai messaggi di errore diessere sempre visti dallutilizzatore47 1559. Uso comunestdin viene usato per acquisire i dati Pu essere rediretto da un filestdout viene usato per presentare i risultati Pu essere rediretto su un filestderr viene usato esclusivamente per imessaggi di errore Rimane visibile sulla console48 1560. EquivalenzeLa funzione equivalente ascanf("formato", );fscanf(stdin,"formato", );printf("formato", ); fprintf(stdout,"formato", );ch=getchar(); ch=fgetc(stdin);putchar(ch);fputc(ch, stdout); 49 1561. Stampa dei messaggi di erroreif(...condizione errore fatale...)if{ fprintf(stderr, "Messaggio di erroren") ; exit(1) ;} 50 1562. SuggerimentoTutti i messaggi di errore devono essere stampatisullo stream stderrConviene definire una funzione myerror Stampa un messaggio di errore Interrompe il programmavoid myerror(char *message) ; char51 1563. Funzione myerror my.cint myerror(char *message)char{fputs( message, stderr ) ;exit(1) ;} 52 1564. I/O Avanzato e File 1565. Esercizi propostiEsercizio Somma numeriEsercizio BersagliEsercizio Consumi toner2 1566. Esercizi proposti 1567. Esercizio Somma numeriUn file di testo contiene una serie di numeri interi(positivi o negativi), uno per rigaSi scriva un programma C che: Acquisisca da linea di comando il nome del file Calcoli la somma di tutti i numeri presenti nel file Stampi in output il valore di tale somma4 1568. Analisinumeri.txt 30 22somma.exe -3 18 -12 C:prog>somma numeri.txt La somma vale: 555 1569. Soluzione (1/4)sommafile.cint main(int argc, char *argv[]) int{const int MAX = 80 ; FILE * f ; char nomefile[MAX] ; char riga[MAX] ; int r, num ; int somma ;6 1570. Soluzione (2/4) sommafile.cif(argc != 2)ifmyerror("Num. argomenti erraton") ;strcpy(nomefile, argv[1]) ;f = myfopen( nomefile, "rt" ) ;somma = 0 ; 7 1571. Soluzione (3/4) sommafile.cwhile(while fgets( riga, MAX, f ) != NULL){r = sscanf( riga, "%d", &num ) ;if(r==1)ifsomma = somma + num ;elseprintf("Riga ignoratan") ;} 8 1572. Soluzione (4/4) sommafile.cmyfclose(f) ;printf( "La somma vale: %dn", somma ) ;exit(0) ;} 9 1573. Esercizi proposti 1574. Esercizio Bersagli (1/2)Si desidera creare un programma in grado dicalcolare il numero di colpi andati a segno inunesercitazione di tiroI bersagli sono descritti tramite le coordinatecartesiane del punto in cui sono posizionatiallinterno di una griglia 100 100. Le coordinatesono rappresentate solo da numeri interi,compresi tra 0 e 99. La posizione dei bersagli contenuta nel file di testo bersagli.txt: ogniriga di tale file contiene le coordinate X e Y di unsingolo bersaglio 11 1575. Esercizio Bersagli (2/2)I colpi sparati sono descritti anchessi tramite leloro coordinate X e Y e sono memorizzati in unfile di caratteri il cui nome passato come primoparametro sulla linea di comando. Ogni riga ditale file contiene le coordinate X e Y del punto incui stato sparato un colpoSi scriva un programma che legga dai filesuccitati la posizione dei bersagli ed i colpi sparatie quindi calcoli il numero di colpi andati a segno,sia come valore assoluto sia come percentualedei colpi sparati12 1576. Analisibersagli.txt colpi.txt 0 0 49 49 0 99 50 50 50 50 giudice.exe 51 51 99 0 52 52 99 99 C:prog>giudice colpi.txt Colpi sparati: 4 Colpi andati a segno: 1 (25.0 %)13 1577. AlgoritmoAcquisire dal file bersagli.txt tutte lecoordinate, memorizzandole in due vettoriparalleli Bx[] e By[]. Lunghezza dei vettori: NbAcquisire dal file argv[1] le coordinate dei varicolpi Cx, Cy. Numero colpi: Nc Per ciascun colpo, verificare se le coordinate coincidono con quelle di almeno un bersaglio Se s, incrementare NccStampare Ncc e Ncc/Nc*10014 1578. Soluzione (1/4)int main(int argc, char *argv[]) int{ bersagli.cconst int MAXB = 100 ;/* massimo numero di bersagli */const int MAX = 80 ;/* lunghezza riga del file */const char FILEB[] = "bersagli.txt"; int Nb ; /* numero di bersagli */ int Bx[MAXB], By[MAXB] ;/* coordinate dei bersagli */ int Nc ; /* numero colpi sparati */ int Ncc ; /* numero di colpi centrati */15 1579. Soluzione (2/4)FILE *f ;char riga[MAX] ;int Cx, Cy ;bersagli.cint i, r, trovato ;/* 1: acquisizione coordinate bersagli */f = myfopen( FILEB, "rt") ;Nb = 0 ;while(while fgets(riga, MAX, f) != NULL ){r=sscanf(riga,"%d %d",&Bx[Nb],&By[Nb]);if(if r!=2 )myerror("Formato erraton") ;Nb ++ ;}myfclose(f); 16 1580. Soluzione (3/4)/* 2: analisi coordinate dei colpi */if( argc != 2 )ifmyerror("ERR: manca nome filen");bersagli.cf = myfopen( argv[1], "rt") ;Nc = 0 ;Ncc = 0 ;while(while fgets(riga, MAX, f) != NULL ){r = sscanf( riga, "%d %d", &Cx, &Cy );if(r!=2) myerror("Formato erraton") ;ifNc ++ ; /* Ricerca del bersaglio */}myfclose(f);17 1581. Soluzione (3/4)/* 2: analisi coordinate dei colpi */if( argc != 2 )ifmyerror("ERRORE: manca nome filen");trovato = 0 ; bersagli.cf = for myfopen( argv[1], "rt") ;for(i=0; itoner toner.txt CONT med12.5 24 1588. Argomenti del programma C:prog>toner toner.txt CONT med argv[1]Nome del fileargv[3]contenente i argv[2]Operazioneconsumi Dipartimento statistica:da analizzare-min -med -max 25 1589. Soluzione (1/4)int main(int argc, char *argv[]) int{ toner.cconst int LUNDIP = 5 ;const int MAX = 80 ; char dip[LUNDIP+1], dipf[LUNDIP+1] ; int stat ; /* tipo di statistica: 1=min, 2=max, 3=med */ FILE * f ; int qtaf, r ; int min, max, tot, cont ; char riga[MAX+1] ;26 1590. Soluzione (2/4)if(argc!=4)ifmyerror("Numero parametri erraton"); toner.c/* Acquisisci il nome del dipartimento */strcpy(dip, argv[2]) ;/* Acquisisci tipo statistica */if(if strcmp( argv[3], "-min") == 0 )stat = 1 ;else if ( strcmp( argv[3], "-max") == 0 )stat = 2 ;else if ( strcmp( argv[3], "-med") == 0 )stat = 3 ;elsemyerror("Statistica sconosciutan"); 27 1591. Soluzione (3/4)f = myfopen(argv[1], "rt") ;tot = 0 ;cont = 0 ; toner.cmin = 100 ;max = 0 ;while(while fgets(riga, MAX, f) != NULL ){r = sscanf(riga, "%s %d", dipf, &qtaf);if(r!=2)ifprintf("Riga ignoratan");else{ /* Aggiorna statistiche */}}myfclose(f) ;28 1592. Soluzione (3/4)f = myfopen(argv[1], "rt") ; if(strcmp(dip, dipf)==0) iftot = 0 ;cont { 0 ; = if( qtaf < min ) if ;min = 100toner.cmax = 0 ; min = qtaf ;while( if(while if qtaf > max ) f) != NULL )fgets(riga, MAX,{ max = qtaf ;r = sscanf(riga, qtaf %d", dipf, &qtaf); tot = tot + "%s ;if(r cont++ ;if(r!=2) }printf("Riga ignoratan");else{/* Aggiorna statistiche */}}myfclose(f) ; 29 1593. Soluzione (4/4)/* Stampa il val