1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
pow() некорректно работает если используется инкремент или декремент в его параметрах. Задание: Совершая обход так: 1 3 4 10 2 5 9 11 6 8 12 15 7 13 14 16 заполнить матрицу а такими значениями: b11b12...bnn
Kod(Показать/Скрыть)
#include <cmath> #include <iostream> #include <windows.h> using namespace std;
main() { int M, N; cout << "Insert N: "; cin >> N;
int b[N]; cout << "Insert b[i]: "; for (int i = 0; i < N; i++) cin >> b[i];
int a[M = N][N]; int i = 0, j = 0, k = 0; while (i < M || j != N - 1) { while (i < M && 0 <= j) a[i++][j--] = pow(b[k++ / N], k % N + 1); if (i == M){i--; j++;} while (0 <= i && j < N - 1) a[i--][++j] = pow(b[k++ / N], k % N + 1); i++; if (j == N - 1) i++; else j++; }
for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { cout.width(4); cout << a[i][j]; } cout << endl; } system("pause"); }
В таком исполнении pow(b[k++ / N], k % N + 1); работает так как надо (еще недавно и так не работал, но теперь почему-то работает):
Ты на самом деле думаешь, что оба эти фрагмента делают одно и то же? Вынужден тебя разочаровать, это не так. Вот тебе простейший тест, доказывающий это:
1) добавляешь небольшую функцию, по имени pow, которая не только вычисляет значение xy, но еще и печатает, для каких аргументов она сработала:
int pow(int x, int y) { cout << "pow : x = " << x << " y = " << y << endl; return std::pow(x, y); }
, больше в коде ничего менять не надо, тебе и так будет понятно что произойдет дальше.
Итак. Запускаем с pow(b[k++ / N], k % N + 1)
Результат(Показать/Скрыть)
Insert N: 4 Insert b[i]: 1 2 3 4 pow : x = 1 y = 1 pow : x = 1 y = 2 pow : x = 1 y = 3 pow : x = 1 y = 4 pow : x = 2 y = 1 pow : x = 2 y = 2 pow : x = 2 y = 3 pow : x = 2 y = 4 pow : x = 3 y = 1 pow : x = 3 y = 2 pow : x = 3 y = 3 pow : x = 3 y = 4 pow : x = 4 y = 1 pow : x = 4 y = 2 pow : x = 4 y = 3 pow : x = 4 y = 4 1 1 1 9 1 2 3 27 4 16 81 64 8 4 16 256 Press any key to continue . . .
А теперь - запускаем с pow(b[k / N], ++k % N + 1)
Результат(Показать/Скрыть)
Insert N: 4 Insert b[i]: 1 2 3 4 pow : x = 1 y = 2 pow : x = 1 y = 3 pow : x = 1 y = 4 pow : x = 2 y = 1 pow : x = 2 y = 2 pow : x = 2 y = 3 pow : x = 2 y = 4 pow : x = 3 y = 1 pow : x = 3 y = 2 pow : x = 3 y = 3 pow : x = 3 y = 4 pow : x = 4 y = 1 pow : x = 4 y = 2 pow : x = 4 y = 3 pow : x = 4 y = 4 pow : x = 4673632 y = 1 1 1 2 27 1 4 9 81 8 3 4 256 16 16 644673632 Press any key to continue . . .
И что, ты по-прежнему считаешь, что глючит pow? Может, не надо извращаться при вычислении параметров и добиваться UB (неопределенного поведения), чего ты как раз и добился? Поведение не определено, в зависимости от компилятора, фазы Луны и погоды на Сатурне будут выдаваться разные результаты.
P.S. Кстати, компилятор же предупреждает тебя, что в коде не все в порядке:
In function 'int main()': main.cpp (24) warning: operation on 'k' may be undefined main.cpp (27) warning: operation on 'k' may be undefined === Build finished: 0 errors, 2 warnings (0 minutes, 1 seconds) ===
Неужели это не наводит на размышления? Или опять не обращаем внимания на предупреждения?