20 febbraio 2019
Fondamenti di Informatica e laboratorio - Compito A
Prof. Marco Gavanelli
20 febbraio 2019
1 Esercizio (punti 16)
Un promotore finanziario mi ha proposto una serie di investimenti, riportati in un file di testo azioni.txt . Il file contiene al più 100 investimenti. Ciascun investimento ha durata 30 mesi; in ciascun mese l'investimento può dare un profitto positivo oppure negativo; un eventuale valore negativo significa che in quel mese si incorre in un costo. Per ciascun investimento, nel file azioni.txt , è riportato:
- nome: stringa contenente al mssimo 20 caratteri, senza spazi
- profitto: per ciascuno dei 30 mesi di durata, un valore intero fornisce il valore del profitto
Per poter scegliere qual è l'investimento migliore, vorrei trovare l'investimento che, al termine dei 30 mesi, darà il profitto più alto, calcolato come somma di tutti i profitti mensili. Si scriva un programma C che calcola qual è l'investimento con il profitto totale più alto, organizzando il programma come segue:
- nel
main
, si invochi una funzione di lettura del file azioni.txt (da realizzare al punto 2), una di calcolo dell'investimento con profitto totale più alto (da realizzare al punto 3); infine si visualizzino il nome e il profitto totale di tale investimento. - la funzione di lettura del file azioni.txt deve leggere il file azioni.txt e portarne il contenuto in un opportuno array di strutture. Si mostri a video il contenuto dell'array.
- la funzione di elaborazione ha come parametri
- l'array letto al punto 2
main
una struttura che contiene (tutti i dati letti dal file sul) l'investimento più redditizio. Per fare questo, invoca, per ogni elemento dell'array, una funzione (da realizzare al punto 4) che calcola il profitto totale di un investimento. - la funzione di calcolo del profitto totale riceve come parametri una struttura che rappresenta un investimento più, eventualmente, altri parametri e fornisce il profitto totale dell'investimento.
È indispensabile organizzare opportunamente il programma in procedure e funzioni; è quindi altamente consigliabile aggiungere altre procedure/funzioni oltre a quelle indicate esplicitamente nel testo.
2 Esercizio (punti 4)
Leggendo più attentamente la proposta del promotore finanziario, ho scoperto che non è necessario iniziare un investimento il mese 0 e terminarlo il ventinovesimo: lo si può iniziare in un qualunque mese i e terminarlo in un mese f. In tal caso, il profitto ottenuto è dato dalla somma dei profitti dal mese i al mese f.
Ad esempio, si consideri l'investimento:
ACME | -1 3 -5 2 -7 1 3 2 4 6 5 3 2 -1 8 -9 -9 -9 -9 -9 -9 -9 |
Questo ha un profitto totale di -38. Tuttavia, se inizio l'investimento il mese 5 e lo termino il mese 14, ottengo i seguenti profitti:
1 3 2 4 6 5 3 2 -1 8 |
il cui totale risulta 33.
Si desidera quindi modificare la funzione scritta al punto 4: invece di calcolare un semplice totale, dovrà trovare quali sono i valori di i e f dei mesi di inizio e fine dell'investimento per cui l'investimento risulta essere più redditizio. In altre parole, si dovrà trovare il sotto-array (che inizia il mese i e finisce il mese f) tale da avere la somma massima.
È indispensabile organizzare il programma in opportune procedure e/o funzioni, in particolare aggiungendo un numero significativo di funzioni rispetto all'esercizio 1. Qualora il numero di funzioni aggiunte non sia ritenuto sufficiente (o l'organizzazione del programma in funzioni non sia ritenuto ragionevole), non sarà possibile ottenere tutti i 4 punti per questo esercizio.
Qualora si svolga solo l'esercizio 1, si può svolgere tutto l'esercizio su un unico file.
Qualora si svolga anche l'esercizio 2, si consegnino i file:
- un file
COGNOME.c
(dove COGNOME va sostituito col cognome dello studente) che contiene ilmain
e le funzioni usate solo nell'esercizio 1 - un file
facoltativo.c
che contiene ilmain
e le funzioni usate solo nell'esercizio 2 - un file
funzioni.c
che contiene le funzioni comuni
più tutti i file header ritenuti necessari.
Nella correzione, il docente creerà due progetti: