Другие языки программирования и технологии

Помогите с кодом на Си.

Даны натуральные числа n и m, определяющие соответственно количество строк и столбцов в некоторой заданной матрицы вещественных чисел М1. Получить матрицу М2 путем вращения матрицы М1 на 180 градусов.
#include
#include
#include
void print_matrix(const double *a, size_t m, size_t n, const char *fmt)
{
for (size_t i = 0; i < m; i++, puts(""))
for (size_t j = 0; j < n; j++)
printf(fmt, a[j + i * n]);
puts("");
}

void input_matrix(double *a, size_t m, size_t n)
{
for (size_t i = 0; i < m * n; i++)
if (scanf_s("%lf", &a[i]) != 1)
{
printf(stderr, "wrong format data\n");
return 0;
}
}

double *rt180_matrix(const double *a, size_t m, size_t n)
{
double *new_matrix = malloc(sizeof *new_matrix * m * n);
if (!new_matrix)
return 0;

for (size_t i = 0; i < m; i++)
for (size_t j = 0; j < n; j++)
new_matrix[(n - j - 1) + (m - i - 1) * n] = a[j + i * n];

return new_matrix;
}

int main(void)
{
size_t m, n;
if ((scanf_s("%zu%zu", &m, &n) != 2) || (m < 1 || n < 1))
{
printf(stderr, "input data error\n");
return 1;
}

double *matrix = malloc(sizeof *matrix * m * n);
assert(matrix);
input_matrix(matrix, m, n);
print_matrix(matrix, m, n, "%5g");

double *b = rt180_matrix(matrix, m, n);
print_matrix(b, m, n, "%5g");
free(b);
_getch();

return 0;
}
Нужно максимум упросить код.
1. Зачем ты вообще делаешь двойные циклы? Вращение матрицы на 180 градусов - это тупая запись вектора в обратном порядке. Одного простейшего цикла более чем достаточно:

t = n * m - 1;
for (i = 0; i <= t; ++i) { out[t - i] = inp[i]; }

2. Неоднократно повторенное sizeof *new_matrix * m * n - это БРЕД, не имеющий никакого отношения к языку C. Правильно размер выделяемого для твоей матрицы блока памяти записывается так:

sizeof(double) * m * n
Эльфийка Геймер Продвигают не линейную запись, а указатель на указатель я так понял. Типо быстрее и проще, чем линейная алресация со смещением в строке. Хотя копмилятору пофигу ЧТО и КАК записывать в [ ] смещения регистров
Я вообще тут ни хрена не понимаю. Это точно Си?
Что это за хрень постоянная "size_t"? Ты ее взял из справочника по описанию функций? Так она в справочнике формализована.
Переменные вообще лучше объявлять заранее и нормальным образом, т. е.
int i, j, k, и т. д.
sizeof - это функция и вызывается sizeof(тип переменной)
Что за функция такая "scanf_s()"?
Короче - бред сумасшедшего.
Роман Шталиков
Роман Шталиков
52 959
Егор Дюкарев size_t стандартный тип
scanf_s нестандартная функция в MSVC вместо опасного scanf.
Не вижу тут ничего сложного и особо к упрощению.

В основном мелочи.

Ну можно assert убрать, сделать обычную (? =) проверку, если Вас пугает он

if (scanf_s("%lf", &a[i]) != 1)
{
printf(stderr, "wrong format data\n");
return 0; <-- 0 не нужен
}

Кст есть проблема, что функция не сообщает вызывающему коду с успехом она завершилась или нет. Ну да в stderr будет выведена ошибка, но как-бы и всё.

printf(fmt, a[j + i * n]); - вместо того чтобы считать индексы с помощью умножения - проще двигаться указателем по матрице в одном цикле. Она-же одним блоком... В input_matrix Вы-же не стесняетесь этим пользоваться =)

аналогично в повороте...

_getch зло, но понять Вас можно =)
_~* Erb@*~_
_~* Erb@*~_
84 764
Владислав Килин На счёт _getch

while (1) if (kbhit()) break;
return 0;

system("pause");
return 0;

Знаю ещё такие варианты для ожидания, но как я понял систем (пауза) работает не на всех ОС
Кроме того, то, что было первой строкой стало последней
тпро
DK
Daniyar K.
66