9. Funzioni e procedure Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Indice Necessità di sottoprogrammi(funzioni e procedure) Struttura completa di un programma in C Funzioni Procedure Comunicazione con i sottoprogrammi Sottoprogrammi predefiniti Informatica - CDL in Ingegneria Industriale- A.A
Il concetto di sottoprogramma (1) I sottoprogrammi implementano operazioni non predefinite sui tipi di dati Ai meccanismi di astrazione sui dati visti finora mancano infatti le operazioni: –Esempio (di tipi di dati definiti): typedef struct{ intNumFatture; DescrizioneFattureSequenza[MaxNumFatture]; } ElencoFatture; typedef struct{int NumCosti; DescrizionecostiSequenza[MaxNumCosti] } ElencoCosti; MaxNumFatture e MaxNumCosti costanti DescrizioneFatture e DescrizioneCosti tipi definiti (in precedenza): Informatica - CDL in Ingegneria Industriale- A.A
Il concetto di sottoprogramma (2) I sottoprogrammi racchiudono in maniera astratta le righe di codice necessarie ad eseguire un’operazione Vantaggi: –Scrivere direttamente il risultato RisultatoDiGestione = FatturatoTotale (ArchivioFatture) – SommaCosti (ArchivioCosti); è meglio che scrivere tutte le istruzioni necessarie ad ottenerlo FatturatoTotale = 0; for (Cont = 0; Cont < ArchivioFatture.NumFatture; Cont++) { FatturatoTotale = FatturatoTotale + ArchivioFatture.Sequenza[Cont].Importo; } SommaCosti= 0; for (Cont = 0; Cont < ArchivioCosti.NumCosti; Cont++) { SommaCosti = SommaCosti + ArchivioCosti.Sequenza[Cont].Importo; } RisultatoDiGestione = FatturatoTotale – SommaCosti; –Se l’operazione deve essere ripetuta più volte l’utilizzo dei sottoprogrammi è ancora più vantaggioso Informatica - CDL in Ingegneria Industriale- A.A
Il concetto di sottoprogramma (3) I sottoprogrammi sono lo strumento per realizzare astrazioni sulle operazioni Due tipi (concettualmente): –Funzioni: sottoprogrammi descrivibili come vere e proprie funzioni matematiche e possiedono un dominio ed un codominio –Procedure: sottoprogrammi che modificano lo stato di alcune variabili di programma L’utilizzo dei sottoprogrammi necessita di: –Definizione del sottoprogramma –Chiamata del sottoprogramma Informatica - CDL in Ingegneria Industriale- A.A
Struttura di un programma C Struttura completa: Direttive al preprocessore; parte dichiarativa globale contiene la dichiarazione di tutti gli elementi che sono condivisi dal programma principale e dai sottoprogrammi Programma principale(main) a sua volta costituito da parte dichiarativa ed esecutiva definizioni di sottoprogrammi funzioni o procedure a seguire il programma principale. Il main è un particolare sottoprogramma tra gli altri; Il main e ciascun sottoprogramma possono usare tutti e soli gli elementi che sono stati dichiarati nella loro propria parte dichiarativa, nonché quelli che sono stati dichiarati nella parte dichiarativa globale Informatica - CDL in Ingegneria Industriale- A.A
Funzioni: Definizione Struttura della definizione : testata (header); due parti, racchiuse fra parentesi graffe: la parte dichiarativa locale: definisce tutti gli oggetti necessari alla realizzazione dell’operazione astratta, in particolare le variabili locali la parte esecutiva (detta corpo della funzione): –Istruzioni per l’esecuzione dell’operazione –Istruzione di return: serve a restituire il risultato della funzione, del tipo specificato nella testata e identificato tramite il nome della funzione Informatica - CDL in Ingegneria Industriale- A.A
Funzioni : Definizione La testata contiene: –tipo del risultato(codominio della funzione) Una funzione non può restituire array o funzioni ma può restituire un puntatore a qualsiasi tipo –identificatore del sottoprogramma –lista dei parametri (formali) cui la funzione viene applicata con il relativo tipo(dominio della funzione): Ogni parametro formale è un identificatore di tipo seguito da un identificatore Si chiamano formali perché non hanno valore proprio ma sono riferimenti simbolici agli argomenti delle funzioni Informatica - CDL in Ingegneria Industriale- A.A
Funzioni : Definizione Esempi di testate: int FatturatoTotale(ElencoFatture par) boolean Precede(StringaCaratteri par1, StringaCaratteri par2) boolean Esiste(int par1, SequenzaInteri par2) /* Stabilisce se il primo parametro, di tipo intero, appartiene all'insieme di interi contenuti nel secondo parametro: una sequenza di interi */ MatriceReali10Per10 *MatriceInversa(MatriceReali10Per10 *par) Informatica - CDL in Ingegneria Industriale- A.A
Funzioni : Definizione Funzione completa: intFatturatoTotale (ElencoFatture parametro) { intTotale, Cont; Totale = 0; for (Cont = 0; Cont < parametro.NumFatture; Cont++) Totale = Totale + parametro.Sequenza[Cont].Importo; return Totale; } Informatica - CDL in Ingegneria Industriale- A.A
Funzioni : Definizione Funzione completa: intRadiceIntera (int par) { int cont; cont = 0; while (cont*cont <= par) cont = cont + 1; return (cont – 1); } Informatica - CDL in Ingegneria Industriale- A.A
Funzioni: Chiamata Consentono di utilizzare le operazioni implementate dalle funzioni Una funzione applicata a un valore dell’argomento, appartenente al suo dominio, fornisce un valore appartenente al suo codominio Struttura della chiamata: –Identificatore della funzione –Lista dei parametri attuali, tra parentesi tonde: Sono i valori degli argomenti rispetto ai quali la funzione deve essere calcolata Corrispondono in numero, ordine e tipo ai parametri formali dichiarati Informatica - CDL in Ingegneria Industriale- A.A
Funzioni: chiamata Esempi: x = sin(y) – cos(PiGreco – alfa); x = cos(atan(y) – beta); x = sin(alfa); y = cos(alfa) – sin(beta); z = sin(PiGreco) + sin(gamma); RisultatoGestione =FatturatoTotale(ArchivioFatture) - SommaCosti(ArchivioCosti); Det1 = Determinante(Matrice1); Det2 = Determinante(MatriceInversa(Matrice2)); TotaleAssoluto = Sommatoria(Lista1) + Sommatoria(Lista2); ElencoOrdinato = Ordinamento(Elenco); OrdinatiAlfabeticamente = Precede(nome1, nome2); Informatica - CDL in Ingegneria Industriale- A.A
Prototipo delle funzioni All’interno di un programma C una funzione può essere chiamata purché risulti definita oppure dichiarata(definizione e dichiarazione non sono termini equivalenti) La dichiarazione di una funzione (prototipo): –si limita a richiamarne la testata –Utile quando la chiamata di una funzione precede, nel codice, la definizione della funzione, oppure le funzioni utilizzate da un programma sono definite in file propri del sistema C (e.g., le funzioni di libreria) –Aiuta il compilatore ed è buono stile di programmazione Informatica - CDL in Ingegneria Industriale- A.A
Esecuzione delle funzioni e passaggio dei parametri /* Programma Contabilità (1) */ /* Parte direttiva */ #include #defineMaxNumFatture1000 /* Parte dichiarativa globale */ typedef charString [30]; typedef struct {int giorno; int mese; int anno; } Data; typedef struct{StringIndirizzo; intImporto; DataDataFattura; }DescrizioneFatture; typedef struct{intNumFatture; DescrizioneFattureSequenza[MaxNumFatture]; }ElencoFatture; Informatica - CDL in Ingegneria Industriale- A.A
Esecuzione delle funzioni e passaggio dei parametri /* Programma Contabilità (2)*/ main() { ElencoFattureArchivioFatture1, ArchivioFatture2; intFatt1, Fatt2, Fatt; intFatturatoTotale(ElencoFatture parametro); /* Prototipo della funzione FatturatoTotale */.... Fatt1 = FatturatoTotale(ArchivioFatture1); Fatt2 = FatturatoTotale(ArchivioFatture2); Fatt = Fatt1 + Fatt2;.... } /* Fine del main del programma Contabilità */ Informatica - CDL in Ingegneria Industriale- A.A
Esecuzione delle funzioni e passaggio dei parametri /* Definizione della funzione FatturatoTotale */ int FatturatoTotale (ElencoFatture parametro) { intTotale, Cont; Totale = 0; for (Cont = 0; Cont < parametro.NumFatture; Cont++) Totale = Totale + parametro.Sequenza[Cont].Importo; return Totale; } Informatica - CDL in Ingegneria Industriale- A.A
Esecuzione di funzioni: macchine astratte master e slave Informatica - CDL in Ingegneria Industriale- A.A ArchivioFatture1 ArchivioFatture2 Fatt1 Fatt2 parametro Totale Cont FatturatoTotale MASTER: chiama la funzione passando i parametri attuali SLAVE: calcola il risultato dopo aver manipolato i parametri formali
Esecuzione di funzioni: macchine astratte master e slave Le due macchine hanno ciascuna il proprio ambiente di esecuzione: –La macchina slave ha un ambiente locale di funzione caratterizzato da: Variabili locali Variabili corrispondenti ai parametri formali Variabile che contiene il valore da restituire (tramite l’istruzione return), che corrisponde all’identificatore della funzione nel modulo master –La macchina master ha un ambiente caratterizzato dalle variabili che utilizza il programma chiamante, tra cui quelle passate come parametri attuali Informatica - CDL in Ingegneria Industriale- A.A
Passaggio di parametri L’istruzione: Fatt1 = FatturatoTotale(ArchivioFatture1); provoca il seguente flusso: –La macchina master chiama la macchina slave per il valore di FatturatoTotale passando i parametri ad essa:il passaggio dei parametri consiste nella copiatura dei parametri attuali nella cella dei parametri formali –Il controllo viene ceduto alla macchina slave, che procede con l’esecuzione come un normale programma fino al return o alla chiusura di parentesi graffa –Il controllo viene restituito alla macchina master con la restituzione del valore della funzione Informatica - CDL in Ingegneria Industriale- A.A
Esecuzione delle funzioni e passaggio dei parametri Informatica - CDL in Ingegneria Industriale- A.A x = sin(atan(y) – acos(z)); Equivale a : temp1 = atan(y); temp2 = acos(z); temp3 = temp1 – temp2 x = sin(temp3);
Procedure Sono sottoprogrammi che non corrispondono a funzioni matematiche Le procedure non servono a produrre dei valori di un certo tipo ma a modificare lo stato del programma che ne chiede l’esecuzione In C una procedura viene definita come una funzione che ha come tipo del risultato il tipo speciale void Informatica - CDL in Ingegneria Industriale- A.A
Procedure: esempio 1 Informatica - CDL in Ingegneria Industriale- A.A typedef enum {VerdeSinistra, VerdeDestra} TipoStato; typedef struct{TipoStatoStato; intCodaSinistra; intCodaDestra; } TipoSemaforo; TipoSemaforoSemaforo; AggiornaSemaforo : Diminuisce di un valore costante il campo CodaSinistra o CodaDestra a seconda che lo stato del semaforo sia VerdeSinistra o VerdeDestra ; Legge dal terminale i valori NuoviArriviSinistri e NuoviArriviDestri e li somma, rispettivamente, a CodaSinistra e CodaDestra ; Dà al campo Stato il valore VerdeSinistra se CodaSinistra > Coda Destra e viceversa.
Procedure : esempio 2 Informatica - CDL in Ingegneria Industriale- A.A /*Programma Contabilità (1)*/ #include #defineMaxNumFatture typedef struct{Stringindirizzo; intImporto; DataDataFattura; } DescrizioneFatture; typedef struct{intNumFatture; DescrizioneFattureSequenza[MaxNumFatture]; } ElencoFatture; ElencoFattureArchivioFatture;
Procedure: esempio 2 Informatica - CDL in Ingegneria Industriale- A.A /*Programma Contabilità (2)*/ main() { DataDataOdierna; DescrizioneFattureFattura1, Fattura2; voidInserisciFattura(DescrizioneFatture Fattura); booleanPrecede(DataNum1, DataNum2); … /* Sequenza di istruzioni che leggono i dati di una fattura in Fattura1 */ InserisciFattura(Fattura1);... /* Sequenza di istruzioni che leggono i dati di una fattura in Fattura2 */ if(Precede(Fattura2.DataEmissione, DataOdierna)) InserisciFattura(Fattura2);... }
Procedure : esempio 2 Informatica - CDL in Ingegneria Industriale- A.A /*Programma Contabilità (3)*/ voidInserisciFattura(DescrizioneFatture Fattura) { if(ArchivioFatture.NumFatture == MaxNumFatture) printf("L'archivio è pieno.\n"); else { ArchivioFatture.NumFatture = ArchivioFatture.NumFatture + 1; ArchivioFatture.Sequenza[ArchivioFatture.NumFatture–1] = Fattura; }
Esecuzione delle procedure Informatica - CDL in Ingegneria Industriale- A.A Ambiente globale ArchivioFatture Ambiente locale di InserisciFattura Ambiente di main di Programma Contabilità DataOdierna Fattura Fattura1 Fattura2...
Passaggio parametri per indirizzo (1) Informatica - CDL in Ingegneria Industriale- A.A voidInserisciFattura(DescrizioneFattureFattura, ElencoFatture ArchivioFatture) /*In questa versione della procedura, sia la fattura da inserire sia l'archivio in cui inserirla sono dei parametri */ { if(ArchivioFatture.NumFatture == MaxNumFatture) printf("L'archivio è pieno."); else { ArchivioFatture.NumFatture = ArchivioFatture.NumFatture + 1; ArchivioFatture.Sequenza[ArchivioFatture.NumFatture–1] = Fattura; } /*Fine della procedura InserisciFattura */ InserisciFattura (Fattura1, ArchivioFatture5);Non funziona! Perché?
Passaggio parametri per indirizzo (2) Informatica - CDL in Ingegneria Industriale- A.A Ind(x) = 2034 Parametri attualiParametri formali Passaggio per valore 243 Ind(y) = 1004 Passaggio per indirizzo yA
Passaggio parametri per indirizzo (3) Informatica - CDL in Ingegneria Industriale- A.A In C la modalità di passaggio dei parametri a un sottoprogramma è sempre quella di passaggio per valore. Per simulare il passaggio per indirizzo: utilizzare il costruttore puntatore per la definizione dei parametri formali della funzione; usare l’operatore di dereferenziazione di puntatore (operatore * o –>) all’interno del corpo della funzione; passare al momento della chiamata della funzione come parametro attuale un indirizzo di variabile (usando l’operatore &).
Passaggio parametri per indirizzo (4) Informatica - CDL in Ingegneria Industriale- A.A /*Programma Contabilità (1)*/... main() { ElencoFattureArchivioFatture5; /* Qui ArchivioFatture5 è una variabile locale del main. */ DataDataOdierna; DescrizioneFattureFattura1, Fattura2; voidInserisciFattura (DescrizioneFattureFattura, ElencoFatture *PointToArchivioFatture); /* Prototipo della procedura InserisciFattura */ BooleanPrecede(Data Num1, DataNum2); /* Prototipo della funzione Precede */
Passaggio parametri per indirizzo (5) Informatica - CDL in Ingegneria Industriale- A.A /*Programma Contabilità (2)*/... /* Sequenza di istruzioni che leggono i dati di una fattura in Fattura1 */ InserisciFattura(Fattura1, &ArchivioFatture5); /* Chiamata della procedura InserisciFattura: alla procedura viene passato il valore di Fattura1 e l'indirizzo di ArchivioFatture5 */... /* Sequenza di istruzioni che leggono i dati di una fattura in Fattura2 */ if(Precede(Fattura2.DataEmissione, DataOdierna) InserisciFattura(Fattura2,&ArchivioFatture5); /* Nuova chiamata della procedura InserisciFattura: alla procedura viene passato il valore di Fattura2 e -nuovamente- l'indirizzo di Archivio Fatture5 (ma potrebbe essere un altro) */... }
Passaggio parametri per indirizzo (6) Informatica - CDL in Ingegneria Industriale- A.A /*Programma Contabilità (3)*/... /* Definizione della procedura InserisciFattura */ voidInserisciFattura(DescrizioneFatture Fattura, ElencoFatture*PointToArchivioFatture) /* In questa versione della procedura, la fattura da inserire e l'indirizzo dell'archivio in cui inserirla sono dei parametri */ { if(PointToArchivioFatture–>NumFatture == MaxNumFatture) /* PointToArchivioFatture è una variabile che punta a una struttura avente un campo di nome NumFatture */ printf("L'archivio è pieno.\n"); else { PointToArchivioFatture–>NumFatture = PointToArchivioFatture–> NumFatture +1; PointToArchivioFatture–> Sequenza[PointToArchivioFatture–>NumFatture – 1] = Fattura; }
Parametri di tipo array L’indirizzo di base dell’array viene passato “per valore” alla funzione. typedefdoubleTipoArray[MaxNumElem] Le tre testate di funzione riportate di seguito sono equivalenti: doublesum(TipoArraya, intn) /* n è la dimensione dell'array passato */ doublesum(double*a, intn) doublesum(doublea[ ], intn) Informatica - CDL in Ingegneria Industriale- A.A
Parametri di tipo array doublemul(doublea[ ], intn) /* n è la dimensione dell'array passato */ { inti; doubleris; ris = 1.0; for (i=0; i < n; i=i+1) ris = ris * a[i]; return ris; } v array di 50 elementi: ChiamataValore calcolato e restituito mul(v, 50)v[0]*v[1]*... *v[49] mul(v, 30)v[0]*v[1]*... *v[29] mul(&v[5], 7)v[5]*v[6]*... *v[11] mul(v+5, 7)v[5]*v[6]*... *v[11] Informatica - CDL in Ingegneria Industriale- A.A
Parametri di tipo struttura Una struttura può essere passata per valore anche quando contiene un componente di tipo array. Informatica - CDL in Ingegneria Industriale- A.A
I blocchi Un blocco è composto da due parti racchiuse tra parentesi graffe: una parte dichiarativa (facoltativa); una sequenza di istruzioni. Diversi blocchi possono comparire internamente al main o alle funzioni che compongono un programma C. I blocchi possono risultare paralleli o annidati Informatica - CDL in Ingegneria Industriale- A.A
/* Programma ComplessoInStruttura */ #include /* Parte dichiarativa globale */ intg1, g2; charg3; intf1(intpar1, intpar2);... main () { inta, b; intf2(intpar3, intpar1);... /* blocco1 */ {chara, c;... /* blocco2 annidato nel blocco1 */ {floata;... } /* Fine blocco2 */ } /* Fine blocco1 */ } /* Fine main */ I blocchi annidati
Informatica - CDL in Ingegneria Industriale- A.A intf1(intpar1, intpar2) { intd;... /* blocco3 */ { inte;... } /* Fine blocco3 */ /* blocco4 */ { intd;... } /* Fine blocco4 */ } /* Fine f1 */ I blocchi paralleli
Informatica - CDL in Ingegneria Industriale- A.A /* Definizione della funzione f2 */ intf2(intpar3, intpar4) { intf;... } /* Fine f2 */ I blocchi : funzioni
Informatica - CDL in Ingegneria Industriale- A.A Visibilità all’interno dei blocchi
La durata delle variabili variabili fisse o statiche (static): i loro valori vengono mantenuti anche all’esterno del loro ambito di visibilità. variabili automatiche (auto): i loro valori non vengono mantenuti all’esterno del proprio ambito di visibilità. Sono variabili fisse le variabili globali del programma Informatica - CDL in Ingegneria Industriale- A.A
/* Definizione della funzione f1 */ intf1(intpar1, intpar2) { static intd; /* blocco3 */ {inte;... }/*Fine blocco3 */ /* blocco4 */ {intd;... } /* Fine blocco4 */ } /* Fine f1 */ La durata delle variabili: esempio
Effetti collaterali (1) int x ; /* Variabile globale */ intPrimoEsempio(intpar) { return(par + x) } Nel corso del seguente frammento di programma: x = 1; x = PrimoEsempio(1); La sua chiamata produce, la prima volta, il risultato “2”, la seconda volta “3”. Informatica - CDL in Ingegneria Industriale- A.A
Effetti collaterali (2) intSecondoEsempio(int*par) { *par = *par + 1; return*par; } y = SecondoEsempio(&z); Assegna alla variabile y il valore di z+1, ma anche z assume lo stesso valore. effetto collaterale (side effect) Informatica - CDL in Ingegneria Industriale- A.A
Effetti collaterali (3) int x ; /* Variabile globale */ intTerzoEsempio(intpar) { x = par + 2; return(par + 1); } Altro effetto collaterale: z = TerzoEsempio(4); Assegna a z il valore “5”, ma anche il valore “6” a x. A Informatica - CDL in Ingegneria Industriale- A.A
Uso interscambiabile di procedure e funzioni intf(intpar1) {... returnrisultato; } Essa può essere trasformata nella procedura seguente: voidf(intpar1, int*par2) {... *par2 = risultato; } Successivamente, una chiamata come: y = f(x); verrà trasformata in: f(x, &y); Informatica - CDL in Ingegneria Industriale- A.A
La standard library del C Sottoprogrammi di largo uso predefiniti: –Matematica –I/O –Grafica Librerie di sottoprogrammi: –Predefinite –Costruite dai programmatori applicativi Però l’uso di librerie diminuisce la portabilità a meno che anche le librerie (almeno le fondamentali) non siano standardizzate: la grande forza del C: la libreria standard Informatica - CDL in Ingegneria Industriale- A.A
#include /* Programma Concatenazione di stringhe */ #include #define LunghezzaArray 50 main() { charPrimaStringa[LunghezzaArray], SecondaStringa[LunghezzaArray], StringaConc[2 * LunghezzaArray]; unsignedLunghezzaConc; scanf(“%s”, PrimaStringa); scanf(“%s”, SecondaStringa); if(strcmp(PrimaStringa, SecondaStringa) <= 0) { strcpy(StringaConc, PrimaStringa); strcat(StringaConc, SecondaStringa); } else { strcpy(StringaConc, SecondaStringa); strcat(StringaConc, PrimaStringa); } LunghezzaConc = strlen(StringaConc); printf(“La stringa ottenuta concatenando le due stringhe lette è %s. Essa è lunga %d caratteri\n”, StringaConc, LunghezzaConc); } Informatica - CDL in Ingegneria Industriale- A.A Esempio
I file header Le funzioni della libreria sono disponibili in C come file di codice compilato È compito del programmatore inserire nel programma i prototipi delle funzioni che verranno usate La libreria C comprende alcuni file, chiamati header file, che contengono i prototipi di un insieme di funzioni di libreria #include e altre #include Il preprocessore copia il contenuto del file stdio.h nel programma, inserendo i prototipi delle funzioni che appartengono al gruppo di cui xxx.h è il file testata Informatica - CDL in Ingegneria Industriale- A.A
Esercizi in laboratorio 1.Scrivere un programma che consenta la scelta ripetuta tra le seguenti opzioni, da definire come sottoprogrammi: –Acquisizione di un vettore di interi –Visualizzazione del vettore –Ordinamento del vettore tramite selection sort –Ordinamento del vettore tramite bubble sort –Ricerca lineare nel vettore di una chiave K –Ricerca dicotomica nel vettore di una chiave K 2.Trasformare votomain.c in un programma che per ogni opzione utilizza un sottoprogramma Informatica - CDL in Ingegneria Industriale- A.A
Esercizio a casa 3. Una società che organizza eventi per bambini necessita di un programma per gestire le informazioni relative a tali eventi. Ogni evento è caratterizzato da un tipo (che può essere Battesimo, Prima Comunione, Compleanno, Cresima), una data, un luogo, un'ora, il codice fiscale di un genitore e il costo. Si progetti tramite flow-chart strutturato un programma che consenta la scelta tra le seguenti opzioni: -Inserimento di un nuovo evento in un archivio, secondo le seguenti condizioni: oL'inserimento deve avvenire solo se non esiste già nell'archivio un evento che ha la stessa data, ora e luogo; oNel caso in cui esista già nell'archivio un evento che ha la stessa data, ora e luogo, il programma deve dare all'utente la possibilità di fornire dei nuovi valori per data, ora e luogo e poi procedere con l'inserimento; -Calcolo del costo medio dell'evento, dato il tipo come parametro dall'utente. (E' OBBLIGATORIO UTILIZZARE UN SOLO SOTTOPROGRAMMA) Informatica - CDL in Ingegneria Industriale- A.A
Esercizio a casa 4. Un commercialista deve gestire il proprio archivio di clienti. Ogni cliente è dotato di un nome, un codice fiscale, un tipo(che indica se si tratta di persona fisica o giuridica), un compenso mensile che versa al commercialista per la gestione della propria contabilità. Si progetti tramite flow chart strutturato un programma che consenta la scelta tra le seguenti opzioni: -Inserimento di un nuovo cliente nell'archivio -Calcolo del compenso totale ricevuto dalle persone fisiche - Calcolo del compenso totale ricevuto dalle persone giuridiche -Modifica del compenso percepito da un cliente in archivio, individuato dal codice fiscale -Visualizzazione dei dati del cliente che fornisce al commercialista il compenso più alto Informatica - CDL in Ingegneria Industriale- A.A
Esercizio a casa 5. Una piccola azienda di servizi deve gestire le informazioni relative ai propri clienti, che sono a loro volta aziende caratterizzate da partita IVA, ragione sociale (nome azienda), Codice Fiscale del rappresentante legale, numero di dipendenti. Si progetti tramite flow-chart strutturato un programma che offra all'azienda le seguenti funzionalità: -Inserimento di un nuovo cliente in un archivio di clienti -Ordinamento dei clienti in base alla ragione sociale -Ricerca del rappresentante legale di una data azienda, di cui viene passata la partita IVA - Modifica del numero di dipendenti e del legale rappresentante di un'azienda data, di cui viene passata la partita IVA Si scriva il programma che codifica in linguaggio C il progetto. Informatica - CDL in Ingegneria Industriale- A.A