1.12.2014 / 12:13 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Ксакеп, Что значит не должно? Метод, в нем 3 цикла вложенных, всередине условие, не такая и редкая ситуация, а если это в анонимном классе? Изменено Naik (1.12 / 12:13) (всего 1 раз) |
1.12.2014 / 12:43 | |
aRiGaTo Пользователь Сейчас: Offline
Имя: Snork Откуда: Yerevan Регистрация: 03.02.2010
| Naik, вложенность циклов усложняет понимание кода. Обычно, их выносят в отдельный метод. Кроме того, по некоторым метрикам (для подсчёта сложности) считается вложенность. Чем сложнее код, тем он хуже - а за плохой код, можно получить от ПМа __________________
don't tread on me |
1.12.2014 / 12:51 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| aRiGaTo, и как же тут вынести? http://annimon.com/code/?act=view&id=4104 Алгоритм сам по себе простой, но без вложенности никак.. Изменено Naik (1.12 / 12:51) (всего 1 раз) |
1.12.2014 / 13:01 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Naik, Открыть спойлер Закрыть спойлер #define size 5
#define true 1
#define false 0
typedef struct {
int n, last;
} Cell;
typedef int bool;
bool hasPath(Cell c1) {
return c1.last != INT_MAX;
}
/*int findShortPath(Cell M[size][size], int i, int j, int n) {
int min = INT_MAX;
for (int k = 0; k < n; k++) {
bool hasPaths = (hasPath(M[i][k]) && hasPath(M[k][j]));
int sum = hasPaths ? M[i][k].last + M[k][j].last : INT_MAX;
min = (min > sum) ? sum : min;
}
return min;
}*/
bool checkForNewIteration(Cell M[size][size], int i, int j, int n) {
int min = INT_MAX; // findShortPath(M, i, j, n);
for (int k = 0; k < n; k++) {
bool hasPaths = (hasPath(M[i][k]) && hasPath(M[k][j]));
int sum = hasPaths ? M[i][k].last + M[k][j].last : INT_MAX;
min = (min > sum) ? sum : min;
}
if (min < M[i][j].last) {
M[i][j].n = min;
// We need one more iteration
return true;
}
M[i][j].n = M[i][j].last;
// Done
return false;
}
void findPathsShimbel(Cell M[size][size], int n) {
bool run;
int i, j;
while (run) {
run = false;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
run = checkForNewIteration(M, i, j, size);
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
M[i][j].last = M[i][j].n;
}
}
}
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
printf("[%d.%d] = %d (%d)\t", i, j, M[i][j].last, M[i][j].n);
}
printf("\n");
}
}
__________________
let live Изменено aNNiMON (1.12 / 13:03) (всего 1 раз) |
1.12.2014 / 13:05 | |
aRiGaTo Пользователь Сейчас: Offline
Имя: Snork Откуда: Yerevan Регистрация: 03.02.2010
| Naik, void findPathsShimbel(Cell **M, int n) {
int run = 1, min, i, j, k, sum;
while (run) {
run = 0;
for (i = 0; i < n; i++) {
run = innerCycle(M, n);
}
finalizeMatrix(M, n);
}
}
Как-нибудь так. Ну, методам названия нужны более осмысленные __________________
don't tread on me |
1.12.2014 / 14:08 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| aNNiMON, сударь, неплохо, стало понятнее, но тут уже нужно выбирать - вызов метода в цикле, или понятный код
|
1.12.2014 / 14:16 | |
Ксакеп Модератор форума Сейчас: Offline
Регистрация: 20.06.2012
| Naik, инлайнинг никто не отменял |
1.12.2014 / 15:35 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Ксакеп, инлайнинг не работает с циклами
|
1.12.2014 / 16:14 | |
Ксакеп Модератор форума Сейчас: Offline
Регистрация: 20.06.2012
| Naik, кхе-кхе, что, простите?
|
1.12.2014 / 16:56 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Ксакеп, Нужно проверить Но есть мнение, что функция с циклами скорее всего не встроется |