#include #include typedef struct artikal { char sifra[50]; char naziv[50]; float cena; } Artikal; typedef struct racun { char sifra[50]; char nazivi_artikala[50][50]; float iznos_racuna; int brArtikala; } Racun; typedef struct stavka_racuna { char sifra_racuna[50]; char sifra_artikla[50]; int kolicina; } StavkaRacuna; int unesiArtikle(char nazivDatoteke[50], Artikal niz_artikala[50]) { FILE *file; int brArtikala, i; char linija[50]; file = fopen(nazivDatoteke, "r"); fscanf(file, "%d", &brArtikala); for(i = 0; i < brArtikala; i++) { fscanf(file, "%s", niz_artikala[i].sifra); fgetc(file); fgets(linija, 50, file); if(linija[strlen(linija)-1] == '\n') { linija[strlen(linija)-1] = '\0'; } strcpy(niz_artikala[i].naziv, linija); fscanf(file, "%f", &niz_artikala[i].cena); } fclose(file); return brArtikala; } int unesiStavkeRacuna(char nazivDatoteke[50], StavkaRacuna niz_stavki[50]) { FILE *file; int i = 0; char sifraRacuna[50], sifraArtikla[50]; file = fopen(nazivDatoteke, "r"); while(!feof(file)) { fscanf(file, "%s", niz_stavki[i].sifra_racuna); fscanf(file, "%s", niz_stavki[i].sifra_artikla); fscanf(file, "%d", &niz_stavki[i].kolicina); i++; } fclose(file); return i; } int nadjiRacun(int brRacuna, Racun racuni[50], char sifraRacuna[50]) { int i = 0; for(i = 0; i < brRacuna; i++) { int pom = strcmp(sifraRacuna, racuni[i].sifra); if(pom == 0) { return i; } } return -1; } int nadjiArtikal(int brArtikala, Artikal artikli[50], char sifraArtikla[50]) { int i = 0; for(i = 0; i < brArtikala; i++) { int pom = strcmp(sifraArtikla, artikli[i].sifra); if(pom == 0) { return i; } } return -1; } int kreirajRacune(int brArtikala, Artikal niz_artikala[50], int brStavki, StavkaRacuna niz_stavki[50], Racun niz_racuna[50]) { int i, brRacuna = 0; for(i = 0; i < brStavki; i++) { int indeksArtikla = nadjiArtikal(brArtikala, niz_artikala, niz_stavki[i].sifra_artikla); if(indeksArtikla == -1) { continue; } int indeksRacuna = nadjiRacun(brRacuna, niz_racuna, niz_stavki[i].sifra_racuna); if(indeksRacuna == -1) { strcpy(niz_racuna[brRacuna].sifra, niz_stavki[i].sifra_racuna); strcpy(niz_racuna[brRacuna].nazivi_artikala[0], niz_artikala[indeksArtikla].naziv); niz_racuna[brRacuna].iznos_racuna = niz_stavki[i].kolicina * niz_artikala[indeksArtikla].cena; niz_racuna[brRacuna].brArtikala = 1; brRacuna++; } else { strcpy(niz_racuna[indeksRacuna].nazivi_artikala[niz_racuna[indeksRacuna].brArtikala], niz_artikala[indeksArtikla].naziv); niz_racuna[indeksRacuna].iznos_racuna += niz_stavki[i].kolicina * niz_artikala[indeksArtikla].cena; niz_racuna[indeksRacuna].brArtikala += 1; } } return brRacuna; } void sortirajRacune(int brRacuna, Racun niz_racuna[50]) { int i, j; for(i = 0; i < brRacuna; i++) { for(j = i+1; j < brRacuna; j++) { if(niz_racuna[i].iznos_racuna < niz_racuna[j].iznos_racuna) { Racun pom = niz_racuna[i]; niz_racuna[i] = niz_racuna[j]; niz_racuna[j] = pom; } } } } void ispisiRacune(char nazivDatoteke[50], int brRacuna, Racun racuni[50]) { int i; FILE *f = fopen(nazivDatoteke, "w"); for(i = 0; i < brRacuna; i++) { fprintf(f, "%s %d %f\n", racuni[i].sifra, racuni[i].brArtikala, racuni[i].iznos_racuna); } fclose(f); } int main() { int brArtikala, brStavkiRacuna, brRacuna; char datotekaArtikli[50], datotekaStavkeRacuna[50], datotekaIzlaz[50]; Artikal niz_artikala[50]; StavkaRacuna niz_stavki[50]; Racun racuni[50]; scanf("%s", datotekaArtikli); scanf("%s", datotekaStavkeRacuna); scanf("%s", datotekaIzlaz); brArtikala = unesiArtikle(datotekaArtikli, niz_artikala); brStavkiRacuna = unesiStavkeRacuna(datotekaStavkeRacuna, niz_stavki); brRacuna = kreirajRacune(brArtikala, niz_artikala, brStavkiRacuna, niz_stavki, racuni); // for(int i = 0; i < brRacuna; i++) { // printf("%s ", racuni[i].sifra); // for(int j = 0; j < racuni[i].brArtikala; j++) // printf("%s ", racuni[i].nazivi_artikala[j]); // printf("%f\n", racuni[i].iznos_racuna); // } sortirajRacune(brRacuna, racuni); // for(int i = 0; i < brRacuna; i++) { // printf("%s ", racuni[i].sifra); // for(int j = 0; j < racuni[i].brArtikala; j++) // printf("%s ", racuni[i].nazivi_artikala[j]); // printf("%f\n", racuni[i].iznos_racuna); // } ispisiRacune(datotekaIzlaz, brRacuna, racuni); return 0; }