Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиПоискОблакоVK ComboВсе проекты

Динамический массив и указатель Си

Никита Белкин Ученик (43), закрыт 10 месяцев назад
Задача: дана динамическая целочисленная матрица размером (nxm). Определить значение максимального элемента в матрице и количество элементов k, которые равны этому максимальному значению.

Не могу понять, как вывести количество максимальных элементов k

Программа:

#define _CRT_SECURE_NO_WARNINGS
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<locale.h>
int main()
{
setlocale(LC_ALL, "Rus");
int n, m, /* n - число строк, m - число столбцов матрицы */
i, j; /* Индексы массива */
int* mp; /* mp - указатель, который позволит работать с динамическим массивом*/
printf("\nВведите число строк и столбцов матрицы: ");
scanf("%d%d", &n, &m);
mp = (int*)calloc(n * m, sizeof(int)); /* Выделение памяти под массив */
if (mp == NULL)
{
puts("Нет памяти.Конец работы.");
return 1;
}
/* Ввод матрицы построчно */
printf("\nВведите целую матрицу (%d*%d) построчно: \n", n, m);
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
scanf("%d", mp + i * m + j);
/* Вывод матрицы */
printf("\nВаша матрица: \n");
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
printf("%d ", *(mp + i * m + j));
printf("\n");
}
/* Определение максимального значения в матрице */
int max = *mp, k = 0;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
if (*(mp + i * m + j) > max)
max = *(mp + i * m + j);
if (*(mp + i * m + j) = max)
k++;


printf("Максимальное равно %d\n ", max);
printf("Количество равно %d\n", k);
}
Лучший ответ
Миша Юзер Знаток (466) 11 месяцев назад
это матрица))))
Никита БелкинУченик (43) 11 месяцев назад
Двумерный массив и указатель*
Остальные ответы
Андрей Высший разум (227661) 11 месяцев назад
У тебя в задании матрица. А ты создаёшь вектор.
Динамическая матрица создаётся так:

int **arr = (int**)malloc(n * sizeof(int*));
int *tmp = (int*)malloc(n * m * sizeof(int));
for (int i = 0; i < n; ++i) { arr[i] = tmp; tmp += m; }

или так:

int **arr = (int**)malloc(n * sizeof(*int));
for (int i = 0; i < n; ++i) { arr[i] = (int*)malloc(m * sizeof(int)); }

Но второй способ куда дольше.

Определение максимального значения и кол-ва таких значений:

int max = arr[0][0], k = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (arr[i][j] == max) {
++k;
} else if (arr[i][j] > max) {
max = arr[i][j];
k = 1;
}
}
}

Если же хочешь именно вектор, то и работать с ним надо как с вектором, а не бессмысленно усложнять код:

int max = mp[0], k = 0;
for (int i = 0; i < n * m; ++i) {
if (mp[i] == max) {
++k;
} else if (mp[i] > max) {
max = mp[i];
k = 1;
}
}
Никита БелкинУченик (43) 11 месяцев назад
Я делаю по шаблону. Так мне сказали делать. Просто закончите программу как надо, пожалуйста
Никита Белкин Ученик (43) Никита Белкин, Спасибо большое)
Батаев Дмитрий Просветленный (20694) 11 месяцев назад
/* Определение максимального значения в матрице */
int max = *mp, k = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (*(mp + i * m + j) == max) k++;
if (*(mp + i * m + j) > max)
{
max = *(mp + i * m + j);
k=1;
}
}
}
и добавь free(mp);
Батаев ДмитрийПросветленный (20694) 11 месяцев назад
кстати, матрица это ВЕКТОР в принципе, то есть ЛИНЕЙНЫЙ МАССИВ и как ты с ним будешь работать зависит только от тебя. Авария при выделении памяти и СРАЗУ ВЫХОД ИЗ ПРОГРАММЫ. А вот если уже половину выделил, а потом на этом авария случилась обязательно нужно индексы запоминать где случилась бяка и также в цикле но уже не полном удалять то, что было занято. Иначе жопа - куда данные сохранять будешь? в NULL ???Нормально программеры работают
Похожие вопросы