Pasar a Mayúscula o Minúscula un caracter en C

Más ejercicios resueltos

Si deseas revisar más ejercicios resueltos, haz click en el siguiente botón. 

A continuación presentamos la solución al problema de la conversión de un caracter de minúscula a mayúscula y viceversa en ANSI C. Si deseas ver el enunciado del problema, haz click en el siguiente enlace.

Transformación de minúscula a mayúscula

El proceso de pasar un caracter de minúscula a mayúscula y viceversa es muy simple de realizar, básicamente es un par de líneas de código. Pero no es necesariamente fácil de entender. Explicaremos a continuación, todo lo que tienes que saber para que entiendas este problema.

Lo primero que tienes que saber es que la representación de un caracter sigue la representación en la tabla de códigos ASCII (American Standard Code for Information Interchange) extendida. Esto significa que internamente cada caracter se representa por un número cuya magnitud está mapeada en esta tabla. Por ejemplo, el caracter \texttt{S} se representa internamente a través del código 83. Mientras que el caracter \texttt{s} se representa internamente a través del código 115. Esto significa que los caracteres \texttt{S} y \texttt{s} son diferentes pues su representación interna es diferente. 

Otro asunto que es importante mencionar es que los caracteres del alfabeto inglés se encuentra de forma contigua. Es decir luego del caracter \texttt{A} se encuentra el \texttt{B} luego la \texttt{C} y así sucesivamente hasta el caracter \texttt{Z}. De igual manera pasa con los caracteres en minúsculas. 

Entonces, podemos asumir que cuando trabajamos con un caracter, internamente estamos trabajando con un número. Entonces el problema de pasar un caracter de mayúscula a minúscula se transforma en un problema de desplazamiento de un número.

El programa a seguir realiza la transformación de minúscula a mayúscula. Primero realiza un filtro a través de una selectiva simple para que no hagamos la transformación a mayúscula cuando el caracter no está en minúscula. La condición de este filtro es \texttt{c >= ‘a’ \&\& c <= ‘z’}.

Luego viene la transformación en sí: \texttt{c = c – ‘a’ + ‘A’}. Esta es en realidad la línea que hay que entender. Primero recordemos que el tipo de dato \texttt{char} en ANSI C es básicamente un número y que \texttt{‘a’} equivale a código de representación del caracter \texttt{a} en la tabla de códigos ASCII extendida. De la mismas manera \texttt{‘A’} equivale a código de representación del caracter \texttt{A} en la tabla de códigos ASCII extendida. No nos interesa en realidad la magnitud de cada código.

El caracter leído se encuentra almacenado en la variable \texttt{c} y sabemos, por el filtro, que contiene un caracter en minúscula. Esto quiere decir que se encuentra en el rango \texttt{[a..z]}. Cuando a \texttt{c} le resto \texttt{‘a’} en realidad lo que se está obteniendo es el orden del caracter en el alfabeto. Si \texttt{c} contiene \texttt{a} entonces \texttt{c-‘a’}, les retornará \texttt{0}. Si \texttt{c} contiene \texttt{b} entonces \texttt{c-‘a’}, les retornará \texttt{1}. Si \texttt{c} contiene \texttt{c} entonces \texttt{c-‘a’}, les retornará \texttt{2}. Y así sucesivamente.

Si tenemos el orden en el alfabeto, basta que le sumemos el código ASCII de \texttt{A} para hacer la transformación a mayúscula. Si \texttt{c} contiene el caracter \texttt{d}, entonces \texttt{c-‘a’} resultará en \texttt{4}. Si al código ASCCI de  \texttt{A} le sumamos 4, obtendremos el código ASCCI de \texttt{D}. Y es de esta manera que transformamos el caracter de minúscula a mayúscula.««

#include<stdio.h>

int main() {
    char c;
    printf("Ingrese un caracter en minúscula: ");
    scanf("%c", &c);

    if (c >= 'a' && c <= 'z')
        c = c - 'a' + 'A';
    printf("En mayúscula es: %c\n", c);

    return 0;
} 

Transformación de mayúscula a minúscula

La transformación de mayúscula a minúscula sigue la misma lógica. Lo único que cambia es el orden en la tabla de códigos ASCII. El programa que se presenta a continuación realiza la transformación de mayúscula a minúscula. Primero realiza un filtro a través de una selectiva simple para que no hagamos la transformación a minúscula cuando el caracter no está en mayúscula. La condición de este filtro es \texttt{c >= ‘A’ \&\& c <= ‘Z’}.

Luego viene la transformación en sí: \texttt{c = c – ‘A’ + ‘a’}. Al igual que en el caso anterior, esta es en realidad la línea que hay que entender. El caracter leído se encuentra almacenado en la variable \texttt{c} y sabemos, por el filtro, que contiene un caracter en mayúscula. Esto quiere decir que se encuentra en el rango \texttt{[A..Z]}. Cuando a \texttt{c} le resto \texttt{‘A’} en realidad lo que se está obteniendo es el orden del caracter en el alfabeto. Si \texttt{c} contiene \texttt{A} entonces \texttt{c-‘A’}, les retornará \texttt{0}. Si \texttt{c} contiene \texttt{B} entonces \texttt{c-‘A’}, les retornará \texttt{1}. Si \texttt{c} contiene \texttt{C} entonces \texttt{c-‘A’}, les retornará \texttt{2}. Y así sucesivamente.

Si tenemos el orden en el alfabeto, basta que le sumemos el código ASCII de \texttt{a} para hacer la transformación a minúscula. Si \texttt{c} contiene el caracter \texttt{D}, entonces \texttt{c-‘A’} resultará en \texttt{4}. Si al código ASCCI de  \texttt{a} le sumamos 4, obtendremos el código ASCCI de \texttt{d}. Y es de esta manera que transformamos el caracter de mayúscula a minúscula.

#include<stdio.h>

int main() {
    char c;
    printf("Ingrese un caracter en mayúscula: ");
    scanf("%c", &c);

    if (c >= 'A' && c <= 'Z')
        c = c - 'A' + 'a';
    printf("En minúscula es: %c\n", c);

    return 0;
} 

Conclusión

Hemos presentado en este artículo, una propuesta de solución a la conversión de un caracter de mayúscula a minúscula en ANSI C. Se ha utilizado para el control de flujo una estructura selectiva simple. Podrá descargar la solución propuesta en el repositorio GitHub de iterando++ a través del siguiente enlace

Hemos preparado otros artículos adicionales en donde describimos al detalle la implementación de este problema en otros lenguajes de programación. Te invitamos a leer los siguientes artículos de iterando++

Si quieres profundizar en el lenguaje ANSI C, no hay mejor libro que C Programming Language de Brian Kernighan  y Dennis Ritchie. Es un libro clásico escrito por el creador del lenguaje C. Uno de los libros favoritos de los que inician en ANSI C es  C Programming Absolute Beginner’s Guide de Greg Perry y Dean Miller.

Deja una respuesta

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