13 - Tipo de dato char


Hasta ahora hemos utilizado variables de tipo entera (int) y real (float)

Utilizar un tipo de dato adecuado hace más eficiente a nuestro programa, no es adecuado definir siempre variables de tipo float aunque en estas también pueden almacenarse un entero.

Veremos ahora un tercer tipo de dato llamado char.

En una variable de tipo char podemos almacenar un valor entero comprendido entre -128 y 127.

Los valores enteros positivos de las variables de tipo char están relacionadas con la tabla de caracteres ASCII:

ASCII Valor
0     NUL 
1
2
3
4
5
6
7
8
9     TAB
10    LF
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32    Tecla espaciadora
33    !
34    "
35    #
36    $
37    %
38    &
39    '
40    (
41    )
42    *
43    +
44    ,
45    -
46    .
47    /
48    0
49    1
50    2
51    3
52    4
53    5
54    6
55    7
56    8
57    9
58    :
59    ;
60    %lt;
61    =
62    >
63    ?
64    @
65    A
66    B
67    C
68    D
69    E
70    F
71    G
72    H
73    I
74    J
75    K
76    L
77    M
78    N
79    O
80    P
81    Q
82    R
83    S
84    T
85    U
86    V
87    W
88    X
89    Y
90    Z
91    [
92    \
93    ] 
94    ^
95    _
96    `
97    a
98    b
99    c
100   d 
101   e
102   f
103   g
104   h
105   i
106   j
107   k
108   l
109   m
110   n
111   o
112   p
113   q
114   r
115   s
116   t
117   u
118   v
119   w
120   x
121   y
122   z
123   {
124   |
125   }
126   ~
127   

Si en una variable char almacenamos el valor entero 65 luego podemos imprimir dicho valor como caracter y si vemos en la tabla ASCII dicho valor está asociado al caracter 'A'.

En el lenguaje C una variable char es similar a una variable int pero con la salvedad que puede almacenar un valor entero más chico (en el rango de -128 a 127)

Problema 1:

Definir tres variables de tipo char y cargar dos por asignación y la tercera por teclado. Imprimir los valores de las mismas.

Programa: programa64.c

#include<stdio.h>

int main()
{
    char letra1=65;
    char letra2='A';
    char letra3;
    printf("Ingrese un caracter:");
    scanf(" %c",&letra3);
    printf("%c",letra1);
    printf("\n");
    printf("%c",letra2);
    printf("\n");
    printf("%c",letra3);
    printf("\n");
    getch();
    return 0;
}

Una variable char podemos asignarle directamente un entero comprendido entre -128 y 127:

    char letra1=65;

Luego si imprimimos indicando en la función printf que se trata de un caracter %c lo que se obtiene es el valor para dicho caracter ASCII, es decir la letra A:

    printf("%c",letra1);

También es muy común asignar el valor del caracter ASCII, así nuestro programa queda más fácil de leer:

    char letra2='A';

Como podemos ver cuando asignamos el valor del caracter ASCII debemos encerrarlo entre comillas simples.

En nuestro ejemplo hemos guardado en las variables letra1 y letra2 el mismo valor (utilizando dos formas distintas):

    char letra1=65;
    char letra2='A';

Para la carga de un valor de tipo char por teclado empleamos la función scanf y en el primer parámetro indicamos en la cadena de formato que se trata de un caracter el dato a ingresar " %c" y será fundamental agregar un espacio en blanco previo al caracter %:

    scanf(" %c",&letra3);

No olvidar el caracter & previo a indicar el nombre de la variable a cargar (veremos más adelante que con esa sintaxis indicamos que le pasamos la dirección de memoria donde se almacena la variable), el no disponer el & generará un error en tiempo de ejecución de nuestro programa.

Problema 2:

Confeccionar un programa que permita la carga de valores enteros por teclado. Luego de ingresar el valor mostrar un mensaje por pantalla que pida confirmar al usuario si desea cargar otro valor ingresando los caracteres 's' o 'n'. Mostrar al final la suma de los valores ingresados.

Programa: programa65.c

#include<stdio.h>

int main()
{
    int suma=0;
    int valor;
    char continua;
    do {
        printf("Ingrese un valor entero:");
        scanf("%i",&valor);
        suma=suma+valor;
        printf("Desea cargar otro valor [s/n]:");
        scanf(" %c",&continua);
    } while(continua=='s');
    printf("La suma de todos los valores ingresados es:");
    printf("%i",suma);
    getch();
    return 0;
}

Definimos un acumulador llamado suma que lo iniciamos en el mismo momento que lo definimos:

    int suma=0;

Por otro lado definimos una variable llamada "continua" que almacenará la respuesta del operado indicando si desea cargar otro valor:

    char continua;

Conviene utilizar un do/while ya que por lo menos un valor se ingresará por teclado:

    do {
        printf("Ingrese un valor entero:");
        scanf("%i",&valor);
        suma=suma+valor;

No olvidar disponer un espacio en blanco previo a %c dentro de la cadena de control de la función scanf (el espacio en blanco libera el valor que queda en el buffer del teclado luego de ingresar el entero):

        printf("Desea cargar otro valor [s/n]:");
        scanf(" %c",&continua);

El operador puede cargar en la variable continua cualquier caracter, pero el ciclo repetitivo se verifica verdadero solo si ingresa la letra 's' minúscula (debe quedar claro que la tabla de caractes ASCII define valores distintos para las mayúsculas y para las minúsculas):

    } while(continua=='s');

Cuando se sale de la estructura repetitiva mostramos el acumulador suma:

    printf("La suma de todos los valores ingresados es:");
    printf("%i",suma);

Problema 3:

Mostrar el abecedario de la 'A' a la 'Z' primero en mayúsculas y luego en minúsculas. Utilizar una variable de tipo char dentro de un for.

Programa: programa66.c

#include<stdio.h>

int main()
{
    char letra;

    for(letra='A';letra<='Z';letra++)
    {
        printf("%c",letra);
        printf("-");
    }
    printf("\n\n");
    for(letra='a';letra<='z';letra++)
    {
        printf("%c",letra);
        printf("-");
    }
    getch();
    return 0;
}

Tener en cuenta que una variable char es idéntica a una variable int con la salvedad que puede tomar valores comprendidos entre -128 y 127.

Podemos sin ningún problema utilizar una variable char en un for e incrementarla con el operador ++ (incrementa en 1 una variable int o char)

Para mostrar el abecedario en mayúsculas iniciamos la variable letra con el primer caracter del abecedario 'A' y cada vuelta del for la incrementamos en 1 a la variable:

    char letra;

    for(letra='A';letra<='Z';letra++)
    {
        printf("%c",letra);
        printf("-");
    }

Por legibilidad iniciamos la variable letra con el valor 'A', un resultado idéntico tendríamos si iniciamos a la variable letra con el valor entero 65:

    for(letra=65;letra<='Z';letra++)
    {
        printf("%c",letra);
        printf("-");
    }

Problemas propuestos

Solución
programa67.c

#include<stdio.h>

int main()
{
    int valor1;
    int valor2;
    char operacion;
    printf("Ingrese primer valor:");
    scanf("%i",&valor1);
    printf("Ingrese segundo valor:");
    scanf("%i",&valor2);
    printf("Que operacion quiere hacer con los valores ingresados [+,-,*,/]:");
    scanf(" %c",&operacion);
    if (operacion=='+')
    {
        int suma=valor1+valor2;
        printf("La suma de los dos valores es:");
        printf("%i",suma);
    }
    else
    {
        if (operacion=='-')
        {
            int resta=valor1-valor2;
            printf("La diferencia de los dos valores es:");
            printf("%i",resta);
        }
        else
        {
            if (operacion=='*')
            {
                int producto=valor1*valor2;
                printf("Producto de los dos valores es:");
                printf("%i",producto);
            }
            else
            {
                if (operacion=='/')
                {
                    int division=valor1/valor2;
                    printf("Division de los dos valores es:");
                    printf("%i",division);
                }
            }
        }
    }
    getch();
    return 0;
}




programa68.c

#include<stdio.h>

int main()
{
    int edad1,edad2;
    char sexo1,sexo2;
    printf("Ingrese edad de la persona:");
    scanf("%i",&edad1);
    printf("Sexo de la persona [m/f]:");
    scanf(" %c",&sexo1);
    printf("Ingrese edad de la persona:");
    scanf("%i",&edad2);
    printf("Sexo de la persona [m/f]:");
    scanf(" %c",&sexo2);
    if (edad1>edad2)
    {
        printf("La edad mayor es:");
        printf("%i",edad1);
        printf("\n");
        if (sexo1=='m')
        {
            printf("sexo:masculino");
        }
        else
        {
            if (sexo1=='f')
            {
                printf("sexo:femenino");
            }
        }
    }
    else
    {
        if (edad2>edad1)
        {
            printf("La edad mayor es:");
            printf("%i",edad2);
            printf("\n");
            if (sexo2=='m')
            {
                printf("sexo:masculino");
            }
            else
            {
                if (sexo2=='f')
                {
                    printf("sexo:femenino");
                }
            }
        }
        else
        {
            printf("Tienen la misma edad.");
        }
    }
    getch();
    return 0;
}




programa69.c

#include<stdio.h>

int main()
{
    int suma=0;
    int valor;
    char continua;
    do {
        printf("Ingrese un valor entero:");
        scanf("%i",&valor);
        suma=suma+valor;
        printf("Desea cargar otro valor [s/n]:");
        scanf(" %c",&continua);
    } while(continua=='s' || continua=='S');
    printf("La suma de todos los valores ingresados es:");
    printf("%i",suma);
    getch();
    return 0;
}

Retornar