Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#include "StdAfx.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- #include <iostream>
- #include <cstring>
- #include <vector>
- #include <random>
- #include <iomanip>
- #include <climits>
- using namespace std;
- // вариант 14
- // 2 уровень
- // задание 1
- /*
- Создать функцию для поиска цифр в строке (возвращается массив указателей).
- Тестовая программа: Ввести текст (несколько строк) с клавиатуры, признак
- окончания – слово «end». Данные размещать в динамической области. Изменить
- текст: каждую цифру увеличить на ее порядковый номер (первую цифру на 1, вторую – на 2 и т.п.)
- Вывести текст на экран и отформатировать: Реализовать функцию «выровнять строки по левому краю».
- */
- vector<char> change_my_str(char* my_str) {
- int my_str_len = strlen(my_str);
- vector<char> arr;
- int c = 0;
- for (int i = 0; i < my_str_len; i++) {
- if (isdigit(my_str[i])) {
- c++;
- arr.push_back(((my_str[i]-'0')+c)+'0');
- //cout << (int)(my_str[i])+c-48;
- }
- else {
- arr.push_back(my_str[i]);
- //cout << my_str[i];
- }
- }
- return arr;
- }
- void exercise_1() {
- const int N = 30; // максимальное количество динамических строк
- const int M = 100; // максимальная длина строки
- // Динамический массив указателей на динамические строки
- char **dpt; // 2-x уровневый указатель
- char buff[M];
- // выделение памяти под динамический массив указателей
- dpt = (char**)malloc(sizeof(*dpt) * N);
- int k = 0;
- //выделение памяти и инициализация динамических строк
- cout << "Введите несколько строк на латинице, окончание ввода - 'end'" << endl;
- do {
- cin.getline(buff, sizeof(buff)); // ввод с клавиатуры в статический буфер
- dpt[k] = (char*)malloc(strlen(buff) + 1); // выделение динамической памяти под строку
- strcpy(dpt[k], buff); // копирование строки в динамическую память
- k++;
- } while(!(buff[0] == 'e' && buff[1] == 'n' && buff[2] == 'd')); // если buff == "end"
- cout << endl;
- for (int i = 0; i < k; i++) {
- char *my_c_str = dpt[i];
- vector<char> arr = change_my_str(my_c_str);
- for (int j = 0; j < arr.size(); j++) {
- cout << arr[j];
- }
- cout << endl;
- }
- }
- /*********** решение для NxN *************/
- // задание 2
- /*
- Создать динамическую вещественную матрицу NxM (N и M ввести с клавиатуры).
- Размещение в памяти: все строки матрицы располагаются в едином массиве
- (один запрос на выделение NxM элементов). Создать функцию, которая формирует массив результатов –
- минимальные значения с строках заштрихованных областях .
- */
- vector<double> find_min_in_str_in_area(double *start_pointers[], int N) {
- vector<double> arr;
- for (int i = 0; i < N; i++) {
- arr.push_back(INT_MAX);
- }
- for (int i = 0; i < N; i++) {
- int j = 0;
- for (double* t = start_pointers[i]; t < (start_pointers[i] + N); t++) {
- if (j >= i && j <= N - i - 1) { // верхний треугольник
- if (arr[i] > *t) {
- arr[i] = *t;
- }
- }
- j++;
- }
- }
- // поменять местами строки
- for (int i = 0; i < N/2; i++)
- start_pointers[i] = start_pointers[N - i - 1];
- for (int i = 0; i <= N/2-1; i++) {
- int j = 0;
- for (double* t = start_pointers[i]; t < (start_pointers[i] + N); t++) {
- if (j >= i && j <= N - i - 1) { // верхний треугольник для отзеркаленной матрицы
- if (arr[N-i-1] > *t) {
- arr[N-i-1] = *t;
- }
- }
- j++;
- }
- }
- return arr;
- }
- void exercise_2 () {
- int N, M;
- cout << "Введите N размер матрицы:" << endl;
- cout << "N = "; cin >> N;
- // один запрос на выделение NxN элементов
- double **A = (double**) malloc(N*sizeof(double*) + N*N*sizeof(double));
- double* start = (double*) ((char*)A + N*sizeof(double*));
- for (int i = 0; i < N; i++) {
- A[i] = start + i*N; // инициализация всех указателей массива указателей
- }
- // массив из указателей на начало строк X[i][0]
- double *start_pointers[N];
- srand(time(0));
- for (int i = 0; i < N; i++) {
- for (int j = 0; j < N; j++) {
- A[i][j] = (double) rand()/pow(10, 8) - 10; //[-10; 10]
- cout << setw(10) << A[i][j] << '\t';
- if (j == 0)
- start_pointers[i] = &A[i][j];
- }
- cout << endl;
- }
- cout << endl;
- vector<double> arr = find_min_in_str_in_area(start_pointers, N);
- for (int i = 0; i < arr.size(); i++) {
- cout << "Минимальное значение в " << i+1 << " строке = " << arr[i] << endl;
- }
- }
- int main() {
- setlocale(LC_ALL, "Rus");
- exercise_2();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement