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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2010, 23:44   #11
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,865
По умолчанию

Цитата:
Сообщение от Guzal Посмотреть сообщение
Arigato, а мы напишем
Код:
i=(n+1)/2;
	 	    cout <<a[i-1];
Ну для данного примера прокатит, а для другого уже нет. Ошибка кроется в самом алгоритме.
Arigato вне форума Ответить с цитированием
Старый 07.11.2010, 00:09   #12
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

вот, немного кривовато

Код:
float s=0; //среднее значение
int i=0;//счетчик
int g=0;//прибавление к среднеу значению
int k=0;
int x;//
int *a=new int[x];//массив из х элементов

for (i=0;i<x;i++)
	s+=a[i];
	
s=s/x;//среднее значение
g=0;

while (k==0)
{if (a[i]==s+)
	for (i=0;i<x;i++)
	{
		if ((a[i]<=(s+g))||(a[i]>=(s-g))){
			k=a[i];
			break;		
		}
	}
g++//прибавляем +- к s
}
cout<<"значение среднего элемента равно"<< k;
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery

Последний раз редактировалось kaljan775; 07.11.2010 в 01:04.
kaljan775 вне форума Ответить с цитированием
Старый 07.11.2010, 00:52   #13
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Среднее значение != среднее арифметическое.
Как я понял, автору нужно найти медиану массива - то есть значение, которое делит массив на 2 равные части - слева от него элементы не больше, а справа элементы не меньше.
Если N четное, то по умолчанию берется нижняя медиана - которая слева.
Думаю, выкинуть при желании STL из примера не составит труда. Все и так понятно - люди ведь задачу уже решили, просто не догадались об этом)
Код:
#include <iostream>
#include <algorithm>

int main()
{
   const int N = 5;
   int a[N] = {1, 4, 2, 5, 7};
   int imed = (N + 1) / 2 - 1;
   std::nth_element(a, a + imed, a + N); // здесь сложность O(N)
   // std::sort(a, a + N); // а здесь O(NlogN)
   std::cout << a[imed] << std::endl;
   return 0;
}
still_alive вне форума Ответить с цитированием
Старый 07.11.2010, 00:56   #14
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

а зачем автор программы тогда по возрастанию сортировала?
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 07.11.2010, 01:01   #15
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от kaljan775 Посмотреть сообщение
а зачем автор программы тогда по возрастанию сортировала?
Цитата:
Сообщение от still_alive
слева от него элементы не больше, а справа элементы не меньше.
Вместо nth_element я бы тоже мог сортировать. Просто это дольше, поэтому у меня сортировка в комментах.
still_alive вне форума Ответить с цитированием
Старый 07.11.2010, 01:08   #16
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

ну, а разве мой вариант неверный? среднее число будет указывать на центр в массиве, а сортировка итак уже написана, если она, конечно, нужна
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 07.11.2010, 01:42   #17
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от kaljan775 Посмотреть сообщение
ну, а разве мой вариант неверный? среднее число будет указывать на центр в массиве, а сортировка итак уже написана, если она, конечно, нужна
Неверный. Ты его тестировал? Начни с -1 -2 -3, потом -1 0 1, потом 1 3 3 3 3 3 3, потом поменяй тип элементов на double и продолжай)
Ну или выложи полностью компилируемый код и я с ним разберусь)

Последний раз редактировалось still_alive; 07.11.2010 в 01:44.
still_alive вне форума Ответить с цитированием
Старый 07.11.2010, 02:15   #18
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

ладно, сдаюсь.
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 07.11.2010, 13:42   #19
Guzal
Форумчанин
 
Аватар для Guzal
 
Регистрация: 11.09.2010
Сообщений: 101
По умолчанию

ничего не пойму
да, мне нужна медиана массива, посмотрите мой код пожалуйста, он работает. И еще, если медианы нет, нужно вывести -1, я так понимаю ее нет ,если кол-во вводимых чисел четное?
А сортирую я для того чтобы смело можно было использовать формулу
i=(*n+1)/2; Учитывая, что все числа разные, этот код думаю подойдет.
Код:
#include <iostream>
using namespace std;

	int medianOfNumbers (int *a, int *n) {

	 int  i, j, tmp=0;
	 
	 if(*n%2==1) {
		for ( i=0; i<*n; i++) 
	 		for ( j=0; j<*n-1; j++)
	 	    if (a[j] > a[j+1])   
	 	    {
	 	    tmp = a[j+1];
	 	    a[j+1]=a[j];
	 	    a[j]=tmp;
	 	    
	 		 }	
	 		 	
	 		i=(*n+1)/2;
	 	    
	 	      return a[i-1];
	 	      }
	 	      else return -1;
	 	      } 
		     
		     		int main() {
		     		int n;
		     		cin>>n;
		     		int a[n];
		     		for (int i=0; i<n; i++)
		     		cin>>a[i];

		     		cout <<medianOfNumbers(a, &n);
		     
		     
		     			return 0;

		     						}
I'm a rebel. [I think positively].
Guzal вне форума Ответить с цитированием
Старый 07.11.2010, 16:50   #20
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от Guzal Посмотреть сообщение
посмотрите мой код пожалуйста, он работает. И еще, если медианы нет, нужно вывести -1, я так понимаю ее нет ,если кол-во вводимых чисел четное?
Должен работать.

Медиана всегда есть, когда есть массив) При четном N просто их бесконечно много - нижняя медиана (N/2), верхняя медиана (N/2+1) и все значения в интервале между ними. Обычно на практике берут среднее арифметическое нижней и верхней. Но если в условии прямо сказано, что ее может не быть (а против написанного преподом или начальником особо не попрешь)), то да, скорее всего имеется в виду при четном N (хотя кто их там знает).

И еще. Если по условию при отсутствии медианы надо возвращать -1, то как отличить "медиана равна -1" от "медианы нет"?
still_alive вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Среднее значение SB86 Microsoft Office Excel 3 08.06.2010 07:24
Среднее значение Storm.7117 Microsoft Office Excel 3 13.01.2010 15:09
Среднее значение acidcool SQL, базы данных 11 16.08.2009 16:34
среднее значение MyQwErTy Паскаль, Turbo Pascal, PascalABC.NET 3 09.11.2008 21:17
среднее значение tonic Microsoft Office Excel 1 04.01.2008 00:20