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:
En mi blog puedes ver más ejercicios y posts sobre C.