Alfo 0 / 0 / 0 Регистрация: 24.02.2019 Сообщений: 6 |
||||
1 |
||||
Как найти последний элемент в двумерном массиве и поменять его с наибольшим03.03.2019, 14:38. Показов 3339. Ответов 4 Метки нет (Все метки)
Я вот написал программу но не знаю как найти последний элемент массива и поменять его с наибольшим
0 |
FFPowerMan 2018 / 1122 / 475 Регистрация: 11.10.2018 Сообщений: 5,724 |
||||||||||||
03.03.2019, 15:08 |
2 |
|||||||||||
А что
и new как-то связаны? Добавлено через 11 минут
– а зачем так обращаться? Можно просто:
0 |
7427 / 5021 / 2891 Регистрация: 18.12.2017 Сообщений: 15,694 |
|
04.03.2019, 04:39 |
3 |
Alfo, наибольших может быть несколько. все менять ? напишите оригинал условия задачи.
0 |
0 / 0 / 0 Регистрация: 24.02.2019 Сообщений: 6 |
|
05.03.2019, 16:35 [ТС] |
4 |
Задан двухмерный массив целых чисел A размером N на M. Найти максимальный элемент и поменять его с последним.(Использовать только указатели ,без [ ])
0 |
Yetty 7427 / 5021 / 2891 Регистрация: 18.12.2017 Сообщений: 15,694 |
||||
05.03.2019, 17:14 |
5 |
|||
Сообщение было отмечено Alfo как решение РешениеAlfo, такой код поменяет местами первый встреченный max с последним элементом:
как правильно освободить память через указатели точно не подскажу, оставил обычный вариант. если кто в курсе, напишите.
1 |
Как найти последний вложенный элемент двумерного массива?
<?php
$arr = array(
"foo" => "bar",
"bar" => "foo",
"name" => array(1,2,333), // получить 333
100 => -100
);
cheops
19.4k29 золотых знаков46 серебряных знаков139 бронзовых знаков
задан 17 июл 2016 в 19:43
8
Можно поступить следующим образом
<?php
$arr = array(
"foo" => "bar",
"bar" => "foo",
"name" => array(1,2,333),
100 => -100
);
foreach($arr as $el) {
if(is_array($el)) {
echo end($el);
break;
}
}
ответ дан 17 июл 2016 в 20:01
cheopscheops
19.4k29 золотых знаков46 серебряных знаков139 бронзовых знаков
4
Обработка двумерных массивов позволяет получить какие-то результаты путем анализа данных в массиве. Сам массив при этом не изменяется. Задачи поиска элементов, удовлетворяющих условию, подсчета суммы, поиска максимального и др. во многом решаются аналогично тому, как это происходило для линейных массивов.
Пример 15.8. Задан двумерный массив d из m строк и n столбцов. Посчитать сумму тех элементов массива, у которых сумма квадратов номера строки и номера столбца равна заданному числу x.
Этапы выполнения задания
I. Исходные данные: переменные m и n (количество строк и столбцов в массиве), d — двумерный массив, x (число).
II. Результат: переменная s (сумма искомых элементов).
III. Алгоритм решения задачи.
1. Ввод исходных данных. Массив вводится поэлементно.
2. Определение начального значения для суммы (s = 0).
3. Проверяем текущий элемент. Если он удовлетворяет условию, то добавляем его к сумме.
4. Вывод результата.
IV. Описание переменных: n, x, s – int, d – vector<vector <int>>
Пример 15.9. Задан двумерный массив d из m сток и n столбцов. Определить, есть ли в массиве хотя бы один элемент, кратный x. Если да, то вывести индексы его местоположения.
Этапы выполнения задания
I. Исходные данные: переменные m и n (количество строк и столбцов в массиве), d — двумерный массив, x (число).
II. Результат: переменные r, c (номера строки и столбца, в которых найден элемент) или сообщение «не найден».
III. Алгоритм решения задачи.
1. Ввод исходных данных. Массив заполняется случайными числами.
2. Определение начального значения для искомых индексов (r = -1, c = -1).
3. Проверка текущего элемента. Если он удовлетворяет условию, то меняем значения r и c.
4. Вывод результата. Если переменные r и c не изменились, то выводим сообщение, что элемент не найден, иначе выводим их значения.
IV. Описание переменных: n, x, r, c – int, d – vector<vector <int>>
Если в массиве несколько элементов, удовлетворяющих условию задачи, то будет выведен последний найденный элемент. Если нужен первый элемент, то можно ввести дополнительную переменную-флаг, которая будет равна true, пока значения r и c не изменились. После их изменения она станет false и значения r и c больше меняться не будут (пример 15.10).
Пример 15.11. Задан двумерный массив d из m строк и n столбцов. Найти минимальный и максимальный элементы и вывести индексы их местоположения.
Этапы выполнения задания
I. Исходные данные: переменные m и n — количество строк и столбцов в массиве, d — двумерный массив, x — число.
II. Результат: переменные r_min, c_min, r_max, c_max — номера строки и столбца, в которых найден элемент.
III. Алгоритм решения задачи.
1. Ввод исходных данных. Массив заполняется случайными числами.
2. Определение начального значения для искомых индексов (r_min = 0, c_min = 0, r_max = 0, c_max = 0).
3. Проверяем текущий элемент. Если он больше текущего максимального, то меняем значения r_max, c_max.
4. Проверяем текущий элемент. Если он меньше текущего минимального, то меняем значения r_min, c_min.
5. Вывод результата.
IV. Описание переменных: n, m, n_min, c_min, r_max, c_max – int, d – vector<vector <int>>
Если в массиве несколько элементов, равных максимальному (минимальному), то будет выводиться местоположение первого из таких элементов. Если нужно получить местоположение последнего, то достаточно заменить знак «>» («<») на «>=» («<=»).
Пример 15.8.
V. Программа:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int m, n;
cout << “kol-vo strok m=”;
cin >> m;
cout << “kol-vo stolbcov n=”;
cin >> n;
cout << “elementy” << endl;
vector <vector <int>> d(m, vector <int> (n));
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> d[i][j];
int x;
cout << “x = “;
cin >> x;
int s = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (i * i + j * j == x)
s += d[i][j];
cout << “summa = “ << s << endl;
return 0;
}
VI. Тестирование.
VII. Анализ результатов. Будут просуммированы элементы, имеющие номера [1][2] и [2][1] (они выделены).
В математике для матрицы определены понятия главная диагональ и побочная диагональ. На главной диагонали находятся элементы матрицы d[i][j], для которых верно условие i = j. Для элементов побочной диагонали: i + j = n – 1 (n — число столбцов, нумерация с 0).
Пример 15.9.
V. Программа:
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdio>
using namespace std;
int main()
{
srand(time(NULL));
int m, n;
cout << “kol-vo strok m=”;
cin >> m;
cout << “kol-vo stolbcov n=”;
cin >> n;
cout << “elementy” << endl;
vector <vector <int>> d(m, vector <int> (n));
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
d[i][j] = rand() % 100;
cout << d[i][j] << ” “;
}
cout << endl;
}
int x;
cout << “x = “;
cin >> x;
int r = –1, c = –1;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (d[i][j] % x == 0){
r = i;
c = j;
}
if (r == –1 && c == –1)
cout << “ne naiden”;
else {
cout << d[r][c];
cout << ” naiden na meste “;
cout << r << ” “ << c;
}
cout << endl;
return 0;
}
VI. Тестирование.
Пример 15.10. Фрагмент программы:
bool f = true;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (f && d[i][j] % x == 0){
r = i;
c = j;
f = false;
}
Пример 15.11.
V. Программа:
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdio>
using namespace std;
int main()
{
srand(time(NULL));
int m, n;
cout << “kol-vo strok m=”;
cin >> m;
cout << “kol-vo stolbcov n=”;
cin >> n;
cout << “elementy” << endl;
vector <vector <int>> d(m, vector <int> (n));
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
d[i][j] = rand() % 100;
cout << d[i][j] << ” “;
}
cout << endl;
}
int r_min = 0, c_min = 0;
int r_max = 0, c_max = 0;
for (int i = 0; i < m; i++){
for (int j = 0; j < n; j++){
if (d[i][j] > d[r_max][c_max]){
r_max = i;
c_max = j;
}
if (d[i][j] < d[r_min][c_min]){
r_min = i;
c_min = j;
}
}
cout << “max = “ << d[r_max][c_max];
cout << ” naiden na meste “;
cout << r_max << ” “ << c_max;
cout << endl;
cout << “min = “ << d[r_min][c_min];
cout << ” naiden na meste “;
cout << r_min << ” “ << c_min;
cout << endl;
return 0;
}
VI. Тестирование.
Формулировка задачи:
Есть обычный двумерный массив.
1 2 3
4 5 6
7 8 9
в переменную n нужно сохранить последний элемент массива (“9”)
как это реализовать?
Console.WriteLine("Введите размерность матрицы"); n = Convert.ToInt16(Console.ReadLine()); m = Convert.ToInt16(Console.ReadLine()); int[,] mat = new int[n, m]; Random r = new Random(); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { mat[i, j] = r.Next(1, 10); first = mat[0, j];
Код к задаче: «Как в переменную сохранить последний элемент двумерного массива?»
textual
int last = mat[n-1,m-1]; //получаем последний элемент массива //после преобразований mat[n-1;m-1] = last;
Полезно ли:
11 голосов , оценка 4.000 из 5
Добрый день друзья.
Сегодня затронем новую тему. Двумерные массивы. Или их еще
называют матрицы.
Прочитайте улучшенную версию этого урока “Двумерные массивы”.
В новой версии:
- Ещё более доступное объяснение
- Дополнительные материалы
- 10 задач на программирование с автоматической проверкой решения
Что такое двумерный массив?
Двумерный массив это прямоугольная таблица с определенным
количеством строк и столбиков. Каждая
строка и каждый столбик имеют свой порядковый номер. На рисунке изображен
двумерный массив, который имеет 6 строк и 7 столбцов.
Рис.1. Двумерный массив. Общий вид. |
Обратите внимание, что столбцы и строки нумеруются, начиная
с нуля, как и в одномерных массивах.
Сразу же покажу, как объявить двумерный массив. В сущности,
ничего нового. Синтаксис прост и очень похож на объявление обычного массива и
любой другой переменной. Сначала
указываем тип данных, затем имя массива, а после в квадратных скобках его
размерность, то есть количество строк и количество столбиков. На рисунке ниже мы объявили двумерный массив
размерностью 6 на 7.
Рис.2 Двумерный массив, объявление. |
Важно помнить, что первая строка и первый столбик имеют
индекс нуль, поэтому последняя строка будет иметь номер не шесть, а пять, и
аналогично последний столбец будет иметь номер шесть, а не семь.
Кстати, нельзя путать местами строки и столбики. Сначала
записывается количество строк, потом количество столбиков.
Следующий естественный вопрос:
Как работать с двумерным массивом?
Как и другие переменные, двумерные массивы мы можем
инициализировать при их объявлении. Для
этого нам нужно указать все элементы массива. Делается это следующим образом.
Листинг 19.1
int arr [2][4]
= {{1,2,4,29},{3,4,6,1}};
Записанный выше код создает массив с двумя строчками и
четырьмя столбцами, и присваивает каждому элементу определенные значения.
Получится вот такой массив.
Рис.3. Двумерный массив инициализированный при объявлении |
Кроме того, мы можем задать только некоторые элементы
массива, тогда остальные будут заполнены нулями. Например:
Листинг 19.2
int arr [2][4]
= {{1,2,4},{3,4}};
При таком объявлении мы получим массив, который изображен на
следующем рисунке.
Рис.4. Двумерный массив, инициализированный не полностью. |
Понятно, что если у нас будет большой массив, то мы
замучаемся так все записывать. Да и редко такое бывает нужно.
Как работать с отдельным элементом
массива.
Понятно, что любой элемент задается номер строки и столбца,
на пересечении которых он расположен. Посмотрите на следующий рисунок. На нем мы
выбрали элемент, который находится во второй строке и третьем столбике (в
естественной нумерации).
Рис.5. Обращение к элементу двумерного массива. |
Обращение к конкретному элементу происходит так же, как и в
одномерном массиве. Сначала пишут имя массива, а затем, в квадратных скобках
номер строки и номер столбика. Опять
напоминаю, сначала идет номер строки, а потом номер столбика. Не путайте это. А
так же, помните, что нумерация идет не с единицы, а с нуля. Это очень частая ошибка, всегда следите за
этим.
Помните, когда мы хотели пройтись по всему одномерному
массиву, мы использовали цикл for,
который изменял наш индекс. Так как в двумерном массиве у нас два индекса (
один для строки и один для столбца), то для того, чтобы пройтись по всему
массиву нам потребуется два вложенных цикла for. Разберите следующий пример.
Листинг
19.3
#include <stdio.h>
int main (){
int arr [2][4] = {{1,2,4},{3,4}};
for (int i=0; i<2;
i++){ // 1 цикл
for (int j=0; j<4;
j++) // 2 цикл
printf(“%dt”,arr[i][j]);
printf(“n”);
}
return 0;
}
Данная программа, выводит последовательно все элементы
массива. Результат её работы, представлен на следующем рисунке.
Рис.6. Двумерный массив. Поэлементный вывод на экран. |
Как работает
вложенный цикл, вам уже должно быть понятно.
Сначала переменной i присваивается значение нуль,
проверяется условие 0<2, и так как оно выполняется, программа начинает
выполнять тело первого цикла. В теле первого цикла программа опять попадает в
цикл, теперь уже второй. Переменной j присваивается значение 0 и проверяется
условие 0<4. Оно истинно, поэтому выполняется тело второго цикла. Оно состоит
из одной инструкции вывода на экран элемента arr[i][j]. Так как на данном шаге у
нас i=0 j=0, то выводится значение элемент
из нулевой строки и нулевого столбика. В нашем примере это элемент число 1.
Тело второго цикла закончилось, происходит увеличение j на единицу j=1.
Проверка условия 1<4. Выполнение тела второго цикла:
вывод на экран элемента arr[0][1]
в нашем случае это 2. И так далее …
Используя вложенные циклы, мы можем и заполнять двумерные
массивы.
Зачем нужны двумерные массивы?
Двумерные массивы используются для хранения данных одинакового
типа и одинаковой структуры. Приведу пример. В одном из практических заданий к
прошлым урокам, необходимо было
составить программу, которая хранила оценки ученика по разным предметам. Для их
хранения в памяти компьютера мы использовали несколько одномерных массивов. Это
было не очень удобно. Для этих же целей, мы могли использовать двумерный
массив. Например, нам нужно хранить оценки ученика по русскому, математике,
физике и информатике, за целый месяц. Для этого мы создадим массив с 4 строками
и 30 столбиками (или наоборот, 30 строк и 4 столбика, кому как больше нравится),
и в каждую отдельную строчку будем записывать оценки по какому либо предмету. Это
гораздо удобнее и практичнее.
Например, рассмотрим такую задачку. Пусть нам нужно было бы
найти среднее арифметическое всех оценок по всем предметам. Если бы у нас было четыре одномерных массива,
то нам пришлось бы писать четыре цикла, в каждом из них считать среднее
арифметическое оценок по одному предмету, потом
находить среднее арифметическое этих четырех чисел. Если оценки у нас
хранятся в двумерном массиве, нам достаточно будет просто пройтись по всем
элементам массива, используя два вложенных цикла for, и найти среднее арифметическое.
Но это еще не всё. Представьте, что вы хотите добавить один
предмет и снова посчитать среднюю арифметическую оценку для всех предметов. Сколько мороки будет, если вы храните оценки
в одномерных массивах. Вам придется кучу изменений вносить, дописывать еще один
цикл (а вдруг добавилось 7 предметов?). Потом еще среднее искать между этими цифрами.
Другое дело если вы храните оценки в двумерном массиве. Всего
лишь изменить условие в одном из циклов. Поменять одно число, представляете как
удобно?
Напишите в комментариях пожалуйста, понятен ли вам этот пример, или лучше его подробно расписать?
Если этот материал кажется вам полезным, расскажите о нем друзьям используя кнопки основных социальных сетей, расположенные ниже.
Практическое задание.
Напишите программу, работающую следующим образом. Создайте массив 10 на 10. Заполните его нулями. Считайте два произвольных целых числа с клавиатуры, меньших либо равных 10. Первое число количество строк, второе – количество столбцов. Напишите функцию, которая заполняет массив по спирали и выводит его на экран. Т.е. если бы мы ввели 6 и 7, то получили бы следующий массив.
При этом табличка приблизительно должна быть выровнена по центру окна вывода.
Готовое решение пользователя с ником “Дмитрий”. За проявленное упорство и трудолюбие, и как первый выполнивший правильно практическое задание, Дмитрий награждается печенькой: