Даны натуральные числа 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
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()"?
Короче - бред сумасшедшего.
Что это за хрень постоянная "size_t"? Ты ее взял из справочника по описанию функций? Так она в справочнике формализована.
Переменные вообще лучше объявлять заранее и нормальным образом, т. е.
int i, j, k, и т. д.
sizeof - это функция и вызывается sizeof(тип переменной)
Что за функция такая "scanf_s()"?
Короче - бред сумасшедшего.
Егор Дюкарев
size_t стандартный тип
scanf_s нестандартная функция в MSVC вместо опасного scanf.
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 зло, но понять Вас можно =)
В основном мелочи.
Ну можно 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 зло, но понять Вас можно =)
Владислав Килин
На счёт _getch
while (1) if (kbhit()) break;
return 0;
system("pause");
return 0;
Знаю ещё такие варианты для ожидания, но как я понял систем (пауза) работает не на всех ОС
while (1) if (kbhit()) break;
return 0;
system("pause");
return 0;
Знаю ещё такие варианты для ожидания, но как я понял систем (пауза) работает не на всех ОС
Кроме того, то, что было первой строкой стало последней
Владимир Евграфов
Нужно решение? Позже пришлю
тпро
Похожие вопросы
- помогите найти ошибку в коде на Си
- Помогите с задаче в СИ
- Помогите исправить код чтобы он считал балы теста Pascal
- Помогите с программированием на Си
- Помогите, лёгкий код C++
- Всем привет, помогите в коде разобраться С++, вылетает ошибка, вроде все правильно..
- Помогите с массивами в си++
- Помогите с программой на си! Программа в описании
- Помогите с кодом на c++
- Помогите откорректировать код в C++