Основы программирования на С++ для начинающих

Задачи: Двумерные массивы C++

Чтобы приступить к решению задач, предложенных в этой статье, вам необходимо знать что такое двумерные (многомерные) массивы . Задачи расположены от простой к сложной. Так что, если вы новичок в программировании, начинайте с первой, чтобы лучше разобраться с остальными.

1. Объявить двумерный массив, заполнить целыми числами и показать на экран. 

2) Объявить двумерный массив и заполнить его построчно с клавиатуры. После заполнения – показать заполненную матрицу на экран и посчитать сумму элементов отдельно в каждом столбце и каждой строке.

3) Заполнить двумерный массив случайными  числами от 10  до 100. Посчитать сумму элементов отдельно в каждой строке и определить номер строки,  в которой эта сумма максимальна.

Ваши вопросы, которые возникли при решении задач, оставляйте в комментариях к этой статье.

118 thoughts on “Задачи: Двумерные массивы C++

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

    Выходные данные
    Программа выводит значение максимального элемента, затем номер строки и номер столбца, в котором он встречается. Если в массиве несколько максимальных элементов, то нужно вывести минимальный номер строки, в которой встречается такой элемент, а если в этой строке таких элементов несколько, то нужно вывести минимальный номер столбца. Не забудьте, что все строки и столбцы нумеруются с 0.

    Примеры
    входные данные
    3 3
    3 1 2
    1 3 4
    3 3 3
    выходные данные
    4
    1 2

    1. И на что вы рассчитываете?
      Что кто-то станет решать за вас ваши домашние задания пока вы будете широко гулять?

      Так за такое удовольствие деньги платят!

    2. #include “stdafx.h”
      #include
      #include
      #include
      #include // setw(отступ)

      using namespace std;

      int main() {

      setlocale(0, “”);
      srand(time(NULL));

      const int ROWSIZE = 3;
      const int COLSIZE = 3;

      int arr[ROWSIZE][COLSIZE] = {};
      // заполнение массива с клавиатуры
      /*
      for (int rowNum = 0; rowNum < ROWSIZE; rowNum++) {
      for (int colNum = 0; colNum < COLSIZE; colNum++) {
      cout << "Пожалуйста, введите исходные значения массива: ";
      cout << rowNum + 1 << "-я строка ";
      cout << colNum + 1 <> arr[rowNum][colNum];

      }
      }
      */
      // Заполняем массив случайными числами
      for (int rowNum = 0; rowNum < ROWSIZE; rowNum++) {
      cout << "Строка " << rowNum + 1 << ": ";
      for (int colNum = 0; colNum < COLSIZE; colNum++) {
      arr[rowNum][colNum] = 1 + rand() % 9;
      cout << setw(2) << arr[rowNum][colNum];
      }
      cout << endl;
      }
      // Находим максимальное число, а если их несколько то находим самую первую строку и столбец, где оно встречается
      int row[ROWSIZE]{};
      int col[COLSIZE]{};
      int temp = 0;
      int temp1 = 0;

      for (int r = 0; r < ROWSIZE; r++) {
      for (int c = 0; c < COLSIZE; c++) {
      if (col[0] < arr[c][r]) {
      col[0] = arr[c][r];
      temp = r;
      temp1 = c;
      }
      else c;
      }

      }
      cout << "Максимальное: " << col[0] << " COL: " << temp1 + 1 << " ROW: " << temp + 1 << endl;

      system("pause");
      return 0;
      };

    3. #include
      #include
      #include
      #include
      #include

      int main ()
      {
      setlocale(LC_ALL, “rus”);
      srand(time(NULL));

      int N, M;
      printf (“Введите количество спортсменов: “);
      scanf (“%d”, &N);
      printf (“Введите количество попыток: “);
      scanf (“%d”, &M);

      int **A = new int *[N];
      for (int count = 0; count < N; count++)
      A[count] = new int [N];

      int nMax = 0, iMax, jMax;
      int i, j;
      printf ("\nТаблица с результатами: \n");
      for (i = 0; i < N; i++)
      {
      printf ("Спортсмен №%d: ", i+1);
      for (j = 0; j < M; j++)
      {
      A[i][j] = rand()%25 + 1;
      printf ("%3d ", A[i][j]);

      if(nMax == A[i][j])
      {
      if(i < iMax && j < jMax)
      nMax = A[i][j];
      else
      nMax != A[i][j];
      }

      if(nMax < A[i][j])
      {
      nMax = A[i][j];
      iMax = i;
      jMax = j;
      }
      }
      printf ("\n");
      }
      printf ("\nЛучший результат – %d у спорстмена №%d в попытке №%d!", nMax, iMax + 1, jMax + 1);

      for (int count = 0; count < N; count++)
      delete [] A[count];

      return 0;
      }

    4. int main()
      {
      setlocale(LC_ALL, “rus”);
      SetConsoleCP(1251);
      SetConsoleOutputCP(1251);
      srand(time(NULL));

      const int n = 5, m = 7;
      int MM[n][m]{}, max = 0,r,s,R,S;
      for (int i = 0; i < n; i++)
      {
      for (int j = 0; j < m; j++)
      {
      MM[i][j] = 15 + rand() % 55;
      cout << MM[i][j] << "|";
      }
      cout << endl;

      }
      for (int i = 0; i < n; i++)
      {
      for (int j = 0; j max)
      {
      max = MM[i][j];
      r = i;
      s = j;
      }
      if (max==MM[i][j] && i != r && j != s)
      {
      cout << "Opapa! U nas 2 Pobeditelya!\n";
      R = i;
      S = j;
      cout << "Pobedu delyat uchastnik #" << r + 1 << " i uchastnik #" << R + 1 << " S rezultatom " << max << " metrov!\n Pozdravlyaem!";
      return 0;
      }

      }

      }

      cout << "Pobedil uchastnik #" << r+1 << " s " << s+1 << " poputki, S rezultatom " << max << " metrov!\n Pozdravlyaem!";

    5. #include
      #include
      using namespace std;

      int main()
      {
      srand(time(NULL));
      setlocale(LC_ALL, “Rus”);

      const int N = 10, M = 15;

      int arr[N][M], minn=999999, countmx=0, max=-1, digitsr, digitsl;

      bool flag = false;

      for (int i = 0; i < N; i++)
      {
      for (int j = 0; j < M; j++)
      {
      arr[i][j] = rand() % 150;
      cout << "[" << i << "]" << "[" << j << "] = " << arr[i][j] << endl;
      if (arr[i][j] == max)
      {
      countmx += 1;
      if (!flag)
      {
      minn = j;
      flag = true;
      }
      if (j max)
      {
      max = arr[i][j];
      digitsr = i;
      digitsl = j;
      }
      }
      }
      if (countmx != 0)
      cout << "Мин. номер столбца = " << minn;
      else
      {
      cout << "Максимальное значение элемента = " << max << endl;
      cout << "Номер строки = " << digitsr << endl;
      cout << "Номер столбца = " << digitsl;
      }
      return (0);
      }

      1. cout << "[" << i << "]" << "[" << j << "] = " << arr[i][j] << endl
        ^ этого быть не должно, я забыл удалить

  2. ОБЪяСНИТЕ ПОЖАЛУЙСТА!!! почему сумма в столбцах выводится не правильно??

    #include
    #include
    using namespace std;

    int main()
    {
    setlocale(LC_ALL, “rus”);
    srand(time(NULL));
    const int RowCount = 10;
    int array[RowCount][RowCount] = {};
    int SumRow[RowCount] = {}, SumColumn[RowCount] = {};

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

    for (int j = 0; j < RowCount; j++) {
    array[i][j] = i*j;
    cout << setw(4) << array[i][j] << " ";
    SumRow[i] += array[i][j];
    SumColumn[i] += array[j][i];

    }
    cout << endl;
    }
    for (int i = 0; i < 10; i++) {
    cout << "Сумма в " << i + 1 << " строке = " << SumRow[i] << " ";
    cout << "Сумма в " << i + 1 << " столбце = " << SumColumn[i] << endl;
    }

    system("pause");
    return 0;
    }

    1. Строка “SumColumn[i] += array[j][i];” складывает ещё незаполненные случайными числами ячейки массива.

  3. Я не знаю, актуальна ли ещё тема. последний коммент очень давний. Но меня интересует тот же вопрос, что в предъидущем комменте.
    решение задачи 2 работает только с константой и только с тройкой. С остальными числами суммы неверные. Хотелось бы объяснений, если это возможно. И решение с рандомным вводом и с вводом размера массива с клавиатуры

    1. Задача №2 с рандомным вводом.

      #include
      #include
      #include
      #include

      int main ()
      {
      setlocale(LC_ALL, “rus”);
      srand(time(NULL));

      int N, M, i, j;
      printf (“Введите количество строк двумерного массива: “);
      scanf (“%d”, &N);
      printf (“Введите количество столбцов двумерного массива: “);
      scanf (“%d”, &M);

      int **A = new int *[N];
      for (int count = 0; count < N; count++)
      A[count] = new int [N];

      printf ("\nИсходный двухмерный массив: \n");
      for (i = 0; i < N; i++)
      {
      for (j = 0; j < N; j++)
      {
      A[i][j] = rand()%99+ 1;
      printf ("%4d ", A[i][j]);
      }
      printf ("\n");
      }

      printf ("\nСумма элементов по строкам\n");
      int sumi;
      for (i = 0; i < N; i++)
      {
      sumi = 0;
      for (j = 0; j < N; j++)
      {
      sumi += A[i][j];
      }
      printf ("%d-я строка: %d \n", i, sumi);
      }

      printf ("\nСумма элементов по столбцам\n");
      int sumj;
      for (j = 0; j < N; j++)
      {
      sumj = 0;
      for (i = 0; i < N; i++)
      {
      sumj += A[i][j];
      }
      printf ("%d-й столбец: %d \n", j, sumj);
      }

      for (int count = 0; count < N; count++)
      delete [] A[count];

      return 0;
      }

    2. Задача №2 с вводом значений массива с клавиатуры

      #include
      int const N = 4;

      int main ()
      {
      setlocale(LC_ALL, “rus”);

      int A[N][N];
      int i, j;

      printf (“\nÇàïîëíèòå äâóìåðíûé ìàññèâ %dx%d ÷èñëàìè ïîñòðî÷íî: \n”, N, N);
      for (i = 0; i < N; i++)
      {
      for (j = 0; j < N; j++)
      {
      printf ("A[%d][%d] = ", i, j);
      scanf ("%d", &A[i][j]);
      }
      }

      printf ("\nÈñõîäíûé äâóìåðíûé ìàññèâ: \n");
      for (i = 0; i < N; i++)
      {
      for (j = 0; j < N; j++)
      {
      printf ("%2d", A[i][j]);
      }
      printf ("\n");
      }

      printf ("\nÑóììà ýëåìåíòîâ ïî ñòðîêàì\n");
      int sumi;
      for (i = 0; i < N; i++)
      {
      sumi = 0;
      for (j = 0; j < N; j++)
      {
      sumi += A[i][j];
      }
      printf ("%d-ÿ ñòðîêà: %d \n", i, sumi);
      }

      printf ("\nÑóììà ýëåìåíòîâ ïî ñòîëáöàì\n");
      int sumj;
      for (j = 0; j < N; j++)
      {
      sumj = 0;
      for (i = 0; i < N; i++)
      {
      sumj += A[i][j];
      }
      printf ("%d-é ñòîëáåö: %d \n", j, sumj);
      }

      return 0;
      }

    1. ух, в рандоме сделал описку в циклах по столбцам, подправил
      int main ()
      {
      setlocale(LC_ALL, “rus”);
      srand(time(NULL));

      int N, M, i, j;
      printf (“Введите количество строк двумерного массива: “);
      scanf (“%d”, &N);
      printf (“Введите количество столбцов двумерного массива: “);
      scanf (“%d”, &M);

      int **A = new int *[N];
      for (int count = 0; count < N; count++)
      A[count] = new int [N];

      printf ("\nИсходный двухмерный массив: \n");
      for (i = 0; i < N; i++)
      {
      for (j = 0; j < M; j++)
      {
      A[i][j] = rand()%99+ 1;
      printf ("%4d ", A[i][j]);
      }
      printf ("\n");
      }
      printf ("\nСумма элементов по строкам\n");
      int sumi;
      for (i = 0; i < N; i++)
      {
      sumi = 0;
      for (j = 0; j < M; j++)
      {
      sumi += A[i][j];
      }
      printf ("%d-я строка: %d \n", i, sumi);
      }

      printf ("\nСумма элементов по столбцам\n");
      int sumj;
      for (j = 0; j < N; j++)
      {
      sumj = 0;
      for (i = 0; i < M; i++)
      {
      sumj += A[i][j];
      }
      printf ("%d-й столбец: %d \n", j, sumj);
      }
      for (int count = 0; count < N; count++)
      delete [] A[count];
      return 0;
      }

  4. ПОДСКАЖИТЕ ПОЖАЛУЙСТА почему неправильно и как это исправить
    #include
    #include
    using namespace std;

    int main()
    {
    setlocale(LC_ALL, “rus”);
    int strok=0;
    int stolb=0;

    int mas[strok][stolb]={};
    int strokSUM=0;
    int stolbSUM=0;

    cout <> strok;
    cout <> stolb;
    cout << endl;
    cout << "==== Заполните матрицу " << strok << "x" << stolb << " ==== " << endl;
    cout << endl;

    for (int i=0; i<strok; i++){
    for (int j=0; j<stolb; j++){
    cout << i+1 << "-я строка ";
    cout << j+1 <> mas[strok][stolb];
    }
    cout << endl;
    }

    for (int i = 0; i < strok; i++){
    cout << " | ";
    for (int j = 0; j < stolb; j++){
    cout << setw(4) << mas[i][j] << " ";
    strokSUM[i] += mas[i][j];
    stolbSUM[i] += mas[j][i];
    }
    cout << "|" << endl;
    }
    return 0;
    }

    1. int strok=0;
      int stolb=0;
      1. Строки и колонки должны иметь константное значение.

      const int strok и const int stolb должно быть.

      2. Как ты собираешься создать массив?) у тебя 0 строк и колонок.

  5. cout << "Строка, сумма элементов которой максимальна: " << numMaxRow + 1;
    Почему именно numMaxRow + 1 (то есть + 1)?
    Без +1 некорректно работает, а из +1 нормально. Какую роль здесь играет +1 ?

    1. Корректно работает. В массиве нумерация элементов начинается с 0.

      Т.е. то, что мы считаем первой строкой в массиве имеет индекс 0. И для лучшего восприятия мы добавляем +1. Т.е. на выходе строка с индексом 0 будет под номером 1 при отображении в консоли.

      Вроде правильно и понятно объяснил))

  6. #include
    using namespace std;
    int main() {
    int arr[100][100];
    int n, m, max = 0, sti, stj;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
    for (int j = 0; j > arr[i][j];
    }
    }
    for (int i = 0; i < n; i++) {
    for (int j = 0; j max) {
    max = arr[i][j];
    }
    sti = i + 1;
    stj = j + 1;
    }
    }
    cout << "Max = " << max << endl << sti << " " << stj;

    }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *