Ejercicio de cadenas en ANSI C

C – Ejercicio con cadenas

Hoy vamos a resolver un ejercicio propuesto en C. Se trata del trabajo con cadenas, vamos a solicitar dos cadenas y a partir de ellas hacer determinadas cosas. El problema dice así:

Escribir un programa que solicite dos cadenas que puede contener espacios, el programa deberá:

  • Decir qué cadena es mayor y cuál es menor alfabéticamente
  • Generar una nueva cadena que será la primera cadena leída, con las vocales convertidas a MAYÚSCULAS
  • Generar una nueva cadena que será la segunda cadena leída, con las consonantes convertidas a MAYÚSCULAS
  • Generar una nueva cadena concatenando las dos que ya fueron convertidas
  • Generar una nueva cadena que contenga la cadena concatenada invertida

Al finalizar el programa, este deberá:

  • Imprimir las dos cadenas originales
  • Imprimir las dos cadenas con las conversiones
  • Imprimir la cadena concatenada
  • Imprimir la cadena concatenada invertida

Veamos cómo resolver este problema usando ANSI C.

Solución general

Para escanear cadenas con espacios será necesario el uso de fgets en lugar de scanf.

Leyendo las restricciones vemos que vamos a comparar cadenas, para ello vamos a usar la función strcmp.

Después vemos que vamos a convertir algunas letras a mayúsculas, en el primer caso si son vocales y en el segundo si son consonantes. Para ello usaremos unas funciones que ya expliqué anteriormente.

Luego vamos a crear cadenas, así que necesitamos copiarlas usando strcpy. Para el caso de concatenar, será necesario el uso de strcat.

Finalmente para invertir la cadena vamos a recorrerla cadena de fin a inicio e imprimir cada carácter, ya que el ejercicio no pide que almacenemos el resultado en una cadena distinta, pero si así fuera, ya existe una función para ello.

Al terminar el ejercicio vamos a imprimir todas las cadenas justo como fue solicitado.

Escanear cadenas

Comencemos a resolver las solicitudes. El primer requisito es escanear las cadenas con espacios:

char cadena1[MAXIMA_LONGITUD] = "";
char cadena2[MAXIMA_LONGITUD] = "";
printf("\nIngresa la cadena 1: ");
fgets(cadena1, MAXIMA_LONGITUD, stdin);
cadena1[strcspn(cadena1, "\r\n")] = 0;
printf("\nIngresa la cadena 2: ");
fgets(cadena2, MAXIMA_LONGITUD, stdin);
cadena2[strcspn(cadena2, "\r\n")] = 0;

Decir cuál cadena es mayor

Ahora vamos a usar strcmp para saber cuál cadena es mayor alfabéticamente. Recordemos que strcmp regresa 0 si las cadenas son iguales, un número menor que 0 si la primer cadena es menor que la segunda, y un número mayor que 0 si la primer cadena es mayor que la segunda.

// Decir cuál es mayor y cuál es menor
int resultado = strcmp(cadena1, cadena2);
if (resultado >= 0)
{
    printf("Mayor: '%s'. Menor: '%s'\n", cadena1, cadena2);
}
else
{
    printf("Mayor: '%s'. Menor: '%s'\n", cadena2, cadena1);
}

Convirtiendo consonantes y vocales

Llega el turno del siguiente paso, el cual es convertir las vocales de la primera cadena en mayúsculas, y las consonantes de la segunda igualmente en mayúsculas.

Lo primero que tenemos que hacer es copiar las cadenas, después recorrerlas e ir modificando el carácter si es que es necesario. El código queda así:

// Cadena 1 con vocales mayúsculas
char cadena1VocalesMayusculas[MAXIMA_LONGITUD] = "";
strcpy(cadena1VocalesMayusculas, cadena1);
int i = 0;
for (i = 0; i < strlen(cadena1VocalesMayusculas); i++)
{
    char letraActual = cadena1VocalesMayusculas[i];
    if (esVocal(letraActual))
    {
        letraActual = toupper(letraActual);
    }
    cadena1VocalesMayusculas[i] = letraActual;
}
// Cadena 2 con consonantes mayúsculas
char cadena2ConsonantesMayusculas[MAXIMA_LONGITUD] = "";
strcpy(cadena2ConsonantesMayusculas, cadena2);
for (i = 0; i < strlen(cadena2ConsonantesMayusculas); i++)
{
    char letraActual = cadena2ConsonantesMayusculas[i];
    if (esConsonante(letraActual))
    {
        letraActual = toupper(letraActual);
    }
    cadena2ConsonantesMayusculas[i] = letraActual;
}

Concatenar cadenas

Ya casi terminamos. Ahora vamos a hacer el siguiente paso del ejercicio y es concatenar las cadenas modificadas. Eso lo hacemos con strcat y queda así:

// Cadena concatenando las dos anteriores
// Nota: asegúrate de que la longitud alcance
char cadenaConcatenada[MAXIMA_LONGITUD] = "";
strcat(cadenaConcatenada, cadena1VocalesMayusculas);
strcat(cadenaConcatenada, " ");
strcat(cadenaConcatenada, cadena2ConsonantesMayusculas);

Imprimir cadena invertida

El último requisito es imprimir la cadena concatenada anteriormente pero de manera invertida. Para ello hacemos lo siguiente:

printf("Cadena concatenada invertida: '");
for (i = strlen(cadenaConcatenada) - 1; i >= 0; i--)
{
    printf("%c", cadenaConcatenada[i]);
}
printf("'\n");

Poniendo todo junto

Ahora veamos el código completo que solicita ambas cadenas al usuario e imprime todo lo solicitado. Queda así:

/*
    https://parzibyte.me/blog
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAXIMA_LONGITUD 100

int esVocal(char letra)
{
    // Convertir para simplificar comparaciones
    char letraMinuscula = tolower(letra);
    char vocales[] = "aeiou";
    // Recorrer las vocales y comparar si la letra es una de ellas
    int i;
    for (i = 0; vocales[i]; i++)
    {
        if (letraMinuscula == vocales[i])
        {
            return 1;
        }
    }
    // Si terminamos de recorrer y no regresamos true dentro del for, entonces no es vocal
    return 0;
}

int esConsonante(char letra)
{
    return isalpha(letra) && !esVocal(letra);
}
int main(int argc, char const *argv[])
{
    char cadena1[MAXIMA_LONGITUD] = "";
    char cadena2[MAXIMA_LONGITUD] = "";
    printf("\nIngresa la cadena 1: ");
    fgets(cadena1, MAXIMA_LONGITUD, stdin);
    cadena1[strcspn(cadena1, "\r\n")] = 0;
    printf("\nIngresa la cadena 2: ");
    fgets(cadena2, MAXIMA_LONGITUD, stdin);
    cadena2[strcspn(cadena2, "\r\n")] = 0;
    // Decir cuál es mayor y cuál es menor
    int resultado = strcmp(cadena1, cadena2);
    if (resultado >= 0)
    {
        printf("Mayor: '%s'. Menor: '%s'\n", cadena1, cadena2);
    }
    else
    {
        printf("Mayor: '%s'. Menor: '%s'\n", cadena2, cadena1);
    }
    // Cadena 1 con vocales mayúsculas
    char cadena1VocalesMayusculas[MAXIMA_LONGITUD] = "";
    strcpy(cadena1VocalesMayusculas, cadena1);
    int i = 0;
    for (i = 0; i < strlen(cadena1VocalesMayusculas); i++)
    {
        char letraActual = cadena1VocalesMayusculas[i];
        if (esVocal(letraActual))
        {
            letraActual = toupper(letraActual);
        }
        cadena1VocalesMayusculas[i] = letraActual;
    }
    // Cadena 2 con consonantes mayúsculas
    char cadena2ConsonantesMayusculas[MAXIMA_LONGITUD] = "";
    strcpy(cadena2ConsonantesMayusculas, cadena2);
    for (i = 0; i < strlen(cadena2ConsonantesMayusculas); i++)
    {
        char letraActual = cadena2ConsonantesMayusculas[i];
        if (esConsonante(letraActual))
        {
            letraActual = toupper(letraActual);
        }
        cadena2ConsonantesMayusculas[i] = letraActual;
    }
    // Cadena concatenando las dos anteriores
    // Nota: asegúrate de que la longitud alcance
    char cadenaConcatenada[MAXIMA_LONGITUD] = "";
    strcat(cadenaConcatenada, cadena1VocalesMayusculas);
    strcat(cadenaConcatenada, " ");
    strcat(cadenaConcatenada, cadena2ConsonantesMayusculas);
    // Resultados
    printf("Cadena 1: '%s'\n", cadena1);
    printf("Cadena 2: '%s'\n", cadena2);
    printf("Cadena 1 con vocales mayúsculas: '%s'\n", cadena1VocalesMayusculas);
    printf("Cadena 2 con consonantes mayúsculas: '%s'\n", cadena2ConsonantesMayusculas);
    printf("Cadena concatenada: '%s'\n", cadenaConcatenada);
    printf("Cadena concatenada invertida: '");
    for (i = strlen(cadenaConcatenada) - 1; i >= 0; i--)
    {
        printf("%c", cadenaConcatenada[i]);
    }
    printf("'\n");
    return 0;
}

Al ejecutarlo, la salida es correcta:

Ejercicio de cadenas en ANSI C
Ejercicio de cadenas en ANSI C

En mi blog puedes ver más ejercicios y posts sobre C.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *