Advertisement
VictoriaLodochkina

LAB 3 PERFECT AND BRILLIANT

Mar 7th, 2020
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.14 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #define _USE_MATH_DEFINES
  4. #include <math.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7.  
  8. using namespace std;
  9.  
  10. void strinsi(char* str, char* substr, unsigned* i);
  11. int lengthString(char*);
  12. char* Strcpy1(char* dst, char* src);
  13.  
  14. int main()
  15. {
  16.     setlocale(LC_ALL, "Russian");
  17.     long n;
  18.     char ex = 'n';
  19.     do {
  20.         cout << "Введите номер задания: " << endl;
  21.         char task;
  22.         cin >> task;
  23.         switch (task)
  24.         {
  25.         case '1': {
  26.             /*даны две строки str1 и str2, символ symbol и целое n. заменить в строке str1 n символов, начиная с последнего символа symbol на подстроку строки str2,
  27.             начинающуюся с символа symbol и заканчивающуюся концом строки str2*/
  28.             char* str1 = new char[12];
  29.             char* str2 = new char[10];
  30.             char* temp1 = new char[20];
  31.             char* symbol = new char;
  32.             int n;
  33.             cout << "Enter str1: " << endl;
  34.             //cin >> str1;
  35.             getchar(); //чтобы \n не попал в ввод
  36.             scanf("%s", str1);
  37.             cout << "Enter str2: " << endl;
  38.             //cin >> str2;
  39.             getchar();
  40.             scanf("%s", str2);
  41.             cout << "Enter symbol: " << endl;
  42.             cin >> symbol;
  43.             cout << "Enter n: " << endl;
  44.             cin >> n;
  45.             _strrev(str2);
  46.             str2 = strtok(str2, symbol);//берем из реверсной строки подстроку до символа без него
  47.             _strrev(str2);//обратно
  48.             int a = strlen(str1);
  49.             int b = strlen(str2);
  50.             if (b >= n)
  51.             {
  52.                 b = n - 1;//количество символов из строки 2,на которое мы заменяем
  53.             }
  54.             memset(temp1, 0, 20);
  55.             //*temp1 = 0;
  56.             strcpy(temp1, str1);
  57.             _strrev(temp1);
  58.             temp1 = strstr(temp1, symbol);
  59.             _strrev(temp1); //здесь строка уже прямая с символом на конце*/
  60.             int i = a - strlen(temp1) - b;//находим, сколько символов дописать в конце
  61.             strcat(temp1, str2);//соединяем
  62.             if (strlen(temp1) < a)
  63.             {
  64.                 memset(str2, 0, 10);
  65.                 //*str2 = 0;//очищаем
  66.                 _strrev(str1);//переворачиваем, чтобы взять символы с конца
  67.                 strncat(str2, str1, i);//берем символы с конца
  68.                 _strrev(str2);//реверс
  69.                 strncat(temp1, str2, i);//соединяем воедино
  70.             }
  71.             printf("%s", temp1);
  72.             break;
  73.         }
  74.         case '2': {
  75.             /*дан текст, в котором слова разделены одинарным символом пробела, и какая-то буква. Вывести все слова, в которых встречается эта буква.*/
  76.             char ch;//символы текста
  77.             char symbol;//искомый символ
  78.             cout << "Enter symbol: " << endl;
  79.             cin >> symbol;
  80.             cout << "Enter str1: " << endl;
  81.             cin.get(ch);//убираем \n после symbol                                    
  82.             while (cin.fail() == false)//пока есть, что вводить
  83.             {
  84.                 cin.get(ch);// считываем первый символ                              
  85.                 int count = 0;//счетчик искомого символа
  86.                 int i = 0;//счетчик индеска массива
  87.                 char* mas = new char[20];//массив, в который записываем слово
  88.                 *mas = 0;
  89.                 while ((ch != ' ') && (ch != '\n'))
  90.                 {
  91.                     mas[i] = ch;
  92.                     i++;
  93.                     if (ch == symbol)//если искомый символ
  94.                     {
  95.                         count++;
  96.                     }
  97.                     cin.get(ch);//следующий символ
  98.                 }
  99.                 if (count != 0)
  100.                 {
  101.                     for (int j = 0; j < i; j++)
  102.                     {
  103.                         cout << mas[j];
  104.                     }
  105.                     cout << endl;
  106.                 }
  107.                 delete[] mas;
  108.             }
  109.             break;
  110.         }
  111.         case '3': {
  112.             /*написать ф-цию, вставляющую заданную подстроку в строку-источник в каждую из позиций, заданных массивом индексов*/
  113.             char* stroka1 = new char[15];
  114.             char* stroka2 = new char[5];
  115.             int n;
  116.             cout << "Enter number of pastes: " << endl;
  117.             cin >> n;
  118.             unsigned int* mas = new unsigned int[n + 1];
  119.             cout << "Enter positions: " << endl;
  120.             mas[0] = n; //количество вставок
  121.             for (int i = 1; i < n + 1; i++)
  122.             {
  123.                 cin >> *(mas + i);
  124.             }
  125.             cout << "Enter stroka1: ";
  126.             getchar(); //чтобы \n не попал в ввод
  127.             scanf("%s", stroka1);
  128.             cout << "Enter stroka2: ";
  129.             getchar();
  130.             scanf("%s", stroka2);
  131.             strinsi(stroka1, stroka2, mas);//
  132.             break;
  133.         }
  134.         default: {cout << "Нет такой задачи.\n"; } break;
  135.         }
  136.         cout << "Если вы хотите выйти, нажмите \'y\', в противном случае-любую другую клавишу" << endl;
  137.         cin.ignore(100, '\n');
  138.         cin >> ex;
  139.     } while (ex != 'y');
  140.     return 0;
  141. }
  142.  
  143. int lengthString(char* stroka)
  144. {
  145.     int i;
  146.     for (i = 0; *(stroka + i) != '\0'; i++); ////////////[]
  147.     return i;
  148. }
  149.  
  150. char* Strcpy1(char* dst, char* src)
  151. {
  152.     char* pt = dst;
  153.     while (*src)
  154.         *(dst++) = *(src++);
  155.     *dst = 0;
  156.     return pt;
  157. }
  158.  
  159. void strinsi(char* str, char* substr, unsigned* i)
  160. {
  161.     int count = 0;
  162.     int n = *i;///
  163.     for (int j = 1; j < (n + 1); j++)
  164.     {
  165.         int l1 = lengthString(str);
  166.         int l2 = lengthString(substr);
  167.         char* rezult_str = new char[l1 + l2 + 1];                // строка - сборка +1 для символа конца строки
  168.         (*(i+j))--;///
  169.         int poz = *(i+j) + count * l2;///
  170.         for (int x = 0; x < poz; x++)            // копируем часть первой строки до нужного индекса
  171.             *(rezult_str + x) = *(str + x);
  172.         for (int x = 0; x < l2; x++)            //добавляем вставляемую строку
  173.             *(rezult_str + x + poz) = *(substr + x);
  174.         for (int x = poz; *(str + x) != 0; x++)     //добавляем оставшуюся часть первой строки///////////
  175.             *(rezult_str + x + l2) = *(str + x);/////////////
  176.         *(rezult_str + l1 + l2) = '\0';///////////////
  177.         Strcpy1(str, rezult_str);
  178.         count++;
  179.     }
  180.     cout << "Result: ";
  181.     printf("%s", str);
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement