Foro de elhacker.net

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
  1. If (listaElementos / 2) = (listaElementos / 2)
  2. {            
  3.            cout << ("Par");
  4.            mediana = (listaElementos - 0.5) + (listaElementos + 0.5) / 2;
  5.  
  6.            cout << mediana;
  7. }
  8.  
  9. Else
  10. {
  11.            cout << ("Impar");
  12.            mediana = listaElementos / 2;
  13.            cout << mediana;
  14. }

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é?

Citar
ste 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)


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

Código:
(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
  1. n = numero de elementos o valores almacenados.
  2.  
  3. if ( n%2 == 0 ) <== n par
  4.  
  5. i = posicion: 0 1 2 3 4 5
  6. valor:        1 2 3 4 5 6
  7. posicion media = ( n-1 )/2 = (2.5) = 2 por ser la division entera.
  8. valor medio = valor( n-1 )/2 + valor(1+( n-1 )/2) = valor(2) + valor(3) = 3 + 4
  9.  
  10. else <== n impar
  11.  
  12. i = posicion: 0 1 2 3 4
  13. valor:        1 2 3 4 5
  14. posicion media = ( n-1 )/2 =  2 .
  15. valor del medio = valor( n-1 )/2 = valor(2)= 3
  16.  

¡¡¡¡ 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
  1. for (si i = 0 es menor que dos, incremeta)
  2.   if (n % 2 == 0) es par
  3.    media += a la suma de los dos intermedio = valor[(n-i)/2]
  4.   else es impar
  5.    media = numero de elementos dividido por dos = n /2
  6.   if (n % 2 == 0) si es par, sacar media apartir de la suma de los intermedios
  7.    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
  1.  std::vector< int > lista;
  2.  
  3.  lista.push_back( 1 );
  4.  lista.push_back( 2 );
  5.  lista.push_back( 3 );
  6.  lista.push_back( 4 );
  7.  lista.push_back( 5 );
  8.  lista.push_back( 6 );
  9.  
  10.  auto it = lista.begin( ) + std::distance( lista.begin( ), lista.end( ) ) / 2;
  11.  
  12.  if ( lista.size( ) % 2 == 0 )
  13.    std::cout << *(it - 1) << " ";
  14.  std::cout << *it;
  15.  

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
  1.  std::set< int > lista;
  2.  
  3.  lista.push_back( 5 );
  4.  lista.push_back( 1 );
  5.  lista.push_back( 4 );
  6.  lista.push_back( 3 );
  7.  lista.push_back( 6 );
  8.  lista.push_back( 2 );
  9.  
  10.  // Aqui se imprimen ya ordenados
  11.  for ( auto it = lista.begin( ); it != lista.end( ); ++it )
  12.    std::cout << *it << std::endl;
  13.  
  14.  // Y si el orden que quieres es de mayor a menor...
  15.  for ( auto it = lista.rbegin( ); it != lista.rend( ); ++it )
  16.    std::cout << *it << std::endl;
  17.