Neka se pod sažetim rečnikom kompjuterskih termina podrazumeva datoteka sledećeg oblika: a) prvi red sadrži termin, a naredni redovi sadrže objašnjenje tog termina b) nakon objašnjenja sledi prazan red, pa sledeći termin c) termini su poredjani u poretku engleske abecede d) termini nisu duži od 40 karaktera Napisati program koji spaja dva sažeta rečnika kompjuterskih termina i to recnik1.dat i recnik2.dat u datoteku recnik.dat oblika navedenog pod a) b) c) d). Ako postoji duplikat termina, ponoviti samo objašnjenje bez termina i objašnjenja istog termina razdvojiti jednim redom koji sadrži znake '<', '=', '>'. #include #include #include #define MAX 41 void prepisi_objasnjenje( FILE *from,FILE *frez, char *term, char *, int*); /*zapis objasnjenja termina iz jedne od datoteka (from) u izlaznu datoteku s obzirom na poslednji prepisan termin*/ main() { FILE *fexp1, *fexp2, *frez; /*dve ulazne datoteke i jedna izlazna datoteka*/ char termin1[MAX], termin2[MAX], poslednji[MAX]; /*procitani termini iz svake od ulaznih datoteka i poslednji prepisan termin */ int kraj=0; /*indikator nailaska na kraj neke od ulaznih datoteka*/ /*priprema datoteka za obradu */ fexp1=fopen("recnik1.dat", "r"); fexp2=fopen("recnik2.dat", "r"); frez=fopen("recnik.dat", "w"); if (!fexp1 || !fexp2 || !frez) { fprintf(stderr, "Neuspelo otvaranje\n"); exit(EXIT_FAILURE); } strcpy(poslednji,"\n"); /*jos uvek nije prepisan nijedan od termina */ /*citanje prvih termina iz prvog i drugog recnika*/ strcpy(termin1,"\n"); strcpy(termin2,"\n"); if (fgets(termin1,MAX,fexp1)==NULL) kraj=1; if (fgets(termin2,MAX,fexp2)==NULL) kraj=1; /*objedinjavanje termina i objasnjenja iz oba recnika se ponavlja do kraja jedne od datoteka */ while (!kraj) { if (strcmp(termin1,termin2) <= 0) prepisi_objasnjenje(fexp1,frez, termin1,poslednji,&kraj); else prepisi_objasnjenje(fexp2, frez, termin2, poslednji,&kraj); } /*ako jos nije kraj prve ulazne datoteke, prepisu se iz nje sva preostala objasnjena*/ while (!feof(fexp1) ) prepisi_objasnjenje(fexp1,frez, termin1, poslednji,&kraj); /*ako jos nije kraj druge ulazne datoteke, prepisu se iz nje sva preostala objasnjena*/ while (!feof(fexp2) ) prepisi_objasnjenje(fexp2,frez, termin2, poslednji, &kraj); fclose (fexp1); fclose (fexp2); fclose (frez); return 0; } void prepisi_objasnjenje( FILE *iz,FILE *frez, char *termin, char *p, int *end) { char zn, preth; /*tekuci i prethodni znak objasnjenja */ char red[MAX]; /* cuvanje termina ili separatora <=>*/ if (strcmp (termin,p) ) /*ako je termin drugaciji od poslednjeg */ { if (strcmp(p,"\n") ) /*ako nije u pitanju prvi termin ispisuje se prazan red za razdvajanje jednog termina od sledeceg termina*/ fprintf(frez, "\n"); strcpy(p, termin); /*ispisuje se termin */ strcpy(red,termin); /*zapamti se sta ce se ispisati */ } else /* ako je termin isti kao poslednji */ /*zapisuje se separator <=> umesto termina */ strcpy(red,"<=>\n"); /* prepis termina/separatora*/ fprintf(frez,"%s", red); /*prepis objasnjenja*/ preth='.'; while ( (zn = fgetc(iz)) != EOF ) /*prepis objasnjenja do pojave praznog reda */ { if (zn=='\n' && preth=='\n') break; fputc(zn, frez); preth=zn; } if (zn==EOF) {fputc('\n', frez); *end=1; } /* procita se sledeci termin iz te datoteke*/ if (fgets(termin,MAX,iz)==NULL) *end=1; }