Advertisement
llirik

5_14

May 29th, 2021
875
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.10 KB | None | 0 0
  1. //#include "StdAfx.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <locale.h>
  5. #include <iostream>
  6. #include <cstring>
  7. #include <vector>
  8. #include <random>
  9. #include <iomanip>
  10. #include <climits>
  11.  
  12.  
  13. using namespace std;
  14.  
  15. // вариант 14
  16. // 2 уровень
  17.  
  18. // задание 1
  19. /*
  20.     Создать функцию для поиска цифр в строке (возвращается массив указателей).
  21.     Тестовая программа: Ввести текст (несколько строк) с клавиатуры, признак
  22.     окончания – слово «end». Данные размещать в динамической области. Изменить
  23.     текст: каждую цифру увеличить на ее порядковый номер (первую цифру на 1, вторую – на 2 и т.п.)
  24.     Вывести текст на экран и отформатировать: Реализовать функцию «выровнять строки по левому краю».
  25. */
  26. vector<char> change_my_str(char* my_str) {
  27.     int my_str_len = strlen(my_str);
  28.     vector<char> arr;
  29.  
  30.     int c = 0;
  31.     for (int i = 0; i < my_str_len; i++) {
  32.         if (isdigit(my_str[i])) {
  33.             c++;
  34.             arr.push_back(((my_str[i]-'0')+c)+'0');
  35.             //cout << (int)(my_str[i])+c-48;
  36.         }
  37.         else {
  38.             arr.push_back(my_str[i]);
  39.             //cout << my_str[i];
  40.         }
  41.     }
  42.     return arr;
  43. }
  44.  
  45. void exercise_1() {
  46.     const int N = 30; // максимальное количество динамических строк
  47.     const int M = 100; // максимальная длина строки
  48.  
  49.     // Динамический массив указателей на динамические строки
  50.     char **dpt; // 2-x уровневый указатель
  51.     char buff[M];
  52.     // выделение памяти под динамический массив указателей
  53.     dpt = (char**)malloc(sizeof(*dpt) * N);
  54.  
  55.     int k = 0;
  56.     //выделение памяти и инициализация  динамических строк
  57.     cout << "Введите несколько строк на латинице, окончание ввода - 'end'" << endl;
  58.     do {
  59.         cin.getline(buff, sizeof(buff));          // ввод с клавиатуры в статический буфер
  60.         dpt[k] = (char*)malloc(strlen(buff) + 1); // выделение динамической памяти под строку
  61.         strcpy(dpt[k], buff);                     // копирование строки в динамическую память
  62.         k++;
  63.     } while(!(buff[0] == 'e' && buff[1] == 'n' && buff[2] == 'd')); // если buff == "end"
  64.  
  65.     cout << endl;
  66.  
  67.  
  68.     for (int i = 0; i < k; i++) {
  69.         char *my_c_str = dpt[i];
  70.         vector<char> arr = change_my_str(my_c_str);
  71.  
  72.         for (int j = 0; j < arr.size(); j++) {
  73.             cout << arr[j];
  74.         }
  75.         cout << endl;
  76.     }
  77. }
  78.  
  79.  
  80. /*********** решение для NxN *************/
  81. // задание 2
  82. /*
  83.     Создать динамическую вещественную матрицу NxM (N и M ввести с клавиатуры).
  84.     Размещение в памяти: все строки матрицы располагаются в едином массиве
  85.     (один запрос на выделение NxM элементов). Создать функцию, которая формирует массив результатов –
  86.     минимальные значения с строках заштрихованных областях .
  87. */
  88. vector<double> find_min_in_str_in_area(double *start_pointers[], int N) {
  89.     vector<double> arr;
  90.     for (int i = 0; i < N; i++) {
  91.         arr.push_back(INT_MAX);
  92.     }
  93.  
  94.     for (int i = 0; i < N; i++) {
  95.         int j = 0;
  96.         for (double* t = start_pointers[i]; t < (start_pointers[i] + N); t++) {
  97.             if (j >= i && j <= N - i - 1) { // верхний треугольник
  98.                 if (arr[i] > *t) {
  99.                     arr[i] = *t;
  100.                 }
  101.             }
  102.             j++;
  103.         }
  104.     }
  105.  
  106.     // поменять местами строки
  107.     for (int i = 0; i < N/2; i++)
  108.         start_pointers[i] = start_pointers[N - i - 1];
  109.    
  110.     for (int i = 0; i <= N/2-1; i++) {
  111.         int j = 0;
  112.         for (double* t = start_pointers[i]; t < (start_pointers[i] + N); t++) {
  113.             if (j >= i && j <= N - i - 1) { // верхний треугольник для отзеркаленной матрицы
  114.                 if (arr[N-i-1] > *t) {
  115.                     arr[N-i-1] = *t;
  116.                 }
  117.             }
  118.             j++;
  119.         }
  120.     }
  121.  
  122.     return arr;
  123. }
  124.  
  125. void exercise_2 () {
  126.     int N, M;
  127.     cout << "Введите N размер матрицы:" << endl;
  128.    
  129.     cout << "N = "; cin >> N;
  130.  
  131.     // один запрос на выделение NxN элементов
  132.     double **A = (double**) malloc(N*sizeof(double*) + N*N*sizeof(double));
  133.     double* start = (double*) ((char*)A + N*sizeof(double*));
  134.  
  135.     for (int i = 0; i < N; i++) {
  136.         A[i] = start + i*N; // инициализация всех указателей массива указателей
  137.     }
  138.    
  139.  
  140.     // массив из указателей на начало строк X[i][0]
  141.     double *start_pointers[N];
  142.  
  143.  
  144.     srand(time(0));
  145.     for (int i = 0; i < N; i++) {
  146.         for (int j = 0; j < N; j++) {
  147.             A[i][j] = (double) rand()/pow(10, 8) - 10; //[-10; 10]
  148.             cout << setw(10) << A[i][j] << '\t';
  149.             if (j == 0)
  150.                 start_pointers[i] = &A[i][j];
  151.         }
  152.         cout << endl;
  153.     }
  154.     cout << endl;
  155.  
  156.     vector<double> arr = find_min_in_str_in_area(start_pointers, N);
  157.     for (int i = 0; i < arr.size(); i++) {
  158.         cout << "Минимальное значение в " << i+1 << " строке = " << arr[i] << endl;
  159.     }
  160.  
  161.  
  162. }
  163.  
  164.  
  165. int main() {
  166.     setlocale(LC_ALL, "Rus");
  167.  
  168.     exercise_2();
  169.  
  170.     return 0;
  171. }
  172.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement