Val_Kir

2lab_11

Feb 27th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.45 KB | None | 0 0
  1. /*  Задан набор слов. Количество слов в наборе не более 50, самое длинное слово содержит 25 букв.
  2.     Назовем корневым слово, которое совпадает с началом одного или нескольких других слов из набора. Написать программу нахождения:
  3.     – самого длинного корневого слова;
  4.     – самого важного слова, т.е. того, которое является корневым для наибольшего количества других слов из набора.
  5.     Если в наборе содержатся несколько самых длинных или самых важных слов, то найти любое из них.
  6.     Входные данные: слова, хранящиеся в текстовом файле. В каждой строке файла, кроме, быть может, последней, записано более чем 1 слово.
  7.     Результаты записываются в 2 текстовых файла:
  8.     1) самое длинное корневое слово и все слова, для которых оно является корневым, или слово NO, если корневых слов нет;
  9.     2) самое важное слово и количество слов, для которых оно является корневым, или слово NO, если корневых слов нет.
  10.     Работа программы будет проверяться на тестовых наборах слов.
  11. */
  12.  
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16.  
  17. FILE* fopen_secure(const char fname[], const char mode[]) //функция безопасного открытия
  18. {
  19.     FILE *f=fopen(fname, mode);
  20.     if(f==NULL) //если fopen возвращает нулевой указатель, то выводит ошибку
  21.     {
  22.         fclose(f);
  23.         printf("Cannot open file %s with mode %s\n", fname, mode);
  24.         exit(0);
  25.     }
  26.     return f;
  27. }
  28.  
  29. void word_search (char **M, int n, int b[])  //поиск количества корневых слов для каждого слова
  30. {
  31.     int r1, r2;
  32.     for (int i=0; i<n; ++i)
  33.     {
  34.         r1=strlen(M[i])-1;
  35.         for (int j=0; j<n; ++j)
  36.         {
  37.             r2=strlen(M[j])-1;
  38.             if (r1<r2)
  39.             {
  40.                 if (strncmp(M[i],M[j],r1)==0) b[i]=b[i]+1;
  41.             }
  42.         }
  43.     }
  44. }
  45.  
  46. int test (int b[],int n, FILE *f1)
  47. {
  48.     int c[50];
  49.  
  50.     for ( int i=0; i<n; i++) c[i]=b[i];
  51.  
  52.     for ( int i=1; i<n; i++)
  53.     {
  54.         c[0]+=c[i];
  55.     }
  56.  
  57.     if (c[0]==0)
  58.     {
  59.         fputs("NO\n",f1);
  60.         exit(0);
  61.     }
  62. }
  63.  
  64.  
  65. void SFAI (FILE *f, FILE *f2, char **M, int n, int m) //search for an important
  66. {
  67.     int b[50];
  68.  
  69.     for ( int i=0; i<n ; ++i) b[i]=0;
  70.  
  71.     char **M1;
  72.  
  73.     M1=new char *[n];
  74.     for ( int i=0; i<n; ++i)
  75.     {
  76.         M1[i]=new char[m];
  77.         M1[i]=M[i];
  78.     }
  79.  
  80.     word_search(M,n,b);
  81.  
  82.     int max=0;
  83.     for ( int i=1; i<n; ++i)
  84.     {
  85.         if (b[max]<b[i])
  86.         {
  87.             max=i;
  88.         }
  89.     }
  90.  
  91.     if (b[max]==0) fputs("NO\n",f2);
  92.     else
  93.     {
  94.         fprintf(f2, "%d ", b[max]+1);
  95.         fflush(f2);
  96.         fputs(M1[max],f2);
  97.     }
  98. }
  99.  
  100. void SFTL (FILE *f, FILE *f1, char **M, int n, int m) //search for the longest
  101. {
  102.     int r1, r2, a[25], b[50], k=1, imax=0; //len and array for len
  103.  
  104.     for (int i=0; i<n; ++i)
  105.     {
  106.         a[i]=0;
  107.         b[i]=0;
  108.     }
  109.  
  110.     char **M2;
  111.  
  112.     M2=new char *[n];
  113.     for ( int i=0; i<n; ++i)
  114.     {
  115.         M2[i]=new char[m];
  116.         M2[i]=M[i];
  117.     }
  118.  
  119.     for (int i=0; i<n; ++i) //подсчет длины каждого слова
  120.     {
  121.         r1=strlen(M2[i])-1;
  122.         a[i]=r1;
  123.     }
  124.  
  125.     word_search(M2,n,b);
  126.  
  127.     while(k!=0)
  128.     {
  129.         for( int i=0; i<n; i++) //нахождение максимальной длины
  130.         {
  131.             if(a[i]>a[imax]) imax=i;
  132.         }
  133.  
  134.         if (b[imax]==0)
  135.         {
  136.             a[imax]=0;
  137.         }
  138.         else
  139.         {
  140.             r1=strlen(M2[imax])-1;
  141.             fputs(M2[imax],f1);
  142.             for (int i=0; i<n; i++)
  143.             {
  144.                 r2=strlen(M2[i])-1;
  145.                 if (r1<r2)
  146.                 {
  147.                     if (strncmp(M2[imax],M[i],r1)==0) fputs(M2[i],f1);
  148.                 }
  149.             }
  150.             exit(0);
  151.         }
  152.         test(b,n,f1);
  153.     }
  154. }
  155.  
  156. void main()
  157. {
  158.     FILE *f, *f1, *f2;
  159.     int n=50, m=25, k=0;
  160.     char **M;
  161.  
  162.     M=new char *[n];
  163.     for ( int i=0; i<n; ++i)
  164.     {
  165.         M[i]=new char[m];
  166.     }
  167.  
  168.  
  169.     f=fopen_secure("f.txt","r");
  170.     f1=fopen_secure("f1.txt","w");
  171.     f2=fopen_secure("f2.txt","w+");
  172.  
  173.     fflush(stdin);
  174.     for ( int i=0; i<n && (!feof(f)); ++i, k++)
  175.     {
  176.         fgets(M[i],25,f);
  177.        
  178.     }
  179.  
  180.     SFAI(f,f2,M,k,m);
  181.  
  182.     SFTL(f,f1,M,k,m);
  183. }
Advertisement
Add Comment
Please, Sign In to add comment