0% encontró este documento útil (0 votos)
162 vistas6 páginas

Practica 2 Lenguaje C

Este documento presenta una serie de ejercicios relacionados con el lenguaje de programación C. Los ejercicios incluyen analizar combinaciones de teclas para EOF, escribir programas para verificar expresiones con getchar(), copiar y reemplazar caracteres del teclado, usar diferentes formatos en printf, analizar macros, y desarrollar una función para cargar programas desde el teclado en un intérprete de Brainfuck.

Cargado por

Emi Retamar
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
162 vistas6 páginas

Practica 2 Lenguaje C

Este documento presenta una serie de ejercicios relacionados con el lenguaje de programación C. Los ejercicios incluyen analizar combinaciones de teclas para EOF, escribir programas para verificar expresiones con getchar(), copiar y reemplazar caracteres del teclado, usar diferentes formatos en printf, analizar macros, y desarrollar una función para cargar programas desde el teclado en un intérprete de Brainfuck.

Cargado por

Emi Retamar
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

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

También podría gustarte