Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dabaji en 7 Septiembre 2012, 17:00 pm



Título: [duda] invocacion de una funcion
Publicado por: dabaji en 7 Septiembre 2012, 17:00 pm
Hola tengo una duda tengo que hacer un programa que imprima arreglos ordenados de menor a mayor y que busque el numero de la mitad del arreglo(eso se llamaria mediana) el programa lo tengo casi hecho:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N 11


void arreglo (int arr[N])
{
    for (int i=0; i<N; i++)
        arr = rand()%100;

}


void imprimirArreglo(int arr[N])
{
    for(int i=0; i<N; i++){

        printf("[%d] : %d", i, arr);
        printf("\n");
       }
}
void ordenadoMenoraMayor(int arr[N]){

    printf("Tabla ordenada menor a mayor:\n");
    int ordenados,ordmin=0,temp=0;
    for(ordenados=0;ordenados<N-1;ordenados++){
        ordmin=ordenados;
        for(int j=ordenados+1;j<N;j++){
            if (arr[j]<arr[ordmin])
                ordmin=j;
        }
        temp=arr[ordmin];
        arr[ordmin]=arr[ordenados];
        arr[ordenados]=temp;

    }
}

int buscarMediana(int mediana, int arr[N])
{
    mediana = N/2; //la mitad

    for (int i=0;i<N;i++)
        if (arr==mediana){
            printf ("Mediana es: %d", mediana);
        }
return mediana;

}

int main()
{

 int mediana;
 int tabla[N];
arreglo(tabla);
ordenadoMenoraMayor(tabla);
imprimirArreglo(tabla);
buscarMediana(mediana);



return 0;

}


el tema que no se como invocar en el main la funcion "buscarMediana" o por ahi me falta algo de esta funcion...
Gracias!


Título: Re: [duda] invocacion de una funcion
Publicado por: apoeti en 7 Septiembre 2012, 18:34 pm
Lo he revisado un poco por encima, pero creo que el problema está en que al invocar a la función le pasas un solo argumento y requiere dos. Mira a ver si así se soluciona.

Edito: Aparte de eso, te falta la presentación de la función antes de la definición. Es decir, colocar esta línea:

int buscarMediana(int mediana, int arr[N]);

Fíjate en que solo se diferencia de la de tu definición de que tiene un punto y coma al final.

También te falta la presentación del resto de funciones.
Y un consejillo, suele ser mejor poner las definiciones de las funciones después de main y las líneas de presentación antes de esta.

No sé si irá porque lo he revisado muy por encima, pero mira  a ver.

Saludos.


Título: Re: [duda] invocacion de una funcion
Publicado por: ecfisa en 7 Septiembre 2012, 22:41 pm
Hola dabaji.

La media aritmética, aunque puede tomar valores enteros, por lo regular es un número real, la funcion mediana tendría que devolver ese tipo.
La mediana resulta de sumar los elementos de una serie y dividirlos por la cantidad de elementos que la componen.
Entonces tu función debería ser algo como:

Código
  1. float mediana(int vec[N]) {
  2.  float m=0;
  3.  for(int i=0; i<N; i++) m += vec[i];
  4.  return m/N;
  5. }
  6.  

Saludos.


Título: Re: [duda] invocacion de una funcion
Publicado por: xiruko en 8 Septiembre 2012, 05:17 am
Citar
La media aritmética, aunque puede tomar valores enteros, por lo regular es un número real, la funcion mediana tendría que devolver ese tipo.
La mediana resulta de sumar los elementos de una serie y dividirlos por la cantidad de elementos que la componen.

diria que la media aritmetica es la suma de todos los numeros divididos por el total de ellos; y la mediana es el numero central que queda al ordenar todos los numeros. por ejemplo: 1 1 3 4 5 5 6 6 8 9 9, o si es 1 1 3 4 5 5 6 6 8 9 9 12 entonces se hace la meda aritmetica entre los dos centrales: 5.5

http://es.wikipedia.org/wiki/Mediana_%28estad%C3%ADstica%29 (http://es.wikipedia.org/wiki/Mediana_%28estad%C3%ADstica%29)

Citar
Hola tengo una duda tengo que hacer un programa que imprima arreglos ordenados de menor a mayor y que busque el numero de la mitad del arreglo(eso se llamaria mediana)

a parte de los errores que ya te han dicho, tu funcion mediana() diria que no esta del todo bien. como he dicho arriba, la mediana es el numero central que queda, no el total de numeros entre 2. si fuera como tu funcion, imagina el caso de los numeros 1 2 5 6 9. tu programa devolveria 5/2=2.5, cuando en realidad la mediana es 5. o en el caso de que el numero de enteros sea par, tendras que hacer la media aritmetica de los 2 numeros centrales, por lo que puede ser que la mediana no sea un numero entero y por lo tanto la funcion debe devolver un real (float). ademas seria mejor que le pasaras un puntero a la cadena de enteros en lugar de la cadena entera (asi ahorras espacio), y no hace falta pasarle como argumento "mediana" ya que eso es precisamente lo que calcula. en el caso de que lo hagas asi, tambien deberias pasarle el tamaño del arreglo como argumento (podrias calcularlo dentro pero asi es mas rapido y mas facil). en fin, quedaria de la siguiente manera:

Código
  1. float BuscarMediana(int *arreglo, int tNum) {
  2.  
  3. (tNum%2 > 0)? return ((float)arreglo[tNum/2]): return ((float)(arreglo[tNum]+arreglo[tNum-1])/2.0);
  4. }

y desde el main deberias llamarla asi:

Código
  1. float mediana=BuscarMediana(tabla, N);
  2. printf("La mediana es: %.2f\n", mediana);

espero que te sirva de ayuda, un saludo!


Título: Re: [duda] invocacion de una funcion
Publicado por: eleon en 8 Septiembre 2012, 13:57 pm
Mediana: Elemento que deja a izquierda y derecha el 50% de las observaciones ordenadas.
N: Cantidad de elementos que componen nuestra serie.


La fórmula no es N/2 sino (N+1)/2 y NO NOS DA LA MEDIANA, lo que nos da es su posición, por ejemplo:

Caso en el cual N es un número impar:

Serie: 1, 3, 6, 8, 12 -> N = 5

Por tanto (N+1)/2 = 3, lo cual quiere decir que el tercer elemento de nuestra serie es la mediana, es decir, MEDIANA = 6.

Caso en el cual N es un número par:

Serie: 1, 8, 13, 22, 24, 27 -> N = 6

Por tanto (N+1)/2 = 3.5, pero no existe ningún elemento en la posición 3.5, lo que hacemos aqui es la media entre el elemento que está en la posición 3 y el que está en la posición 4 -> MEDIANA = 17.5

Como podrás ver la función con la cual calculas la mediana no tiene nada que ver con la mediana real, inténtalo de nuevo y si no das con la tecla postea hasta donde hayas llegado y te indico.

Saludos.