Advertisement
Mazamin

Soluzione Esame Fondamenti Di Informatica Gennaio 2018

Dec 16th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.25 KB | None | 0 0
  1. /*
  2.  PROVA PRATICA DI FONDAMENTI DI INFORMATICA
  3.  
  4.  Si scriva un programma C il quale lette da un file un insieme di operazioni aritmetiche binarie
  5.  (con 2 operandi) fra numeri interi esegua le corripodenti operazioni e scriva su un file i
  6.  risultati, uno per riga.
  7.  
  8.  Si assuma che
  9.  
  10.  a) ogni riga del file contenga una ed una sola operazione;
  11.  b) il formato dell'operazione sia: operando1 op operando2, con op uguale a +, -, * o /;
  12.  c) le operazioni siano lette come stringhe e immagazzinate in una matrice di caratteri,
  13.     dove ogni riga contiene la corrispondente linea di testo contenente l'operazione;
  14.  d) tra gli operandi e l’operatore possa essere presente un numero arbitrario di spazi bianchi.
  15.  
  16.  Un esempio di file di input e' il seguente:
  17.  
  18.  3    + 9
  19.         4   *        2
  20.      123     -     27
  21.  
  22.  Mentre il contenuto del file di output sara':
  23.  
  24.  12
  25.  8
  26.  96
  27.  
  28.  Il candidato implementi le funzioni mancanti, secondo le modalità descritte nel commento
  29.  alle funzioni, rispettando i vincoli di progetto.
  30.  */
  31.  
  32. #include <stdio.h>
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include <ctype.h>
  36. #include <math.h>
  37.  
  38. /* Costanti */
  39. #define MAXOP 100
  40. #define NCAR 100
  41. #define NDIGITS 10
  42.  
  43. /* Prototipi */
  44. FILE *ApriFile(char *);
  45. int Leggi_Operazioni (FILE *, char [][NCAR]);
  46. void Esegui_Operazioni(char [][NCAR], int [], int);
  47. void Stampa_Risultato(FILE *, int [], int);
  48. void Stampa_Operazioni(char [][NCAR], int);
  49.  
  50. /* Funzione Main */
  51. int main ()
  52. {
  53.     FILE *fpin, *fpout;
  54.     char operazioni[MAXOP][NCAR];
  55.     int risultati[MAXOP];
  56.     int n;
  57.    
  58.     fpin = ApriFile("r");
  59.    
  60.     if((n = Leggi_Operazioni(fpin, operazioni)) == 0 ) {
  61.         printf("Nessuna operazione da effettuare.\n");
  62.         return EXIT_SUCCESS;
  63.     }
  64.    
  65.     fclose(fpin);
  66.    
  67.     Stampa_Operazioni(operazioni, n);
  68.     Esegui_Operazioni(operazioni, risultati, n);
  69.    
  70.     fpout = ApriFile("w");
  71.    
  72.     Stampa_Risultato(fpout, risultati, n);
  73.    
  74.     fclose(fpout);
  75.    
  76.     return EXIT_SUCCESS;
  77. }
  78.  
  79. /*
  80.  La funzione ApriFile apre il file il cu nome e' specificato
  81.  dall'utente nella modilità specificata dal parametro formale mode
  82.  e ritorna il puntatore al file
  83.  */
  84. FILE *ApriFile(char *mode)
  85. {
  86.     return fopen("file.txt", mode);
  87. }
  88.  
  89. /*
  90.  La funzione Leggi_Operazioni prende in ingresso il puntatore al file
  91.  di dati in input e la matrice di caratteri destinata a contenere le operazioni
  92.  da immagazzinare. Legge le operazioni, omettendo gli spazi bianchi, e restituisce
  93.  il numero di operazioni lette.
  94.  */
  95. int Leggi_Operazioni(FILE *fpin, char str[][NCAR])
  96. {
  97.     int a, b, i=0;
  98.     char ch, ca[NDIGITS], cb[NDIGITS];
  99.     while(feof(fpin)==0){
  100.         fscanf(fpin, "%d %c %d", &a, &ch, &b);
  101.         sprintf(str[i++], "%d%c%d", a, ch, b);
  102.     }
  103.     return i;
  104. }
  105.  
  106. /*
  107.  La funzione Esegui_Operazioni prende in ingresso la matrice di char contenente le operazioni, il
  108.  vettore di interi destinato a contenere i risultati di ogni operazione e il numero di operazioni (righe
  109.  della matrice) da effettuare. Effettua le operazioni, determinando il primo operando, l'operazione
  110.  e il secondo operando (si deve effettuare una conversione da ascii a numerico) e immagazzina il risultato
  111.  nel vettore dei risultati.
  112.  */
  113. void Esegui_Operazioni(char str[][NCAR], int r[], int n)
  114. {
  115.     int a, b, i;
  116.     char ch;
  117.     for(i=0;i<n;i++){
  118.         sscanf(str[i], "%d%c%d", &a, &ch, &b);
  119.         switch(ch){
  120.             case '+':
  121.                 r[i]=a+b;
  122.                 break;
  123.             case '-':
  124.                 r[i]=a-b;
  125.                 break;
  126.             case '*':
  127.                 r[i]=a*b;
  128.                 break;
  129.             case '/':
  130.                 r[i]=a/b;
  131.                 break;
  132.         }
  133.     }
  134. }
  135.  
  136. /*
  137.  La funzione Stampa_Operazioni prende in ingresso la matrice di char contenente le operazioni
  138.  e il numero di operazioni. Stampa a video le operazioni.
  139.  */
  140. void Stampa_Operazioni(char ops[][NCAR], int n)
  141. {
  142.     int i;
  143.    
  144.     for(i = 0; i < n; i++)
  145.         printf("%s\n", ops[i]);
  146. }
  147.  
  148. /*
  149.  La funzione Stampa_Operazioni prende in ingresso il puntatore al file di output,
  150.  il vettore di interi contenente i risultati e il numero di risultati.
  151.  Stampa i risultati nel file di output uno per riga.
  152.  */
  153. void Stampa_Risultato(FILE *fp, int r[], int n)
  154. {
  155.     int i;
  156.    
  157.     for(i = 0; i < n; i++)
  158.         fprintf(fp, "%d\n", r[i]);
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement