Untitled
unknown
c_cpp
2 years ago
5.0 kB
6
Indexable
//Напиши программу, которая заполняет вектор объектами класса Rectangle. Стороны каждого прямоугольника вводит пользователь. Сделай проверку ввода.
// Отсортируй вектор с помощью функции sort (algorithm) по возрастанию площади.
#include <iostream>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <windows.h>
#include <algorithm>
using namespace std;
class MyRectangle {
private:
    int a, b;
public:
    int GetA() const {
        return a;
    }
    int GetB() const {
        return b;
    }
    void SetA( const int a ) {
        if ( a > 0 )
            this->a = a;
    }
    void SetB( const int b ){
        if ( b > 0 )
            this->a = a;
    }
    //конструктор 2 в 1
    MyRectangle(const int a = 1, const int b = 1): a(a), b(b)
    {
    }
    //вычисление площади
    int Area() const {
        return a * b;
    }
};
bool operator> ( const MyRectangle& first, const MyRectangle& second ) {
    return first.Area() > second.Area();
}
bool operator< ( const MyRectangle& first, const MyRectangle& second ) {
    return first.Area() < second.Area();
}
ostream& operator<< ( ostream& os, const MyRectangle& pl) {
    os << "(" << pl.GetA() << "; " << pl.GetB() << ")";
    return os;
}
struct {
    bool operator()( const MyRectangle& a, const MyRectangle& b) const {
        return a < b;
    }
} CompareArea;
void FillVec( vector <MyRectangle> &vec, const int count );
void PrintVec( const vector <MyRectangle> &vec );
int Menu( const int low, const int high, const string &mes ); // функция меню
int main() {
    SetConsoleCP( 1251 );
    SetConsoleOutputCP( 1251 );
    srand( time( 0 ));
    vector<MyRectangle> pVec;
    int n;
    cout << "Введите количесвто прямоугольников";
    cin >> n;
    FillVec( pVec);
    PrintVec( pVec );
    sort( pVec.begin(), pVec.end(), CompareArea );
    PrintVec( pVec );
    while ( true ) { // пока правда
		int key = Menu( 0, 3, "Выберите пункт" );
		if ( !key )
			break;
		switch ( key ) { //выбор
		case 1: {
		    cout << "\nВведите элемент вектора для добавления: ";
			int a = GetNaturalNumber(1, 100, " ");
			int b = GetNaturalNumber(1, 100, " ");
			MyRectangle rect( a, b );
			pVec.push_back( rect );
			break;
		}
		case 2: {
		    pVec.clear();
			cout << "\nВведите количесвто для удаления из вектора: ";
			int n = GetNaturalNumber( 1, 100 , "Введите число ");
			FillVec(pVec);
			break;
		}
		case 3 : {
			PrintVec( pVec );
			cout << endl;
			break;
		}
		case 4: {
			// заглушка
			break;
		}
		}
	}
	return 0;
return 0;
}
int Menu( const int low, const int high, const string &mes = "" ) { //
	cout << "1 - Добавить строны вручную\n";
	cout << "2 - добавить случайными числами\n";
	cout << "3 - Вывести на экран\n";
	cout << "4 - Сортировка\n";
	cout << "0 - выход" << endl;
	int key = GetNaturalNumber( low, high, mes );
	return key;
}
//функция на правильность вводв
int GetNaturalNumber( const int low, const int high, const string &mes ) { // low - нижняя граница, high - верхняя граница
	string nStr;
	int n;
	while ( true ) {
		cout << mes << " от " << low << " до " << high << ": ";
		getline( cin, nStr ); // считываем строку неограниченной длины, до нажатия Enter
		// пробуем найти ЛЮБОЙ символ, НЕ входящий в набор 0123456789
		if ( nStr.find_first_not_of( "0123456789" ) == string::npos ) { // если НЕ нашли, то введено целое число
			stringstream ss;
			ss << nStr; // отдаём строковому потоку строку, которая представляет собой запись целого полоительного числа
			ss >> n; // просим строковый поток вернуть нам int значение
			if ( n >= low && n <= high )
				break;
		}
		cout << "Ошибка ввода! Значение должно быть " << "от " << low << " до " << high << "!" << endl;
	}
	return n;
}
void FillVec( vector <MyRectangle> &vec ){
    for (int i = 0; i < count; ++i) {
        MyRectangle p( rand() % 101 - 50, rand() % 101 - 50 );
        vec.push_back( p );
    }
}
void PrintVec( const vector <MyRectangle> &vec){
    for( const MyRectangle& p : vec  )
        cout << p << " ";
}
Editor is loading...