В массиве
7х7 целого типа в каждом столбце упорядочить элементы, расположенные между максимальным и минимальным.Для начала, нужно найти минимальные и максимальные элементы массива. После чего, упорядочить или по возрастанию или по убыванию все элементы, которые находится между максимальным и минимальным элементами. Возможны такие ситуации, что максимальный и минимальный элементы расположены рядом, и тогда массив останется неизменным.
Примечание: решить с использованием указателей. Пример работы программы смотрим ниже:
Решение предоставил пользователь iksv, поблагодарим его за это. Исходный к од был в комментариях, я его перенес в эту вкладку. Вот исходник, смотрим и изучаем:
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
int matr[7][7]; // Исходная матрица
srand (time(0)); // автоматическая рандомизация
// Ввод/вывод матрицы
cout << "Исходная матрица: \n";
for (int i=0; i<7; i++) {
for (int j=0; j<7; j++) {
matr[i][j] = rand() % 10; // Заполняем матрицу произвольными числами от 0-9
cout << setw(3) << matr[i][j];
}
cout << endl;
}
int sort; // для перестановки
int *max, // указатель на максимальное значение
*min; // указатель на минимальное значение
for (int j=0; j<7; j++)
{
max = &matr[0][j];
min = &matr[0][j];
// Нахождение адресов минимального и максимального элемента в столбце
for (int i=1; i<7; i++)
{
if (matr[i][j] < *min)
min = &matr[i][j]; // Запомнили адрес минимального значения
if (matr[i][j] > *max)
max = &matr[i][j]; // запомнили адрес минимального значения
}
// Сортировка
for (int i=0; i<7; i++)
{
if (max > min) // Если максимальное значение идет позже минимального
for (int k=1; k<7; k++)
if (matr[k-1][j] > matr[k][j]) // Сортировка по возрастанию
{
sort = matr[k-1][j]; // запомнили предыдущее значение
matr[k-1][j] = matr[k][j]; // поменяли предыдущее на текущее значение
matr[k][j] = sort; // поменяли текущее значение на предыдущее
}
else if (max < min) // если минимальное значение идет позже максимального
for (int k=1; k<7; k++)
if (matr[k-1][j] < matr[k][j]) // сортировка по убыванию
{
sort = matr[k-1][j]; // запомнили предыдущее значение
matr[k-1][j] = matr[k][j]; // поменяли предыдущее на текущее значение
matr[k][j] = sort; // поменяли текущее значение на предыдущее
}
}
}
// вывод измененной матрицы
cout << "\nИзмененная матрица:\n";
for (int i=0; i<7; i++)
{
for (int j=0; j<7; j++)
cout << setw(3) << matr[i][j];
cout << endl;
}
return 0;
}
Результат:
CppStudio.com
Исходная матрица: 1 3 6 1 3 1 2 4 2 9 9 1 3 3 2 0 0 6 3 5 7 7 3 9 9 3 1 7 0 6 1 4 1 9 7 4 0 0 0 2 1 1 5 4 5 8 4 7 4 Измененная матрица: 1 0 6 1 1 1 2 4 0 9 9 1 1 3 2 2 0 6 2 1 7 7 3 9 9 3 3 7 0 3 1 4 3 5 7 4 4 0 0 3 7 1 5 6 5 8 4 9 4
Комментарии
RodjeR
#include <iostream> #include <conio.h> #include <random> #include <time.h> #include <iomanip> #include <cstdlib> using namespace std; int main() { setlocale(0, ""); srand(time(NULL)); int a = 0; cout << "Введите размер массива: "; cin >> a; int **matrix = new int*[a]; for (int i(0); i < a; i++) matrix[i] = new int[a]; for (int i = 0; i < a; i++) { for (int j = 0; j < a; j++) matrix[i][j] = rand() % 9; } cout << "Исходный массив:\n "; for (int i = 0; i < a; i++) { cout << endl; for (int j = 0; j < a; j++) { cout << setw(2) << matrix[i][j] << " "; } } cout << endl; int max = 0, min = 0; for (int i = 0; i < a; i++) { for (int j = 0; j < a; j++) { if (max < matrix[i][j]) { max = matrix[i][j]; } } } for (int i = 0; i < a; i++) { for (int j = 0; j < a; j++) { if (min > matrix[i][j]) { min = matrix[i][j]; } } } cout << "Максимальный элемент в матрице = " << max << " " << " минимальный = " << min << endl; int sort = 0; for (int i = 0; i < a; i++) { for (int j = 0; j < a; j++) { if (max > min) { for (int k = 1; k < a; k++) { if (matrix[k - 1][j] > matrix[k][j]) { sort = matrix[k - 1][j]; matrix[k - 1][j] = matrix[k][j]; matrix[k][j] = sort; } } } else if (max < min) { for (int k = 1; k < a; k++) { if (matrix[k - 1][j] < matrix[k][j]) { sort = matrix[k - 1][j]; matrix[k - 1][j] = matrix[k][j]; matrix[k][j] = sort; } } } } } cout << endl; for (int i = 0; i < a; i++) { cout << endl; for (int j = 0; j < a; j++) { cout << setw(2) << matrix[i][j] << " "; } } for (int i = 0; i < a; i++) delete[] matrix[i]; delete[] matrix; _getch(); return 0; }Arthur
//не используя указатели #include<iostream> #include <ctime> #include <cstdlib> #include<iomanip> using namespace std; const int SZ = 7; int main() { setlocale(LC_CTYPE, "rus"); int mass[SZ][SZ]; srand(time(0)); cout<<"Исходная матрица:\n "<<endl; for(int x = 0; x<SZ; x++) { for(int y = 0; y<SZ; y++) { mass[x][y] = rand()%50; cout<<setw(4)<<mass[x][y]; } cout<<"\n\n"; } cout<<endl; for(int x = 0; x<SZ; x++) { int inmin = 0; int inmax = 0; for(int y = 1; y<SZ; y++) if( mass[y][x] < mass[inmin][x]) inmin = y; for(int y = 0; y<SZ; y++) if( mass[y][x] > mass[inmax][x]) inmax = y; if(inmin<inmax) for(int temp1 = inmin+1; temp1<inmax-1; temp1++) for(int temp2 = temp1 + 1; temp2<inmax; temp2++) if(mass[temp1][x] > mass[temp2][x]) { int temp3 = mass[temp2][x]; mass[temp2][x] = mass[temp1][x]; mass[temp1][x] = temp3; } if(inmin>inmax) for(int temp1 = inmax+1; temp1<inmin-1; temp1++) for(int temp2 = temp1 + 1; temp2<inmin; temp2++) if(mass[temp1][x] < mass[temp2][x]) { int temp3 = mass[temp2][x]; mass[temp2][x] = mass[temp1][x]; mass[temp1][x] = temp3; } } cout<<"Измененная матрица:\n "<<endl; for(int x = 0; x<SZ; x++) { for(int y = 0; y<SZ; y++) cout<<setw(4)<<mass[x][y]; cout<<"\n\n"; } }Arthur
#include<iostream> #include <ctime> #include <cstdlib> #include<iomanip> #include<algorithm> using namespace std; const int SZ = 7; void retur_mass(int**, int ); //поменять строки и столбцы местами int main() { setlocale(LC_CTYPE, "rus"); int** mass = new int*[SZ]; //создать массив for(int x = 0; x<SZ; x++) mass[x] = new int[SZ]; srand(time(0)); cout<<"Исходная матрица:\n "<<endl; for(int x = 0; x<SZ; x++) { for(int y = 0; y<SZ; y++) { mass[x][y] = rand()%50; //заполнить массив cout<<setw(4)<<mass[x][y]; //показать массив } cout<<"\n\n"; } retur_mass(mass, SZ ); //поменять строки и столбцы местами for(int x = 0; x<SZ; x++) { int* max = max_element(mass[x], mass[x] + SZ); //найти макс элемент в строке int* min = min_element(mass[x], mass[x] + SZ); //найти мин элемент в строке if(min<max) //если мин элемент идет раньше макс элемента sort(min, max); //то сортировать от мин к макс по возрастанию if(max<min) //если макс элемент идет раньше мин элемента sort(max, min, greater<int>()); //то сортировать от макс к мин по по убыванию } retur_mass(mass, SZ ); //поменять строки и столбцы местами cout<<"Измененная матрица:\n "<<endl; for(int x = 0; x<SZ; x++) //показать матрицу { for(int y = 0; y<SZ; y++) cout<<setw(4)<<mass[x][y]; cout<<"\n\n"; } } ///////////////////////////////////////////// void retur_mass(int** ms, int sz) { for(int x = 0, m = 0; x<sz; x++, m++) for(int y = x+1, n = m+1; y<sz; y++, n++) { int temp = ms[x][y]; ms[x][y] = ms[n][m]; ms[n][m] = temp; } }Arthur
#include<iostream> #include <ctime> #include <cstdlib> #include<iomanip> using namespace std; const int SZ = 7; int* find_min(int* , int ); //найти мин элемент в строке int* find_max(int* , int ); //найти макс элемент в строке void retur_mass(int**, int ); //поменять строки и столбцы местами int main() { setlocale(LC_CTYPE, "rus"); int** mass = new int*[SZ]; //создать массив for(int x = 0; x<SZ; x++) mass[x] = new int[SZ]; srand(time(0)); cout<<"Исходная матрица:\n "<<endl; for(int x = 0; x<SZ; x++) //заполнить массив { //показать массив for(int y = 0; y<SZ; y++) { mass[x][y] = rand()%50; cout<<setw(4)<<mass[x][y]; } cout<<"\n\n"; } cout<<endl; retur_mass(mass, SZ ); //поменять строки и столбцы местами for(int x = 0; x<SZ; x++) { int* min = find_min(mass[x], SZ); //найти мин элемент в строке int* max = find_max(mass[x], SZ); //найти макс элемент в строке if(min<max) //если мин элемент идет раньше макс элемента for(int* temp1 = min+1; temp1<max-1; temp1++) //то сортировать от мин к макс по возрастанию for(int* temp2 = temp1 + 1; temp2<max; temp2++) if(*temp1 > *temp2) { int temp3 = *temp2; *temp2 = *temp1; *temp1 = temp3; } if(min>max) //если макс элемент идет раньше мин элемента for(int* temp1 = max+1; temp1<min-1; temp1++) //то сортировать от макс к мин по по убыванию for(int* temp2 = temp1 + 1; temp2<min; temp2++) if(*temp1 < *temp2) { int temp3 = *temp2; *temp2 = *temp1; *temp1 = temp3; } } retur_mass(mass, SZ ); //поменять строки и столбцы местами cout<<"Измененная матрица:\n "<<endl; for(int x = 0; x<SZ; x++) { for(int y = 0; y<SZ; y++) cout<<setw(4)<<mass[x][y]; cout<<"\n\n"; } } //////////////////////////////////////////// int* find_min(int* st, int sz ) { int *min = st; for(int x = 0; x<sz; x++) if( st[x]<*min) min = st + x; return min; } ////////////////////////////////////////// int* find_max(int* st, int sz ) { int *max = st; for(int x = 0; x<sz; x++) if( st[x]>*max) max = st + x; return max; } /////////////////////////////////////////////// void retur_mass(int** ms, int sz) { for(int x = 0, m = 0; x<sz; x++, m++) for(int y = x+1, n = m+1; y<sz; y++, n++) { int temp = ms[x][y]; ms[x][y] = ms[n][m]; ms[n][m] = temp; } }iksv
#include "stdafx.h" #include <iostream> #include <iomanip> #include <ctime> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL, "rus"); int matr[7][7]; // Исходная матрица srand (time(0)); // автоматическая рандомизация // Ввод/вывод матрицы cout << "Исходная матрица: \n"; for (int i=0; i<7; i++) { for (int j=0; j<7; j++) { matr[i][j] = rand() % 10; // Заполняем матрицу произвольными числами от 0-9 cout << setw(3) << matr[i][j]; } cout << endl; } int sort; // для перестановки int *max, // указатель на максимальное значение *min; // указатель на минимальное значение for (int j=0; j<7; j++) { max = &matr[0][j]; min = &matr[0][j]; // Нахождение адресов минимального и максимального элемента в столбце for (int i=1; i<7; i++) { if (matr[i][j] < *min) min = &matr[i][j]; // Запомнили адрес минимального значения if (matr[i][j] > *max) max = &matr[i][j]; // запомнили адрес минимального значения } // Сортировка for (int i=0; i<7; i++) { if (max > min) // Если максимальное значение идет позже минимального for (int k=1; k<7; k++) if (matr[k-1][j] > matr[k][j]) // Сортировка по возрастанию { sort = matr[k-1][j]; // запомнили предыдущее значение matr[k-1][j] = matr[k][j]; // поменяли предыдущее на текущее значение matr[k][j] = sort; // поменяли текущее значение на предыдущее } else if (max < min) // если минимальное значение идет позже максимального for (int k=1; k<7; k++) if (matr[k-1][j] < matr[k][j]) // сортировка по убыванию { sort = matr[k-1][j]; // запомнили предыдущее значение matr[k-1][j] = matr[k][j]; // поменяли предыдущее на текущее значение matr[k][j] = sort; // поменяли текущее значение на предыдущее } } } // вывод измененной матрицы cout << "\nИзмененная матрица:\n"; for (int i=0; i<7; i++) { for (int j=0; j<7; j++) cout << setw(3) << matr[i][j]; cout << endl; } system("pause"); return 0; }