Ejercicios de Programación en C
Ejercicios de Programación en C
Enero de 2007
Abstracto
Instrucciones: Realice los ejercicios. La primera sección es un conjunto general de problemas para ayudarte a recordar lo que
sabes sobre programación. Las secciones posteriores detallan partes de C. Si te quedas atascado en una sección, inténtalo de nuevo,
luego pasa a la siguiente sección y vuelve más tarde.
Las lecturas importantes incluyen (McGrath 2006) una buena introducción a C. (Kernighan y Ritchie 1988) es el libro para el
estándar C89 para ANSI C. (Holmes 1995) es un muy buen tutorial y referencia en Internet.
1 Ejemplos generales
Se trata de ejercicios generales de diversa complejidad. Una buena manera de refrescar la memoria de C y desarrollar habilidades
para resolver problemas.
Ejercicio. 1.1 Escribe y ejecuta el programa “¡Hola, mundo!”. Experimente con diferentes formatos de salida insertando nuevas líneas
y tabulaciones en la cadena de control.
Ejercicio. 1.2 Escriba un programa para generar un número entero en formato decimal y un número de punto flotante en formato
float. Experimente con la salida de un número entero en formato flotante y viceversa. Imprime un carácter en formato decimal
(imprime el código del carácter, por ejemplo, ascii). Solucione cualquier problema utilizando una conversión o conversión de tipo
explícita.
Ejercicio. 1.3 Escriba un programa para determinar, mediante prueba y error, el valor mínimo de 196/n + n donde n es un entero. No
utilice un bucle, pruebe diferentes valores de n. Tenga en cuenta que, en general, 196/n + n será una cantidad flotante.
Ejercicio. 1.4 Escriba un programa para comprobar que el volumen y el área superficial de una esfera de radio 0,1234567789e2 son
aproximadamente 7881,948508 y 1915,313445 respectivamente. El volumen de una esfera es cuatro tercios de Pi por el radio al
cubo y el área es cuatro Pi por el radio al cuadrado. Considere Pi como 3,14159265.
Ejercicio. 1.5 Un número es especial si es divisible (sin resto) por 15. Un número es grande si es mayor que 999. Un número es
extraño si es divisible por 5 y 6 pero no por 18. Un número da miedo si es grande o extraño.
Escriba un programa para comprobar cuáles de los siguientes, 450, 540, 600 y 675, son especiales pero no dan miedo.
Declare cuatro variables llamadas especial, grande, extraña y aterradora y realice asignaciones adecuadas a estas variables a
medida que se prueba un número.
Ejercicio. 1.6 Escriba un programa para expresar un número dado de segundos (que puede ser un literal en el programa) en términos
de horas, minutos y segundos y generar el resultado. Utilice variables distintas para cantidades distintas. Por ejemplo, para
representar el número total de segundos, que puede ser mayor que 59, y la parte de segundos de la salida, que nunca puede ser
mayor que 59.
Ejercicio. 1.7 Escriba un programa para almacenar y extraer independientemente dos enteros cortos de 16 bits (llamados car y cdr)
en un entero de 32 bits (llamado cell). Todos los números enteros son positivos.
celúla
auto comandante
El almacenamiento o acceso a un número no debe afectar al otro. Por ejemplo, si la celda contiene un valor de automóvil de 2 y
un valor de cdr de 3, entonces el valor de la celda es 131075 (hexadecimal 00020003). Si posteriormente se almacena el valor del
automóvil en la celda, el valor de la celda pasa a ser 65539 (hexadecimal 00010003).
Comience declarando números enteros adecuados e inicializándolos. Escriba funciones para establecer y extraer los valores de
car y cdr.
Escriba una versión del programa anterior utilizando una estructura con los campos car y cdr.
Pruebe ambos con varios ejemplos de coche y cdr.
1
Ejercicio. 1.8 Escribir funciones, utilizando expresiones condicionales,
2 Cadenas y E/S
Ejercicio. 2.1 Considere el programa
• palabra[1]='e' ;
• palabra[3]='d';
• palabra[4]='\n';
Ejercicio 2.2 Escriba un programa para escribir los argumentos de cadena de main en orden inverso.
Ejercicio 2.3 Un argumento de main es una opción o una palabra. Una opción comienza con un guión '-', la parte restante es el
nombre de la opción.
Escriba un programa para examinar cada argumento e imprimir si es una opción o una palabra, junto con el nombre de la opción
o el valor de la palabra. A continuación se muestra un ejemplo de salida.
Opción: versión
palabra: 1.5.a
Ejercicio 2.4 scanf divide naturalmente su entrada en espacios en blanco (ver la página del manual). Usando este hecho, escriba un
programa que cuente las palabras leídas desde la entrada estándar. Sugerencia: lea la página del manual de scanf, consulte la
sección “VALOR DE RETORNO” para obtener una pista sobre cómo finalizar el bucle.
2
3 Caracteres y cadenas
Las computadoras representan caracteres con números, y cada número representa una letra del alfabeto. El sistema más común es
ascii, en el que 'A' es 65, 'B' es 66, 'C' es... Las letras mayúsculas están en el rango 65...90, y las minúsculas están en el rango
32...97, 122. En C, un individuo se puede almacenar en un tipo de datos char. Los valores se pueden escribir como la letra entre
comillas simples 'A'. Alternativamente, se puede escribir el número, en cuyo caso el valor debe convertirse en un tipo char.
Las siguientes afirmaciones son equivalentes
c = 'A' ; c = ( carácter ) 65 ;
Además de los caracteres imprimibles, existen códigos ASCII para caracteres “especiales”, algunos de los cuales son 0 '\
norte'carácter nulo (terminador de cadena)
7 '\a'campana (pitido)
9 '_t'pestaña horizontal
13 '\r'devolver
3.1 Personajes
Ejercicio. 3.1 El siguiente programa imprime el alfabeto de la A a la Z. Copie, compile y ejecute el programa.
#incluir < st di o . h>principal()
{
carácter i;
para ( i='A' ; i<='Z ' ; ++i ) putchar ( i );
Modificar el programa para imprimir sólo las primeras 10 letras del alfabeto.
Ejercicio. 3.2 Copie, compile y ejecute el siguiente programa. Toma su entrada de la misma manera que lo hace cat (excepto que no
lee archivos). Si se lee desde el teclado, se necesita al menos un retorno de carro y Control-D para finalizar la entrada. Esto se debe
a la forma en que el núcleo almacena en buffer la entrada, no a la forma en que el programa lee los datos.
#incluir<st dio . h>
principal ()
{
carácter c;
c = obtenerchar();
mientras ( c != EOF ) {
si ( 'A ' <= c && c <= ' Z ' )
c = c + 32;
ponerchar(c); c =
getchar();
3
}
}
a[26] = '\0';
imprimirf(a);
}
El programa seguirá intentando imprimir las letras 'A'... 'Z'. Con el cero la salida se detiene. Sin el cero, el programa continúa
imprimiendo todo lo que haya en la memoria (caracteres aleatorios) hasta llegar a un byte cero.
En un programa C, un valor de cadena se puede escribir usando comillas dobles ", el compilador asignará la memoria y
agregará el byte cero. Las funciones de entrada fgets y el campo %s en scanf también agregan el byte cero. Hay una serie de
funciones para proporcionar información o manipular cadenas. Para utilizarlos se necesita el archivo de encabezado string.h.
• strcat(char s,char cs) copiará los caracteres de la segunda cadena al final de la primera. Si la primera cadena no tiene
suficiente espacio, strcat continuará sobrescribiendo todo lo que esté en la memoria.
principal ()
{
enumeración { BUFSIZE = 1 00 } ;
char buf[TAMAÑOBUFS];
entero yo;
fgets(buf, BUFSIZE, entrada estándar);
buf [ strlen ( buf)-1]= ' \0 ' ; /∗ eliminar el for ( i = 0 ; buf [ i ] ; carácter de nueva línea ∗/
++i )
si ( es más bajo (buf[ i ]))
imprimir(”%c1___1 es 1________1 inferior 1 buf[i]);
____________________1case\n” , de lo contrario si (
esupperprintf
(buf(“%c1—1
[ i ] )) es 1—1 mayúscula 1— buf[i]);
1mayúscula\n” , de lo contrario
imprimirf(”'%c '1_____1 es 1 1ni \n” , buf[i]);
}
¿Cómo se puede mejorar el programa (para mayor claridad) incluyendo más llaves y
Ejercicio. 3.6 El siguiente programa leerá palabras de la entrada estándar y las concatenará entre sí. Se detiene cuando se llega al
final del archivo (control-D) o el buffer está lleno. La función scanf devuelve un valor EOF si intenta leer más allá del final de un
archivo.
#incluir<st dio . h>
#include < cadena . h>
principal ()
4
{
enumeración { TAMAÑOBUFS = 1000, TAMAÑOENTRADA = 100};
const char SEP [ ] = ” Yo__________I";
carácter s [ BUFSIZE] ;
char cs [ TAMAÑO DE ENTRADA ] ;
∗s = '\0';
mientras ( scanf(”%s” , cs)!=EOF && strlen (s) < (BUFSIZE - INPUTSIZE)) { strcat ( s , SEP );
strcat(s, cs);
}
printf(”%s” ,s );
}
Ejercicio. 3.7 3. Escriba un programa que lea el nombre y apellido de un usuario, en líneas separadas (sugerencia: use fgets; se
detiene al final de una línea; scanf("%s") se detiene en un espacio). La salida son los dos nombres como una sola cadena, por
ejemplo, “smith, john” manteniendo el formato de la entrada.
Ejercicio. 3.8 Escriba un programa similar que muestre el nombre en el formato “SMITH,John”, esta vez utilice el caso en la cadena
de ejemplo.
5
Referencias
Echeverría, A. (2000). Pensando en C++, Volumen 1: Introducción a C++ estándar (2.ª edición), Prentice Hall.
http://mindview.net/Books/TICPP/ThinkingInCPP2e.html
Hanly, JR, Koffman, EB y Horvath, JC (1997). Diseño de programas C para ingenieros, Addison-Wesley. classmark 518.567.5 HAN.
Kernighan, BW y Ritchie, D. (1988). Lenguaje de programación C (2.a edición), Prentice Hall PTR.
Knuth, DE (1999). El arte de la programación informática, volúmenes 1-3, paquete en caja, Addison-Wesley Professional.
Revista de Ciencias Sociales, 2006. Programación en C, en sencillos pasos, paso a paso por computadora.
http://www.ineasysteps.com/
Raymond, ES (1999). La Catedral y el Bazar: Reflexiones sobre Linux y código abierto por un revolucionario accidental (O'Reilly
Linux), O'Reilly.
van der Linden, P. (1994). Programación experta en C: secretos profundos de C, Prentice Hall.