Programa en C para Ordenar y Buscar en Vectores: Burbuja, Inversión y Máximo/Mínimo
Programa en C: Vectores, Ordenación Burbuja y Búsqueda
Programa: ""
Autor: ""
Descripción: ""
Declaración de funciones y librerías
El programa utiliza las librerías stdlib.h, conio2.h, stdio.h y ctype.h, y declara las siguientes funciones: inicio, acerarvector, proceso, cargarvector, escribirvector, calcular, invertir, inverso, pintarinverso, pasadasburbuja, pintarburbuja, buscarvector, fin, panta1 y pantafin.
Función principal
La función main inicializa el vector y el contador de elementos, llama a inicio y ejecuta proceso mientras sw_fin sea 0. Al finalizar llama a fin.
int main(void)
{
int vector[98];
int numv = 0, sw_fin = 0;
inicio(&numv, &sw_fin, vector);
while (sw_fin == 0)
proceso(&numv, &sw_fin, vector);
fin();
}Inicialización y carga de datos
La función inicio pone a cero el vector mediante acerarvector, muestra la pantalla inicial con panta1 y solicita el número de elementos (entre 0 y 99). Si el valor introducido es 99, se activa sw_fin para finalizar el programa; en otro caso, escribe las etiquetas del vector con escribirvector.
La función cargarvector solicita al usuario los valores del vector, cada uno en el rango de 0 a 999.
Proceso principal
La función proceso realiza las siguientes operaciones en orden:
- Carga los valores con cargarvector.
- Permite buscar valores con buscarvector.
- Invierte el vector mediante invertir, que usa inverso y pintarinverso.
- Ordena el vector con el método de la burbuja (pasadasburbuja) y lo muestra con pintarburbuja.
- Vuelve a solicitar datos con inicio.
Algoritmo de ordenación burbuja
La función pasadasburbuja compara pares de elementos consecutivos e intercambia aquellos que están desordenados. Repite el recorrido hasta que el vector queda ordenado de menor a mayor.
Búsqueda de valores
La función buscarvector solicita un valor a buscar y recorre el vector. Si lo encuentra, muestra su posición (empezando en 1); en caso contrario, muestra el mensaje NO EXISTE. El proceso termina al introducir el valor 99.
Inversión de un vector
La función inverso intercambia los elementos de los extremos hacia el centro, invirtiendo el orden del vector. pintarinverso muestra el resultado en pantalla.
Finalización del programa
La función fin limpia la pantalla, llama a pantafin para mostrar el mensaje de cierre con el copyright y finaliza la ejecución con exit(0).
Unión de programas
Esta sección integra dos funcionalidades mediante un menú de opciones:
int main(void)
{
int sw_fin = 0, opc = 0;
inicio(&opc, &sw_fin);
while (sw_fin == 0)
proceso(&opc, &sw_fin);
fin();
}
void inicio(int *opc, int *sw_fin)
{
panta1();
pediropcion(opc);
if (*opc == 9)
*sw_fin = 1;
}
void proceso(int *opc, int *sw_fin)
{
if (*opc == 1)
leydeohm();
else
sumadosnumeros();
inicio(opc, sw_fin);
}
void pediropcion(int *opc)
{
do {
gotoxy(47, 14);
clreol();
scanf("%d", opc);
} while (*opc < 1 || *opc > 2 && *opc != 9);
}La función pediropcion solicita una opción entre 1 y 2, o el valor 9 para salir. Según la opción elegida, proceso ejecuta leydeohm (ley de Ohm) o sumadosnumeros (suma de dos números).
Funciones de ley de Ohm y suma
void leydeohm()
{
int sw_fin = 0, inten = 0;
iniciohm(&inten, &sw_fin);
while (sw_fin == 0)
procesohm(&inten, &sw_fin);
}
void sumadosnumeros()
{
int num1 = 0, sw_fin = 0;
iniciosum(&num1, &sw_fin);
while (sw_fin == 0)
procesosum(&num1, &sw_fin);
}Máximo y mínimo
La función calcular recibe el número de elementos, un vector y devuelve, mediante punteros, la suma de los valores (acumv), la posición del máximo (elemax) y el valor mínimo (min). Recorre el vector comparando cada elemento para determinar el máximo y el mínimo, y acumula la suma total.
void calcular(int *numv, int *acumv, int vector[98], int *elemax, int *min)
{
int max = 0, n = 0;
for (n = 0, max = 0, *min = 999, *acumv = 0, *elemax = 0; n < *numv; n++) {
*acumv = *acumv + vector[n];
if (vector[n] > max) {
max = vector[n];
*elemax = n + 1;
}
if (vector[n] < *min)
*min = vector[n];
}
}Cálculo sobre litros mensuales
Una segunda versión de calcular trabaja sobre un vector de 12 posiciones con los litros consumidos cada mes. Cuenta los meses sin consumo (contnl), calcula el total acumulado (acuml) e identifica el mes de mayor (mesmax) y menor consumo (mesmin), ignorando los meses con valor 0.
void calcular(int litros[12], int *contnl, int *acuml, int *mesmax, int *mesmin)
{
int cantmax = 0, cantmin = 999, i = 0;
for (i = 0, *acuml = 0, *contnl = 0, *mesmax = 0, *mesmin = 0; i < 12; i++) {
if (litros[i] == 0)
*contnl = *contnl + 1;
else {
if (litros[i] > cantmax) {
cantmax = litros[i];
*mesmax = i;
}
if (litros[i] < cantmin) {
cantmin = litros[i];
*mesmin = i;
}
*acuml = *acuml + litros[i];
}
}
}Nombres de los meses
Se declara el vector de cadenas meses con las abreviaturas de los doce meses del año:
char meses[12][4] = {"ene", "feb", "mar", "abr", "may", "jun", "jul", "ago", "sep", "oct", "nov", "dic"};