Advertisement
tpaper

Esame 27 nov 2014

Nov 27th, 2014
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.96 KB | None | 0 0
  1. /*
  2. Il programma seguente (esercizio di esame in data 27-11-2014) raccoglie informazioni su 10 conti corrente (Nome, cognome, saldo, IBAN e ultimi 5 movimenti).
  3. Successivamente stampa l'iban del conto corrente con la somma algebrica degli ultimi movimenti maggiore (scelta a)
  4. Oppure stampa l'iban del conto corrente con la somma delle entrate maggiore (scelta b)
  5.  
  6. Non gestisce:
  7. -Nomi o cognomi con spazi
  8. -Non controlla la lunghezza di nome e cognome
  9.  
  10. Enrico Ronconi <ronconi.enrico@yahoo.it> 27 nov 2014
  11. */
  12.  
  13. #include <stdio.h>  //Standard I/O lib
  14. #define L_IBAN 28   //Lunghezza iban + 1 (Terminatore)
  15. #define L_NOME 30   //Lunghezza nome-cognome
  16. #define L_CAUS 30   //Lunghezza causale importo
  17. #define CONTI 10    //Numero di conti di cui raccogliere info
  18.  
  19. typedef struct {
  20.     char causale[L_CAUS];
  21.     float valore;
  22. } movimento;                //Tipo di dato per immagazzinare un singolo movimento
  23.  
  24. typedef struct {
  25.     char IBAN[L_IBAN];
  26.     char nome[L_NOME];
  27.     char cognome[L_NOME];
  28.     float saldo;
  29.     movimento ultimi[5];    //Array di 5 movimenti
  30. } conto;                    //Tipo di dato per immagazzinare un singolo conto corrente
  31.  
  32. int carattere_illegale(char x){ //Restituisce 1 se il carattere NON può essere all'interno dell'IBAN (Ovvero se non è una lettera maiuscola o un numero), 0 altrimenti
  33.     if ((x > 'Z' || x < 'A') && (x < '0' || x  > '9')) return 1;
  34.     return 0;
  35. }
  36.  
  37. int iban_valido(char IBAN[]){   //Restituisce 0 se l'iban è valido (Inizia per IT, contiene solo lettere maiuscole e numeri, termina con un n > 0)
  38.     if(IBAN[0] != 'I' || IBAN[1] != 'T') return 1;     //Se non inizia per IT esce
  39.     if(IBAN[L_IBAN-2] < '1' || IBAN[L_IBAN-2] > '9') return 2;  //Se l'ultima cifra non è un numero compreso fra 0 e 9 termina
  40.     int count = 2;  //Non è necessario controllare i primi caratteri
  41.     while (count < L_IBAN-1){
  42.         if(carattere_illegale(IBAN[count])) return 3;   //Controlla tutti i caratteri
  43.         count++;
  44.     }
  45. }
  46.  
  47. void inserisci_movimenti(movimento *x){ //Inserisce 5 movimenti nell'array passata (Viene passato un puntatore al primo elemento)
  48.     int count=0;
  49.     while(count < 5){
  50.         printf("Inserisci causale> "); scanf("%s",(x+count)->causale);
  51.         (x+count)->valore = 0;
  52.         while((x+count)->valore==0){
  53.             printf("Inserisci importo> "); scanf("%f",&((x+count)->valore));
  54.         }
  55.         count++;
  56.     }
  57. }
  58.  
  59. void inserisci_dati_conti(conto *lista, int n){ //Inserisce le info di n conti correnti nell'array passata (Viene passato un puntatore al primo elemento)
  60.     int count = 0;
  61.     while (count < n){
  62.         (lista+count)->IBAN[0] = 'Z';
  63.         while(iban_valido((lista+count)->IBAN) != 0){
  64.             printf("Inserisci IBAN> ");
  65.             scanf("%s",(lista+count)->IBAN);
  66.         }
  67.         printf("Inserisci nome> "); scanf("%s",(lista+count)->nome);
  68.         printf("Inserisci cognome> "); scanf("%s",(lista+count)->cognome);
  69.         printf("Inserisci saldo> ");scanf("%f",&((lista+count)->saldo));
  70.         inserisci_movimenti((lista+count)->ultimi);
  71.         count++;
  72.     }
  73. }
  74.  
  75. float somma_alg(movimento *x){  //Restituisce la somma algebrica di un array di 5 movimenti (Viene passato un puntatore al primo elemento)
  76.     int count = 0;
  77.     float tot = 0;
  78.     while (count < 5){
  79.         tot += (x+count)->valore;
  80.         count++;
  81.     }
  82.     return tot;
  83. }
  84.  
  85. float somma_ent(movimento *x){  //Come somma_alg, ma somma solo le entrate
  86.     int count = 0;
  87.     float tot = 0;
  88.     while (count < 5){
  89.         if ((x+count)->valore>0) tot += (x+count)->valore;
  90.         count++;
  91.     }
  92.     return tot;
  93. }
  94.  
  95. int somma_alg_max(conto *lista){    //Restituise l'indice dell'array il cui primo elemento è &lista con somma algebrica dei movimenti maggiore
  96.     float max_val = somma_alg(lista->ultimi);
  97.     int max_index = 0;
  98.     int count = 0;
  99.     while(count<CONTI){
  100.  
  101.         if (somma_alg((lista+count)->ultimi)>max_val){ max_val = somma_alg((lista+count)->ultimi); max_index = count;}
  102.         count++;
  103.     }
  104.     return max_index;
  105. }
  106.  
  107. int somma_ent_max(conto *lista){    //Come sopra, ma solo con la somma delle entrate
  108.     float max_val = somma_ent(lista->ultimi);
  109.     int max_index = 0;
  110.     int count = 0;
  111.     while(count<CONTI){
  112.         if (somma_ent((lista+count)->ultimi)>max_val){ max_val = somma_ent((lista+count)->ultimi); max_index = count;}
  113.         count++;
  114.     }
  115.     return max_index;
  116. }
  117.  
  118. int main() {
  119.     conto lista[CONTI]; //Inizializzo array dei conti correnti
  120.     inserisci_dati_conti(lista, CONTI); //Chiedo info per 10 conti correnti
  121.     char scelta = 'z';
  122.  
  123.     printf("Digita a o b> ");
  124.     while((scelta != 'a') && (scelta != 'b')) scanf("%c",&scelta);
  125.     if (scelta == 'a'){
  126.         printf("L'IBAN del conto la cui somma algebrica degli ultimi 5 movimenti e' massima: %s.",lista[somma_alg_max(lista)].IBAN);
  127.     } else {
  128.         printf("L'IBAN del sconto la cui somma delle entrate e' massima e': %s.",lista[somma_ent_max(lista)].IBAN);
  129.     }
  130.  
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement