Целочисленная матрица размером n*m и график функции

Целочисленная матрица размером n*m и график функции

1) Дана целочисленная матрица размером n*m. Написать программу, формирующую двумерный массив по следующему правилу: элементы первой строки – в порядке возрастания индексов столбцов, элементы второй строки – в порядке убывания индексов столбцов и т. д.
2) Разработать приложение, пририсовывающее график функции, написанной пользователем. Приложение должно демонстрировать рассчитанные параметры.
Думаю, нужно создавать процедуру типа void где объявить указатель на целочисленный двумерный массив.. а я забыла, как это делается
А еще я понятия не имею, как разработать приложение, которое строит график функции.
Помогите мне, пожалуйста.
Код:

#include "stdafx.h"
#include <iostream>

using namespace std;

void massiv(int *arr, const int m = 5, const int n = 5)
{
    int a, b, c;
    c = a;
    a = b;
    b = c;
    int i, j;
    for (int i = 0; i < m; i++)
    {
        for(int j = 0; j < n; j++)
        {
            cout << "Введите элементы массива: ";
            cin >> *(arr + i*m + j);
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
    int i, j;
    const int m = 5, n = 5;
    int *arr[m][n];
    for (i = 0; i < m; i++)
    {
       if((i % 2) == 0)
      {
        for(j = 0; j < n; j++)
        {
            massiv(arr[i][j], arr[i][m-j+1]);
        }
      }
    }
    for(i = 0; i < m; i++)
    {
        for(j = 0; j < n; j++)
        {
            cout << "Элемент [" << i << "] массива";
            cout << "Элемент [" << j << "] массива";
        }
    }
    system("pause");
    return 0;
}

вот я переделала код
на С++ пишу
правильно ли этот код написан или нет?

#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
    srand(time(NULL));
    const int n = 3, m = 3;
    int arr[n][m];
    int i, j;
    cout << "Исходный массив: " << endl;
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < m; j++)
        {
        arr[i][j] = -10 + rand() % 20;
        cout << arr[i][j] << " ";
        }
        cout << endl;
     }

for(i = 0; i < n; i++)
if(i % 2 == 0)
{
     for(j = 0; j < m - 1; j++)
      {
    if(arr[i][j] > arr[i][j + 1])
    {
            swap(arr[i][j], arr[i][j + 1]);
    }
     }
}

else
{
    for(j = 0; j < m - 1; j++)
      {
    if(arr[i][j] < arr[i][j + 1])
    {
            swap(arr[i][j], arr[i][j + 1]);
    }
     }
}

cout << "Отсортированный массив: " << endl;

for(i = 0; i < n; i++)
    {
        for(j = 0; j < m; j++)
        {
        cout << arr[i][j] << " ";
        }
        cout << endl;
     }

    system("pause");
    return 0;
}

Анна, я три раза перечитал ваше первое задание, но так и не понял, что требуется. Судя по вашему коду, вы решили сортировать значения в строках матрицы: в четных — по возрастанию, в нечетных — по убыванию. Ок, пусть будет так.

Ваша программа работает неправильно. Это даже видно по результатам нескольких тестовых прогонов. А если посмотреть код, то сортировка написана неправильно.

Если не стоит задачи написать процедуру сортировки, то и не стоит придумывать велосипед. Воспользуйтесь библиотечной функцией.

При форматировании вывода пользуйтесь манипуляторами из заголовка <iomanip>, или, по старинке, функцией printf. Результаты будут выглядеть аккуратнее.

И, пожалуйста, форматируйте исходник нормально. В Visual Studio это делается двумя нажатиями пары кнопок. И самой будет легче в коде разбираться, и другим будет проще.

Я в вашей программе кое-что подправил. Тоже, конечно, не образец высокого штиля, но работает ;)

#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>

using namespace std;

int main() {
    setlocale(0, "");
    srand((unsigned int)time(NULL));
    const int n = 10, m = 10;
    int arr[n][m];
    int i, j;
    cout << "Исходный массив: " << endl;
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            arr[i][j] = -10 + rand() % 20;
            cout << setw(4) << arr[i][j];
        }
        cout << endl;
    }

    for (i = 0; i < n; i++)
        if (i % 2 == 0) {
            qsort(arr[i], m, sizeof(int), [](const void *a, const void *b) { return *(int *)a - *(int *)b; });
        }
        else {
            qsort(arr[i], m, sizeof(int), [](const void *a, const void *b) { return *(int *)b - *(int *)a; });
        }

        cout << "Отсортированный массив: " << endl;

        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                cout << setw(4) << arr[i][j];
            }
            cout << endl;
        }

        system("pause");
        return 0;
}
for (i = 0; i < n; i++)
    if (i % 2 == 0) {
        qsort(arr[i], m, sizeof(int), [](const void *a, const void *b) { return *(int *)a - *(int *)b; });
    }
    else {
        qsort(arr[i], m, sizeof(int), [](const void *a, const void *b) { return *(int *)b - *(int *)a; });
    }

Почему не std::sort?
Например:

for (int i = 0; i < n; i+=2)
    std::sort(arr[i], arr[i] + m);
for (int i = 1; i < n; i+=2)
    std::sort(arr[i], arr[i] + m, std::greater<int>());

Ну почему вы используете всякие векторы? Можете предложить вариант решения этой задачи без векторов, т.к. я не разбираюсь в них

Ну почему вы используете всякие векторы? Можете предложить вариант решения этой задачи без векторов, т.к. я не разбираюсь в них

Где здесь vector?

MasterOfAlteran,

Почему не std::sort?

да вот поэтому:

Ну почему вы используете всякие векторы? Можете предложить вариант решения этой задачи без векторов, т.к. я не разбираюсь в них

да вот поэтому:

И что общего между вектором и алгоритмом? )))

MasterOfAlteran, я имел ввиду уровень восприятия информации реципиентом.

Я решила еще раз переделать код. Вот, это правильный вариант, рабочий?

#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;

void sort(int **ARR, int N, int M)
{
    int i, j, temp;
    for (i = 0; i < N; i++) 
    {
        if (i % 2 != 0)
        {
            int k;
            for (k = 0; k < M; k++)
            {
                for (j = k + 1; j < M; j++)
                {
                    temp = ARR[i][k];
                    ARR[i][k] = ARR[i][j];
                    ARR[i][j] = temp;
                }
            }
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
    const int n = 4, m = 4;

    srand(time(NULL));
    int i, j;
    int **arr = new int*[n]; // строки
    for (i = 0; i < n; i++)
    {
        arr[i] = new int[m]; // столбцы
        for (j = 0; j < m; j++)
        {
            arr[i][j] = -20 + rand() % 30;
        }
    }

    cout << "Исходный массив: " << endl;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;

    sort(arr, n, m);

    cout << "Преобразованный массив: " << endl;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;

    for (i = 0; i < n; i++)
    {
        delete[] arr[i];
    }
    delete[] arr;

    system("pause");
    return 0;
}

Анна, вы тестили свою программу? Вас удовлетворяют результаты ее работы? Если да, значит ваиант правильный. Инвертирование строки матрицы можно было сделать и в один цикл... и даже просто вызовом стандартной функции. Но вы же не разбираетесь в STL. По этой же причине не упоминаю функцию swap.

Я тестировала программу, но я недопонимаю условие задачи. Результаты наверное правильные, не знаю. Я жду ответа от тех кто понимает условие этой задачи лучше меня

Анна, может надо обратиться за комментариями к преподавателю, который дал задание, чем здесь всем кагалом гадать на кофейной гуще?

Сортировка должна быть такая (пример):
Неотсортированный массив
3 2 5 -2
1 2 3 4
5 1 3 9
1 3 4 1

Отсортированный массив
3 3 5 1
1 1 3 9
5 2 3 4
1 2 4 -2

Анна, вы хотите сказать, что ваша программа делает именно такую сортировку, как указано в примере? Я вас разочарую.

Также и задание не соответствует этому примеру сортировки.

В примере для каждого второго столбца порядок элементов заменяется на обратный.

Я бы это вообще не назвал «сортировкой». «Преобразование» — да, но не сортировка.

#include <iostream>
#include <iomanip>
#include <utility>
#include <ctime>

using namespace std;

#define SAMPLE

int main() {
    setlocale(0, "");
    srand((unsigned int)time(NULL));
#if defined(SAMPLE)
    const int n = 4, m = 4;
    int arr[n][m]{
        { 3, 2, 5, -2 },
        { 1, 2, 3, 4 },
        { 5, 1, 3, 9 },
        { 1, 3, 4, 1 }
    };
#else
    const int n = 10, m = 10;
    int arr[n][m];
#endif
    int i, j;
    cout << "Исходный массив: " << endl;
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
#if !defined(SAMPLE)
            arr[i][j] = -10 + rand() % 20;
#endif
            cout << setw(4) << arr[i][j];
        }
        cout << endl;
    }

    for (i = 0; i < n / 2; i++) {
        for (j = 0; j < m; j++) {
            if (j % 2)
                swap(arr[i][j], arr[n - i - 1][j]);
        }
    }

    cout << "Отсортированный массив: " << endl;

    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            cout << setw(4) << arr[i][j];
        }
        cout << endl;
    }

    system("pause");
    return 0;
}

Если закомментировать строку #define SAMPLE, то будет считаться матрица 10х10 со случайными числами.

    for (j = 0; j < m; j++) {
        if (j % 2)
            swap(arr[i][j], arr[n - i - 1][j]);
    }

достаточно ходить через «единичку»:

    for (j = 1; j < m; j+=2) {
            swap(arr[i][j], arr[n - i - 1][j]);
    }

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

Ответить

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

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

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

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

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

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