Sacar valores par y valores impar

Iniciado por nolasco281, 2 Mayo 2014, 13:48 PM

0 Miembros y 1 Visitante están viendo este tema.

nolasco281

Hola

Lo que trato de hacer es la mediana es algo de estadistica:

Dice si tengo


54321
ordenarlos ya lo hice

12345 Como la cantidad de valores es impar debe sacar el valor 3 en este caso ya que es el de enmedio.

pero si la cantidad de varores es par

654321 -> oredenarlos

123456
toma los dos valores intermedios en este caso 3 y 4 estos se suman 3+4/2 = 3.5 esa seria la mediana en este caso.

ahora tengo lo siquiente

Código (cpp) [Seleccionar]
If (listaElementos / 2) = (listaElementos / 2)
{            
           cout << ("Par");
           mediana = (listaElementos - 0.5) + (listaElementos + 0.5) / 2;

           cout << mediana;
}

Else
{
           cout << ("Impar");
           mediana = listaElementos / 2;
           cout << mediana;
}


Gracias
Lo que se puede imaginar... se puede programar.

engel lex

es una duda o qué?

Citarste caso 3 y 4 estos se suman 3+4/2 = 3.5 esa seria la mediana en este caso
por orden de ejecución de operados eso es 5
http://es.wikipedia.org/wiki/Orden_de_evaluaci%C3%B3n


If (listaElementos / 2) = (listaElementos / 2)
eso debería darte error de compilación, sin contar que es incorrecto

(listaElementos - 0.5) + (listaElementos + 0.5) / 2;
incorrecto para tus fines, esto es equivalente a (x-0.5) * ( (x+0.5)/2 )
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

nolasco281

Si lo siento, si es una duda lamento si no me supe explicar pero eso es lo que queria saber si esta bien, o no como lo deberia de hacer con un for o con un if esa es la duda que tengo.

Gracias por responder.
Lo que se puede imaginar... se puede programar.

leosansan

#3
Espero que te aclare lo siguiente:

Código (cpp) [Seleccionar]

n = numero de elementos o valores almacenados.

if ( n%2 == 0 ) <== n par

i = posicion: 0 1 2 3 4 5
valor:        1 2 3 4 5 6
posicion media = ( n-1 )/2 = (2.5) = 2 por ser la division entera.
valor medio = valor( n-1 )/2 + valor(1+( n-1 )/2) = valor(2) + valor(3) = 3 + 4

else <== n impar

i = posicion: 0 1 2 3 4
valor:        1 2 3 4 5
posicion media = ( n-1 )/2 =  2 .
valor del medio = valor( n-1 )/2 = valor(2)= 3


¡¡¡¡ Saluditos! ..... !!!!



EDITADO: Gracias por la observación engel lex

engel lex

leosansan creoque pusiste el simbolo incorrecto

i%2 siempre va a ser < 2 :p corrijele su simbolo de division :p

y si nolasco correjido, el metodo de leolsansan es el correcto, recomiendo hacer la operacion un int para evitar errores
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

nolasco281

Gracias acaba de llegar a la casa y lo acaba de probar

Funciono perfecto mil gracias por responder.

Saludos y muchas gracias de nuevo.
Lo que se puede imaginar... se puede programar.

Blaster

#6
Te dejo tambien mi seudocódigo o es lo que parece xD..

Código (cpp) [Seleccionar]
for (si i = 0 es menor que dos, incremeta)
  if (n % 2 == 0) es par
   media += a la suma de los dos intermedio = valor[(n-i)/2]
  else es impar
   media = numero de elementos dividido por dos = n /2
  if (n % 2 == 0) si es par, sacar media apartir de la suma de los intermedios
   media = suma de los intermedio dividido dos = media /2


Saludos .:

eferion

Y que tal con iteradores??

Código (cpp) [Seleccionar]

  std::vector< int > lista;

  lista.push_back( 1 );
  lista.push_back( 2 );
  lista.push_back( 3 );
  lista.push_back( 4 );
  lista.push_back( 5 );
  lista.push_back( 6 );

  auto it = lista.begin( ) + std::distance( lista.begin( ), lista.end( ) ) / 2;

  if ( lista.size( ) % 2 == 0 )
    std::cout << *(it - 1) << " ";
  std::cout << *it;


Presupongo el vector ya ordenado porque esa parte dices que ya la tienes... aunque con un set o un multiset ( dependiendo de si admites valores duplicados o no ) te ahorrarías el tener que ordenar la lista:

Código (cpp) [Seleccionar]

  std::set< int > lista;

  lista.push_back( 5 );
  lista.push_back( 1 );
  lista.push_back( 4 );
  lista.push_back( 3 );
  lista.push_back( 6 );
  lista.push_back( 2 );

  // Aqui se imprimen ya ordenados
  for ( auto it = lista.begin( ); it != lista.end( ); ++it )
    std::cout << *it << std::endl;

  // Y si el orden que quieres es de mayor a menor...
  for ( auto it = lista.rbegin( ); it != lista.rend( ); ++it )
    std::cout << *it << std::endl;