Advertisement
Viktor_Profa

Лабараторна робота №3

Apr 4th, 2024 (edited)
445
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.73 KB | None | 0 0
  1. /*
  2. Завдання. 2.1. Ввести ім'я файлу, який, можливо, містить шлях, і вивести:
  3. а) Шлях без імені файлу (якщо шляху не було - вивести порожній рядок).
  4. б) Ім'я файлу з розширенням, але без шляху.
  5. в) Розширення імені файлу.
  6. г) Ім'я файлу без шляху та без розширення.
  7. д) Ім'я останньої папки за шляхом.
  8. е) Ім'я файлу зі шляхом, але розширення замінено на html.
  9. */
  10.  
  11. #include <iostream>
  12. #include <string>
  13. #include <filesystem>
  14.  
  15. using namespace std;
  16. namespace fs = filesystem;
  17.  
  18. int main() {
  19.     string filePath;
  20.     cout << "Введіть ім'я файлу зі шляхом: ";
  21.     getline(cin, filePath);
  22.  
  23.     fs::path path(filePath);
  24.  
  25.     // a) Шлях без імені файлу
  26.     cout << "Шлях без імені файлу: " << path.parent_path() << endl;
  27.  
  28.     // б) Ім'я файлу з розширенням, але без шляху
  29.     cout << "Ім'я файлу з розширенням, але без шляху: " << path.filename() << endl;
  30.  
  31.     // в) Розширення імені файлу
  32.     cout << "Розширення імені файлу: " << path.extension() << endl;
  33.  
  34.     // г) Ім'я файлу без шляху та без розширення
  35.     cout << "Ім'я файлу без шляху та без розширення: " << path.stem() << endl;
  36.  
  37.     // д) Ім'я останньої папки за шляхом
  38.     cout << "Ім'я останньої папки за шляхом: " << path.parent_path().filename() << endl;
  39.  
  40.     // е) Ім'я файлу зі шляхом, але розширення замінено на html
  41.     fs::path newPath = path;
  42.     newPath.replace_extension(".html");
  43.     cout << "Ім'я файлу зі шляхом, але розширення замінено на html: " << newPath << endl;
  44.  
  45.     return 0;
  46. }
  47. //Завдання 2.2. Ввести два рядки та вивести число входжень другого рядка до першого.
  48. #include <iostream>
  49. #include <string>
  50.  
  51. using namespace std;
  52.  
  53. int main() {
  54.     string str1, str2;
  55.     cout << "Введіть перший рядок: ";
  56.     getline(cin, str1); // отримуємо перший рядок
  57.     cout << "Введіть другий рядок: ";
  58.     getline(cin, str2); // отримуємо другий рядок
  59.  
  60.     int count = 0;
  61.     size_t pos = 0;
  62.  
  63.     // Знаходимо кількість входжень другого рядка до першого
  64.     while ((pos = str1.find(str2, pos)) != string::npos) {
  65.         pos += str2.length();
  66.         ++count;
  67.     }
  68.  
  69.     cout << "Кількість входжень другого рядка до першого: " << count << endl;
  70.  
  71.     return 0;
  72. }
  73. /*Завдання 2.3. (Транслітерація) Ввести три рядки і в першому з них замінити символи, що
  74. входять до другого, на символи з такими ж індексами у третьому рядку. Передбачається,
  75. що другий і третій рядки мають рівні довжини; якщо другий рядок має значення "abc", а
  76. третій - "def", то в першому рядку "a" замінюється на "d", "b" на "e", "c" на "f", а решта
  77. символів залишаються без змін.*/
  78.  
  79. #include <iostream>
  80. #include <string>
  81.  
  82. using namespace std;
  83.  
  84. int main() {
  85.     string str1, str2, str3;
  86.     cout << "Введіть перший рядок: ";
  87.     getline(cin, str1); // отримуємо перший рядок
  88.     cout << "Введіть другий рядок: ";
  89.     getline(cin, str2); // отримуємо другий рядок
  90.     cout << "Введіть третій рядок: ";
  91.     getline(cin, str3); // отримуємо третій рядок
  92.  
  93.     // Перевірка, що другий і третій рядки мають рівну довжину
  94.     if (str2.length() != str3.length()) {
  95.         cout << "Другий і третій рядки мають різну довжину. Перевірте введені дані." << endl;
  96.         return 1;
  97.     }
  98.  
  99.     // Транслітерація
  100.     for (size_t i = 0; i < str1.length(); ++i) {
  101.         size_t index = str2.find(str1[i]); // Знаходимо індекс символу з першого рядка у другому рядку
  102.         if (index != string::npos) {
  103.             str1[i] = str3[index]; // Замінюємо символ в першому рядку на символ з третього рядка за тим самим індексом
  104.         }
  105.     }
  106.  
  107.     cout << "Транслітерований рядок: " << str1 << endl;
  108.  
  109.     return 0;
  110. }
  111. /*Завдання 2.4. Ввести рядок і після кожного входження до нього підрядка «password:»
  112. замінити вісім наступних символів на зірочки.
  113. */
  114.  
  115. #include <iostream>
  116. #include <string>
  117.  
  118. using namespace std;
  119.  
  120. int main() {
  121.     string input;
  122.     cout << "Введіть рядок: ";
  123.     getline(cin, input); // отримуємо рядок від користувача
  124.  
  125.     string target = "password:"; // підрядок, який ми шукаємо
  126.  
  127.     size_t pos = input.find(target); // знаходимо позицію першого входження підрядка
  128.  
  129.     while (pos != string::npos) {
  130.         // Замінюємо вісім наступних символів після "password:" на зірочки
  131.         input.replace(pos + target.length(), 8, "********");
  132.         pos = input.find(target, pos + target.length()); // шукаємо наступне входження підрядка
  133.     }
  134.  
  135.     cout << "Результат: " << input << endl;
  136.  
  137.     return 0;
  138. }
  139. /*
  140. Завдання 2.5. Написати функцію, яка приймає як параметри два рядки і повертає копію
  141. першого параметра, всі входження другого параметра в якому взяті в «()», тобто, наприклад,
  142. якщо параметрами були рядки ertabcsdftyuabczevbh і abc, то повернути треба
  143. ert(abc)sdftyu(abc)zevbh.
  144. */
  145.  
  146. #include <iostream>
  147. #include <string>
  148.  
  149. using namespace std;
  150.  
  151. string insertParentheses(const string& mainStr, const string& subStr) {
  152.     string result = mainStr;
  153.     size_t pos = result.find(subStr); // знаходимо позицію першого входження другого рядка у першому
  154.  
  155.     // Продовжуємо доки знаходимо входження другого рядка
  156.     while (pos != string::npos) {
  157.         // Вставляємо входження другого рядка у "()" та змінюємо позицію для пошуку наступного входження
  158.         result.replace(pos, subStr.length(), "(" + subStr + ")");
  159.         pos = result.find(subStr, pos + 2 + subStr.length());
  160.     }
  161.  
  162.     return result;
  163. }
  164.  
  165. int main() {
  166.     string mainStr, subStr;
  167.     cout << "Введіть рядок: ";
  168.     getline(cin, mainStr); // отримуємо основний рядок від користувача
  169.     cout << "Введіть рядок для вставки в дужки: ";
  170.     getline(cin, subStr); // отримуємо рядок для вставки в дужки від користувача
  171.  
  172.     string result = insertParentheses(mainStr, subStr); // викликаємо функцію insertParentheses
  173.  
  174.     cout << "Результат: " << result << endl;
  175.  
  176.     return 0;
  177. }
  178.  
  179. /*
  180. Завдання 3.1. Ввести рядок і замінити всі суми натуральних чисел, що зустрічаються в
  181. ньому, на їх результати. Наприклад, якщо є рядок 5+26-72+35gh32+45, результат має бути
  182. 31-107gh77.
  183. */
  184.  
  185. #include <iostream>
  186. #include <string>
  187. #include <regex>
  188.  
  189. using namespace std;
  190.  
  191. // Функція для обчислення суми натуральних чисел у рядку
  192. int computeSum(const string& str) {
  193.     int sum = 0;
  194.     for (size_t i = 0; i < str.length(); ++i) {
  195.         if (isdigit(str[i])) {
  196.             int num = 0;
  197.             while (i < str.length() && isdigit(str[i])) {
  198.                 num = num * 10 + (str[i] - '0');
  199.                 ++i;
  200.             }
  201.             sum += num;
  202.         }
  203.     }
  204.     return sum;
  205. }
  206.  
  207. // Функція для заміни сум натуральних чисел у рядку на їх результати
  208. string replaceSums(const string& input) {
  209.     // Регулярний вираз для знаходження сум натуральних чисел
  210.     regex pattern("(\\d+)(?:\\+(\\d+))+");
  211.  
  212.     // Заміна сум натуральних чисел на їх результати
  213.     string result = input;
  214.     smatch match;
  215.     while (regex_search(result, match, pattern)) {
  216.         int sum = 0;
  217.         for (size_t i = 1; i < match.size(); ++i) {
  218.             sum += stoi(match[i]);
  219.         }
  220.         result = regex_replace(result, pattern, to_string(sum));
  221.     }
  222.  
  223.     return result;
  224. }
  225.  
  226. int main() {
  227.     string input;
  228.     cout << "Введіть рядок: ";
  229.     getline(cin, input);
  230.  
  231.     // Заміна сум натуральних чисел на їх результати
  232.     string result = replaceSums(input);
  233.  
  234.     cout << "Результат: " << result << endl;
  235.  
  236.     return 0;
  237. }
  238.  
  239. /*
  240. Завдання 3.2. Написати функцію, яка приймає рядок і розгортає скорочення з
  241. використанням {}:
  242. а) без вкладених конструкцій, наприклад, рядок abc{def,gh,ijkl}mn розгортається в
  243. abcdefmn,abcghmn,abcijklmn
  244. б) конструкції можуть вкладатися на будь-яку глибину, наприклад , рядок
  245. ab{cde{fg,h}xy,st{uv,zx}d}wer розгортається у
  246. abcdefgxywer,abcdehxywer,abstuvdwer,abstzxdwer
  247. */
  248. #include <iostream>
  249. #include <string>
  250. #include <vector>
  251.  
  252. using namespace std;
  253.  
  254. // Функція для розгортання скорочень з використанням {}
  255. vector<string> expandBraces(const string& str) {
  256.     vector<string> result;
  257.  
  258.     size_t pos = str.find('{');
  259.     if (pos == string::npos) {
  260.         result.push_back(str); // Якщо немає скорочень, повертаємо вхідний рядок
  261.         return result;
  262.     }
  263.  
  264.     size_t endPos = str.find('}', pos);
  265.     string prefix = str.substr(0, pos);
  266.     string suffix = str.substr(endPos + 1);
  267.  
  268.     string inner = str.substr(pos + 1, endPos - pos - 1);
  269.     size_t commaPos = 0;
  270.     while ((commaPos = inner.find(',', commaPos)) != string::npos) {
  271.         string expanded = prefix + inner.substr(0, commaPos) + suffix;
  272.         result.push_back(expanded);
  273.         commaPos++;
  274.     }
  275.  
  276.     string expanded = prefix + inner.substr(0, commaPos) + suffix;
  277.     result.push_back(expanded);
  278.  
  279.     return result;
  280. }
  281.  
  282. // Рекурсивна функція для розгортання всіх скорочень
  283. vector<string> recursiveExpand(const string& str) {
  284.     vector<string> result;
  285.  
  286.     size_t pos = str.find('{');
  287.     if (pos == string::npos) {
  288.         result.push_back(str); // Якщо немає скорочень, повертаємо вхідний рядок
  289.         return result;
  290.     }
  291.  
  292.     size_t endPos = str.find('}', pos);
  293.     string prefix = str.substr(0, pos);
  294.     string suffix = str.substr(endPos + 1);
  295.  
  296.     string inner = str.substr(pos + 1, endPos - pos - 1);
  297.     vector<string> expansions = expandBraces(inner); // Розгортаємо скорочення
  298.     for (const string& expansion : expansions) {
  299.         vector<string> subResult = recursiveExpand(prefix + expansion + suffix); // Рекурсивно розгортаємо підрядки
  300.         result.insert(result.end(), subResult.begin(), subResult.end());
  301.     }
  302.  
  303.     return result;
  304. }
  305.  
  306. int main() {
  307.     string input;
  308.     cout << "Введіть рядок: ";
  309.     getline(cin, input);
  310.  
  311.     // Розгортання скорочень
  312.     vector<string> result = recursiveExpand(input);
  313.  
  314.     // Виведення результату
  315.     cout << "Результат: ";
  316.     for (const string& str : result) {
  317.         cout << str << " ";
  318.     }
  319.     cout << endl;
  320.  
  321.     return 0;
  322. }
  323.  
Tags: univer
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement