Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.28 KB | None | 0 0
  1. // ConsoleApplication21.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include "string.h"
  7. #include <cctype>
  8. #pragma warning(disable : 4996)
  9. using namespace std;
  10.  
  11.  
  12.  
  13. char *replace(char *t, char* ns,char* sl, int *array_of_start_words, unsigned int k)
  14. {
  15.         //Вычисляем размер новой строки
  16.         //Размер исходной строки + количество замен *(длина слова на которое заменяем - длина искомого слова)
  17.         unsigned int new_size = strlen(t) + k * (strlen(sl) - strlen(ns));
  18.         //Выделяем память под новую строку
  19.         char *new_str = new char[new_size];
  20.         //Создаем итераторы
  21.         unsigned int iter_array = 0, iter_new_str = 0;
  22.         //Цикл копирования исходной строки
  23.         for (int i = 0; i < strlen(t); i++)
  24.         {
  25.                 //Если номер текущего элемента не совпадает с номером начала найденного слова
  26.                 if(i != array_of_start_words[iter_array])
  27.                 {
  28.                         //То просто копируем исходную строку
  29.                         new_str[iter_new_str] = t[i];
  30.                         iter_new_str++;
  31.                 }
  32.                 else
  33.                 {
  34.                         //Иначе в исходной строке пропускаем найденное слово
  35.                         i = i + strlen(ns) - 1;
  36.                         //и вместо него в новую строку вставляем слово, на которое нужно заменить
  37.                         for (int j = 0; j < strlen(sl); j++)
  38.                         {
  39.                                 new_str[iter_new_str] = sl[j];
  40.                                 iter_new_str++;
  41.  
  42.                         }
  43.                         //Увеличиваем итератор массива начала слов
  44.                         iter_array++;
  45.                 }
  46.         }
  47.         //Добавляем признак конца строки
  48.         new_str[iter_new_str] = '\0';
  49.         //Возвращаем результирующую строку
  50.         return new_str;
  51. }
  52. char *search(char *t,char *sr, char* ns, char* sl, unsigned int *k)
  53. {
  54.         //Вычисляем размеры всех исходных строк
  55.         unsigned int size_input_str = strlen(t),size_separator_chars = strlen(sr),size_search_word = strlen(ns),size_replace_word = strlen(sl);
  56.         //Вычисляем максимальное количество замен
  57.         int size_array = (int)size_input_str/size_search_word + 1;
  58.         //Итератор для массива начала слов
  59.         unsigned int array_iter = 0;
  60.         //Массив начала слов
  61.         int *array_of_start_words = new int[size_array];
  62.         //Цикл по исходной строке
  63.         for (int i = 0; i < size_input_str; i++)
  64.         {
  65.                 int j = 0;
  66.                 //Идем до первого символа, не являющимся разделительным
  67.                 while(j < size_separator_chars && i < size_input_str)
  68.                 {
  69.                         if(t[i] == sr[j])
  70.                                 {
  71.                                         i++;
  72.                                         j = 0;
  73.                                 }
  74.                         else j++;
  75.                 }
  76.                 //Цикл, проверяющий является ли слово искомым
  77.                 j = 0;
  78.                 while(j < size_search_word && i < size_input_str)
  79.                 {
  80.                         if(t[i] == ns[j])
  81.                         {
  82.                                 //Если первая буква совпадает, то запоминаем номер элемента в исходной строке
  83.                                 if(j == 0)
  84.                                 {
  85.                                         array_of_start_words[array_iter] = i;
  86.                                 }
  87.                                 //Переходим к следующему элементу в исходной строке
  88.                                         i++;
  89.                                 //Если найденная часть слова совпадает с искомым
  90.                                 if(j == size_search_word - 1)
  91.                                 {
  92.                                         //то увеличивает итератор массива начала строк, тем самым запоминая начало найденного слова
  93.                                         array_iter++;
  94.                                         //Увеличиваем счетчик найденных замен
  95.                                         (*k)++;
  96.                                         j = -1;
  97.                                         break;
  98.                                        
  99.                                 }
  100.                         }
  101.                         else
  102.                         {
  103.                         //если буква не совпадает
  104.                                 //Пропускаем все буквы до первого разделительного символа, то есть если первая буква не совпала, то слово нам не подходит и мы его пропускаем
  105.                                
  106.                                 while( i < size_input_str)
  107.                                 {
  108.                                         int j1 = 0;
  109.                                         //Ищем первый встретившийся разделительный символ
  110.                                                 while(j < size_separator_chars && i < size_input_str)
  111.                                                 {
  112.                                                         if(t[i] != sr[j1])
  113.                                                         {
  114.                                                                 j1++;
  115.  
  116.                                                         }
  117.                                                         else
  118.                                                                 break;
  119.                                                 }
  120.                                                 //Если нашли, то переходим к следующей проверке нового слова
  121.                                                 if(t[i] == sr[j])
  122.                                                         break;
  123.                                                 else
  124.                                                         i++;
  125.                                                
  126.                                 }
  127.                                 break;
  128.                        
  129.                         }
  130.                         j++;
  131.                 }
  132.         }
  133.         //Возвращаем строку с замененными словами
  134.         return replace(t,ns,sl,array_of_start_words,*k);
  135. }
  136.  
  137. /*int sr_sr(char V, char *sr)
  138. {
  139.         bool z=0;
  140.         while (*sr != '\0' && z != 1)
  141.         {
  142.                 if (*sr == V)
  143.                 {
  144.                         z = 1;
  145.                         *sr++;
  146.                 }
  147.         }
  148.         return z;
  149. }*/
  150.  
  151. int main()
  152. {  
  153.     setlocale(LC_ALL, ".1251");
  154.     // sr - строка разделителей, vs - вводимый символ, ns - строка искомых символов, sl - слово на которое заменяем, str - строка которую вставляем, vns - вводимый набор символов
  155.     // vsl - вводимое слово, vst - вводимая строка
  156.     char *sr = NULL, *ns = NULL, *sl = NULL, *str = NULL, vs, vns, vsl, vst;
  157.     char **t, **rez, b[81];
  158.     int l = 0, l1 = 0, l2 = 0, l3 = 0;// l - длина строки разделителей, l1 - длина строки набора символов, l2 - длина строки слова, l3 - длина строки
  159.     int x=0,n1=0;
  160.     unsigned int k = 0;
  161.     bool f;
  162.  
  163.     puts("Введите строку символов разделителей:");
  164.     do
  165.     {
  166.         sr = (char*) realloc (sr, (1+l)*sizeof(char)); // Увеличиваем память под строку разделителей
  167.         vs = getchar(); // считываем символ
  168.         sr[l] = vs; // Записываем символ в строку-разделителей
  169.         l++; // Увеличиваем значение длины
  170.     } while (sr[l-1] != '\n'); // Если введенный символ - enter, то выход из цила
  171.     sr[l-1] = '\0'; // Заменяем последний введенный символ (enter в данном случае) на EOF (символ окончания строки).
  172.     //for (int l = 0; l < strlen(sr); l++)
  173.         //printf("%c", sr[l]);
  174.  
  175.     puts("Введите строку искомых символов:");
  176.  
  177.     do
  178.     {
  179.         ns = (char*) realloc (ns, (1+l1)*sizeof(char)); // Увеличиваем память под строку разделителей
  180.         vns = getchar(); // считываем символ
  181.         ns[l1] = vns; // Записываем символ в строку-разделителей
  182.         l1++; // Увеличиваем значение длины
  183.     } while (ns[l1-1] != '\n'); // Если введенный символ - enter, то выход из цила
  184.     ns[l1-1] = '\0'; // Заменяем последний введенный символ (enter в данном случае) на EOF (символ окончания строки).
  185.     //for (int l1 = 0; l1 < strlen(ns); l1++)
  186.         //printf("%c", ns[l1]);
  187.  
  188.     //do
  189.     //{
  190.     puts("Введите слово на которое мы будем заменять:");
  191.     do
  192.     {
  193.             sl = (char*) realloc (sl, (1+l2)*sizeof(char)); // Увеличиваем память под строку разделителей
  194.             vsl = getchar(); // считываем символ
  195.             sl[l2] = vsl; // Записываем символ в строку-разделителей    
  196.             l2++; // Увеличиваем значение длины                  
  197.     } while (sl[l2-1] != '\n'); // Если введенный символ - enter, то выход из цила
  198.     sl[l2-1] = '\0'; // Заменяем последний введенный символ (enter в данном случае) на EOF (символ окончания строки).  
  199.     //f=0;
  200.     //for (int i = 0; i < strlen(sl); i++)
  201.     //  for (int j = 0; j < strlen(sr); j++)
  202.     //  {  
  203.     //      if (sl[i] == sr[j])            
  204.     //          f=1;           
  205.     //  }
  206.     //  if (f==1)
  207.     //      puts("Ошибка! Слово не должно содержать символов-разделителей");
  208.     //  free(sl);
  209.     //  sl=NULL;
  210.     //} while(f==1);
  211.    
  212.    
  213.     //for (int l2 = 0; l2 < strlen(sl); l2++)
  214.         //printf("%c", sl[l2]);
  215.  
  216.     puts("Введите строку которая будет после строк количество замен в которых:");
  217.     do
  218.     {
  219.         str = (char*) realloc (str, (1+l3)*sizeof(char)); // Увеличиваем память под строку разделителей
  220.         vst = getchar(); // считываем символ
  221.         str[l3] = vst; // Записываем символ в строку-разделителей
  222.         l3++; // Увеличиваем значение длины
  223.     } while (str[l3-1] != '\n'); // Если введенный символ - enter, то выход из цила
  224.     str[l3-1] = '\0'; // Заменяем последний введенный символ (enter в данном случае) на EOF (символ окончания строки).
  225.     //for (int l3 = 0; l3 < strlen(str); l3++)
  226.         //printf("%c", str[l3]);
  227.  
  228.     puts("\nВведите количество строк массива с текстом: ");
  229.         do
  230.         {
  231.                 puts("Количество строк: ");
  232.                 fflush(stdin);
  233.                 scanf("%d", &x);
  234.                 if (x <= 0)
  235.                 puts("ОШИБКА!\nВведите число больше нуля.");
  236.         } while (x <= 0);
  237.  
  238.         t = (char**)malloc((x + 1)*sizeof(char*));
  239.  
  240.         //rez = (char**)malloc((x + 1)*sizeof(char*));
  241.  
  242.         puts("\nВведите строки текста с символами-разделителями.\nТекст:");
  243.         for (int i = 0; i < x; i++)
  244.         {
  245.                 fflush(stdin);
  246.                 gets(b);
  247.                 t[i] = (char*)malloc((strlen(b) + 1)*sizeof(char));
  248.                 //rez[i] = (char*)malloc((strlen(b) + 1)*sizeof(char));
  249.                 strcpy_s(t[i],(strlen(b) + 1),b);
  250.         }
  251.  
  252.         /*for (int m = 0; m < x; m++)
  253.             {
  254.                 search( t[m],  sr,  ns,  sl, &k);  
  255.             }*/
  256.         cout << endl;
  257.         for (int m = 0; m < x; m++)
  258.             {
  259.                 k = 0;
  260.                 cout << search(t[m], sr, ns, sl , &k) << endl;
  261.                 cout << "Замен произведено: " << k << endl << endl;
  262.             }
  263.        
  264.     system("pause");
  265.     return 0;
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement