Resumen: obtener la mediana y la media de un arreglo en C. Es decir, obtener el promedio de un arreglo y también el elemento central o el que se encuentra a la mitad de la sucesión.
Para ello vamos a usar arreglos y condicionales sencillas.
La media: promedio
Primero comenzamos con la media, que no es otra cosa que el promedio. Si quieres ver el algoritmo a detalle mira: obtener promedio de arreglo en C.
Lo único que hacemos es recorrer todo el arreglo, ir sumando cada valor y luego dividir la sumatoria entre la longitud.
// Obtener media
int sumatoria = 0;
for (int x = 0; x < longitud; x++) {
sumatoria += arreglo[x];
}
float media = (float) sumatoria / (float) longitud;
Obtener mediana
Para obtener la mediana primero debemos tener el arreglo ordenado de cualquier manera, es decir, ascendente o descendente.
Puedes ordenar el arreglo usando qsort, método de burbuja o quicksort. Aquí usaré qsort
por simplicidad.
Después de tener el arreglo debemos tener su longitud, y saber si es par o impar. En caso de que sea par, debemos obtener los dos elementos del centro y obtener su promedio.
En caso de que sea impar, obtenemos el elemento del centro.
Mediana de arreglo en C
Definimos el arreglo así como otras variables que nos ayudarán a encontrar el elemento medio y la longitud del mismo:
int arreglo[] = {28, 11, 96, 21, 97, 6, 18, 13, 1, 19, 51};
int tamanioElemento = sizeof arreglo[0];
int longitud = sizeof arreglo / tamanioElemento;
Lo ordenamos:
int funcionQueCompara(const void *a, const void *b) {
// Castear a enteros
int aInt = *(int *) a;
int bInt = *(int *) b;
// Al restarlos, se debe obtener un número mayor, menor o igual a 0
// Con esto ordenamos de manera ascendente
return bInt - aInt;
}
qsort(arreglo, longitud, tamanioElemento, funcionQueCompara);
Ahora calculamos la mitad de la longitud del arreglo y dependiendo de si es par o no, obtenemos distintos resultados para la mediana:
int mediana;
// Después vemos si la longitud es par
if (longitud % 2 == 0) {
// Debemos promediar los valores del centro
mediana = (arreglo[mitad - 1] + arreglo[mitad]) / 2;
} else {
mediana = arreglo[mitad];
}
Finalmente la imprimimos junto con el arreglo y el promedio:
printf("Imprimendo arreglo:\n");
for (int x = 0; x < longitud; x++) {
printf("%d ", arreglo[x]);
}
printf("\nMediana: %d", mediana);
printf("\nMedia: %f", media);
Poniendo todo junto
El código completo queda así:
/**
* Obtener media y mediana de arreglo en C
* Media: promedio
* Mediana: el elemento que se encuentra en el centro de una serie ordenada
*
* @author parzibyte
* @see https://parzibyte.me/blog
* */
#include <stdio.h>
#include <stdlib.h>
int funcionQueCompara(const void *a, const void *b) {
// Castear a enteros
int aInt = *(int *) a;
int bInt = *(int *) b;
// Al restarlos, se debe obtener un número mayor, menor o igual a 0
// Con esto ordenamos de manera ascendente
return bInt - aInt;
}
int main(void) {
int arreglo[] = {28, 11, 96, 21, 97, 6, 18, 13, 1, 19, 51};
int tamanioElemento = sizeof arreglo[0];
int longitud = sizeof arreglo / tamanioElemento;
// Obtener media
int sumatoria = 0;
for (int x = 0; x < longitud; x++) {
sumatoria += arreglo[x];
}
float media = (float) sumatoria / (float) longitud;
// Ahora sumatoria
// Primero ordenamos el arreglo
qsort(arreglo, longitud, tamanioElemento, funcionQueCompara);
int mitad = longitud / 2;
int mediana;
// Después vemos si la longitud es par
if (longitud % 2 == 0) {
// Debemos promediar los valores del centro
mediana = (arreglo[mitad - 1] + arreglo[mitad]) / 2;
} else {
mediana = arreglo[mitad];
}
printf("Imprimendo arreglo:\n");
for (int x = 0; x < longitud; x++) {
printf("%d ", arreglo[x]);
}
printf("\nMediana: %d", mediana);
printf("\nMedia: %f", media);
return 0;
}
Al ejecutarlo en mi caso es:
¿Más ejercicios sobre ANSI C? míralos aquí.