Написать функцию, которая принимает в качестве параметров два указателя на массивы.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Pahom
Сообщения: 1
Зарегистрирован: 19 окт 2015, 18:16

Помогите пожалуйста с написанием программы на языке си:Написать функцию, которая принимает в качестве параметров два указателя на массивы и возвращает указатель на массив, удовлетворяющий условию:
Среднее арифметическое массива должно быть наиболее приближенным к нулю.Заранее спасибо)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Ещё неясно, что такое "наиболее приближенным к нулю". Если мы заполняем выходной массив самостоятельно, то нам ничего не мешает сделать среднее арифметическое равным нулю без всяких "приближений".

Сам-то ты понимаешь, как должна работать программа? Может преподаватель выдал какие-то устные уточнения, которые ты здесь не привёл?

И ещё, скажу сразу, что код программы я полностью писать не готов в педагогических целях. Могу помочь советом по синтаксису или по идее алгоритма, но не более того. Студент должен учиться и набивать шишки сам, иначе толка в учёбе нет.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Вероятно, функция должна сравнивать среднее арифметическое значений массивов, переданных по ссылке и возвращать ссылку на тот массив, у которого оно наиболее приближено к нулю. Массивы должны заполнятся рандомно.

(Декодирую условия задач по информатике! Недорого!) :D
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Спасибо, somewhere. А мог бы и сам догадаться, чёрт побери :)

Pahom, тогда алгоритм весьма прост.

1. Считаем среднее арифметическое первого массива (складываем элементы в цикле и делим на количество элементов).
2. Считаем среднее арифметическое второго массива.
3. Сравниваем первое и второе число по модулю (модуль вычисляется с помощью функции fabs).
4. Если результат сравнения меньше, то возвращаем указатель на первый массив, иначе - указатель на второй массив.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Непонятно каким образом должны участвовать в вычислениях входные массивы, и зачем они вообще передаются, если внутри функции они не нужны.
Ну как же не нужны, если в условии использованы их средние арифметические?

Код: Выделить всё

double Compare(double *x, size_t XCount, double *y, size_t YCount)
{
 double *p;
 double *e;
 double sx;
 double sy;
 for (p=x, e=p+XCount-1, sx=0.0; p<=e; ++p)
 {
  sx+=*p;
 }
 sx/=XCount;
 if (sx<0.0)
 {
  sx=-sx;
 }
 for (p=y, e=p+YCount-1, sy=0.0; p<=e; ++p)
 {
  sy+=*p;
 }
 sy/=YCount;
 if (sy<0.0)
 {
  sy=-sy;
 }
 if (sx<sy)
 {
  return x;
 }
 return y;
}
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Если мы заполняем выходной массив самостоятельно, то нам ничего не мешает сделать среднее арифметическое равным нулю без всяких "приближений".
Подбор входных данных не имеет ни какого отношения к решению задачи. Массивы даны, требуется выбрать из них тот, чьё среднее арифметическое имеет меньший модуль.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):3. Сравниваем первое и второе число по модулю (модуль вычисляется с помощью функции fabs).
Она здесь нафиг не нужна.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Собственно, как обычно. А слабо было прочитать всё сразу и увидеть, что проблема непонимания условия уже решена? Нет, я отлично осознаю, что не барское это занятие прочесть всё сразу. Куда правильнее читать по одному посту и отвечать на каждый, даже если посты уже не актуальны. Но ты всё-таки как-то держи себя в руках :)

А по поводу того, что fabs не нужна, это уж твоя проблема, что любишь велосипед изобретать. Ты не задумывался над тем, что если бы эта функция была бы не нужна, то её бы и не было в библиотеке? В чём её преимущество перед твоим ручным условием и ручной сменой знака внутри, мне нужно объяснять? Или слова об очистке конвейера команд и MMX оптимизации слишком сложны будут для понимания?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):А по поводу того, что fabs не нужна, это уж твоя проблема, что любишь велосипед изобретать. Ты не задумывался над тем, что если бы эта функция была бы не нужна, то её бы и не было в библиотеке?
Она не нужна здесь. Да, в библиотеке можно сделать побитовое И с маской, сбрасывающей знаковый бит, а в зависимости от реализации менять маску, а в приладе это - путь к непереносимости. Но задача оптимизации не стоит. При этом само значение модуля нафиг не нужно, можно и

Код: Выделить всё

if (((sx<0.0)&&(sy<0.0)&&(sx>sy))||((sx>=0.0)&&(sy<0.0)&&(sx<-sy))||((sx<0.0)&&(sy>=0.0)&&(sy>-sx))
{
 return x;
}
return y;
, и менять знак как раз положительных и ещё много всякой фигни навертеть. Но при этом из-за двух мест во всей проге вспоминать префикс такой простой фунции? Да здесь даже abs перегружать и то лениво.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Или слова об очистке конвейера команд
Ога. Конвейер уже алгоритмы портит. Не смешно.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить