Ejemplos Prácticos de Código C: Vectores, Conversiones y Lógica de Programación

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 11,36 KB

Operaciones con Vectores en C: Búsqueda y Ordenación

Este primer bloque de código ilustra funciones básicas para manipular vectores (arrays) en C, incluyendo la búsqueda de elementos y la ordenación.

#include <stdio.h>
#include <time.h>

Función buscar

Esta función busca un número específico dentro de un rango de un vector.

int buscar(int vector[], int numero, int inicio, int fin)
{
    int i;

    // Recorremos el vector
    for (i = inicio; i < fin; ++i)
    {
        if (numero == vector[i]) // Lo hemos encontrado
            return 1; // Indica que el número fue encontrado
    }

    return 0; // Indica que el número no fue encontrado
}

Función ordenar

El objetivo es diseñar una función, ordenar, que ordene de menor a mayor los valores de un vector entre las posiciones inicial y final que se le pasan por parámetros.

Descripción de la Función ordenar:

  • Recibe:
    • Un vector de enteros que se va a ordenar.
    • Las posiciones inicio y fin que delimitan la sección del vector a ordenar.
  • Devuelve:

    Esta función es de tipo void, por lo que no devuelve un valor explícito. Modifica directamente el vector pasado como argumento.

void ordenar(int vector[], int inicio, int fin)
{
    int i, j, temp;
    // Bucle externo para recorrer el vector
    for (i = inicio; i < fin; i++)
    {
        // Bucle interno para comparaciones y swaps
        for (j = i + 1; j <= fin; j++) // Corrección: j debería ser < fin si fin es el límite superior no inclusivo, o <= fin-1. Asumiendo que 'fin' es el índice del último elemento a considerar o uno más allá.
        {
            // Si el elemento actual es mayor que el siguiente, intercambiarlos
            if (vector[i] > vector[j])
            {
                temp = vector[i];
                vector[i] = vector[j];
                vector[j] = temp;
            }
        }
    }
}

Funciones de Prueba (Originalmente Comentadas)

Nota: Las siguientes funciones estaban comentadas en el código original y se presentan aquí para mantener la integridad del documento. Su funcionalidad se describe brevemente.

/*
// Función para generar una apuesta ganadora (números aleatorios sin repetir)
void apuestaGanadora(int vector[], int ini, int fin)
{
    srand(time(NULL)); // Inicializar semilla para números aleatorios
    int numaleatorio;
    int i; // Declaración de i que faltaba en el original
    for (i = 0; i < 7; i++) // Asumiendo que el vector tiene al menos 7 posiciones para los números principales
    {
        numaleatorio = (rand() % 49) + 1; // Genera número entre 1 y 49
        int busca = buscar(vector, numaleatorio, 0, i); // Busca si ya existe hasta la posición actual 'i'

        // Mientras que el número aleatorio generado esté en el vector ==> Generamos otro número
        while (busca == 1)
        {
            numaleatorio = (rand() % 49) + 1;
            busca = buscar(vector, numaleatorio, 0, i);
        }

        vector[i] = numaleatorio; // Metemos el número aleatorio no repetido en la posición en la que estamos
    }

    // Generamos el reintegro (asumiendo que la posición 7 es para el reintegro)
    numaleatorio = (rand() % 9) + 1; // Genera número entre 1 y 9 para el reintegro
    vector[7] = numaleatorio;
}

// Función para imprimir un vector
void imprimirVector(int vector[], int inicio, int fin) {
    int i;
    printf("[");
    for (i = inicio; i < fin; i++) {
        printf("%d", vector[i]);
        if (i < fin - 1) { // Corregido para no imprimir coma después del último elemento
            printf(", ");
        }
    }
    printf("]\n");
}

// Función principal de prueba
int main()
{
    int vector[8] = {0,0,0,0,0,0,0,0}; // Vector para 7 números + reintegro
    apuestaGanadora(vector, 0, 7); // Generar apuesta para las primeras 7 posiciones (0-6) y reintegro en la 7
    imprimirVector(vector, 0, 8); // Imprimir los 8 elementos
    return 0;
}
*/

Conversión de Unidades de Temperatura en C

Este segundo bloque de código se enfoca en la conversión de temperaturas entre Celsius, Fahrenheit y Kelvin.

#include <stdio.h>
#include <time.h>  // time.h podría no ser necesario aquí si no se usa para srand o similar
#include <stdlib.h> // Necesario para system("pause")

Apartado 1: Solicitar Datos de Temperatura

La función solicitarDatos pide al usuario que ingrese una temperatura y su unidad.

// Prototipo de la función para solicitar datos al usuario
void solicitarDatos(float *gr, char *unidad) // Uso de punteros para modificar variables originales
{
    printf("Ingrese la unidad de temperatura (C, F, K): ");
    scanf(" %c", unidad); // Espacio antes de %c para consumir newlines pendientes
    printf("Ingrese la magnitud de la temperatura: ");
    scanf("%f", gr);
}

Apartado 2: Funciones de Conversión de Temperatura

Convertir Celsius a Fahrenheit

float pasargrC_A_grF(float gr)
{
    float resultado; // Declarar la variable para almacenar el resultado
    resultado = gr * 9.0/5.0 + 32.0;
    return resultado;
}

Convertir Fahrenheit a Kelvin

float pasargrF_A_grK(float gr)
{
    float resultado; // Declarar la variable para almacenar el resultado
    resultado = (gr - 32.0) * 5.0/9.0 + 273.15;
    return resultado;
}

Convertir Kelvin a Celsius

float pasargrK_A_grC(float gr)
{
    float resultado; // Declarar la variable para almacenar el resultado
    resultado = gr - 273.15; // Fórmula corregida para K a C
    return resultado;
}

Función Principal (main) para Conversiones

int main()
{
    // Nota importante: Cuando se llama a una función que espera punteros para modificar variables,
    // se pasan las direcciones de memoria de dichas variables (usando &).
    float gr;
    char unidad;

    solicitarDatos(&gr, &unidad); // Se pasan las direcciones para que la función modifique 'gr' y 'unidad'.

    float resultadoKelvin, resultadoCent, resultadoFar;

    // Lógica de conversión basada en la unidad ingresada
    if (unidad == 'F' || unidad == 'f') // Si la unidad es 'F'. Recordar: '==' es comparación, '=' es asignación.
    {
        resultadoFar = gr;
        resultadoKelvin = pasargrF_A_grK(gr);
        resultadoCent = pasargrK_A_grC(resultadoKelvin); // También es correcto: pasargrK_A_grC(pasargrF_A_grK(gr));
    }
    else if (unidad == 'C' || unidad == 'c')
    {
        resultadoCent = gr;
        resultadoFar = pasargrC_A_grF(gr);
        resultadoKelvin = pasargrF_A_grK(resultadoFar);
    }
    else if (unidad == 'K' || unidad == 'k')
    {
        resultadoKelvin = gr;
        resultadoCent = pasargrK_A_grC(gr);
        resultadoFar = pasargrC_A_grF(resultadoCent);
    }
    else
    {
        printf("Unidad no reconocida.\n");
        return 1; // Terminar con error si la unidad no es válida
    }

    printf("\nLos valores convertidos son:\n");
    printf("En Celsius: %.2f °C\n", resultadoCent);
    printf("En Fahrenheit: %.2f °F\n", resultadoFar);
    printf("En Kelvin: %.2f K\n", resultadoKelvin);

    system("pause"); // Pausa la ejecución en sistemas Windows para ver la salida
    return 0;
}

Cálculo de Multas por Exceso de Velocidad en C

Este tercer bloque de código presenta un programa para calcular la cuantía total de las multas de tráfico basadas en las velocidades registradas de varios vehículos.

#include <stdio.h>
#define N 1000 // Suponemos que como máximo habrá 1000 coches

Se almacenan las velocidades en un vector. Por ejemplo: v = {90, 114, 180, ...}. El número de vehículos que introducirá el usuario fijará el tamaño efectivo del vector (hasta un máximo de N).

Función cuantiaMultas

Objetivo: Calcular la cuantía total de las multas.

Recibe: Un vector de enteros v[] con las velocidades y el número de coches numcoches.

Devuelve: La cuantía total de las multas (entero).

int cuantiaMultas(int v[], int numcoches)
{  
    int i;
    int cuantiaTotal = 0;
    for (i = 0; i < numcoches; i++)
    {
        if (v[i] > 90 && v[i] <= 110)     // Multa de 100€: velocidad entre 91 y 110 km/h (inclusive)
            cuantiaTotal = cuantiaTotal + 100;
        
        else if (v[i] > 110 && v[i] <= 120) // Multa de 300€: velocidad entre 111 y 120 km/h
            cuantiaTotal = cuantiaTotal + 300; 
        
        else if (v[i] > 120 && v[i] <= 140) // Multa de 400€: velocidad entre 121 y 140 km/h
            cuantiaTotal = cuantiaTotal + 400; 
        
        else if (v[i] > 140 && v[i] <= 160) // Multa de 500€: velocidad entre 141 y 160 km/h
            cuantiaTotal = cuantiaTotal + 500; 
        
        else if (v[i] > 160)                // Multa de 600€: velocidad superior a 160 km/h
            cuantiaTotal = cuantiaTotal + 600; 
    }
    return cuantiaTotal;
}

Función leerDatos

Objetivo: Leer el número de coches y sus respectivas velocidades.

Recibe: Un vector de enteros v[] donde se almacenarán las velocidades.

Devuelve: El número de coches introducido por el usuario (entero).

int leerDatos(int v[])
{  
    int numcoches;
    printf("Introduce el número de coches (máximo %d): ", N);
    scanf("%i", &numcoches);

    // Validar que numcoches no exceda N
    if (numcoches > N) {
        printf("El número de coches excede el máximo permitido (%d). Se limitará a %d.\n", N, N);
        numcoches = N;
    } else if (numcoches < 0) {
        printf("El número de coches no puede ser negativo. Se establecerá a 0.\n");
        numcoches = 0;
    }

    int i;
    for (i = 0; i < numcoches; i++)
    {
        printf("Introduce la velocidad del coche %i (km/h): ", i + 1); // i+1 para numeración amigable
        scanf("%i", &v[i]);
    }
    return numcoches;
}

Función Principal (main) para Cálculo de Multas

// Ejemplo de vector después de la entrada: v = {velocidad1, velocidad2, ...}
int main()
{
    int v[N]; // Declaración del vector de velocidades.
    
    // Llamamos a leerDatos para que rellene el vector v y nos devuelva el número de coches.
    int numcoches = leerDatos(v); // Ahora numcoches contiene el valor devuelto por leerDatos, y el vector v está relleno.
    
    int cuantiamulta;
    if (numcoches > 0) {
        cuantiamulta = cuantiaMultas(v, numcoches);
        printf("Cuantía Total de Multas: %i €\n", cuantiamulta);
    } else {
        printf("No se introdujeron datos de coches para calcular multas.\n");
    }
    
    return 0;
}

Entradas relacionadas: