Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Modulo 301304 - 2012-2
Modulo 301304 - 2012-2
SERGIO BERMDEZ
ROJAS Acreditador
PASTO
Julio de 2012
INTRODUCCIN
NDICE DE CONTENIDO
ITEM
TEMA
PAG
INTRODUCCIN
1.0
1.1
CAPITULO 1: GENERALIDADES
11
1.1.1
11
1.1.2
13
1.1.3
15
1.1.4
16
1.1.5
19
1.2
22
1.2.1
22
1.2.2
24
1.2.3
24
1.2.4
26
1.2.5
28
1.3
30
1.3.1
30
1.3.2
32
1.3.3
34
1.3.4
36
1.3.5
37
1.4
39
2.0
UNIDAD 2: ARREGLOS
40
2.1
41
2.1.1
41
2.1.2
44
2.1.3
46
2.1.4
47
2.1.5
48
2.2
51
2.2.1
51
2.2.2
51
2.2.3
53
2.2.4
69
2.2.5
70
2.3
74
2.3.1
74
2.3.2
74
2.3.3
75
2.3.4
78
2.3.5
79
2.4
82
3.0
83
3.1
CAPITULO 7: ESTRUCTURAS
86
3.1.1
86
3.1.2
87
3.1.3
88
3.1.4
89
3.1.5
92
3.2
CAPITULO 8: ARCHIVOS
93
3.2.1
93
3.2.2
94
3.2.3
95
3.2.4
97
3.2.5
98
3.3
99
3.3.1
99
3.3.2
101
3.3.3
102
3.3.4
105
3.3.5
114
3.4
121
BIBLIOGRAFA
113
124
128
135
LISTADO DE TABLAS
TEMA
PAG
25
97
124
TABLA 4. Operadores
127
TEMA
PAG
16
17
39
FIGURA 4. Vector
44
FIGURA 5. Matriz
46
106
FIGURA 7. Recomendacin
107
109
112
115
UNIDAD 1
Nombre de
Unidad
Introduccin
la
INTRODUCCIN A LA PROGRAMACIN EN C
En la primera unidad se busca crear el enlace de los conceptos que los
estudiantes han adquirido en el curso previo de algoritmos y la utilizacin
de un lenguaje de programacin, en este caso C, como medio para
desarrollar soluciones computacionales, expresadas en programas. Para
lograrlo se parte de reconocer los conceptos generales de programacin,
analizar la importancia del lenguaje C, revisando su trayectoria,
analizando su entono de trabajo y las estructuras que utiliza para el
desarrollo de programas.
Para abordar de manera adecuada la construccin de programas, se
estudian los tipos de datos, las sentencias de control de datos, tanto
selectivas como repetitivas, y el manejo de funciones.
Cabe resaltar que si bien es cierto que para la construccin del presente
mdulo, se tuvo en cuenta textos de autores reconocidos y sitios web
especializados en programacin, es vital que todos los estudiantes estn
siempre atentos a las posibilidades que les ofrece la web, mediante
diversos recursos multimediales (videos, tutoriales, textos en lnea) para
ampliar y profundizar sus conocimientos.
Justificacin
Intencionalidades
Formativas
la
Objetivos de la unidad
Metas de aprendizaje
El estudiante es capaz de desarrollar programas mediante la utilizacin
de funciones.
Denominacin de
captulos
Captulo 1: Generalidades
Captulo 2: Conceptos bsicos de los programas en C
Captulo 3: Sentencias de control y funciones
10
CAPITULO 1: GENERALIDADES
Introduccin
Es fundamental iniciar el curso de introduccin a la programacin, abordando
contenidos que ubiquen al estudiante en el entorno de trabajo, por ello se
incluyen temticas generales de gran importancia para comprender los conceptos
bsicos de programacin estructurada y procedural.
Es as como se han elegido cinco lecciones que parten de informacin general
sobre los aspectos ms relevantes de la programacin, los requerimientos que se
deben tener en cuenta antes de iniciar con la codificacin propiamente dicha de
programas en el Lenguaje C, la descripcin del entorno de trabajo del lenguaje,
donde se explica de manera general la forma como se construye un programa,
utilizando el entorno propio del lenguaje de programacin y las estructuras
bsicas que constituyen un programa en C.
Se analiza la temtica de los compiladores y de manera especfica el compilador
del lenguaje C, para apoyar al estudiante en la comprensin sobre la forma como
un conjunto de instrucciones debidamente estructuradas pueden lograr la
construccin de programas que sirvan de solucin a problemas especficos que
puedan ser resueltos mediante un sistema informtico, partiendo de
interpretaciones adecuadas, diseos slidos y revisiones constantes para
posibilitar depuraciones ptimas que solucionen problemas lgicos y de sintaxis.
Finalmente, debido a que el tema de la programacin es bastante amplio, es
indispensable que el estudiante utilice todos los recursos que se encuentren a su
alcance para lograr una verdadera comprensin de los temas expuestos, puesto
que el mdulo constituye un punto de partida para avanzar en su proceso de
aprendizaje. Queda abierta entonces la invitacin a consultar la bibliografa
sugerida y aprovechar todas las herramientas que se encuentran en la web para
avanzar en el proceso de construccin de conocimiento.
11
12
Sistemas operativos
Intrpretes
Editores
Ensambladores
Compiladores
14
Programa
fuente
Compilacin
Programa
objeto
Enlazador
Programa
ejecutable
16
Editar un programa
Compilar un programa
Ejecutar y compilar
19
Deteccin de Errores
Cuando la fase de compilacin no ha terminado con xito, en la parte inferior de la
ventana principal aparece activada la pestaa Compilador, con tres columnas:
20
Control de la depuracin.
Siguiente Paso (F7): ejecuta la siguiente instruccin del programa (la marcada en
color azul). Cuando dicha instruccin contiene una llamada a una funcin/mtodo,
dicha funcin/mtodo se ejecuta completamente tras seleccionar Siguiente Paso.
Esta posibilidad es muy til cuando hay seguridad de que esa funcin/mtodo no
contiene ningn tipo de error.
Avanzar Paso a Paso (Shift+F7): ejecuta la siguiente instruccin del programa. Si
dicha instruccin contiene una llamada a una funcin o mtodo el ndice de
ejecucin (lnea marcada en azul) se situar en la primera sentencia de dicha
funcin/mtodo para ejecutarlo paso a paso.
Saltar Paso (Ctrl+F7): Ejecuta instrucciones hasta alcanzar el siguiente punto de
ruptura. Cuando no hay puntos de ruptura situados despus de la sentencia
actual, se ejecutarn todas las instrucciones hasta finalizar el programa.
Ir a cursor (Shift+F4): ejecuta sentencias hasta el lugar donde se sita el cursor.
Parar ejecucin (Ctrl+Alt+F2): Detiene la ejecucin paso a paso, sin necesidad
de llegar al final del programa.
Visualizacin del contenido de las variables
Para ello existe la ventana Watch, que se activa pulsando la pestaa Depurar
situada en la parte izquierda del entorno.
Cuando se quiere aadir una variable a dicha ventana se puede: pulsar la opcin
Aadir Watch (F4) para despus escribir el nombre de la variable, o seleccionar
la variable con el ratn y pulsar Aadir Watch.
Para eliminar una variable de la ventana Watch, se marca y se pulsa Quitar
Watch.
21
aparezca en el programa.
Declaracin de variables y constantes globales: las variables y constantes
globales son aquellas cuyo valor afecta a todo el programa, esto es que se
reconocen en todas las funciones donde se utilicen. Deben ubicarse antes de la
funcin main(), se indica el tipo de dato y el nombre de la variable. Ejemplo:
Int VARIABLE1;
Cabecera de funciones: se realiza una descripcin a manera de prototipo
de las funciones que se crearan ms adelante. Ejemplo:
Int funcion1();
Funcin main(): todo programa escrito en C est constituido por funciones, y la
funcin principal es main(), que no puede faltar en ningn programa. Luego del
termino main() se escribe el bloque de cdigo, que generalmente incluye
llamadas a otras funciones definidas por el usuario. Ejemplo de su estructura:
int main()
{ sentencia 1;
sentencia 2;
return(0)
}
Las variables y constantes globales se definen antes de la funcin principal
main(), asi como las variables y constantes locales se declaran en la cabecera del
cuerpo de la funcin principal y de otra funcin definida por usuario.
Las sentencias que se incluyen en las funciones, finaliza con punto y coma (;).
Definicin de funciones: es necesario crear las funciones que se definieron
como prototipos para darle viabilidad al programa. Las funciones se crean para
realizar una tarea especfica, pueden devolver o no datos y utilizar o no
argumentos. Todas las funciones tienen nombre. Recuerde que debe declarar su
prototipo antes de la funcin principal main(), de lo contrario al compilar el
programa se generar un error.
Sentencias: cada una de las ordenes que se le da al compilador por medio del
lenguaje para que efectu una accin. Las sentencias finalizan con punto y coma
(;).
23
Palabras reservadas: son trminos especiales que hacen parte del lenguaje y
tienen un significado especial. Estas palabras reservadas no se pueden utilizar
como nombre de identificador o funcin.
Las siguientes son palabras reservadas: asm, enum, auto, extern, break, float,
case, for, char, goto, const, if, signed, sizeof, static, struct, switch, typedef,
continue, default, do, double, else, int, long, register, return, short, union,
unsigned, void, volatile, while.
capacidad para crear sus propios tipos de datos. Los tipos bsicos son;
Enteros
Nmeros de coma flotante (reales)
Caracteres
La siguiente tabla muestra los distintos tipos de dato que se pueden usar en C
para declarar variables.
TIPO
char
int
double
float
pointer
long double
25
cout << imprime en pantalla la informacin, sea esta una cadena de texto (se
escribe entre comillas dobles) o el valor que contiene una variable. Adems se
puede incluir indicadores de formato que indican una tarea especfica como
saltar una lnea o tabular. Requiere incluir la librera iostram.h
26
Ejemplos:
int x = 10;
cout << Programa de Ingeniera; // imprime una cadena
cout << \n; // ejecuta un salto de lnea
cout << x; // imprime el valor que contiene la variable x
cout << \n El valor de x es ; // imprime El valor de x es 10
Almacenar datos
Los datos se pueden almacenar en las variables desde la codificacin, a esto se le
conoce como asignar valores.
Ejemplos: int a = 30; // declaracin de una variable y asignacin de valor
float b;
// declaracin de una variable
b = 35.45 // asignacin de un valor a la variable b
Entradas por teclado
scanf(): la funcin scanf(), disponible al incluir stdio.h, permite leer datos por
teclado. La funcin scanf se usa de un modo similar a printf(), su primer
argumento es una cadena con marcas de formato. A ste le siguen una o ms
direcciones de memoria. Si desea leer por teclado el valor de una variable
entera a, puede hacerlo as: scanf ("%d", &a);
Observe que la variable cuyo valor se lee por teclado va obligatoriamente
precedida por el operador &: es as como se obtiene la direccin de memoria
en la que se almacena el valor de la variable. Uno de los errores ms
comunes es omitir el carcter & que debe preceder a todas las variables
escalares en scanf .
Sintaxis: scanf(indicador_de_formato, identificador)
o Los argumentos indican los tipos de datos que se van leer y el nombre
de las variables donde se van a guardar. Ej: scanf(%d, &pies).
o A los identificadores les precede el &, salvo cuando se trata de vectores,
como es el caso de las cadenas.
o Para almacenar un carcter utilice cscanf( );
o Ejemplo: int a;
char letra, palabra[10];
printf(Digite un nmero : );
scanf(%d , &a);
printf(\n Digite una vocal : );
cscanf(%c, &letra);
printf(\n Digite una palabra : );
scanf(%s, palabra);
27
Operadores Lgicos
o && es conocido como and (y). Se utiliza para unir condiciones, para que
la expresin sea verdadera, todas las condiciones que se unen deben
ser verdaderas.
o || operador or (o). La sentencia es verdadera cuando una de las
condiciones es verdadera. (alt-124).
o ! niega la expresin o condicin. Ej. !(a>b) indica a no es mayor que b
28
29
Introduccin
La forma ms razonable de encarar el desarrollo de un programa complicado es
aplicar lo que se ha dado en llamar "Programacin Top-Down".
Esto implica que, luego de conocer cul es la meta a alcanzar, se subdivide esta
en otras varias tareas concurrentes, por ejemplo:
Leer un teclado, procesar datos, mostrar los resultados. Luego a estas se las
vuelve a dividir en otras menores:
Y as se contina hasta llegar a tener un gran conjunto de pequeas y simples
tareas, del tipo de "leer una tecla" "imprimir un caracter". Luego slo resta
abocarse a resolver cada una de ellas por separado. De esta forma el
programador, slo se las tendr que ver con diminutas piezas de programa, de
pocas lneas, cuya escritura y correccin posterior es una tarea simple.
Tal es el criterio con que est estructurado el lenguaje C, donde una de sus
herramientas fundamentales son las funciones. Todo compilador comercial trae
una gran cantidad de Libreras de toda ndole, matemticas, de entrada - salida,
de manejo de textos, de manejo de grficos, etc, que solucionan la mayor parte
de los problemas bsicos de programacin.
Ahora bien, para que esos bloques de cdigo cumplan tareas especficas, es
indispensable incluir sentencias de control y repetitivas que apoyan el diseo
estructural de un programa y que se debe utilizar en atencin a lo que se requiere
lograr en la tarea.
{ c++;
x = z;
}
else
{ v--;
y = t;
}
Los if pueden anidarse para evaluar varias condiciones. Ej.
if (condicion1)
{ sentencia 1;
sentencia 2;
if (condicin 2)
{ if (condicin 3)
{ sentencia 3;
sentencia 4;
}
else
{ sentencia 5;
sentencia 6;
}
}
}
else
{ sentencia 7;
sentencia 8;
}
}
}
La opcin default se ejecuta cuando no hay coincidencias y es opcional.
Se diferencia de if en que slo permite comprobar por igualdad.
Ej. char letra;
printf(Digite letra : ); cscanf(%c,&letra);
switch ( letra)
{ case a:
printf ( letra a );
break;
case e:
printf ( letra e );
break;
case i:
printf ( letra i );
break;
case o:
printf ( letra o );
break;
case u:
printf ( letra u );
break;
default :
printf ( no es vocal );
}
La siguiente sintaxis for( ; ; ) crea un ciclo infinito, a menos que exista una
condicin interna que obligue a salir del ciclo. Ej.
int i;
char r;
for ( ; ; )
{ printf(Desea continuar (s/n) : );
cscanf(%c,&r);
if ( r != s) break;
}
Sentencia break: se utiliza para terminar la ejecucin de un ciclo. Ejemplo:
int i;
for(i=0; i<=10; i++)
{ printf (\n %d,i);
if (i= =5) break;
} // nicamente imprime los nmeros del 0 al 5.
int op;
do
{ printf(\n\n);
printf(1. Llenar informacin );
printf(\n2. Mostrar informacin );
printf(\n3. Eliminar informacin );
printf(\n4. Salir );
printf(\n\n);
printf(Elija opcin : );
scanf(%d, &op);
switch(op)
{ case 1:
{ printf(\n Llenar);
break;
}
case 1:
{ printf(\n Mostrar);
break;
}
case 1:
{ printf(\n Eliminar);
break;
}
}
while(op!=4);
printf(\nDigite una tecla para continuar );
getch( );
}
Ejemplo:
int Mayor(int a, int b); // es un prototipo de funcin que devuelve un entero y
recibe dos parmetros enteros.
Aunque C permite realizar el prototipo de la siguiente manera:
int Mayor(int,int);
Sin necesidad de escribir el nombre de las variables; entonces La estructura de
un programa en C quedara as:
[directivas del pre-procesador: include y define]
[declaracin de variables y constantes globales]
[prototipos de funciones]
funcin main ()
[definiciones de funciones] //definidas en los prototipos
38
39
UNIDAD 2
Nombre de la Unidad
ARREGLOS
En la unidad 1 ya se estudi el tema de algunos tipos bsicos de datos,
Introduccin
Justificacin
Intencionalidades
Formativas
40
Denominacin de
captulos
Arreglos y cadenas
Ordenacin y bsqueda
Punteros o apuntadores
41
Introduccin
Esta unidad permite el acercamiento al mundo de los datos estructurados,
para tal efecto se iniciar con los datos ms sencillos como son los arreglos
unidimensionales, luego se trabajar con arreglos bidimensionales, conocidos
tambin como matrices, para continuar con las cadenas de caracteres.
Adems de la importancia de conocer como se almacena la informacin, es
indispensable saber cmo acceder a ella; estos temas sern aclarados en la
organizacin y bsqueda de datos, donde se analizarn diferentes propuestas
para realizar esos procesos.
VECTOR[X]
0
FIGURA 4. Vector
Como se puede observar slo se necesita de un ndice (x) para acceder a cada
elemento de la lista. Por ejemplo si se quisiera rellenar la casilla 4 dndole el
valor 10, solo tendra que escribir la sentencia: vector[4]=10;
Cuando un array se pasa como argumento de una funcin, no se pasa una copia
completa del array, sino slo la direccin del primer elemento del array. Para
44
45
Tipo nombre_array[tamao]={lista_valores};
int lista[6]={2,4,6,8,1,5};
int datos[100]={0};
int num[4]={4,5};
// todos se inicializan a 0
// equivale a {4,5,0,0}
ndice de
filas
FIGURA 5. Matrz
{
printf("Caracter para guardar en matriz[%d][%d]: ",c,d);
scanf("%c",&matriz[c][d]);
getchar();
}
}
for(c=0;c<=6;c++)
{
for(d=0;d<=6;d++)
{
printf("\nValor matriz[%d][%d]=%c",c,d,matriz[c][d]);
}
}
getch();
}
Funciones de Cadena
Para trabajar con cadenas es necesario utilizar ciertas funciones, que requieren
incluir en el programa la libreria: string.h
if (strcpm(salir,t1)) break;
}
50
14
21
32
45
orden ascendente
75
70
35
16
14
12
orden descendente
orden descendente
Los mtodos (algoritmos) de ordenacin son numerosos, por ello se debe prestar
especial atencin en su eleccin. Cmo se sabe cul es el mejor algoritmo? La
eficiencia es el factor que mide la calidad y rendimiento de un algoritmo. En el
caso de la operacin de ordenacin, dos criterios se suelen seguir a la hora de
decidir qu algoritmo de entre los que resuelven la ordenacin es el ms
eficiente:
1) tiempo menor de ejecucin en computadora.
2) menor nmero de instrucciones.
Sin embargo, no siempre es fcil efectuar estas medidas: puede no disponerse de
instrucciones para medida de tiempo aunque no sea ste el caso del lenguaje
C, y las instrucciones pueden variar, dependiendo del lenguaje y del propio
estilo del programador. Por esta razn, el mejor criterio para medir la eficiencia de
un algoritmo es aislar una operacin especfica clave en la ordenacin y contar el
nmero de veces que se realiza. As, en el caso de los algoritmos de ordenacin,
se utilizar como medida de su eficiencia el nmero de comparaciones entre
elementos efectuados. El algoritmo de ordenacin A ser ms eficiente que el B,
si requiere menor nmero de comparaciones.
As, en el caso de ordenar los elementos de un vector, el nmero de
comparaciones ser funcin del nmero de elementos (n) del vector (array). Por
consiguiente, se puede expresar el nmero de comparaciones en trminos de n
(por ejemplo, n+4, o bien n2 en lugar de nmeros enteros.
52
53
cout<<"\nVector Ordenado:\n";
MostrarVector(arreglo,n);
getch();
return(0);
}
// Muestra en pantalla el vector
void MostrarVector(int *arreglo, int n)
{
int i; // Contador
for (i=0;i<n;i++)
cout<<arreglo[i];
cout<<"\n";
}
// Ordenamiento por burbuja.
void burbuja(int *arreglo, int n)
{
int i,j; // Contadores
int temporal; // Variable para intercambio de contenidos
for (i=0;i<n-1;i++)
for (j=0;j<n-1;j++)
if (arreglo[j]>arreglo[j+1])
{
temporal=arreglo[j];
arreglo[j]=arreglo[j+1];
arreglo[j+1]=temporal;
}
}
Esta es la lista:
4-3-5-2-1
Existen 5 elementos. Es decir, n toma el valor 5. Se inicia comparando el primero
con el segundo elemento. 4 es mayor que 3, as que se intercambian.
Ahora se tiene:
3-4-5-2-1
Ahora se compara el segundo con el tercero: 4 es menor que 5, as que no se
hace nada. Se contina con el tercero y el cuarto: 5 es mayor que 2.
55
Se intercambia y se obtiene:
3-4-2-5-1
Se compara el cuarto y el quinto: 5 es mayor que 1. Se intercambia
nuevamente:
3-4-2-1-5
Repitiendo este proceso se obtienen los siguientes resultados:
3-2-1-4-5
2-1-3-4-5
1-2-3-4-5
Nuevamente se sugiere la realizacin de nuevas pruebas de escritorio para
entender mejor el comportamiento de este programa.
Tambin existen formas de mejorar la efectividad de este algoritmo, se le sugiere
tratar de implementar soluciones que mejoren los procesos en este algoritmo
Mtodo de Insercin
En este tipo de algoritmo los elementos que van a ser ordenados son
considerados uno a la vez. Cada elemento es INSERTADO en la posicin
apropiada con respecto al resto de los elementos ya ordenados.
As por ejemplo, si se tiene el vector
53
15
27
31
29
11
59
53
27
31
29
11
59
53
27
31
29
11
59
7
56
Como resultado:
15
27
53
31
29
11
59
Mtodo Shell
Toma este nombre de su inventor Donald Shell, es como utilizar el ordenamiento
burbuja pero comparando e intercambiando los elementos. La idea es seleccionar
fragmentos de un arreglo para ser ordenados y ordenarlos por el mtodo directo.
Luego se toman nuevos fragmentos hasta quedar ordenado por completo
59
El algoritmo ser:
salto = n div 2
mientras salto <> 0 haga
repita
cambios = 0
para i N1 hasta n salto haga
si X[i] > X[i+salto] haga
temporal = X[i]
X[i] = X[i+salto]
X[i+salto] = temporal
cambios = 1
fin si
fin para
hasta que cambios = 0 salto = saldo div 2
fin mientras
10
10
10
10
60
La variable cambio toma el valor de 1, el proceso contina hasta que i llega a nsalto, para el primer caso hasta 4, luego se divide nuevamente en 2 y luego en
uno.
Ahora analice el cdigo
#include <conio.h>
#include <iostream.h>
// Prototipos de las funciones.
void MostrarVector(int *arreglo, int n);
int shell(int *arreglo, int n);
int main()
{
int n; // El numero de elementos del vector
int i; // Contador
int arreglo[100]; // Arreglo de enteros
system(cls);
cout<<"Digite el numero de elementos < 100:";
cin>>n;
for (i=0;i<n;i++)
{
cout<<"digite valor para ["<<i+1<<"] ";
cin>>arreglo[i];
}
cout<<"\nVector Leido:\n";
MostrarVector(arreglo,n);
cout<<"\nOrdenamiento por shell:\n";
cout<<"\n Numero iterciones" <<shell(arreglo, n);
cout<<"\nVector Ordenado:\n";
MostrarVector(arreglo,n);
getch();
return(0);
}
// Muestra en pantalla el vector
void MostrarVector(int *arreglo, int n)
{
int i; // Contador
for (i=0;i<n;i++)
cout<< arreglo[i]<<" ";
cout<<"\n";
61
}
// Ordenamiento por shell.
int shell(int *arreglo, int n)
{
int ciclos=0; // Contador de ciclos i
nt i; // Contador
int salto; // Variable para el tamao del salto
int temporal; // Variable para intercambio de contenidos
int cambio; // Variable lgica para detener una iteracin
salto=n/2;
while (salto!=0)
{
do
{
cambio=0;
for(i=0;i<n-salto;i++)
{
ciclos++;
if(arreglo[i]>arreglo[i+salto])
{
temporal=arreglo[i];
arreglo[i]=arreglo[i+salto];
arreglo[i+salto]=temporal;
cambio=1;
}
}
} while (cambio!=0);
salto=salto/2;
}
return ciclos;
}
Mtodo Quicksort
Algoritmo desarrollado por Charles Hoare propuesto en 1962. Para cada paso,
se escoge un elemento "a" de alguna posicin especfica dentro del arreglo.
Ese elemento "a" es el que se proceder a colocar en el lugar que le corresponda.
Por conveniencia se seleccionar a "a" como el primer elemento del arreglo. El
elemento "a" se procede a comparar con el resto de los elementos del arreglo.
Una forma puede ser: comparar "a" con el ltimo elemento del arreglo. En la
comparacin, si el elemento "a" toma la ltima posicin y el ltimo elemento toma
62
90
52
87
100
-10
68
13
21
45
Las variables izq (izquierda) y der (derecha), una variable para controlar el punto
pvot (pivote), que se puede mirar su comportamiento en los extremos resaltados
Izq
Der
10
11
12
PosPiv
Pivote
11
43
90
50
87
100
10
68
13
21
45
50
43
Der
10
11
12
PosPiv
Pivote
11
43
90
50
87
100
10
68
13
21
45
50
43
63
Der
10
11
12
PosPiv
Pivote
11
43
90
50
87
100
10
68
13
21
45
50
43
Der
10
11
12
PosPiv
Pivote
10
43
90
50
87
100
10
68
13
21
45
50
43
21
90
50
87
100
10
68
13
43
45
50
10
Izq
Der
10
11
12
PosPiv
Pivote
10
21
90
50
87
100
10
68
13
43
45
50
10
43
Der
10
11
12
PosPiv
Pivote
10
21
90
50
87
100
10
68
13
43
45
50
10
43
Izq
Der
10
11
12
PosPiv
Pivote
10
21
90
50
87
100
10
68
13
43
45
50
10
43
2
21
43
50
87
100
10
68
13
90
45
50
Der
10
11
12
PosPiv
Pivote
90
21
43
50
87
100
10
68
13
90
45
50
43
Izq
Der
10
11
12
PosPiv
Pivote
21
43
50
87
100
10
68
13
90
45
50
43
9
21
50
87
100
10
68
13
43
90
45
50
Izq
Der
10
11
12
PosPiv
Pivote
21
50
87
100
10
68
13
43
90
45
50
43
Izq
Der
10
11
12
PosPiv
Pivote
21
50
87
100
10
68
13
43
90
45
50
43
21
43
87
100
10
68
13
50
90
45
50
Izq
De
r
10
11
3
12
PosPi
v
Pivote
65
21
43
87
10
0
10
Izq
De
r
21
43
87
100
21
13
87
100
68
13
50
90
45
50
43
1
0
11
1
2
PosPi
Pivote
-10
68
1
3
5
0
9
0
45
5
0
43
-10
68
4
3
5
0
9
0
45
5
0
Izq
Der
10
11
12
PosPiv
Pivote
21
13
87
100
10
68
43
50
90
45
50
43
Izq
Der
10
11
12
PosPiv
Pivote
21
13
87
100
10
68
43
50
90
45
50
43
21
13
43
100
10
68
87
50
90
45
50
Izq
Der
10
11
12
PosPiv
Pivote
21
13
43
100
10
68
87
50
90
45
50
43
Izq
Der
10
11
12
PosPiv
Pivote
21
13
43
100
10
68
87
50
90
45
50
43
6
21
13
10
100
43
68
87
50
90
45
50
Izq
Der
10
11
12
PosPiv
Pivote
21
13
100
43
68
87
50
90
45
50
43
66
Izq
Der
10
11
12
PosPiv
Pivote
21
13
10
100
43
68
87
50
90
45
50
43
21
13
10
43
100
68
87
50
90
45
50
Der
10
11
12
PosPiv
Pivote
21
13
10
43
100
68
87
50
90
45
50
43
Se observa que el valor del pivote, 43, est en el sitio que le corresponde en
ordenamiento ascendente, y que a su izquierda se forma una sublista,
desordenada, desde la posicin 0 a la 4, con todos sus elementos menores; y una
sublista a la derecha, desde la posicin 6 hasta la 12, en desorden y con todos
mayores que el pivote. A partir de este punto se procede con el mismo
procedimiento seguido para la lista completa, en cada una de las sublistas y por
separado.
Con lo anterior se puede describir el siguiente algoritmo para que usted mediante
una prueba de escritorio verifique que hace
#include <conio.h>
#include <iostream.h>
// Prototipos de las funciones.
void MostrarVector(int *arreglo, int n);
void QuickSort(int *arreglo, int l, int r);
void intercambiar(int *arreglo, int pos1, int pos2);
int main()
{
int n; // numero de elementos del vector
int i; // Contador
int arreglo[100]; // Arreglo de enteros
67
system(cls);
cout<<"Digite el numero de elementos:";
cin>>n;
for (i=0;i<n;i++)
{
cout<<"Digite valor para la posicion :[" <<i+1<<"] ";
cin>>arreglo[i];
}
cout<<"\nVector Leido:\n";
MostrarVector(arreglo,n);
cout<<"\nOrdenamiento por QuickSort:\n";
QuickSort(arreglo,0,n-1);
cout<<"\nVector Ordenado:\n";
MostrarVector(arreglo,n);
getch();
return(0);
}
// Muestra en pantalla el vector
void MostrarVector(int *arreglo, int n)
{
int i; // Contador
for (i=0;i<n;i++)
cout<<arreglo[i]<< " ";
cout<<"\n";
}
// Ordenamiento QuickSort.
void QuickSort(int *arreglo, int izquierda, int derecha)
{
int mayor; // Posicion de un elemento mayor al pivote
int menor; // Posicion de un elemento menor al pivote
int pivote; // Elemento pivote
if (izquierda < derecha)
{
pivote = arreglo[derecha];
mayor = izquierda-1;
menor = derecha;
while (mayor <= menor)
{
while (mayor <= derecha)
{
mayor++;
if (arreglo[mayor] >= pivote) break;
68
}
while (menor >= izquierda)
{
menor--;
if (arreglo[menor] <= pivote) break;
}
if (mayor < menor) intercambiar(arreglo,mayor,menor);
}
intercambiar(arreglo,derecha,mayor);
QuickSort(arreglo,izquierda,mayor-1);
QuickSort(arreglo,mayor+1,derecha);
}
}
void intercambiar(int arreglo[], int pos1, int pos2)
{
int temporal; // Variable para intercambio de contenidos
temporal = arreglo[pos1];
arreglo[pos1] = arreglo[pos2];
arreglo[pos2] = temporal;
}
Bueno slo queda que usted que es una persona muy pila, indague ms acerca
de estos mtodos, tanto de bsqueda como de ordenamiento , o realice nuevas
mejoras a estos programas aqu desarrollados.
69
cin>>arreglo[i];
}
cout<<"Digite el numero a buscar:";
cin>>valor; cout<<"\nVector Leido:\n";
mostrar(arreglo,n);
cout<<"\nBusqueda lineal:\n";
if ((x=buscar(valor, arreglo, n)) != -1)
cout<<"\nEncontrado en la posicion \n"<<x+1;
else
cout<<"\nNo existe en el arreglo\n";
getch();
}
// funcin que permite mostrar en la pantalla el vector
void mostrar(int *arreglo, int n)
{
int i; // Contador
for (i=0;i<n;i++)
cout<< arreglo[i];
cout<<"\n";
}
// funcin Bsqueda lineal.
int buscar(int valor, int *arreglo, int n)
{
int i; // Contador
for (i=n-1; i>=0; i--)
if (valor == arreglo[i]) break;
// condicional para encontrar el elemento
return (i);
}
Se recomienda realizar prueba de escritorio para determinar el comportamiento
del anterior cdigo.
Binaria
Este algoritmo permite buscar de una manera ms eficiente un dato dentro de un
arreglo, para hacer esto se determina el elemento central del arreglo y se
compara con el valor que se est buscando, si coincide termina la bsqueda y en
caso de no ser as se determina si el dato es mayor o menor que el elemento
central, de esta forma se elimina una mitad del arreglo junto con el elemento
central para repetir el proceso hasta encontrarlo o tener solo un elemento en el
71
arreglo. Para poder aplicar este algoritmo se requiere que el arreglo este
ordenado. Su implementacin es la siguiente:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define TAM 15
main()
{
int a[TAM], busca, temp, bajo, alto, central, i;
printf("Llenando el arreglo con nmeros aleatorios\n");
for (int i=0; i< TAM; i++)
a[i]=rand()%100; //llena el vector con 15 nmeros aleatorios entre 0 y 100
//Implementacin de Ordenamiento por burbuja de menor a mayor
printf ("Ordenando arreglo...\n");
for (int j=1; j <= TAM; j++)
for (i=0; i< TAM-1; i++)
if (a[i] > a[i+1])
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
//Implementacin de bsqueda binaria
printf ("\nIntroduce un numero a buscar: ");
scanf ("%d", &busca);
bajo = 0;
alto = TAM-1;
central = (bajo+alto)/2;
while (bajo < alto && busca != a[central])
{
if(busca > a[central])
bajo = central+1;
else
alto = central-1;
central=(bajo+alto)/2;
}
if (busca == a[central])
printf("\n%d encontrado en posicion %d", busca, central);
72
else
printf("\n%d no existe", busca);
printf ("\n\nEl arreglo ordenado era\n\n");
for (i=0; i< TAM; i++)
printf ("%d ", a[i]);
getch();
}
Mtodo de Hash
La idea principal de este mtodo consiste en aplicar una funcin que traduce el
valor del elemento buscado en un rango de direcciones relativas. Una desventaja
importante de este mtodo es que puede ocasionar colisiones.
funcion hash (valor_buscado)
inicio
hash <- valor_buscado mod numero_primo
fin
inicio <- hash (valor)
il <- inicio encontrado <- falso
repite
si arreglo[il] = valor entonces encontrado <- verdadero
en caso contrario il <- (il +1) mod N
hasta encontrado o il = inicio
fin
73
Introduccin
Los apuntadores son una parte fundamental de C. Si usted no puede usar los
apuntadores apropiadamente entonces est perdiendo la potencia y la flexibilidad
que C ofrece bsicamente.
El lenguaje C, usa los apuntadores en forma extensiva. Por qu?
74
*px = 10;
Se debe tener claro que de acuerdo a las asignaciones que se realicen, se van a
presentar diferencias en el contenido de las variables y los apuntadores.
Ej. int x, *px;
px = &x; \\ asigna a px la direccin de la variable x
*px = 10; \\ asigna el valor 10 a la variable x, es lo mismo que decir x = 10.
\\ Prcticamente la expresin *px es la variable x.
Ejercicio: analizar el siguiente programa
main ( )
{ int x, *px;
px = &x;
*px = 0;
*px = *px + 5;
x = *px 1;
printf ( %d %d , x, *px );
getch ( );
}
main ( )
{ int x, *px;
px = &x;
x = 0;
x = x + 5;
x = x 1;
printf ( %d %d , x, *px );
getch ( );
}
200
y 2
1000
ap 100
76
100
x 1
200
y 1
1000
ap 100
200
x 100 y 1
1000
ap 100
200
y 1
1000
ap 100
*ap = 100;
}
Con los apuntadores se puede realizar tambin aritmtica entera, por ejemplo:
main()
{
float *flp, *flq;
*flp = *flp + 10;
++*flp;
(*flp)++;
flq = flp;
}
78
expresar como:
a[i] que es equivalente a *(ap + i)
Sin embargo los apuntadores y los arreglos son diferentes:
Un apuntador es una variable. Se puede hacer ap = a y ap++.
Un arreglo NO ES una variable.
Hacer a = ap y a++ ES ILEGAL.
NOTA: Esta parte es muy importante, asegrese de haberla entendido.
Con lo comentado se puede entender como los arreglos son pasados a
las funciones. Cuando un arreglo es pasado a una funcin lo que en realidad se le
est pasando es la localidad de su elemento inicial en memoria.
Por lo tanto:
strlen(s) es equivalente a strlen(&s[0])
Esta es la razn por la cual se declara la funcin como:
int strlen(char s[]); y una declaracin equivalente es int strlen(char *s); ya que char
s[] es igual que char *s.
La funcin strlen() es una funcin de la biblioteca estndar que regresa la longitud
de una cadena. Se muestra enseguida la versin de esta funcin que podra
escribirse:
int strlen(char *s)
{
char *p = s;
while ( *p != '\0' )
p++;
return p - s;
}
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.
void strcpy(char *s, char *t)
{
while ( (*s++ = *t++) != '\0' );
}
80
81
82
a. Algoritmo de Shell
b. Algoritmo de seleccin
c. Algoritmo de seleccin directa
G. Este ordenamiento lleva el nombre de su inventor
a. Ordenamiento Quicksort
b. Ordenamiento de Burbuja
c. Ordenamiento de Shell
2) Deduzca, indague, consulte, cules son las ventajas y/o desventajas de los
mtodos de bsqueda y ordenamiento aqu expuestos
83
UNIDAD 3
Nombre de la Unidad
Introduccin
ESTRUCTURAS Y ARCHIVOS
Los archivos como coleccin de datos sirven como entrada y salida
de datos al computador y son manejados con programas.
Los archivos pueden ser contrastados con Arrays y registros. En un
registro se deben especificar los campos, l nmero de elementos de
un arrays (o arreglo), el nmero de caracteres en una cadena, entre
otros, por esto se denotan como: Estructuras Estticas.
En los archivos no se requiere de un tamao predeterminado, esto
significa que se pueden tener archivos de datos ms grandes o
pequeos, segn se necesiten.
Cada archivo es referenciado por su identificador (su nombre).
Justificacin
Hasta el momento slo se ha trabajado con vectores que almacenan
datos del mismo tipo y que tienen un tamao definido, que no se
puede cambiar durante la ejecucin del programa. Afortunadamente
los lenguajes de programacin C y C++, dejan al usuario construir o
combinar diversidad de datos para conformar estructuras complejas
de informacin, lo que ampla las posibilidades de trabajo con datos.
Adems, hasta el momento los datos que se procesaban en un
programa se perdan, cuando ste dejaba de ejecutarse, puesto que
se estaba trabajando con memoria principal, ahora la solucin llega
con la construccin de estructuras que se puedan almacenar y
acceder en forma de archivos, que se almacenan en memoria
secundaria.
84
Intencionalidades
Formativas
Objetivos de la unidad
Desarrollar programas que manipulen cantidad de datos de
diferentes tipos y que puedan almacenarse y recuperase en
cualquier momento
Competencias de la unidad
Dominar el manejo de estructuras con diversidad de datos
Comprender como se almacenan y recuperan datos en
medios fiscos
Metas de aprendizaje
Realizar programas que presten un verdadero
cuando se trate de guardar informacin
Denominacin de
captulos
servicio,
ESTRUCTURAS
ARCHIVOS
ACCESO A LOS ARCHIVOS
85
CAPITULO 7: ESTRUCTURAS
Introduccin
Las estructuras estn compuestas, como ya se dijo, por una serie de
componentes individuales llamados miembros, para hacerlo ms grafico se puede
decir que al ingresar datos de una persona como su nombre, apellido, direccin,
salario, edad cada tipo de informacin corresponde a un miembro de la
estructura. Una estructura no tiene restricciones para contener un nmero
determinado de miembros, e inclusive se pueden realizar estructuras que
contengan otras estructuras.
DIRECCION
CIUDAD
TELEFONO
PREFIJO
87
Ejemplo:
typedef struct
{
char nombre[20];
char apellido[20];
char ciudad[15];
} Contacto;
typedef struct
{
Contacto lista[100];
char direccion[30];
char telefono[8];
} Directorio;
Directorio cliente; //declaracin de la estructura cliente, de tipo directorio
...
En este caso para acceder a los miembros de la variable cliente, de tipo Directorio,
se deben utilizar ndices y el operador de acceso a miembro.
EJEMPLO: as se escribe la ciudad del tercer contacto que se encuentra en
Directorio, en la variable cliente:
printf(%s, cliente.lista[2].ciudad);
En general, no es una prctica corriente definir estructuras dentro de estructuras,
ya que tienen un mbito local, y para acceder a ellas se necesita hacer referencia
a la estructura ms externa.
};
int z;
};
Para acceder a los campos x o y se usa la misma forma que para el campo z:
stAnonima
Anonima;
Anonima.x = 0;
Anonima.y = 0;
Anonima.z = 0;
Pero, cul es la utilidad de esto?
Pues, la verdad, no mucha, al menos cuando se usa con estructuras.
El mtodo usado para declarar la estructura dentro de la estructura es la forma
annima, como ver no tiene identificador de tipo de estructura ni de campo. El
nico lugar donde es legal el uso de estructuras annimas es en el interior de
estructuras y uniones.
Se puede usar el operador sizeof para calcular el espacio de memoria necesario
para almacenar una estructura.
Sera lgico suponer que sumando el tamao de cada elemento de una
estructura, se podra calcular el tamao de la estructura completa, pero no
siempre es as. Por ejemplo:
#include <iostream.h>
#include <conio.h>
struct A { int x;
char a;
int y;
char b;
};
struct B { int x;
int y;
char a;
char b;
};
main()
{
cout << "Tamao de int: "<< sizeof(int) << endl;
cout << "Tamao de char: "<< sizeof(char) << endl;
90
0 1
x
vaco
8
y
10 11 12 13 14 15
b
vaco
91
0 1
x
10 11
vaco
a 12, dependiendo del mes y del ao, el da debe estar entre 1 y 28, 29,
30 31. El ao siempre ser vlido, ya que debe estar en el rango de 0
a 127. Para validar los das se usar un array int DiasMes[] = {31, 28, 31,
30, 31, 30, 31, 31, 30, 31, 30, 31};. Para el caso de que el mes sea
febrero, se crear otra funcin para calcular si un ao es o no
bisiesto: bool Bisiesto(int); Los aos bisiestos son los divisibles entre 4, al
menos en el rango de 1960 a 2087 se cumple.
Nota: los aos bisiestos son cada cuatro aos, pero no cada 100, aunque
s cada 400. Por ejemplo, el ao 2000, es mltiplo de 4, por lo tanto
debera haber sido bisiesto, pero tambin es mltiplo de 100, por lo tanto
no debera serlo; aunque, como tambin es mltiplo de 400, finalmente lo
fue.
5. Siguiendo con el tema de las fechas. Ahora escribir dos funciones ms: la
primera debe responder a este prototipo: int CompararFechas(fecha,
fecha). debe comparar las dos fechas suministradas y devolver 1 si la
primera es mayor, -1 si la segunda es mayor y 0 si son iguales.
La otra funcin responder a este prototipo: int Diferencia(fecha, fecha), y
debe devolver la diferencia en das entre las dos fechas suministradas.
93
CAPITULO 8: ARCHIVOS
Introduccin
Cuando se habla de un conjunto de datos estructurados en una coleccin de
entidades bsicas, conocidas como registros, se est haciendo referencia a los
archivos. Generalmente estos contienen una cantidad importante de datos, que
se almacena en dispositivos de memoria secundaria.
El manejo de archivos en C, se hace mediante el concepto de flujo (streams) o
canal, tambin conocido como secuencia. Estos flujos pueden estar abiertos o
cerrados y conducen los datos entre el programa y los dispositivos externos.
archivo (direccin del buffer que utiliza, modo de apertura del archivo, ltimo
carcter ledo del buffer, entre otros).
En esta instancia es importante saber que existe el tipo FILE y que se debe definir
un puntero a FILE, por cada archivo que se vaya a procesar.
ARCHIVO MAESTRO.
ARCHIVO DE TRANSACCIONES.
ARCHIVO DE REPORTE.
ARCHIVO DE TRABAJO.
ARCHIVO DE PROGRAMA.
ARCHIVO DE TEXTO.
Leer
getc()
String
fgets()
Formateado
fscanf()
Registros
y
arreglos
fread()
96
Escribir
putc()
fputs()
fprintf()
fwrite()
Constantes: estn formados por registros que contienen campos fijos y campos
de baja frecuencia de variacin en el tiempo.
De Situacin: son los que en cada momento contienen informacin
actualizada.
Histricos: contienen informacin acumulada a lo largo del tiempo de archivos
que han sufrido procesos de actualizacin, o bien acumulan datos de variacin
peridica en el tiempo.
Archivos de Movimiento o Transacciones: Son aquellos que se utilizan
conjuntamente con los maestros (constantes), y contienen algn campo comn
en sus registros con aquellos, para el procesamiento de las
modificaciones
experimentados por los mismos.
Archivos de Maniobra o Transitorios: son los archivos auxiliares creados
durante la ejecucin del programa y borrados habitualmente al terminar el mismo.
98
Introduccin
Con los archivos se pueden realizar varias operaciones, algunas de ellas son:
creacin, apertura, cierre, lectura, escritura, etc. En este captulo se describir
como se realiza cada una de ellas.
Para acceder a los datos contenidos en los archivos, se pueden utilizar diferentes
mtodos. Esto depende de la forma como estn organizados los registros. Es as
como se pueden realizar bsquedas secuenciales, de forma directa, por ndice,
entre otros.
La eleccin del mtodo est directamente relacionada con la estructura de los
registros del archivo y del soporte utilizado.
100
eficiencia en los tiempos de acceso. Ahora bien, debe haber un archivo donde
guardar los ndices para posteriores explotaciones del archivo de datos.
Entonces al disear un archivo indexado hay que pensar que se manejarn
dos tipos de archivos, el de datos y el de ndices, con sus respectivos
registros. Un claro ejemplo de archivo secuencial indexado es la gua de
telfonos, con dos niveles de ndices, el nivel superior para las letras inciales
y el nivel menor para las cabeceras de pgina. Por consiguiente, cada archivo
secuencial indexado consta de un archivo de ndices y un archivo de datos.
La indexacin permite incluir ndices en el almacenamiento de los archivos; de
esta forma ser ms fcil buscar algn registro sin necesidad de ver todo el
archivo. Un ndice en un archivo consiste en un listado de los valores del
campo clave que ocurren en el archivo, junto con la posicin de registro
correspondiente en el almacenamiento masivo.
Fundamento de los ndices
a. La colocacin de un listado al inicio del archivo: para la identificacin del
contenido.
b. La presentacin de un segundo ndice: para reflejar la informacin de cada
punto principal del ndice anterior.
c. La actualizacin de los ndices: Cuando se insertan y eliminan archivos, es
preciso actualizar los ndices para evitar contratiempos actualizando un
archivo.
d. La organizacin de un ndice: Nos evita examinar archivo por archivo para
recuperar algn registro buscado; por lo tanto ahorraramos tiempo si
tenemos una adecuado organizacin de los ndices.
archivo
en
el
que
se
trabajar,
"C:\Windows\AddrBook.ini"
102
estado : boolean;
{true activo,false baja lgica}
end;
Var
archivo:file of datos;
begin Assign(archivo,'empleado.dat');
C:\Edit
c:\SOS\sistemas\report.txt
o Ruta relativa: este tipo de ruta de acceso realiza la bsqueda del archivo
en el directorio de trabajo actual, si el archivo no se localiza aqu, el S.O. lo
buscar en los directorios especificados en el PATH de un archivo con
extensin .BAT
C:\Edit report.txt
getchar();getchar();
}
Al momento de ejecutarlo
FIGURA 7. Recomendacin
Las funciones para manipular los Archivos se encuentran en el archivo de
cabecera <stdio.h> y vale la pena mencionarlas:
Funcin
fopen()
fclose()
putc()
getc()
fputs()
fgets()
fseek()
fprintf()
fscanf()
eof()
Descripcin
Abre un flujo
Cierra un flujo
Escribe un carcter en un flujo
Lee un carcter desde un flujo
Escribe una cadena en un flujo
Obtiene una cadena de un flujo
Salta al byte especificado en un flujo
Imprime datos con formato en un flujo
Lee datos con formato en un flujo
Devuelve verdadero o falso si se halla el fin del archivo.
107
108
Observe:
Con respecto al primer ejercicio,
1. La funcin fopen(), cambia de w a at+ esto permite abrir el archivo para
agregar datos.
2. Lo nuevo es la utilizacin de fwrite(&persona,sizeof(alumno),1,archdisco);
como se observa, ocupa 4 parmetros que son:
a) fwrite() primero conoce qu datos va a almacenar en disco, aqu se le
est indicando que es el dato que se tiene en la direccin de memoria
donde est el registro "alumno".
b) fwrite() conoce cuntos bytes de informacin debe grabar, para esto se
tienen dos opciones: o se le da el valor exacto por ejemplo 64 bytes o 39
bytes, o ms fcil aun se usa sizeof() que regresa el tamao del dato.
c) fwrite() necesita conocer tambin cuntas estructuras o registros a la
vez debe grabar, por lo general es un solo registro, pero es posible
grabar ms de un registro a la vez, y esto es de mucho provecho, porque
si en un sistema se requiere grabar 1000 registros y el usar fwrite() de
uno en uno, quiere decir que habra mil accesos a disco.
d) fwrite() conoce exactamente en que cluster, sector y byte del disco
duro debe grabar el registro. Para saber donde hay lugar para escribir el
archivo X, se usa la variable archdisco que ya tiene esa direccin fsica
del archivo en disco.
109
Ya sabe cmo se crean archivos, como se ingresan datos, lo nico que queda es
como recuperar la informacin, eso se observar en el siguiente ejemplo:
#include <stdio.h>
#include <conio.h>
#include <string.h>
struct {
int matricula;
char nombre[30];
int
edad;}
alumno;
main()
{
system(cls);
// leyendo disco
FILE *archdisco;
archdisco = fopen("c:\\ac\\alumnos.dat","at+");
// aqui siempre debe empezar el ciclo de lectura
// y fread() regresa siempre cuantas estructuras ley
while(fread(&alumno,sizeof(alumno),1,archdisco)==1)
{
// desplegando estructuras
printf("MATRICULA =%d ",alumno.matricula);
printf(" NOMBRE =%s ",alumno.nombre);
printf(" MESES =%d ",alumno.edad);
printf("\n");
}; // aqui termina while
// no olvidar cerrar archivo y siempre fuera de while
fclose(archdisco);
getchar();getchar();
}
Pocas observaciones
1.
2.
111
112
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <conio.h>
#include <string.h>
struct {
int matricula;
char nombre[30];
int edad;} alumno;
main()
{
systemr(cls);
FILE *arch1;
FILE *arch2;
arch1 = fopen("c:\\ac\\alumnos.dat","r+");
arch2 = fopen("c:\\ac\\temporal.dat","at+");
// aqui siempre debe empezar el ciclo de lectura
// y fread() regresa, siempre, cuantas estructuras ley
while(fread(&alumno,sizeof(alumno),1,arch1)==1)
{
// OPERACIONES
alumno.edad=alumno.edad +50;
//grabando a temporal
fwrite(&alumno,sizeof(alumno),1,arch2);
}; // aqui termina while
//cerrando archivos
fclose(arch1);
fclose(arch2);
// removiendo y renombrando archivos
// recordar que directorios y archivos de datos no ms de 8 letras+ 3 de la
extensin
remove("C:\\AC\\ALUMNOS.DAT ");
rename("C:\\AC\\TEMPORAL.DAT","C:\\AC\\ALUMNOS.DAT ");
//avisando
puts("EDADES MAS 50");
getchar();
}
113
115
#include <string.h>
struct {
int clave;
char nombre[30];
int edad;} mascota;
void main()
{
system(cls);
// leyendo disco
FILE *archdisco;
archdisco = fopen("c:\\ac\\archivo1.dat","rb+");
// aqui siempre debe empezar el ciclo de lectura
// y fread() regresa, siempre, cuantas estructuras ley
while(fread(&mascota,sizeof(mascota),1,archdisco)==1
{
// desplegando estructuras
printf("%d ",mascota.clave);
printf("%s ",mascota.nombre);
printf("%d ",mascota.edad);
printf("\n");
}; // aqu termina while
// no olvidar cerrar archivo y siempre fuera de while
fclose(archdisco);
getchar();;
}
En este caso no hay nada que comentar, puesto que se despliegan todos los
registros
Ahora se tiene el mismo ejercicio pero consultando un registro en especial, es
realmente aqu donde va a encontrar verdaderas diferencias.
#include <stdio.h>
#include <conio.h>
#include <string.h>
struct {
int clave;
char nombre[30];
117
cast a un dato.
Como va a estar difcil que se apunte a un byte determinado, es mejor se
deje que sea el propio servidor quien calcule el byte donde empieza un
registro determinado con clave * sizeof o tamao de registro.
d. El tercer parmetro es a partir de donde se quiere posicionar el apuntador
interno del archivo, los valores pueden ser:
0 ---> SEEK_SET principio del archivo.
1 ---> SEEK_CUR posicion actual.
2 ---> SEEK_END fin del archivo.
Recordar que es muy importante que las claves grabadas en un archivo directo
tengan la secuencia 0,1,2,3,4,5.....n
Revise el siguiente ejercicio con operaciones de archivos, donde se puede
evidenciar alguna diferencia sustancial con los archivos secuenciales
#include <stdio.h>
#include <io.h>
#include <conio.h>
#include <string.h>
struct {
int clave;
char nombre[30];
int edad;} mascota;
void main()
{
system(cls);
FILE *arch1;
long r=0;
arch1 = fopen("c:\\ac\\archivo1.dat","rb+");
while (fread(&mascota,sizeof(mascota),1,arch1)==1)
{
// sumando 100 a edad
mascota.edad = mascota.edad + 100 ;
// como ya se ley se regresa el apuntador al principio del registro
fseek(arch1,r*sizeof(mascota),0 );
119
120
121
BIBLIOGRAFA
http://www.elmonton.net/PMc.php?contenido=PMc_3001_5077788_1
http://sistemas.uniandes.edu.co/~isis1301/dokuwiki/lib/exe/fetch.php?media=mater
ial_monitorias:manual_de_c.pdf
http://es.scribd.com/doc/29225934/Manejo-de-Arhivos-en-Lenguaje-C
http://es.scribd.com/doc/57113276/6/Caracteristicas-de-los-archivos
123
Declaracin
Limite Inferior
Limite Superior
Entero
Int A;
-32768
32767
Entero Corto
Short Int A;
-128
127
Entero Largo
Long Int A;
2E -6
2E 6
Unsigned Int A;
65535
Signed Int A;
-65000
65000
Real
Float A;
-3.4E37
3.4E 38
Real Doble
Double A;
-1.7E -304
1.7E 308
Real Largo
Long DoubleA;
3.4E -4932
1.1E 4932
Caracter
Char A;
-128
127
124
Categora
Operador
Qu es (o qu hace)
Mayor
() []
->
::
Resolucin de mbito.
Selector de componentes
Negacin lgica
Ms
Menos
++
Preincremento o postincremento
--
Predecremento o postdecremento
&
Direccin
Valor en la direccin de
sizeof
new
delete
Multiplicacin
Divisin
%
.
->
Separador campo
Ms binario
Menos binario
Unarios
Multipli
Acceso
Aditivos
125
Desplaza-
Relacional
Igualdad
<<
Izquierda
>>
Derecha
<
Menor que
<
>
Mayor que
>
==
Igual a
!=
No igual a
&
10
o exclusivo
11
OR para bits
12
&&
AND lgico
13
||
OR lgico
14
Condicional
?:
a?x:
significa:
15
Asignacin
Producto
126
16
Coma
Divisin
Suma
Diferencia
&
OR sobre bits
<<
Desplazamiento a la izquierda
>>
Desplazamiento a la derecha
Separador de expresiones
TABLA 4. Operadores
Observacin: muchos de los operadores relacionados en el cuadro anterior, no se
utilizan a lo largo de este curso.
127
A
Funcin
Librera
Fichero de cabecera C
Arc
Graphics
graphics.h
B
Funcin
Librera
Fichero de cabecera C
Bar
Graphics
graphics.h
bar3d
Graphics
graphics.h
C
Funcin
Librera
Fichero de cabecera C
cgets
Conio
conio.h
Circle
Graphics
graphics.h
cleardevice
Graphics
graphics.h
Clearviewport
Graphics
graphics.h
Closegraph
Graphics
graphics.h
Clreol
Conio
conio.h
Clrscr
Conio
conio.h
Cprintf
Conio
conio.h
Cputs
Conio
conio.h
Cscanf
Conio
conio.h
D
128
Funcin
Librera
Fichero de cabecera C
Delline
Conio
conio.h
Detectgraph
Graphics
graphics.h
Drawpoly
Graphics
graphics.h
E
Funcin
Librera
Fichero de cabecera C
Ellipse
Graphics
graphics.h
F
Funcin
Librera
Fichero de cabecera C
Fillellipse
Graphics
graphics.h
Fillpoly
Graphics
graphics.h
Floodfill
Graphics
graphics.h
G
Funcin
Librera
Fichero de cabecera C
Getarccoords
Graphics
graphics.h
Getaspectratio
Graphics
graphics.h
Getbkcolor
Graphics
graphics.h
Getch
Conio
conio.h
Getche
Conio
conio.h
Getcolor
Graphics
graphics.h
Getdefaultpalette
Graphics
graphics.h
129
Getdrivername
Graphics
graphics.h
Getfillpattern
Graphics
graphics.h
Getfillsettings
Graphics
graphics.h
Getgraphmode
Graphics
graphics.h
Getimage
Graphics
graphics.h
Getlinesettings
Graphics
graphics.h
Getmaxcolor
Graphics
graphics.h
Getmaxmode
Graphics
graphics.h
Getmaxx
Graphics
graphics.h
Getmaxy
Graphics
graphics.h
Getmodename
Graphics
graphics.h
Getmoderange
Graphics
graphics.h
Getpalette
Graphics
graphics.h
Getpalettesize
Graphics
graphics.h
Getpass
Conio
conio.h
Getpixel
Graphics
graphics.h
Gettext
Conio
conio.h
Gettextinfo
Conio
conio.h
Gettextsettings
Graphics
graphics.h
Getviewsettings
Graphics
graphics.h
Getx
Graphics
graphics.h
Gety
Graphics
graphics.h
Gotoxy
Conio
conio.h
Graphdefaults
Graphics
graphics.h
Grapherrormsg
Graphics
graphics.h
Graphfreemem
Graphics
graphics.h
130
Graphgetmem
Graphics
graphics.h
Graphresult
Graphics
graphics.h
H
Funcin
Librera
Fichero de cabecera C
Highvideo
Conio
conio.h
I
Funcin
Librera
Fichero de cabecera C
Imagesize
Graphics
graphics.h
Initgraph
Graphics
graphics.h
Inport
Conio
conio.h
Insline
Conio
conio.h
Installuserdriver
Graphics
graphics.h
Installuserfont
Graphics
graphics.h
K
Funcin
Librera
Fichero de cabecera C
Kbhit
Conio
conio.h
L
Funcin
Librera
Fichero de cabecera C
Line
Graphics
graphics.h
Linerel
Graphics
graphics.h
Lineto
Graphics
graphics.h
131
Lowvideo
Conio
conio.h
M
Funcin
Librera
Fichero de cabecera C
Moverel
Graphics
graphics.h
Movetext
Conio
conio.h
Moveto
Graphics
graphics.h
N
Funcin
Librera
Fichero de cabecera C
Normvideo
Conio
conio.h
O
Funcin
Librera
Fichero de cabecera C
Outport
Conio
conio.h
Outtext
Graphics
graphics.h
Outtextxy
Graphics
graphics.h
P
Funcin
Librera
Fichero de cabecera C
Pieslice
Graphics
graphics.h
Putch
Conio
conio.h
Putimage
Graphics
graphics.h
Putpixel
Graphics
graphics.h
132
Puttext
Conio
conio.h
R
Funcin
Librera
Fichero de cabecera C
Rectangle
Graphics
graphics.h
Registerbgidriver
Graphics
graphics.h
Registerbgifont
Graphics
graphics.h
Restorecrtmode
Graphics
graphics.h
S
Funcin
Librera
Fichero de cabecera C
Sector
Graphics
graphics.h
Setactivepage
Graphics
graphics.h
Setallpalette
Graphics
graphics.h
Setaspectratio
Graphics
graphics.h
Setbkcolor
Graphics
graphics.h
Setcursortype
Conio
conio.h
Setfillpattern
Graphics
graphics.h
Setfillstyle
Graphics
graphics.h
Setgraphbufsize
Graphics
graphics.h
Setgraphmode
Graphics
graphics.h
Setlinestyle
Graphics
graphics.h
Setpalette
Graphics
graphics.h
133
Setrgbpalette
Graphics
graphics.h
Settextjustify
Graphics
graphics.h
Settextstyle
Graphics
graphics.h
Setusercharsize
Graphics
graphics.h
Setviewport
Graphics
graphics.h
Setvisualpage
Graphics
graphics.h
Setwritemode
Graphics
graphics.h
T
Funcin
Librera
Fichero de cabecera C
Textattr
Conio
conio.h
Textbackground
Conio
conio.h
Textcolor
Conio
conio.h
Textheight
Graphics
graphics.h
Textwidth
Graphics
graphics.h
U
Funcin
Librera
Fichero de cabecera C
Ungetch
Conio
conio.h
W
Funcin
Librera
Fichero de cabecera C
Wherex
Conio
conio.h
Wherey
Conio
conio.h
Window
Conio
conio.h
134
137
139