Загрузка данных
#include <iostream>
#include <vector>
using namespace std;
void program1() {
int n;
cout << "n = ";
while (cin >> n && n <= 0)
cout << "n>0" << endl << "n = ";
cout<<endl;
int matrix1[n][n], matrix2[n][n], result[n][n];
cout<<"Matrix1:"<<endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix1[i][j]=rand()%20-10;
cout << matrix1[i][j] << " ";
}
cout<<endl;
}
cout<<endl;
cout<<"Matrix2:"<<endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
matrix2[i][j]=rand()%20-10;
cout << matrix2[i][j] << " ";
}
cout<<endl;
}
cout<<endl;
//заполнение результ матрицы нулями
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
result[i][j] = 0;
}
//перемножение матриц
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++)
result[i][j] += matrix1[i][k] * matrix2[k][j];
}
}
cout << "Result:" << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cout << result[i][j] << " ";
cout << endl;
}
}
//2/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//функция для метода трапеций
double trapez(double (*func)(double), double a, double b, int n) {
double h = (b - a) / n;
double integral = 0.5 * (func(a) + func(b));
for (int i = 1; i < n; ++i)
integral += func(a + i * h);
integral *= h;
return integral;
}
//рекурсивно методом трапеций
double trapezRecursive(double (*func)(double), double a, double b, int n) {
if (n == 1)
return 0.5 * (func(a) + func(b)) * (b - a);
else {
double h = (b - a) / n;
return trapezRecursive(func, a, b - h, n - 1) + 0.5 * (func(a + (n - 1) * h) + func(b)) * h;
}
}
//функция для метода прямоугольников (левый)
double rectan(double (*func)(double), double a, double b, int n) {
double h = (b - a) / n;
double integral = 0;
for (int i = 0; i < n; ++i)
integral += func(a + i * h) * h;
return integral;
}
//рекурсивно методом прямоугольников
double rectanRecursive(double (*func)(double), double a, double b, int n) {
if (n == 1)
return func(a) * (b - a);
else {
double h = (b - a) / n;
return rectanRecursive(func, a, b - h, n - 1) + func(a + (n - 1) * h) * h;
}
}
//пример функции для интегрирования
double myFunction(double x) {
return x * x;
}
void program2() {
double a = 0; //начало интервала
double b = 1; //конец интервала
int n; //количество делений
cout << "n = ";
while (cin >> n && n <= 0)
cout << "n>0" << endl << "n = ";
cout<<endl;
cout << "Trapez (iter): " << trapez(myFunction, a, b, n) << endl;
cout << "Trapez (rec): " << trapezRecursive(myFunction, a, b, n) << endl;
cout << "Rectan (iter): " << rectan(myFunction, a, b, n) << endl;
cout << "Rectan (rec): " << rectanRecursive(myFunction, a, b, n) << endl;
}
//3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void program3() {
int rows, cols;
cout << "a = ";
while (cin >> rows && rows <= 0)
cout << "a>0" << endl << "a = ";
cout << "b = ";
while (cin >> cols && cols <= 0)
cout << "b>0" << endl << "b = ";
cout<< endl;
cout << "Matrix1:" << endl;
int matrix1[rows][cols];
for (int i = 0; i < rows; i++){
for(int j = 0; j < cols; j++){
matrix1[i][j]=rand()%200-100;
cout << matrix1[i][j] << " ";
}
cout<<endl;
}
cout << endl;
int matrix2[rows][cols];
//процесс копирования с использованием буферной переменной
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
//использую временную переменную для хранения значения
int buffer = matrix1[i][j];
matrix2[i][j] = buffer;
cout << "Buffer[" << i << "][" << j << "]: " << buffer << "; ";
}
cout << endl;
}
cout << endl;
cout << "Matrix2:" << endl;
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j)
cout << matrix2[i][j] << " ";
cout << endl;
}
}
//4/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void quickSort(int arr[], int low, int high) {
if (low < high) {
//опорный элемент
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j < high; j++) {
//если меньше или равен опорному
if (arr[j] < pivot) {
i++; //увеличиваем индекс меньшего элемента
swap(arr[i], arr[j]); //меняем местами
}
}
swap(arr[i + 1], arr[high]); //меняем местами опорный элемент
int pi = i + 1; //индекс опорного элемента
//рекурсивно сортируем элементы до и после разбиения
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
void program4() {
int n;
cout << "n = ";
while (cin >> n && n <= 0)
cout << "n>0" << endl << "n = ";
cout<<endl;
int arr[n];
cout << "No sort: ";
for (int i = 0; i < n; i++) {
arr[i]=rand()%200-100;
cout << arr[i] << " ";
}
cout << endl;
quickSort(arr, 0, n - 1);
cout << "Sort: ";
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
//5/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//печать числа в двоичном виде
void printBinary(int num) {
int totalBits = sizeof(int) * 8; // адаптация под длину типа
for (int i = totalBits - 1; i >= 0; i--) {
cout << ((num >> i) & 1);
if (i % 8 == 0) //для читаемости
cout << " ";
}
}
//получение i-го бита числа сдвигом
bool getBit(int num, int i) {
int totalBits = sizeof(int) * 8;
//инверсия старшего бита
if (i == totalBits - 1)
return !((num >> i) & 1);
return (num >> i) & 1;
}
//поразрядная сортировка
//отрицательные в двоичном инвертируются по всем битам, кроме младшего, при
//этом старший инвертирован в getBit, так что большее по модулю отрицательное
//при последней проверке (старшего бита) становится меньшим в сортировке
void radixSort(vector<int>& arr) {
int numBits = sizeof(int) * 8;
for (int i = 0; i < numBits; i++) {
vector<int> zeros;
vector<int> ones;
for (int num : arr) {
if (getBit(num, i))
ones.push_back(num);
else
zeros.push_back(num);
}
arr.clear();
arr.insert(arr.end(), zeros.begin(), zeros.end());
arr.insert(arr.end(), ones.begin(), ones.end());
}
}
void program5() {
int n;
cout << "n = ";
while (cin >> n && n <= 0)
cout << "n > 0" << endl << "n = ";
vector<int> arr;
for (int i = 0; i < n; i++)
arr.push_back(rand() % 200 - 100);
cout << endl << "1. Generated:" << endl;
for (int num : arr)
cout << num << " ";
cout << endl << endl;
cout << "2. DEC -> BIN:" << endl;
for (int num : arr) {
cout << num << " -> ";
printBinary(num);
cout << endl;
}
cout << endl;
radixSort(arr);
cout << "3. Sorted binary:" << endl;
for (int num : arr) {
printBinary(num);
cout << endl;
}
cout << endl;
cout << "4. Sorted decimal:" << endl;
for (int num : arr)
cout << num << " ";
cout << endl;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main() {
int choice;
while (true) {
cout << endl << "Menu:" << endl;
cout << "1: Matrix1 * Matrix2" << endl;
cout << "2: Integral" << endl;
cout << "3: Buffer" << endl;
cout << "4: Quick Sort" << endl;
cout << "5: Bin" << endl;
cout << "0: Quit" << endl;
cout << "Enter number (0-5): ";
cin >> choice;
cout << endl;
if (choice == 0)
break; // выход из цикла
switch (choice) {
case 1: program1(); break;
case 2: program2(); break;
case 3: program3(); break;
case 4: program4(); break;
case 5: program5(); break;
default: cout << "Incorrect input" << endl;
}
}
return 0;
}