Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: indict en 3 Enero 2013, 12:09 pm



Título: mediana en c++
Publicado por: indict en 3 Enero 2013, 12:09 pm
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. 

Código:
#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;
}


Título: Re: mediana en c++
Publicado por: flony en 3 Enero 2013, 14:00 pm
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
Código:
double mediana(vector<int>v, double me){
y en la parte
Código:
cout <<mediana(v)<<endl;
solo le pasas un dato
...en realidad ni modificacion ...fijate si anda  ;)
Código:
#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;
}


Título: Re: mediana en c++
Publicado por: rir3760 en 3 Enero 2013, 16:20 pm
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
  1. #include <vector>
  2. using namespace::std;
  3.  
  4. // ...
  5.  
  6. double mediana(vector<int>& v)
  7. {
  8.   vector<int>::size_type i = v.size();
  9.   return i % 2 == 1 ? v[i / 2] : (v[i / 2 - 1] + v[i / 2]) / 2;
  10. }

Un saludo


Título: Re: mediana en c++
Publicado por: bemone en 3 Enero 2013, 17:32 pm
Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. int nTamano;
  9. double mediana(vector <int> vector);
  10.  
  11. int main()
  12. {
  13.    srand ( time(NULL) );
  14.    cout << "Elementos del vector: ";
  15.    cin >> nTamano;
  16.  
  17.    vector <int> vNumeros (nTamano);
  18.    for(unsigned int i=0; i<nTamano; i++){
  19.        vNumeros[i] = rand() % 50 + 1;
  20.        cout << vNumeros[i] << " ";
  21.    }
  22.  
  23.    cout << endl << mediana(vNumeros);
  24.    return 0;
  25. }
  26.  
  27. double mediana(vector <int> vVector){
  28.    double media = 0;
  29.    for(unsigned int i=0; i<vVector.size()-1; i++){
  30.        if(vVector.size()/2 == 0)
  31.            media += vVector[i]/2;
  32.        else
  33.            media += ( vVector[i]/2 + vVector[i+1] )/2;
  34.    }
  35.  
  36.    return media;
  37. }
  38.  


Título: Re: mediana en c++
Publicado por: zonahurbana en 3 Enero 2013, 18:42 pm
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 . . .