Programa en C para Ordenar y Buscar en Vectores: Burbuja, Inversión y Máximo/Mínimo

Informática6,79 KB

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"};

Descargar

PDF Word HTML