Страница 1 из 3

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

Добавлено: 19 окт 2015, 18:22
Pahom
Помогите пожалуйста с написанием программы на языке си:Написать функцию, которая принимает в качестве параметров два указателя на массивы и возвращает указатель на массив, удовлетворяющий условию:
Среднее арифметическое массива должно быть наиболее приближенным к нулю.Заранее спасибо)

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

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

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

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

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

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

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

(Декодирую условия задач по информатике! Недорого!) :D

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

Добавлено: 20 окт 2015, 10:36
Romeo
Спасибо, somewhere. А мог бы и сам догадаться, чёрт побери :)

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

1. Считаем среднее арифметическое первого массива (складываем элементы в цикле и делим на количество элементов).
2. Считаем среднее арифметическое второго массива.
3. Сравниваем первое и второе число по модулю (модуль вычисляется с помощью функции fabs).
4. Если результат сравнения меньше, то возвращаем указатель на первый массив, иначе - указатель на второй массив.

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

Добавлено: 21 окт 2015, 11:26
Сионист
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;
}

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

Добавлено: 21 окт 2015, 11:28
Сионист
Romeo писал(а):Если мы заполняем выходной массив самостоятельно, то нам ничего не мешает сделать среднее арифметическое равным нулю без всяких "приближений".
Подбор входных данных не имеет ни какого отношения к решению задачи. Массивы даны, требуется выбрать из них тот, чьё среднее арифметическое имеет меньший модуль.

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

Добавлено: 21 окт 2015, 11:30
Сионист
Romeo писал(а):3. Сравниваем первое и второе число по модулю (модуль вычисляется с помощью функции fabs).
Она здесь нафиг не нужна.

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

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

А по поводу того, что fabs не нужна, это уж твоя проблема, что любишь велосипед изобретать. Ты не задумывался над тем, что если бы эта функция была бы не нужна, то её бы и не было в библиотеке? В чём её преимущество перед твоим ручным условием и ручной сменой знака внутри, мне нужно объяснять? Или слова об очистке конвейера команд и MMX оптимизации слишком сложны будут для понимания?

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

Добавлено: 21 окт 2015, 13:50
Сионист
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 перегружать и то лениво.

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

Добавлено: 21 окт 2015, 14:03
Сионист
Romeo писал(а):Или слова об очистке конвейера команд
Ога. Конвейер уже алгоритмы портит. Не смешно.