С++ Завдання №1 Створіть клас Date, який буде містити інформацію про дату (день, місяць, рік). За
допомогою механізму перевантаження операторів, визначте операцію різниці двох дат (результат у вигляді кількості днів між датами), а також операцію збільшення дати на певну кількість днів. Завдання №2. Додати в рядковий клас функцію, яка створює рядок, що містить перетин двох рядків, тобто загальні символи для двох рядків. Наприклад, результатом перетину рядків «sdqcg» «rgfas34» буде рядок «sg». Для реалізації функції перевантажити оператор «*» (бінарне множення).Ответы на вопрос
Завдання 1.
#include <iostream>
class Date {
private:
int day;
int month;
int year;
public:
Date(int d, int m, int y) : day(d), month(m), year(y) {}
int operator-(const Date& other) {
int totalDays = 0;
// Перевірка років
for (int i = other.year; i < year; i++) {
totalDays += isLeapYear(i) ? 366 : 365;
}
// Перевірка місяців
for (int i = 1; i < month; i++) {
totalDays += getDaysInMonth(i, year);
}
totalDays += day;
// Віднімання днів з другої дати
for (int i = 1; i < other.month; i++) {
totalDays -= getDaysInMonth(i, other.year);
}
totalDays -= other.day;
return totalDays;
}
Date operator+(int days) {
Date result = *this;
int daysToAdd = days;
while (daysToAdd > 0) {
int daysInMonth = getDaysInMonth(result.month, result.year);
if (result.day + daysToAdd > daysInMonth) {
daysToAdd -= (daysInMonth - result.day + 1);
result.day = 1;
if (result.month == 12) {
result.month = 1;
result.year++;
} else {
result.month++;
}
} else {
result.day += daysToAdd;
daysToAdd = 0;
}
}
return result;
}
private:
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int getDaysInMonth(int month, int year) {
if (month == 2) {
return isLeapYear(year) ? 29 : 28;
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
} else {
return 31;
}
}
};
int main() {
Date d1(1, 1, 2023);
Date d2(1, 2, 2023);
int difference = d2 - d1;
std::cout << "Difference in days: " << difference << std::endl;
Date d3 = d1 + 10;
std::cout << "New date: " << d3.day << "." << d3.month << "." << d3.year << std::endl;
return 0;
}
_____________________________
Завдання 2.
#include <iostream>
#include <string>
class StringIntersection {
private:
std::string str;
public:
StringIntersection(const std::string& s) : str(s) {}
std::string operator*(const StringIntersection& other) {
std::string result;
for (char c : str) {
if (other.str.find(c) != std::string::npos) {
result += c;
}
}
return result;
}
};
int main() {
StringIntersection s1("sdqcg");
StringIntersection s2("rgfas34");
std::string intersection = s1 * s2;
std::cout << "Intersection: " << intersection << std::endl;
return 0;
}
Завдання №1: Створення класу Date для операцій з датами
cpp#include <iostream>
using namespace std;
class Date {
private:
int day;
int month;
int year;
public:
Date(int d, int m, int y) : day(d), month(m), year(y) {}
// Перевантаження оператора '-' для різниці дат
int operator-(const Date& other) {
int daysInMonths[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int days = day - other.day;
int months = month - other.month;
int years = year - other.year;
// Коригуємо випадок, коли день від'ємний
if (days < 0) {
months--;
days += daysInMonths[other.month];
}
// Коригуємо випадок, коли місяць від'ємний
if (months < 0) {
years--;
months += 12;
}
// Кількість днів між двома датами
return days + months * 30 + years * 365;
}
// Перевантаження оператора '+' для збільшення дати
Date operator+(int days) {
Date result = *this;
result.day += days;
while (result.day > 30) {
result.day -= 30;
result.month++;
if (result.month > 12) {
result.month = 1;
result.year++;
}
}
return result;
}
void display() {
cout << day << "." << month << "." << year << endl;
}
};
int main() {
Date date1(15, 10, 2022);
Date date2(10, 5, 2022);
date1.display();
date2.display();
int difference = date1 - date2;
cout << "Різниця в днях: " << difference << endl;
Date date3 = date2 + 60;
cout << "Дата після додавання 60 днів: ";
date3.display();
return 0;
}
Завдання №2: Перетин рядків за допомогою перевантаження оператора '*'
cpp#include <iostream>
#include <string>
using namespace std;
class StringIntersection {
private:
string str1;
string str2;
public:
StringIntersection(string s1, string s2) : str1(s1), str2(s2) {}
// Перевантаження оператора '*' для перетину рядків
string operator*(const StringIntersection& other) {
string result = "";
for (char c : str1) {
if (str2.find(c) != string::npos) {
result += c;
}
}
return result;
}
};
int main() {
StringIntersection strings("sdqcg", "rgfas34");
string intersection = strings * strings;
cout << "Перетин рядків: " << intersection << endl;
return 0;
}
У цих прикладах ми створили клас Date для роботи з датами та клас StringIntersection для обчислення перетину рядків. Обидва класи перевантажують оператори, щоб виконати необхідні операції.
Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili
