Salve signori, mi sto esercitando per migliorare lo stile del mio codice, tenuto in gran considerazione dal mio prof con il quale dovrò sostenere a breve un esame.
Vorrei sapere da voi se la funzione postata è leggibile, comprensibile anche se estrapolata dal contesto del codice e se il relativo pseudocodice rispetta gli standard e dove dovrei migliorare.
Funzione Fusione
codice:
/*
* fusione.c
*
* Created on: 03 feb 2017
* Author: nasio
* Sommario: Copia il contentuto di due strutture in una terza e la stampa su file
* scrivendo su file
* Input:
* struttura vecchi capi
* struttura nuovi capi
* struttura aggiornati capi
* output:
* file.txt PrezziAggiornati
* intero errore **errore relativo a incongruenze fra record
*/
#include <stdio.h>
#include <stdlib.h>
#include "capi.h"
int fusione(capi *vecchi, capi *nuovi, capi *aggiornati, int dim_v, int dim_a)
{
int i=0;
int j=0;
FILE *leggi;
FILE *scrivi;
int errore=0; //codice errore relativo ad incongruenze fra record
if((leggi=fopen("capi.txt", "r"))==NULL) //controllo apertura file
printf("impossibile aprire il file capi.txt\n");
while(i<dim_v) /*lettura da file della struttura vecchi*/
{
fscanf(leggi, "%s", vecchi[i].mat);
fscanf(leggi, "%s", vecchi[i].tipo);
fscanf(leggi, "%s", vecchi[i].info);
fscanf(leggi, "%f", &vecchi[i].prezzo);
i++;
}
fclose(leggi);
if((leggi=fopen("nuovi_prezzi.txt", "r"))==NULL) //controllo apertura file
printf("impossibile aprire il file capi.txt\n");
while(j<dim_v) /*lettura da file della struttura nuovi*/
{
fscanf(leggi, "%s", nuovi[i].mat);
fscanf(leggi, "%f", &nuovi[i].prezzo);
j++;
}
fclose(leggi);
i=0;
j=0;
while(i<dim_v && j<dim_a){
if((strcmp(vecchi[i].mat, nuovi[i].mat)=0)){ //controllo della congruenza fra codici prodotto
strcpy(aggiornati[i].mat, vecchi[i].mat); //copia dei record nella struttura aggionati da struttura vecchi
strcpy(aggiornati[i].tipo, vecchi[i].tipo);
strcpy(aggiornati[i].info, vecchi[i].info);
aggiornati[i].prezzo=nuovi[j].prezzo; //copia del prezzo aggiornato nella struttura aggiornati dalla struttura nuovi
i++;
j++;
}else{
printf("codice %s non trovato \n");
errore++; //indice relativo agli errori di icongruenza nella copia della struttura
j++;
}
}
i=0;
if((scrivi=fopen("capi_aggiornati.txt", "w"))==NULL) //controllo apertura file
printf("impossibile aprire il file capi_aggiornati.txt\n");
while(i<dim_v){ /*scrittura della struct aggiornata su file*/
fscanf(scrivi, "%s ", vecchi[i].mat);
fscanf(scrivi, "%s ", vecchi[i].tipo);
fscanf(scrivi, "%s ", vecchi[i].info);
fscanf(scrivi, "%f\n", vecchi[i].prezzo);
i++;
}
fclose(scrivi);
return errore; //numero di errori trovati nella fusione delle strutture
}
Pseudo codice Funzione Fusione:
Sommario:
Copia il contentuto di due strutture in una terza e la stampa su file
dati in input:
struttura vecchi capi(char mat, char tipo, char info, float prezzo)
struttura nuovi capi(char mat, float prezzo)
struttura aggiornati capi(char mat, char tipo, char info, float prezzo)
intero dim_v **dimensione struttura nuovi
intero dim_a **dimensione struttura aggiornati
variabili di lavoro
intero i **contatore per ciclo di lettura/scrittura
intero j **contatore per ciclo di lettura/scrittura
FILE leggi **puntatore a file per lettura
FILE scrivi **puntatore a file per scrittura
dati di output
file.txt PrezziAggiornati
intero errore **errore relativo a incongruenze fra record
INIZIO
inizializzazione variabili di lavoro
inizializzare i=0;
inizializzare j=0;
inizializzare errore=0;
Aprire il file in lettura capi.txt
se il puntatore a file è uguale a NULL
stampare "Impossibile aprire il file
mentre i<dim_v
leggere da file
vecchi[i].mat;
vecchi[i].tipo
vecchi[i].info
vecchi[i].prezzo
incrementare i;
fine del ciclo
chiudere il file capi.txt
Aprire il file in lettura nuovi_prezzi.txt
se il puntatore a file è uguale a NULL
stampare "Impossibile aprire il file
mentre j<dim_a
leggere da file
nuovi[j].mat;
nuovi[j].tipo
nuovi[j].info
nuovi[j].prezzo
incrementare j;
fine del ciclo
chiudere il file nuovi_prezzi.txt
inizialiazzare i=0
inizialiazzare j=0
mentre i<dim_v e j<_dim_a
se vecchi[i].mat==aggiornati[j].mat
copiare vecchi[i].mat in aggiornati[i].mat
copiare vecchi[i].tipo in aggiornati[i].tipo
copiare vecchi[i].info in aggiornati[i].info
copiare nuovi[j].prezzo in aggiornati[i].prezzo
incrementare i
incrementare j
altrimenti
stampare "codice mat[j].mat non trovato"
incrementare j;
incrementare errore;
fine del ciclo
inizializzare i=0
Aprire il file in scrittura capi_aggiornati.txt
se il puntatore a file è uguale a NULL
stampare "Impossibile aprire il file
mentre i<dim_v
stampare su file
vecchi[i].mat;
vecchi[i].tipo
vecchi[i].info
vecchi[i].prezzo
incrementare i;
fine del ciclo
chiudere il file;
ritornare errori;
FINE
Grazie mille a chiunque risponderà