Упорядочить элементы массива

Уровень сложности:

В массиве 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
Следующие статьи помогут вам в решении данной задачи:
Автор: admin
Дата: 12.09.2012
Поделиться:

Комментарии

  1. 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;
    }
  2. 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";
        }
    }
  3. 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;
         }
    }
  4. 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;
         }
    }
    
    
  5. 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;
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.