Esempio esercizio svolto C++ Prova Programmazione 1

Esercizio svolto soluzione di una prova di esame dell’esame di Programmazione 1 – Linguaggio C++

Un file di testo è così strutturato:

2+3+12=9+8;
2+3+4=9;
22=3+4+5+10;
3+85+1=4+44;

alcune uguaglianze sono corrette altre no; infatti nel file l’ultima riga il primo membro la somma non coincide con la somma del secondo membro.

Scrivere un programma in C++ che letti i dati dal files, attraverso una funzione calcoli la frazione di somme corrette a video.

Soluzione:

Il progetto si compone di tre files due con header e un main. Ecco il primo header:

#include <iostream>
#include <fstream>
using namespace std;

struct Somme {
       int num1[20];
       int num2[20];
       int ris2;
       int addendi1;
       int addendi2;
       int corretto=0;
       int ris1;
};


void leggi_file (fstream& f, struct Somme s[], int& l);
int controllo (struct Somme s);
void stampa(struct Somme s[],int l);
float rapporto (struct Somme s[], int l);

La struct contiene i numeri del primo membro e del secondo all’interno di due array, le somme sono memorizzate nei campi ris1, ris2, mentre le variabili addendi1 e addendi2 sono il numero degli addendi delle due somme. La variabile corretto indica se le somme del primo e del secondo mebro di ogni riga del files coincidono.
Sono state realizzate quattro funzioni la prima che estrae dal file sequenziale i dati caricandoli nella tballe, la seconda interna che controlla una sola riga della tabella creata, la terza che stampa i dati (è stata utilizzata solo a scopo di test nel main non è eseguita), la quarta che scansiona la tabella e richiama di volta in volta la funzione controlla per verificare se le somme coincidono.

L’implementazione delle funzioni è:

#include “funzioni.h”

void leggi_file (fstream& f, struct Somme s[], int& l){
    int i=0;
    int j=0;
    int n;
    int flag=1;
    char temp;
    f.open(“somme.txt”, ios::in);
    if (!f) {
         cout<<“file non trovato!\n”;
         exit(1);
    }
        l=0;
    f>>n>>temp;
    while (!f.eof()){
           s[l].addendi1=0;
           s[l].addendi2=0;
           if (flag==1){
               if (temp==’+’){
                   s[l].num1[i]=n;
                   i++;
                }
            }
           else{
               if (temp==’+’){
                   s[l].num2[j]=n;
                   j++;
                }
            }
           if (temp==’=’){
                  flag=2;
                  s[l].num1[i]=n;
           }
           if (temp==’;’){
                      s[l].addendi2=j+1;
                      s[l].addendi1=i+1;
                   s[l].num2[j]=n;
                 //  cout <<“\n Numero elemtni primo membro:”<<s[l].addendi1;
                 //  cout << “\n Numero elementi secondo membro:”<<s[l].addendi2;   
                  
                   flag=1;
                   j=0;
                   i=0;    
                   l++;
            }
            f>>n>>temp;
            
    }
    f.close();
}

Nella funzione leggi_file è utilizzata la variabile char temp per caricare il separatore che può essere un “+”, un “=” o un “;”. Quest’ultimo indica la fine di una riga.


void stampa(struct Somme s[], int l)
{
    int k;
    int i;
    for (k=0;k<l;k++)
    {    cout << “\nNuova Riga\n”;
            cout << “\n Stampa dettaglio 1\n”;    
        for (i=0;i<s[k].addendi1;i++)
            cout << s[k].num1[i]<<“\t”;
            cout << “\n Stampa dettaglio 2\n”;
            for (i=0;i<s[l].addendi2;i++)
            cout << s[k].num2[i]<<“\t”;
        
    }
}
int controllo (struct Somme s){
    int i;
    s.ris1=0;
    s.ris2=0;
    s.corretto=0;
    
    for (i=0;i<s.addendi1;i++){
         s.ris1=s.ris1+s.num1[i];
    }
    for (i=0;i<s.addendi2;i++)
         s.ris2=s.ris2+s.num2[i];
    if (s.ris1==s.ris2)
    {
        s.corretto=1;
    }
    return s.corretto;
}
float rapporto (struct Somme s[], int l){
    int i;
    int ncorrette=0;
    int flag=0;
    float percentuale;
    for (i=0;i<l;i++){
         flag=controllo(s[i]);
         if (flag==1)
             ncorrette++;
         flag=0;
    }
    cout << “Numero corrette \t”<< ncorrette<<endl;
    percentuale=(float)ncorrette/l;
    return (percentuale);
}

E il main è:

#include “funzioni.cpp”

int main (){
    fstream file;
    Somme somma[100];
    int n;
    float percentuale=0;
    
    leggi_file (file,somma,n);
    cout<<“\nLettura file completata con successo!\n”;
    cout << “\nStampa del dettagio\n”;
    //stampa(somma,n);
    percentuale=rapporto (somma,n);
    cout<<“elaborazione completata!\n la percentuale delle operazioni corrette e’: “;
    cout<<percentuale<<endl;
    return 0;
}

Nel main non si fa altro che che riciamare le funzioni sopra definite per eseguire il programma, la funzione leggi fils contiene la variabile n che rappresenta il numero delle righe lette dal file che è passata per indirizzo in quanto viene calcolata nella subroutine e tornata al programma principale.