Seminario de lenguajes
Opcin C
Prctica 2 - 2013
1. Analice en su sistema operativo cul es la combinacin de teclas que da como resultado
EOF. Analice cmo cambia esta combinacin en GNU/Linux y Windows.
2. Escriba un programa que verique que la expresin
getchar() != EOF sea 1 o 0.
3. Escriba un programa que imprima el valor de EOF. Alcanza el tipo
char para almacenar
EOF? Sera correcto el siguiente extracto de cdigo?
char c;
c = getchar();
while (c != EOF) {
getchar() y los cuente hasta
EOF. Luego debe imprimir la cantidad de caracteres y lneas encontradas. En
GNU/Linux puede comprobar la funcionalidad con los comandos wc -c y wc -l.
Nota: Puede leer de teclado o invocar el programa con un archivo cmo parmetro. Por
4. Escriba un programa que lea caracteres del teclado empleando
encontrar
ejemplo:
./[Link] < archivo_param
Esto hace que el contenido de
archivo_param se vea desde el programa [Link]
como proveniente del teclado.
Notar que si utliza slo el teclado, el programa no funcionar hasta que ingrese ENTER.
Esto es propio del manejo de buers en C.
5. Escriba un programa que copie caracteres del teclado en la pantalla reemplazando cada
ocurrencia de uno o ms espacios por slo uno. Emplee
getchar().
6. Escriba un programa que copie caracteres del teclado en la pantalla remplazando cada
ocurrencia de barra invertida por \\, cada tabulacin por \t, cada enter por \n. Emplee
getchar().
# Por ejemplo. Si ingresa:
hola
mundo
chau mundo\
# Debe imprimir:
hola\tmundo\nchau mundo\\
7. Pruebe con nmeros enteros la diferencia de usar
(a)
%d
(b)
%10d
(c)
%-10d
Pg. 1
printf
de las siguientes formas:
Facultad de Informtica
UNLP |
C | Prctica 2
8. Pruebe con nmeros reales la diferencia de usar
(a)
%f
(b)
%10f
(c)
%-10f
printf
de las siguientes formas:
9. Analice qu es lo que imprime el siguiente fragmento de cdigo:
char *str = "Hello world";
printf(" %.*s\n", 5, str);
10. Modique del siguiente cdigo, el string de formato a la funcin
una impresin similar a la mostrada.
#include <stdio.h>
int main()
{
const char* dias[7] = {
"Lunes", "Martes", "Miercoles", "Jueves",
"Viernes", "Sabado", "Domingo"};
int i;
for (i = 0; i < 7; i++)
printf(DEF, 3, dias[i]);
for (i = 1; i <= 31; i++) {
if (!((i - 1) % 7))
printf("\n");
printf(DEF, i);
}
printf("\n");
return 0;
}
Resultado esperado
Lun Mar Mie Jue Vie Sab Dom
1
2
3
4
5
6
7
8
9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
11. Analice la funcin
scanf :
(a) Cul es su valor de retorno?
(b) Qu hacen las siguientes invocaciones a
scanf ?
int x, y;
scanf(" %d", &x);
scanf(" %d %d",&x,&y);
scanf(" %d %d",&x,&y);
Pg. 2
printf(DEF) a n de lograr
Facultad de Informtica
UNLP |
C | Prctica 2
(c) Explique la importancia del uso de & en el punto anterior.
(d) Dado el siguiente programa que lee fechas en formato dd/mm/yyyy, analice qu sucede
si enva como entrada una letra en vez de un nmero. Analice una solucin a partir de
la funcionalidad de
scanf.
#include <stdio.h>
int main()
{
int res, dia, mes, anio;
do {
res = scanf(" %2d/ %2d/ %4d", &dia, &mes, &anio);
printf("scanf retorno %d\n", res);
if (res != EOF) {
if (res != 3) {
printf("ERROR: El formato debe ser dd/mm/yyyy\n");
} else {
printf("Fecha: %d/ %d/ %d\n", dia, mes, anio);
}
}
} while (res != EOF);
return 0;
}
(e) Una vez solucionado el problema del cdigo anterior, prubelo con las siguientes entradas.
1234/11/1234
12/11/1234
111/222/1234
1/11/123411/11/1234
12. Dado el siguiente cdigo:
int main()
{
return 0;
}
(a) Utilice
gcc -E para vericar su salida
(b) Modique el programa agregando el siguiente fragmento de cdigo:
#ifndef RETORNO
#define RETORNO 10
#endif
int main()
{
return RETORNO;
}
(c) Verique con
gcc -E. Luego verique con gcc -E -DRETORNO=3
(d) Modique nuevamente el cdigo agregando lo siguiente:
Pg. 3
Facultad de Informtica
UNLP |
C | Prctica 2
#include <stdio.h>
int main()
{
return 0;
}
(e) Verique con
gcc -E
13. Dena dos macros:
min, para calcular el mnimo entre dos nmeros, y max, para calcular
el mximo.
(a) Analice los efectos laterales de invocar la macro
min(i++, j++) o max(i++, j++)
14. Dada la siguiente macro:
#define cuadrado(x) x*x
(a) Analice los efectos laterales de invocar la macro
cuadrado(x + 1)
15. Indique qu es lo que hacen las siguientes macros:
#define macro1(exp) printf(#expr "= %g\n", expr);
#define macro2(uno, dos) uno ## dos
16. Indique qu es lo que hace la siguiente macro:
#define mi_macro(t, a, b) {t _z##a##_##b = a; a = b; b = _z##a##_ ##b ;}
Pg. 4
Facultad de Informtica
UNLP |
C | Prctica 2
Ejercicio a entregar
La entrega se har
nicamente subiendo la solucin por SVN hasta el 05/05/2013 a las 23:30hs
en:
[Link]
Para aprobar la entrega adems de subir el cdigo en tiempo y forma el alumno deber asistir
al coloquio en el horario de consulta elegido. Los archivos necesarios para la entrega se podrn
descargar desde la plataforma de la ctedra.
1. Se desarroll un intrprete para el lenguaje
BF,
solamente falta implementar una funcin
para leer los programas por teclado (validando que los mismos sean sintcticamente correctos). Usted deber implementar esta funcionalidad en la funcin
archivo
bf.c
load_program(),
en el
aprovechando los mdulos provistos por el desarrollador original.
Los programas en
BF
consisten nicamente de secuencias de los 8 operadores del lenguaje:
<>+-.,[]
Los corchetes deben aparecer de a pares y en orden, es decir primero un corchete de apertura
y ms adelante uno de cierre. El resto de los operadores puede aparecer en cualquier orden
y pueden llegar a estar rodeados de blancos y
\n.
La funcin a implementar
int load_program(ivector_t *program) deber leer programas BF desde teclado usando getchar() (hasta llegar al n de archivo) y cargar
los operadores ledos en el parmetro program usando la funcin provista por la ctedra
ivector_push(program, c).
Deteccin de errores y valores de retorno:
Si el programa ledo es sintcticamente vlido, la funcin debe retornar 1.
Si se lee un carcter que no es un operador de
BF
ni es un blanco la funcin debe
imprimir en pantalla Operador no vlido y retornar 0.
Si se encuentra un corchete de cierre que no tiene pareja debe imprimir en pantalla Se
encontr un ] sin su [ correspondiente y retornar 0.
Si se encuentra un corchete de apertura que no tiene pareja debe imprimir en pantalla
Se encontr un [ sin su ] correspondiente y retornar 0.
Para comprobar que cada [ tenga su correspondiente ] y viceversa puede utilizar un contador,
incrementndolo cada vez que encuentra un [, decrementndolo cada vez que encuentra un ].
Deber vericar que el contador en ningn momento tome valores negativos y que al llegar
a
EOF
el contador valga 0.
En la pgina de la ctedra se puede descargar
para
BF
archivos_tp2.[Link]
con el intrprete
parcialmente desarrollado:
ivector.*: Vector dinmico en el que deber cargar los caracteres ledos.
bf.*: Funciones para interpretar BF.
principal.c: Programa principal
Makele: Para construir con make (uso opcional).
html/: Documentacin extrada de los .h (ejemplo de uso de Doxygen).
ejemplos/[Link]: Programa que imprime Hello world! codicado en BF.
ejemplos/no_*.bf: Programas con errores sintcticos para probar load_program().
Pg. 5
Facultad de Informtica
UNLP |
C | Prctica 2
Nota 1: No deber modicar nada, excepto la funcin load_program().
Nota 2: load_program() no deber cargar blancos, \n, ni caracteres que no pertenezcan
a BF en program.
Nota 3: load_program() deber leer hasta n de archivo (EOF), se puede generar EOF
desde el teclado con las combinaciones de teclas Ctrl+D en GNU/Linux y Ctrl+Z en
Windows.
Comportamiento esperado
$ ./bf
]
Se encontr un ] sin su [ correspondiente
$ ./bf
[
Se encontr un [ sin su ] correspondiente
$ ./bf
]---[
Se encontr un ] sin su [ correspondiente
$ ./bf
[---]
$ ./bf
>++++++++[<++++++++>-]<.
@
$ ./bf
[/-]
Error de sintaxis
$ ./bf
>
< .
@
+ +++++ ++[ <++++ ++++> - ]
Referencias
Acceso Web al servidor SVN:
[Link]
Documentacin del lenguaje BF:
[Link]
Pg. 6