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;
}
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;
}
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:
#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
#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;
}
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 . . .