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.