Advertisement
J00ker

Untitled

Jan 19th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.96 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdarg.h>
  5.  
  6. /// A
  7. typedef struct {
  8.     char RO[21], LS[21];
  9. } Cuvant;
  10.  
  11. int *cmpCuvant(const void *a, const void *b) {
  12.     int lenA, lenB;
  13.     lenA = strlen( (*((Cuvant*)(a))).RO );
  14.     lenB = strlen( (*((Cuvant*)(b))).RO );
  15.     return lenB - lenA;
  16. }
  17.  
  18. void CitireDictionar(char *fis, Cuvant **dict, int *n) {
  19.     FILE *f = fopen(fis, "r");
  20.  
  21.     fscanf(f, "%d", n);
  22.     //printf("%d\n", *n);
  23.     *dict = malloc((*n) * sizeof(Cuvant));
  24.  
  25.     int i;
  26.     for(i = 0; i < (*n); i++) {
  27.         fscanf(f, "%s %s", (*dict)[i].RO, (*dict)[i].LS);
  28.         //printf("%s %s\n", (*dict)[i].RO, (*dict)[i].LS);
  29.     }
  30.  
  31.     qsort(*dict, *n, sizeof(Cuvant), cmpCuvant);
  32.  
  33.     fclose(f);
  34. }
  35.  
  36. /// B
  37. int TraducereCuvant(char *cuv, char *cuvTradus, char *limba) {
  38.     char fis[200];
  39.     sprintf(fis, "dictionar_%s.txt", limba);
  40.  
  41.     int n;
  42.     Cuvant *dict;
  43.     CitireDictionar(fis, &dict, &n);
  44.  
  45.     int i, lenCuv, lenCuvDict;
  46.     for(i = 0; i < n; i++) {
  47.         if(!strcmp(cuv, dict[i].RO))
  48.         {
  49.             strcpy(cuvTradus, dict[i].LS);
  50.             free(dict);
  51.             return 0; /// Traductibil
  52.         }
  53.         else if(strlen(cuv) < strlen(dict[i].RO)) continue; /// Intraductibil
  54.         else {
  55.             lenCuv = strlen(cuv);
  56.             lenCuvDict =  strlen(dict[i].RO);
  57.             if(!strncmp(cuv, dict[i].RO, lenCuvDict)) {
  58.                 strcpy(cuvTradus, dict[i].LS);
  59.                 free(dict);
  60.                 return lenCuv - lenCuvDict; /// Partial traductibil; se returneaza prefix
  61.             }
  62.         }
  63.     }
  64.  
  65.     strcpy(cuvTradus, cuv);
  66.     free(dict);
  67.     return -1; /// Intraductibil
  68. }
  69.  
  70. /// C
  71. char CategoriiCuvinte(char *fisText, char *limba, int *T, int *PT, int *IT) {
  72.     FILE *f = fopen(fisText, "r");
  73.  
  74.     *T = *PT = *IT = 0;
  75.  
  76.     char lin[1001], cuv[1001], *p;
  77.     int tip;
  78.     while(fgets(lin, 1001, f)) {
  79.         p = strtok(lin, " .,!?\n");
  80.         while(p) {
  81.             tip = TraducereCuvant(p, cuv, limba);
  82.             //printf("%s %s %d\n", p, cuv, tip);
  83.  
  84.             switch(tip) {
  85.                 case -1: (*IT)++; break;
  86.                 case  0:  (*T)++; break;
  87.                 case  1: (*PT)++; break;
  88.                 case  2: (*PT)++; break;
  89.             }
  90.  
  91.             p = strtok(NULL, " .,!?\n");
  92.         }
  93.     }
  94.  
  95.     fclose(f);
  96. }
  97.  
  98. /// D
  99. float Traductibilitate(char *fisText, char *limba) {
  100.     int T, PT, IT;
  101.  
  102.     CategoriiCuvinte(fisText, limba, &T, &PT, &IT);
  103.  
  104.     return (float)(T + PT) / (T + PT + IT);
  105. }
  106.  
  107. /// E
  108. char *IndiceMaximTraductibilitate(char *fisText, ...) {
  109.     float IT, ITMax = -1.0;
  110.     char *limbaITMax, *limbaCrt;
  111.     limbaCrt = malloc(51);   strcpy(limbaCrt, "");
  112.     limbaITMax = malloc(51); strcpy(limbaITMax, "");
  113.  
  114.     va_list limbi;
  115.     va_start(limbi, fisText);
  116.  
  117.     while(limbaCrt = va_arg(limbi, char*)) {
  118.         IT = Traductibilitate(fisText, limbaCrt);
  119.         if(IT > ITMax) {
  120.             ITMax = IT;
  121.             strcpy(limbaITMax, limbaCrt);
  122.         }
  123.     }
  124.  
  125.     va_end(limbi);
  126.     free(limbaCrt);
  127.     return limbaITMax;
  128. }
  129.  
  130. /// F
  131. void Traducere() {
  132.     char *fisText; fisText = malloc(51);
  133.     strcpy(fisText, "text_romana.txt");
  134.  
  135.     char *limba = IndiceMaximTraductibilitate(fisText, "engleza", "franceza", "germana", NULL);
  136.     char *fisLimba; fisLimba = malloc(51);
  137.     sprintf(fisLimba, "text_%s.txt", limba);
  138.  
  139.     FILE *fi = fopen(fisText, "r");
  140.     FILE *fo = fopen(fisLimba, "w");
  141.  
  142.     float IT = Traductibilitate(fisText, limba);
  143.     if(IT < 0.4) {
  144.         fprintf(fo, "Imposibil!");
  145.         fclose(fi);
  146.         fclose(fo);
  147.         return;
  148.     }
  149.  
  150.     char lin[1001], cuv[1001], *p;
  151.     int tip;
  152.     while(fgets(lin, 1001, fi)) {
  153.         p = strtok(lin, " .,!?\n");
  154.         while(p) {
  155.             tip = TraducereCuvant(p, cuv, limba);
  156.             //printf("%s %s %d\n", p, cuv, tip);
  157.  
  158.             switch(tip) {
  159.                 case -1: fprintf(fo, "[%s] ", cuv); break;
  160.                 case  0: fprintf(fo, "%s ",   cuv); break;
  161.                 case  1: fprintf(fo, "%s? ",  cuv); break;
  162.                 case  2: fprintf(fo, "%s?? ", cuv); break;
  163.             }
  164.  
  165.             p = strtok(NULL, " .,!?\n");
  166.         }
  167.         fprintf(fo, "\n");
  168.     }
  169.  
  170.     free(limba);
  171.     fclose(fi);
  172.     fclose(fo);
  173. }
  174.  
  175. int main() {
  176.     /*
  177.     Cuvant *dict;
  178.     int n;
  179.  
  180.     CitireDictionar("dictionar_engleza.txt", &dict, &n);
  181.  
  182.     printf("%s\n", TraducereCuvant("caine", "engleza"));
  183.  
  184.     int a, b, c;
  185.     CategoriiCuvinte("text_romana.txt", "germana", &a, &b, &c);
  186.     printf("%d %d %d", a, b, c);
  187.  
  188.     printf("%.2lf\n", Traductibilitate("text_romana.txt", "engleza"));
  189.     printf("%.2lf\n", Traductibilitate("text_romana.txt", "franceza"));
  190.     printf("%.2lf\n", Traductibilitate("text_romana.txt", "germana"));
  191.  
  192.     printf("%s\n", IndiceMaximTraductibilitate("text_romana.txt", "engleza", "franceza", "germana", NULL));
  193.  
  194.     */
  195.     Traducere();
  196.     return 0;
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement