Найти в каждой строке матрицы G(n, m) максимальный и минимальный элементы

Найти в каждой строке матрицы G(n, m) максимальный и минимальный элементы и поместить их на место первого и последнего элемента строки соответственно. Вывести на экран исходную и полученную матрицы в общепринятом виде. Для создания массива используйте

#include <iostream>
#include <cstdlib>// Для rand
#include <iomanip>// Для setw
#include <ctime> //Для time

using namespace std;
 int const m=3;
 int const n=5;
int main(void)
{
    setlocale(0,"rus");
    srand(time(NULL));
    int mas[m][n],Min,Max,*p,s,t;

    for (int i=0;i<m;i++)
    {
        p=mas[i];
        for (int j=0;j<n;j++)
        {
            *(p+j)=rand()%30;
            cout<<setw(6)<<mas[i][j]<<" ";
        }
        cout<<'\n';
    }

    for (int i=0;i<m;i++)
    {
    p=mas[i];
    Max=*p;
    Min=*p;
        for ( int j=0;j<n;j++)
        {
            if (mas[i][j]>Max)
               Max=mas[i][j];

            if (mas[i][j]<Min)
                Min=mas[i][j];
        }
        cout<<"\n";
        cout<<"Минимум-"<<Min<<'\n';
        cout<<"Максимум-"<<Max<<'\n';

    } cout<<"\n";

    cout<<"Изменённый массив:"<<'\n';

     for (int i=0;i<m;i++)
    {
        for ( int j=0;j<n-1;j++)
        {
             if (mas[i][j]==Max)
                {s=mas[i][j];
            mas[i][j]=mas[i][0];
            mas[i][0]=s;}

      if (mas[i][j]==Min)
            {t=mas[i][j];
            mas[i][j]=mas[i][4];
            mas[i][4]=t;}

        }

    }


    for (int i=0;i<m;i++)
    {
        for (int j=0;j<n;j++)
        {
           cout<<setw(6)<<mas[i][j]<<" ";
        }
        cout<<'\n';
    }



   return 0;
}

Rinochka1985, ваш код будет работать, если переписать его так:

#include <iostream>
using std::cout;

#include <cstdlib>  // Для rand
using std::rand;
using std::srand;

#include <iomanip>  // Для setw
using std::setw;

#include <ctime>    //Для time
using std::time;

const int m = 3;
const int n = 5;

int main(void)
{
    setlocale(0, "rus");

    srand(static_cast<unsigned int>(time(NULL)));

    int mas[m][n], *p;

    for (int i = 0; i < m; i++){
        p = mas[i];

        for (int j = 0; j < n; j++){
            *(p + j) = rand() % 30;
            cout << setw(6) << *(p + j) << " ";
        }
        cout << '\n';
    }

    int Min, Max, s, t;

    for (int i = 0; i < m; i++){

        p = *(mas + i);

        Max = *p;
        Min = *p;

        for (int j = 0; j < n; j++){
            if (*(p + j) > Max)
               Max = *(p + j);

            if (*(p + j) < Min)
                Min = *(p + j);
        }

        cout << "\n\nМинимум: " << Min
            << "\nМаксимум: " << Max;

        for (int b = 0; b < n; b++){
            if (*(p + b) == Max){
                s = *(p + b);
                *(p + b) = *(p + 0);
                *(p + 0) = s;
            }
        }

        for (int b = 0; b < n; b++){
            if (*(p + b) == Min){
                t = *(p + b);
                *(p + b) = *(p + (n - 1));
                *(p + (n - 1)) = t;
            }
        }
    }

    cout<<"\n\nИзменённый массив:\n\n";

    for (int i = 0; i < m; i++)
    {
        p = *(mas + i);

        for (int j = 0; j < n; j++)
        {
           cout << setw(6) << *(p + j) << " ";
        }
        cout << '\n';
    }

   return 0;
}

Rinochka1985, перед тем, как бросаться кодить, задачу нужно осмысливать.

Сейчас у тебя программа состоит из четырех блоков: (1) генерация значений и вывод матрицы, (2) поиск максимального и минимального значения в строке, (3) замена первого и последнего значения в строке и (4) вывод итоговой матрицы.

Твоя основная ошибка в том, что в блоке 2 ты находишь максимальное и минимальное значение в текущей строке, но к началу блока 3 в переменных Min и Max содержаться минимальное и максимальное значение для последней строки.

Вторая ошибка в том, что в блоке 3 ты опять ищешь значения, сравнивая с Min и Max.

Если эти две проблемы решать тупо в лоб, то надо организовать еще один массив с таким же количеством строк, как в mas, и двумя значениями в строке, в котором запоминать индексы минимального и максимального элементов. Тогда блок 3 сведется к одному циклу for по строкам, в котором будут браться индексы максимального и минимального элемента для текущей строки из дополнительного массива и будет осуществляться обмен значений в основном массиве.

Если задачу осмыслить, то станет понятно, что блоки 2 и 3 можно совместить и не заморачиваться с лишним массивом. После нахождения в строке индексов элементов с минимальным и максимальным значениями, здесь же выполнить обмен с первым и последним элементами строки соответственно. И дальше переходить к обработке следующей строки.


Еще мне не понравилось что ты мешаешь в одну кучу использование индексов и адресной арифметики для доступа к элементам массива, тем более, что массив двухмерный. Если ты определяешь массив, используя синтаксис определения массива, то и обращайся к элементам массива через индексы. Компилятор лучше тебя сгенерирует всю необходимую адресную арифметику.

Во, еще один любитель адресной арифметики!

Alf, вот скажи, зачем порождать такой неудобочитаемый код?
Зачем писать

    for (int i = 0; i < m; i++){

        p = *(mas + i);

        Max = *p;

когда можно

    for (int i = 0; i < m; i++){

        Max = mas[i][0];

А вот это меня вообще порадовало!

                *(p + b) = *(p + 0);
                *(p + 0) = s;

Alf, вот скажи, зачем порождать такой неудобочитаемый код?

Честно тебе скажу, Фтьiкай, даже не заморачивался ))). Нашел ошибки о которых ты рассказал, с помощью поиска исправил все индексы на нотацию указателей (начало то у Rinochka1985 закрутилось вокруг этого) и дело в шляпе.
Приношу свои извинения, так конечно делать нельзя.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.