Serie: VERDE
Programacin en
Lenguaje C
RESUMEN
En este trabajo se desarrollan los conceptos fundamentales del lenguaje de programacin ANSI
C. Se describen los objetos fundamentales, el control de flujo, los tipos de datos derivados, as
como: arreglos, apuntadores, estructuras, uniones y funciones. Tambin se incluyen diversos
programas que ejemplifican la utilizacin del lenguaje C para resolver problemas de diversa
ndole.
NDICE
Pgina
INTRODUCCIN
3
3
3
4
5
7
11
2. OPERADORES
2.1 Operadores aritmticos
2.2 Operadores de incremento y decremento
2.3 Operadores a nivel de bits
2.4 Operadores relacionales y lgicos
2.5 Operadores de asignacin
2.6 Precedencia de operadores
2.7 Ejercicios del captulo
13
13
14
15
16
16
17
19
3. ENTRADA Y SALIDA
3.1 La funcin printf
3.2 La funcin scanf
3.3 La funcin putch
3.4 Las funciones getchar y getch
3.5 Ejercicios del captulo
22
22
23
25
26
28
29
29
30
31
32
33
34
35
35
37
37
Pgina
4.11 la oracin goto
4.12 Ejercicios del captulo
39
40
47
47
47
49
7. ARREGLOS
7.1 Definicin
7.2 Inicializacin de arreglos
7.3 Uso de los operadores de incremento y decremento
para referenciar elementos en arreglos
7.4 Arreglos multidimensionales y arreglos de cadenas
7.5 Inicializacin de arreglos desde la entrada de datos
7.6 Ejercicios del captulo
51
51
52
54
54
57
58
8. FUNCIONES
8.1 Reglas de las funciones
8.2 Argumentos de funciones (llamada por valor)
8.3 Parmetros mltiples
8.4 La oracin return
8.5 Pasando y regresando expresiones
8.6 Paso de arreglos a funciones
8.7 Llamada por referencia
8.8 Recursividad
8.9 Ejercicios del captulo
65
65
66
68
69
70
70
72
73
75
9. APUNTADORES
9.1 Definicin
9.2 Apuntadores en expresiones
9.3 Aritmtica y comparacin de apuntadores
9.4 Paso de apuntadores a funciones
9.5 Apuntadores y arreglos
9.6 Indexado de apuntadores
9.7 Apuntadores a caracteres y funciones
9.7.1 Apuntadores a caracteres
9.7.2 Apuntadores a funciones
9.8 Arreglos de apuntadores y apuntadores a apuntadores
9.8.1 Arreglos de apuntadores
81
81
82
83
84
84
86
86
86
87
88
88
Pgina
9.8.2 Apuntadores a apuntadores
9.8.3 Usando apuntadores como arreglos (asignacin
dinmica de arreglos)
9.9 Paso de argumentos en la lnea de comandos
9.10 Ejercicios del captulo
89
90
92
95
10. EL PREPROCESADOR
10.1 Directivas
10.2 Macros
10.3 Inclusin de archivos fuente
10.4 Ejercicios del captulo
104
104
105
106
108
11. ESTRUCTURAS
11.1 Definicin
11.2 Arreglos de estructuras
11.3 Inicializacin de estructuras
11.4 Estructuras y funciones
11.5 Apuntadores a estructuras
11.6 Paso de apuntadores a estructuras a funciones
11.7 Paso de arreglos de estructuras a funciones
11.8 Ejercicios del captulo
109
109
111
111
114
115
115
117
119
122
122
123
126
128
130
130
131
133
14. ARCHIVOS
14.1 Ejercicios del captulo
134
136
150
BIBLIOGRAFA
177
INTRODUCCIN.
Por sus caractersticas, el lenguaje de programacin C es considerado como una
herramienta muy poderosa para el desarrollo de aplicaciones, ya que permite crear
programas tan sencillos como el que calcula la media de "n" nmeros, hasta sistemas
completos como el que lleva el control de inventarios de una empresa.
Las caractersticas ms destacables del lenguaje son: (1) la portabilidad de los
programas entre diferentes arquitecturas de computadoras, (2) la flexibilidad que
tiene para crear tipos de datos derivados que permiten representar casi cualquier
entidad de informacin, y (3) la poderosa capacidad que tiene para comportarse como
un lenguaje de bajo nivel de propsito general.
"C" no contiene operaciones para trabajar con objetos compuestos como cadenas de
caracteres, conjuntos, listas, arreglos o vectores, considerados como un todo.
Asimismo no cuenta con operaciones de entrada-salida ni mtodos propios para el
acceso a archivos. Esto lo maneja a travs de funciones externas.
La estructura de un programa en C consiste de:
a) Un archivo conteniendo directivas al preprocesador, declaraciones de variables y
funciones.
b) Una funcin main.
c) El cuerpo de la funcin main.
d) Otras funciones.
El cuerpo de cada funcin, incluyendo a main, contiene expresiones y oraciones.
La ejecucin de todos los programas comienza en la funcin identificada como main().
La sintaxis de la funcin main() se muestra a continuacin.
main()
{
/* el cdigo va en este lugar */
}
Programacin en Lenguaje C
/* Directivas al preprocesador */
# include <stdio.h>
# define es_entero(x) ( (x >= 0 && x <= 9) ? 1 : 0 )
/*---------------------------------------------------------------------------------------*/
/* Otras funciones y su cuerpo */
int al_cubo(int y)
{
return (y*y*y);
} /* fin de al_cubo */
Programacin en Lenguaje C
Cuando una oracin condicional es usada como en el caso de la oracin if, pueden
existir mltiples oraciones condicionales anidadas. Sin embargo deben terminar con
una oracin y un punto y coma.
oracin condicional
oracin condicional
oracin;
if (x > 20)
if(x < 30)
x = x * 1.25;
En un bloque de oraciones, las llaves { } son usadas para unir mltiples oraciones a
una oracin condicional simple. La llave de apertura "{" indica el comienzo de un bloque
y la llave de cierre "}" indica el fin del bloque. Los bloques de oraciones no requieren un
punto y coma seguido de la ltima llave.
oracin condicional {
oracin;
oracin;
oracin;
}
No hay un formato estricto, el programador puede usar tantos espacios como lo desee
entre oraciones o bloques de oraciones. Los espacios en blanco incluyen: nueva lnea,
espacio, tabulador.
1.2 Comentarios.
Los comentarios en un programa en C se establecen utilizando la combinacin de los
caracteres "/" y "*", de la forma /* y */. A estas combinaciones se les llama token.
/*
Comentarios
*/
Programacin en Lenguaje C
*/ finaliza el comentario. Un
Programacin en Lenguaje C
Nombres incorrectos
1_nombre
variable-3
pago$total
ultimo nombre
996
1999_fin
b) Tipo entero (int). Los enteros vienen en una variedad de diferentes tamaos
dependiendo del sistema anfitrin. El entero puede contener slo nmeros de -n a n.
Donde n es dependiente del tamao del entero del sistema anfitrin.
main()
{
int var_entera;
var_entera = 10;
printf(\nEstos son los valores de %d, var_entera);
printf(\nEn decimal
= %d, var_entera);
printf(\nEn octal
= %o, var_entera);
printf(\nEn hexadecimal
= %x, var_entera);
}
Programacin en Lenguaje C
En decimal
En octal
En hexadecimal
= 10
= 12
=C
En "C" pueden mezclarse libremente los tipos carcter (char) y entero (int) en
expresiones aritmticas. Cada carcter en una expresin se convierte automticamente
a un entero.
Ver seccin 1.6, ejercicio 1.1.
c) Tipo punto flotante (float). A las variables en punto flotante se les puede asignar un
valor en formato numrico estndar (234.54) o en notacin cientfica (2.3454e2).
main()
{
float var_real1, var_real2;
var_real1 = 12.6e5;
var_real2 = 12.345;
printf(\nEl valor es %f, var_real1);
printf(\nEl valor es %e, var_real1);
printf(\nEl valor es %f, var_real2);
printf(\nEl valor es %e, var_real2);
}
Este programa imprime
El valor es 1260000.000000
El valor es 1.260000e+06
El valor es 12.345000
El valor es 1.234500e+1
d) Tipo doble precisin (double). Una variable en punto flotante de doble precisin es
esencialmente una variable en punto flotante larga.
Muchos compiladores colocan en memoria nmeros en punto flotante usando el
formato de doble precisin. El hecho de pensar que los tipos de datos son muy
similares no implica que deban usarse unos por otros. Existen problemas de
redondeo y truncamiento que pueden ocurrir al usarlos.
Programacin en Lenguaje C
e) Tipo entero largo (long int). Cuando los enteros son de 16 bits, este tipo proporciona
32 bits para un entero.
f) Tipo entero corto (short int). Un entero pequeo. Cuando los enteros son de 32 bits,
este tipo proporciona 16 bits para un entero.
g) Tipo entero sin signo (unsigned int). El bit de signo es usado para almacenar un
entero positivo ms largo, los nmeros unsigned son siempre positivos.
main()
{
int var_entera1;
unsigned int var_entera2;
var_entera1 = 32768;
var_entera2 = 32768;
printf(\nEl valor de la variable entera es %d,var_entera1);
printf(\nEl valor de la variable unsigned es %u, var_entera2);
}
Este programa imprime:
El valor de la variable entera es -32768
El valor de la variable unsigned es 32768
en lugar de
en lugar de
en lugar de
1.5 Constantes.
Las constantes son asignadas a variables en la forma de entero, entero largo, carcter,
punto flotante y cadena (string).
El tipo de la constante debe corresponder al tipo de la variable en la cual ser
almacenada. Sin embargo es posible almacenar una constante de carcter en una
variable entera ya que una constante de carcter consiste de un valor entero (ASCII).
Programacin en Lenguaje C
main()
{
int a;
a='A';
}
a) Constantes enteras. Son una secuencia de dgitos dndn-1 ... d1d0. Pueden ser
definidas en octal si van precedidas con un cero. Esto es extensivo a hexadecimal si
la secuencia de dgitos va precedida de un 0X o un 0x.
main()
{
int a, b;
a=11;
a=013;
a=0xb;
a=0XB;
}
/* base 10 (decimal) */
/* base 8 (octal) */
/* base 16 */
/* base 16 */
Note que slo se permite un carcter entre apstrofes. Esto define un valor de ocho bits
el cual ser almacenado en una variable de carcter. Una forma de definir caracteres
especiales y valores enteros es utilizando el carcter diagonal invertida (backslash)
dentro de los apstrofes.
Programacin en Lenguaje C
main()
{
char c;
c = '\n';
c = '\033';
c = '\0';
Carcter
Nueva lnea
Retroceso (backspace)
Avance de forma (form feed)
Comilla simple
'\n'
'\b'
'\f'
'\''
Significado
Tabulador horizontal
Retorno de carro
Diagonal invertida
Caracteres grficos
Carcter
'\t'
'\r'
'\\'
'\nnn'
/* y = 100 */
/* y = 100 */
/* y = 100 */
Programacin en Lenguaje C
main()
{
static char a[] = "hola";
}
La variable arreglo 'a' ahora apunta a la cadena "hola" y debe contener los siguientes
datos:
a[0] = 'h'
a[1] = 'o'
a[2] = l
a[3] = a
a[4] = \0
Programacin en Lenguaje C
10
/* directiva al preprocesador */
main()
{
char cadena[10];
int numero,i;
printf("\nTeclee un entero: ");
gets(cadena);
numero=0;
for(i=0;cadena[i]>='0' && cadena[i]<='9';++i)
numero=10*numero+cadena[i]-'0';
printf("\nEl entero tecleado fu: %i \n ",numero);
return 0;
}/*fin de main */
Programacin en Lenguaje C
11
Ejercicio 1.2.
/*
Archivo: ejer12.c Versin 2.
Objetivo: Mostrar la conversin de tipos de datos char e int
Funcin: Convertir una cadena de dgitos en su equivalente
numrico, utilizando una funcin de conversin
*/
#include <stdio.h>
atoi(char s[]);
/* directiva al preprocesador */
/* prototipo de funcin */
main()
{
char cadena[10];
int numero;
printf("\nTeclee un entero: ");
gets(cadena);
numero = atoi(cadena);
printf("\nEl entero tecleado fu: %i \n ",numero);
return 0;
}/*fin de main */
Programacin en Lenguaje C
12
2. OPERADORES.
2.1 Operadores aritmticos.
Los operadores aritmticos en C son:
divisin (/) y mdulo (%).
/* a es 5 */
/* b es 20 */
/* b es 0 */
/* c es 4 */
/*c es 19 - recuerde las operaciones previas */
/* que modificaron a, b, y c */
Programacin en Lenguaje C
13
i=0;
/* i es igual a 1 */
/* i ahora es igual a 0 */
/* --i; es lo mismo que i = i - 1; */
}
Cuando el operador es colocado frente a la variable, la variable ser incrementada o
decrementada antes de su uso. Esto modifica el valor de la variable, entonces se usa
este nuevo valor con la oracin que se est ejecutando. Cuando el operador se coloca
despus de la variable, el valor de la variable ser usado tal como est, en la ejecucin
de la instruccin y despus se modificar.
main()
{
int i=10,r;
r= i--;
r= --i;
}
/* r es igual a 10 */
/* r es igual a 8*/
Programacin en Lenguaje C
14
Operador
Descripcin
corrimiento de la variable a la derecha un nmero especfico de bits
>>
<<
&
Y a nivel de bits
/* 07 & 0177 = 7; y = 7 */
/* 07 | 0177 = 0177; y = 0177 */
/* 07 ^ 0177 = 0170; y = 0170 */
/* ~0177=0177600, 07 & 0177600 es 0; y = 0 */
/* recuerde que la palabra es de 16 bits */
/* 000 111 se corre a la derecha 1 bit= 000 011
as, y = 3 */
/* 000 111 se corre a la izq. 2 bits= 011 100
as, y = 034 o 0x1c */
Programacin en Lenguaje C
15
Operador
>
<
<=
>=
==
!=
&&
||
!
Descripcin
Mayor que
Menor que
Menor que o igual a
Mayor que o igual a
Igual a
no igual a (diferente)
Y lgico
O lgico
"NO" lgico
Operador
=
*=
+=
-=
/=
Ejemplo 1
Ejemplo 2
----
a=b
a*=b
a+=b
a-=b
a/=b
a=a*b
a=a+b
a=a-b
a=a/b
Programacin en Lenguaje C
16
Operador
&=
|=
%=
>>=
<<=
^=
Ejemplo 1
Ejemplo 2
a&=b
a|=b
a%=b
a>>=b
a<<=b
a^=b
a=a&b
a=a|b
a=a%b
a=a>>b
a=a<<b
a=a^b
Programacin en Lenguaje C
17
Tipo de Operador
Operador
Asociatividad
Expresin
Unario
() [ ] . ->
~ !
*
&
++
sizeof(tipo)
Multiplicativo
* / %
Aditivo
+ Corrimiento
<< >>
Relacional
< <= > >= == !=
Y para bit (AND)
&
O exclusivo para bit ^
(XOR)
O inclusivo para bit
(OR)
Y lgico (AND)
O lgico (OR)
Condicional
Asignacin
Evaluacin
secuencial
--
Izquierda a derecha
Derecha a izquierda
Izquierda a derecha
Izquierda a derecha
Izquierda a derecha
Izquierda a derecha
Izquierda a derecha
Izquierda a derecha
Izquierda a derecha
&&
||
?:
= *= /= %= +=
>>= &= |= ^=
,
Izquierda a derecha
Izquierda a derecha
Derecha a izquierda
Derecha a izquierda
-=
<<=
Izquierda a derecha
Programacin en Lenguaje C
18
ejer21.c
Mostrar el uso de operadores de incremento y
decremento
Remover todas las ocurrencias de un carcter
de una cadena de caracteres
*/
#include <stdio.h>
#include <conio.h>
remueve(char s[],int c);
main()
{
char cadena[60];
char caracter;
printf("\nTeclee una cadena: ");
gets(cadena);
printf("\nTeclee el carcter a remover: ");
caracter=getchar();
remueve(cadena,caracter);
printf("\nLa cadena sin el carcter '%c' es: \n",caracter);
printf("%s\n",cadena);
return 0;
}/*fin de main*/
remueve(char s[],int c)
{
int i,j;
for(i=j=0;s[i]!='\0';i++)
if(s[i]!=c)
s[j++]=s[i];
s[j]='\0';
return 0;
}
Programacin en Lenguaje C
19
Ejercicio 2.2.
/*
Archivo:
Objetivo:
Funcin:
ejer22.c
Mostrar el uso del operador O exclusivo a nivel de bits.
Intercambiar el valor de dos variables sin utilizar una
tercera variable de paso.
*/
#include <stdio.h>
main()
{
int x = 15, y = 20;
printf("Antes del intercambio\n");
printf("x es %d, y es %d\n", x, y);
x = x^y;
/* intercambia x, y */
y = y^x;
x = x^y;
printf("x is %d, y is %d\n", x, y);
printf("Despus del intercambio\n");
return 0;
}
Programacin en Lenguaje C
20
Ejercicio 2.3.
/*
Archivo: ejer23.c
Objetivo: Mostrar el uso de operaciones sobre bits
Funcin: Visualizar los bits de un entero y ver el
funcionamiento de la funcin getbits
*/
#include <stdio.h>
#include <conio.h>
/*Obtiene n bits desde la posicin p
recuerde que la posicin de los bits va del 0 al 15 */
getbits(unsigned x,unsigned p, unsigned n)
{
return ((x >> (p+1-n)) & ~(~0 << n));
}
/* muestra en pantalla los bits del nmero */
visu(unsigned b)
{
unsigned int t;
printf("\nEl nmero en decimal es : %i\n",b);
for(t=32768;t>0;t=t/2)
if(b & t)
printf("1 ");
else
printf("0 ");
printf("\n");
return 0;
}
main()
{
unsigned x,p,n;
printf("\nTeclee un nmero entero sin signo: ");
scanf("%i",&x);
visu(x);
printf("\nTeclee el nmero de bits solicitados: ");
scanf("%i",&n);
printf("\nTeclee a partir de que posicin: ");
scanf("%i",&p);
visu(getbits(x,p,n));
return 0;
}
Programacin en Lenguaje C
21
3. ENTRADA Y SALIDA.
La biblioteca estndar de "C" proporciona varias funciones para leer o escribir
informacin desde el teclado, ya sean cadenas de caracteres o caracteres simples. A
continuacin veremos las ms comunes.
Descripcin
imprime un valor en punto flotante
imprime un carcter
imprime un valor decimal
imprime en notacin exponencial
imprime entero sin signo
imprime un valor octal
imprime un valor hexadecimal
imprime una cadena (secuencia de caracteres finalizando con el carcter
nulo)
imprime un %
imprime un carcter nueva lnea (salto de lnea)
imprime un carcter de tabulacin horizontal
Programacin en Lenguaje C
22
Cuando ms de una variables ser impresa, las variables necesitan ser separadas por
comas.
main()
{
int a=1;
char b= 'Z';
float c= 1.992;
printf("Esto es un ejemplo\n");
printf("a es %d, b es %c, c es %f\n",a,b,c);
}
Este programa imprime:
a es 1, b es Z, c es 1.992000
Descripcin
Lee un carcter nico
Lee un entero decimal
Lee un entero decimal
Lee un nmero en punto flotante
Lee un nmero en punto flotante
Lee un entero corto
Programacin en Lenguaje C
23
Formato
%o
%s
%x
%p
Descripcin
Lee un nmero octal
Lee una cadena
Lee un nmero hexadecimal
Lee un apuntador
Todas las variables usadas para recibir los valores a travs de scanf() deben pasarse
por sus direcciones. Esto permite crear una llamada por referencia y permite a una
funcin alterar el contenido de un argumento. En la seccin de apuntadores se
ampliar sta definicin.
En el caso de cadenas, estas se leern en arreglos de caracteres y el nombre del
arreglo, sin ningn ndice, es la direccin del primer elemento del arreglo. Suponiendo
que la direccin es el nombre de un arreglo de caracteres, para leer una cadena en el
arreglo se hace de la siguiente manera:
char cadena[20];
scanf(%s,cadena);
Programacin en Lenguaje C
24
Los elementos de entrada de datos deben ser separados por espacios, tabuladores o
nuevas lneas. La puntuacin como comas, punto y coma y similares no cuentan como
separadores.
Esto significa que:
scanf(%d%d,&x,&y);
Programacin en Lenguaje C
25
main()
{
int x;
x = 65;
putch(x);
putch(66);
}
El programa imprime:
AB
Otro ejemplo:
main()
{
char caracter;
caracter = Y;
putch(caracter);
putch(Z);
}
Programacin en Lenguaje C
26
Existen otras funciones para entrada y salida. Se recomienda que el estudiante realice
una exploracin de ellas en la versin del lenguaje C que est utilizando para
profundizar sobre el tema.
Programacin en Lenguaje C
27
Ejercicio 3.2.
/*
Archivo: ejer32.c
Objetivo: Mostrar el uso de funciones de entrada/salida
Funcin: Convierte la entrada de datos (por teclado) de minsculas
a maysculas
*/
#include <stdio.h>
main()
{
int car;
while((car = getchar()) != '0')
if(car >= 'a' && car <= 'z')
putchar(car-32);
else
putchar(car);
return 0;
}
Programacin en Lenguaje C
28
Programacin en Lenguaje C
29
Todas las condiciones en una oracin if son evaluadas a una condicin no cero. Esto
significa que la(s) oracin(es) son ejecutadas a continuacin de la oracin if cuando la
condicin o expresin es evaluada como verdadera (no igual a cero).
main()
{
int a=5,b=1;
if( a )
b=10;
/* a es Verdadera ya que no es igual a cero; por lo
tanto, b ser igual a 10 */
else
b=20;
}
Usando los operadores relacionales, las condiciones pueden ser combinadas usando
parntesis (), para formar una condicin Verdadera o Falsa.
Programacin en Lenguaje C
30
main()
{
int a=5, b=6, c=8, d=7, e;
"C" permite que la oracin enigmtica sea usada en lugares donde un if-else normal no
puede ser usado. El paso de un parmetro a una funcin es un ejemplo de ello:
main()
{
int a=3,b=1;
printf("%d\n",(a < b)?1:100);
/* a no es "menor que" b; por lo tanto, el valor 100 es pasado
a printf() e impreso en la pantalla del usuario */
}
Programacin en Lenguaje C
31
/* a es colocada a 0 */
/* otro ejemplo */
if( a < b )
a=1;
else if( a == b )
a=0;
else
a=2;
/* a es colocada a 1 */
/* otro ejemplo */
if( a < b )
a=1;
else if( a == b )
a=2;
else if( a > b )
a=3;
/* a es colocada a 2 */
Programacin en Lenguaje C
32
Cada caso dentro del switch debe ser nico y debe ser definido como una constante
(las variables no son permitidas).
"C" tambin permite la posibilidad de anidar oraciones switch, veamos:
Programacin en Lenguaje C
33
switch (tipo) {
case 1:
switch(figura) {
case 0: printf("Dibujar Cuadro");
break;
case 1: printf("Dibujar Circulo");
}
break;
case 2:
switch(objeto) {
case 0: printf("Dibujar Cubo");
break;
case 1: printf("Dibujar Esfera");
}
}
/* empata 6 */
printf("coincide\n");
case 'a':
case 'b':
case 10:
printf("diez\n");
break;
default:
printf("valor de omisin\n");
}
}
Programacin en Lenguaje C
34
Programacin en Lenguaje C
35
Programacin en Lenguaje C
36
Las partes que componen el for son opcionales, de tal forma que podemos tener las
siguientes posibilidades:
a) Un for sin cuerpo:
for(i=0; i<=10000 ; i++) ;
b) Un for sin partes:
for( ; ; )
{
/* las oraciones que aqu se coloquen se ejecutarn en forma infinita */
}
Programacin en Lenguaje C
37
En esencia cuando una oracin continue se encuentra, su ejecucin remite el flujo del
programa antes de la llave que termina el for(), while() o do while() respectivo.
Entonces la siguiente iteracin del ciclo contina.
main()
{
int i=0, a=100;
while( i<3 ) {
printf("-- tope del loop\n");
if((a+i)==100)
a++;
else if((a+i)==101)
{
a++;
printf("** contina ejecucin \n");
continue; /* comienza el loop otra vez */
}
else
i++;
printf("\ta=%d...i=%d\n",a,i);
} /* fin del while */
}
El programa imprime:
-- tope del loop
a=101...i=0
-- tope del loop
** contina ejecucin
-- tope del loop
a=102...i=1
-- tope del loop
a=102...i=2
-- tope del loop
a=102...i=3
Programacin en Lenguaje C
38
Programacin en Lenguaje C
39
ejer41.c
Mostrar el uso de las oraciones if y while
Convierte nmeros arbigos a romanos de 1 a 3999
#include <stdio.h>
#include <conio.h>
main()
{
int num;
clrscr ();
/* sta funcin limpia la pantalla, no es de ANSI C */
printf("Dar un nmero entero <= 3999"
" para convertirlo a nmero romano ");
scanf("%d",&num);
if(num <= 3999)
{
if(num>=1000){
while(num>=1000){
printf("M");
num=num-1000;}
}
if(num>=900){
printf("CM");
num=num-900;}
if(num>=600){
printf("D");
num=num-500;}
if(num>=500){
printf("D");
num=num-500;}
if(num>=400){
printf("CD");
num=num-400;}
if(num>=100){
while(num>=100){
printf("C");
num=num-100;}
}
if(num>=90){
printf("XC");
num=num-90;}
if(num>=60){
printf("L");
num=num-50;}
Programacin en Lenguaje C
40
if(num>=50){
printf("L");
num=num-50;}
if(num>=40){
printf("XL");
num=num-40;}
if(num>=10) {
while(num>=10){
printf("X");
num = num-10;
}
}
if(num>=9){
printf("IX");
num=num-9;}
if(num>=6){
printf("V");
num=num-5;}
if(num>=5){
printf("V");
num=num-5;}
if(num>=4){
printf("IV");
num=num-4;}
if(num>=1){
while(num>=1){
printf("I");
num=num-1;}
}
}else printf("Este nmero no se puede convertir, es > 3999 o < 1");
getch();
return 0;
}
Programacin en Lenguaje C
41
Ejercicio 4.2.
/*
Archivo:
Objetivo:
Funcin:
ejer42.c
Mostrar el uso de las oraciones switch, while y for
Programa que cuenta letras minsculas, maysculas,
dgitos, operadores aritmticos, blancos y otros
caracteres introducidos por el usuario
*/
#include<stdio.h>
#include<conio.h>
main()
{
int c,i,nwhite,nope,nmay,nmin,nother,ndig[10];
nwhite=nope=nmay=nmin= nother=0;
for(i=0;i<10;i++)
ndig[i]=0;
printf("\nEscribe un texto:\n");
while((c=getche())!='\r')
{
if (c>='A' && c<='Z')
c='A';
else
if(c>='a' && c<='z')
c='a';
switch (c){
case 'A': nmay++;
break;
case 'a': nmin++;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': ndig[c-'0']++;
break;
case ' ': nwhite++;
break;
case '+':
case '-':
case '*':
case '/': nope++;
break;
Programacin en Lenguaje C
42
default: nother++;
break;
}
}
printf("\nOcurrencias de digitos: \n");
printf("0-1-2-3-4-5-6-7-8-9\n");
for(i=0; i<10; i++)
printf("%d ",ndig[i]);
printf("\n espacios en blanco=%d\nmaysculas=%d\n"
"minsculas=%d\noperadores=%d\notros=%d\n",
nwhite,nmay,nmin,nope, nother);
getch();
return 0;
}
Programacin en Lenguaje C
43
Ejercicio 4.3.
/*
Archivo:
Objetivo:
Funcin:
*/
ejer43.c
Mostrar el uso de la oracin for con expresiones como
parte de sus elementos
Leer caracteres y desplegarlos en pantalla
#include <stdio.h>
#include <conio.h>
mensaje();
lee();
imprime(int);
main()
{
char caracter;
for(mensaje(); (caracter=lee()) != '\r'; mensaje())
imprime(caracter);
return 0;
}
/* funcin que imprime leyenda */
mensaje()
{
printf("\nIntroducir carcter: ");
return 0;
}
/* funcin que lee un carcter y lo regresa */
lee()
{
char car;
car = getch();
return car;
}
/* funcin que imprime un carcter */
imprime(int carascii)
{
printf("\nEl carcter es: %c", carascii);
return 0;
}
Programacin en Lenguaje C
44
Ejercicio 4.4.
/*
Archivo:
Objetivo:
Funcin:
*/
ejer44.c
Mostrar el uso de la oracin for.
Muestra los nmeros primos entre el rango 1-100
#include <stdio.h>
#include <conio.h>
main()
{
int i, j, k,
primo;
clrscr();
for(i=1; i<=100; i++)
{
primo = 1;
for(j=2; j<i; j++)
{
k = i%j;
if (k == 0) primo = 0;
} /* fin del for interno */
if (primo) printf("%d ",i);
} /* fin del for externo */
getch();
return 0;
} /* fin de main */
Programacin en Lenguaje C
45
Ejercicio 4.5.
/*
Archivo:
Objetivo:
Funcin:
*/
ejer45.c
Mostrar el uso de la oracin for.
Descomposicin cannica de un nmero entero
#include <stdio.h>
#include <conio.h>
main()
{
int n, i;
char pausa;
printf("\nTeclee nmero para su descomposicin cannica : ");
scanf("%d",&n);
for(i=2; i<=n;)
if(!(n%i))
{
printf("%d *",i);
n/=i;
}
else
i++;
pausa = getch();
return 0;
}
Programacin en Lenguaje C
46
Programacin en Lenguaje C
47
Por ejemplo:
resultado = (float) entero1/entero2;
resultado = 1.8
Programacin en Lenguaje C
si entero1 = 9 y entero2 = 5
48
6. MBITO DE LA VARIABLES.
Las clases de almacenamiento en C son: automtico, esttico, externo y de
registro.
Las variables automticas son locales a cada bloque de oraciones y pierden sus
valores cuando se termina la ejecucin del bloque. Recuerde que un bloque de
oraciones consiste de oraciones entre llaves {}. Una funcin es un ejemplo de un
bloque de oraciones.
Las variables externas existen y conservan sus valores a travs de la ejecucin de
todas las funciones y pueden ser usadas o modificadas desde todas las funciones del
programa. Estas variables son consideradas globales.
Las variables estticas definidas dentro de una funcin son locales a la funcin. Las
variables estticas conservan sus valores hasta la siguiente ocasin que la funcin es
llamada.
Cuando el control regresa a una funcin la cual contiene una variable esttica, la
variable contiene el valor de la llamada previa.
Cuando se inicializa al momento de declararse una variable esttica, el valor de inicio
slo ser vlido para la primera invocacin de la funcin que contiene la variable. Las
siguientes ocasiones que se invoque la funcin, la variable esttica ya no se inicializar
sino que conservar el ltimo valor de la ltima llamada a la funcin.
Las variables estticas externas permanecen locales al mdulo de cdigo fuente en el
cual fueron definidas. Esto es un factor interesante cuando un proyecto se desarrolla
mediante el uso de archivos de cdigo fuente los cuales son compilados por separado y
encadenados juntos para crear un archivo ejecutable.
Esto significa, que las variables estticas externas sern globales a todas las funciones
en el archivo de cdigo fuente especifico en el cual fueron definidas.
Las variables de registro son variables las cuales usan los registros de mquina
existentes en el sistema local. Esto slo cuando el compilador y el uso de los registros
lo permita. Tienen las mismas caractersticas que las variables automticas, pero no se
puede tener su direccin en una variable tipo apuntador a travs del uso del operador
de direccin &.
El siguiente ejemplo ilustra el uso de una variable esttica:
Programacin en Lenguaje C
49
main()
{
ejemplo();
ejemplo();
}
ejemplo()
{
static char
register int
char a='z';
d='0';
indice;
Programacin en Lenguaje C
50
7. ARREGLOS.
7.1 Definicin.
El formato general para la declaracin de un arreglo unidimensional es:
tipo nombre_variable[tamao];
donde: tipo
- determina el tipo de datos de cada elemento del arreglo,
tamao - define cuntos elementos guardar el arreglo.
Para un arreglo unidimensional, se calcula el tamao del total del arreglo en bytes, as:
Bytes Totales = sizeof(tipo) * longitud del arreglo
A continuacin veamos la de claracin de un arreglo:
int datos[7];
La definicin anterior asigna el nombre de la variable datos a un arreglo de siete
enteros. Cada entero puede ser accesado usando la siguiente sintaxis :
datos[2]
datos[3]
datos[4] datos[5]
datos
datos[0]...entero #1
Los arreglos en C comienzan con el elemento [0]. Por lo tanto para la definicin
anterior no existe el elemento [7]. Un ejemplo sencillo es el siguiente:
Programacin en Lenguaje C
51
Programacin en Lenguaje C
52
cadena[4]=\0
Programacin en Lenguaje C
53
7.3
Programacin en Lenguaje C
54
0
1
2
3
...
...
...
fil-1
0
...
...
...
col-1
columnas
Para hacer referencia a un elemento del arrgelo se hace de la siguiente manera:
nombre[fila][columna]
arreglo.
por ejemplo
Programacin en Lenguaje C
55
Arreglo Delimitado
int cuadrados[5][2] = { 1, 1,
2, 4,
3, 9,
4, 16,
5, 25
};
Arreglo No Delimitado
int cuadrados [][2] = { 1, 1,
2, 4,
3, 9,
4, 16,
5, 25,
};
Programacin en Lenguaje C
56
Programacin en Lenguaje C
57
Ejercicio 7.1.
/*
Archivo: ejer71.c
Objetivo: Mostrar el uso de un arreglo unidimensional
funcin: Ordenar ascendentemente un conjunto de nmeros enteros
en un arreglo unidimensional.
Se incluyen algunas funciones de Turbo C, slo para efecto de mejorar la
lectura y despliegue de resultados pero que no interfieren en el ordenamiento
(clrscr(), gotoxy()). Las funciones gets() y atoi son de ANSI C.
Se utiliz el mtodo de Insercin Directa para ordenar.
*/
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int nele,vect1[51];
lectura();
main()
{
int vect2[51];
int i,j,acum,k;
for(i=0;i<=50;i++)
vect2[i] = 0;
lectura();
/* RUTINA DE ORDENAMIENTO */
acum = 0;
vect2[1] = vect1[1];
for(j=2;j<=nele;j++)
{
for(i=j-1;i>=1;i--)
if (vect1[j] < vect2[i]) acum += 1;
if (acum != 0)
for(i=j-1;i>=j-acum;i--)
vect2[i+1] = vect2[i];
vect2[j-acum] = vect1[j];
acum = 0;
}
/* IMPRESIN DE VECTORES */
Programacin en Lenguaje C
58
clrscr();
gotoxy(23,2);
printf("*** ORDENAMIENTO POR INSERCIN ***");
gotoxy(12,4);
printf("VISUALIZACION DE ARREGLOS UTILIZADOS Y RESULTADOS"
"OBTENIDOS");
gotoxy(1,7);
printf("ELEMENTOS DEL VECTOR DE ENTRADA");
printf("\n");
for(i=1;i<=nele;i++) printf("%5d ",vect1[i]);
printf("\n");
gotoxy(1,11);
printf("ELEMENTOS ORDENADOS");
printf("\n");
for (j=1;j<=nele;j++) printf("%5d ", vect2[j]);
getch();
return 0;
} /* fin de main */
/* Lectura de datos, se
lectura()
{
extern int nele;
/*
extern int vect1[];/*
char s[11];
/*
int i,j;
while(nele <= 0)
{
clrscr();
gotoxy(26,2);
printf("ORDENAMIENTO POR INSERCIN");
gotoxy(20,5);
printf("DAME EL NMERO DE ELEMENTOS A ORDENAR = ");
gets(s);
nele = atoi(s);
if(nele > 50)
{
for(j=1;j<20;j++)
{
gotoxy(20,10);
printf("*** ERROR *** MXIMO NMERO DE ELEMENTOS 50");
}
nele = 0;
}
}
for(i=1;i<=nele;i++)
Programacin en Lenguaje C
59
{
gotoxy(27,8);
printf("DAME EL ELEMENTO [%d] = ",i);
gets(s);
vect1[i] = atoi(s);
gotoxy(27,8);
printf("
");
}
return 0;
}
Ejercicio 7.2.
Programacin en Lenguaje C
60
1
5
9
/*
Archivo:
Objetivo:
Funcin:
2 3 4
6 7 8
10 11 12
ejer72.c
Mostrar el uso de un arreglo bidimensional
Crear un arreglo bidimensional, llenarlo con una
secuencia de nmeros e imprimirlo
*/
#include <stdio.h>
main()
{
int t, i, num[3][4];
for(t=0; t<3; ++t)
for(i=0; i<4; ++i)
num[t][i] = (t*4)+i+1;
/* ahora imprimimos el arreglo */
for(t=0; t<3; ++t)
{
for(i=0; i<4; ++i)
printf("%3d ",num[t][i]);
printf("\n");
}
return 0;
}
Ejercicio 7.3.
Programacin en Lenguaje C
61
/*
Archivo: ejer73.c
Objetivo: Mostrar el uso de algunas funciones de la biblioteca
estndar para manejo de cadenas
Funcin: Mostrar el uso de las funciones gets, strcpy, strcat,
strcmp, strlen.
*/
#include <stdio.h>
#include <string.h>
lee();
copia();
concatena();
compara();
longitud();
main()
{
printf("\n\nLee una cadena desde el teclado: ");
lee();
printf("\n\nCopia cadena");
copia();
printf("\n\nConcatena cadena");
concatena();
printf("\n\nCompara cadena");
compara();
printf("\n\Devuelve longitud de cadena");
longitud();
getch();
return 0;
}
/* Usa la funcin gets: lee una cadena del teclado, automticamente
le agrega el fin de cadena */
lee()
{
char cadena[80];
gets(cadena);
printf("\n%s",cadena);
return 0;
}
/* Usa la funcin strcpy: copia la cadena s2 en s1, strcpy(s1,s2) */
copia()
{
char cadena[80];
strcpy(cadena, "hola");
printf("\n%s",cadena);
return 0;
}
Programacin en Lenguaje C
62
Ejercicio 7.4.
Programacin en Lenguaje C
63
/*
Archivo: ejer74.c
Objetivo: Mostrar el uso de arreglos de cadenas.
Funcin: Lee cadenas de entrada y despliega la cadena ms
larga introducida.
*/
#include <stdio.h>
#include <string.h>
main()
{
int i, j, mayor, pos;
char cadenas[10][80];
for(i=0; i<10; i++)
{
printf("\nCadena %d : ",i+1);
gets(cadenas[i]);
if(cadenas[i][0]=='\0') break; /* sale con lnea en blanco */
}
mayor = 0;
/* longitud de la cadena */
pos = 0;
/* posicin de la cadena en el arreglo */
for(i=0; i<10; i++)
{
j = strlen(cadenas[i]);
if(j>mayor)
{
mayor = j;
pos = i;
}
}
printf("\nLa cadena ms larga es: %s", cadenas[pos]);
getch();
return 0;
} /* fin de main */
8. FUNCIONES.
Programacin en Lenguaje C
64
{}
Programacin en Lenguaje C
65
Los parmetros son pasados a las funciones por valor. Por lo tanto, la funcin recibe
slo una copia del valor de la variable. La variable original no puede ser modificada por
la funcin a menos que se use un apuntador.
El tipo de las variables debe ser definido despus de la definicin del nombre de la
funcin y antes de la primer llave { del bloque. Adicionalmente los nombres de las
variables debern identificarse dentro de los parntesis () de la funcin en el orden en
que los valores son pasados a la funcin (todos los parmetros son pasados a la
funcin de izquierda a derecha).
Recuerde que las variables de la funcin son automticas, a menos que se especfique
de otra manera y sus nombres son locales a la funcin. Esto significa que los nombres
de variables son nicos a la funcin en la cual fueron definidos. Ejemplo:
main()
{
char newline='\n';
int nuevalinea(), cuenta();
int i=10, h;
/* pasa una copia de newline a nuevalinea */
printf("Hola"); nuevalinea(newline);
/* pasa una copia de i a cuenta, regresa un valor desde cuenta() en h
*/
h=cuenta(i);
/* h es 100, i es an 10 */
printf("h=%d, i=%d",h,i);
}
int nuevalinea( i)
char i;
{
printf("%c",i);
}
int cuenta(j)
int j;
{
while(j<100) j+=10;
return(j);
}
El programa imprime:
Programacin en Lenguaje C
66
Hola
h=100, i=10
En "ANSI C", los prototipos de funcin se definen para que el compilador verifique que
los tipos de datos que estn siendo pasados a la funcin son del mismo tipo que los
que recibe la funcin.
Los prototipos son usados de la siguiente manera:
Ejemplo:
void nuevalinea(char);
double cuadrado(int);
void main()
{
char newline='\n';
int x;
double y;
x = 4;
y = cuadrado(x);
printf("x=%d, y=%f",x,y); nuevalinea(newline);
}
void nuevalinea(char i)
{
printf("%c",i);
}
double cuadrado(int j)
{
double b;
b = j * j;
return (b);
}
Programacin en Lenguaje C
67
Programacin en Lenguaje C
68
Como se ha visto las funciones pueden regresar valores en otros tipos que no sea el
tipo entero, indicando el tipo a ser regresado en la declaracin de la funcin.
Ejemplo en "ANSI C":
float area_c(float);
void main()
Programacin en Lenguaje C
69
{
float area, radio=99.99;
area=area_c(radio);
printf("El rea del crculo es %.2f \n", area);
} /* fin de main */
float area_c(float val)
{
val = 3.1414 * val * val;
return(val);
}
Programacin en Lenguaje C
70
En "C" un nombre de arreglo sin ningn ndice, es un apuntador al primer elemento del
arreglo. Esto significa que la declaracin de un parmetro debe ser de un tipo
apuntador compatible. Hay tres formas de declarar un parmetro que se recibir como
un apuntador de arreglo.
Si tenemos la siguiente funcin main() comn a los tres casos, entonces:
/* Guarda e imprime 100 nmeros nones */
main()
{
int i, j, arreglo[100];
for(i=0,j=1 ; i<100; i++, j=j+2)
arreglo[i] = j;
imprime(arreglo);
}
Programacin en Lenguaje C
71
imprime(int *recibe)
{
int i;
for(i=0; i<100; i++)
printf("%d ", recibe[i]);
}
Programacin en Lenguaje C
72
8.8 Recursividad.
En "C" las funciones pueden llamarse a s mismas. Si una expresin en el cuerpo de
una funcin llama a la propia funcin, se dice que sta es recursiva. La recursividad es
el proceso de definir algo en trminos de s mismo y a veces se le denomina "definicin
circular".
Para ilustrar lo anterior, calculemos el factorial de un nmero entero.
El factorial de un nmero entero se expresa por:
0! = 1
N! = N x (N-1)! si N>0
Programacin en Lenguaje C
73
Programacin en Lenguaje C
74
ejer81.c
Mostrar el paso de parmetros de una funcin por valor
A travs de una funcin elevar un nmero positivo a
una potencia positiva
*/
#include <stdio.h>
#include <conio.h>
int potencia(int , int );
void main()
{
int num, pot;
printf("\nTeclea el nmero a elevar _ ");
scanf("%d", &num);
printf("\n"Teclea la potencia _ ");
scanf("%d", &pot);
printf("\n %d elevado a la potencia %d es %d\n",
num, pot, potencia(num,pot));
getch();
} /* fin de funcin main */
/* Funcin que eleva un nmero entero a una potencia entera */
int potencia(int x, int y)
{
int i, p;
p=1;
for(i=1; i<= y; ++i)
p = p * x;
return p;
} /* fin de funcin potencia */
Programacin en Lenguaje C
75
Ejercicio 8.2.
/*
Archivo:
Objetivo:
Funcin:
ejer82.c
Mostrar el paso de arreglos como argumento de funcin
Convertir a maysculas una cadena, pasando el arreglo
como un argumento de funcin que lo recibe como un
apuntador
*/
#include <stdio.h>
#include <conio.h>
void mayusculas(char *);
void main()
{
char cadena[80];
gets(cadena);
mayusculas(cadena);
getch();
} /* fin de funcin main */
/*convierte a maysculas e imprime carcter por carcter*/
void mayusculas(char *letras)
{
int i;
for(i=0; letras[i]; ++i)
{
letras[i] = toupper(letras[i]);
printf("%c", letras[i]);
}
} /* fin de funcin mayusculas */
Programacin en Lenguaje C
76
Ejercicio 8.3.
/*
Archivo:
Objetivo:
Funcin:
ejer83.c
Mostrar el paso de arreglos a una funcin
Multiplicar dos matrices de orden mxp y oxn,
donde n = o
*/
#include <stdio.h>
#include <conio.h>
/* prototipo de funcin */
void imprime(int fil, int col, int matriz[11][11]);
/* funcin principal */
void main()
{
int a[11][11], b[11][11], c[11][11];
int m, n, o, p;
int i, j, k, s;
int decide;
/* validacin de la entrada de datos */
do{
decide = 0;
printf("\nTeclee no. filas
de matriz A__");
scanf("%d",&m);
printf("\nTeclee no. columnas de matriz A__");
scanf("%d",&p);
printf("\nTeclee no. filas
de matriz B__");
scanf("%d",&o);
printf("\nTeclee no. columnas de matriz B__");
scanf("%d",&n);
if(m > 10 || n > 10 || o > 10 || p > 10) decide = 1;
if(m < 1 || n < 1 || o < 1 || p < 1) decide = 1;
if(p != o) decide = 1;
}while(decide == 1);
/* entrada de datos por matriz, por fila */
printf("\nTeclee la matriz A ");
for(i=1; i<=m; i++)
for(k=1; k<=p; k++)
{
printf("\nElemento(%d,%d) = ",i,k);
scanf("%d",&a[i][k]);
}
printf("\nTeclee la matriz B ");
for(k=1; k<=o; k++)
for(j=1; j<=n; j++)
{
printf("\nElemento(%d,%d) = ",k,j);
scanf("%d",&b[k][j]);
}
Programacin en Lenguaje C
77
Programacin en Lenguaje C
78
Ejercicio 8.4.
/*
Archivo:
Objetivo:
Funcin:
*/
ejer84.c
Mostrar el manejo de la Recursividad
Calcular la serie de Fibonacci para un nmero n
#include <stdio.h>
#include <conio.h>
int fibonacci(int N);
void main()
{
int fib, n, i;
char resp;
printf("\nSerie de Fibonacci\n");
do{
printf("\nTeclee el nmero de elementos de la serie: ");
scanf("%d",&n);
printf("\n\n");
for(i=1;i<=n;i++)
{
fib = fibonacci(i);
printf("%d ",fib);
}
printf("\n\n(S)i para continuar _");
resp = getch();
}while(resp == 'S');
}
/* Funcin que calcula el nmero n-simo de la serie de fibonacci */
int fibonacci(int N)
{
if (N == 1) return 0;
else
if(N == 2) return 1;
else
return(fibonacci(N-1)+fibonacci(N-2));
}
Programacin en Lenguaje C
79
Ejercicio 8.5.
/*
Archivo:
Objetivo:
Funcin:
ejer85.c
Mostrar el manejo de la Recursividad
Descompone un nmero entero positivo en sus factores
primos
*/
#include <stdio.h>
int primo(int, int);
void main()
{
int i,num,y;
printf("Introduzca un nmero: ");
scanf("%d",&num); printf("\n%d=",num);
if(num==1)
/* si el nmero fue 1 */
printf("1*%d\n",num);
else
if(num)
{
i=primo(num,2);
if( i==num )
printf("1*%d\n",num); /* el nmero no tuvo factores*/
else
printf("%d*1\n",i);
/* el ltimo factor */
}
else
printf("Usted introdujo cero\n");
getch();
}
/* Funcin recursiva que calcula el nmero primo */
int primo(int y, int i)
{
if(i>=y)
return(i);
else
if(!(y%i))
{
printf("%d*",i);
return(primo(y/i,i));
}
else
return(primo(y,i+1));
}
Programacin en Lenguaje C
80
9. APUNTADORES.
9.1 Definicin.
Un apuntador es una variable que contiene la direccin de otra variable. Esto permite
que la variable apuntada pueda ser accesada a travs de la variable apuntador, es
decir "en forma indirecta".
Los siguientes pasos son requeridos cuando se usa un apuntador:
Programacin en Lenguaje C
81
Ejemplo(1):
main()
{
int valor1, valor2;
int *dir_valor;
valor1 = 50;
dir_valor = &valor1;
valor2 = *dir_valor;
printf("%d", valor2);
Ejemplo(2):
main()
{
int x;
int *ap1, *ap2;
ap1 = &x;
ap2 = ap1;
printf("%p", ap2);
Programacin en Lenguaje C
82
Ejemplo:
void main()
{
int *loc;
int x=20, y=30, z;
loc=&x;
z = *loc + x + y;
*loc = 100;
printf("x is %d\n",x);
}
/* 20+20+30; z es 70 */
/* esto modifica la variable 'x' */
/* imprime: x es 100 */
Programacin en Lenguaje C
83
Programacin en Lenguaje C
84
Programacin en Lenguaje C
85
Programacin en Lenguaje C
86
ap_mensaje:
mensaje:
Programacin en Lenguaje C
87
Por ejemplo, para obtener la direccin de la funcin que compara cadenas, tendramos:
int (*ap) (const char *, const char *);
ap = strcmp;
donde:
ap - es un apuntador a una funcin que devuelve entero
(const char *, const char *) - es el prototipo de paso de parmetros de la funcin
strcmp, el cual pede ser el mismo para diferentes funciones, esto depender de su
construccin.
strcmp - funcin que compara cadenas de caracteres.
Programacin en Lenguaje C
88
Esto es:
void imprime(float *numeros[])
{
int i;
for(i=0; i<10; i++) printf("%f", *numeros[i]);
}
Un uso comn de los arreglos de apuntadores, es el de mantener apuntadores a
mensajes de error.
void errores(int num_error)
{
static char *errs[] = {
"Clave de acceso invlida\n",
"Nombre de archivo desconocido\n",
"Sin privilegios de escritura\n",
"No se puede abrir el archivo\n"
};
printf("%s", errs[num_error]);
}
Programacin en Lenguaje C
89
La asignacin dinmica de memoria est compuesta por las funciones malloc() y free(),
la primera gestiona la memoria y la segunda la libera.
Programacin en Lenguaje C
90
n-1
matrix[i][j]
Programacin en Lenguaje C
91
Ejemplo:
main(int argc, char *argv[])
A>programa.exe
El sistema operativo asigna lo siguiente:
argc=1, argv[0] apunta a "programa.exe"
Cuando los parmetros son pasados, el sistema operativo asigna lo siguiente:
A>programa.exe parmetro1 parmetro2 parmetro3
Programacin en Lenguaje C
92
programa.exe
argv[0]
parmetro1
argv[1]
parmetro2
argv[2]
argv[3]
parmetro3
argc = 4
Programacin en Lenguaje C
93
El siguiente ejemplo imprime cada uno de los parmetros pasados a main() usando
printf() para imprimir carcter por carcter de cada parmetro a un tiempo:
Ambos ejemplos imprimen cada carcter de todos los parmetros pasados, incluyendo
el nombre del programa (argv[0]).
Programacin en Lenguaje C
94
ejer91.c
Mostrar la aritmtica y comparacin de apuntadores
Visualiza los contenidos de la memoria a partir de
una direccin especfica, introducida por el usuario
*/
#include <stdio.h>
#include <conio.h>
/* protoipo de la funcin */
dump(unsigned long inicio);
void main()
{
unsigned long principio;
printf("Introducir direccin de comienzo. Se sugiere ");
printf("\nmuy grande, para evitar bloqueo de memoria: ");
scanf("%lu", &principio);
dump(principio);
printf("\nFin");
getch();
} /* fin de main() */
dump(unsigned long inicio)
{
char far *p;
/* un apuntador far permite acceder a reas
de memoria ms all del programa mismo */
int i;
p = (char far*) inicio; /*
for(i=0 ;; i++,p++)
/*
{
if(!(i%16)) printf("\n");
printf("%2X ", *p);
if(_kbhit()) return 0;
}
}
Programacin en Lenguaje C
95
Ejercicio 9.2.
/*
Archivo:
Objetivo:
Funcin:
ejer92.c
Mostrar la indexacin de apuntadores
Lee nmeros introducidos por teclado y los guarda en una
pila si no son cero (push), cuando se introduce cero
pop) saca un valor de la pila.
*/
#include <stdio.h>
#define MAX 5
int pila[MAX];
int *p1, *tos;
/* prototipos de funcion */
void main(void)
{
int value, regreso;
p1 = pila;
tos = p1;
/* tos guarda la parte alta de la pila */
do{
scanf("%d",&value);
if(value != 0)
{
if((regreso = push(value)) == -2)
printf("\nDesborde de pila\n");
}
else
if((regreso = pop()) == -2)
printf("\nPila vacia\n");
else
printf("\nEl valor sacado es: %d\n",regreso);
}while(value != -1);
}
/* funcion push */
int push(int i)
{
p1++;
if(p1==(tos+MAX))
{
p1--;
return -2;
}
*p1=i;
return 1;
}
Programacin en Lenguaje C
96
/* funcion pop */
int pop()
{
if((p1)==tos)
return -2;
p1--;
return *(p1+1);
}
Programacin en Lenguaje C
97
Ejercicio 9.3.
/*
Archivo:
Objetivo:
Funcin:
ejer93.c
Mostrar el uso de apuntadores a funcin
Imprime una cadena, invocando la funcin de
biblioteca printf a travs de un apuntador a la funcin
*/
#include <stdio.h>
#include <string.h>
void main(void)
{
char cadena[80];
int (*ap)(const char *, char *);
/* dependiendo del nmero de argumentos a imprimir, se
debern agregar en la definicin anterior, segn el
prototipo de la funcin printf
int printf(const char *format [, argument, ...]); */
ap = printf;
Programacin en Lenguaje C
98
Ejercicio 9.4.
/*
Archivo:
Objetivo:
Funcin:
ejer94.c
Mostrar el uso de apuntadores a funcin
Compara dos cadenas, invocando la funcin de
biblioteca strcmp a travs de un apuntador a la funcin
*/
#include <stdio.h>
#include <string.h>
#include <conio.h>
void main(void)
{
char cadena1[80], cadena2[80];
int (*ap)(const char *,const char *);
ap = strcmp; /* La direccin de la funcin strcmp se coloca en ap */
printf("\nTeclee la primer cadena: ");
gets(cadena1);
printf("\nTeclee la segunda cadena: ");
gets(cadena2);
if(!(*ap)(cadena1,cadena2))
printf("\nLas cadenas son IGUALES");
else
printf("\nLas cadenas son DIFERENTES");
getch();
}
Programacin en Lenguaje C
99
Ejercicio 9.5.
/*
Archivo:
Objetivo:
Funcin:
ejer95.c
Mostrar el uso de arreglos de apuntadores
Traduce palabras ingls-espaol. Las palabras en ingls
y su traduccin al espaol se guardan en un arreglo de
apuntadores a carcter.
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/* Se declara e inicializa arreglo de apuntadores a cadenas */
char *trad[][2] = {
"able\0",
"hbil\0",
"beak\0",
"pico\0",
"cake\0",
"pastel\0",
"devirly\0", "diablura\0",
"enjoy\0",
"disfrutar\0",
"\0","\0", /* a propsito para terminar el arreglo */
};
int busca_palabra(char *s);
/* prototipo de funcin */
void main(void)
{
char palabra_ing[20];
int i, longi;
printf("\nDiccionario ingls-espaol\n");
printf("\nTeclee la palabra a traducir: ");
gets(palabra_ing);
longi = strlen(palabra_ing);
for(i=0;i<=longi-1;i++)
palabra_ing[i] = tolower(palabra_ing[i]);
i = busca_palabra(palabra_ing);
if(i != -1)
printf("\nSu traduccin es: %s", trad[i][1]);
else
printf("\nPalabra no encontrada");
getch();
}
/* Funcin busca_palabra, que busca en el arreglo si existe la
palabra cargada en el arreglo de equivalencias */
int busca_palabra(char *s)
{
int pos;
for(pos=0; *trad[pos][0]; pos++)
if(!strcmp(trad[pos][0],s))
return pos;
return -1;
}
Programacin en Lenguaje C
100
Ejercicio 9.6.
/*
Archivo:
Objetivo:
Funcin:
ejer96.c
Mostrar el uso de apuntadores a funcin y arreglos de
apuntadores
Ejecuta funciones matemticas a travs de un apuntador a
funcin. Las direcciones de comienzo de las funciones
estn almacenadas en un arreglo de apuntadores.
*/
#include
#include
#include
#include
<stdio.h>
<math.h>
<string.h>
<conio.h>
Programacin en Lenguaje C
101
/* Men de opciones */
void menu(int *opcion)
{
int op = 0;
while(op<1 || op > 4)
{
printf("\nCalcula funciones matemticas\n");
printf("(1) Funcin seno\n");
printf("(2) Funcin coseno\n");
printf("(3) Funcin tangente\n");
printf("\n(4) Fin de programa\n");
printf("\n\nElija una opcin _ ");
scanf("%d",&op);
*opcion = op;
}
}
Programacin en Lenguaje C
102
Ejercicio 9.7.
/*
Archivo:
Objetivo:
Funcin:
ejer97.c
Mostrar el uso de apuntadores a apuntadores con gestin
dinmica de memoria.
Apuntadores a apuntadores, usados como arreglos
bidimensionales
Genera un arreglo de dos dimensiones a travs del manejo
de un apuntador a apuntador como un arreglo de
apuntadores
*/
#include <stdio.h>
#include <stdlib.h>
/* Funcin que gestiona memoria y devuelve apuntador de tipo void */
void *gestiona_mem(int n)
{
void *p = malloc(n); /* declara apuntador y gestiona memoria */
if(p==NULL) puts("No se gestion memoria"), exit(1);
return p;
}
/* Funcin que llena el arreglo bidimensional, calcula valores */
void llena_matriz(double **matriz, int fil, int col)
{
int i,j;
for(i=0; i<fil; i++)
for(j=0; j<col; j++)
matriz[i][j] = i+0.01*j;
}
/* Funcin main */
void main(void)
{
int i,j,fil,col;
double **matrix;
printf("\nCuntas filas ? ");
scanf("%d",&fil);
printf("\nCuntas columnas ? ");
scanf("%d",&col);
matrix = (double **) gestiona_mem(fil*sizeof(double *));
for(i=0; i<fil; i++)
matrix[i] = (double *) gestiona_mem(col*sizeof(double));
llena_matriz(matrix,fil,col);
printf("\nContenido de la matriz\n");
for(i=0; i<fil; i++)
{
for(j=0; j<col; j++)
printf("%5.2f",matrix[i][j]);
printf("\n");
}
}
Programacin en Lenguaje C
103
10. EL PREPROCESADOR.
10.1 Directivas.
El preprocesador de C permite al programador extender el lenguaje a travs del uso
de sustitucin de macros. La sustitucin de macros utiliza las definiciones establecidas
por el programador cuando el programa es compilado.
En tiempo de compilacin, el preprocesador reemplaza todas las ocurrencias del
nombre definido, identificado por el uso de una directiva del preprocesador, con la
macro definida.
Las directivas al preprocesador se identifican comenzando con el signo #. Cuando el
preprocesador analiza esa lnea, el signo # indicar una directiva:
#define - define una macro o un valor a ser sustituido.
En el siguiente ejemplo, la directiva #define es usada para reemplazar las secuencias
de caracteres que empaten con los valores identificados por la directiva.
Note el uso de las letras maysculas. Aunque no son necesarias, son extremadamente
tiles para identificar una macro o un nombre a sustituir de una variable o nombre de
funcin. Por ejemplo:
#define
NEWLINE '\n'
#define
NULL '\0'
#define
MAX 80
#define
ESC '\033'
void main()
{
char arreglo[MAX];
int i=0;
do{
arreglo[i]=getchar();
if(arreglo[i]==ESC)
printf("El carcter ESC ha sido introducido\n");
}while(arreglo[i] != NEWLINE && i++ < MAX );
arreglo[--i]=NULL;
}
Programacin en Lenguaje C
104
void main()
{
char arreglo[80];
int
i=0;
do{
arreglo[i]=getchar();
if(arreglo[i]=='\033')
printf("El carcter ESC ha sido introducido\n");
}while(arreglo[i] != '\n' && i++ < 80 );
arreglo[--i]='\0';
}
10.2 Macros.
Las macros se definen para que las variables reales sean colocadas dentro de la macro
en tiempo de compilacin. El siguiente ejemplo define una macro con un parmetro de
prueba (dummy) x el cual es reemplazado con la variable a en tiempo de compilacin:
#define PRUEBA(x) if(x<0) x = -100
main()
{
int a;
for(a=10; a>= -10; --a){
PRUEBA(a);
/* modificado a: if(a<0) a = -100; en tiempo de compilacin */
printf("a es %d\n",a);
}
}
Programacin en Lenguaje C
105
Usando <> causar que el compilador busque el archivo en la ruta definida, mientras
que con el uso de el compilador buscar en el directorio de trabajo (actual). Esta
definicin vara dependiendo del compilador especfico en uso. Por ejemplo:
Programacin en Lenguaje C
106
void main()
{
int a;
#asm
mov #1, d0
#endasm
a=5;
printf("%d\n",a);
}
Programacin en Lenguaje C
107
ejer101.c
Mostrar el uso de Directivas al preprocesador y paso de
parmetros en la lnea de comandos
Eleva al cubo un dgito entre 0 y 9. Hace uso de una
macro para verificar si es dgito y se pasa al programa
en lnea de comandos una clave de acceso que es validada
*/
/* Directivas al preprocesador */
# include <stdio.h>
# define es_entero(x) ( (x >= '0' && x <= '9') ? 1 : 0 )
/* MACRO */
/* la macro es para saber si una variable es digito */
/* Declaracin de variables y funciones */
char password[] = "X99TEST";
int al_cubo(int);
/* Funcin main */
void main(int argc, char *argv[])
{
char caracter;
int resultado;
if(argc < 2) exit(0);
if(strcmp(password,argv[1]))
{
printf("clave invlida ");
getch();
exit(0);
}
printf("\nTeclee dgito a elevar al cubo _ ");
caracter = getch();
if(es_entero(caracter))
{
resultado = al_cubo(caracter-'0');
printf("\nEl resultado de elevar %d al cubo es %d",
caracter-'0',resultado);
}
else
printf("\nEl carcter introducido no es dgito");
getch();
} /* fin de main */
/* Funcin que eleva al cubo un dgito */
int al_cubo(int y)
{
return (y*y*y);
}
Programacin en Lenguaje C
108
11. ESTRUCTURAS.
11.1 Definicin.
Las estructuras se utilizan en C para organizar una coleccin de variables en un
grupo definido. Este grupo es llamado estructura y es similar a los registros en otros
lenguajes. Mientras que los registros contienen campos, las estructuras contienen
miembros.
Un ejemplo clsico es una estructura nomina usada para una aplicacin de negocios.
Esta estructura debe contener miembros como nombre, nmero de seguro social, y
salario. C tambin permite la creacin de estructuras que contienen estructuras
(estructuras anidadas). Por ahora slo examinaremos una estructura sencilla con
caracteres y enteros.
Hay tres pasos bsicos al trabajar con estructuras:
1) Definir el tipo de estructura, organizar los miembros deseados y asignar un
nombre a la estructura. Este paso no reserva espacio en memoria para la
estructura.
2) Reservar espacio para la estructura asignando un nombre de variable al tipo de
estructura. Esta puede ser una estructura, un apuntador a una estructura, o un
arreglo de estructuras.
3) Usar la estructura.
Programacin en Lenguaje C
109
Programacin en Lenguaje C
110
Programacin en Lenguaje C
111
void main()
{
struct banderas arreglo[] = {
0, 1, 2,
3, 4, 5,
6, 7, 8,
9, 10, 11
/* arreglo [0] */
/* arreglo [1] */
/* arreglo [2] */
/* arreglo [3] */
};
}
Cada miembro es inicializado de izquierda a derecha, la inicializacin del arreglo queda
as:
arreglo[0]
arreglo[0].tipo = 0 arreglo[0].edo_actual = 1 arreglo[0].edo_previo = 2
arreglo[1]
arreglo[1].tipo = 3 arreglo[1].edo_actual = 4 arreglo[1].edo_previo = 5
arreglo[2]
arreglo[2].tipo = 6 arreglo[2].edo_actual = 7 arreglo[2].edo_previo = 8
arreglo[3]
arreglo[3].tipo = 9 arreglo[3].edo_actual = 10 arreglo[3].edo_previo = 11
Para clarificar el concepto se pueden usar llaves adicionales dentro de la parte de
inicializacin para inicializar cada elemento del arreglo. Por ejemplo:
struct banderas {
int tipo;
int edo_actual;
int edo_previo;
};
void main()
{
static struct banderas arreglo[] = {
{ 0,1,2 },
{ 3,4,5 },
{ 6,7,8 },
{ 9,10,11 }
};
}
Programacin en Lenguaje C
112
/* Nota: persona[4].nombre[0] = 0 */
Programacin en Lenguaje C
113
/* definicin de estructura */
/* prototipo de funcin */
void main()
{
struct temp test, test2;
/* reserva espacio */
test.at=5; test.bt=10;
/* inicializa miembros */
test2=test;
/* copia la estructura */
test2.at=test.at;
/* o copia miembro a miembro */
test2.bt=test.bt;
/* pasa una copia de test a acceso() y regresa una
copia modificada desde acceso() en test2 */
test2=acceso(test);
printf("%d %d\n",test.at, test.bt);
/* imprime: 5 10 */
printf("%d %d\n",test2.at,test2.bt);
/* imprime: 100 200 */
}
/* Una copia de la estructura tipo temp es colocada en la variable v. */
struct temp acceso(struct temp v)
{
v.at=100; v.bt=200;
return(v);
/* regresa la estructura a la funcin de llamada */
}
Programacin en Lenguaje C
114
Entonces el apuntador puede ser usado para referenciar los miembros almacenados
dentro de ab utilizando la sintaxis de indireccin:
printf("%d %d\n", (*p).a, (*p).b );
Programacin en Lenguaje C
115
struct temp{
/* declara una estructura */
int a;
int b;
};
void acceso(struct temp *);
/* prototipo de funcin */
void main()
{
struct temp prueba;
acceso(&prueba);
/* pasa la direccin de prueba a acceso() */
printf("%d %d\n", prueba.a, prueba.b);
/* imprime: 100 200 */
} /* fin de main */
void acceso(struct temp *v) /* recibe apuntador a la estructura prueba */
{
v->a=100;
v->b=200;
}
El siguiente ejemplo muestra como se puede hacer lo mismo a travs del uso de la
sintaxis de apuntadores.
struct temp{
int a;
int b;
};
void acceso (struct temp *);
void main()
{
struct temp prueba, *ap;
acceso(&prueba);
ap=&prueba;
printf("%d %d", (*ap).a, (*ap).b);
} /* fin de main */
void acceso(struct temp *v)
{
(*v).a=100;
(*v).b=200;
} /* fin de acceso */
Programacin en Lenguaje C
116
/* prototipo de funcin */
void main()
{
static struct nombres clases[] = {
"Bertha", 1,
"Ral", 2,
"Joaquin", 3,
"Gaby", 4,
"", 0
/* "" apunta al carcter nulo para indicar el fin del arreglo */
};
muestra(clases);
} /* fin de main */
void muestra(struct nombres lista[])
{
int i,j;
for(i=0; lista[i].alumno[0] != '\0'; i++){
printf("Nombre:%s ",lista[i].alumno);
printf("Calificacin:%d",lista[i].calif);
}
/* Imprime cada carcter del nombre */
for(i=0,j=0; lista[i].alumno[j] != '\0';j=0,i++){
while(lista[i].alumno[j] != '\0'){
printf("%c",lista[i].alumno[j]);
j++;
}
printf("\n");
}
} /* fin de muestra */
Programacin en Lenguaje C
117
El programa imprime:
Nombre: Bertha Calificacin:1
Nombre: Ral Calificacin:2
Nombre: Joaquin Calificacin:3
Nombre: Gaby Calificacin:4
Bertha
Ral
Joaquin
Gaby
Programacin en Lenguaje C
118
ejer111.c
Mostrar el uso de estructuras, arreglos de apuntadores
a estructuras y paso a funciones.
Crear una pequea base de datos en memoria que contenga
estructuras predefinidas. Las estructuras para almacenar
los datos se gestionan dinmicamente. Los apuntadores a
las estructuras se guardan en un arreglo de apuntadores.
*/
#include
#include
#include
#include
#include
<stdio.h>
<conio.h>
<ctype.h>
<stdlib.h>
<string.h>
/* arreglo de apuntadores
a estructuras */
int elem=0;
limpia();
/* no usamos clrscr() porque no es de ANSI C */
do
{
opcion = menu();
switch(opcion)
{
case 'a': altas(informacion,&elem);
break;
case 'c': consultas(informacion,elem);
break;
}
}while(opcion != 's');
} /* fin de main */
Programacin en Lenguaje C
119
Programacin en Lenguaje C
120
Programacin en Lenguaje C
121
A continuacin se ilustra como los valores de los miembros de una estructura campo
de bits pueden ser probados usando una oracin if. Tambin ilustra como un valor
ser truncado cuando el ancho del campo de bits es excedido.
Por ejemplo: si el campo de bits puede contener 3 bits, el valor ms largo que puede
almacenar es 7. Para cualquier valor mayor que 7, slo los bits ms significativos del
valor sern usados.
#define ON 1
#define OFF 0
#define TRUE 7
Programacin en Lenguaje C
122
struct bandera{
unsigned int pband:1;
unsigned int sband:1;
unsigned int jband:3;
} estado;
void main()
{
estado.pband = ON;
estado.sband = OFF;
estado.jband = TRUE;
if(estado.pband)
printf("bandera en ON\n");
else
printf("bandera en OFF\n");
estado.pband = 7;
printf("%d\n", estado.pband);
}
El programa imprime:
1 "ya que pband slo puede contener 1 bit"
12.2. Uniones.
Las uniones se parecen mucho a las estructuras, debido a que sus miembros se
referencian usando la misma sintaxis. Las uniones pueden ser colocadas dentro de
uniones o de estructuras, y los apuntadores a las uniones son permitidos. Pero las
uniones son usadas para contener un miembro simple en cualquier tiempo. Un
miembro simple puede ser una estructura o un arreglo de estructuras.
Por lo tanto, la principal diferencia entre estructuras y uniones es la cantidad de espacio
alojado cuando la memoria es reservada. Por ejemplo:
union abc{
int i;
char b;
};
struct abc{
int i;
char b;
};
union abc a;
a.i=100;
a.b='Z';
struct abc a;
a.i=100;
a.b='Z';
La union abc reserva slo espacio suficiente para que la unin a contenga el tipo del
miembro ms grande. En el ejemplo anterior, el entero i es el miembro ms largo. Sin
Programacin en Lenguaje C
123
embargo la estructura abc reserva espacio para que la estructura a pueda contener
tanto al entero i como al carcter b.
En trminos ms simples, una unin sirve para alojar en un mismo espacio de memoria
diferentes tipos de datos, pero slo uno a la vez. Los tipos de datos sern los miembros
de la unin. Por ejemplo:
#define INT 1
#define CHAR 2
#define FLOAT 3
void main()
{
union utipo{
int i;
char c;
float f;
} valor;
int typ;
valor.i=1009;
typ=INT;
if(typ==INT)
printf("%d\n",valor.i);
else if(typ==CHAR)
printf("%c\n",valor.c);
else if(typ == FLOAT)
printf("%f\n",valor.f);
}
El programa imprime: 1009
El siguiente ejemplo ilustra el uso de una unin dentro de una estructura. Un ejemplo
sencillo que guarda la pista del tipo de la variable, dependiendo de los datos ASCII de
entrada. Muestra como usar la sintaxis correcta para referenciar apropiadamente los
miembros de la unin.
Programacin en Lenguaje C
124
#define INT 1
#define CHAR 2
#define MAX 10
struct prueba{
int tipo;
union {
int ival;
int cval;
} valor;
}tabla[MAX];
void main()
{
int i,v;
/* colecciona valores de tipos int o char */
for(i=0; i<MAX; i++)
{
v=getchar();
/* espera hasta retorno de carro (carriage return) */
while((getchar()) != '\n');
/* Es un nmero? */
if( v<= '9' && v >= '0')
{
tabla[i].valor.ival= v - '0';
tabla[i].tipo=INT;
}
/* sino, debe ser un carcter */
else
{
tabla[i].valor.cval= v ;
tabla[i].tipo=CHAR;
}
}
/* ahora se imprimen */
for(i=0; i<MAX; i++){
if( tabla[i].tipo == INT)
printf("%d\n",tabla[i].valor.ival);
else if( tabla[i].tipo == CHAR)
printf("%c\n",tabla[i].valor.cval);
}
}
Programacin en Lenguaje C
125
Programacin en Lenguaje C
126
Ejemplo:
struct A {
int i,j,k;
};
/* definicin de la estructura A */
struct B {
char a,b,c;
};
/* definicin de la estructura B */
struct C {
struct A ijk;
struct B abc;
struct A *ptr;
};
void main()
{
/* aloja espacio para estructuras */
struct A prueba; struct C ejemplo;
/* inicializa prueba */
prueba.i=1; prueba.j=2; prueba.k=3;
/* inicializa apuntador a estructura */
ejemplo.ptr = &prueba;
/* imprime prueba.i, prueba.j, prueba.k usando apuntador */
printf("%d %d %d ",ejemplo.ptr->i, ejemplo.ptr->j, ejemplo.ptr->k);
/* inicializa estructuras ijk y abc con ceros */
ejemplo.ijk.i=ejemplo.ijk.j=ejemplo.ijk.k=0;
ejemplo.abc.a=ejemplo.abc.b=ejemplo.abc.c=0;
}
Programacin en Lenguaje C
127
: ejer121.C
: Mostrar el uso combinado de campo de bits y uniones
: Dado un nmero entero largo , el programa lo
codifica en binario.
*/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct codigo
/* un entero largo lo consideramos de 4 bytes */
{
int bit_1_1:1; int bit_1_2:1; int bit_1_3:1; int bit_1_4:1;
int bit_1_5:1; int bit_1_6:1; int bit_1_7:1; int bit_1_8:1;
int bit_2_1:1; int bit_2_2:1; int bit_2_3:1; int bit_2_4:1;
int bit_2_5:1; int bit_2_6:1; int bit_2_7:1; int bit_2_8:1;
int bit_3_1:1; int bit_3_2:1; int bit_3_3:1; int bit_3_4:1;
int bit_3_5:1; int bit_3_6:1; int bit_3_7:1; int bit_3_8:1;
int bit_4_1:1; int bit_4_2:1; int bit_4_3:1; int bit_4_4:1;
int bit_4_5:1; int bit_4_6:1; int bit_4_7:1; int bit_4_8:1;
};
union bits
{
long int num;
struct codigo bit;
};
/*union bits byte;*/
void lee_num(union bits *);
void codifica(union bits);
void main()
{
union bits byte;
char salir;
do
{
lee_num(&byte);
codifica(byte);
printf("\n\n Para terminar teclee 'f' _");
}while((salir=getch()) != 'f');
}
Programacin en Lenguaje C
128
Programacin en Lenguaje C
129
Programacin en Lenguaje C
130
Si usamos typedef:
Programacin en Lenguaje C
131
Programacin en Lenguaje C
132
ejer131.c
Mostrar el uso de typedef
Lee nmeros del teclado y construye una lista ligada
para almacenarlos (versin mnima)
elemento head
elemento
...
elemento tail
NULL
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct Node{
int num;
struct Node *next;
}nodo;
/* se declara una variable apuntador al tipo nodo (estructura) */
nodo *start = NULL;
/* inserta x en la lista */
void insercion(int x)
{
nodo *p = start; /* declara e inicializa apuntador */
start = (nodo *) malloc (sizeof(nodo));
if(start==NULL) puts("No se gestion memoria"), exit(1);
start->num = x;
start->next = p;
}
void main(void)
{
int x;
nodo *p;
puts("Teclea una secuencia de enteros,"
"seguidos por un caracter no numrico");
while(scanf("%d",&x)==1) insercion(x);
puts("En orden inverso los siguientes nmeros han"
" sido leidos: ");
for(p=start; p!=NULL; p=p->next)
printf("%5d\n",p->num);
getch();
}
Programacin en Lenguaje C
133
14. ARCHIVOS.
En el lenguaje "C", un archivo puede ser desde un archivo en disco hasta una terminal
o una impresora. Mediante una operacin de apertura se asocia una secuencia a un
archivo especfico. Una vez que el archivo est abierto, se puede intercambiar
informacin entre ste y el programa.
Las funciones ms comunes del sistema de archivos de ANSI "C" se muestran a
continuacin:
Funcin
fopen()
fclose()
putc()
fputc()
getc()
fgetc()
fseek()
fprintf()
fscanf()
feof()
ferror()
rewind()
remove()
fflush()
Actividad
Abre un archivo
Cierra un archivo
Escribe un carcter en un archivo
Escribe un carcter en un archivo
Lee un carcter de un archivo
Lee un carcter de un archivo
Busca un byte especfico de un archivo
Hace lo mismo en archivos que printf() en la consola
Hace lo mismo en archivos que scanf() en la consola
Devuelve cierto si se llega al final del archivo
Devuelve cierto si se ha producido un error
Coloca el indicador de posicin del archivo al principio del mismo
Borra un archivo
Vaca un archivo
Descripcin
Abre un archivo de texto de lectura
Crea un archivo de texto de escritura
Abre un archivo de texto para aadir informacin
Abre un archivo binario de lectura
Crea un archivo binario de escritura
Programacin en Lenguaje C
134
Modo
ab
R+
w+
a+
Descripcin
Abre un archivo binario para aadir informacin
Abre un archivo de texto de lectura/escritura
Crea un archivo de texto de lectura/escritura
Abre o crea un archivo de texto en modo lectura/escritura para aadir
informacin
Programacin en Lenguaje C
135
Programacin en Lenguaje C
136
Ejercicio 14.2.
/*
Archivo:
Objetivo:
Funcin:
ejer 142.c
Mostrar el uso de funciones de entrada/salida fopen y getc
Abre un archivo de disco y lo lee carcter por carcter,
hasta encontrar el fin de archivo EOF.
Usa fopen() para abrir un archivo de slo lectura, si el
archivo no existe falla la operacin, el archivo funciona
como buffer de entrada/salida.
El programa se ejecuta:
===> ejer142 nombre_archivo
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main(int argc, char *argv[])
{
FILE *fp;
/* apuntador a archivo */
char ch;
if(argc != 2){
printf("olvid introducir el nombre del archivo\n");
exit(1);
}
if((fp=fopen(argv[1],"r")) == NULL){ /* abre de lectura */
printf("\nNo puedo abrir el archivo\n");
getch();
exit(1);
}
ch = getc(fp);
/*lee un carcter de un archivo abierto
como buffer de entrada */
while (ch != EOF){
/* detecta fin de archivo */
putchar(ch);
/* despliega en pantalla*/
ch=getc(fp);
}
fclose(fp);
/* cierra el archivo */
} /* fin de main */
Programacin en Lenguaje C
137
Ejercicio 14.3.
/*
Archivo: ejer143.cpp
Objetivo: Mostrar el uso de las funciones fread() y fwrite().
Escribir datos a un buffer de salida y volverlo a abrir de
lectura
Funcin: Abre un archivo para operaciones de escritura binarias
(modo wb)
Escribe en un archivo en disco con fwrite(), lo cierra y lo
lee con la funcin fread().
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
char linea[80] = "Prueba de escritura con fwrite\n"
"Y de lectura con fread.\n";
void main()
{
FILE *out, *in;
/* apuntadores a archivo */
int car_escritos, car_leidos;
char nombre_archivo[80];
printf("\nEscriba el nombre del archivo a crear y leer: ");
gets(nombre_archivo);
/* Abrir archivo para escritura binaria, si existe su contenido se
destruye */
if((out=fopen(nombre_archivo,"wb")) == NULL)
{
printf("\nFall la apertura del archivo\n");
getch();
exit(0);
}
/* Se escribe en el archivo el contenido del buffer linea[], 80
caracteres */
car_escritos = fwrite((void *)linea,sizeof(char),80,out);
/* Se despliega el no. de caracteres grabados al archivo */
printf("\n%d caracteres grabados en %s\n",car_escritos,
nombre_archivo);
/* Se cierra el archivo */
fclose(out);
Programacin en Lenguaje C
138
} /* fin de main */
Programacin en Lenguaje C
139
Ejercicio 14.4.
/*
Archivo: ejer144.c
Objetivo: Mostrar el uso de estructuras combinadas con archivos
Funcin: Crear y consultar un pequeo directorio permanente
*/
#include
#include
#include
#include
#include
<stdio.h>
<conio.h>
<ctype.h>
<stdlib.h>
<string.h>
Programacin en Lenguaje C
140
Programacin en Lenguaje C
141
Programacin en Lenguaje C
142
Ejercicio 14.5.
/*
Archivo: ejer145.c
Objetivo: Mostrar un ejemplo completo de manejo de archivos
Funcin: Crear y consultar un directorio permanente en disco,
las operaciones de carga de datos y consultas se hacen en
memoria.
*/
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define TAM 100
struct tipo_lista {
char nombre[25];
char tel[10];
char calle[20];
char ciudad[10];
char estado[3];
char codigo[10];
} lista[TAM],temporal;
/* PROTOTIPOS DE FUNCIN
*/
*/
int menu(void);
void inicializa_lista(void), intro(void);
void mostrar(void), salvar(void);
void cargar(void);
void reporta(void);
void borra(void);
void busca(void);
password();
Programacin en Lenguaje C
143
/* FUNCIN MAIN
*/
void main(void)
{
int entrada;
char opcion;
do {
entrada=password();
if(entrada==3) exit(0);
} while(entrada!=10);
inicializa_lista();
for(;;)
{
opcion=menu();
switch(opcion){
case 'i': intro();
break;
case 'm': mostrar();
break;
case 's': salvar();
break;
case 'c': cargar();
break;
case 'r': reporta();
break;
case 'b': borra();
break;
case 'e': busca();
break;
case 't': exit(0);
} /* fin de switch
*/
} /* fin de for
*/
/* fin de main
*/
/*
FUNCIN PASSWORD
*/
password()
{
static int intentos=0;
char pass[80];
clrscr();
printf("\n Teclee password: ");
gets(pass);
intentos++;
if(!strcmp(pass,"curso c")) return 10;
return intentos;
} /* fin de password */
Programacin en Lenguaje C
144
*/
Programacin en Lenguaje C
145
/* MOSTRAR LA LISTA */
void mostrar(void)
{
int t;
clrscr();
for(t=0; t<TAM; t++)
{
if(*lista[t].nombre)
{
printf("%s \n", lista[t].nombre);
printf("%s \n", lista[t].tel);
printf("%s \n", lista[t].calle);
printf("%s \n", lista[t].ciudad);
printf("%s \n", lista[t].estado);
printf("%s \n", lista[t].codigo);
} /*
fin de if
*/
} /* fin de for */
printf("\n Presione cualquier tecla para continuar");
getch();
} /* fin de mostrar */
/* SALVAR LA LISTA
*/
void salvar(void)
{
FILE *fp;
int i;
if((fp=fopen("correo","wb"))==NULL)
printf("No se puede abrir el archivo. \n");
else
{
for(i=0; i<TAM; i++)
if(*lista[i].nombre)
if(fwrite(&lista[i],sizeof(struct tipo_lista),1,fp)!=1)
printf("Error de escritura en el archivo \n");
fclose(fp); /* se cierra el archivo */
}
} /* fin de salvar */
Programacin en Lenguaje C
146
/* CARGAR EL ARCHIVO */
void cargar(void)
{
FILE *fp;
int i;
if((fp=fopen("correo","rb"))==NULL)
printf("No se puede abrir el archivo");
else
{
inicializa_lista();
for(i=0; i<TAM; i++)
if(fread(&lista[i],sizeof(struct tipo_lista),1,fp)!=1)
{
if(feof(fp)) break;
printf("Error en la lectura del archivo \n");
}
/*
fin de if
*/
fclose(fp);
}
/*
fin de else */
} /* fin de cargar
*/
/* REPORTE DE REGISTROS. Crea una imagen en disco de un reporte
void reporta(void)
{
FILE *fp;
int j;
*/
if((fp=fopen("correo.lst","w"))==NULL)
printf("No se puede abrir el archivo de salida");
else
{
fprintf(fp,"
NOMBRE
TELEFONO
CALLE
");
fprintf(fp,"
CIUDAD
EDO
CODIGO\n\n");
for(j=0; lista[j].nombre[0]; ++j)
{
fprintf(fp,"\n%-25s ",lista[j].nombre); /* - justifica a la izq */
fprintf(fp,"%-10s ",lista[j].tel);
fprintf(fp,"%-20s ",lista[j].calle);
fprintf(fp,"%-10s ",lista[j].ciudad);
fprintf(fp,"%-3s ",lista[j].estado);
fprintf(fp,"%-10s",lista[j].codigo);
}
/* fin de for
*/
}
fclose(fp);
printf("\nSe cre archivo en disco a imagen de reporte..correo.lst");
printf("\nPresione una tecla para continuar_");
getch();
} /* fin de reporte
*/
Programacin en Lenguaje C
147
/*
FUNCIN BORRAR
*/
void borra(void)
{
char nombre[20];
int j,k;
clrscr();
printf("\n Teclee nombre a eliminar: ");
gets(nombre);
for(j=0; j<TAM; ++j)
{
if (strcmp(nombre, lista[j].nombre)==0)
{
printf("\n Nombre: %s", lista[j].nombre);
printf("\n Telfono: %s", lista[j].tel);
printf("\n Calle: %s", lista[j].calle);
printf("\n Ciudad: %s", lista[j].ciudad);
printf("\n Estado: %s", lista[j].estado);
printf("\n Codigo: %s", lista[j].codigo);
for(k=j; k<TAM; ++k)
lista[k]=lista[k+1];
lista[TAM]=temporal;
/*
TAM--;
*/
break;
} /* fin de if */
} /* fin de for
*/
printf("\n Presione cualquier tecla para continuar");
getch();
} /*
fin de borra
*/
/*
FUNCIN BUSCAR (ENCONTRAR)
*/
void busca(void)
{
char nombre[20];
int j;
clrscr();
printf("\n Teclee el nombre de la persona:
");
gets(nombre);
for(j=0; j<TAM; ++j)
{
if(strcmp(nombre, lista[j].nombre)==0)
{
printf("\n Nombre:%s", lista[j].nombre);
printf("\n Telfono:%s", lista[j].tel);
printf("\n Calle:%s", lista[j].calle);
printf("\n Ciudad:%s", lista[j].ciudad);
printf("\n Estado:%s", lista[j].estado);
printf("\n Codigo:%s", lista[j].codigo);
break;
} /* fin de if
*/
} /* fin de for
*/
printf("\n presione cualquier tecla para continuar");
getch();
} /* fin de busca()
*/
Programacin en Lenguaje C
148
/*
MEN
*/
int menu(void)
{
char s[50];
do {
clrscr();
printf("(I)ntroducir datos en memoria\n");
printf("(M)ostrar Lista de memoria \n");
printf("(C)argar de disco a memoria \n");
printf("(S)alvar de memoria a disco \n");
printf("(R)eporte
\n");
printf("(B)orrar
\n");
printf("(E)ncontrar
\n");
printf("(T)erminar \n");
printf("Elija una opcin: ");
gets(s);
} while(!strchr("imcsrbet",tolower(*s)));
return tolower(*s);
} /* fin de men */
Programacin en Lenguaje C
149
Programacin en Lenguaje C
150
Ejercicio 15.1.
/*
Archivo:
Objetivo:
Funcin:
ejer151.c
Ejemplo complementario
Calcula el ms grande comn divisor de dos nmeros enteros
positivos > 0, por el mtodo de Euclides
*/
#include <stdio.h>
int mcd(int u, int v)
{
int t;
while(u>0)
{
if(u<v)
{
t = u;
u = v;
v = t;
}
u = u - v;
}
return v;
}
void main()
{
int x, y;
do{
printf("\nTeclea el primer nmero entero positivo > 0 _");
scanf("%d",&x);
printf("\nTeclea el segundo nmero entero positivo > 0 _");
scanf("%d",&y);
if(x>0 && y>0)
{
printf("\nEl m.c.d. de %d y %d es: %d\n",x,y, mcd(x,y));
}
}while (x > 0 && y > 0);
}
Programacin en Lenguaje C
151
Ejercicio 15.2.
/*
Archivo:
Objetivo:
Funcin:
ejer152.c
Ejemplo complementario
Calcula el viaje del caballo en un tablero de ajedrez
Recorre todo el tablero sin repetir una casilla
Simula la recursividad
*/
/*
PROGRAMA RECORRIDO DEL CABALLO, ESTE PROGRAMA CONSTRUYE EL VIAJE DE UN
CABALLO DENTRO DE UN TABLERO DE AJEDREZ, USANDO LA ESTRATEGIA DE MOVIMIENTO
EN EL SENTIDO DE LAS MANECILLAS DEL RELOJ, PARA MOVERSE A UNA NUEVA
POSICIN. LA POSICIN INICIAL DEL CABALLO SE LEE DEL TECLADO. CUANDO EL
CABALLO AGOTA LAS POSIBILIDADES DE MOVIMIENTO EN 'UNA' DIRECCIN
DETERMINADA, REGRESA A LA LTIMA POSICIN DE MOVIMIENTO Y TOMA LA
SIGUIENTE ELECCIN (N-sima) PARA CONTINUAR EL RECORRIDO. EXISTE UNA PILA
QUE GUARDA LOS CUADROS (COORDENADAS) QUE HA RECORRIDO EL CABALLO, DE ESTA
MANERA SIMULA LA RECURSIVIDAD.
NOTA ADICIONAL: POR EL TIPO DE MTODO, PARA MUCHAS POSICIONES INICIALES
EL PROGRAMA PUEDE TARDARSE BASTANTE EN DAR UNA SOLUCIN
tablero[i, j]
imov[i]
jmov[j]
coordx[i]
coord[j]
tabk[k]
iinit, jinit
istack
i,j
inext, jnext
n
*/
#include <stdio.h>
#include <conio.h>
/* Inicializacin de posibles movimientos del caballo para i,j */
int imove[] = {0, -2, -1, 1, 2, 2, 1, -1, -2};
int jmove[] = {0, 1, 2, 2, 1, -1, -2, -2, -1};
Programacin en Lenguaje C
152
void main()
{
int tablero[11][11];
int coordx[70],coordy[70],tabk[70];
int n, i, j, k, inext, jnext, iinit, jinit, istack;
double movs;
clrscr();
/* Selecciona la posicin inicial del caballo */
printf("\nTablero de 6x6 para que sea ms rpido */
printf("\nDame la posicion 1<=i<=6_ ");
scanf("%d",&iinit);
printf("\nDame la posicion 1<=j<=6_ ");
scanf("%d",&jinit);
iinit += 2;
jinit += 2;
/* Inicializa el tablero */
for (i=1;i<= 10;i++)
for (j=1;j<= 10;j++)
{
tablero[i][j] = 0;
if ((i < 3) || (i > 8) || (j < 3) || (j > 8))
}
tablero[i][j] = 99;
/* Inicializa variables */
k = 1;
tablero[iinit][jinit] = 1;
i = iinit;
j = jinit;
n = 2;
istack = 1;
coordx[istack] = j;
coordy[istack] = i;
tabk[istack] = k;
movs = 0;
Programacin en Lenguaje C
153
Programacin en Lenguaje C
154
/* Se imprime la solucin */
n = n-1;
printf("\n\n");
if(istack == 0) printf("NO HAY SOLUCIN");
else
{
for (i=3;i<=8;i++)
{
printf("\n\n");
for (j=3;j<=8;j++)
printf("
%2d",tablero[i][j]);
}
}
printf("\n\n");
printf("El nmero de movimientos fue de %.2f",movs);
getch();
}
Programacin en Lenguaje C
155
Ejercicio 15.3.
/*
Archivo: ejer153.c
Objetivo: Ejemplo complementario
Funcin: Programa que genera bromas.
*/
#include
#include
#include
#include
#include
<stdio.h>
<conio.h>
<ctype.h>
<string.h>
<stdlib.h>
#define PER 18
#define ACC 22
/* nmero de individuos */
/* nmero de acciones */
Programacin en Lenguaje C
156
void main()
{
char broma[80];
int i,j;
clrscr();
randomize();
gotoxy(5,5);
puts("Escritor de bromas");
gotoxy(5,10);
puts("Quieres que escriba una broma s/n ? _ ");
gotoxy(43,10);
while(toupper(getche()) == 'S')
{
i = random (PER); /* genera nmero aleatorio entre 0 y m-1 */
strcpy(broma,persona[i]);
strcat(broma," ");
j = random (ACC);
strcat(broma,accion[j]);
gotoxy(5,15);
puts("
gotoxy(5,15);
puts(broma);
gotoxy(5,10);
puts("Quieres que escriba una broma s/n ? _
");
gotoxy(43,10);
}
");
Programacin en Lenguaje C
157
Ejercicio 15.4.
/*
Archivo:
Objetivo:
Funcin:
0x7e
0xff
0xc3
0xc3
0xff
0xff
0xc3
0xc3
0xc3
ejer154.c
Ejemplo complementario
Convierte letras y digitos a gran tamao (matriz 9x8)
AAAAAA
AAAAAAAA
AA
AA
AA
AA
AAAAAAAA
AAAAAAAA
AA
AA
AA
AA
AA
AA
555555
55
55
55
55555555
55
55
5
55
555555
0x7e
0xc0
0xc0
0xc0
0xff
0x03
0x03
0x83
0x7e
*/
#include <conio.h>
#include <stdio.h>
#define ELEMEN 37
void imprime(char );
/* prototipo de funcin */
Programacin en Lenguaje C
158
*/
0x7e},
0xff},
0xff},
0x7e},
0x06},
0x7e},
0x7e},
0x80},
0x7e},
0x7e},
0xc3},
0xfe},
0x7e},
0xfe},
0xff},
0xc0},
0x7e},
0xc3},
0xff},
0x70},
0xc3},
0xff},
0xc3},
0xc3},
0xbc},
0xc0},
0x7d},
0xc3},
/* 0 */
/* 1 */
/* 5 */
/* 9 */
/* A */
/* B */
/* R */
{0x7f,
{0xff,
{0xc3,
{0xc3,
{0xc3,
{0xc3,
{0xc3,
{0xff,
{0x00,
0xff,
0x18,
0xc3,
0xc3,
0xc3,
0x42,
0x42,
0x03,
0x00,
0xc0,
0x18,
0xc3,
0x66,
0xc3,
0x66,
0x66,
0x06,
0x00,
0xc0,
0x18,
0xc3,
0x66,
0xdb,
0x3c,
0x3c,
0x0c,
0x00,
0x7e,
0x18,
0xc3,
0x66,
0xdb,
0x18,
0x18,
0x18,
0x00,
0x3f,
0x18,
0xc3,
0x66,
0xe7,
0x3c,
0x18,
0x30,
0x00,
0x03,
0x18,
0xc3,
0x24,
0xe7,
0x66,
0x18,
0x60,
0x00,
0xff,
0x18,
0x7e,
0x18,
0xc3,
0x42,
0x18,
0xc0,
0x00,
0xfe},
0x18},
0x3c},
0x18},
0x81},
0xc3},
0x18},
0xff},
0x00},
/* Y */
/* Z */
/* blanco */
};
void main()
{
char caracter;
clrscr();
printf("\nTeclee la letra a desplegar: ");
caracter = getchar();
/* detecta invlidos diferentes a numeros y letras*/
if(caracter >=97 && caracter <=122) caracter -= 32;
/* minsculas */
else
/* a maysculas */
if(caracter <48 || caracter >122) caracter = ' '; /* invlidos */
else
/* a blancos */
if(caracter > 57 && caracter < 65 ||
caracter > 90 && caracter < 97) caracter = ' ';
imprime(caracter);
printf("\nPara terminar oprima cualquier tecla _");
getch();
}
/* Funcin que crece e imprime el carcter */
void imprime(char caract)
{
register int i, j;
int scan;
char caract2;
caract2 = caract; /* para rescatar el carcter original */
if(caract == 27) caract += 9;
/* detecta blancos */
if(caract >= 48 && caract <= 57) caract -=48; /* detecta digito */
if(caract >= 65 && caract <= 90) caract -=55; /* detecta letras */
/* compara bit por bit el carcter leido vs el patrn requerido */
for(i=0;i<9;i++)
{
scan = 0x80 ;
for( j = 0 ; j < 8 ; j++)
{ patron[caract][i] & scan ? printf("%c",caract2) : printf(" ");
scan >>= 1;
}
printf("\n");
}
}
Programacin en Lenguaje C
159
Ejercicio 15.5.
/*
Archivo:
Objetivo:
Funcin:
ejer155.c
Ejemplo complementario
Programa para calcular cuadros magicos de hasta 15x15.
Sumatoria de valores de filas, columnas y
diagonales principal y secundaria es el mismo
*/
#include <stdlib.h>
#include <stdio.h>
#define MAX 16
void lectura(int *numero);
void pro_cuadro(int numero);
void imprime(int numero);
int cuadro[MAX][MAX];
void main()
{
char cond;
int numero;
cond = 's';
while(cond == 's')
{
lectura(&numero);
pro_cuadro(numero);
imprime(numero);
gotoxy(35,23);
printf("Si desea calcular otro cuadro teclee
cond = getch();
}
}
Programacin en Lenguaje C
160
's': ");
*/
*/
Programacin en Lenguaje C
161
Programacin en Lenguaje C
162
Ejercicio 15.6.
/*
Archivo: ejer156.c
Objetivo: Ejemplo complementario
Funcin: Convierte una cantidad en pesos y centavos a su equivalente
en letras
*/
#include <dos.h>
#include <stdlib.h>
char unidades[][13] =
{"cero","un","dos","tres","cuatro","cinco","seis","siete",
"ocho","nueve","diez","once","doce","trece","catorce",
"quince","dieciseis","diecisiete","dieciocho",
"diecinueve","veinte","veintiuno","veintidos",
"veintitres","veinticuatro","veinticinco","veintiseis",
"veintisiete","veintiocho","veintinueve"};
char decenas[][10] = {"","","","treinta","cuarenta","cincuenta",
"sesenta","setenta","ochenta","noventa"};
char centenas[][14] = {"","ciento","doscientos","trescientos","cuatrocientos",
"quinientos","seiscientos","setecientos","ochocientos",
"novecientos"};
/* Prototipos de funcin */
void lee(long *, long *);
void cambia_a_letras(long);
void millones(int, int, int);
void miles(int, int, int);
void cientos(int, int, int);
void pesos(long );
void centavos(long);
void main()
{
long entero,decimal;
lee(&entero,&decimal);
while(entero >= 0 && decimal >= 0)
{
cambia_a_letras(entero);
pesos(entero);
cambia_a_letras(decimal);
centavos(decimal);
lee(&entero,&decimal);
}
} /* fin de main */
Programacin en Lenguaje C
163
Programacin en Lenguaje C
164
Programacin en Lenguaje C
165
Programacin en Lenguaje C
166
Ejercico 15.7.
Si usted tiene inquietud sobre grficos, le presentamos un programa que hace uso de la
biblioteca de Turbo C++, para graficar en modo pantalla de texto.
/*
Archivo: ejer157.c
Objetivo: Ejemplo complementario
Funcin: Programita que mueve una pelotita en la pantalla
En turbo c++ 3.0 activar men, para disponer de la biblioteca
Options->Linker->Libraries->Graphics Libraries
*/
#include
#include
#include
#include
#include
<stdio.h>
<alloc.h>
<graphics.h>
<conio.h>
<stdlib.h>
void main(void)
{
int graphdriver = DETECT, graphmode, errcode;
char far *image;
short x, y, ruta;
unsigned numbytes;
randomize();
/*initgraph(&graphdriver, &graphmode, "c:\\tc\\bgi");*/
initgraph(&graphdriver, &graphmode, "");
ellipse(5,5,0,360,5,5);
setcolor(YELLOW);
setfillstyle(SOLID_FILL,YELLOW);
floodfill(5,5,WHITE);
numbytes = (unsigned int) imagesize(0,0,10,30);
if((image = (char far *) malloc(numbytes)) == (char far *)NULL)
{
closegraph();
printf("No hay memoria para la grfica\n");
getch();
exit(0);
}
getimage(0,0,10,30,image);
cleardevice();
setcolor(WHITE);
x = getmaxx()/2;
y = getmaxy()/2;
ruta = 1; /* 1 arrder, 2 abder, 3 abizq, 4 ariz */
putimage(x,y,image,XOR_PUT);
Programacin en Lenguaje C
167
Programacin en Lenguaje C
168
Ejercicio 15.8.
/*
Archivo:
Objetivo:
Funcin:
*/
#include
#include
#include
#include
ejer158.c
Ejemplo complementario
Graficar funciones predefinidas
<stdio.h>
<conio.h>
<math.h>
<alloc.h>
float x[100],y[100];
float xmax,xmin,ymax,ymin;
float tetapaso,increm;
int n;
float teta;
void
void
void
void
void
void
void
void
void
void
lectura(float *);
encabeza(char *);
maxmin();
grafica(int , int );
rosa();
hipo();
card();
espi();
cara();
seno();
void main()
{
float tetaini,tetafin;
int i,num,npx,npy;
char op;
npx = 24;
/* puntos en x */
n = npy = 80;
/* puntos en y */
op = '0';
while (op != '9')
{
encabeza(&op);
num = op - '0';
if(num > 0 && num < 7)
{
clrscr();
printf("\nDAME EL NMERO DE GRADOS INICIAL = ");
lectura(&teta);
tetaini = teta / 57.3;
Programacin en Lenguaje C
169
= ");
}
getch();
} /* fin de main */
void lectura(float *teta)
{
char s[5];
int h;
for(h=0;h<=5;h++) s[h] = ' ';
gets(s);
*teta = atof(s);
} /* fin de lectura */
Programacin en Lenguaje C
170
Programacin en Lenguaje C
ymax = y[ind];
ymin = y[ind];
xmax = x[ind];
xmin = x[ind];
171
Programacin en Lenguaje C
172
void hipo()
{
char ss[5];
int k;
float a;
gotoxy(10,16);
printf("DAME EL RADIO DE
.a. = ");
gets(ss);
a = atof(ss);
for(k=1;k<=n;k++)
{
x[k] = a * cos(tetapaso) * cos(tetapaso) * cos(tetapaso);
y[k] = a * sin(tetapaso) * sin(tetapaso) * sin(tetapaso);
tetapaso = tetapaso + increm;
}
} /* fin de hipo */
void card()
{
int k;
float rad;
for(k=1;k<=n;k++)
{
rad = 1 * (1 + cos(tetapaso));
x[k] = rad * cos(tetapaso);
y[k] = rad * sin(tetapaso);
tetapaso = tetapaso + increm;
}
} /* fin de card */
void espi()
{
int k;
float rad;
for(k=1;k<=n;k++)
{
rad = 1 * tetapaso;
x[k] = rad * cos(tetapaso);
y[k] = rad * sin(tetapaso);
tetapaso = tetapaso + increm;
}
} /* fin de espi */
Programacin en Lenguaje C
173
void cara()
{
char ss[5];
int k;
float a,b;
float rad;
gotoxy(10,16);
printf("DAME EL DIMETRO DE
.a. =
gets(ss);
a = atof(ss);
gotoxy(10,18);
printf("DAME LA LONGITUD DE
.b. =
gets(ss);
b = atof(ss);
for(k=1;k<=n;k++)
{
rad = b + (a * cos(tetapaso));
x[k] = rad * cos(tetapaso);
y[k] = rad * sin(tetapaso);
tetapaso = tetapaso + increm;
}
} /* fin de cara */
");
");
void seno()
{
int k;
for(k=1;k<=n;k++)
{
x[k] = tetapaso;
y[k] = sin(tetapaso);
tetapaso = tetapaso + increm;
}
} /* fin de seno */
Programacin en Lenguaje C
174
Ejercicio 15.9.
/*
Archivo:
Objetivo:
Funcin:
*/
ejer159.c
Ejemplo complementario
Calcular la integral de una funcin por la regla trapezoidal
#include<stdio.h>
#include<conio.h>
#define f(x) x*x
/* define la funcin
/* PROTOTIPOS DE FUNCIN
*/
x2 */
*/
void main(void)
{
float integral;
float a,b;
int n;
float h;
/*
/*
/*
/*
float x;
int i;
printf("\nTeclea el lmite inferior
-a- : ");
scanf("%f",&a);
printf("\nTeclea el lmite superior
-b- : ");
scanf("%f",&b);
printf("\nTeclea el nmero de trapecios -n- : ");
scanf("\n%d",&n);
h = (b-a)/n;
x= a;
for(i=2;i<=n;i++)
{
x+=h;
integral+=funcion(x);
}
integral += (funcion(a)+funcion(b))/2.0;
integral*=h;
printf("\nLa solucin con %d trapecios, desde %f hasta %f es : %f",
n,a,b,integral);
getch();
} /* fin de main */
Programacin en Lenguaje C
175
float funcion(float x)
{
float retorno;
retorno = f(x);
return retorno;
}
Programacin en Lenguaje C
176
BIBLIOGRAFA.
1. [Aho, 1983] A. V., et al. Data Structures and Algorithms. Massachusetts, E.U.A.,
Addison-Wesley.
2. [Barkakati, 1990] Naba. Turbo C++ Bible. Indiana, E.U.A., SAMS-The Waite Group,
Inc.
3. [Galve, 1993] Frances J., et al. Algortmica, diseo y anlisis de algoritmos
imperativos. Wilmington, Delaware, E.U.A., Addison-Wesley Iberoamericana, S.A.
4. [Kernighan, 1988] Brain W., Ritchie, Dennis M. The C Programming Language.
Englewoods Cliffs, New Jersey, E.U.A., Prentice-Hall.
5. [Sethi, 1996] Ravi. Programming Languages: Concepts and Constructs. New
Jersey, E.U.A., Addison-Wesley Publishing Co.
6. [Schildt, 1995] Herbert. C Manual de Referencia. Madrid, Espaa, McGrawHill/Interamericana de Espaa, S.A., Madrid, Espaa, 3. Ed.
7. Secretariat: Standard - The C Language. X3J11/90-013. Computer and Business
Equipment Manufactures Association, 311 First Street, NW, Suite 500, Washington,
DC 2001, U.S.A.
Programacin en Lenguaje C
177