Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include<string.h>
- #include<strings.h>
- char** input_text(int* quantity_line){
- char c;
- int i = 0;
- int j = 0;
- char**line;
- line = (char**)calloc(1,sizeof(char*));
- if (line == NULL){
- printf("\nОшибка выделения памяти.\n");
- exit(1);
- }
- line[i] = (char*)calloc(1,sizeof(char));
- if (line[i] == NULL){
- printf("\nОшибка выделения памяти.\n");
- exit(1);
- }
- while ('\n' != (c = getchar())){
- if (c!='.'){
- line[i]=(char*)realloc(line[i],(j+2)*sizeof(char));
- if (line[i] == NULL){
- printf("\nОшибка выделения памяти.\n");
- exit(1);
- }
- line[i][j] = c;
- j++;
- }
- else{
- line[i]=(char*)realloc(line[i],(j+3)*sizeof(char));
- if (line[i] == NULL){
- printf("\nОшибка выделения памяти.\n");
- exit(1);
- }
- line[i][j] = c;
- j++;
- line[i][j] = '\0';
- j=0;
- i++;
- line = (char**)realloc(line,(i+1)*sizeof(char*));
- if (line == NULL){
- printf("\nОшибка выделения памяти.\n");
- exit(1);
- }
- line[i] = (char*)calloc(3,sizeof(char));
- if (line[i] == NULL){
- printf("\nОшибка выделения памяти.\n");
- exit(1);
- }
- (*quantity_line)++;
- }
- }
- free(line[i]);
- return line;
- }
- void delete_identical_sentences(char** line,int* quantity_line){
- for(int i=0;i<*quantity_line;i++){
- int j=i+1;
- while(j<*quantity_line){
- if (strcasecmp(line[i],line[j])==0){
- free(line[j]);
- for (int e = j;e<=*quantity_line-1;e++)
- line[e]=line[e+1];
- (*quantity_line)--;
- }
- else{
- j++;
- }
- }
- }
- }
- void memory_clearing(char** line,const int* quantity_line){
- int i;
- for (i=0; i<*quantity_line; i++){
- free(line[i]);
- }
- free(line);
- }
- void deleting_an_offer(char**line,int* quantity_line){
- int i = 0;
- int j;
- int e;
- int flag = 0;
- while (i < *quantity_line){
- for (j = 0;j < strlen(line[i]);j++){
- if (line[i][j] == ','){
- flag = 1;
- }
- }
- if (flag == 1){
- free(line[i]);
- for (e = i;e<*quantity_line;e++){
- line[e]=line[e+1];
- }
- (*quantity_line)--;
- flag = 0;
- }
- else {
- i++;
- }
- }
- }
- void display_the_text(char**line,const int*quantity_line){
- for(int i=0;i<*quantity_line;i++){
- printf("%s", line[i]);
- }
- printf("\n");
- }
- void amount_of_words(char**line, const int*quantity_line){
- int lenth = 0;
- int sum = 0;
- int index = 0;
- char ** arrWords =(char **)calloc(sum, sizeof(char *));
- char * word;
- word = (char *)calloc(1000, sizeof(char));
- for(int i = 0; i<*quantity_line; i++){
- for (int j = 0; j < strlen(line[i]) ; j++) {
- if((line[i][j]==' ')||(line[i][j]==',')||(line[i][j]=='.')){
- sum++;
- arrWords = realloc(arrWords, sum* sizeof(char *));
- word[lenth] = '\0';
- arrWords[sum-1] = (char *)calloc(lenth, sizeof(char));
- strncpy(arrWords[sum-1], word, strlen(word));
- free(word);
- word = (char *)calloc(1000, sizeof(char));
- lenth = 0;
- } else{
- word[lenth] = line[i][j];
- lenth++;
- }
- }
- }
- sum--;
- char ** neWords =(char **)calloc(sum, sizeof(char *));
- int arrSum[10000];
- neWords[index] = (char *)calloc(strlen(arrWords[0]), sizeof(char ));
- strcpy(neWords[index], arrWords[index]);
- index++;
- for (int k = 0; k < sum ; ++k) {
- for (int i = 0; i < index ; ++i) {
- if(strcmp(arrWords[k], neWords[i])==0){
- arrSum[i]++;
- break;
- }
- if (i== index-1){
- arrSum[index] = 1;
- neWords[index] = arrWords[k];
- index++;
- }
- }
- }
- for (int d=0;d<index;d++)
- printf("Слово: %s встречается в тексте %d раз(а)\n",neWords[d], arrSum[d]);
- }
- void words_shifters(char**line,const int*quantity_line){
- char* beginning_word;
- char* end_word;
- char symbol;
- int index;
- for(int i=0;i<*quantity_line;i++){
- int beginning_index=0;
- beginning_word=&line[i][0];
- for (int j=0;j<strlen(line[i]);j++){
- if ((line[i][j]==' ')||(line[i][j]==',')||(line[i][j]=='.')){
- end_word=&line[i][j-1];
- index = 0;
- while (index!=((j-beginning_index)/2)){
- symbol=*(beginning_word+index);
- *(beginning_word+index)=*(end_word-index);
- *(end_word-index)=symbol;
- index++;
- }
- if (line[i][j]=='.')
- break;
- beginning_word=&line[i][j+1];
- beginning_index=j+1;
- }
- }
- }
- }
- int sorting_offers_on_the_fifth_character(const void* x1, const void * x2)
- {
- int value_str1;
- int value_str2;
- char* str1=*(char**)x1;
- char* str2=*(char**)x2;
- int i = 4;
- if (strlen(str1)<5)
- {
- value_str1=-1;
- }
- else
- {
- if(str1[i]==' '||str1[i]==',')
- {
- value_str1=(int)str1[i+1];
- }
- else
- {
- value_str1=(int)str1[i];
- }
- }
- if (strlen(str2)<5)
- {
- value_str2=-1;
- }
- else
- {
- if(str2[i]==' '||str2[i]==',')
- {
- value_str2=(int)str2[i+1];
- }
- else
- {
- value_str2=(int)str2[i];
- }
- }
- if (value_str1==value_str2)
- {
- return 0;
- }
- if (value_str1>value_str2)
- {
- return -1;
- }
- if (value_str1<value_str2)
- {
- return 1;
- }
- return 0;
- }
- void sorting_offers(char**line,const int*quantity_line){
- qsort(line,*quantity_line,sizeof(char*),sorting_offers_on_the_fifth_character);
- }
- int main(){
- int command;
- int flag = 1;
- int quantity_line = 0;
- printf("Введите текст!\nПодсказка: Текст представляет собой предложения, разделенные точкой. Предложения - набор слов, разделенные пробелом или запятой, слова - набор латинских букв и цифр.\nЗамечание: Между словами может быть только один разделитель,в иных случаях программа будет работать некорректно!!!\n");
- char**line = input_text(&quantity_line);
- delete_identical_sentences(line,&quantity_line);
- printf("Введите номер команды для обработки текста:\n0)Вывести текст на экран\n1)Распечатать каждое слово и количество его повторений в тексте.\n2)Преобразовать каждое предложение так, что символы в каждом слове шли в обратном порядке.\n3)Удалить предложения в котором встречается запятая.\n4)Отсортировать предложения по уменьшению значения кода 5 символа предложения. Если 5 символ является разделителем между словами, то брать следующий символ. Если символов в предложении меньше 5, то для этого предложения значение равняется -1.\n5)Завершить программу.\n");
- do{
- printf("Введите номер команды: ");
- scanf("%d",&command);
- switch(command){
- case 0: display_the_text(line,&quantity_line);
- break;
- case 1: amount_of_words(line,&quantity_line);
- break;
- case 2: words_shifters(line,&quantity_line);
- break;
- case 3: deleting_an_offer(line,&quantity_line);
- break;
- case 4: sorting_offers(line,&quantity_line);
- break;
- case 5: memory_clearing(line,&quantity_line);
- flag = 0;
- break;
- default: printf("Данные некорректны!\n");
- break;
- }
- }while(flag==1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement