#include <stdio.h>
#include <string.h>

#define N 100

typedef unsigned char uchar;
typedef unsigned short int ushort;
typedef char tipostringa[21];

typedef struct {
    tipostringa nomeprop, cognomeprop;
    uchar scala;
    ushort interno;
    double pagamenti;
} appartamento;

typedef appartamento condominio[N];

/* prototipi */
    void AggiornaArray(condominio A, double a, uchar s, ushort i, ushort *n);
    void CostruisciFile(condominio A, ushort n, char nome[]);
    int main(void);


void AggiornaArray(condominio A, double a, uchar s, ushort i, ushort *n)
{
    ushort h;
    
    for(h=0; h<*n; h++)
        if((A[h].scala==s)&&(A[h].interno==i)) {
            A[h].pagamenti += a;
            printf("Aggiornamento effettuato.\n");
            return;
        }
    
    /* se arriva qui, l'app. non è nell'array: occorre inserirlo, se c'è spazio */
    if(*n==N) {
        printf("Non c'è più spazio nell'array. Inserimento non effettuato.\n");
        return;
    }
    
    printf("L'appartamento sito nella scala %c, interno %hu non è "
           "presente nell'array. Inserire nominativo proprietario.\n", s, i);
    printf("Nome: ");
    gets(A[*n].nomeprop);
    printf("Cognome: ");
    gets(A[*n].cognomeprop);
    A[*n].scala=s;
    A[*n].interno=i;
    A[*n].pagamenti=a;
    (*n)++;
    printf("Inserimento effettuato.\n");
    return;
}


void CostruisciFile(condominio A, ushort n, char nome[])
{
    condominio AA;
    ushort h, k;
    FILE *f;
    
    if((f=fopen(nome, "w"))==NULL) {
        printf("Impossibile aprire \"%s\" in modalità \"w\".\n", nome);
        return;
    }
    
    /* duplica l'array in una var. locale */
    for(h=0; h<n; h++)
        AA[h]=A[h];
        
    for(h=0; h<n; h++)
        if(AA[h].nomeprop[0]!='\0') { /* confronto con zero perché metto a
                                         zero i nomi "usati" in anticipo */
            for(k=h+1; k<n; k++)
                if((strcmp(AA[h].nomeprop, AA[k].nomeprop)==0)&&
                   (strcmp(AA[h].cognomeprop, AA[k].cognomeprop)==0)) {
                    AA[h].pagamenti += AA[k].pagamenti;
                    AA[k].nomeprop[0]='\0'; /* metto a zero il nome "usato" in anticipo */
                }
            fprintf(f,"%s %s %f\n", AA[h].nomeprop, AA[h].cognomeprop, AA[h].pagamenti);
        }
    fclose(f);
    printf("File \"%s\" costruito con successo.\n", nome);
    return;
}

    
    
int main(void)
{
    condominio A;
    uchar scala;
    ushort numapp,
           interno;
    double pag;
    tipostringa nomefile;
    
    numapp=0;
    do {
        printf("Immetti pagamento (numero <0 per terminare): ");
        scanf("%lf", &pag);
        getchar();
        if(pag<0)
            break;
        printf("Immetti scala: ");
        scala=getchar();
        getchar();
        printf("Immetti interno: ");
        scanf("%hu", &interno);
        getchar();
        AggiornaArray(A, pag, scala, interno, &numapp);
    } while(1);
    
    printf("Immetti nome del file in cui scaricare le info sui proprietari: ");
    gets(nomefile);

    CostruisciFile(A, numapp, nomefile);
    
    return 0;
}