Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <stdarg.h>
- /// A
- typedef struct {
- char RO[21], LS[21];
- } Cuvant;
- int *cmpCuvant(const void *a, const void *b) {
- int lenA, lenB;
- lenA = strlen( (*((Cuvant*)(a))).RO );
- lenB = strlen( (*((Cuvant*)(b))).RO );
- return lenB - lenA;
- }
- void CitireDictionar(char *fis, Cuvant **dict, int *n) {
- FILE *f = fopen(fis, "r");
- fscanf(f, "%d", n);
- //printf("%d\n", *n);
- *dict = malloc((*n) * sizeof(Cuvant));
- int i;
- for(i = 0; i < (*n); i++) {
- fscanf(f, "%s %s", (*dict)[i].RO, (*dict)[i].LS);
- //printf("%s %s\n", (*dict)[i].RO, (*dict)[i].LS);
- }
- qsort(*dict, *n, sizeof(Cuvant), cmpCuvant);
- fclose(f);
- }
- /// B
- int TraducereCuvant(char *cuv, char *cuvTradus, char *limba) {
- char fis[200];
- sprintf(fis, "dictionar_%s.txt", limba);
- int n;
- Cuvant *dict;
- CitireDictionar(fis, &dict, &n);
- int i, lenCuv, lenCuvDict;
- for(i = 0; i < n; i++) {
- if(!strcmp(cuv, dict[i].RO))
- {
- strcpy(cuvTradus, dict[i].LS);
- free(dict);
- return 0; /// Traductibil
- }
- else if(strlen(cuv) < strlen(dict[i].RO)) continue; /// Intraductibil
- else {
- lenCuv = strlen(cuv);
- lenCuvDict = strlen(dict[i].RO);
- if(!strncmp(cuv, dict[i].RO, lenCuvDict)) {
- strcpy(cuvTradus, dict[i].LS);
- free(dict);
- return lenCuv - lenCuvDict; /// Partial traductibil; se returneaza prefix
- }
- }
- }
- strcpy(cuvTradus, cuv);
- free(dict);
- return -1; /// Intraductibil
- }
- /// C
- char CategoriiCuvinte(char *fisText, char *limba, int *T, int *PT, int *IT) {
- FILE *f = fopen(fisText, "r");
- *T = *PT = *IT = 0;
- char lin[1001], cuv[1001], *p;
- int tip;
- while(fgets(lin, 1001, f)) {
- p = strtok(lin, " .,!?\n");
- while(p) {
- tip = TraducereCuvant(p, cuv, limba);
- //printf("%s %s %d\n", p, cuv, tip);
- switch(tip) {
- case -1: (*IT)++; break;
- case 0: (*T)++; break;
- case 1: (*PT)++; break;
- case 2: (*PT)++; break;
- }
- p = strtok(NULL, " .,!?\n");
- }
- }
- fclose(f);
- }
- /// D
- float Traductibilitate(char *fisText, char *limba) {
- int T, PT, IT;
- CategoriiCuvinte(fisText, limba, &T, &PT, &IT);
- return (float)(T + PT) / (T + PT + IT);
- }
- /// E
- char *IndiceMaximTraductibilitate(char *fisText, ...) {
- float IT, ITMax = -1.0;
- char *limbaITMax, *limbaCrt;
- limbaCrt = malloc(51); strcpy(limbaCrt, "");
- limbaITMax = malloc(51); strcpy(limbaITMax, "");
- va_list limbi;
- va_start(limbi, fisText);
- while(limbaCrt = va_arg(limbi, char*)) {
- IT = Traductibilitate(fisText, limbaCrt);
- if(IT > ITMax) {
- ITMax = IT;
- strcpy(limbaITMax, limbaCrt);
- }
- }
- va_end(limbi);
- free(limbaCrt);
- return limbaITMax;
- }
- /// F
- void Traducere() {
- char *fisText; fisText = malloc(51);
- strcpy(fisText, "text_romana.txt");
- char *limba = IndiceMaximTraductibilitate(fisText, "engleza", "franceza", "germana", NULL);
- char *fisLimba; fisLimba = malloc(51);
- sprintf(fisLimba, "text_%s.txt", limba);
- FILE *fi = fopen(fisText, "r");
- FILE *fo = fopen(fisLimba, "w");
- float IT = Traductibilitate(fisText, limba);
- if(IT < 0.4) {
- fprintf(fo, "Imposibil!");
- fclose(fi);
- fclose(fo);
- return;
- }
- char lin[1001], cuv[1001], *p;
- int tip;
- while(fgets(lin, 1001, fi)) {
- p = strtok(lin, " .,!?\n");
- while(p) {
- tip = TraducereCuvant(p, cuv, limba);
- //printf("%s %s %d\n", p, cuv, tip);
- switch(tip) {
- case -1: fprintf(fo, "[%s] ", cuv); break;
- case 0: fprintf(fo, "%s ", cuv); break;
- case 1: fprintf(fo, "%s? ", cuv); break;
- case 2: fprintf(fo, "%s?? ", cuv); break;
- }
- p = strtok(NULL, " .,!?\n");
- }
- fprintf(fo, "\n");
- }
- free(limba);
- fclose(fi);
- fclose(fo);
- }
- int main() {
- /*
- Cuvant *dict;
- int n;
- CitireDictionar("dictionar_engleza.txt", &dict, &n);
- printf("%s\n", TraducereCuvant("caine", "engleza"));
- int a, b, c;
- CategoriiCuvinte("text_romana.txt", "germana", &a, &b, &c);
- printf("%d %d %d", a, b, c);
- printf("%.2lf\n", Traductibilitate("text_romana.txt", "engleza"));
- printf("%.2lf\n", Traductibilitate("text_romana.txt", "franceza"));
- printf("%.2lf\n", Traductibilitate("text_romana.txt", "germana"));
- printf("%s\n", IndiceMaximTraductibilitate("text_romana.txt", "engleza", "franceza", "germana", NULL));
- */
- Traducere();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement