Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Завдання. 2.1. Ввести ім'я файлу, який, можливо, містить шлях, і вивести:
- а) Шлях без імені файлу (якщо шляху не було - вивести порожній рядок).
- б) Ім'я файлу з розширенням, але без шляху.
- в) Розширення імені файлу.
- г) Ім'я файлу без шляху та без розширення.
- д) Ім'я останньої папки за шляхом.
- е) Ім'я файлу зі шляхом, але розширення замінено на html.
- */
- #include <iostream>
- #include <string>
- #include <filesystem>
- using namespace std;
- namespace fs = filesystem;
- int main() {
- string filePath;
- cout << "Введіть ім'я файлу зі шляхом: ";
- getline(cin, filePath);
- fs::path path(filePath);
- // a) Шлях без імені файлу
- cout << "Шлях без імені файлу: " << path.parent_path() << endl;
- // б) Ім'я файлу з розширенням, але без шляху
- cout << "Ім'я файлу з розширенням, але без шляху: " << path.filename() << endl;
- // в) Розширення імені файлу
- cout << "Розширення імені файлу: " << path.extension() << endl;
- // г) Ім'я файлу без шляху та без розширення
- cout << "Ім'я файлу без шляху та без розширення: " << path.stem() << endl;
- // д) Ім'я останньої папки за шляхом
- cout << "Ім'я останньої папки за шляхом: " << path.parent_path().filename() << endl;
- // е) Ім'я файлу зі шляхом, але розширення замінено на html
- fs::path newPath = path;
- newPath.replace_extension(".html");
- cout << "Ім'я файлу зі шляхом, але розширення замінено на html: " << newPath << endl;
- return 0;
- }
- //Завдання 2.2. Ввести два рядки та вивести число входжень другого рядка до першого.
- #include <iostream>
- #include <string>
- using namespace std;
- int main() {
- string str1, str2;
- cout << "Введіть перший рядок: ";
- getline(cin, str1); // отримуємо перший рядок
- cout << "Введіть другий рядок: ";
- getline(cin, str2); // отримуємо другий рядок
- int count = 0;
- size_t pos = 0;
- // Знаходимо кількість входжень другого рядка до першого
- while ((pos = str1.find(str2, pos)) != string::npos) {
- pos += str2.length();
- ++count;
- }
- cout << "Кількість входжень другого рядка до першого: " << count << endl;
- return 0;
- }
- /*Завдання 2.3. (Транслітерація) Ввести три рядки і в першому з них замінити символи, що
- входять до другого, на символи з такими ж індексами у третьому рядку. Передбачається,
- що другий і третій рядки мають рівні довжини; якщо другий рядок має значення "abc", а
- третій - "def", то в першому рядку "a" замінюється на "d", "b" на "e", "c" на "f", а решта
- символів залишаються без змін.*/
- #include <iostream>
- #include <string>
- using namespace std;
- int main() {
- string str1, str2, str3;
- cout << "Введіть перший рядок: ";
- getline(cin, str1); // отримуємо перший рядок
- cout << "Введіть другий рядок: ";
- getline(cin, str2); // отримуємо другий рядок
- cout << "Введіть третій рядок: ";
- getline(cin, str3); // отримуємо третій рядок
- // Перевірка, що другий і третій рядки мають рівну довжину
- if (str2.length() != str3.length()) {
- cout << "Другий і третій рядки мають різну довжину. Перевірте введені дані." << endl;
- return 1;
- }
- // Транслітерація
- for (size_t i = 0; i < str1.length(); ++i) {
- size_t index = str2.find(str1[i]); // Знаходимо індекс символу з першого рядка у другому рядку
- if (index != string::npos) {
- str1[i] = str3[index]; // Замінюємо символ в першому рядку на символ з третього рядка за тим самим індексом
- }
- }
- cout << "Транслітерований рядок: " << str1 << endl;
- return 0;
- }
- /*Завдання 2.4. Ввести рядок і після кожного входження до нього підрядка «password:»
- замінити вісім наступних символів на зірочки.
- */
- #include <iostream>
- #include <string>
- using namespace std;
- int main() {
- string input;
- cout << "Введіть рядок: ";
- getline(cin, input); // отримуємо рядок від користувача
- string target = "password:"; // підрядок, який ми шукаємо
- size_t pos = input.find(target); // знаходимо позицію першого входження підрядка
- while (pos != string::npos) {
- // Замінюємо вісім наступних символів після "password:" на зірочки
- input.replace(pos + target.length(), 8, "********");
- pos = input.find(target, pos + target.length()); // шукаємо наступне входження підрядка
- }
- cout << "Результат: " << input << endl;
- return 0;
- }
- /*
- Завдання 2.5. Написати функцію, яка приймає як параметри два рядки і повертає копію
- першого параметра, всі входження другого параметра в якому взяті в «()», тобто, наприклад,
- якщо параметрами були рядки ertabcsdftyuabczevbh і abc, то повернути треба
- ert(abc)sdftyu(abc)zevbh.
- */
- #include <iostream>
- #include <string>
- using namespace std;
- string insertParentheses(const string& mainStr, const string& subStr) {
- string result = mainStr;
- size_t pos = result.find(subStr); // знаходимо позицію першого входження другого рядка у першому
- // Продовжуємо доки знаходимо входження другого рядка
- while (pos != string::npos) {
- // Вставляємо входження другого рядка у "()" та змінюємо позицію для пошуку наступного входження
- result.replace(pos, subStr.length(), "(" + subStr + ")");
- pos = result.find(subStr, pos + 2 + subStr.length());
- }
- return result;
- }
- int main() {
- string mainStr, subStr;
- cout << "Введіть рядок: ";
- getline(cin, mainStr); // отримуємо основний рядок від користувача
- cout << "Введіть рядок для вставки в дужки: ";
- getline(cin, subStr); // отримуємо рядок для вставки в дужки від користувача
- string result = insertParentheses(mainStr, subStr); // викликаємо функцію insertParentheses
- cout << "Результат: " << result << endl;
- return 0;
- }
- /*
- Завдання 3.1. Ввести рядок і замінити всі суми натуральних чисел, що зустрічаються в
- ньому, на їх результати. Наприклад, якщо є рядок 5+26-72+35gh32+45, результат має бути
- 31-107gh77.
- */
- #include <iostream>
- #include <string>
- #include <regex>
- using namespace std;
- // Функція для обчислення суми натуральних чисел у рядку
- int computeSum(const string& str) {
- int sum = 0;
- for (size_t i = 0; i < str.length(); ++i) {
- if (isdigit(str[i])) {
- int num = 0;
- while (i < str.length() && isdigit(str[i])) {
- num = num * 10 + (str[i] - '0');
- ++i;
- }
- sum += num;
- }
- }
- return sum;
- }
- // Функція для заміни сум натуральних чисел у рядку на їх результати
- string replaceSums(const string& input) {
- // Регулярний вираз для знаходження сум натуральних чисел
- regex pattern("(\\d+)(?:\\+(\\d+))+");
- // Заміна сум натуральних чисел на їх результати
- string result = input;
- smatch match;
- while (regex_search(result, match, pattern)) {
- int sum = 0;
- for (size_t i = 1; i < match.size(); ++i) {
- sum += stoi(match[i]);
- }
- result = regex_replace(result, pattern, to_string(sum));
- }
- return result;
- }
- int main() {
- string input;
- cout << "Введіть рядок: ";
- getline(cin, input);
- // Заміна сум натуральних чисел на їх результати
- string result = replaceSums(input);
- cout << "Результат: " << result << endl;
- return 0;
- }
- /*
- Завдання 3.2. Написати функцію, яка приймає рядок і розгортає скорочення з
- використанням {}:
- а) без вкладених конструкцій, наприклад, рядок abc{def,gh,ijkl}mn розгортається в
- abcdefmn,abcghmn,abcijklmn
- б) конструкції можуть вкладатися на будь-яку глибину, наприклад , рядок
- ab{cde{fg,h}xy,st{uv,zx}d}wer розгортається у
- abcdefgxywer,abcdehxywer,abstuvdwer,abstzxdwer
- */
- #include <iostream>
- #include <string>
- #include <vector>
- using namespace std;
- // Функція для розгортання скорочень з використанням {}
- vector<string> expandBraces(const string& str) {
- vector<string> result;
- size_t pos = str.find('{');
- if (pos == string::npos) {
- result.push_back(str); // Якщо немає скорочень, повертаємо вхідний рядок
- return result;
- }
- size_t endPos = str.find('}', pos);
- string prefix = str.substr(0, pos);
- string suffix = str.substr(endPos + 1);
- string inner = str.substr(pos + 1, endPos - pos - 1);
- size_t commaPos = 0;
- while ((commaPos = inner.find(',', commaPos)) != string::npos) {
- string expanded = prefix + inner.substr(0, commaPos) + suffix;
- result.push_back(expanded);
- commaPos++;
- }
- string expanded = prefix + inner.substr(0, commaPos) + suffix;
- result.push_back(expanded);
- return result;
- }
- // Рекурсивна функція для розгортання всіх скорочень
- vector<string> recursiveExpand(const string& str) {
- vector<string> result;
- size_t pos = str.find('{');
- if (pos == string::npos) {
- result.push_back(str); // Якщо немає скорочень, повертаємо вхідний рядок
- return result;
- }
- size_t endPos = str.find('}', pos);
- string prefix = str.substr(0, pos);
- string suffix = str.substr(endPos + 1);
- string inner = str.substr(pos + 1, endPos - pos - 1);
- vector<string> expansions = expandBraces(inner); // Розгортаємо скорочення
- for (const string& expansion : expansions) {
- vector<string> subResult = recursiveExpand(prefix + expansion + suffix); // Рекурсивно розгортаємо підрядки
- result.insert(result.end(), subResult.begin(), subResult.end());
- }
- return result;
- }
- int main() {
- string input;
- cout << "Введіть рядок: ";
- getline(cin, input);
- // Розгортання скорочень
- vector<string> result = recursiveExpand(input);
- // Виведення результату
- cout << "Результат: ";
- for (const string& str : result) {
- cout << str << " ";
- }
- cout << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement