sultan

Poprobui

Jan 12th, 2012
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <locale.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. int count_strok, count_razdelit, max_count_symb, count_numbers_razdelit, kol_str;
  7. char **base_text;
  8. char *result;
  9. char *razdeliteli;
  10. int num_razdel[1000];
  11.  
  12. void init()
  13. {
  14.     printf("Vvedite koli4estvo strok\n");
  15.     scanf("%d%*c", &count_strok);
  16.     printf("Vvedite text\n");
  17.     base_text = (char **)malloc((count_strok+1)*sizeof(char *));
  18.     int i;
  19.     i=1;
  20.     //вводим текст
  21.     for (i=1; i<=count_strok; i++)
  22.     {
  23.         base_text[i] = (char *) malloc(256*sizeof(char));
  24.         fgets(base_text[i], 256, stdin);// максимум 256 символов
  25.         base_text[i] = (char *) realloc(base_text[i], strlen(&base_text[i][0])*sizeof(char));
  26.     }
  27.     printf("Vvedite koli4estvo razdelitelei\n");
  28.     // Вводим разделители, пока не встретится повторающийся
  29.     scanf("%d%*c", &count_razdelit);
  30.     count_razdelit++;
  31.     printf("Vvedite stroky razdelitelei\n");
  32.     razdeliteli=(char*)malloc((count_razdelit+1)*sizeof(char));
  33.     fgets(razdeliteli, 256, stdin);
  34.     printf("Vvedite maximal'noe koli4estvo simvolov v stroke\n");
  35.     scanf("%d", &max_count_symb);
  36. }
  37.  
  38. void compress()
  39. {
  40.     result = (char *)malloc(5*count_strok*max_count_symb*sizeof(char));
  41.     result[0]='\0';
  42.     int len_result,i;
  43.     len_result=0;
  44.     for (i=1; i<=count_strok; i++)
  45.     {
  46.         strcat(result, base_text[i]);
  47.         len_result += strlen(&base_text[i][0]);
  48.         result[len_result]= '\n';
  49.         result[++len_result]='\0';
  50.     }
  51. }
  52.  
  53. int is_razdelitel(char x)
  54. {
  55.     int i;
  56.     for (i=0; i<count_razdelit; i++)
  57.      if ( razdeliteli[i] == x)
  58.       return 1;
  59.     return 0;
  60. }
  61.  
  62.  
  63. void delete_other_razdelit()
  64. {
  65.     int i;
  66.     for (i=0; i<(int)strlen(&result[0]); i++)
  67.     {
  68.         if ( result[i] == '\n' )
  69.          result[i] = razdeliteli[0];
  70.         if ( is_razdelitel(result[i]) )
  71.         {
  72.             int how =1;
  73.             int x=i+1;
  74.             while ( is_razdelitel(result[x]) )
  75.             {
  76.                 how++;
  77.                 x++;
  78.             }
  79.             int j=i+how;
  80.             for (j=i+how; j<(int)strlen(&result[0]); j++)
  81.                 result[j-how+1] = result[j];
  82.             result[strlen(&result[0])-how+1]='\0';
  83.         }
  84.     }
  85.     result = (char *) realloc(result, strlen(&result[0])*sizeof(char));
  86.     num_razdel[0]=0;
  87.     count_numbers_razdelit=1;
  88. }
  89.  
  90. void find_razdelit()
  91. {
  92.     int i;
  93.     num_razdel[0]=0;
  94.     count_numbers_razdelit=1;
  95.     for (i=0; i<(int)strlen(&result[0]); i++)
  96.     {
  97.         if ( is_razdelitel(result[i]))
  98.         {
  99.             num_razdel[count_numbers_razdelit++] = i+1;
  100.         }
  101.     }
  102. }
  103.  
  104. void divide_text()
  105. {
  106.     free(base_text);
  107.     base_text = (char**)malloc(sizeof(char*)*count_strok);
  108.     int now_str, last_del;
  109.     now_str=1; last_del=0;
  110.     num_razdel[count_numbers_razdelit++] = strlen(&result[0]);
  111.     char *tmp;
  112.     tmp=(char*)malloc( max_count_symb*sizeof(char));
  113.     int i;
  114.     for (i=0; i<count_numbers_razdelit; i++)
  115.     {
  116.             base_text[now_str] = (char *) malloc(max_count_symb*sizeof(char)); // Выделяем память для строки
  117.             base_text[now_str][0] = '\0';
  118.             // Добавляем слова, пока хватает строки
  119.             while (  (i<count_numbers_razdelit-1) && (num_razdel[i] - num_razdel[last_del] <= max_count_symb))
  120.              i++;
  121.             if ( num_razdel[i] - num_razdel[last_del] > max_count_symb)
  122.                 i--;
  123.             if ( i<= last_del)
  124.             {
  125.                 printf("Ne mogu sostavit' text, t.k. dlina slova > max_symb");
  126.                 exit(0);//Выходим из программы
  127.             }
  128.             // Добавляем в строку
  129.             tmp = (char *)realloc( tmp, (num_razdel[i] - num_razdel[last_del]+1)*sizeof(char));
  130.             tmp[0]='\0';
  131.             strncpy(tmp, &result[num_razdel[last_del]],num_razdel[i] - num_razdel[last_del]);
  132.             tmp[num_razdel[i] - num_razdel[last_del]]='\0';
  133.             strcat(base_text[now_str], tmp);
  134.             base_text[now_str][strlen(&tmp[0])]='\0';
  135.             now_str++;
  136.             last_del = i;
  137.     }
  138.     free(result);
  139.     kol_str = now_str;
  140. }
  141.  
  142. void print()
  143. {
  144.     printf("Answer:\n");
  145.     int i;
  146.     for (i=1; i<kol_str; i++)
  147.     {
  148.         printf("%s\n", base_text[i]);
  149.         free(base_text[i]);
  150.     }
  151. }
  152.  
  153. int main()
  154. {
  155.     setlocale(LC_CTYPE,"Russian");
  156.     init(); // Ввод
  157.     compress();// Сжимаем весь текст в одну строку
  158.     delete_other_razdelit();// Удаляем лишние разделители
  159.     find_razdelit();// Находим номера разделителей в строке
  160.     divide_text();//Разделяем текст на строки с указанным количеством символов
  161.     print(); //Выводим текст
  162.     return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment