Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <locale.h>
- const int MAX_SIZE = 256;
- char** text; // сам текс
- char* separ;// массив разделителей
- char** word;// массив, где мы храним слова из текста
- int count_str; // количество строк в тексте
- int count_separator;// количество разделителей
- int count_same_words;// максимальное количество повторяющихся слов
- char** GetText()
- {
- char tmp[MAX_SIZE];// строка
- char** temp;
- char** buf;// временный массив, куда мы запихиваем текст
- int i,end_input;// i-счетчик строки, end_input - закончился ли вводить текст(1) или нет(0)
- count_str = 0;
- end_input=0;
- temp=NULL;buf=NULL;
- //printf("Text:\n");
- fflush(stdin);
- for (i=0; !end_input; i++)
- {
- gets(tmp);
- // считываем строку
- free(temp);
- temp=(char**)malloc((count_str+1)*sizeof(char*));
- int j;
- // добавляем её в текст
- for(j=0;j<count_str;j++)
- {
- temp[j]=(char*)malloc((strlen(buf[j])+1)*sizeof(char));
- strcpy(temp[j],buf[j]);
- buf[j][0]='\0';
- }
- free(buf);
- temp[i]=(char*)malloc((strlen(tmp)+1)*sizeof(char));
- strcpy(temp[i],tmp);
- count_str++;
- free(buf);
- buf=(char**)malloc(count_str*sizeof(char*));
- buf[i]=(char*)malloc(sizeof(temp[i]));
- strcpy(buf[i],temp[i]);
- // проверяем, встречалась ли такая строка
- for(j=0;j<count_str-1;j++)
- {
- buf[j]=(char*)malloc((strlen(temp[j])+1)*sizeof(char));
- strcpy(buf[j],temp[j]);
- free(temp[j]);
- if(strcmp(buf[j],tmp)==0)
- {
- end_input=1;
- }
- }
- free(temp);
- }
- return buf;
- }
- void GetSeparator()
- {
- puts("Size of separators:");
- scanf("%d%*c",&count_separator);
- fflush(stdin);
- // вводим массив разделитей
- separ = (char*)malloc((count_separator+2)*sizeof(char));
- gets(separ);
- separ[count_separator]='\n';separ[count_separator+1]='\0';
- }
- void OutSep() // вывод разделителей
- {
- printf("Separators:\n");
- printf("%s", separ);
- fflush(stdin);
- }
- //вывод текста
- void OutText(char** _in)
- {
- printf("Text:\n");
- int i;
- for (i = 0; i < count_str; i++)
- if ( strlen(_in[i]) != 0)
- printf("%s\n", _in[i]);
- fflush(stdin);
- getchar();
- }
- //функция, для подсчета количества разделителей в строке
- int CountSeparators(char* str)
- {
- int result,i;
- result=1;// количество разделителей
- for (i=0; i<strlen(str); i++)
- {
- if ( strchr(separ, str[i]) != NULL)
- {
- result++;
- }
- }
- return result;
- }
- // обработка строки текста - stroka
- char* CheckStr(char* stroka)
- {
- int count_word;// количество слов в строке
- count_word = CountSeparators(stroka);
- word = (char**)malloc( (count_word+1) * sizeof(char*));
- // массив слов
- char *tmp;
- tmp = strtok(stroka, separ);//текущее слово
- int i,j;
- i=0;
- while ( tmp != NULL)
- {
- //добавляем текущее слово в массив
- word[i] = (char*)malloc( (strlen(&tmp[0])+1) * sizeof(char));
- word[i][0]='\0';
- strcat(word[i], tmp);
- word[i][strlen(tmp)+1] = '\0';
- word[i][strlen(tmp)]=' ';
- i++;
- tmp = strtok(NULL, separ);
- }
- int count_same;// количество одинаковых слов в строке
- count_same=0;
- for (i=0;i<count_word; i++)
- {
- int t;// количество слов, одинаковых с данным словом
- t=1;
- for (j=i+1; j<count_word; j++)
- {
- if ( strcmp(word[i], word[j]) == 0)
- {
- t++;
- }
- }
- if ( t> count_same)
- {
- count_same=t;
- }
- }
- // если количество одинаковых слов превышает максимальное количество
- if ( count_same > count_same_words )
- {
- int max_len;
- max_len=0;//максимальная длина слова в строке
- for (i=0; i<count_word; i++)
- {
- if ( strlen(&word[i][0]) > max_len)
- {
- max_len= strlen(&word[i][0]);
- }
- }
- // удаляем слова с максимальной длиной
- for (i=0; i<count_word; i++)
- {
- if ( strlen(&word[i][0]) == max_len)
- {
- word[i][0]='\0';
- }
- }
- }
- free(stroka);
- stroka = (char*)malloc( sizeof(word));
- stroka[0]='\0';
- //склеиваем строку заново из слов
- for (i=0; i<count_word; i++)
- {
- if ( strlen(word[i]) != 0)
- {
- strcat(stroka, word[i]);
- }
- free(word[i]);
- }
- free(word);
- return stroka;
- }
- int main()
- {
- setlocale(LC_ALL, "rus");
- char inpChar='1';
- text=NULL;
- while(inpChar!='0')
- {
- printf("1) Ввод текста\n");
- printf("2) Ввод разделителей\n");
- printf("3) Ввод количества повторяющихся слов\n");
- printf("4) Обработка текста\n");
- printf("5) Вывести текст\n");
- printf("6) Вывод разделителей\n");
- printf("0) Выход\n\n");
- printf("Выбор:\t");
- inpChar = getchar();
- while ( inpChar == '\n') inpChar = getchar();
- fflush(stdin);
- switch(inpChar)
- {
- case '1':
- {
- text=GetText();
- break;
- }
- case '2':
- {
- GetSeparator();
- break;
- }
- case '3':
- {
- fflush(stdin);
- puts("Количество повторяющихся слов:");
- scanf("%d%*c",&count_same_words);
- fflush(stdin);
- break;
- }
- case '4':
- {
- //Operate Text
- int i;
- for (i=0; i<count_str; i++)
- {
- text[i] = CheckStr(text[i]);
- }
- break;
- }
- case '5': OutText(text); break;
- case '6': OutSep(); break;
- case '0': break;
- default:
- {
- printf("Неверно выбранный пункт! Повторите снова\n");
- break;
- }
- }
- }
- if(text!=NULL)
- {
- int i;
- for (i = 0; i < count_str; i++)
- free(text[i]);
- free(text);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment