Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Задан набор слов. Количество слов в наборе не более 50, самое длинное слово содержит 25 букв.
- Назовем корневым слово, которое совпадает с началом одного или нескольких других слов из набора. Написать программу нахождения:
- – самого длинного корневого слова;
- – самого важного слова, т.е. того, которое является корневым для наибольшего количества других слов из набора.
- Если в наборе содержатся несколько самых длинных или самых важных слов, то найти любое из них.
- Входные данные: слова, хранящиеся в текстовом файле. В каждой строке файла, кроме, быть может, последней, записано более чем 1 слово.
- Результаты записываются в 2 текстовых файла:
- 1) самое длинное корневое слово и все слова, для которых оно является корневым, или слово NO, если корневых слов нет;
- 2) самое важное слово и количество слов, для которых оно является корневым, или слово NO, если корневых слов нет.
- Работа программы будет проверяться на тестовых наборах слов.
- */
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- FILE* fopen_secure(const char fname[], const char mode[]) //функция безопасного открытия
- {
- FILE *f=fopen(fname, mode);
- if(f==NULL) //если fopen возвращает нулевой указатель, то выводит ошибку
- {
- fclose(f);
- printf("Cannot open file %s with mode %s\n", fname, mode);
- exit(0);
- }
- return f;
- }
- void word_search (char **M, int n, int b[]) //поиск количества корневых слов для каждого слова
- {
- int r1, r2;
- for (int i=0; i<n; ++i)
- {
- r1=strlen(M[i])-1;
- for (int j=0; j<n; ++j)
- {
- r2=strlen(M[j])-1;
- if (r1<r2)
- {
- if (strncmp(M[i],M[j],r1)==0) b[i]=b[i]+1;
- }
- }
- }
- }
- int test (int b[],int n, FILE *f1)
- {
- int c[50];
- for ( int i=0; i<n; i++) c[i]=b[i];
- for ( int i=1; i<n; i++)
- {
- c[0]+=c[i];
- }
- if (c[0]==0)
- {
- fputs("NO\n",f1);
- exit(0);
- }
- }
- void SFAI (FILE *f, FILE *f2, char **M, int n, int m) //search for an important
- {
- int b[50];
- for ( int i=0; i<n ; ++i) b[i]=0;
- char **M1;
- M1=new char *[n];
- for ( int i=0; i<n; ++i)
- {
- M1[i]=new char[m];
- M1[i]=M[i];
- }
- word_search(M,n,b);
- int max=0;
- for ( int i=1; i<n; ++i)
- {
- if (b[max]<b[i])
- {
- max=i;
- }
- }
- if (b[max]==0) fputs("NO\n",f2);
- else
- {
- fprintf(f2, "%d ", b[max]+1);
- fflush(f2);
- fputs(M1[max],f2);
- }
- }
- void SFTL (FILE *f, FILE *f1, char **M, int n, int m) //search for the longest
- {
- int r1, r2, a[25], b[50], k=1, imax=0; //len and array for len
- for (int i=0; i<n; ++i)
- {
- a[i]=0;
- b[i]=0;
- }
- char **M2;
- M2=new char *[n];
- for ( int i=0; i<n; ++i)
- {
- M2[i]=new char[m];
- M2[i]=M[i];
- }
- for (int i=0; i<n; ++i) //подсчет длины каждого слова
- {
- r1=strlen(M2[i])-1;
- a[i]=r1;
- }
- word_search(M2,n,b);
- while(k!=0)
- {
- for( int i=0; i<n; i++) //нахождение максимальной длины
- {
- if(a[i]>a[imax]) imax=i;
- }
- if (b[imax]==0)
- {
- a[imax]=0;
- }
- else
- {
- r1=strlen(M2[imax])-1;
- fputs(M2[imax],f1);
- for (int i=0; i<n; i++)
- {
- r2=strlen(M2[i])-1;
- if (r1<r2)
- {
- if (strncmp(M2[imax],M[i],r1)==0) fputs(M2[i],f1);
- }
- }
- exit(0);
- }
- test(b,n,f1);
- }
- }
- void main()
- {
- FILE *f, *f1, *f2;
- int n=50, m=25, k=0;
- char **M;
- M=new char *[n];
- for ( int i=0; i<n; ++i)
- {
- M[i]=new char[m];
- }
- f=fopen_secure("f.txt","r");
- f1=fopen_secure("f1.txt","w");
- f2=fopen_secure("f2.txt","w+");
- fflush(stdin);
- for ( int i=0; i<n && (!feof(f)); ++i, k++)
- {
- fgets(M[i],25,f);
- }
- SFAI(f,f2,M,k,m);
- SFTL(f,f1,M,k,m);
- }
Advertisement
Add Comment
Please, Sign In to add comment