Cc++ — Помогите с созданием двумерного массива CC++


Двумерные массивы

С позволяет создавать многомерные массивы. Простейшим видом многомерного массива является двумерный массив. Двумерный массив — это массив одномерных массивов. Двумерный массив объявляется следующим образом:

тип имя_массива[размер второго измерения][размер первого измерения];

Следовательно, для объявления двумерного массива целых с размером 10 на 20 следует написать:

Посмотрим внимательно на это объявление. В противоположность другим компьютерным языкам, где размерности массива отделяются запятой, С помещает каждую размерность в отдельные скобки.

Для доступа к элементу с индексами 3, 5 массива d следует использовать

В следующем примере в двумерный массив заносятся числа от 1 до 12, после чего массив выводится на экран.

#include
int main(void)
<
int t,i, num[3][4];
/* загрузка чисел */
for(t=0; t
#include
#include
#include
#define CLASSES 3
#define GRADES 30
int grade[CLASSES][GRADES];
void disp_grades(int g[] [GRADES]), enter_grades(void);
int get_grade(int num);
int main(void) /* программа для хранения оценок */
<
char ch;
for (;;) <
do <
printf(«(E)nter grades\n»);
printf(«(R)eport grades\n»);
printf(«(Q) uit\n»);
ch = toupper(getche());
>
while(ch!=’E’ && ch!=’R’ && ch!=’Q’);
switch(ch)
<
case ‘E’:
enter_grades();
break;
case ‘R’:
disp_grades(grade);
break;
case ‘Q’:
return 0;
>
>
>

C/c++ — Помогите с созданием двумерного массива C/C++

Объявление int A[n] создает в памяти одномерный массив: набор пронумерованных элементов, идущих в памяти последовательно. Но можно создать и массив массивов следующим образом: int A[n][m] . Данное объявление создает массив из n объектов, каждый из которых в свою очередь является массивом типа int [m] . Тогда A[i] , где i принимает значения от 0 до n-1 будет в свою очередь одним из n созданных обычных массивов, и обратиться к элементу с номером j в этом массиве можно через A[i][j] .

Подобные объекты (массивы массивов) также называют двумерными массивами. Двумерные массивы можно представлять в виде квадратной таблицы, в которой первый индекс элемента означает номер строки, а второй индекс – номер столбца. Например, массив A[3][4] будет состоять из 12 элементов и его можно записать в виде

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

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

Обработка одномерного массива

Обработка массивов производится аналогичным образом. Например, если мы хотим записать в массив таблицу умножения, то есть присвоить элементу A[i][j] значение i*j , это можно сделать следующим образом:

Рассмотрим более сложную задачу и несколько способов ее решения. Пусть дан квадратный двумерный массив int A[n][n] . Необходимо элементам, находящимся на главной диагонали проходящей из левого верхнего угла в правый нижний (то есть тем элементам A[i][j] , для которых i==j ) присвоить значение 1 , элементам, находящимся выше главной диагонали – значение 0, элементам, нахощящимся ниже главной диагонали – значение 2. То есть получить такой массив (пример для n==4 ):

Рассмотрим несколько способов решения этой задачи. Элементы, которые лежат выше главной диагонали – это элементы A[i][j] , для которых i , а для элементов ниже главной диагонали i>j . Таким образом, мы можем сравнивать значения i и j и по ним определять значение A[i][j] . Получаем следующий алгоритм:

Данный алгоритм плох, поскольку выполняет одну или две инструкции if для обработки каждого элемента. Если мы усложним алгоритм, то мы сможем обойтись вообще без условных инструкций.

Сначала заполним главную диагональ, для чего нам понадобится один цикл:

Затем заполним значением 0 все элементы выше главной диагонали, для чего нам понадобится в каждой из строк с номером i присвоить значение элементам A[i][j] для j = i+1 , . n-1 . Здесь нам понадобятся вложенные циклы:

Аналогично присваиваем значение 2 элементам A[i][j] для j = 0 , . i-1 :

Можно также внешние циклы объединить в один и получить еще одно, более компактное решение:

Многомерные массивы

Можно объявлять не только двумерные массивы, но и массивы с большим количеством измерений. Например, объявление int A[n][m][l] создает трехмерный массив из n*m*l элементов. Для обращения к каждому элементу такого массива необходимо указать три индекса: A[i][j][k] , при этом 0 , i , 0 , j , 0 , k . Количество измерений в массиве может быть практически бесконечным (т.е. достаточным для решения любых практических задач).

Форматирование чисел при выводе

Допустим, мы заполним массив таблицей умножения: A[i][j]=i*j как в примере в начале раздела. Если мы теперь попробуем вывести этот массив на экран, разделяя элементы в строке одним пробелом, то из-за того, что числа имеют различную длину столбцы таблицы окажутся неровными:

Для того, чтобы получить ровные столбцы необходимо, выводить числа так, чтобы одно выводимое число имело ширину, например, ровно в 3 символа, а «лишние» позиции были бы заполнены пробелами. Тогда получится следующая таблица:

Для того, чтобы выводимое число или строка имело ровно заданную ширину, необходимо перед выводом его на экран для потока cout вызвать метод width с параметром 3 . Данный метод устанавливает ширину поля для выводимого значения. Получим следующую программу для вывода:

Заметим, что мы теперь не выводим пробел после каждого числа, поскольку мы добавили этот пробел к ширине выводимого поля. Функция width действует однократно, только на следующее выводимый в поток значение, поэтому ее нужно вызывать перед каждым выводом числа на экран.


Внимание! Если выводимое число или строка имеет большую длину, чем это было установлено функцией width , то это число или строка будут выведены полностью, а не будет обрезано до указанного значения. То есть предпочтительней вывести результат некрасиво, нежели неверно.

Упражнения

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

    Дано число n . Создайте массив int A[n][n] , и заполните его по следующему правилу:

Числа на диагонали, идущей из правого верхнего в левый нижний угол равны 1.

Числа, стоящие выше этой диагонали, равны 0.

Числа, стоящие ниже этой диагонали, равны 2.

Полученный массив выведите на экран. Числа разделяйте одним пробелом. Пример
Дано число n и квадратный массив int A[n][n] . Проверьте, является ли массив симметричным относительно главной диагонали. Программа должна выводить слово yes для симметричного массива и слово no для несимметричного. Пример

Указание. Для элемента A[i][j] симметричным ему является элемент A[j][i] .
Состязания-1. В метании молота состязается n спортcменов. Каждый из них сделал m бросков. Победителем считается тот спортсмен, у которого сумма результатов по всем броскам максимальна.

Если перенумеровать спортсменов числами от 0 до n-1 , а попытки каждого из них – от 0 до m-1 , то на вход программа получает массив int A[n][m] , состоящий из неотрицательных чисел. Программа должна определить максимальную сумму чисел в одной строке и вывести на экран эту сумму и номер строки, для которой достигается эта сумма. Если таких строк несколько, то выводится номер наименьшей из них. Пример для n=4 спортсменов и m=3 попыток:

Цукерберг рекомендует:  Java - Кнопка с фиксированным размером

Не забудьте, что нумерация строк (спортсменов) начинается с 0.
Состязания — 2. Победителем соревнований объявляется тот спортсмен, у которого максимален наилучший результат по всем броскам. Таким образом, программа должна найти значение максимального элемента в данном массиве, а также его индексы (то есть номер спортсмена и номер попытки). Программа выводит значение максимального элемента, затем номер строки и номер столбца, в котором он встречается. Пример

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

  • Состязания — 3. Будем считать, что побеждает спортсмен, у которого максимален наилучший бросок. Если таких несколько, то из них побеждает тот, у которого наилучшая сумма результатов по всем попыткам. Если и таких несколько, победителем считается спортсмен с минимальным номеров. Определите номер победителя соревнований.
  • Состязания — 4. Будем считать, что победитель определяется по лучшему результату. Определите количество участников состязаний, которые разделили первое место, то есть определите количество строк в массиве, которые содержат значение, равное наибольшему.
  • Состязания — 5. Решите предыдущую задачу, но на экран выведите еще и номера спортсменов, разделивших первое место. Сначала программа выводит количество спортсменов, показавших наилучший результат, затем – их номера в порядке возрастания.
  • Даны два числа n и m . Создайте двумерный массив int A[n][m] , заполните его таблицей умножения A[i][j]=i*j и выведите на экран. При этом нельзя использовать вложенные циклы, все заполнение массива должно производиться одним циклом, например, for(i=0;i .
  • Даны два числа n и m . Создайте двумерный массив int C[n][m] и заполните его по следующим правилам:

    Числа, стоящие в строке 0 или в столбце 0 равны 1 ( A[0][j]=1 , A[i][0]=1 ). Для всех остальных элементов массива A[i][j]=A[i-1][j]+A[i][j-1] , то есть каждый элемент равен сумме двух элементов, стоящих слева и сверху от него. Выведите данный массив на экран, отводя на вывод каждого числа ровно 6 символов.

    Что получилось в результате?
    Даны числа n и m . Создайте массив int A[n][m] и заполните его следующей змейкой (ниже приведен пример для n=4 и m=6 ):

    Выведите массив на экран, отводя на вывод каждого числа ровно 3 символа.
    Даны числа n и m . Создайте массив int A[n][m] и заполните его следующим образом (ниже приведен пример для n=4 и m=6 ):

    Выведите массив на экран, отводя на вывод каждого числа ровно 3 символа.

  • Дано число n . Создайте массив int A[2*n+1][2*n+1] и заполните его по спирали начиная с числа 0 в центральной клетке A[n][n] . Спираль выходит вверх, далее закручивается против часовой стрелки. Выведите массив на экран, отводя на вывод каждого числа ровно 3 символа. Ниже приведен пример для n=2 :
  • C/c++ — Помогите с созданием двумерного массива C/C++


    Двумерный массив – это одномерный массив из одномерных массивов.
    Для примера определим двумерный массив m размером 3 x 4.

    int m [3] [4] ;

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

    Начнем с того, что сначала объявим промежуточный тип M – одномерный массив из 4-х целых чисел

    typedef int M [4];

    Теперь определение M x; означает тоже самое, что int x[4];, каким бы ни было выражение x.

    Определим одномерный массив из элементов типа M, т.е. массив символов.

    В роли x здесь выступает выражение m[3]. Подставим его в int x[4]; и получим объявление двумерного массива без промежуточного типа M, как это обычно и делается.

    Исходя из общего принципа размещения элементов массива в памяти (плотно и в порядке возрастания номеров), можно утверждать, что элементы двумерного массива m[3][4] займут места в памяти в следующем порядке: m[0][0], m[0][0], m[0][1], m[0][2], m[0][3], m[1][0], m[1][1], m[1][2], m[1][3], m[2][0], m[2][1], m[2]2], m[2][3].

    Пример. Ввести матрицу M размера 3 x 3. Поменять местами начальную и последнюю строки и вывести результат на экран.

    // объявить, определить и инициализировать массив
    int M [3] [3] = <<11,12,13>, <21,22,23>, <31,32,33>>;
    // поменять местами строки
    for (int j = 0; j Автор: Дмитрий на 09:25

    Создание двумерного массива C++

    создаю, заполняю и вывожу двумерные массивы. Но почему-то числа в первой строке и в первом столбце одинаковые.

    1 ответ 1

    У вас неправильно делается индексация двумерного массива, замените строчку:

    В общем случае, если вы создаёте двумерный массив mas[m*n] , то правильное обращение к ячейке с номерами i, j будет выглядеть как:

    Вы сначала отсчитываете нужную строку (сдвигаетесь i раз на n ), затем в найденной строке отсчитываете нужный по счёту элемент.

    Функции и динамические двумерные массивы

    Здравствуйте, любители C++, как я вам и обещал, сегодня мы с вами разберем динамические массивы и напишем свои собственные функции. За основу мы возьмем задание из статьи №3, где мы работали с двумерным массивом размерностью 8×8.

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

    Начнем:
    Ну во первых я должен вас поздравить: мы переходим к функциональному программированию, и это уже можно считать достижением.

    Для начала нам следует подключить стандартные библиотеки, пространство имен, и, самое главное, объявить наши функции.
    Объявляют функцию в C++ следующим образом:

    1) Тип возвращаемых данных
    То есть если написать в самом начале int, то это значит что функция вернет какое то целочисленное значение, как видите, функция sozdanie возвращает динамический двумерный массив целых чисел(да именно так он обозначается int**), если же написать в начале объявления тип void(как во всех остальных функциях), то это означает, что функция ничего не возвращает(но не путайте, она все же что то делает с нашими данными).

    2) Имя функции
    Здесь все просто: мы просто придумываем имя нашим функциям(желательно, чтобы имя отражало суть функции).

    3) Список параметров
    Чтобы наши функции что то делали, им нужно передать какие то данные. Например функция sozdanie, она принимает 2 параметра: число строк n и число столбцов m, и на основе этих данных создает двумерный массив.

    Только не путайте: мы пока что только объявили эти функции, после этого нам следует описать их, то есть написать, что каждая из них делает.

    Таким образом описываются функции в C++, следует отметить, что описывать их можно как до main, так и после него.
    Разберем функцию создания динамического массива:

    Для начала нам следует создать одномерный массив указателей, затем в цикле в каждый указатель мы записываем еще одномерный массив, таким образом у нас выходит массив массивов, или, двумерный массив в котором n строк и m столбцов.

    Так как мы работаем с динамическим массивом, то следует выделять память под него, это делается с помощью ключевого слова new.


    Вторая функция, как и в статье №3, заполняет массив рандомными числами и выводит на экран. Заметьте, что в качестве параметра этой функции передается и сам массив.

    Здесь подробно останавливаться не будем, так как рабочие моменты уже были пояснены в той самой насущной статье №3, поэтому сразу перейдем к main:

    Создаем переменные строки и столбцы, далее просим пользователя ввести вручную значения для этих переменных(именно поэтому массив называется динамическим). После, вызываем наши функции: вызов осуществляется как имя функции + параметры в ()

    Цукерберг рекомендует:  Jsp - REST and JSP

    И не лишним было бы освободить память по окончанию работы с динамическим массивом в C++

    На этом сегодня все. Пишите свои комментарии, ваше мнение очень важно для нас!

    Двумерные массивы C++

    Никак не могу понять тему двумерные массивы, а именно их инициализацию с помощью циклов. Может кто объяснить?

    На грядках посажена капуста и морковь. Грядки расположены рядом и образуют квадратичную матрицу 12х12. Необходимо заполнить двумерный массив gard, следующим образом: чётным элементам каждой строки присвоить значение 1 — капуста, нечетным элементам присвоить 0 — морковь.

    Застряли? Воспользуйтесь подсказкой!

    Для заполнения массива gard используйте два цикла for. Внутри второго цикла напишите условие, для определения четных и не четных элементов, используя оператор if else.

    BestProg

    Массивы. Часть 2. Двумерные массивы. Массивы строк. Многомерные массивы

    Данная тема есть продолжением темы «Понятие массива. Одномерные массивы» .

    Содержание

    1. Двумерные массивы. Примеры описания и использования

    В языке C++ существует возможность использовать двумерные и многомерные массивы. Двумерный массив – это список одномерных массивов.

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

    Пример 1. Описание двумерного массива Matr целых чисел размером 3×4.

    Доступ к элементам массива (рисунок 1):

    Рисунок 1. Доступ к элементам матрицы Matr

    Чтобы обнулить двумерный массив Matr нужно написать следующий код:

    Пример 2. Описание двумерной матрицы Matrix вещественных чисел размером 10×10.

    Доступ к элементам матрицы:

    Пример обнуления матрицы Matrix :

    2. Инициализация двумерных массивов. Пример

    Инициализация двумерных и многомерных массивов подобна инициализации одномерных массивов . В этом случае список инициализаторов любой размерности берется в фигурные скобки.

    Инициализация двумерных (многомерных) массивов может быть:

    • с указанием размера массива;
    • без указания размера массива («безразмерная» инициализация).


    Пример 1. Инициализация двумерного массива M вещественных чисел размером 3×4. Устанавливается размер массива.

    Если в перечне указать не все элементы группы, тогда недостающие элементы будут дополняться нулевыми значениями автоматически (рисунок 2).

    Рисунок 2. Дополнение массива нулями

    Пример 2. «Безразмерная» инициализация массива B целых чисел.

    Пример 3. «Безразмерная инициализация массива B с дополнением нулями (рисунок 3).

    Рисунок 3. «Безразмерная» инициализация массива B с заполнением нулями

    Второй индекс массива (столбец) обязательно должен быть указан. В противном случае компилятор выдает сообщение об ошибке.

    3. Инициализация массивов строк. Примеры

    Массив строк также есть двумерный массив символов.

    Равно как и с другими типами данных, инициализация массива строк может быть:

    • с указанием размера строки;
    • без указания размера строки («безразмерная» инициализация).

    Пример 1. Инициализация массива строк с указанием длины строки. Описывается двумерный массив строк размером 5×60 символов.

    В вышеприведенном примере каждая строка может содержать до 60 символов. Если длина строки меньше, чем 60, то значение других символов равно 0 (рисунок 4).

    Рисунок 4. Представление двумерного массива строк в памяти компьютера

    Пример 2. «Безразмерная» инициализация массива строк

    Вышеприведенный код можно записать по другому

    При «безразмерной» инициализации массива строк не нужно «вручную» подсчитывать длину (количество символов) строки. Это осуществляется автоматически на этапе компиляции.

    В вышеприведенном примере длина первой строки равна 16 символов (рисунок 5). Длина второй строки равна 10. Длина третьей строки равна 12 символов. В конце каждой строки следует нулевой символ ‘\0’ .

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

    Рисунок 5. Представление строки при «безразмерной» инициализации

    Двумерные массивы в C++

    Помимо одномерных массивов вам может понадобиться для работы использование многомерного массива (двумерного, трёхмерного…). В этом уроке будут рассмотрены двумерные массивы. Они самые распространенные, а остальные встречаются крайне редко.

    Мы уже рассматривали в предыдущих статьях одномерные массивы и Си-строки (символьные массивы).Там говорилось, что элементы массива размещаются в памяти последовательно – элемент за элементом. Визуально их можно представить в виде одной строки данных в памяти. Чтобы обратиться к какому-либо элементу такого массива, достаточно указать его имя и индекс элемента. Первое отличие двумерного массива от одномерного – его элементы содержат два индекса: int arr [ 3 ] [ 4 ] ; Данные такого массива можно представить, как таблицу: 3 х 4.

    Первый за именем массива индекс – это индекс строки, второй – индекс столбца.

    Когда вы уже посмотрели на эти рисунки, можно сказать о двумерном массиве так – это массив, в котором каждый элемент также является массивом. int arr [ 3 ] [ 4 ] ; – это массив из 3-х элементов, каждый из которых это массив из 4-х элементов.

    Данные двумерного массива также располагаются в памяти последовательно, но построчно. Сначала строка с индексом 0 – ячейки от 0-й до 3-й, далее строка с индексом 1 – ячейки от 0-й до 3-й …

    Что могут хранить элементы двумерных массивов? Например, можно хранить номера парковочных мест в многоэтажном паркинге (6 этажей и на каждом 15 мест для парковки). Для этого надо объявить двумерный массив int floorsAndParkings [ 6 ] [ 15 ] ; и записать в его ячейки номера мест на каждом этаже. Двумерный массив может хранить Си-строки. Например: char someStr [ 3 ] [ 256 ] ; Так мы объявили массив, который будет хранить 3 строки по 256 символов каждая.


    Инициализация двумерного массива.

    Записать данные в двумерный массив можно при его объявлении. Рассмотрим на примере с местами парковки. Допустим в паркинге 2 этажа по 4 места парковки на каждом. Объявим массив и инициализируем его:

    int floorsAndParkings [ 2 ] [ 4 ] = < < 1 , 2 , 3 , 4 >, < 1 , 2 , 3 , 4 >> ;

    Чтобы такая инициализация выглядела более читабельно, оформим её так:

    С++ создание двумерного массива на основе длины строки ввода пользователя

    У меня есть задание создать программу шифрования транспонирования блока. Пользователь должен ввести фразу по своему выбору, и программа должна разделить фразу пробелов, пунктуацию и сделать строчную букву, прежде чем читать ее длину и создать двумерный массив размером ближайшего квадрата, который будет соответствовать всем символы в мутированной строке и заполнение оставшегося пространства случайными буквами.

    Проблема в том, что у меня возникают проблемы с созданием этого квадрата.

    У меня это до сих пор:

    (Я уже сделал часть мутации, протестировал с помощью альтернативного кода)

    C/c++ — Помогите с созданием двумерного массива C/C++

    Объявление int A[n] создает в памяти одномерный массив: набор пронумерованных элементов, идущих в памяти последовательно. Но можно создать и массив массивов следующим образом: int A[n][m] . Данное объявление создает массив из n объектов, каждый из которых в свою очередь является массивом типа int [m] . Тогда A[i] , где i принимает значения от 0 до n-1 будет в свою очередь одним из n созданных обычных массивов, и обратиться к элементу с номером j в этом массиве можно через A[i][j] .

    Подобные объекты (массивы массивов) также называют двумерными массивами. Двумерные массивы можно представлять в виде квадратной таблицы, в которой первый индекс элемента означает номер строки, а второй индекс – номер столбца. Например, массив A[3][4] будет состоять из 12 элементов и его можно записать в виде

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

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

    Обработка одномерного массива

    Обработка массивов производится аналогичным образом. Например, если мы хотим записать в массив таблицу умножения, то есть присвоить элементу A[i][j] значение i*j , это можно сделать следующим образом:

    Цукерберг рекомендует:  Gcc - Си Крашится на операторе return! И GCC на Linux лучше

    Рассмотрим более сложную задачу и несколько способов ее решения. Пусть дан квадратный двумерный массив int A[n][n] . Необходимо элементам, находящимся на главной диагонали проходящей из левого верхнего угла в правый нижний (то есть тем элементам A[i][j] , для которых i==j ) присвоить значение 1 , элементам, находящимся выше главной диагонали – значение 0, элементам, нахощящимся ниже главной диагонали – значение 2. То есть получить такой массив (пример для n==4 ):

    Рассмотрим несколько способов решения этой задачи. Элементы, которые лежат выше главной диагонали – это элементы A[i][j] , для которых i , а для элементов ниже главной диагонали i>j . Таким образом, мы можем сравнивать значения i и j и по ним определять значение A[i][j] . Получаем следующий алгоритм:

    Данный алгоритм плох, поскольку выполняет одну или две инструкции if для обработки каждого элемента. Если мы усложним алгоритм, то мы сможем обойтись вообще без условных инструкций.

    Сначала заполним главную диагональ, для чего нам понадобится один цикл:

    Затем заполним значением 0 все элементы выше главной диагонали, для чего нам понадобится в каждой из строк с номером i присвоить значение элементам A[i][j] для j = i+1 , . n-1 . Здесь нам понадобятся вложенные циклы:

    Аналогично присваиваем значение 2 элементам A[i][j] для j = 0 , . i-1 :

    Можно также внешние циклы объединить в один и получить еще одно, более компактное решение:

    Многомерные массивы

    Можно объявлять не только двумерные массивы, но и массивы с большим количеством измерений. Например, объявление int A[n][m][l] создает трехмерный массив из n*m*l элементов. Для обращения к каждому элементу такого массива необходимо указать три индекса: A[i][j][k] , при этом 0 , i , 0 , j , 0 , k . Количество измерений в массиве может быть практически бесконечным (т.е. достаточным для решения любых практических задач).

    Форматирование чисел при выводе

    Допустим, мы заполним массив таблицей умножения: A[i][j]=i*j как в примере в начале раздела. Если мы теперь попробуем вывести этот массив на экран, разделяя элементы в строке одним пробелом, то из-за того, что числа имеют различную длину столбцы таблицы окажутся неровными:

    Для того, чтобы получить ровные столбцы необходимо, выводить числа так, чтобы одно выводимое число имело ширину, например, ровно в 3 символа, а «лишние» позиции были бы заполнены пробелами. Тогда получится следующая таблица:

    Для того, чтобы выводимое число или строка имело ровно заданную ширину, необходимо перед выводом его на экран для потока cout вызвать метод width с параметром 3 . Данный метод устанавливает ширину поля для выводимого значения. Получим следующую программу для вывода:


    Заметим, что мы теперь не выводим пробел после каждого числа, поскольку мы добавили этот пробел к ширине выводимого поля. Функция width действует однократно, только на следующее выводимый в поток значение, поэтому ее нужно вызывать перед каждым выводом числа на экран.

    Внимание! Если выводимое число или строка имеет большую длину, чем это было установлено функцией width , то это число или строка будут выведены полностью, а не будет обрезано до указанного значения. То есть предпочтительней вывести результат некрасиво, нежели неверно.

    Упражнения

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

      Дано число n . Создайте массив int A[n][n] , и заполните его по следующему правилу:

    Числа на диагонали, идущей из правого верхнего в левый нижний угол равны 1.

    Числа, стоящие выше этой диагонали, равны 0.

    Числа, стоящие ниже этой диагонали, равны 2.

    Полученный массив выведите на экран. Числа разделяйте одним пробелом. Пример
    Дано число n и квадратный массив int A[n][n] . Проверьте, является ли массив симметричным относительно главной диагонали. Программа должна выводить слово yes для симметричного массива и слово no для несимметричного. Пример

    Указание. Для элемента A[i][j] симметричным ему является элемент A[j][i] .
    Состязания-1. В метании молота состязается n спортcменов. Каждый из них сделал m бросков. Победителем считается тот спортсмен, у которого сумма результатов по всем броскам максимальна.

    Если перенумеровать спортсменов числами от 0 до n-1 , а попытки каждого из них – от 0 до m-1 , то на вход программа получает массив int A[n][m] , состоящий из неотрицательных чисел. Программа должна определить максимальную сумму чисел в одной строке и вывести на экран эту сумму и номер строки, для которой достигается эта сумма. Если таких строк несколько, то выводится номер наименьшей из них. Пример для n=4 спортсменов и m=3 попыток:

    Не забудьте, что нумерация строк (спортсменов) начинается с 0.
    Состязания — 2. Победителем соревнований объявляется тот спортсмен, у которого максимален наилучший результат по всем броскам. Таким образом, программа должна найти значение максимального элемента в данном массиве, а также его индексы (то есть номер спортсмена и номер попытки). Программа выводит значение максимального элемента, затем номер строки и номер столбца, в котором он встречается. Пример

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

  • Состязания — 3. Будем считать, что побеждает спортсмен, у которого максимален наилучший бросок. Если таких несколько, то из них побеждает тот, у которого наилучшая сумма результатов по всем попыткам. Если и таких несколько, победителем считается спортсмен с минимальным номеров. Определите номер победителя соревнований.
  • Состязания — 4. Будем считать, что победитель определяется по лучшему результату. Определите количество участников состязаний, которые разделили первое место, то есть определите количество строк в массиве, которые содержат значение, равное наибольшему.
  • Состязания — 5. Решите предыдущую задачу, но на экран выведите еще и номера спортсменов, разделивших первое место. Сначала программа выводит количество спортсменов, показавших наилучший результат, затем – их номера в порядке возрастания.
  • Даны два числа n и m . Создайте двумерный массив int A[n][m] , заполните его таблицей умножения A[i][j]=i*j и выведите на экран. При этом нельзя использовать вложенные циклы, все заполнение массива должно производиться одним циклом, например, for(i=0;i .
  • Даны два числа n и m . Создайте двумерный массив int C[n][m] и заполните его по следующим правилам:

    Числа, стоящие в строке 0 или в столбце 0 равны 1 ( A[0][j]=1 , A[i][0]=1 ). Для всех остальных элементов массива A[i][j]=A[i-1][j]+A[i][j-1] , то есть каждый элемент равен сумме двух элементов, стоящих слева и сверху от него. Выведите данный массив на экран, отводя на вывод каждого числа ровно 6 символов.

    Что получилось в результате?
    Даны числа n и m . Создайте массив int A[n][m] и заполните его следующей змейкой (ниже приведен пример для n=4 и m=6 ):

    Выведите массив на экран, отводя на вывод каждого числа ровно 3 символа.
    Даны числа n и m . Создайте массив int A[n][m] и заполните его следующим образом (ниже приведен пример для n=4 и m=6 ):

    Выведите массив на экран, отводя на вывод каждого числа ровно 3 символа.

  • Дано число n . Создайте массив int A[2*n+1][2*n+1] и заполните его по спирали начиная с числа 0 в центральной клетке A[n][n] . Спираль выходит вверх, далее закручивается против часовой стрелки. Выведите массив на экран, отводя на вывод каждого числа ровно 3 символа. Ниже приведен пример для n=2 :
  • Понравилась статья? Поделиться с друзьями:
    Все языки программирования для начинающих