mediana en c++

Iniciado por indict, 3 Enero 2013, 12:09 PM

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

indict

Hola
querría hacer un programa que dado un vector me calculara la mediana.
Si el tamaño del vector es impar la mediana es el valor (N+1)/2.
Si el tamaño del vector es par la mediana será el promedio de el término que ocupa el lugar N/2 con el término que ocupa el lugar (N/2)+1; es decir (N/2+((N/2)+1))/2

He intentado hacerlo, si pudierais corregir me. 

#include <iostream>
#include<vector>
using namespace std;

double mediana(vector<int>v, double me){
      int i;
     
       for(i=0;i<v.size();i++){
       if (v.size()%2==0){
                        me=v[i]/2;}
       else {me=(v[i]/2+(v[i+1]))/2;}}
       return me;
       }

int main(){
   
    int n,i,e;
    cout << endl << "Entra el número de elementos del vector...";
    cin >> n;
    vector<int> v(n);
    for(i=1;i<n;i++){
                     cout << "Entra el elemento " << i << " del vector...";
                     cin >> e;
                     v[i] = e;}
    cout <<mediana(v)<<endl;


system ("pause");
return 0;
}

flony

#1
si te fijas a la funcion mediana le pasas dos datos un vector y supongo la mediana (me)  :silbar:....cuando deberia ser el resultado que devuelve....es en la parte de
double mediana(vector<int>v, double me){ y en la parte
cout <<mediana(v)<<endl; solo le pasas un dato
...en realidad ni modificacion ...fijate si anda  ;)
#include <iostream>
#include<vector>
using namespace std;

double mediana(vector<int>v){
      int i;
  double me;
       for(i=0;i<v.size();i++){
       if (v.size()%2==0){
                        me=v[i]/2;}
       else {me=(v[i]/2+(v[i+1]))/2;}}
       return me;
       }

int main(){
   
    int n,i,e;
    cout << endl << "Entra el número de elementos del vector...";
    cin >> n;
    vector<int> v(n);
    for(i=1;i<n;i++){
                     cout << "Entra el elemento " << i << " del vector...";
                     cin >> e;
                     v[i] = e;}
    cout <<mediana(v)<<endl;


system ("pause");
return 0;
}
si un problema no tiene solucion entonces no es un problema...es algo inevitable

rir3760

Como ya te comentaron el segundo parámetro de la función esta de mas ya que ese es su valor de retorno, también deberías pasar el vector por referencia.

El problema se debe a que la división entre dos se debe usar al indicar el indice para así encontrar el elemento (o los dos) al medio. De esta forma:
Código (cpp) [Seleccionar]
#include <vector>
using namespace::std;

// ...

double mediana(vector<int>& v)
{
   vector<int>::size_type i = v.size();
   return i % 2 == 1 ? v[i / 2] : (v[i / 2 - 1] + v[i / 2]) / 2;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

bemone

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <vector>

using namespace std;

int nTamano;
double mediana(vector <int> vector);

int main()
{
   srand ( time(NULL) );
   cout << "Elementos del vector: ";
   cin >> nTamano;

   vector <int> vNumeros (nTamano);
   for(unsigned int i=0; i<nTamano; i++){
       vNumeros[i] = rand() % 50 + 1;
       cout << vNumeros[i] << " ";
   }

   cout << endl << mediana(vNumeros);
   return 0;
}

double mediana(vector <int> vVector){
   double media = 0;
   for(unsigned int i=0; i<vVector.size()-1; i++){
       if(vVector.size()/2 == 0)
           media += vVector[i]/2;
       else
           media += ( vVector[i]/2 + vVector[i+1] )/2;
   }

   return media;
}
Odio los tipos de variable de Windows.

zonahurbana

Me parece que debería haber algo en el programa que asegure que los elementos en el vector avancen conforme una razón.
En ese caso la media sería la correcta . . .
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...