Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2010, 15:51   #1
devl
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 20
По умолчанию Универсальная функция для действия над матрицами

Доброго времени суток, форумчане!
Задали задачу: сделать функцию, которая будет считать сумму/разность матриц и умножать матрицу на число, при этом выбирать что именно сделать она должна на основе передаваемых параметров. Все было бы легко и просто, если не пару "но":
- циклов должно быть всего два (во вложенном будут все действия происходить)
- запрещены операторы ветвления и выбора.
Язык - Си, не плюсы.
У кого-нибудь есть идеи? Заранее спасибо.
devl вне форума Ответить с цитированием
Старый 30.01.2010, 16:41   #2
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Идея есть - над тобой жестоко глумятся или твой препод идиот!

"адали задачу: сделать функцию, которая будет считать сумму/разность матриц и умножать матрицу на число, при этом выбирать что именно сделать"

Тут то и загвоздка - как выбирать без ветвления?
Я бы просто посмеялся над таким заданием!

if кстати - это выбор? по крайней мере без ифа точно никак, если не использовать макросы мб define'ом определенные...В С не силен...
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 30.01.2010, 17:03   #3
devl
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 20
По умолчанию

If - выбор =) Кстати можно сделать и без него (через условие в цикле), но такой вариант не прошел.
devl вне форума Ответить с цитированием
Старый 30.01.2010, 17:16   #4
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от devl Посмотреть сообщение
If - выбор =) Кстати можно сделать и без него (через условие в цикле), но такой вариант не прошел.
и снова оно :D
не я не представляю язык программирования без выбора и условий, задание издевка наверн :D
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 30.01.2010, 17:23   #5
devl
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 20
По умолчанию

Так обойтись полностью без условий просто нереально (иначе как проверять на выход за пределы массива? Заперет услвий распространяется только на какое-то мистическое определение нужного варианта действа). Перегрузка функции может подойти? (имя функции-то одно, но список аргументов будет разный)
devl вне форума Ответить с цитированием
Старый 30.01.2010, 17:31   #6
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

В C (чистом, без плюсов) нет перегрузки функций.

void Foo( double k1, double k2, int nCols, int nRows, double* A, double* B, double d, double* C);

C=(A+(k1B))⋅(k2d)

При k1 = 0; k2 = 1. получаем умножение на число d;
при k1 = 1.; k2 = 0 - сложение матриц;
при k1 = -1.; k2 = 0 - вычитание.

Чтобы обойтись двумя циклами нужно знать, как матрица хранится в памяти и что такое "приведенный индекс".

Последний раз редактировалось Vago; 30.01.2010 в 17:35.
Vago вне форума Ответить с цитированием
Старый 30.01.2010, 17:40   #7
devl
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 20
По умолчанию

Большое спасибо! Выручил)

Цитата:
В C (чистом, без плюсов) нет перегрузки функций.
Не знал, спасибо)
devl вне форума Ответить с цитированием
Старый 30.01.2010, 17:52   #8
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
В C (чистом, без плюсов) нет перегрузки функций.

void Foo( double k1, double k2, int nCols, int nRows, double* A, double* B, double d, double* C);

C=(A+(k1B))⋅(k2d)

При k1 = 0; k2 = 1. получаем умножение на число d;
при k1 = 1.; k2 = 0 - сложение матриц;
при k1 = -1.; k2 = 0 - вычитание.

Чтобы обойтись двумя циклами нужно знать, как матрица хранится в памяти и что такое "приведенный индекс".
По-моему тут если и соответственно выбор, хотя...без них реально не обойтись
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 30.01.2010, 17:54   #9
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Пардон, тут ещё, конечно, нужно к-во столбцов матрицы B в параметры добавить:
void Foo( double k1, double k2, int nRowsA, int nColsA, int nColsB, double* A, double* B, double d, double* C );

Но алгоритм от этого не поменяется.
Vago вне форума Ответить с цитированием
Старый 30.01.2010, 18:06   #10
devl
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 20
По умолчанию

Цитата:
C=(A+(k1⋅B))⋅(k2⋅d)
Тут можно обойтись и без k2, даже нужно:
k1 = 1, k2 = 0
т.о. (Aij+Bij)⋅(0⋅d) -> (Aij+Bij)⋅0, что в итоге приведет к обнулению результата.
Но все равно спасибо, Vago, выручил ты меня очень =)
devl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Арифметические действия над матрицами и транспонирование Axel1981 Помощь студентам 14 12.06.2010 20:20
Действия над массивами hen Помощь студентам 2 06.06.2009 23:34
Действия над матрицами. (Delphi) ekzobyte Помощь студентам 1 20.05.2009 20:52