Загрузка данных
#include <iostream>
#include <cstring>
using namespace std;
// ==================== ФУНКЦИЯ ДЛЯ ВВОДА ЦЕЛЫХ ЧИСЕЛ С ПРОВЕРКОЙ ====================
int inputInt(const char* prompt, bool allowZero = false) {
int value;
bool validInput = false;
cout << prompt;
for (int attempt = 0; attempt < 3 && !validInput; attempt++) {
if (attempt > 0) {
cout << "Oshibka! Vvedite chislo: ";
}
if (cin >> value) {
if (value > 0) {
validInput = true;
} else if (allowZero && value == 0) {
validInput = true;
} else {
cout << "Chislo dolzhno byt' polozhitel'nym. ";
cin.clear();
cin.ignore(10000, '\n');
}
} else {
cin.clear();
cin.ignore(10000, '\n');
cout << "Nekorrektnyy vvod. ";
}
}
if (!validInput) {
cout << "Prekratnyy vvod. Ustanovleno znachenie 5." << endl;
value = 5;
}
return value;
}
// ==================== СТРУКТУРА ФИЛЬМ ====================
struct film {
char* nazvanie; // название фильма
int stoimost; // стоимость
char* rezhisser; // режиссер
film* next; // указатель на следующий элемент
};
// ==================== КЛАСС LIST ====================
class list {
private:
int size; // количество элементов
film* h; // голова списка
public:
// Конструктор
list() {
h = 0;
size = 0;
}
// Деструктор
~list() {
release();
}
// ДОБАВЛЕНИЕ ЭЛЕМЕНТА В НАЧАЛО СПИСКА
void pred() {
film* temp = new film;
char str[80];
cout << "Nazvanie filma: ";
cin >> str;
temp->nazvanie = new char[strlen(str) + 1];
strcpy(temp->nazvanie, str);
// Ввод стоимости с проверкой
temp->stoimost = inputInt("Stoimost': ");
cout << "Rezhisser: ";
cin >> str;
temp->rezhisser = new char[strlen(str) + 1];
strcpy(temp->rezhisser, str);
temp->next = h;
h = temp;
size++;
}
// УДАЛЕНИЕ ПЕРВОГО ЭЛЕМЕНТА
void del() {
if (h == 0) return;
film* temp = h;
h = h->next;
delete[] temp->nazvanie;
delete[] temp->rezhisser;
delete temp;
size--;
}
// ОЧИСТКА ВСЕГО СПИСКА
void release() {
while (h != 0) {
del();
}
}
// ВЫВОД ВСЕГО СПИСКА
void print() {
if (h == 0) {
cout << "Spisok pust.\n";
return;
}
int num = 1;
for (film* temp = h; temp != 0; temp = temp->next) {
cout << "===== Film #" << num++ << " =====\n";
cout << "Nazvanie: " << temp->nazvanie << "\n";
cout << "Stoimost': " << temp->stoimost << "\n";
cout << "Rezhisser: " << temp->rezhisser << "\n\n";
}
}
// ПОИСК i-ГО ЭЛЕМЕНТА (0‑базовый индекс)
film* elem(int i) {
if (i < 0 || i >= size) return 0;
film* temp = h;
for (int j = 0; j < i; j++) {
temp = temp->next;
}
return temp;
}
// ВЫВОД ФИЛЬМОВ ЗАДАННОГО РЕЖИССЁРА
void printByRezhisser(const char* rezh) {
if (h == 0) {
cout << "Spisok pust.\n";
return;
}
int count = 0;
for (film* temp = h; temp != 0; temp = temp->next) {
if (strcmp(temp->rezhisser, rezh) == 0) {
cout << "Nazvanie: " << temp->nazvanie << ", Stoimost': " << temp->stoimost << "\n";
count++;
}
}
if (count == 0) {
cout << "Filmow rezhissera \"" << rezh << "\" ne naydeno.\n";
} else {
cout << "Vsego nashli " << count << " filmow.\n";
}
}
};
// ==================== ГЛАВНАЯ ФУНКЦИЯ ====================
int main() {
list videoteka;
int n;
// Ввод количества фильмов с проверкой
n = inputInt("Skolko filmov vvesti? ");
// Ввод информации о фильмах
for (int i = 0; i < n; i++) {
cout << "\n--- Film #" << i + 1 << " ---\n";
videoteka.pred(); // добавляем в начало
}
// Вывод всей видеотеки
cout << "\n========== VSYa VIDEOTEKA ==========\n";
videoteka.print();
// Запрос режиссёра для поиска
char searchRezh[80];
cout << "\nVvedite familiyu rezhissera: ";
cin >> searchRezh;
// Вывод фильмов указанного режиссёра
cout << "\n========== FIL'MY REZhISSERA \"" << searchRezh << "\" ==========\n";
videoteka.printByRezhisser(searchRezh);
return 0;
}
ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ
#include <iostream>
using namespace std;
// ==================== ФУНКЦИЯ ДЛЯ ВВОДА ЦЕЛЫХ ЧИСЕЛ С ПРОВЕРКОЙ ====================
int inputInt(const char* prompt, bool allowZero = false) {
int value;
bool validInput = false;
cout << prompt;
for (int attempt = 0; attempt < 3 && !validInput; attempt++) {
if (attempt > 0) {
cout << "Oshibka! Vvedite chislo: ";
}
if (cin >> value) {
if (value > 0) {
validInput = true;
} else if (allowZero && value == 0) {
validInput = true;
} else {
cout << "Chislo dolzhno byt' polozhitel'nym. ";
cin.clear();
cin.ignore(10000, '\n');
}
} else {
cin.clear();
cin.ignore(10000, '\n');
cout << "Nekorrektnyy vvod. ";
}
}
if (!validInput) {
cout << "Prekratnyy vvod. Ustanovleno znachenie 5." << endl;
value = 5;
}
return value;
}
// ==================== КЛАСС VECT (ХРАНИТ ОДИН СТОЛБЕЦ) ====================
class vect {
private:
int* base; // массив элементов столбца
int size; // количество строк в столбце
public:
// Конструктор
vect(int n) {
size = n;
base = new int[size];
}
// Конструктор копирования
vect(const vect& v) {
size = v.size;
base = new int[size];
for (int i = 0; i < size; i++) {
base[i] = v.base[i];
}
}
// Деструктор
~vect() {
delete[] base;
}
// Ввод столбца (с проверкой)
void inputColumn(int colNum) {
cout << "Stolbec " << colNum + 1 << ":" << endl;
for (int i = 0; i < size; i++) {
char prompt[100];
sprintf(prompt, " Element [%d]: ", i);
base[i] = inputInt(prompt);
}
}
// Вывод столбца
void printColumn() {
for (int i = 0; i < size; i++) {
cout << base[i] << " ";
}
}
// Геттеры
int getSize() { return size; }
int getElement(int index) {
if (index >= 0 && index < size) return base[index];
return 0;
}
// Сумма элементов столбца
int sum() {
int s = 0;
for (int i = 0; i < size; i++) {
s += base[i];
}
return s;
}
};
// ==================== КЛАСС MATRIX (СОДЕРЖИТ МАССИВ СТОЛБЦОВ) ====================
class matrix {
private:
vect** columns; // массив указателей на столбцы
int rows; // количество строк (2)
int cols; // количество столбцов (30)
public:
// Конструктор
matrix(int r, int c) {
rows = r;
cols = c;
columns = new vect*[cols];
for (int j = 0; j < cols; j++) {
columns[j] = new vect(rows); // каждый столбец имеет rows элементов
}
}
// Деструктор
~matrix() {
for (int j = 0; j < cols; j++) {
delete columns[j];
}
delete[] columns;
}
// Ввод всей матрицы
void input() {
cout << "Vvod matricy " << rows << "x" << cols << ":" << endl;
for (int j = 0; j < cols; j++) {
columns[j]->inputColumn(j);
}
}
// Вывод всей матрицы
void print() {
cout << "\nMatrica:" << endl;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << columns[j]->getElement(i) << "\t";
}
cout << endl;
}
}
// Поиск столбцов, у которых сумма > P и < T
void findColumns(int P, int T) {
cout << "\nStolbcy, u kotoryh summa elementov bol'she " << P
<< " i men'she " << T << ":" << endl;
bool found = false;
for (int j = 0; j < cols; j++) {
int s = columns[j]->sum();
if (s > P && s < T) {
cout << "Stolec #" << j + 1 << " (summa = " << s << ")" << endl;
found = true;
}
}
if (!found) {
cout << "Takih stolbcov net." << endl;
}
}
};
// ==================== ГЛАВНАЯ ФУНКЦИЯ ====================
int main() {
int P, T;
// Ввод P и T с проверкой
P = inputInt("Vvedite P: ");
T = inputInt("Vvedite T: ");
// Создаём матрицу 2x30
matrix A(2, 30);
// Ввод матрицы
A.input();
// Вывод матрицы
A.print();
// Поиск столбцов
A.findColumns(P, T);
return 0;
}
------------------------------------
#include <iostream>
using namespace std;
// ==================== ФУНКЦИЯ ДЛЯ ВВОДА ЦЕЛЫХ ЧИСЕЛ С ПРОВЕРКОЙ ====================
int inputInt(const char* prompt, bool allowZero = false) {
int value;
bool validInput = false;
cout << prompt;
for (int attempt = 0; attempt < 3 && !validInput; attempt++) {
if (attempt > 0) {
cout << "Oshibka! Vvedite chislo: ";
}
if (cin >> value) {
if (value > 0) {
validInput = true;
} else if (allowZero && value == 0) {
validInput = true;
} else {
cout << "Chislo dolzhno byt' polozhitel'nym. ";
cin.clear();
cin.ignore(10000, '\n');
}
} else {
cin.clear();
cin.ignore(10000, '\n');
cout << "Nekorrektnyy vvod. ";
}
}
if (!validInput) {
cout << "Prekratnyy vvod. Ustanovleno znachenie 5." << endl;
value = 5;
}
return value;
}
// ==================== КЛАСС VECT (ПОЛЯ PROTECTED) ====================
class vect {
protected:
int* base; // массив элементов столбца
int size; // количество строк в столбце
public:
// Конструктор
vect(int n) {
size = n;
base = new int[size];
}
// Конструктор копирования
vect(const vect& v) {
size = v.size;
base = new int[size];
for (int i = 0; i < size; i++) {
base[i] = v.base[i];
}
}
// Деструктор
~vect() {
delete[] base;
}
// Ввод столбца (с проверкой)
void inputColumn(int colNum) {
cout << "Stolbec " << colNum + 1 << ":" << endl;
for (int i = 0; i < size; i++) {
char prompt[100];
sprintf(prompt, " Element [%d]: ", i);
base[i] = inputInt(prompt);
}
}
// Вывод столбца
void printColumn() {
for (int i = 0; i < size; i++) {
cout << base[i] << " ";
}
}
// Сумма элементов столбца
int sum() {
int s = 0;
for (int i = 0; i < size; i++) {
s += base[i];
}
return s;
}
// Геттер для доступа извне (если нужен)
int getSize() { return size; }
int getElement(int index) {
if (index >= 0 && index < size) return base[index];
return 0;
}
};
// ==================== КЛАСС MATRIX (НАСЛЕДУЕТ VECT) ====================
class matrix : public vect {
private:
int rows; // количество строк (2)
int cols; // количество столбцов (30)
vect** columns; // массив указателей на столбцы
public:
// Конструктор
matrix(int r, int c) : vect(r) { // vect(r) — не используется, т.к. нужно хранить столбцы
rows = r;
cols = c;
columns = new vect*[cols];
for (int j = 0; j < cols; j++) {
columns[j] = new vect(rows);
}
}
// Деструктор
~matrix() {
for (int j = 0; j < cols; j++) {
delete columns[j];
}
delete[] columns;
}
// Ввод всей матрицы
void input() {
cout << "Vvod matricy " << rows << "x" << cols << ":" << endl;
for (int j = 0; j < cols; j++) {
columns[j]->inputColumn(j);
}
}
// Вывод всей матрицы
void print() {
cout << "\nMatrica:" << endl;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
// Так как поля base и size у vect protected,
// но columns[j] — это указатель на vect,
// доступ к base возможен только через методы
cout << columns[j]->getElement(i) << "\t";
}
cout << endl;
}
}
// Поиск столбцов, у которых сумма > P и < T
void findColumns(int P, int T) {
cout << "\nStolbcy, u kotoryh summa elementov bol'she " << P
<< " i men'she " << T << ":" << endl;
bool found = false;
for (int j = 0; j < cols; j++) {
int s = columns[j]->sum();
if (s > P && s < T) {
cout << "Stolec #" << j + 1 << " (summa = " << s << ")" << endl;
found = true;
}
}
if (!found) {
cout << "Takih stolbcov net." << endl;
}
}
};
// ==================== ГЛАВНАЯ ФУНКЦИЯ ====================
int main() {
int P, T;
// Ввод P и T с проверкой
P = inputInt("Vvedite P: ");
T = inputInt("Vvedite T: ");
matrix A(2, 30);
A.input();
A.print();
A.findColumns(P, T);
return 0;
}
ыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыыы
#include <iostream>
#include <cmath>
using namespace std;
// ==================== ФУНКЦИЯ ДЛЯ ВВОДА ЦЕЛЫХ ЧИСЕЛ (ТОЛЬКО > 0) ====================
int inputInt(const char* prompt) {
int value;
bool validInput = false;
cout << prompt;
for (int attempt = 0; attempt < 3 && !validInput; attempt++) {
if (attempt > 0) {
cout << "Oshibka! Vvedite chislo: ";
}
if (cin >> value) {
if (value > 0) {
validInput = true; // число положительное
} else {
cout << "Chislo dolzhno byt' bol'she 0. ";
cin.clear();
cin.ignore(10000, '\n');
}
} else {
cin.clear();
cin.ignore(10000, '\n');
cout << "Nekorrektnyy vvod. ";
}
}
if (!validInput) {
cout << "Prekratnyy vvod. Ustanovleno znachenie 1." << endl;
value = 1;
}
return value;
}
// ==================== АБСТРАКТНЫЙ БАЗОВЫЙ КЛАСС ====================
class geom {
public:
virtual double area() const = 0; // чисто виртуальная для площади
virtual double volume() const = 0; // чисто виртуальная для объёма
virtual ~geom() {}
};
// ==================== КЛАССЫ ДЛЯ ПЛОЩАДЕЙ ====================
// Прямоугольник
class Rectangle : public geom {
private:
double width, height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
double area() const override {
return width * height;
}
double volume() const override {
return 0;
}
double getWidth() const { return width; }
double getHeight() const { return height; }
};
// Круг
class Circle : public geom {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() const override {
return M_PI * radius * radius;
}
double volume() const override {
return 0;
}
double getRadius() const { return radius; }
};
// Квадрат
class Square : public geom {
private:
double side;
public:
Square(double s) : side(s) {}
double area() const override {
return side * side;
}
double volume() const override {
return 0;
}
double getSide() const { return side; }
};
// ==================== ЗАДАЧА 1 ====================
double remainingAreaAfterSubtraction(const Rectangle& rect, const Circle& circle, const Square& square) {
double rectArea = rect.area();
double circleArea = circle.area();
double squareArea = square.area();
double remaining = rectArea - circleArea - squareArea;
return (remaining > 0) ? remaining : 0;
}
// ==================== КЛАССЫ ДЛЯ ОБЪЁМОВ ====================
// Параллелепипед (прямоугольный)
class Cuboid : public geom {
private:
double length, width, height;
public:
Cuboid(double l, double w, double h) : length(l), width(w), height(h) {}
double volume() const override {
return length * width * height;
}
double area() const override {
return 0;
}
};
// Треугольная призма (основание – прямоугольный треугольник)
class TriPrism : public geom {
private:
double a, b, h; // a, b – катеты основания, h – высота призмы
public:
TriPrism(double a_, double b_, double h_) : a(a_), b(b_), h(h_) {}
double volume() const override {
double baseArea = 0.5 * a * b;
return baseArea * h;
}
double area() const override {
return 0;
}
};
// ==================== ЗАДАЧА 2 (БЕЗ VECTOR) ====================
double totalVolume(geom** shapes, int count) {
double sum = 0;
for (int i = 0; i < count; i++) {
sum += shapes[i]->volume();
}
return sum;
}
// ==================== ТЕСТИРОВАНИЕ С ВВОДОМ ПОЛЬЗОВАТЕЛЯ ====================
int main() {
double a, b, c, d, e, f, g, h, i, j;
cout << "========== ZADACHA 1 ==========" << endl;
// Ввод данных для прямоугольника
cout << "\nVvedite dannye dlya pryamougol'nika:" << endl;
a = inputInt(" Shirina (width): ");
b = inputInt(" Vysota (height): ");
Rectangle rect(a, b);
// Ввод данных для круга
cout << "\nVvedite dannye dlya kruga:" << endl;
c = inputInt(" Radius: ");
Circle circ(c);
// Ввод данных для квадрата
cout << "\nVvedite dannye dlya kvadrata:" << endl;
d = inputInt(" Storona (side): ");
Square sq(d);
// Вычисление и вывод результата
double remaining = remainingAreaAfterSubtraction(rect, circ, sq);
cout << "\nRezul'taty:" << endl;
cout << " Ploshad' pryamougol'nika: " << rect.area() << endl;
cout << " Ploshad' kruga: " << circ.area() << endl;
cout << " Ploshad' kvadrata: " << sq.area() << endl;
cout << " Ostatok ploshadi: " << remaining << endl;
cout << "\n========== ZADACHA 2 ==========" << endl;
// Ввод данных для параллелепипеда
cout << "\nVvedite dannye dlya parallelepipeda:" << endl;
e = inputInt(" Dlina (length): ");
f = inputInt(" Shirina (width): ");
g = inputInt(" Vysota (height): ");
Cuboid box(e, f, g);
// Ввод данных для треугольной призмы
cout << "\nVvedite dannye dlya treugol'noy prizmy:" << endl;
cout << " (osnovanie - pryamougol'nyy treugol'nik)" << endl;
h = inputInt(" Katuet a: ");
i = inputInt(" Katuet b: ");
j = inputInt(" Vysota prizmy h: ");
TriPrism prism(h, i, j);
// Массив указателей на geom
geom* shapes[2];
shapes[0] = &box;
shapes[1] = &prism;
// Вычисление и вывод результата
double sumVol = totalVolume(shapes, 2);
cout << "\nRezul'taty:" << endl;
cout << " Ob" << char(39) << "em parallelepipeda: " << box.volume() << endl;
cout << " Ob" << char(39) << "em prizmy: " << prism.volume() << endl;
cout << " Summa ob" << char(39) << "emov: " << sumVol << endl;
return 0;
}