Académique Documents
Professionnel Documents
Culture Documents
de Baja California
Facultad de Ingenieria Arquitectura y Diseo
Programacin Estructurada
Clave: 12125
Pedro Nez Ypiz
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
C O N T E N I D O
3. Estructuras Condicionales
o
o
o
8. Apuntadores
o
o
o
7. Estructuras
o
o
6. Funciones
o
o
o
o
5. Arreglos y cadenas
o
o
o
3.1 La sentencia if
3.3 La sentencia switch
3.3 Ejercicios
4. Ciclos
o
o
o
o
o
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
9. Biblioteca <stdlib.h>
o
o
o
o
o
o
o
o
12.1 Generalidades
121.2 Funciones C para archivos
12.3 Archivos secuenciales
12.4 Archivos de acceso aleatorio
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 1
Compilacin de un programa
en C/C++
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
5. Presione el botn "Siguiente >", aqu tampoco es necesario modificar ninguna opcin.
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
6. Elegir un directorio destino para la instalacin del software (se puede dejar la opcin
pre establecida), luego precionar el boton de Instalar
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
10. Presionar el botn "Si" para que todos los usuarios de la computadora puedan usar el
programa.
11. Para concluir la instalacin deberemos ejecutar el programa Dev C++ por primera vez,
haciendo click sobre su cono en el men de inicio.
10
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
12. Elegir el idioma "Espaol (Castellano)", tambin se debe marcar la casilla "Use XP
Theme"
13. Elegir "Yes, create the cache now" y luego presionar "Next"
11
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
14. Hacer click en "Next" para que se inicie la configuracin final, este ltimo paso podra
tomar muchos minutos!
15. Despus de la larga espera slo habr que presionar el botn "Ok" y se podr empezar
a usar el software.
12
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
13
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 2
Principios de C
14
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
2. Principios de C
En este captulo se ofrece una breve historia del desarrollo del lenguaje C y se consideran tambin sus
caractersticas.
En el resto del captulo se ven los aspectos bsicos de los programas de C, tales como su estructura, la
declaracin de variables, tipos de datos y operadores.
2.1 Orgenes del C
El proceso de desarrollo del lenguaje C se origina con la creacin de un lenguaje llamado BCPL, que fue
desarrollado por Martin Richards. El BCPL tuvo influencia en un lenguaje llamado B, el cual se us en 1970 y
fue inventado por Ken Thompson y que permiti el desarrollo de C en 1971, el cual lo invent e implement
Dennis Ritchie. Para 1973 el sistema operativo UNIX estaba casi totalmente escrito en C.
Durante muchos aos el estndar para C fue la versin 5 del sistema operativo UNIX, documentada en ``The
C Programming Language'' escrito por Brian W. Kernighan and Dennis M. Ritchie in 1978 comnmente
referido como K&R.
Posteriormente se hicieron varias implementaciones las cuales mostraban las siguientes tendencias:
Nuevas caractersticas
Diferencias de mquinas
Diferencias de productos
Errores en los compiladores
Malas implementaciones
Esto origin que en el verano de 1983 se estableciera un comit para resolver estas discrepancias, el cual
empez a trabajar en un estndar ANSI C, la cual fue completada en 1988.
2.2 Caractersticas de C
Algunas de las caractersticas ms importantes que definen el lenguaje y que han permitido que sea tan
popular, como lenguaje de programacin son:
Tamao pequeo.
Uso extensivo de llamadas a funciones.
Comandos breves (poco tecleo).
Lenguaje estructurado.
Programacin de bajo nivel (nivel bit)
Implementacin de apuntadores - uso extensivo de apuntadores para la memoria, arreglos,
estructuras y funciones
Las diversas razones por la cual se ha convertido en un lenguaje de uso profesional son:
Un punto en contra es que tiene una deteccin pobre de errores, lo cual en ocasiones es problemtico para
los principiantes.
15
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
/* Programa ejemplo */
#include <stdlib.h>
#include <stdio.h>
int main()
{
printf( "HOLA MUNDO CRUEL Y DESPIADADO \n" );
system (PAUSE);
return 0;
}
NOTAS:
C requiere las libreras para cargar el funcionamiento de las sentencias siempre vanal inico del
programa y se identifican con el # seguida de la palabra include
#include
C requiere un punto y coma al final de cada sentencia .
printf es una funcin estndar de C, la cual es llamada en la funcin main()
\n significa salto de lnea. Salida formateada.
return 0; es tambin una funcin estndar que hace que el programa termine.corretamente .
16
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
HOLA
MUNDO
CRUEL
Y
DESPIADADO
2.4 Variables
C tiene los siguientes tipos de datos simples:
char
--
--
unsigned char
255
short int
-32768
+32767
35536
31
+231 -1
(long) int
float
-3.2 x 1038
+3.2 x 1038
double
-1.7 x 10308
+1.7 x 10308
-2
Los tipos de datos bsicos tiene varios modificadores que les preceden. Se usa un modificador para alterar el
significado de un tipo base para que encaje con las diversas necesidades o situaciones. Los modificadores
son: signed, unsigned, long y short.
En los sistemas UNIX todos los tipos int son long int, a menos que se especifique explcitamente
short int.
Nota: no hay un tipo booleano en C -- se deber usar char, int o an mejor unsigned char.
signed, unsigned, long y short pueden ser usados con los tipos char e int. Aunque es permitido el
uso de signed en enteros, es redundante porque la declaracin de entero por defecto asume un nmero con
signo.
Para declarar una variable en C, se debe seguir el siguiente formato:
tipo lista_variables;
tipo es un tipo vlido de C y lista_variables puede consistir en uno o ms indentificadores separados por una
coma. Un identificador debe comenzar con una letra o un guin bajo.
17
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
int i, j, k;
float x,y,z;
char ch;
Es tambin posible preinicializar variables globales usando el operador de asignacin =, por ejemplo:
#include <stdlib.h>
#include <stdio.h>
float suma;
int sumagr;
char letra;
main()
{
suma = 0.0;
sumagr= 0;
letra = 'A';
...
18
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
a = b = c = d = 3;
a
b
c
d
=
=
=
=
3;
3;
3;
3;
La asignacin mltiple se puede llevar a cabo, si todos los tipos de las variables son iguales.
Se pueden redefinir los tipos de C usando typedef. Como un ejemplo de un simple uso se considera como
se crean dos nuevos tipos real y letra. Estos nuevos tipos pueden ser usados de igual forma como los tipos
predefinidos de C.
%c
%s
%d
%f
caracteres
cadena de aracteres
enteros
flotantes
Por ejemplo:
printf("%c %d %f",ch,i,x);
La sentencia de formato se encierra entre " ", y enseguida las variables. Asegurarse que el orden de
formateo y los tipos de datos de las variables coincidan.
scanf() es la funcin para entrar valores a variables. Su formato es similar a printf. Por ejemplo:
scanf("%c %d %f %s",&ch, &i, &x, cad);
19
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
const A = 1;
int a = 2;
Notas:
La directiva del preprocesador #define es un mtodo ms flexible para definir constantes en un programa.
#include <stdlib.h>
#include <stdio.h>
#define N 20
#define CONST 43
float suma= 0.0;
int sumagr= 0;
char letra= 'A';
main()
{
...
}
+
*
/
%
suma
resta
multiplicacin
divisin
mdulo
20
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
int x,y,z;
main()
{
x=( ( ++z ) - ( y-- ) ) % 100;
}
Que es equivalente a:
int x,y,z;
main()
{
z++;
x = ( z-y ) % 100;
y--;
}
El operador % (mdulo o residuo) solamente trabaja con enteros, aunque existe una funcin para flotantes
(15.1 fmod() ) de la biblioteca matemtica.
El operador divisin / es para divisin entera y flotantes. Por lo tanto hay que tener cuidado. El resultado de x
= 3 / 2; es uno, an si x es declarado como float. La regla es: si ambos argumentos en una divisin son
enteros, entoces el resultado es entero. Si se desea obtener la divisin con la fraccin, entonces escribirlo
como: x = 3.0 / 2; o x = 3 / 2.0 y an mejor x = 3.0 / 2.0.
Por otra parte, existe una forma ms corta para expresar clculos en C. Por ejemplo, si se tienen expresiones
como: i = i + 3; o x = x * (y + 2); , pueden ser reescritas como:
21
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
(a + b) * c
o
a + (b * c)
Todos los operadores tienen una prioridad, los operadores de mayor prioridad son evaluados antes que los
que tienen menor prioridad. Los operadores que tienen la misma prioridad son evaluados de izquierda a
derecha, por lo que:
a - b - c
es evaluado como
(a - b) - c
22
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
*/%
+<< >>
< <= > >=
== !=
&
^
|
&&
||
?
= += -= *= /=
Ms baja ,
23
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
4.
5.
6.
24
Leer la entrada de dos nmeros y mostrar el doble producto del primero menos la mitad del segundo.
Lea y escriba su nombre, apellido paterno, apellido materno y matricula en un formato adecuado.
Escribir un programa para leer un ``flotante'' que representa un nmero de grados Celsius, e imprime
como un ``flotante'' la temperatura equivalente en grados Fahrenheit. La salida puede ser de la
siguiente forma: 100.0 grados Celsius son 212.0 grados Fahrenheit.
Escribir un programa para imprimir varias veces el ejercicio 2. Puede usar varias instrucciones printf,
con un caracter de nueva lnea en cada una, o una instruccin con varios caracteres nueva lnea en
la cadena de formateo.
Escribir un programa que lea el radio de un crculo como un nmero flotante y muestre el rea y el
permetro del crculo.
Dados ciertos centmetros como entrada de tipo flotante, imprimir su equivalencia a pies (enteros) y
pulgadas (flotante, 1 decimal), dando las pulgadas con una precisin de un lugar decimal Suponer
2.54 centmetros por pulgada, y 12 pulgadas por pie.
Si la entrada es 333.3, el formato de la salida deber ser:
333.3 centmetros son 10 pies 11.2 pulgadas.
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 3
Estructuras Condicionales
25
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
3. Estructuras Condicionales
En este captulo se revisan los distintos mtodos con los que C controla el flujo lgico de un programa.
Los operadores relaciones binarios que se usan son:
<
<=
>
>=
==
!=
Menor que
Menor Igualque
Mayor que
Mayor igual que
Exactamente Igual
Diferente
||
&&
OR
AND
NOT
Los operadores anterior son usados con las siguientes estructuras que se muestran.
3.1 La sentencia if
Las tres formas como se puede emplear la sentencia if son:
if (condicion)
sentencia;
...o
if (condicion)
sentencia1;
else
sentencia2;
...o
if (condicion1)
sentencia1;
else
if (condicion2)
sentencia2;
...
else
sentencian;
26
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
int main()
{
int x, y, w;
........
if (x>0)
{
z=w;
.......
}
else
{
z=y;
.......
}
}
switch (variable) {
case constante1:
secuencia de sentencias
break;
case constante2:
secuencia de sentencias
break;
case constante3:
secuencia de sentencias
break;
...
default:
secuencia de sentencias
}
27
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
La forma como se puede simular el ltimo punto, es no teniendo sentencias asociados a un case, es decir,
teniendo una sentencia nula donde slo se pone el caso, con lo que se permite que el flujo del programa caiga
al omitir las sentencias, como se muestra a continuacin:
switch (letra)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
numvocales++;
break;
case ' ':
numesp++;
break;
default:
numotras++;
break;
}
3.3 Ejercicios
1.
2.
3.
4.
28
Escribir un programa que lea dos caracteres, e imprima su valor cuando se pueda interpretar como
un nmero hexadecimal. Aceptar letras maysculas y minsculas para los valores del 10 al 15.
Leer un valor entero. Suponer que el nmero es un da de la semana. Suponer que 0 corresponde a
Domingo y as sucesivamente. Imprimir el nombre del da.
Dados como entrada 3 enteros representando la fecha como da, mes, ao, imprimir la fecha del da
anterior. Por ejemplo para una entrada como: 1 3 1992 La salida ser: Fecha anterior a 1-3-1992 es
29-02-1992
Escribir un programa el cual lea dos valores enteros. Si el primero es menor que el segundo, que
imprima el mensaje ``Arriba''. Si el segundo es menor que el primero, que imprima el mensaje
``Abajo''. Si los nmeros son iguales, que imprima el mensaje ``igual''. Si hay un error en la lectura de
los datos, que imprima un mensaje conteniendo la palabra ``Error'' y haga exit( 0 );
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 4
CICLOS
29
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
4. CICLOS
En este captulo se revisan los mecanismos de C para repetir un cojunto de instrucciones hasta que se
cumple cierta condicin.
4.1 La sentencia for
La sentencia for tiene el siguiente formato:
int X;
main()
{
for( X=3; X>0; X--)
{
printf("X=%d\n",X);
}
}
X=3
X=2
X=1
Todos las siguientes sentencias for son vlidas en C. Las aplicaciones prcticas de tales sentencias no son
importantes aqu, ya que tan slo se intenta ilustrar alguanas caractersticas que pueden ser de utilidad:
En el segundo ejemplo se muestra la forma como mltiples expresiones pueden aparecer, siempre y cuando
estn separadas por una coma ,
En el tercer ejemplo, el ciclo continuar iterando hasta que z se convierta en
30
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
main()
{
char carac;
carac = '\0';
while( carac != 'A') carac = getchar();
}
Antes de entrar al ciclo se inicializa la variable carac a nulo. Despus pasa a la sentencia while donde se
comprueba si carac no es igual a 'A', como sea verdad entonces se ejecuta la sentencia del bucle ( carac
= getchar();). La funcin getchar() lee el siguiente carcter del flujo estndar (teclado) y lo devuelve,
que en nuestro ejemplo es el caracter que haya sido tecleado. Una vez que se ha pulsado una tecla, se
asigna a carac y se comprueba la condicin nuevamente. Despus de pulsar A, la condicin llega a ser
falsa porque carac es igual a A, con lo que el ciclo termina.
De lo anterior, se tiene que tanto el ciclo for, como el ciclo while comprueban la condicin en lo alto del
ciclo, por lo que el cdigo dentro del ciclo no se ejecuta siempre.
A continuacin mostramos otro ejemplo:
main()
{
int x=3;
while( x>0 )
{
printf("x = %d\n", x);
x--;
}
}
x = 3
x = 2
x = 1
31
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
while ( x-- );
while ( x = x + 1 );
while ( x += 5 );
Si se usan este tipo de expresiones, solamente cuando el resultado de x--, x=x+1 o x+=5 sea cero, la
condicin fallar y se podr salir del ciclo.
De acuerdo a lo anterior, podemos realizar una operacin completa dentro de la expresin. Por ejemplo:
int main()
{
char carac;
carac = '\0';
while ( (carac = getchar()) != 'A' )
putchar(carac);
return 0;
}
En este ejemplo se usan las funciones de la biblioteca estndar getchar() -- lee un caracter del teclado y
putchar() escribe un caracter dado en pantalla. El ciclo while proceder a leer del teclado y lo mostrar
hasta que el caracter A sea ledo.
4.3 La sentencia do-while
Al contrario de los ciclos for y while que comprueban la condicin en lo alto del bucle, el bucle do ...
while la examina en la parte baja del mismo. Esta caracterstica provoca que un ciclo do ... while
siempre se ejecute al menos una vez. La forma general del ciclo es:
do {
sentencia;
} while (condicin);
Aunque no son necesarias las llaves cuando slo est presente una sentencia, se usan normalmente por
legibilidad y para evitar confusin (respecto al lector, y no del compilador) con la sentencia while.
En el siguiente programa se usa un ciclo do ... while para leer nmeros desde el teclado hasta que uno
de ellos es menor que o igual a 100:
32
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Otro uso comn de la estructura do ... while es una rutina de seleccin en un men, ya que siempre se
requiere que se ejecute al menos una vez.
int main()
{
int opc;
printf("1. Derivadas\n");
printf("2. Limites\n");
printf("3. Integrales\n");
do
{
printf("
Teclear una opcion:
scanf("%d", &opc);
");
switch(opc)
{
case 1:
printf("\tOpcion 1 seleccionada\n\n");
break;
case 2:
printf("\tOpcion 2 seleccionada\n\n");
break;
case 3:
printf("\tOpcion 3 seleccionada\n\n");
break;
default:
printf("\tOpcion no disponible\n\n");
break;
}
} while( opc != 1 && opc != 2 && opc != 3);
}
Se muestra un ejemplo donde se reescribe usando do ... while uno de los ejemplos ya mostrados.
33
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
int main()
{
int t;
for(t=0; t<100; t++)
{
printf("%d ", t);
if (t==10) break;
}
}
Este programa muestra en pantalla los nmeros del 0 al 10, cuando alcanza el valor 10 se cumple la condicin
de la sentencia if, se ejecuta la sentencia break y sale del ciclo.
La sentencia continue funciona de manera similar a la sentencia break. Sin embargo, en vez de forzar la
salida, continue fuerza la siguiente iteracin, por lo que salta el cdigo que falta para llegar a probar la
condicin. Por ejemplo, el siguiente programa visualizar slo los nmeros pares:
int main()
{
int x;
for( x=0; x<100; x++)
{
if (x%2)
continue;
printf("%d ",x);
}
}
Finalmente se considera el siguiente ejemplo donde se leen valores enteros y se procesan de acuerdo a las
siguientes condiciones. Si el valor que sea ledo es negativo, se desea imprimir un mensaje de error y se
abandona el ciclo. Si el valor es mayor que 100, se ignora y se continua leyendo, y si el valor es cero, se
desea terminar el ciclo.
34
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
4.5 Ejercicios
1.
2.
3.
Escribir un programa que lea 5 nmeros y encuentre el promedio, el mximo y el mnimo de esos
valores.
Escribir un programa que lea nmeros hasta que se encuentre el cero. El segundo nmero se
sumar al primero, luego el tercero se restar, el cuarto se sumar, y as se deber seguir alternado
hasta que se llegue al cero. Cuando se llegue a esta condicion deber imprimir el resultado, el total
de operandos de la operacin (sin incluir el cero), y la suma de los operandos que se restaron.
Escribir un programa que lea un valor entero que ser la base para un sistema numrico (binario,
octal o decimal), despus que lea un entero positivo en esa base y que imprima su valor en base 10.
Se debe validar que el nmero pertenezca a esa base. La base ser menor que o igual a 10. El
programa podra tener la siguiente salida:
Entrada
Base
Numero
==============
10
1234
8
77
2
1111
4.
Salida
=========
1234
63
15
100;
el cual se suma al capital
35
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Leer un valor positivo, y hacer la siguiente secuencia: si el nmero es par, dividirlo entre 2; si es non,
multiplicarlo por 3 y sumarle 1. Repetir lo anterior hasta que el valor sea 1, imprimiendo cada valor,
tambin se deber imprimir cuantas operaciones de estas son hechas.
Una salida podra ser la siguiente:
El valor inicial es 9
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
El siguiente valor es
Valor fina1 1, numero
28
14
7
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
de pasos 19.
Si el valor ingresado es menor que 1, imprimir un mensaje que contenga la palabra Error y haga
exit(0)
36
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 5
Arreglos y cadenas
37
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
5. Arreglos y cadenas
En el siguiente captulo se presentan los arreglos y las cadenas. Las cadenas se consideran como un arreglo
de tipo char.
5.1 Arreglos unidimensionales y multidimensionales
Los arreglos son una coleccin de variables del mismo tipo que se referencian utilizando un nombre comn.
Un arreglo consta de posiciones de memoria contigua. La direccin ms baja corresponde al primer elemento
y la ms alta al ltimo. Un arreglo puede tener una o varias dimensiones. Para acceder a un elemento en
particular de un arreglo se usa un ndice.
El formato para declarar un arreglo unidimensional es:
int listanum[10];
En C, todos los arreglos usan cero como ndice para el primer elemento. Por tanto, el ejemplo anterior declara
un arreglo de enteros con diez elementos desde listanum[0] hasta listanum[9].
La forma como pueden ser accesados los elementos de un arreglo, es de la siguiente forma:
El lenguaje C no realiza comprobacin de contornos en los arreglos. En el caso de que sobrepase el final
durante una operacin de asignacin, entonces se asignarn valores a otra variable o a un trozo del cdigo,
esto es, si se dimensiona un arreglo de tamao N, se puede referenciar el arreglo por encima de N sin
provocar ningn mensaje de error en tiempo de compilacin o ejecucin, incluso aunque probablemente se
provoque el fallo del programa. Como programador se es responsable de asegurar que todos los arreglos
sean lo suficientemente grandes para guardar lo que pondr en ellos el programa.
C permite arreglos con ms de una dimensin , el formato general es:
int tabladenums[50][50];
Observar que para declarar cada dimensin lleva sus propios parntesis cuadrados.
Para acceder los elementos se procede de forma similar al ejemplo del arreglo unidimensional, esto es,
38
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
A continuacin se muestra un ejemplo que asigna al primer elemento de un arreglo bidimensional cero, al
siguiente 1, y as sucesivamente.
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;
for(t=0; t<3; ++t)
{
for(i=0; i<4; ++i)
printf("num[%d][%d]=%d
printf("\n");
}
", t,i,num[t][i]);
5.2 Cadenas
A diferencia de otros lenguajes de programacin que emplean un tipo denominado cadena string para
manipular un conjunto de simbolos, en C, se debe simular mediante un arreglo de caracteres, en donde la
terminacin de la cadena se debe indicar con nulo. Un nulo se especifica como '\0'. Por lo anterior, cuando
se declare un arreglo de caracteres se debe considerar un carcter adicional a la cadena ms larga que se
vaya a guardar. Por ejemplo, si se quiere declarar un arreglo cadena que guarde una cadena de diez
caracteres, se har como:
char cadena[11];
39
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
char cadena[5]="hola";
char cadena[5]={'h','o','l','a','\0'};
Para asignar la entrada estndar a una cadena se puede usar la funcin scanf con la opcin %s (observar que
no se requiere usar el operador &), de igual forma para mostrarlo en la salida estndar.
Por ejemplo:
main()
{
char nombre[15], apellidos[30];
printf("Introduce tu nombre: ");
scanf("%s",nombre);
printf("Introduce tus apellidos: ");
scanf("%s",apellidos);
printf("Usted es %s %s\n",nombre,apellidos);
}
El lenguaje C no maneja cadenas de caracteres, como se hace con enteros o flotantes, por lo que lo siguiente
no es vlido:
main()
{
char nombre[40], apellidos[40], completo[80];
nombre="Jos Mara";
/* Ilegal */
apellidos="Morelos y Pavn";
/* Ilegal */
completo="Gral."+nombre+appellidos; /* Ilegal */
}
5.3 Ejercicios
1.
2.
Escribir un programa que lea un arreglo de cualquier tipo (entero, flotante, char), se podra pedir al
usuario que indique el tipo de arreglo, y tambin escribir un programa que revise el arreglo para
encontrar un valor en particular.
Leer un texto, un caracter a la vez desde la entrada estndar (que es el teclado), e imprimir cada
lnea en forma invertida. Leer hasta que se encuentre un final-de-datos (teclar CONTROL-D para
generarlo).
El programa podra probarse tecleando progrev | progrev para ver si una copia exacta de la
entrada original es recreada.
40
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
char ch;
while( ch=getchar(), ch>=0 ) /* ch < 0 indica fin-de-datos */
o
char ch;
while( scanf( "%c", &ch ) == 1 ) /* se lee un caracter */
3.
Escribir un programa para leer un texto hasta el fin-de-datos, y mostrar una estadstica de las
longitudes de las palabras, esto es, el nmero total de palabras de longitud 1 que hayan ocurrido, el
total de longitud 2 y as sucesivamente.
Define una palabra como una secuencia de caracteres alfabticos. Se debern permitir palabras
hasta de una longitud de 25 letras.
Una salida tpica podra ser como esta:
longitud
longitud
longitud
longitud
41
1 : 16 ocurrencias
2 : 20 ocurrencias
3 : 5 ocurrencias
4 : 2 ocurrencias
........
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 6
Funciones
42
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
6. Funciones
Una funcin es un conjunto de declaraciones, definiciones, expresiones y sentencias que realizan una tarea
especfica.
El formato general de una funcin en C es
43
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
En la funcin cuadrados no esta definido ningn parmetro, y por otra parte tampoco se emplea la sentencia
return para regresar de la funcin.
6.2 Funciones y arreglos
Cuando se usan un arreglo como un argumento a la funcin, se pasa slo la direccin del arreglo y no la copia
del arreglo entero. Para fines prcticos podemos considerar el nombre del arreglo sin ningn ndice como la
direccin del arreglo.
Considerar el siguiente ejemplo en donde se pasa un arreglo a la funcin imp_rev, observar que no es
necesario especificar la dimensin del arreglo cuando es un parmetro de la funcin.
Observar que en la funcin imp_rev se usa la funcin strlen para calcular la longitud de la cadena sin
incluir el terminador nulo. Por otra parte, la funcin imp_rev no usa la sentencia return ni para terminar
de usar la funcin, ni para regresar algn valor.
Se muestra otro ejemplo,
44
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Para el caso de que se tenga que pasar un arreglo con ms de una dimensin, no se indica la primera
dimensin pero, el resto de las dimensiones deben sealarse. Se muestra a continuacin un ejemplo:
Lo anterior es hecho, dependiendo del alcance de la funcin. Bsicamente si una funcin ha sido definida
antes de que sea usada (o llamada), entonces se puede usar la funcin sin problemas.
Si no es as, entonces la funcin se debe declarar. La declaracin simplemente maneja el tipo de dato que la
funcin regresa y el tipo de par^o'ametros usados por la funcin.
Es una prctica usual y conveniente escribir el prototipo de todas las funciones al principio del programa, sin
embargo esto no es estrictamente necesario.
45
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Lo anterior declara una funcin llamada longcad que regresa un valor entero y acepta una cadena como
parmetro.
6.4 Ejercicios
1.
2.
3.
Escribir una funcin ``reemplaza'', la cual toma una cadena como parmetro, le reemplaza todos los
espacios de la cadena por un guin bajo, y devuelve el nmero de espacios reemplazados. Por
ejemplo:
46
Escribir un programa que lea una lnea de texto en un buffer (una cadena de caracteres) usando la
funcin gets y calcule la longitud de la lnea (NO usar la funcin strlen).
Modificar el programa anterior para que lea un archivo de texto. El archivo deber redireccionarse al
programa, debiendo mostrar el contenido del mismo. En caso de que se lea una lnea con longitud 0
deber terminar el programa.
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 6
Estructuras
47
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
7. Estructuras
7.1 deficicin y uso Estructuras
En C una estructura es una coleccin de variables que se referencian bajo el mismo nombre. Una estructura
proporciona un medio conveniente para mantener junta informacin que se relaciona. Una definicin de
estructura forma una plantilla que se puede usar para crear variables de estructura. Las variables que forman
la estructura son llamados elementos estructurados.
Generalmente, todos los elementos en la estructura estn relacionados lgicamente unos con otros. Por
ejemplo, se puede representar una lista de nombres de correo en una estructura. Mediante la palabra clave
struct se le indica al compilador que defina una plantilla de estructura.
struct direc
{
char nombre[30];
char calle[40];
char ciudad[20];
char estado[3];
unsigned int codigo;
};
Con el trozo de cdigo anterior no ha sido declarada ninguna variable, tan slo se ha definido el formato. Para
declarar una variable, se har como sigue:
Se pueden declarar una o ms variables cuando se define una estructura entre ) y ;. Por ejemplo:
struct direc
{
char nombre[30];
char calle[40];
char ciudad[20];
char estado[3];
unsigned int codigo;
} info_direc, binfo, cinfo;
observar que direc es una etiqueta para la estructura que sirve como una forma breve para futuras
declaraciones. Como en este ltima declaracin se indican las variables con esta estructura, se puede omitir
el nombre de la estructura tipo.
Las estructuras pueden ser tambin preinicializadas en la declaracin:
Para referenciar o accesar un miembro (o campo) de una estructura, C proporciona el operador punto ., por
ejemplo, para asignar a info_direc otro cdigo, lo hacemos como:
info_direc.codigo=54321;
48
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
artistas[50].codigo=22222;
49
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 8
Apuntadores
50
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
8. Apuntadores
Los apuntadores son una parte fundamental de C. Si usted no puede usar los apuntadores apropiadamente
entonces esta perdiendo la potencia y la flexibilidad que C ofrece bsicamente. El secreto para C esta en el
uso de apuntadores.
C usa los apuntadores en forma extensiva. Porqu?
Arreglos,
Estructuras y
Funciones
int *apuntador;
Se debe asociar a cada apuntador un tipo particular. Por ejemplo, no se puede asignar la direccin de un
short int a un long int.
Para tener una mejor idea, considerar el siguiente cdigo:
51
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
int x = 1, y = 2;
int *ap;
ap = &x;
100
x 1
200
y 2
1000
ap 100
y = *ap;
100
x 1
200
y 1
1000
ap 100
Despus y obtiene el contenido de ap. En el ejemplo ap apunta a la localidad de memoria 100 -- la localidad
de x. Por lo tanto, y obtiene el valor de x -- el cual es 1.
x = ap;
100
200
x 100 y 1
52
1000
ap 100
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
*ap = 3;
100
x 3
200
y 1
1000
ap 100
main()
{
int *ap;
*ap = 100;
}
main()
{
int *ap;
int x;
ap = &x;
*ap = 100;
}
Con los apuntadores se puede realizar tambin aritmtica entera, por ejemplo:
main()
{
float *flp, *flq;
*flp = *flp + 10;
++*flp;
(*flp)++;
flq = flp;
}
NOTA: Un apuntador a cualquier tipo de variables es una direccin en memoria -- la cual es una direccin
entera, pero un apuntador NO es un entero.
53
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
int a[10], x;
int *ap;
ap = &a[0];
54
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
*(ap + 1) = 100;
usando ap*/
Como se puede observar en el ejemplo la sentencia a[t] es idntica a ap+t. Se debe tener cuidado ya que C
no hace una revisin de los lmites del arreglo, por lo que se puede ir fcilmente ms alla del arreglo en
memoria y sobreescribir otras cosas.
C sin embargo es mucho ms stil en su relacin entre arreglos y apuntadores. Por ejemplo se puede teclear
solamente:
ap = a; en vez de ap = &a[0]; y tambin *(a + i) en vez de a[i], esto es, &a[i] es equivalente
con a+i.
Y como se ve en el ejemplo, el direccionamiento de apuntadores se puede expresar como:
55
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Se muestra enseguida una funcin para copiar una cadena en otra. Al igual que en el ejercicio anterior existe
en la biblioteca estndar una funcin que hace lo mismo.
En los dos ltimos ejemplos se emplean apuntadores y asignacin por valor. Nota: Se emplea el uso del
caracter nulo con la sentencia while para encontrar el fin de la cadena.
56
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 9
Biblioteca <stdlib.h>
57
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
9. Biblioteca <stdlib.h>
Para usar todas las funciones de sta biblioteca se debe tener la siguiente directiva
#include <stdlib.h>
Aritmticas;
Nmeros aleatorios; y
Conversin de cadenas.
El uso de todas las funciones es sencillo. Se consideran dentro del captulo en forma breve.
9.1 Funciones aritmticas
Hay cuatro funciones enteras bsicas:
Fundamentalmente hay dos funciones para enteros y para compatibilidad con enteros largos.
typedef struct {
int quot;
int rem;
} div_t;
/* cociente */
/* residuo */
58
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Respuesta:
Cociente = 2
Residuo = 2
int rand(void);
void srand(unsigned int semilla);
Un ejemplo sencillo del uso del tiempo de la fecha es inicializando la semilla a travs de una llamada:
59
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
/*
** Se usan numeros aleatorios para revolver las "tarjetas" de la baraja.
** El segundo argumento de la funcion indica el numero de tarjetas.
** La primera vez que esta funcion es llamada, srand es
** llamada para inicializar el generador de numeros aleatorios.
*/
#include <stdlib.h>
#include <time.h>
#define VERDADERO
1
#define FALSO
0
void intercambiar( int *baraja, int n_cartas )
{
int
i;
static int
primera_vez = VERDADERO;
/*
** Inicializar el generador de numeros con la fecha actual
** si aun no se ha hecho.
*/
if( primera_vez ){
primera_vez = FALSO;
srand( (unsigned int)time( NULL ) );
}
/*
** "intercambiar" empleando pares de cartas.
*/
for( i = n_cartas - 1; i > 0; i -= 1 ){
int
alguno;
int
temp;
alguno = rand() % i;
temp = baraja[ alguno ];
baraja[ alguno ] = baraja[ i ];
baraja[ i ] = temp;
}
}
60
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
char
char
char
char
char
char
char
*cad1 =
*cad2 =
*cad3 =
*cad4 =
*cad5 =
*cad6 =
*cad7;
"100";
"55.444";
"
1234";
"123cuatro";
"invalido123";
"123E23Hola";
int i;
float f:
i
f
i
i
i
f
=
=
=
=
=
=
atoi(cad1);
/* i =
atof(cad2);
/* f =
atoi(cad3);
/* i =
atoi(cad4);
/* i =
atoi(cad5);
/* i =
strtod(cad6, &cad7);
100 */
55.44 */
1234 */
123 */
0 */
/* f=1.230000E+25 y cad7=hola*/
Nota:
Similarmente, hay una funcin para bsqueda binaria, bsearch() la cual tiene el siguiente prototipo en
stdlib.h como:
#define TAM 10
61
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
La funcin bsearch() regresa un apuntador al registro que coincide con la llave dada, o bien, el valor NULL
si no encuentra el registro.
Observar que el tipo del argumento de la llave debe ser del mismo tipo que la del arreglo de los elementos (en
nuestro caso Registro).
9.5 Ejercicios
1.
2.
62
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
63
Escribir un programa que lea un nmero de la lnea de entrada y genere un nmero flotante aleatorio
en el rango de 0 a el nmero de entrada.
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 10
Biblioteca <math.h>
64
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
double
double
double
double
Es similar a calcular el arco tangente de y / x, excepto en que los signos de ambos argumentos son
usados para determinar el cuadrante del resultado.
double ceil(double x) Redondea x hacia arriba al entero ms cercano.
double cos(double x) devuelve el coseno de x, donde x est dado en radianes.
double cosh(double x) Devuelve el coseno hiperblico de x.
double exp(double x) Devuelve el valor de e (la base de los logaritmos naturales) elevado a
la potencia x.
double fabs(double x) Devuelve el valor absoluto del nmero en punto flotante x.
double floor(double x) Redondea x hacia abajo al entero ms cercano.
double fmod(double x, double y) Calcula el resto de la divisin de x entre y. El valor
devuelto es x - n * y, donde n es el cociente de x / y.
double frexp(double x, int *exp) Se emplea para dividir el nmero x en una fraccin
normalizada y un exponente que se guarda en exp.
65
x=res X 2exp
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
66
M_PI
M_PI_2
M_PI_4
M_1_PI
M_2_PI
M_2_SQRTPI
M_SQRT2 La raz cuadrada positiva de 2
M_SQRT1_2 La raz cuadrada positiva de 1/2
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 11
Manejo de cadenas
Biblioteca <string.h>
67
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Es importante preservar el caracter de terminacin NULL, ya que con ste es como C define y maneja las
longitudes de las cadenas. Todas las funciones de la biblioteca estndar de C lo requieren para una operacin
satisfactoria.
En general, aparte de algunas funciones restringidas en longitud (strncat(), strncmp() y
strncpy()), al menos que se creen cadenas a mano, no se debern encontrar problemas. Se debern usar
las funciones para manejo de cadenas y no tratar de manipular las cadenas en forma manual desmantelando
y ensamblando cadenas.
11.1 Funciones bsicas para el manejo de cadenas
Todas las funciones para manejo de cadenas tienen su prototipo en:
#include <string.h>
68
char *strcpy(const char *dest, const char *orig) -- Copia la cadena de caracteres apuntada por orig
(incluyendo el carcter terminador '\0') al vector apuntado por dest. Las cadenas no deben
solaparse, y la de destino, debe ser suficientemente grande como para alojar la copia.
int strcmp(const char *s1, const char *s2) -- Compara las dos cadenas de caracteres s1 y s2.
Devuelve un entero menor, igual o mayor que cero si se encuentra que s1 es, respectivamente,
menor que, igual a, o mayor que s2.
char *strerror(int errnum) -- Devuelve un mensaje de error que corresponde a un nmero de error.
int strlen(const char *s) -- Calcula la longitud de la cadena de caracteres.
char *strncat(char *s1, const char *s2, size_t n) -- Agrega n caracteres de s2 a s1.
int strncmp(const char *s1, char *s2, size_t n) -- Compara los primeros n caracteres de dos cadenas.
char *strncpy(const char *s1, const char *s2, size_t n) -- Copia los primeros n caracteres de s2 a s1.
strcasecmp(const char *s1, const char *s2) -- versin que ignora si son maysculas o minsculas de
strcmp().
strncasecmp(const char *s1, const char *s2, size_t n) -- versin insensible a maysculas o
minsculas de strncmp() que compara los primeros n caracteres de s1.
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
/* long = 4 */
Observar que tanto strcat() y strcopy() regresan una copia de su primer argumento, el cual es el
arreglo destino. Observar tambin que orden de los argumentos es arreglo destino seguido por arreglo fuente
lo cual a veces es una situacin para hacerlo incorrectamente.
La funcin strcmp() compara lexicogrficamente las dos cadenas y regresa:
Las funciones de copiado strncat(), strncmp() y strncpy() son versiones ms restringidas que sus
contrapartes ms generales. Realizan una tarea similar, pero solamente para los primeros n caracteres.
Observar que el caracter de terminacin NULL podra ser violado cuando se usa estas funciones, por ejemplo:
69
char *strchr(const char *s, int c) -- Devuelve un puntero a la primera ocurrencia del carcter c en la
cadena de caracteres s.
char *strrchr(const char *s, int c) -- Encuentra la ltima ocurrencia del caracter c en la cadena.
char *strstr(const char *s1, const char *s2) -- Localiza la primera ocurrencia de la cadena s2 en la
cadena s1.
char *strpbrk(const char *s1, const char *s2) -- Regresa un apuntador a la primera ocurrencia en la
cadena s1 de cualquier carcter de la cadena s2, o un apuntador nulo si no hay un caracter de s2
que exista en s1.
size_t strspn(const char *s1, const char *s2) -- Calcula la longitud del segmento inicial de s1 que
consta nicamente de caracteres en s2.
size_t strcspn(const char *s1, const char *s2) -- Regresa el nmero de caracteres al principio de s1
que no coinciden con s2.
char *strtok(char *s1, const char *s2) -- Divide la cadena apuntada a s1 en una secuencia de
``tokens'', cada uno de ellos esta delimitado por uno o ms caracteres de la cadena apuntada por s2.
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
70
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
El uso de estas funciones es directo y parecido a las operaciones de comparacin de caracteres (excepto que
la longitud exacta (n) de todas las operaciones deber ser indicada ya que no hay una forma propia de
terminacin).
Observar que en todos los casos bytes de memoria son copiados, por lo que la funcin sizeof() ayuda en
estos casos, por ejemplo:
71
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
La funcin memmove() se comporta de la misma forma que memcpy() excepto que las localidades de la
fuente y el destino podran traslaparse.
La funcin memcmp() es similar a strcmp() excepto que unsigned bytes son comparados y se devuelve
cero si s1 es menor que s2, etc.
11.4 Ejercicios
1.
2.
3.
Escribir una funcin similar a strlen que pueda manejar cadenas sin terminador. Tip: se necesitar
conocer y pasar la longitud de la cadena.
Escribir una funcin que regrese verdad, si una cadena de entrada es un palndromo. Un palndromo
es una palabra que se lee igual de izquierda a derecha, o de derecha a izquierda. Por ejemplo, ANA.
Sugerir una posible implementacin de la funcin strtok():
1. usando otras funciones de manejo de cadenas.
2. desde los principios de apuntadores.
72
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
TEMA 12
Archivos
73
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
12 Archivos
12.1 Generalidades:
Muy a menudo necesitamos almacenar cierta cantidad de datos de forma ms o menos permanente. La
memoria del ordenador es volatil, y lo que es peor, escasa y cara. De modo que cuando tenemos que guardar
nuestros datos durante cierto tiempo tenemos que recurrir a sistemas de almacenamiento ms econmicos,
aunque sea a costa de que sean ms lentos.
Durante la historia de los ordenadores se han usado varios mtodos distintos para el almacenamiento de
datos. Al principio se recurri a cintas de papel perforadas, despus a tarjetas perforadas. A continuacin se
pas al soporte magntico, empezando por grandes rollos de cintas magnticas abiertas.
Hasta aqu, todos los sistemas de almacenamiento externo eran secuenciales, es decir, no permitan acceder
al punto exacto donde se guardaba la informacin sin antes haber partido desde el principio y sin haber ledo
toda la informacin, hasta el punto donde se encontraba la que estabamos buscando.
Con las cintas magnticas empez lo que con el tiempo sera el acceso aleatorio a los datos. Se poda
reservar parte de la cinta para guardar cierta informacin sobre la situacin de los datos, y aadir ciertas
marcas que hicieran ms sencillo localizarla.
Pero no fu hasta la aparicin de los discos magnticos cuando sta tcnica lleg a su sentido ms amplio.
En los discos es ms sencillo acceder a cualquier punto de la superficie en poco tiempo, ya que se accede al
punto de lectura y escritura usando dos coordenadas fsicas. Por una parte la cabeza de lectura/escritura se
puede mover en el sentido del radio del disco, y por otra el disco gira permanentemente, con lo que cualquier
punto del disco pasa por la cabeza en un tiempo relativamente corto. Esto no pasa con las cintas, donde slo
hay una coordenada fsica.
Con la invencin y proliferacin de los discos se desarrollaron los ficheros de acceso aleatorio, que permiten
acceder a cualquier dato almacenado en un fichero en relativamente poco tiempo.
Actualmente, los discos duros tienen una enorme capacidad y son muy rpidos, aunque an siguen siendo
lentos, en comparacin con las memorias RAM. El caso de los CD es algo intermedio. En realidad son
secuenciales en cuanto al modo de guardar los datos, cada disco slo tiene una pista de datos grabada en
espiral. Sin embargo, este sistema, combinado con algo de memoria RAM, proporciona un acceso muy
prximo al de los discos duros.
En cuanto al tipo de acceso, en C y C++ podemos clasificar los archivos segn varias categoras:
1.
2.
3.
74
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Es posible crear archivos combinando cada una de estas categoras, por ejemplo: archivos secuenciales de
texto de longitud de registro variable, que son los tpicos archivos de texto. Archivos de acceso aleatorio
binarios de longitud de registro constante, normalmente usados en bases de datos. Y tambin cualquier
combinacin menos corriente, como archivos secuenciales binarios de longitud de registro constante, etc.
En cuanto a cmo se definen estas propiedades, hay dos casos. Si son binarios o de texto o de entrada,
salida o entrada/salida, se define al abrir el fichero, mediante la funcin fopen en C o mediante el mtodo open
de fstream en C++.
La funcin open usa dos parmetros. El primero es el nombre del fichero que contiene el archivo. El segundo
es em modo que es una cadena que indica el modo en que se abrir el archivo: lectura o escritura, y el tipo de
datos que contiene: de texto o binarios.
En C, los ficheros admiten seis modos en cuanto a la direccin del flujo de datos:
En cuanto a los valores permitidos para los bytes, se puede aadir otro carcter a la cadena de modo:
En ciertos sistemas operativos no existe esta distincin, y todos los ficheros son binarios.
12.2 Tipos, funciones y clases usados frecuentemente con ficheros
Funciones y tipos C estndar:
Tipo FILE:
C define la estructura de datos FILE en el fichero de cabecesa "stdio.h" para el manejo de ficheros. Nosotros
siempre usaremos punteros a estas estructuras.
La definicin de sta estructura depende del compilador, pero en general mantienen un campo con la posicin
actual de lectura/escritura, un buffer para mejorar las prestaciones de acceso al fichero y algunos campos
para uso interno.
75
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
sta funcin sirve para abrir y crear ficheros en disco. El valor de retorno es un puntero a una estructura FILE.
Los parmetros de entrada son:
1.
2.
nombre: una cadena que contiene un nombre de fichero vlido, esto depende del sistema operativo
que estemos usando. El nombre puede incluir el camino completo.
modo: especifica en tipo de fichero que se abrir o se crear y el tipo de datos que puede contener,
de texto o binarios:
o r: slo lectura. El fichero debe existir.
o w: se abre para escritura, se crea un fichero nuevo o se sobreescribe si ya existe.
o a: aadir, se abre para escritura, el cursor se situa al final del fichero. Si el fichero no existe,
se crea.
o r+: lectura y escritura. El fichero debe existir.
o w+: lectura y escritura, se crea un fichero nuevo o se sobreescribe si ya existe.
o a+: aadir, lectura y escritura, el cursor se situa al final del fichero. Si el fichero no existe, se
crea.
o t: tipo texto, si no se especifica "t" ni "b", se asume por defecto que es "t"
o b: tipo binario.
Funcin fclose:
Sintaxis:
Es importante cerrar los ficheros abiertos antes de abandonar la aplicacin. Esta funcin sirve para eso.
Cerrar un fichero almacena los datos que an estn en el buffer de memoria, y actualiza algunos datos de la
cabecera del fichero que mantiene el sistema operativo. Adems permite que otros programas puedan abrir el
fichero para su uso. Muy a menudo, los ficheros no pueden ser compartidos por varios programas.
Un valor de retorno cero indica que el fichero ha sido correctamente cerrado, si ha habido algn error, el valor
de retorno es la constante EOF. El parmetro es un puntero a la estructura FILE del fichero que queremos
cerrar.
Funcin fgetc:
Sintaxis:
76
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Esta funcin sirve para comprobar si se ha alcanzado el final del fichero. Muy frecuentemente deberemos
trabajar con todos los valores almacenados en un archivo de forma secuencial, la forma que suelen tener los
bucles para leer todos los datos de un archivo es permanecer leyendo mientras no se detecte el fin de fichero.
Esta funcin suele usarse como prueba para verificar si se ha alcanzado o no ese punto.
El valor de retorno es distinto de cero slo si no se ha alcanzado el fin de fichero. El parmetro es un puntero
a la estructura FILE del fichero que queremos verificar.
Funcin rewind:
Sintaxis:
Es una funcin heredada de los tiempos de las cintas magnticas. Literalmente significa "rebobinar", y hace
referencia a que para volver al principio de un archivo almacenado en cinta, haba que rebobinarla. Eso es lo
que hace sta funcin, sita el cursor de lectura/escritura al principio del archivo.
El parmetro es un puntero a la estructura FILE del fichero que queremos rebobinar.
77
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Funcin fgets:
Sintaxis:
Esta funcin est diseada para leer cadenas de caracteres. Leer hasta n-1 caracteres o hasta que lea un
retorno de lnea. En este ltimo caso, el carcter de retorno de lnea tambin es ledo.
El parmetro n nos permite limitar la lectura para evitar derbordar el espacio disponible en la cadena.
El valor de retorno es un puntero a la cadena leda, si se ley con xito, y es NULL si se detecta el final del
fichero o si hay un error. Los parmetros son: la cadena a leer, el nmero de caracteres mximo a leer y un
puntero a una estructura FILE del fichero del que se leer.
Funcin fputs:
Sintaxis:
La funcin fputs escribe una cadena en un fichero. No se aade el carcter de retorno de lnea ni el carcter
nulo final.
El valor de retorno es un nmero no negativo o EOF en caso de error. Los parmetros de entrada son la
cadena a escribir y un puntero a la estructura FILE del fichero donde se realizar la escritura.
Funcin fread:
Sintaxis:
78
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Esta funcin est pensada para trabajar con registros de longitud constante. Es capaz de leer desde un
fichero uno o varios registros de la misma longitud y a partir de una direccin de memoria determinada. El
usuario es responsable de asegurarse de que hay espacio suficiente para contener la informacin leda.
El valor de retorno es el nmero de registros ledos, no el nmero de bytes. Los parmetros son: un puntero
a la zona de memoria donde se almacenarn los datos ledos, el tamao de cada registro, el nmero de
registros a leer y un puntero a la estructura FILE del fichero del que se har la lectura.
Funcin fwrite:
Sintaxis:
Esta funcin tambin est pensada para trabajar con registros de longitud constante y forma pareja con fread.
Es capaz de escribir hacia un fichero uno o varios registros de la misma longitud almacenados a partir de una
direccin de memoria determinada.
El valor de retorno es el nmero de registros escritos, no el nmero de bytes. Los parmetros son: un
puntero a la zona de memoria donde se almacenarn los datos ledos, el tamao de cada registro, el nmero
de registros a leer y un puntero a la estructura FILE del fichero del que se har la lectura.
Ejemplo:
79
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Funcin fprintf:
Sintaxis:
La funcin fprintf funciona igual que printf en cuanto a parmetros, pero la salida se dirige a un fichero en lugar
de a la pantalla.
Funcin fscanf:
Sintaxis:
La funcin fscanf funciona igual que scanf en cuanto a parmetros, pero la entrada se toma de un fichero en
lugar del teclado.
Funcin fflush:
Sintaxis:
Esta funcin fuerza la salida de los datos acumulados en el buffer de salida del fichero. Para mejorar las
prestaciones del manejo de ficheros se utilizan buffers, almacenes temporales de datos en memoria, las
operaciones de salida se hacen a travs del buffer, y slo cuando el buffer se llena se realiza la escritura en el
disco y se vaca el buffer. En ocasiones nos hace falta vaciar ese buffer de un modo manual, para eso sirve
sta funcin.
El valor de retorno es cero si la funcin se ejecut con xito, y EOF si hubo algn error. El parmetro de
entrada es un puntero a la estructura FILE del fichero del que se quiere vaciar el buffer. Si es NULL se har el
vaciado de todos los ficheros abiertos.
80
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Esta funcin sirve para situar el cursor del fichero para leer o escribir en el lugar deseado.
El valor de retorno es cero si la funcin tuvo xito, y un valor distinto de cero si hubo algn error.
Los parmetros de entrada son: un puntero a una estructura FILE del fichero en el que queremos cambiar el
cursor de lectura/escritura, el valor del desplazamiento y el punto de origen desde el que se calcular el
desplazamiento.
El parmetro origen puede tener tres posibles valores:
1.
2.
3.
SEEK_SET el desplazamiento se cuenta desde el principio del fichero. El primer byte del fichero
tiene un desplazamiento cero.
SEEK_CUR el desplazamiento se cuenta desde la posicin actual del cursor.
SEEK_END el desplazamiento se cuenta desde el final del fichero.
Funcin ftell:
Sintaxis:
La funcin ftell sirve para averiguar la posicin actual del cursor de lectura/excritura de un fichero.
El valor de retorno ser esa posicin, o -1 si hay algn error.
El parmetro de entrada es un puntero a una estructura FILE del fichero del que queremos leer la posicin del
cursor de lectura/escritura.
12.3 Archivos secuenciales
En estos archivos, la informacin slo puede leerse y escribirse empezando desde el principio del archivo.
Los archivos secuenciales tienen algunas caractersticas que hay que tener en cuenta:
1.
2.
3.
Esto es en teora, por supuesto, en realidad C no distingue si los archivos que usamos son secuenciales o no,
es el tratamiento que hagamos de ellos lo que los clasifica como de uno u otro tipo.
Pero hay archivos que se comportan siempre como secuenciales, por ejemplo los ficheros de entrada y salida
estndar: stdin, stdout, stderr y stdaux.
Tomemos el caso de stdin, que suele ser el teclado. Nuestro programa slo podr abrir ese fichero como de
lectura, y slo podr leer los caracteres a medida que estn disponibles, y en el mismo orden en que fueron
tecleados.
81
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Abrir el archivo en un modo que te permita leer y escribir. Esto no es imprescindible, es posible usar
archivos de acceso aleatorio slo de lectura o de escritura.
Abrirlo en modo binario, ya que algunos o todos los campos de la estructura pueden no ser
caracteres.
Usar funciones como fread y fwrite, que permiten leer y escribir registros de longitud constante desde
y hacia un fichero.
Usar la funcin fseek para situar el puntero de lectura/escritura en el lugar apropiado de tu archivo.
struct stRegistro {
char Nombre[34];
int dato;
int matriz[23];
} reg;
82
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Muy importante: despus de cada operacin de lectura o escritura, el cursor del fichero se actualiza
automticamente a la siguiente posicin, as que es buena idea hacer siempre un fseek antes de un fread o
un fwrite.
En el caso de streams, la forma de trabajar es anloga:
fichero.seekg(5*sizeof(stRegistro), ios::beg);
fichero.read(®, sizeof(stRegistro));
fichero.seekp(5*sizeof(stRegistro), ios::beg);
fichero.write(®, sizeof(stRegistro));
long nRegistros;
long nBytes;
fseek(fichero, 0, SEEK_END); // Colocar el cursor al final del fichero
nBytes = ftell(fichero); // Tamao en bytes
nRegistros = ftell(fich)/sizeof(stRegistro); // Tamao en registros
En el caso de streams:
long nRegistros;
long nBytes;
fichero.seekg(0, ios::end); // Colocar el cursor al final del fichero
nBytes = fichero.tellg(); // Tamao en bytes
nRegistros = fichero.tellg()/sizeof(stRegistro); // Tamao en registros
Borrar registros
Borrar registros puede ser complicado, ya que no hay ninguna funcin de librera estndar que lo haga.
83
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
84
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Marcar el registro como borrado o no vlido, para ello hay que aadir un campo extra en la estructura
del registro:
struct stRegistro {
char Valido; // Campo que indica si el registro es vlido
char Nombre[34];
int dato;
int matriz[23];
}
Si el campo Valido tiene un valor prefijado, por ejemplo 'S' o ' ', el registro es vlido. Si tiene un valor
prefijado, por ejemplo 'N' o '*', el registro ser invlido o se considerar borrado.
De este modo, para borrar un registro slo tienes que cambiar el valor de ese campo.
Pero hay que tener en cuenta que ser el programa el encargado de tratar los registros del modo
adecuado dependiendo del valor del campo Valido, el hecho de marcar un registro no lo borra
fsicamente.
Si se quiere elaborar ms, se puede mantener un fichero auxiliar con la lista de los registros
borrados. Esto tiene un doble propsito:
2.
Que se pueda disear una funcin para sustituir a fseek() de modo que se tengan en cuenta
los registros marcados.
o Que al insertar nuevos registros, se puedan sobrescribir los anteriormente marcados como
borrados, si existe alguno.
Hacer una copia del fichero en otro fichero, pero sin copiar el registro que se quiere borrar. Este
sistema es ms tedioso y lento, y requiere cerrar el fichero y borrarlo o renombrarlo, antes de poder
usar de nuevo la versin con el registro eliminado.
Lo normal es hacer una combinacin de ambos, durante la ejecucin normal del programa se borran registros
con el mtodo de marcarlos, y cuando se cierra la aplicacin, o se detecta que el porcentaje de registros
borrados es alto o el usuario as lo decide, se "empaqueta" el fichero usando el segundo mtodo.
Ejemplo:
A continuacin se incluye un ejemplo de un programa que trabaja con registros de acceso aleatorio, es un
poco largo, pero bastante completo:
85
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
86
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
87
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
88
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
ANEXOS
89
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
que muestra en stdout la lista de argumentos de acuerdo al formato especificado. La funcin devuelve el
nmero de caracteres impresos.
La cadena de formateo tiene dos tipos de objetos:
Tipo
Resultado
char
un slo caracter
i,d
int
int
x,X
int
int
char *
f
e,E
Notacin Cientfica
-1.23e002
g,G
"
e f la que sea
ms compacta
%
90
caracter %
Pedro Nez Ypiz
Email: pedro_yepiz@uabc.edu.mx
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
Por lo tanto:
printf("%-2.3f\n",17.23478);
17.235
printf("VAT=17.5%%\n");
VAT=17.5%
91
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
92
PROGRAMACION ESTRUCTURADA
/ Clave: 12125
BIBLIOGRAFIA:
COMO PROGRAMAR EN C/C++,Deitel & Deitel, Prentice Hall,
ISBN:9688804711
C/C++ CURSO DE PROGRAMACIN, Fco. Javier Ceballos, Alpha
Omega ISBN:978847897628
FUNDAMENTOS DE PROGRAMACIN, Jose Luis Joyanes A, ed.
McGrawhill, ISBN:9788448139865
http://alleg.sourceforge.net/
http://yepiz.webs.com
93