Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Минимальный по модулю элемент


Автор: suse 27.1.2012, 17:51
Есть функция нахождения минимального элемента в массиве. Как найти минимальный по модулю элемент?

Код

#include <math.h>
#include <stdio.h>
#include <conio.h>

float sum(float *mass, int dat)     //Передаётся указатель на массив и его размер
{float min,sum=0;
 int min_num;

 min=mass[0];
  for(int k=0;k<dat;k++)
  {if (mass[k]<min)
    {min=mass[k];
     min_num=k;
    }
  }

  for(int q=min_num+1;q<dat;q++)
   {sum=sum+mass[q];
   }
  return sum; 
}


Автор: mes 27.1.2012, 18:01
применить fabs () при получении каждого значения..

Добавлено @ 18:02
Цитата(suse @  27.1.2012,  16:51 Найти цитируемый пост)
 int min_num;

инициализируйте т.е. добавьте =0;

Автор: suse 27.1.2012, 18:36
Эту строчку? 

Код

  {if (mass[k]<fabs(min))


Вычисляет, но неправильно.

Автор: arcsupport 27.1.2012, 20:36
Попробуйте вот так:
Код
{if (fabs(mass[k])<fabs(min))

Автор: mes 27.1.2012, 21:24
Цитата(suse @  27.1.2012,  17:36 Найти цитируемый пост)
Эту строчку? 

и эту:
Цитата(suse @  27.1.2012,  16:51 Найти цитируемый пост)
min=mass[0];


Автор: suse 27.1.2012, 21:25
Интересный вариант, но не работает!

Автор: mes 27.1.2012, 21:30
Цитата(suse @  27.1.2012,  16:51 Найти цитируемый пост)
float min,sum=0;
 int min_num;
 min=mass[0];


это выглядит грязно, лучше так :

Код

  int min_num=0;
  float min=...[0];
  for (int k=1; ...
  
  float sum =0;
  for...

 и dat тоже лучше переименовать в что то бплее подходящее, например size

Добавлено через 6 минут и 5 секунд
Цитата(suse @  27.1.2012,  16:51 Найти цитируемый пост)
sum=sum+mass[q];

а и это логичнее когда:
Код

sum+=mass[q];



Автор: suse 27.1.2012, 21:43
Изменил. Вычисляет, но чтото не то... Может что то не то написал?
Код

#include <math.h>
#include <stdio.h>
#include <conio.h>

float sum(float *mass, int dat)     //Передаётся указатель на массив и его размер
{ int min_num=0;
   float min=mass[0];
 for(int k=0;k<dat;k++)
  {if (mass[k]<fabs(min))
    {min=mass[k];
     min_num=k;
    }
  }
float sum=0;
  for(int q=min_num+1;q<dat;q++)
   {sum=sum+mass[q];
   }
  return sum; 
}


Автор: volatile 27.1.2012, 23:40
Код

float sum(float *mass, int dat)     //Передаётся указатель на массив и его размер

   int min_num=0;
   for (int k=1; k<dat; k++)
      if (fabs(mass[k]) < fabs(mass[min_num]))
         min_num=k;

   // дальше не менял --------
   
float sum=0;
  for(int q=min_num+1;q<dat;q++)
   {sum=sum+mass[q];
   }
  return sum; 
}

Автор: suse 27.1.2012, 23:47
Все работает. Спасибо!

Добавлено через 16 секунд
Закрыто

Автор: mes 28.1.2012, 04:13
Цитата(suse @  27.1.2012,  20:43 Найти цитируемый пост)
Может что то не то написал?

Цитата(suse @  27.1.2012,  20:43 Найти цитируемый пост)
if (mass[k]<fabs(min))

fabs нужен не у min, а у mass[]

Автор: suse 28.1.2012, 11:35
Вот рабочий пример:

Код

double Proiz(float *array, int N)
{float max;
 int minnum;

 max=fabs(array[0]);

 for(int k=0;k<N;k++)
 {if(fabs(array[k])>fabs(max))//Поиск наименьшего по модулю элемента массива
    {max=array[k];
    minnum=k;}//Определение его номера
 }

 double sum=0;
 int q;
 for(q=minnum+1;q<N;q++)
  {sum=sum+array[q];
    }
  return sum;
}


Как сделать чтобы произведение, а не сумму искала?


Автор: mes 28.1.2012, 12:13
Цитата(suse @  28.1.2012,  10:35 Найти цитируемый пост)
Как сделать чтобы произведение, а не сумму искала?

* вместо + , только вот неужто можно о таком спрашивать ?!  smile

Добавлено через 1 минуту и 15 секунд
Цитата(suse @  28.1.2012,  10:35 Найти цитируемый пост)
(max))//Поиск наименьшего по модулю 

как то сомнительно согласуется max и наименьший ..

Автор: suse 28.1.2012, 12:21
Эта функция уже наибольший ищет smile
Если заменить + на *,  то ничего не вычисляет. Потому то и спрашиваю.

Добавлено через 7 минут и 9 секунд
Сумму вычисляет правильно, а произведение нет (пишет 0.000)

Автор: suse 28.1.2012, 13:01
А все понял! 

Код

 double sum=1;


На ноль то нельзя умножать!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)