Lect9 - Universidad de La Serena

Anuncio
Programación en C
Tutorial
Dr. Eric Jeltsch F.
7 PROCESANDO TIPOS DE DATOS CHAR
Hasta el momento hemos considerado solamente tipos de dato numéricos, sin embargo en
programación no todos los datos tienen esta cualidad, pues la programación de una password
encriptada podría ser una buena aplicación de los tipo de elementos char ó determinar el número
de comas ó dígitos ó símbolos extraños que un texto posee, lo que en Teoría de Autómatas y
Lenguajes Formales se conoce como un “reconocedor de palabras” , tema que se abordará en esa
asignatura. Por tal motivo veremos una serie de ejemplos que nos darán los rudimentos para
abordar este tipo de problemas.
Ejemplo 39: (Procesador de textos)
/* pe97c11.cpp
nombre: char: ch
fecha : 12.12.96
propósito: leer un stream de caracteres, un caracter a la vez, y
salida hasta EOF
*/
enviarla a la
#include <stdio.h>
main()
{
char ch;
/* declaración para un objeto ch */
int bandera; /* bandera almacena el número
scanf()*/
de
items
leídos
por
/* imprime titulo */
printf("***Copia del Programa***\n\n");
printf("tipo de texto, termina con EOF\n");
bandera=scanf("%c", &ch);/* lee el primer caracter */
while (bandera !=EOF) {
/* repite mientras no sea EOF */
printf("%c", ch); /* imprime el último caracter leído */
bandera=scanf("%c", &ch); /* lee el siguiente caracter
adiciona a bandera*/
}
/* bandera es EOF, ch no puede ser cambiado */
return 0;
}
y
lo
Comentario:
La conversión específicada para formatear datos de tipo character es %c.
Los datos de tipo caracter están representados en el computador usando un código numérico
estandarizado, llamado código ASCII, el cual posee 128 caracteres con valores del 0 al 127.
Entonces 7 bits son suficientes para representar los caracteres en ASCII, aunque algunos
computadores reservan 1byte (8bits) para los caracteres ASCII.
Ejemplo 40 (código ASCII)
A propósito de la tabla de códigos ASCII, debemos hacer notar que ‘A’ tiene el código 65, el ‘B’
tiene el valor 66 y así sucesivamente. Es importante mencionar el hecho que los valores ASCII de
las letras ‘A’ hasta la ‘Z’ son contiguos en forma creciente desde el 65 hasta el 90, las minúsculas
en cambio comienzan del valor 97, con la misma particularidad que las mayúsculas. Similarmente
______________________________________________________________________________________
Escuela Ingeniería en Computación, Universidad de La Serena
1
Programación en C
Tutorial
Dr. Eric Jeltsch F.
los dígitos del ‘0’ al ‘9’ , los cuales parten del valor 48. Cabe distinguir que los símbolos dígitos
son de tipo character, es decir NO confundir ‘0’ que tiene el valor 48 con el 0 como valor.
/* pe97c12.cpp
nombre: ascii
fecha : 12.12.96
propósito: leer una lista de caracteres hasta el fin del archivo, imprimiendo
los atributos reconocedores del código ASCII, entre otros.
*/
#include <stdio.h>
void imp_reps(char ch);
main()
{
char ch;
/* declaración para un objeto ch */
int bandera; /* bandera almacena el número
scanf()*/
de
items
leídos
por
/* imprime titulo */
printf("***Atributos***\n\n");
printf("tipo texto, termina con EOF\n");
bandera=scanf("%c", &ch);/* lee el primer caracter */
while (bandera !=EOF) {
/* repite mientras no sea EOF */
if (ch >= 'a' && ch <= 'z') {/* caso letras minúsculas */
imp_reps(ch);
printf("letra minúscula\n");
}
else if (ch >='A' && ch <= 'Z') { /* caso letra mayúscula */
imp_reps(ch);
printf("letra mayúscula\n");
}
else if (ch >= '0' && ch <= '9') {/* caso dígitos */
imp_reps(ch);
printf("un digito\n");
}
else if( ch=='.'||ch ==','||ch==';'||ch==':'||ch=='?'||ch=='!'){
imp_reps(ch);
printf("un símbolo de puntuación\n");
}
else if (ch == ' ') {/* caso espacio */
imp_reps(ch);
printf("un caracter espacio\n");
else
if (ch < 32 || ch ==127) { /* control de caracter */
imp_reps(ch);
printf("un caracter control\n");
}
else { /* caso letra mayúscula */
imp_reps(ch);
printf("un símbolo especial\n");
}
bandera=scanf("%c", &ch); /* lee el siguiente caracter */
}/* termina el while */
return 0;
}/* termina el programa*/
void imp_reps(char ch)
{
printf("%c, ASCII valor decimal %d,octal %o,hexagésimal %x:",ch, ch, ch, ch);
}
______________________________________________________________________________________
Escuela Ingeniería en Computación, Universidad de La Serena
2
Programación en C
Tutorial
Dr. Eric Jeltsch F.
Ejemplo 41 ( usando las funciones getchar( ) y putchar( ) )
getchar( ) y putchar( ) son rutinas de la librería stdio.h, las cuales son más generales que las
librerías estandares de entrada y salida. La función getchar( ) lee un caracter simple desde la
entrada estandar y retorna el valor del caracter como el valor de la función, el tipo del valor
retornado es int, aunque para evitar confusiones se considera signed char para almacenar los
valores. La rutina similar para salida de caracteres es putchar( ), la cual devuelve sus argumentos
como caracteres a la salida estandar. Es decir, devuelve los caracteres ASCII cuyos valores están
en c a la salida estandar, El argumento para putchar se espera que sea int, sin embargo la variable c
puede ser char (que corresponde a los valores enteros de ASCII). A continuación se escribe un
programa que usa esta nueva manera de entrada/salida en vez de las estandares scanf( ) y printf(
).
Otra diferencia es que scanf( ) almacena los datos en un objeto cuya dirección está dada por sus
argumentos, mientras getchar( ) retorna el valor del caracter leído como su valor.
/* pe97c13.cpp
nombre: getchar() y putchar()
fecha : 12.12.96
propósito: copiar entrada estandar en salida estandar
*/
#include <stdio.h>
main()
{
signed char c;
/* declaración para un objeto ch */
/* imprime titulo */
printf("***copia archivo***\n\n");
printf("tipo texto, se sale con EOF\n");
c=getchar();
while (c !=EOF) {
putchar(c);
c=getchar();
}
return 0;
}
Observación: En C no existe tipo dato primitivo para string; sin embargo constantes string
(también llamadas string literales) pueden ser escritas directamente en un programa usando
comillas. Por ejemplo string nulo es “ “, otra constante es “Juan Perez”. Entonces NOTAR la
diferencia entre ‘c’ que es una constante char y “c” que es una constante string de un caracter y el
caracter NULL, es decir, “c” se representa por ‘c’ \0’, “string” se representa por ‘s’ ‘t’ ‘r’ ‘i’ ‘n’
‘g’ \0’, mientras que ‘c’ se representa por ‘c’
Ejemplo 42: ( Utilizando funciones para procesar textos )
Lo que resulta bastante usual en programación es confeccionar macros que realicen tareas como
pasar un texto de mayúscula a minúscula, reconocer palabras ó dígitos, etc. dada una cadena de
caracteres. Aquí se presentarán dos programas, que deberían darle la inspiración necesaria para
implementar otras tareas en este tema.
/* pe97c14.cpp
nombre: mayuscula()
fecha : 12.12.96
______________________________________________________________________________________
Escuela Ingeniería en Computación, Universidad de La Serena
3
Programación en C
Tutorial
Dr. Eric Jeltsch F.
propósito: copiar archivo de entrada a la salida estandar, después de convertir
minúsculas a mayúsculas
*/
#include <stdio.h>
#define es_min(c) ((c) > = 'a' && (c) < = 'z')
#define va_may(c) ((c) - 'a' + 'A')
char mayuscula(char ch);
main()
{
signed char ch;
/* declaración para un objeto ch */
/* imprime titulo */
printf("***copia programa- caso mayúscula***\n\n");
printf("tipo texto, se sale con EOF\n");
while ((ch = getchar())!= EOF) {
putchar(mayuscula(ch));/* imprime valor de mayuscula(ch) */
}
return 0;
}
char mayuscula(char c) /* prototipo de la función*/
{
if ( es_min(c))
return va_may(c);/* convierte a mayuscula */
/* de otra manera */
return c;
}
Comentario:
En la expresión while ((ch = getchar())!= EOF) se ha combinado la operación de leer un caracter
y preguntar por EOF. En los paréntesis internos son evaluados primero, getchar() leyendo un
caracter y asignando el valor retornado a ch. El valor asignado a ch está entonces comparándolo
con EOF. Si no es EOF el loop se ejecuta, de otra manera el loop termina. La precedencia es
importante, de allí los paréntesis.
/* pe97c15.cpp
nombre: getint()
fecha : 12.12.96
propósito: convertir una sucesión de caracteres dígitos a enteros
*/
#include <stdio.h>
#define DEBUG
#define es_min(c) ((c) >= 'a' && (c) <= 'z')
#define es_dig(c) ((c) >= '0' && (c) <= '9')
#define ERROR -1
char ent_dig(int n);
int dig_ent(char ch);
int getint();
main()
{
printf("***secuencia de dígitos a enteros***\n\n");
printf("Tipee una secuencia de dígitos\n");
printf("Entero=%d\n", getint());
return 0;
}
int getint()
{ int n=0;
______________________________________________________________________________________
Escuela Ingeniería en Computación, Universidad de La Serena
4
Programación en C
Tutorial
signed char ch;
ch=getchar();
while (es_dig(ch)){
n= n*10 + dig_ent(ch); /* approach modular
Dr. Eric Jeltsch F.
*/
#ifdef DEBUG /* esta macro es llamada compilación condicional para testear la
implementación*/
printf("debug:getint: ch=%c\n", ch);
printf("debug:getint: n= %d\n", n);
#endif
ch=getchar();
}
return n;
}
int dig_ent(char ch) /* prototipo de la función*/
{ /* ingresa un caracter y retorna un entero, el valor ch -’0’ si ch es un
caracter dígito, sino lanza un mensaje de ERROR */
if ( es_dig(ch))
return ch - '0';
printf("ERROR:dig_ent: %c no es un dígito\n", ch);
return ERROR;
}
char ent_dig(int n) /* prototipo de la función*/
{
if (n>=0 && n<10)
return n + '0';
printf("ERROR:ent_dig: %d no está en el rango de 0 a 9\n", n);
return NULL;
}
______________________________________________________________________________________
Escuela Ingeniería en Computación, Universidad de La Serena
5
Descargar