При приближении к любому биту кодирования это обычно помогает разбить ваши задачи по кодированию на ряд отдельных этапов, которые затем обеспечивают план действий, который необходимо соблюдать при начале фактического кодирования.Вы можете напечатать шаги в отдельном окне редактора (или что я считаю столь же полезным, это лист бумаги и карандаша размером 8 1/2 x 11).
Продумайте, что должен делать ваш код, и напишитеэто вниз, например,
- цикл по всем строкам матрицы (a / k / a 2D-массив
int
); - цикл по всем значениям столбца, чтобы найти минимальное значениев каждом ряду;и, наконец,
- перебираем все значения столбцов (снова), вычитая минимум из каждого значения.
Вам не нужно делать его идеальным в первый раз, теперь посмотрите снова нашаги, которые вы написали, и определите, есть ли какие-либо ограничения , которые вы должны наложить.
(Здесь, да, вы должны определить минимум, изучая каждое значение в строке, прежде чем вы сможете начать вычитать минимум из каждого значения - это требует как минимум двух циклов над значениями столбца. Кроме того, вы должнытакже сбросьте или повторно инициализируйте вашу переменную min
, чтобы она содержала минимум для текущей строки, а не минимум из последней строки, которая оказалась меньше этой. Используйте требование повторной инициализации, чтобы сделать логическуювыбор области действия, в которой должна быть объявлена каждая переменная)
Теперь, когда ваши шаги уточнены с учетом всех ограничений, которые вы должны наложить, вы можете логически выложить свой код (имея в виду, что вы всегда должны защищать от чтения или записиза пределами вашего массива и т. д.) Благодаря хорошей схеме вы знаете, что вам понадобится один внешний цикл, который проходит по всем строкам, а затем два внутренних цикла, которые (а) находят минимум и (б) вычитают его извсе значения в этом ряду.Вы можете сделать что-то похожее на:
#include <stdio.h>
#include <limits.h> /* for INT_MAX, INT_MIN */
#define ASZ 3 /* if you need a constant, define one (or more), a size */
int main (void) {
int a[][ASZ] = {{ 1, 4, 5 }, { 5, 7, 6 }, { 5, 8, 8 }};
puts ("Original matrix:"); /* output original matrix */
for (int row = 0; row < ASZ; row++) {
for (int col = 0; col < ASZ; col++)
printf (" %2d", a[row][col]);
putchar ('\n');
}
puts ("\nModified matrix:"); /* subtract row-min from each element */
for (int row = 0; row < ASZ; row++) { /* loop over rows */
int min = INT_MAX; /* declare min = INT_MAX */
for (int col = 0; col < ASZ; col++) /* loop over column vals */
if (a[row][col] < min) /* find row-min value */
min = a[row][col];
for (int col = 0; col < ASZ; col++) { /* loop over column vals */
a[row][col] -= min; /* subtract row-min value */
printf (" %2d", a[row][col]); /* output new value */
}
putchar ('\n');
}
}
Пример Использование / Вывод
$ ./bin/mtrx_subtract_rowmin
Original matrix:
1 4 5
5 7 6
5 8 8
Modified matrix:
0 3 4
0 2 1
0 3 3
В этом нет никакой магии, достаточно просто подойти к каждой проблеме всистематический способ.Делая это достаточно часто, с каждым разом становится легче.Обратите внимание на то, где каждая переменная была объявлена (или определена константа), и поймите, почему.Дайте мне знать, если у вас есть дополнительные вопросы.