Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: nolasco281 en 2 Mayo 2014, 13:48 PM

Título: Sacar valores par y valores impar
Publicado por: nolasco281 en 2 Mayo 2014, 13:48 PM
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
Título: Re: Sacar valores par y valores impar
Publicado por: engel lex en 2 Mayo 2014, 14:02 PM
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 (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 )
Título: Re: Sacar valores par y valores impar
Publicado por: nolasco281 en 2 Mayo 2014, 14:52 PM
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.
Título: Re: Sacar valores par y valores impar
Publicado por: leosansan en 2 Mayo 2014, 15:02 PM
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! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

EDITADO: Gracias por la observación engel lex
Título: Re: Sacar valores par y valores impar
Publicado por: engel lex en 2 Mayo 2014, 17:08 PM
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
Título: Re: Sacar valores par y valores impar
Publicado por: nolasco281 en 3 Mayo 2014, 00:09 AM
Gracias acaba de llegar a la casa y lo acaba de probar

Funciono perfecto mil gracias por responder.

Saludos y muchas gracias de nuevo.
Título: Re: Sacar valores par y valores impar
Publicado por: Blaster en 3 Mayo 2014, 02:07 AM
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 .:
Título: Re: Sacar valores par y valores impar
Publicado por: eferion en 6 Mayo 2014, 09:29 AM
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;