sultan

kursa4_comments

Jan 23rd, 2012
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <locale.h>
  5.  
  6. const int MAX_SIZE = 256;
  7.  
  8. char** text; // сам текс
  9. char* separ;// массив разделителей
  10. char** word;// массив, где мы храним слова из текста
  11. int count_str; // количество строк в тексте
  12. int count_separator;// количество разделителей
  13. int count_same_words;// максимальное количество повторяющихся слов
  14.  
  15. char** GetText()
  16. {
  17.     char tmp[MAX_SIZE];// строка
  18.     char** temp;
  19.     char** buf;// временный массив, куда мы запихиваем текст
  20.     int i,end_input;// i-счетчик строки, end_input - закончился ли вводить текст(1) или нет(0)
  21.  
  22.     count_str = 0;
  23.     end_input=0;
  24.     temp=NULL;buf=NULL;
  25.     //printf("Text:\n");
  26.     fflush(stdin);
  27.  
  28.     for (i=0; !end_input; i++)
  29.     {
  30.                 gets(tmp);
  31.                 // считываем строку
  32.                 free(temp);
  33.                 temp=(char**)malloc((count_str+1)*sizeof(char*));
  34.                 int j;
  35.                 // добавляем её в текст
  36.                 for(j=0;j<count_str;j++)
  37.                 {
  38.                         temp[j]=(char*)malloc((strlen(buf[j])+1)*sizeof(char));
  39.                         strcpy(temp[j],buf[j]);
  40.                         buf[j][0]='\0';
  41.                 }
  42.                 free(buf);
  43.                 temp[i]=(char*)malloc((strlen(tmp)+1)*sizeof(char));
  44.                 strcpy(temp[i],tmp);
  45.                 count_str++;
  46.                 free(buf);
  47.                 buf=(char**)malloc(count_str*sizeof(char*));
  48.                 buf[i]=(char*)malloc(sizeof(temp[i]));
  49.                 strcpy(buf[i],temp[i]);
  50.                 // проверяем, встречалась ли такая строка
  51.                 for(j=0;j<count_str-1;j++)
  52.                 {
  53.                         buf[j]=(char*)malloc((strlen(temp[j])+1)*sizeof(char));
  54.                         strcpy(buf[j],temp[j]);
  55.                         free(temp[j]);
  56.                         if(strcmp(buf[j],tmp)==0)
  57.                         {
  58.                             end_input=1;
  59.                         }
  60.                 }
  61.                 free(temp);
  62.     }
  63.     return buf;
  64. }
  65.  
  66. void GetSeparator()
  67. {
  68.         puts("Size of separators:");
  69.         scanf("%d%*c",&count_separator);
  70.         fflush(stdin);
  71.         // вводим массив разделитей
  72.         separ = (char*)malloc((count_separator+2)*sizeof(char));
  73.         gets(separ);
  74.         separ[count_separator]='\n';separ[count_separator+1]='\0';
  75. }
  76.  
  77. void OutSep() // вывод разделителей
  78. {
  79.         printf("Separators:\n");
  80.         printf("%s", separ);
  81.         fflush(stdin);
  82. }
  83.  
  84. //вывод текста
  85. void OutText(char** _in)
  86. {
  87.         printf("Text:\n");
  88.         int i;
  89.         for (i = 0; i < count_str; i++)
  90.             if ( strlen(_in[i]) != 0)
  91.               printf("%s\n", _in[i]);
  92.         fflush(stdin);
  93.         getchar();
  94. }
  95.  
  96. //функция, для подсчета количества разделителей в строке
  97. int CountSeparators(char* str)
  98. {
  99.     int result,i;
  100.     result=1;// количество разделителей
  101.  
  102.     for (i=0; i<strlen(str); i++)
  103.     {
  104.         if ( strchr(separ, str[i]) != NULL)
  105.         {
  106.             result++;
  107.         }
  108.     }
  109.  
  110.     return result;
  111. }
  112.  
  113. // обработка строки текста - stroka
  114. char* CheckStr(char* stroka)
  115. {
  116.     int count_word;// количество слов в строке
  117.     count_word = CountSeparators(stroka);
  118.  
  119.     word = (char**)malloc( (count_word+1) * sizeof(char*));
  120.     // массив слов
  121.     char *tmp;
  122.     tmp = strtok(stroka, separ);//текущее слово
  123.     int i,j;
  124.     i=0;
  125.  
  126.     while ( tmp != NULL)
  127.     {
  128.         //добавляем текущее слово в массив
  129.         word[i] = (char*)malloc( (strlen(&tmp[0])+1) * sizeof(char));
  130.         word[i][0]='\0';
  131.         strcat(word[i], tmp);
  132.         word[i][strlen(tmp)+1] = '\0';
  133.         word[i][strlen(tmp)]=' ';
  134.         i++;
  135.         tmp = strtok(NULL, separ);
  136.     }
  137.  
  138.     int count_same;// количество одинаковых слов в строке
  139.     count_same=0;
  140.  
  141.     for (i=0;i<count_word; i++)
  142.     {
  143.         int t;// количество слов, одинаковых с данным словом
  144.         t=1;
  145.         for (j=i+1; j<count_word; j++)
  146.         {
  147.             if ( strcmp(word[i], word[j]) == 0)
  148.             {
  149.                 t++;
  150.             }
  151.         }
  152.         if ( t> count_same)
  153.         {
  154.             count_same=t;
  155.         }
  156.     }
  157.  
  158.     // если количество одинаковых слов превышает максимальное количество
  159.     if ( count_same > count_same_words )
  160.     {
  161.         int max_len;
  162.         max_len=0;//максимальная длина слова в строке
  163.  
  164.         for (i=0; i<count_word; i++)
  165.         {
  166.             if ( strlen(&word[i][0]) > max_len)
  167.             {
  168.                 max_len= strlen(&word[i][0]);
  169.             }
  170.         }
  171.  
  172.         // удаляем слова с максимальной длиной
  173.         for (i=0; i<count_word; i++)
  174.         {
  175.             if ( strlen(&word[i][0]) == max_len)
  176.             {
  177.                 word[i][0]='\0';
  178.             }
  179.         }
  180.     }
  181.  
  182.     free(stroka);
  183.     stroka = (char*)malloc( sizeof(word));
  184.     stroka[0]='\0';
  185.  
  186.     //склеиваем строку заново из слов
  187.     for (i=0; i<count_word; i++)
  188.     {
  189.         if ( strlen(word[i]) != 0)
  190.         {
  191.             strcat(stroka, word[i]);
  192.         }
  193.      free(word[i]);
  194.     }
  195.     free(word);
  196.  
  197.     return stroka;
  198. }
  199.  
  200. int main()
  201. {
  202.         setlocale(LC_ALL, "rus");
  203.         char inpChar='1';
  204.         text=NULL;
  205.         while(inpChar!='0')
  206.         {
  207.                 printf("1) Ввод текста\n");
  208.                 printf("2) Ввод разделителей\n");
  209.                 printf("3) Ввод количества повторяющихся слов\n");
  210.                 printf("4) Обработка текста\n");
  211.                 printf("5) Вывести текст\n");
  212.                 printf("6) Вывод разделителей\n");
  213.                 printf("0) Выход\n\n");
  214.                 printf("Выбор:\t");
  215.                 inpChar = getchar();
  216.                 while ( inpChar == '\n') inpChar = getchar();
  217.                 fflush(stdin);
  218.                 switch(inpChar)
  219.                 {
  220.                         case '1':
  221.                                 {
  222.                                         text=GetText();
  223.                                         break;
  224.                                 }
  225.                         case '2':
  226.                                 {
  227.                                         GetSeparator();
  228.                                         break;
  229.                                 }
  230.                         case '3':
  231.                                 {
  232.                                         fflush(stdin);
  233.                                         puts("Количество повторяющихся слов:");
  234.                                         scanf("%d%*c",&count_same_words);
  235.                                         fflush(stdin);
  236.                                         break;
  237.                                 }
  238.                         case '4':
  239.                                 {
  240.                                         //Operate Text
  241.                                         int i;
  242.                                         for (i=0; i<count_str; i++)
  243.                                         {
  244.                                             text[i] = CheckStr(text[i]);
  245.                                         }
  246.                                         break;
  247.                                 }
  248.                         case '5': OutText(text); break;
  249.                         case '6': OutSep(); break;
  250.                         case '0': break;
  251.                         default:
  252.                                 {
  253.                                         printf("Неверно выбранный пункт! Повторите снова\n");
  254.                                         break;
  255.                                 }
  256.                 }
  257.         }
  258.         if(text!=NULL)
  259.         {
  260.                 int i;
  261.                 for (i = 0; i < count_str; i++)
  262.                         free(text[i]);
  263.                 free(text);
  264.         }
  265.         return 0;
  266. }
Advertisement
Add Comment
Please, Sign In to add comment