Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 сем / лаб1.docx
Скачиваний:
4
Добавлен:
06.06.2025
Размер:
81.26 Кб
Скачать

Использованные источники

1) Бьёрн Страуструп – Язык программирования С++, 1986г.

2) Скотт Майерс - Эффективный и современный С++, 2014г.

Приложение

1. Реализация с массивами символов

#include <cstring>

#include <iostream>

#include <locale>

#include <chrono>

void findIntersection(const char* arr1, const char* arr2, std::string &result) {

int k = 0; // Индекс для записи пересечения в result

// Для каждого элемента в arr1 проверяем, есть ли он в arr2

for (int i = 0; i < strlen(arr1); ++i) {

for (int j = 0; j < strlen(arr2); ++j) {

if (arr1[i] == arr2[j]) {

// Проверяем, не был ли этот элемент уже добавлен в результат

bool alreadyExists = false;

for (int l = 0; l < k; ++l) {

if (result[l] == arr1[i]) {

alreadyExists = true;

break;

}

}

// Если элемент не добавлен ранее, добавляем его в результат

if (!alreadyExists) {

result[k++] = arr1[i];

}

break; // Достаточно найти одно совпадение

}

}

}

result[k] = '\0'; // Завершаем строку нулевым символом

}

// Функция для нахождения объединения двух массивов символов

void findUnion(const char* arr1, const char* arr2, std::string &result) {

int k = 0; // Индекс для записи в result

// Добавляем все уникальные элементы из arr1 в result

for (int i = 0; i < strlen(arr1); ++i) {

// Проверяем, не был ли этот элемент уже добавлен в результат

bool alreadyExists = false;

for (int l = 0; l < k; ++l) {

if (result[l] == arr1[i]) {

alreadyExists = true;

break;

}

}

// Если элемент не добавлен ранее, добавляем его в результат

if (!alreadyExists) {

result[k++] = arr1[i];

}

}

// Добавляем все уникальные элементы из arr2 в result

for (int i = 0; i < strlen(arr2); ++i) {

// Проверяем, не был ли этот элемент уже добавлен в result

bool alreadyExists = false;

for (int l = 0; l < k; ++l) {

if (result[l] == arr2[i]) {

alreadyExists = true;

break;

}

}

// Если элемент не добавлен ранее, добавляем его в результат

if (!alreadyExists) {

result[k++] = arr2[i];

}

}

result[k] = '\0'; // Завершаем строку нулевым символом

}

// Функция для нахождения разности двух массивов символов

void findDifference(const char* arr1, const char* arr2, std::string &result) {

int k = 0; // Индекс для записи в result

// Проходим по каждому элементу arr1

for (int i = 0; i < strlen(arr1); ++i) {

bool foundInArr2 = false;

// Проверяем, есть ли этот элемент в arr2

for (int j = 0; j < strlen(arr2); ++j) {

if (arr1[i] == arr2[j]) {

foundInArr2 = true;

break; // Элемент найден во втором массиве, пропускаем его

}

}

// Если элемент не найден во втором массиве, добавляем его в результат

if (!foundInArr2) {

result[k++] = arr1[i];

}

}

result[k] = '\0'; // Завершаем строку нулевым символом

}

int main()

{

auto start = std::chrono::system_clock::now();

setlocale(LC_ALL, "russian");

char a[] = { "РУДЕНСКИЙ" };

char b[] = { "ЧЕТВЕРТАК" };

char c[] = { "КИРЕЙКОВА" };

char d[] = { "КОТОВ" };

std::string bcIntersect;

bcIntersect.resize(20);

findIntersection(b, c, bcIntersect);

std::cout << bcIntersect << std::endl;

std::string abcUnion;

abcUnion.resize(20);

findUnion(a, bcIntersect.c_str(), abcUnion);

std::cout << abcUnion << std::endl;

std::string abcdDiff;

abcdDiff.resize(20);

findDifference(abcUnion.c_str(), d, abcdDiff);

std::cout << abcdDiff << std::endl;

auto end = std::chrono::system_clock::now();

auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);

std::cout << elapsed.count() << '\n';

}

2. Реализация со списком

#include <iostream>

#include <list>

#include <algorithm>

#include <locale>

#include <chrono>

// Функция для нахождения пересечения двух списков

void findIntersection(const std::list<char>& list1, const std::list<char>& list2, std::list<char>& result) {

for (char c : list1) {

if (std::find(list2.begin(), list2.end(), c) != list2.end()) {

if (std::find(result.begin(), result.end(), c) == result.end()) {

result.push_back(c);

}

}

}

}

// Функция для нахождения объединения двух списков

void findUnion(const std::list<char>& list1, const std::list<char>& list2, std::list<char>& result) {

result = list1;

for (char c : list2) {

if (std::find(result.begin(), result.end(), c) == result.end()) {

result.push_back(c);

}

}

}

// Функция для нахождения разности двух списков

void findDifference(const std::list<char>& list1, const std::list<char>& list2, std::list<char>& result) {

for (char c : list1) {

if (std::find(list2.begin(), list2.end(), c) == list2.end()) {

result.push_back(c);

}

}

}

// Функция для вывода списка

void printList(const std::list<char>& list) {

for (char c : list) {

std::cout << c;

}

std::cout << std::endl;

}

int main() {

auto start = std::chrono::system_clock::now();

setlocale(LC_ALL, "russian");

std::list<char> a = { 'Р', 'У', 'Д', 'Е', 'Н', 'С', 'К', 'И', 'Й' };

std::list<char> b = { 'Ч', 'Е', 'Т', 'В', 'Е', 'Р', 'Т', 'А', 'К' };

std::list<char> c = { 'К', 'И', 'Р', 'Е', 'Й', 'К', 'О', 'В', 'А' };

std::list<char> d = { 'К', 'О', 'Т', 'О', 'В' };

std::list<char> bcIntersect;

findIntersection(b, c, bcIntersect);

printList(bcIntersect);

std::list<char> abcUnion;

findUnion(a, bcIntersect, abcUnion);

printList(abcUnion);

std::list<char> abcdDiff;

findDifference(abcUnion, d, abcdDiff);

printList(abcdDiff);

auto end = std::chrono::system_clock::now();

auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);

std::cout << elapsed.count() << '\n';

return 0;

}

3. Реализация с массивами байт

#include <bitset>

#include <iostream>

#include <locale>

#include <chrono>

const int ALPHABET_SIZE = 32; // Алфавит (без буквы "ё")

// Функция для перевода символов в битовое представление

std::bitset<ALPHABET_SIZE> stringToBitset(const std::string& word) {

std::bitset<ALPHABET_SIZE> bits;

for (char c : word) {

if (c >= 'А' && c <= 'Я') {

bits.set(c - 'А'); // Помещаем буквы в нужный бит

}

}

return bits;

}

// Функция для нахождения пересечения двух множеств

std::bitset<ALPHABET_SIZE> findIntersection(const std::bitset<ALPHABET_SIZE>& set1, const std::bitset<ALPHABET_SIZE>& set2) {

return set1 & set2;

}

// Функция для нахождения объединения двух множеств

std::bitset<ALPHABET_SIZE> findUnion(const std::bitset<ALPHABET_SIZE>& set1, const std::bitset<ALPHABET_SIZE>& set2) {

return set1 | set2;

}

// Функция для нахождения разности двух множеств

std::bitset<ALPHABET_SIZE> findDifference(const std::bitset<ALPHABET_SIZE>& set1, const std::bitset<ALPHABET_SIZE>& set2) {

return set1 & ~set2;

}

// Функция для печати множества

void printBitset(const std::bitset<ALPHABET_SIZE>& bits) {

for (int i = 0; i < ALPHABET_SIZE; ++i) {

if (bits[i]) {

std::cout << static_cast<char>('А' + i);

}

}

std::cout << std::endl;

}

int main() {

auto start = std::chrono::system_clock::now();

setlocale(LC_ALL, "russian");

std::string a = "РУДЕНСКИЙ";

std::string b = "ЧЕТВЕРТАК";

std::string c = "КИРЕЙКОВА";

std::string d = "КОТОВ";

std::bitset<ALPHABET_SIZE> bitA = stringToBitset(a);

std::bitset<ALPHABET_SIZE> bitB = stringToBitset(b);

std::bitset<ALPHABET_SIZE> bitC = stringToBitset(c);

std::bitset<ALPHABET_SIZE> bitD = stringToBitset(d);

std::bitset<ALPHABET_SIZE> bcIntersect = findIntersection(bitB, bitC);

printBitset(bcIntersect);

std::bitset<ALPHABET_SIZE> abcUnion = findUnion(bitA, bcIntersect);

printBitset(abcUnion);

std::bitset<ALPHABET_SIZE> abcdDiff = findDifference(abcUnion, bitD);

printBitset(abcdDiff);

auto end = std::chrono::system_clock::now();

auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);

std::cout << elapsed.count() << '\n';

return 0;

}

4. Реализация с машинными словами

#include <iostream>

#include <locale>

#include <chrono>

typedef uint32_t Set; // 32-битное слово для 32 букв алфавита

const int ALPHABET_SIZE = 32; // 32 буквы

// Функция для перевода слова в машинное слово

Set stringToSet(const std::string& word) {

Set set = 0;

for (char c : word) {

if (c >= 'А' && c <= 'Я') {

set |= (1 << (c - 'А')); // Устанавливаем бит для буквы

}

}

return set;

}

// Функция для нахождения пересечения двух множеств

Set findIntersection(Set set1, Set set2) {

return set1 & set2;

}

// Функция для нахождения объединения двух множеств

Set findUnion(Set set1, Set set2) {

return set1 | set2;

}

// Функция для нахождения разности двух множеств

Set findDifference(Set set1, Set set2) {

return set1 & ~set2;

}

// Функция для печати множества

void printSet(Set set) {

for (int i = 0; i < ALPHABET_SIZE; ++i) {

if (set & (1 << i)) {

std::cout << static_cast<char>('А' + i);

}

}

std::cout << std::endl;

}

int main() {

auto start = std::chrono::system_clock::now();

setlocale(LC_ALL, "russian");

std::string a = "РУДЕНСКИЙ";

std::string b = "ЧЕТВЕРТАК";

std::string c = "КИРЕЙКОВА";

std::string d = "КОТОВ";

Set setA = stringToSet(a);

Set setB = stringToSet(b);

Set setC = stringToSet(c);

Set setD = stringToSet(d);

Set bcIntersect = findIntersection(setB, setC);

printSet(bcIntersect);

Set abcUnion = findUnion(setA, bcIntersect);

printSet(abcUnion);

Set abcdDiff = findDifference(abcUnion, setD);

printSet(abcdDiff);

auto end = std::chrono::system_clock::now();

auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);

std::cout << elapsed.count() << '\n';

return 0;

}

Соседние файлы в папке 3 сем