Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II
Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina
Lcdo. Rubn Cova Lcdo. Luis Rigual
Lcda. Gladimar Serrano Lcda. Nakary Ortega. MSc
Ing. Leonardo Malav. MSc Lcdo. Franklin Mundaray
Lcda. Lisblein rismendi !S" Rodol#o Ort$%
Lcdo. &dinson Gon%'le% !ndice
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina "
('gina Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda ) Introduccin ) Arreglos * !nidimensionales + Cadenas ,, Bidimensionales ,- Arreglo de Cadenas ,. "ultidimensionales ,/ O#eraciones con Arreglos !nidimensionales ,/ Iniciali$acin ,/ %ectura ,0 &scritura ,0 Asignacin ,0 O#eraciones con Arreglos Bidimensionales ,* Iniciali$acin ,* %ectura -1 &scritura -1 Asignacin -1 Rutinas de Ordenamiento -, Intercambio -, 'eleccin -- Insercin -. Burbuja -/ Rutinas de Bsqueda -0 'ecuencial -0 Binaria -* Objetivo (.- )unciones y Recursividad 21 Introduccin 21 *e+inicin 2, !ndice
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina #
*eclaracin 2, ,i#os de )unciones 2- %lamadas a una )uncin 2. 'alidas de una )uncin 2/ -aso de #ar.metros a una )uncin 2) -or valor 2) -or re+erencia 20 /isibilidad de las )unciones 20 Recursividad 2* /entajas .1 Inconvenientes .1 Consideraciones 0enerales .1 'olucin Iterativa vs 'olucin Recursiva ., Objetivo 1.- -unteros o A#untadores .. Introduccin .. *e+inicin ./ 2aturale$a de los -unteros .) *eclaracin .0 Iniciali$acin .+ O#eraciones de *ireccin e Indireccin /1 Aritm3tica de -unteros /2 Relacin entre Arreglos y -unteros // -unteros y )unciones /0 -recauciones con el uso de -unteros /* Objetivo 4.- &structuras ), Introduccin ), Conce#tos B.sicos )- Acceso a los com#onentes de una estructura )2 Arreglos de &structuras )/ &structuras Anidadas )/ !ndice
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $
A#untadores a estructuras )) -aso de estructuras a las +unciones )0 Objetivo 5.- Arc6ivos )+ Introduccin )+ ,i#os de arc6ivos 0, Arc6ivos de ,e7to. O#eraciones que se reali$an sobre ellos 0) Arc6ivos Binarios. O#eraciones que se reali$an sobre ellos *1 &jem#los de -rogramas de Arc6ivos y mani#ulacin *2 %b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina /
!na estructura de datos es una coleccin de datos que #ueden ser caracteri$ados #or su organi$acin y las o#eraciones que de+inen en ella. %as estructuras de datos son muy im#ortantes en los sistemas de com#utadora. %os ti#os de datos m.s +recuentes utili$ados en los di+erentes lenguajes de #rogramacin son8
3atos sim4les &st.ndar &ntero, real, car.cter y lgico &structura de datos &st.ticos /ectores y matrices, registro y arc6ivos *in.micos %ineales8 %ista, #ilas y colas 2o lineales8 9rboles y gra+os
%as estructuras de datos est.ticas son aquellas en las que el tama:o ocu#ado en memoria se de+ine antes que el #rograma se ejecute y el mismo no #uede ser modi+icado durante la ejecucin.
%os ti#os de datos que vimos 6asta 6ora son datos sim#les cuya caracter;stica comn es que cada variable re#resenta a un elemento< en cambio los ti#os de datos estructurados tienen como #articularidad que con un nombre o identi+icador se #uede re#resentar mlti#les datos individuales y a su ve$ cada uno de estas #uede ser re+erenciado inde#endientemente.
Aqu; desarrollaremos los siguientes ;tems8
rreglos "nidimensionales Cadenas 5idimensionales rreglo de Cadenas %b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 0
Multidimensionales O4eraciones con rreglos "nidimensionales Iniciali%aci6n Lectura &scritura signaci6n O4eraciones con rreglos 5idimensionales Iniciali%aci6n Lectura &scritura signaci6n Rutinas de Ordenamiento Intercambio Selecci6n Inserci6n 5urbu7a Rutinas de 58s9ueda Secuencial 5inaria
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 1
rreglos
'e de+ine como una coleccin +inita, 6omog3nea y ordenada de elementos.
Finita: todo arreglo tiene un l;mite, es decir, debe determinarse cual ser. el nmero m.7imo de elementos que #odr.n +ormar #arte del arreglo.
;omognea: ,odos los elementos de un arreglo son del mismo ti#o o naturale$a =todos enteros, todos bol3anos, etc.>, #ero nunca una combinacin de distintos ti#os.
Ordenada: 'e debe determinar cu.l es el #rimer elemento, el segundo, el tercero? y el en3simo elemento.
ARREGLO
&n C, todos los arreglos constan de #osiciones de memoria contiguas. %a direccin m.s baja corres#onde al #rimer elemento y la direccin m.s alta al ltimo elemento. %os arreglos #ueden tener de una a varias dimensiones. &l arreglo m.s comn es la cadena, que sim#lemente es un arreglo de caracteres terminado #or un nulo. 1 ELEMENTO 2 ELEMENTO N- ELEMENTO %b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 2
&n cuanto a las dimensiones los arreglos se #ueden clasi+icar8
!nidimensional o vectores8 un solo ;ndice Bidimensional o matri$8 dos ;ndices "ultidimensional8 m.s de dos ;ndices
rreglos "nidimensionales
!n arreglo unidimensional es un ti#o de datos estructurado que est. +ormado de una coleccin +inita y ordenada de datos del mismo ti#o. &s la estructura natural #ara modelar listas de elementos iguales.
&l ti#o de acceso a los arreglos unidimensionales es el acceso directo, es decir, #odemos acceder a cualquier elemento del arreglo sin tener que consultar a elementos anteriores o #osteriores, esto mediante el uso de un ;ndice #ara cada elemento del arreglo que nos da su #osicin relativa.
%a +orma general de declaracin de un arreglo unidimensional es8
tipo nombre_de_variable[tamao];
%os arreglos tienen que declararse e7#l;citamente #ara que el com#ilador #ueda reservar es#acio en memoria #ara ellos. &n la declaracin ti#o declara el ti#o base del arreglo, que es el ti#o de cada elemento del arreglo. &l valor de tama:o indica cu.ntos elementos mantendr. el arreglo. -or ejem#lo, #ara declarar un arreglo de 1@@ elementos de ti#o double denominado 2otas se usa la instruccin8
double Notas[100];
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina (3
!n elemento se #uede acceder inde7ando el nombre del arreglo. &sto se 6ace colocando el ;ndice del elemento entre corc6etes justo detr.s del nombre del arreglo. -or ejem#lo,
Notas[3] = 12.23;
asigna al elemento nmero 1 de 2otas el valor 1(.(1.
&n C, todos los arreglos tienen el @ como ;ndice de su #rimer elemento. -or tanto, cuando se escribe char p[10];se est. declarando un arreglo de caracteres que tiene die$ elementos, desde #A@B 6asta #ACB. -or ejem#lo, el siguiente #rograma carga un arreglo de enteros con los nmeros desde el @ 6asta el CC8
#include <stdio.h> int main(void) { int x[100]; /* esto declara un arreglo de 100 elementos enteros / int t; /* mostrar el contenido de x */ for(t=0; C<100; t++) { x[t]=t; printf("%d ", x[t]; } return 0; }
C no com#rueba los l;mites de los arreglos. Como #rogramador, es tarea suya #ro#orcionar una com#robacin de l;mites cuando sea necesario. -or ejem#lo, este cdigo com#ilar. sin errores, #ero es incorrecto #orque el bucle +or 6ace que se sobre#ase el +inal del arreglo DD
int XX[50 ]; for(i=0; i<100; i++) XX[i]= i;
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina ((
Cadenas
&l uso m.s comn de los arreglos unidimensionales, es como cadenas de caracteres. &n C, una cadena es un arreglo de caracteres terminado en nulo. =!n nulo es un cero.> -or tanto, una cadena contiene los caracteres que la con+orman seguidos de un nulo. %a cadena terminada en nulo es el nico ti#o de cadena de+inido en C.
Cuando se declara un arreglo de caracteres #ara una cadena, es necesario que se declare con un car.cter m.s que la cadena m.s larga que #ueda contener, esto dejar. sitio #ara el car.cter nulo. -or ejem#lo, #ara declarar un arreglo A#ellido que contenga una cadena de 6asta (5 caracteres, se escribir.8
char Apellido[26] ;
C incluye una gran variedad de +unciones de mani#ulacin de cadenas. %as m.s comunes son las siguientes8
Nombre Funci6n strc#y=c1, c(> Co#ia c( en c1. strcat=c1, c(> Concatena c( al +inal de c1. strlen=c1> *evuelve la longitud de c1. strcm#=c1, c(> *evuelve @ si c1 y c( son iguales< menor que @ si c1Ec(< mayor que @ si c1Fc(. strc6r=c1, car> *evuelve un #untero a la #rimera ocurrencia de car en c1. strstr=c1, c(> *evuelve un #untero a la #rimera ocurrencia de c( en c1.
&stas +unciones usan el arc6ivo de cabecera est.ndar Estring.6F. &l siguiente #rograma ilustra el uso de estas +unciones de cadenas8
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina (
#include <stdio.h>. #include <string.h> int main(void) { char c1[80],c2[80] ; gets(c1); gets(c2); printf("longitudes: %d %d\n", strlen(c1), strlen(c2)); if (strcmp(c1, c2)==0) printf("Las cadenas son iguales\n") ; strcat(c1, c1); printf("%s\n",c1) ; strcpy(c1, "sta es una prueba.\"); printf (c1) ; if(strchr("hola", 'o')) printf("o est en hola\n"); if(strstr("hola amigos", "hola")) printf("hola encontrado"); return 0; }
'i se ejecuta este #rograma y se introducen las cadenas G6olaG y G6olaG, la salida es
longitudes8 4 4 %as cadenas son iguales 6ola 6ola Hsta es una #rueba o est. en 6ola 6ola encontrado
rreglos 5idimensionales
&ste ti#o de arreglos al igual que los anteriores es un ti#o de dato estructurado, +inito ordenado y 6omog3neo. &l acceso a ellos tambi3n es en +orma directa #or medio de un #ar de ;ndices.
%os arreglos bidimensionales se usan #ara re#resentar datos que #ueden verse como una tabla con +ilas y columnas. %a #rimera dimensin del arreglo %b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina ("
re#resenta las columnas, cada elemento contiene un valor y cada dimensin re#resenta una relacin.%a re#resentacin en memoria se reali$a de dos +ormas8 almacenamiento #or columnas o #or renglones.
-ara declarar un arreglo num de enteros bidimensional de tama:o 1@,(@ se escribir.
int num[10] [20];
*e +orma similar, #ara acceder al #unto 1,( del arreglo d se escribir.
num[1][2]
&l siguiente ejem#lo carga un arreglo bidimensional con los nmeros del 1 al 1( y luego los im#rime +ila a +ila.
#include <stdio.h> int main(void) { int t, i, num [3][4]; for (t=0; t<3; ++t) { for(i=0; i<4; ++i) { num [t][i]=(t*4)+ i + 1; } } /* ahora imprimirlos */ for (t=0; t<3; ++t) { for(i=0; i<4; ++i) { printf ("%3d ", num[t] [i] ) ; printf("\n"); } }
return 0; }
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina (#
&n este ejem#lo, numA@BA@B tiene el valor 1, numA@BAlB el valor (, numA@BA(B el valor 1, y as; sucesivamente. &l valor de numA(BA1B es 1(. 'e #uede re#resentar el arreglo como sigue8
num [t] [i]
1 2 3 4 0 1 2 3 4 1 5 6 7 8 2 9 10 11 12
%os arreglos bidimensionales se almacenan en matrices +ila-columna, en las que el #rimer ;ndice indica la +ila y el segundo indica la columna. &sto signi+ica que el ;ndice m.s a la derec6a cambia m.s r.#ido que el de m.s a la i$quierda cuando accedemos a elementos del arreglo en el orden en que realmente se 6an almacenado en memoria.
rreglos de Cadenas
-ara crear un arreglo de cadenas se utili$a un arreglo de caracteres bidimensional. &l tama:o del ;ndice i$quierdo determina el nmero de cadenas y el tama:o del ;ndice derec6o es#eci+ica la longitud m.7ima de las cadenas. &l cdigo que sigue declara un arreglo de 1@ cadenas, cada una con una longitud m.7ima de IC caracteres.
char arreglo_cad[30][80];
&s bastante +.cil acceder a una cadena individual8 sim#lemente se es#eci+ica slo el ;ndice i$quierdo. -or ejem#lo, la siguiente declaracin llama a gets=> con la tercera cadena de arreglo Jcad.
gets (arreglo_cad[2]) ;
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina ($
%a declaracin anterior equivale +uncionalmente a
gets(&arreglo_cad[2][0]);
rreglos Multidimensionales
&ste tambi3n es un ti#o de dato estructurado, que est. com#uesto #or n dimensiones. -ara 6acer re+erencia a cada com#onente del arreglo es necesario utili$ar n ;ndices, uno #ara cada dimensin. C #ermite arreglos de m.s de dos dimensiones. %a +orma general de declaracin de un arreglo multidimensional es8
tipo nombre [Tamao1][Tamao2][Tamao3]...[TamaoN];
O4eraciones con rreglos "nidimensionales
%as o#eraciones en arreglos #ueden clasi+icarse de la siguiente +orma8 Iniciali$acin %ectura &scritura Asignacin
Iniciali%aci6n
C #ermite la iniciali$acin de arreglos en el momento de declararlos. %a +orma general de iniciali$acin de un arreglo, que a#arece a continuacin, es similar a la de otras variables8
%a listaJdeJvalores es una lista de constantes se#aradas #or comas cuyo ti#o es com#atible con el es#eci+icadorJdeJti#o. %a #rimera constante se coloca %b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina (/
en la #rimera #osicin del arreglo, la segunda constante en la segunda #osicin, y as; sucesivamente. Obs3rvese que un #unto y coma sigue a K.
&n el ejem#lo que sigue se iniciali$a un arreglo de enteros de 1@ elementos con los nmeros del 1 al 1@8
int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Iniciali%aci6n de arreglos no delimitados
Como se #odr. su#oner, resulta tedioso contar los caracteres de cada mensaje manualmente #ara determinar la dimensin correcta del arreglo. 'e #uede 6acer que el com#ilador calcule autom.ticamente las dimensiones de los arreglos. 'i en una instruccin de iniciali$acin de un arreglo no se es#eci+ica el tama:o del arreglo, el com#ilador autom.ticamente crea un arreglo su+icientemente grande #ara mantener todos los iniciali$adores #resentes. &sto es lo que se denomina arreglo no delimitado.
char mensaje[26] = Bienvenido al Sistema;
Adem.s de ser menos tedioso, el uso de la iniciali$acin de arreglos no delimitados #ermite cambiar cualquiera de los mensajes sin temor a teclear una cuenta incorrecta accidentalmente. &l uso de iniciali$aciones de arreglos no delimitados no est. restringido a los arreglos unidimensionales.
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina (0
Lectura
&ste #roceso consiste en leer un dato de un arreglo y asignar un valor a cada uno de sus com#onentes. %a lectura se reali$a de la siguiente manera8 int n = 100; /* donde la variable n contiene la cantidad mxima que contendr el arreglo*/ for (i=0;i < n-1; i++) scanf(%d,&arreglo[i]);
&scritura
Consiste en im#rimir o mostrar #or #antalla el valor de cada #osicin del arreglo. %a escritura se reali$a de la siguiente manera8
int n = 100; /* donde la variable n contiene la cantidad mxima que contendr el arreglo*/
for (i=0;i< n-1; i++) printf(%d,arreglo[i]);
signaci6n
2o es #osible asignar directamente un valor a todo el arreglo, #or lo que se reali$a de la manera siguiente8 int n = 100; /* donde la variable n contiene la cantidad mxima que contendr el arreglo*/
for (i=0;i < n-1; i++) arreglo[i]= 0;
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina (1
O4eraciones con rreglos 5idimensionales
%as o#eraciones en arreglos bidimensionales #ueden clasi+icarse de la siguiente +orma8 Iniciali$acin %ectura &scritura Asignacin Iniciali%aci6n
%os arreglos multidimensionales se iniciali$an del mismo modo que los unidimensionales. -or ejem#lo, lo siguiente iniciali$a cuads con los nmeros del 1 al 1@ y sus cuadrados.
Cuando se iniciali$an arreglos multidimensionales se #ueden a:adir llaves #ara encerrar los iniciali$adores de cada dimensin. &sto se denomina agru#amiento subagregado. -or ejem#lo, la declaracin anterior se #odr;a 6aber escrito tambi3n como8 int cuads[10][2] = { {1, 1}, {2, 4}, {3, 9}, {4, 16}, {5, 25}, %b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina (2
{6, 36}};
Cuando se utili$a agru#amiento subagregado, si no se #ro#orcionan su+icientes iniciali$adores #ara un gru#o dado, los restantes miembros se iniciali$an a cero autom.ticamente.
Iniciali%aci6n de arreglos no delimitados
-ara los arreglos multidimensionales se deben es#eci+icar todas e7ce#to la dimensin m.s a la i$quierda. =%as otras dimensiones se necesitan #ermitir al com#ilador de C inde7ar el arreglo adecuadamente.> *e este modo se #uede construir tablas de longitudes variables, y el com#ilador asignar. autom.ticamente su+iciente es#acio #ara ellas. -or ejem#lo, a continuacin se muestra la iniciali$acin del arreglo no delimitado cuads8
%a ventaja de esta declaracin sobre la versin de tama:o delimitado es que la tabla #uede alargarse o acortarse sin tener que cambiar las dimensiones del arreglo.
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 3
Lectura
&ste #roceso consiste en leer un dato de un arreglo y asignar un valor a cada uno de sus com#onentes. %a lectura se reali$a de la siguiente manera8 int n = 100; /* donde la variable n contiene la cantidad mxima que contendr el arreglo*/ for (i=0;i < n-1; i++) { for (j=0;j < n-1; j++) { scanf(%d,&arreglo[i][j]); } }
&scritura
Consiste en im#rimir o mostrar #or #antalla el valor de cada #osicin del arreglo. %a escritura se reali$a de la siguiente manera8
int n = 100; /* donde la variable n contiene la cantidad mxima que contendr el arreglo*/ for (i=0;i < n-1; i++) { for (j=0;j < n-1; j++) { printf(%d,arreglo[i][j]); } }
signaci6n
2o es #osible asignar directamente un valor a todo el arreglo, #or lo que se reali$a de la manera siguiente8 int n = 100; /* donde la variable n contiene la cantidad mxima que contendr el arreglo*/ for (i=0;i < n-1; i++) { for (j=0;j < n-1; j++) { arreglo[i][j]= 0; } } %b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina (
Ordenaci6n y 58s9ueda
%a ordenacin y bsqueda de elementos son tareas que se reali$an +recuentemente en el #rocesamiento de datos, esto debido a que muc6as actividades 6umanas requieren que a di+erentes colecciones de datos utili$ados se #ongan en un orden es#ec;+ico y se localicen de manera r.#ida< ejem#los claros son las o+icinas de correos y las em#resas de mensajer;a que ordenan el correo y los #aquetes #or cdigos #ostales, con el +in de conseguir una entrega e+iciente. %o que su#one un .rea interesante e intr;nseca desde el #unto de vista terico y #r.ctico en la #rogramacin. -or tal motivo esta unidad est. dedicada a estudiar los m3todos de ordenamiento y bsqueda, as; como su im#lementacin en el lenguaje C.
Rutinas de Ordenamiento
1. Ordenaci6n 4or intercambio: es el m3todo m.s sencillo, ordena los elementos de una lista en orden ascendente. %a t3cnica se basa en la lectura sucesiva de la lista a ordenar, com#arando el elemento in+erior de la lista con los restantes y e+ectuando intercambio de #osiciones cuando el orden resultante de la com#aracin no sea correcto. &l +uncionamiento de este m3todo se #uede observar gr.+icamente a continuacin8
'e tiene el siguiente arreglo a8 &n la iteraci6n 1 ocurrir;a lo siguiente8 8 4 6 2
'e reali$a intercambio 4 8 6 2
4 8 6 2
2o se reali$a intercambio 4 8 6 2
4 8 6 2
'e reali$a intercambio 2 8 6 4
8 4 6 2 %b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina
Vector inicial Vector resultante
&n la iteraci6n , #asar;a lo siguiente8
2 8 6 4
'e reali$a intercambio 2 6 8 4
2 6 8 4
'e reali$a intercambio 2 4 8 6
Vector inicial Vector resultante
&n la iteraci6n - se tendr;a8 2 4 8 6
'e reali$a intercambio 2 4 6 8
Vector inicial Vector resultante
Im4lementaci6n del mtodo en C:
void intercambio( int a[], int n ) { int i, j , aux; for (i=0;i < n-1; i++) for (j=i+1;j < n; j++) if( a[i] > a[j] ) { aux=a[i]; a[i] = a[j]; a[j] = aux; } }
2. Ordenaci6n 4or selecci6n: &l +uncionamiento de este m3todo se #uede observar gr.+icamente a continuacin8 consid3rese un arreglo a con 5 valores enteros8
51 21 39 80 35 %b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina "
51 21 39 80 35
Iteracin @ 'eleccionar (1 e intercambiar (1 y aA@B 21 51 39 80 35
Iteracin 1 'eleccionar 15 e intercambiar 15 y aA1B 21 35 39 80 51
Iteracin ( 'eleccionar 1C e intercambiar 1C y aA(B 21 35 39 80 51
Iteracin 1 'eleccionar 51 e intercambiar 15 y aA1B 21 35 39 51 80
Iteracin 4 %ista ordenada *es#u3s de observar gr.+icamente el m3todo se #uede deducir lo siguiente8 &l m3todo selecciona el elemento m.s #eque:o de la lista a. %o intercambia con el #rimer elemento aA@B. A6ora el valor m.s #eque:o est. en la #rimera #osicin del vector. Considerar las #osiciones de la lista aA1B, aA(B, aA1B,?, seleccionar el elemento m.s #eque:o e intercambiarlo con aA1B. A6ora los dos valores m.s #eque:os de a est.n en orden. Continuar este #roceso encontrando o seleccionando el elemento m.s #eque:o de los restantes intercambiarlos adecuadamente.
Im4lementaci6n del mtodo en C: void seleccion( int a[], int n ) { int i, j ,aux, indicemenor; for (i=0;i < n-1; i++) { indicemenor = i; for (j=i+1;j < n; j++) { if( a[j] < a[indicemenor] ) { aux=a[j]; a[j] = a[indicemenor]; a[indicemenor] = aux; } } } }
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina #
1. Ordenaci6n 4or inserci6n: &l +uncionamiento de este m3todo se #uede observar gr.+icamente a continuacin8
50
Comien$o con 5@ 20 50
'e inserta (@ en la #osicin @ y 5@ se mueve a la #osicin 1 20 40 50
'e inserta 4@ en la #osicin 1 y 5@ se mueve a la #osicin ( 20 40 50 80
'e inserta L@ en la #osicin 1 20 30 40 50 80
'e inserta 1@ en la #osicin 1 y se des#la$a a la derec6a la sublista derec6a
*es#u3s de observar gr.+icamente el m3todo se #uede deducir lo siguiente8 &l #rimer elemento aA@B se considera ordenado< es decir, la lista inicial consta de un elemento. 'e inserta aA1B en la #osicin correcta< delante o detr.s de aA@B, de#endiendo de que sea menor o mayor. &s decir, se e7#lora la lista desde aAiB 6asta aAnB buscando la #osicin correcta de destino< esto es la #osicin a insertar dentro de la lista ordenada. -or cada iteracin se mueve 6acia a la derec6a del vector todos los elementos mayores que la #osicin a insertar, #ara dejar vac;a esa #osicin. Insertar ele elemento en la #osicin correcta.
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $
Im4lementaci6n del mtodo en C:
void insercion( int a[], int n ) { int i, j ,aux; for (i=1;i < n; i++) { j = i; aux=a[i]; while(j>0 && aux<a[j-1]) { a[j]=a[j-1]; j--; } a[j]=aux; } }
4. Ordenaci6n 4or burbu7a: es el m.s conocido y #o#ular de todos #or su +acilidad de entender, #ero es el m.s ine+iciente y #or ello, normalmente se a#rende su t3cnica #ero no suele usarse. 'e denomina burbuja #orque los valores m.s #eque:os del arreglo suben a la cima del mismo, de manera similar a como suben las burbujas en el agua, mientras que los valores mayores se 6unden en la #arte in+erior del arreglo. &l +uncionamiento de este m3todo se #uede observar gr.+icamente a continuacin sea a el siguiente arreglo8
&n la iteraci6n 1 se tiene8 50 20 40 80 30
Intercambio 5@ y (@ 20 50 40 80 30
Intercambio 5@ y 4@ 20 40 50 80 30 5@ y L@ ordenados 50 20 40 80 30 %b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina /
20 40 50 80 30
Intercambio L@ y 1@ 20 40 50 30 80
&lemento mayor es L@
&n la iteraci6n , se tiene8 20 40 50 30 80
(@ y 4@ ordenados 20 40 50 30 80
4@ y 5@ ordenados 20 40 50 30 80
Intercambio 5@ y 1@ 20 40 30 50 80
5@ y L@ elementos mayores ordenados
&n la iteraci6n - se tiene8 20 40 30 50 80
(@ y 4@ ordenados 20 40 30 50 80
Intercambio 4@ y 1@ 20 30 40 50 80
4@, 5@ y L@ elementos mayores ordenados
&n la iteraci6n 2 se tiene8 20 30 40 50 80
(@ y 1@ ordenados 20 30 40 50 80
%ista ordenada
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 0
Im4lementaci6n del mtodo en C: void burbuja( int a[], int n ) { int j , aux, pasada, interruptor=0; for (pasada=0; pasada < n-1 && interruptor==0; pasada++) { interruptor=1; for (j=0;j < n-pasada-1; j++) { if( a[j] > a[j+1] ) { interruptor=0; aux=a[j]; a[j] = a[j+1]; a[j+1] = aux; } } } } Rutinas de 58s9ueda
1. 58s9ueda secuencial: esta bsqueda trata de buscar un elemento de un arreglo utili$ando un valor destino llamado clave. &n una bsqueda secuencial, los elementos de una lista o vector se e7#loran en secuencia, es decir uno des#u3s del otro. &ste m3todo com#ara cada elemento del arreglo con la clave de bsqueda. *ado que el vector no est. en un orden #re+ijado, es #robable que el elemento a buscar #ueda ser el #rimero, el ltimo o cualquier otro.
&l siguiente ejem#lo es#eci+ica gr.+icamente el m3todo, en la cual se trata de buscar el elemento M en el siguiente arreglo a8
%b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 1
10 05 31 22 06
6 valor devuelto ;ndice 4
Im4lementaci6n del mtodo en C: int busqueda_secuencial(int a[], int n, int clave) { int i; for(i=0; i<n; i++) if(a[i]==clave) return 1; return -1; }
2. 58s9ueda binaria: si un vector est. ordenado, se le #uede a#licar esta bsqueda, que +unciona de la siguiente manera8 se #osiciona en el centro de la lista y se com#rueba si el valor clave coincide con el valor del elemento central. 'i no encuentra el valor de la clave, se sita en la mitad in+erior o su#erior del elemento central de la lista. 0r.+icamente esta t3cnica se #uede re#resentar de la siguiente manera8
'e desea buscar ((5 en el siguiente vector a:
Punto central (100) 13 44 75 100 120 275 325 510 Como ((5 es mayor que 1@@, la bsqueda contina con la mitad su#erior del conjunto de datos del vector.
13 44 75 100 120 275 325 510 %b&eti'o ()* Arreglos+ Cadenas de Caracteres+ Rutinas de %rdenamiento y Rutinas de ,-s.ueda
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 2
120 275 325 510
&l ltimo valor de la #rimera mitad es (I5, la bsqueda contina con la #rimera mitad de elementos.
120 275
&l ltimo valor de la #rimera mitad es 1(@, que es m.s #eque:o que el valor que se est. buscando, la bsqueda contina con la segunda mitad de elementos.
275
'e observa #or ltimo que no 6a 6abido 37ito en la bsqueda ya que ((L es distinto a (I5
Im4lementaci6n del mtodo en C: int busquedabinaria (int a[], int bajo, int alto, int clave) { int central, valorcentral; while(bajo<=alto) { central = (bajo+alto)/2; valorcentral = a[central]; if(clave == valorcentral) return central; else if(clave < valorcentral) alto = central -1; else bajo = central + 1; } return -1; } %b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina "3
Cuando se 6abla de modularidad en %enguaje C se em#lea el t3rmino +uncin que no es m.s que una seccin de cdigo inde#endiente que genera un conjunto de eventos derivados de una #osterior llamada en una #arte de la seccin #rinci#al del #rograma, lo que conlleva que se #ueda trabajar en una +orma m.s ordenada y generando a#licaciones m.s robustas y #oderosas combinando ejecuciones iterativas yNo recursivas.
Aqu; desarrollaremos los siguientes ;tems8 Introducci6n 3e#inici6n 3eclaraci6n !i4os de Funciones Llamadas a una Funci6n Salidas de una Funci6n (aso de 4ar'metros a una Funci6n (or valor (or re#erencia <isibilidad de las Funciones Recursividad <enta7as Inconvenientes Soluci6n Iterativa vs Soluci6n Recursiva
%b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina "(
3e#inici6n !na #unci6n es una #arte de cdigo inde#endiente del #rograma #rinci#al y de otras +unciones, que #uede ser llamada envi.ndole unos datos =o sin enviarle nada>, #ara que realice una determinada tarea yNo #ro#orcione unos resultados. %a +orma general de de+inicin de una +uncin es8 tipo nombre(lista de parmetros) { cuerpo de la funcin } &l ti#o es#eci+ica el ti#o de valor que devuelve la sentencia return de la +uncin. &l valor #uede ser cualquier ti#o v.lido< si no se es#eci+ica ninguno, se asume un resultado entero. %a lista de #ar.metros es la lista de nombres de variables se#arados #or comas con sus ti#os asociados que reciben los valores de los argumentos cuando se llama a la +uncin. !na +uncin #uede no tener #ar.metros, en cuyo caso la lista de #ar.metros est. vac;a< sin embargo, los #ar3ntesis son necesarios. 3eclaraci6n Cada +uncin debe ser declarada. 'u +orma general es8 ti#o nombreJ+uncin =lista de ti#os =y nombres> de los argumentos>< si una +uncin va usar argumentos, debe declarar variables que ace#ten los valores de los argumentos. &stas variables se llaman #ar.metros +ormales de la +uncin y se com#ortan como variables locales dentro de la +uncin, cre.ndose al entrar en la +uncin y destruy3ndose al salir. %a declaracin de #ar.metros a#arece des#u3s del nombre de la +uncin al de+inirla. %os #ar.metros +ormales tienen que ser del mismo ti#o que los argumentos usados al llamar una +uncin =el com#ilador no dar. error #ero los resultados ser.n ines#erados>. %b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina "
Al igual que con variables locales, se #ueden 6acer asignaciones a los #ar.metros de una +uncin o usarlos en cualquier e7#resin v.lida. 'e #ueden usar como cualquier otra variable. !na +uncin es visible #ara ella misma y otras +unciones desde el momento en que se de+ine. &s visible #ara el #ro#io cuer#o de la +uncin, es decir, la recursividad est. #ermitida. &l cdigo de una +uncin es #rivado a esa +uncin y slo se #uede acceder a 3l mediante una llamada a esa +uncin. %as variables de+inidas dentro de una +uncin son locales =a no ser que las de+inamos globales> #or lo que no conservan su valor de una llamada a otra =e7ce#to si se declaran como static, entonces el com#ilador no las destruye y almacena su valor #ara la #r7ima llamada, aunque la variable tiene limitado el .mbito al interior de la +uncin>. &n C, todas las +unciones est.n al mismo nivel, es decir, no se #uede de+inir una +uncin dentro de otra +uncin. &sto es #or lo que C no es t3cnicamente un lenguaje estructurado #or bloques. &l cdigo de una +uncin es #rivado a esa +uncin y slo se #uede acceder a 3l mediante una llamada a esa +uncin. %as variables de+inidas dentro de una +uncin son locales =a no ser que las de+inamos globales> #or lo que no conservan su valor de una llamada a otra =e7ce#to si se declaran como static, entonces el com#ilador no las destruye y almacena su valor #ara la #r7ima llamada, aunque la variable tiene limitado el .mbito al interior de la +uncin>.
!i4os de Funciones "uc6os autores establecen la siguiente clasi+icacin a la 6ora de ti#i+icar las +unciones en %enguaje C8 a. Funciones 9ue no tienen 4ar'metros y 9ue no devuelven ning8n valor: 'on aquellas que no tienen #ar.metros de entrada, reali$an acciones en su cuer#o de #rograma y no devuelven ningn valor. !tili$an la #alabra reservada void como ti#i+icador de datos %b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina ""
&7em4lo: void mostrar(void) { printf("Despliegue de datos"); return; }
b. Funciones 9ue tienen 4ar'metros y 9ue no devuelven ning8n valor: 'on aquellas que tienen #ar.metros de entrada, reali$an acciones en su cuer#o de #rograma y no devuelven ningn valor. !tili$an cualquiera de las #alabras reservadas como ti#i+icadores de datos a nivel de los #ar.metros de entrada en cuanto a la +uncin su ti#i+icador es void &7em4lo: void mostrar_suma(int a, int b) { int suma; suma= a+b; printf("La Suma de A y B es:%d, suma); return; }
c. Funciones 9ue no tienen 4ar'metros y 9ue devuelven valor: 'on aquellas que no tienen #ar.metros de entrada, reali$an acciones en su cuer#o de #rograma y devuelven algn valor. !tili$an cualquiera de las #alabras reservadas como ti#i+icadores de datos a nivel de +uncin. &7em4lo: int suma(void) { int a=10, b=20, suma; suma = a+b; return suma; }
d. Funciones 9ue tienen 4ar'metros y 9ue devuelven valor: 'on aquellas que tienen #ar.metros de entrada, reali$an acciones en su %b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina "#
cuer#o de #rograma y devuelven algn valor. !tili$an cualquiera de las #alabras reservadas como ti#i+icadores de datos a nivel de los #ar.metros de entrada y de +uncin &7em4lo: int suma(int a, int b) { int sumando; sumando = a+b; return sumando; }
Llamadas a Funciones %as +unciones son llamadas #ara su ejecucin desde cualquier #arte del cdigo, teniendo en cuenta que antes deben 6aber sido declaradas =y #or su#uesto de+inidas>. %a llamada de una +uncin se #roduce mediante el uso de su nombre en una sentencia, #asando una lista de argumentos que deben coincidir en nmero y ti#o con los es#eci+icados en la declaracin =en otro caso se #roducir;a una conversin de ti#os o resultados ines#erados>. &n general, se #ueden #asar argumentos a las +unciones de dos +ormas, #or valor y #or re+erencia. %a llamada 4or valor co#ia el valor de un argumento en el #ar.metro +ormal de la +uncin. *e esta +orma, los cambios en los #ar.metros de la +uncin no a+ectan a las variables que se usan en la llamada =es la llamada m.s usual, es decir, en general no se #ueden alterar las variables usadas #ara llamar a la +uncin>. %a llamada 4or re#erencia co#ia la direccin del argumento en el #ar.metro. *entro de la +uncin se usa la direccin #ara acceder al argumento usado, signi+icando que los cambios 6ec6os a los #ar.metros a+ectan a la variable usada en la llamada. %b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina "$
&s #osible simular una llamada #or re+erencia #asando un #untero al argumento, entonces, al #asar la direccin, es #osible cambiar el valor de la variable usada en la llamada. &7em4lo: #include <stdio.h>
void holamundo(void) /*Funcin donde se ejecuta la lgica del programa*/ { printf("Hola Mundo\n"); /*imprime la cadena*/ return; /*sale de la funcin*/ }
int main(void) /*Funcin principal del programa*/ { holamundo(); /*llamada a la funcin que lleva el peso*/ return 0; /*sale del programa: correcto*/ }
Salidas de Funciones -ara salir de un +uncin se utili$a la sentencia return que #roduce la salida inmediata de la +uncin 6acia el cdigo que la invoc. %a sentencia #uede devolver un valor acorde con el ti#o usado al declarar la +uncin que #uede ser una constante, una variable o una e7#resin. &n caso de obviarse la sentencia return, la +uncin terminar. con se ejecucin de la ltima instruccin. &n este caso la +uncin devuelve el valor cero a e7ce#cin de las +unciones de ti#o void, que no devuelve ningn valor. &7em4lo:
void holamundo(void) /*Funcin donde se ejecuta la lgica del programa*/ { printf("Hola Mundo\n"); /*imprime la cadena*/ return; /*sale de la funcin*/ }
int suma(int a, int b) /*Funcin donde se ejecuta la lgica del programa*/ %b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina "/
{ int sum; sum = a+b; return sum; /*sale de la funcin*/ }
(aso de 4ar'metros a una Funci6n %os #ar.metros +ormales de una +uncin son variables locales que se crean al comen$ar la +uncin y se destruyen cuando termina. &l ti#o de dato de cada #ar.metro +ormal debe ser el mismo que el ti#o de los argumentos se utilicen al llamar a la +uncin. &ste error no se detecta en la com#ilacin y #ara remediarlo, se deben usar los #rototi#os de +unciones. &l nico caso en el que los ti#os #ueden no coincidir los #ar.metros +ormales y los argumentos es cuando el argumento es de ti#o c6ar y el #ar.metros +ormal es de ti#o int< la conversin, en este caso, se 6ace a int. %os #ar.metros de una +uncin #ueden ser valores =llamada 4or valor> o direcciones =llamada 4or re#erencia> (or valor: &l #ar.metro de la +uncin recibe el valor de la variable que se utili$a como argumento. Cualquier modi+icacin sobre estos #ar.metros no a+ecta a las variables que se utili$an #ara llamar a la +uncin, #uesto que el #ar.metro en estos casos es una co#ia de la variable. 'olo se #ueden #asar #or valor los ti#os atmicos, es decir no son arrays ni estructuras. &jm8 int suma(int a, int b); main() { int x = 1, y = 2, z;
z = suma(x, y);
}
int suma(int a, int b) { return(a + b); }
%b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina "0
(or re#erencia: Cuando un argumento es una direccin, el #ar.metro recibe la direccin de la variable que se 6a #asado como argumento al invocar a la +uncin. -or lo tanto, el #ar.metro deber. declararse como un #untero y de esta +orma se #uede modi+icar el contenido de las variables. 'i una +uncin tiene que devolver m.s de un valor, lo 6ar. utili$ando sus #ar.metros y necesariamente los argumentos deben #asarse #or re+erencia.
&jm8 a> void cursor(int *x, int *y); main() { int fila, columna;
void alternar int *px, int *py); main() { int x = 10, y = 20; alternar(&x, &y); printf("x = %d, y = %d", x,y); }
void alternar(int *px, int *py) { int temp; temp = *px; *px = *py; *py = temp; }
%b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina "1
<isibilidad de una Funci6n !na +uncin declarada en un arc6ivo tiene un alcance global< es decir, se #uede invocarla desde cualquier #unto dentro este arc6ivo.
Cuando se quiere acceder a ella desde otro arc6ivo, 6ay que incluir en este ltimo la declaracin de dic6a +uncin. A di+erencia de las variables e7ternas, donde es necesario modi+icar el ti#o de almacenamiento mediante la #alabra reservada e7tern, las +unciones no necesitan de este modi+icador8 una +uncin #uede ser invocada desde cualquier mdulo. &l uso de la #alabra e7tern se usa #ara +acilitar la com#resin del cdigo. 'i quiere restringir el uso de la +uncin a un solo mdulo, se usa el modi+icador static en su declaracin. &sta caracter;stica #ermite dise:ar mdulos con in+ormacin y 6erramientas #rivadas.
Recursividad Oasta a6ora se 6a trabajado en lenguaje C dando soluciones iterativas a nuestros algoritmos. Con este estudio de la recursividad se #retende que se entienda la di+erencia entre una solucin iterativa y su versin recursiva viendo las ventajas e inconvenientes que la utili$acin de una u otra a#ortan. &jm8 ?C6mo dise@ar una #unci6n 9ue calcule la 4otencia de AB 'e #uede llegar al siguiente #lanteamiento8
'e #odr;a #ensar en la +rmula de la #otencia de la manera siguiente8
#ot=D,n> P D Q #ot=D, n-1> %b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina "2
#ot=D,n-1> P D Q #ot=D, n-(> . . #ot=D,@> P 1
'e dice que es recursiva ya que la de+inicin se da en t3rminos de una versin m.s #eque:a de s; misma. !n algoritmo recursivo es un algoritmo que e7#resa la solucin de un #roblema en t3rminos de una llamada a s; mismo. %a llamada a s; mismo se conoce como llamada recursiva.
&7em4lo: void funcionRecursiva(int a) {
funcionRecursiva(a+1);
}
-ara que un algoritmo recursivo no se convierta en in+inito debe contener una condicin que garantice la terminacin del algoritmo recursivo en un tiem#o +inito. &s lo que se conoce como CON3ICICN 3& (R3, que debe 6acer que no se generen m.s llamadas recursivas.
,ambi3n debe contener un (SO 3& L R&C"RSI<I33, que garantice que al ejecutar el algoritmo recursivo se tiende a la condicin de #arada. !na +uncin declarada en un arc6ivo tiene un alcance global< es decir, se #uede invocarla desde cualquier #unto dentro este arc6ivo. Cuando se quiere acceder a ella desde otro arc6ivo, 6ay que incluir en este ltimo la declaracin de dic6a +uncin. A di+erencia de las variables e7ternas, donde es necesario modi+icar el ti#o de almacenamiento mediante la #alabra reservada e7tern, las +unciones no necesitan de este %b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina #3
modi+icador8 una +uncin #uede ser invocada desde cualquier mdulo. &l uso de la #alabra e7tern se usa #ara +acilitar la com#resin del cdigo. 'i quiere restringir el uso de la +uncin a un solo mdulo, se usa el modi+icador static en su declaracin. &sta caracter;stica #ermite dise:ar mdulos con in+ormacin y 6erramientas #rivadas.
<enta7as -ro#orciona sim#licidad en la com#rensin de los #roblemas. &s un m3todo natural de resolver #roblemas. -ermite una gran #otencia de c.lculo. %a correccin de los algoritmos se com#rueba +.cilmente.
Inconvenientes Aumenta el consumo de recursos de la m.quina =sobre todo de la #ila>. &s m.s lenta que las soluciones iterativas equivalentes =siem#re que e7ista la solucin iterativa equivalente>.
Se recomienda aplicar una solucin iterativa cuando el nmero de clculos que se repiten sea grande o exista una solucin iterativa que sea sencilla de codificar.
Consideraciones Generales &n las llamadas a +unciones8 %os #ar.metros que se #asan %as variables locales de las +unciones %a direccin de retorno de esa llamada =la instruccin del algoritmo llamante a ejecutar cuando +inalice la ejecucin del algoritmo llamado> %b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina #(
Se almacenan en la pila del programa.
Soluci6n Iterativa vs Soluci6n Recursiva lgoritmo 9ue dado un n8mero im4rime su valor y todos los anteriores a l en orden decreciente. Solucin iterativa: void decrementa(int a) { int i; for (i=a;i>0;i--) printf(%d ,i); printf(Fin del algoritmo iterativo \n); } In+ormacin que a#arece #or #antalla si se 6ace la llamada a la +uncin decrementa =5>8 5 4 1 ( 1 )in del algoritmo iterativo
Solucin recursiva void decrementa(int a) { if (a>0) !"#$%!%&# $' ()*)$)+ a==0 { printf(%d ,a); decrementa(a-,); -()." $' /) *'!0*.%1%$)$- } el2e printf(Fin del algoritmo rec3r2ivo \n); }
In+ormacin que a#arece #or #antalla si se 6ace la llamada a la +uncin decrementa =5>8 5 4 1 ( 1 )in del algoritmo recursivo
%a siguiente +igura ilustra la ejecucin #aso a #aso del algoritmo recursivo8
A la vuelta de la recursividad no se ejecuta ninguna sentencia. %b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina #
*ado el siguiente ejem#lo analice el caso e indique la secuencia de valores que se im#rimen.
%a siguiente +igura muestra la ejecucin #aso a #aso del algoritmo anterior8
A la vuelta de la recursividad se ejecuta la sentencia8
printf(%d \t,a); - (8) -
In+ormacin que a#arece #or #antalla 5 4 1 ( 1 @ @ @ 1 ( 1 4 Calcule la +uncin +actorial de +orma iterativa y recursiva.
%b&eti'o )* 4unciones y Recursi'idad
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina #"
Soluci6n Iterativa Soluci6n Recursiva int +actorial=int n> R int i< int +actP1< +or =iP n< iF@ <i--> +actP+actS=i>< return=+act>< K
int +actorial=int n> R int +act< i+ =n PP @> NS CO2*ICIT2 *& -ARA*A SN +act P 1< else +act P n S +actorial =n - 1>< NS -A'O *& %A R&C!R'I/I*A* SN return=+act>< K
'eguimiento de la versin recursiva de la +uncin +actorial8
%b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina ##
&n los cursos de #rogramacin el estudio de los #unteros siem#re se 6a considerado un reto #ara los alumnos, tanto en el a#rendi$aje como en su a#licacin. &n el lenguaje de #rogramacin C, los a#untadores son una de las caracter;sticas m.s #oderosas y tiles, en el desarrollo de #rogramas. &l manejo de #unteros requiere que el alumno modi+ique su +orma de #ensar con res#ecto al uso de los identi+icadores. %os #unteros son variables que almacenan como valor la direccin de memoria que ocu#a otro dato =una variable, constante, elementos de arreglos, +unciones, entre otras>< en otras #alabras, los #unteros 6acen re+erencia a un ti#o de dato almacenado en memoria.
&sta ca#acidad de los #unteros #ermite que re+erencias a +unciones, #uedan ser utili$adas como argumentos en el llamado a otra +uncin.
%os #unteros guardan una relacin muy estrec6a con los arreglos y cadenas, #ro#orcionando una v;a alternativa #ara acceder a los elementos individuales del arreglo. %os #unteros son el elemento +undamental en la creacin de estructuras de datos din.micas =listas, #ilas, colas, listas enla$adas, .rboles y gra+os>, a trav3s de la asignacin din.mica de memoria.
Aqu; desarrollaremos los siguientes ;tems8 3e#inici6n Naturale%a de los (unteros 3eclaraci6n Iniciali%aci6n O4eraciones de 3irecci6n e Indirecci6n ritmtica de (unteros Relaci6n entre rreglos y (unteros (unteros y Funciones (recauciones con el uso de (unteros
%b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina #$
3e#inici6n
!n #untero o un a#untador es una variable que almacena como dato la direccin de memoria de otro identi+icador como #uede ser un arreglo, una +uncin u otra variable. %os #unteros son variables que almacenan como valor la direccin de memoria que ocu#a otro dato =una variable, constante, elementos de arreglos, +unciones, entre otras>< en otras #alabras, los #unteros 6acen re+erencia a un ti#o de dato almacenado en memoria. &sta ca#acidad de los #unteros #ermite que re+erencias a +unciones, #uedan ser utili$adas como argumentos en el llamado a otra +uncin.
Oasta los momentos 6ab;amos visto variables cuyos datos #od;an ser valores de ti#o num3rico, al+anum3rico y lgico o booleanos, a6ora estamos conociendo otro ti#o de dato, como lo son las direcciones de memoria, que son ca#aces de almacenarlas en una variable es#ecial conocida como a#untador.
%os #unteros #ueden ser usados #ara8 )undamentalmente son usados #ara el manejo de memoria en +orma din.mica, #ermitiendo un uso m.s e+iciente de este recurso. Comunicar in+ormacin entre una +uncin y sus #untos de llamada. -ermite devolver varios datos desde una +uncin mediante los argumentos de la +uncin. -ermiten que re+erencias a otras +unciones #uedan ser es#eci+icadas como argumentos de otra +uncin. =#asar +unciones como argumentos>. Los punteros, son identificadores (variables) que poseen como valor la direccin de memoria que ocupa un dato especfico. El nombre de un puntero hace referencia directa a la posicin de memoria que ocupa un tipo de dato, e indirecta al valor de ese dato.
%b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina #/
Re#resentan de una +orma m.s conveniente los arreglos multidimensionales, #ermitiendo que un arreglo multidimensional sea reem#la$ado #or un array de #unteros de menor dimensin. 'on el so#orte de enlace que utili$an estructuras avan$adas de datos en memoria din.mica como las listas, #ilas, colas y .rboles.
Naturale%a de los (unteros
&ntender cmo trabajan los #unteros requiere un re#aso de cmo se almacenan los datos en memoria. -rimero debemos recordar que la memoria est. com#uesta #or celdas de memoria y cada celda #osee dos .reas, una que es la direcci6n =valor +ijo #ermite identi+icar la #osicin de dic6a celda> y la otra es la in#ormaci6n =dato almacenado en la celda>. Al momento de declarar una variable, #or ejem#lo int 7, el com#ilador le asigna a 7 una direccin de memoria, +ija, donde almacenar. su valor. %os valores almacenados en memoria ocu#an una o m.s celdas contiguas de memoria =#alabras o bytes adyacentes>. &l nmero de celdas de memoria requeridas #ara almacenar un valor de#ende del ti#o de dato. -or ejem#lo, un car.cter ser. almacenado en 1 byte =L bits> de memoria< un entero normalmente necesita ( bytes continuos. !n valor #unto +lotante #uede necesitar 4 u L bytes. -ara acceder a un valor de una variable, almacenado en memoria, se 6ace mencin al nombre de la variable.
int 7< 7 P 4< #rint+=GUdG,7><
Oay dos o#eradores de a#untadores8 D y E. D es un o#erador monario que devuelve la direccin de memoria de su o#erando. =Recu3rdese que un o#erador monario slo necesita un o#erando.>
Celda de Memoria 3irecci6n F <alor F )L& 4 %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina #0
&l segundo o#erador de a#untadores, E, es el com#lemento de D. &s un o#erador monario que devuelve el valor que se encuentra en la direccin que le sigue. &7em4lo: 'u#ongamos que v es una variable que re#resenta un determinado dato.
&l com#ilador autom.ticamente asignar. celdas de memoria #ara este dato. -odemos acceder a los datos si conocemos su locali$acin =la direcci6n> de la #rimera celda de memoria. %a direccin de memoria de v #uede se determinada mediante la e7#resin Dv. A6ora vamos asignar la direccin de v a otra variable llamada, #v. As;, #v P Vv &sta nueva variable =#v> es un #untero a v, #uesto que GG4untaHH a la #osicin de memoria donde se almacena v, #v re#resenta la direccin de v y no su valor, #v es re+erida como una variable a#untadora, %a relacin entre v y #v est. ilustrada en la +igura siguiente 3irecci6n de v
<alor de v #v
v
&l dato re#resentado #or v =es decir, el dato almacenado en las celdas de memoria de v> #uede ser accedido mediante la e7#resin S#v, donde S es el o#erador indireccin, que o#era slo sobre una variable #untero. -or tanto< S#v y v re#resenta el mismo dato =el contenido de las mismas celdas de memoria>.
3eclaraci6n Cuando se declara un #untero, como es una variable, el com#ilador tambi3n le asigna celdas de memoria +ija, #ero el dato que almacena es la direccin de memoria de otro identi+icador, que #osee el mismo ti#o de dato que el #untero. %os #unteros, como son identi+icadores, al ser declarados deben tener un ti#o de dato asociado =num3rico, al+anum3rico o lgico>, y este ti#o de dato %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina #1
debe ser igual al ti#o de dato de la variable que ocu#a la direccin de memoria que el #untero almacena. -ara declarar un #untero se reali$a igual que el resto de las variables, #ero al nombre del #untero le #recede el s;mbolo E =asterisco>, que leeremos I4untero aJ. &ntonces se dice que un #untero a#unta a un ti#o de datos es#ec;+ico. SintaFis:
E,i#oJdatoFS EnombreJ#unteroF<
equivale a
E,i#oJdatoF SEnombreJ#unteroF<
*onde8 !i4oKdato: &s el ti#o de dato del #untero. NombreK4untero: &s el nombre del #untero
&7em4lo:
intE 8 es un ti#o de dato #untero a enteros. #loat E8 es un ti#o de dato #untero a datos ti#o +loat. #loatE 4tryL #try, es un #untero que a#unta a ti#os de datos +loat. int E4trFL #tr7, es un #untero que a#unta a ti#os de datos enteros.
,ambi3n se #uede decir8
E4trF, es una variable que almacena direcciones de memoria que contienen ti#os de datos int =enteros>. E4try, es una variable que almacena direcciones de memoria que contienen ti#os de datos +loat.
'e debe tener muy claro que G#tr7G es una variable del ti#o G#untero a intG, que GS#tr7G NO es una variable de ti#o GintG. %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina #2
3eclaraciones de (unteros
int S-untAInt< MM !i4o 4untero a enteros =int> c6ar S-untACar< MM !i4o 4untero a caracteres =cNar> double S#unto< MM !i4o 4untero a double
!n #untero, #uede a#untar a cualquier ti#o de dato de+inido #or el usuario, no slo a ti#os sim#les. &s muy im#ortante tener en cuenta que #rimero debe declararse el ti#o de datos al que a#unta =un array, clase, +uncin, etc.> y des#u3s el ti#o de datos #untero.
Iniciali%aci6n
Como #asa con todas las variables en C, cuando se declara un #untero slo se reserva el es#acio de memoria #ara almacenarlo, #ero no se asigna ningn valor inicial, el contenido de la variable #untero #ermanecer. sin cambios, de modo que el valor inicial del #untero ser. aleatorio e indeterminado =denominado com8nmente como basura>. *ebemos su#oner que contiene una direccin no v.lida de memoria. Al intentar reali$ar o#eraciones con #unteros NO INICILIO3OS, ocurrir. un error no slo en el #rograma, sino tambi3n en el sistema o#erativo, #orque se intenta acceder a una direccin de memoria NO &AIS!&N!& o NO <PLI3. ,odos los #unteros deben ser iniciali$ados antes de ser utili$ados.
A las variables de ti#o #unteros slo #ueden asign.rseles8 el valor cero =1 o la constante N"LL >, otro #untero con el mismo ti#o de dato, una direccin de memoria de una variable que #osea el mismo ti#o de dato que el #untero. %as direcciones de memoria deben ser asignadas slo con el o#erador de direccin D =am#ersand>.
(unteros Nulos: int S#tr7 P @< %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $3
+loat S#try P 2!%%< int S#tr$<
&s #osible reali$ar la asignacin de un #untero a otro, si ambos son del mismo ti#o de datos.
#tr$ P #tr7< NNel #untero #tr$ recibe la direccin de memoria que tiene almacenada el #untero #tr7.
O4eradores de 3irecci6n e Indirecci6n
O4erador de 3irecci6n o Re#erencia. =O4erador D>. &s un o#erador monario =slo requiere un o#erando> que devuelve la direccin de memoria del o#erando, es decir, lo que 6ace es devolver la direccin que en memoria ocu#a el objeto sobre el que se a#lica. %iteralmente signi+ica Ila direcci6n deJ.
!n ejem#lo de su uso #ara iniciali$ar un #untero es8 int 7 P1@< int S#tr7 P V7<
#tr7, #osee como valor la direccin de memoria que ocu#a la variable 7.
&ntonces se dice que #tr7 a#unta a 7
Celda de Memoria ptrx 3irecci6n <alor @7)L& @7)LA Celda de Memoria x 3irecci6n <alor @7)LA 1@ %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $(
%a re#resentacin gr.+ica
&ste o#erador NO es a#licable a e7#resiones constantes, #ues 3stas no se almacenan en ninguna direccin de memoria es#ec;+ica sino que se incrustan en las instrucciones. -or ello, no es v.lido 6acer directamente8
int #7 P V1@< NN &rror 1@ no es una variable con direccin #ro#ia
,am#oco es v.lido a#licar D a variables declaradas con la clase de almacenamiento register, ni cam#os de slo lectura =readonly>, #ues si 3stos #udiesen ser a#untados #or #unteros se correr;a el riesgo de #oderlos modi+icar ya que a trav3s de un #untero se accede a memoria directamente, sin tenerse en cuenta si en la #osicin accedida 6ay algn objeto, #or lo que muc6o menos se considerar. si 3ste es de slo lectura.
NO!: &l o#erador D #uede a#licarse slo a o#erandos lvalue =algo a lo 9ue se 4uede asignar un valorQ como una variable>.
O4erador de Indirecci6n o 3esre#erencia de memoria. =O4erador E>: &s un o#erador monario que acta slo sobre o#erandos de ti#o #untero. &ste o#erador devuelve el valor de la variable a la que a#unta el #untero. &s decir, devuelve el valor almacenado en la direccin de memoria a#untada #or el #untero. %iteralmente signi+ica Iel valor deJ. &7em4lo: int 7 P 1@< int S#tr7 P V7< int $ < $ P S#tr7 < NN se asigna a la variable $ el valor 1@. Puntero Variable ptrx x 10 x ptrx %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $
Con el o#erador de Indireccin =E>, tambi3n se #ueden asignar valores a una direccin de memoria a#untada #or un #untero, es decir, se #uede alterar el valor de la variable a la que a#unta un #untero.
&7em4lo: int 7 P 1@< int S#tr7 P V7< S#tr7 P 1@< NN se asigna a la variable 7 el valor 1@.
NO!: 2o debemos con+undir el o#erador S en la declaracin del #untero =int S#>, con el o#erador S =asterisco> en las instrucciones =S#P1@ o $PS#>.
2o se #uede desre+erenciar un #untero 2!%%, #roduce un error en tiem#o de ejecucin. &7em4lo re#erenciando:
#include<stdio.h>
int main(void) { int x = 99; int *p1, *p2;
p1 = &x; p2 = p1;
/* imprimir el valor de x dos veces */ printf(Valores apuntados por p1 y p2: %d %d\n, *p1, *p2);
/* imprimir la direccin de x dos veces */ printf(Direcciones en p1 y p2: %p %p\n, p1, p2);
return 0; }
,ras la secuencia de asignaciones #1 P V7< #( P #1< %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $"
tanto #1 como #( a#untan a 7. -or tanto, tanto #1 como #( se re+ieren al mismo objeto. A continuacin se muestra un ejem#lo de salida del #rograma, con+irmando esto.
/alores a#untados #or #1 y #(8 CC CC *irecciones en #1 y #(8 @@M1)&@@ @@M1)&@@
Obs3rvese que las direcciones se muestran usando el modi+icador de +ormato de #rint+= > U#. que 6ace que #rint+= > muestre una direccin en el +ormato utili$ado #or la com#utadora en cuestin.
&7em4lo desre#erenciando:
{ int* puntero; int variable;
puntero = &variable; *puntero = 33; /* mismo efecto que variable=33 */ }
/arios a#untadores #ueden a#untar a la misma variable8 int* puntero1; int* puntero2; int var;
puntero1 = &var; puntero2 = &var; *puntero1 = 50; /* mismo efecto que var=50 */ var = *puntero2 + 13; /* var=50+13 */
ritmtica de (unteros
%os A#untadores #ueden ser utili$ados como o#erandos v.lidos en los siguientes ti#os de e7#resiones8 Aritm3ticas. Relacionales. %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $#
%os a#untadores no #ueden ser utili$ados como o#erandos v.lidos con todos los o#eradores. %os a#untadores slo #ueden reali$ar8
O4eraciones ritmticas: o Sumarle o restarle un valor entero: IncrementoM3ecremento. &7em4lo: #tr7WW< #tr7--< WW#tr7< --#tr7< #tr7P#tr7W5 < #tr7P#tr7-4< #tr7WP1< #tr7-P(<
o Restar un a4untador de otro. Resta de direcciones de memoria. &7em4lo: #tr7 P #tr7 X #try<
O4eraciones Relacionales: &s #osible com#arar dos variables de ti#o #untero en una e7#resin relacional, usando o#eraciones relacionales de igualdad =P P>, desigualdad =YP> y com#aracin =E, F, PE, FP>.
%a aritm3tica de #unteros, tiene sentido slo cuando el #untero #osee asignado varias direcciones continuas de memoria, es decir, cuando se ejecuta sobre un arreglo. &s muy #oco #robable que dos variables de un mismo ti#o de datos #osean direcciones contiguas de memoria a no ser que sean elementos adyacentes que +ormen #arte de un arreglo.
&7em4lo
# include <stdio.h> void main() { int *px, *py; static int a[6]= { 1, 2, 3, 4, 5, 6]; px=&a[0]: py=&a[5]: %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $$
La ejecucin del programa produce la siguientes salida: px=52 py=5c py px=5
Relaci6n entre rreglos y (unteros
%os nombres de los arreglos, son un ti#o es#ecial de #unteros, que a#untan a la direccin de memoria del #rimer elemento del arreglo. Recordemos que los arreglos #oseen elementos almacenados en direcciones contiguas de memoria. Cada elemento del arreglo #osee una direccin de memoria.
&7em4lo:
int v[10] = {0,1,2,3,4,5,6,7,8,9,}; int *ptrv; ptrv = &v[0]; //se le asigna al puntero ptrv, la direccin de memoria del primer elemento del arreglo v; //equivale a ptrv = v; ptrv = v; //se asigna la direccin de v a ptrv.
Como dijimos anteriormente, el nombre del arreglo =v> es un #untero, que a#unta, a la #rimera direccin de memoria del arreglo. -or lo tanto se est. reali$ando una asignacin de #unteros. Cualquier #osicin de un elemento en el arreglo se #uede obtener con el o#erador de direccin. #trv P VvA4B< NN#trv a#unta a la #osicin 4 del arreglo. #trv P VvAIB< NN#trv a#unta a la #osicin I del arreglo.
Con aritm3tica de #unteros, es #osible acceder a la direccin de cada elemento del arreglo.
&7em4lo:
int v[10] = {0,1,2,3,4,5,6,7,8,9,}; int *ptrv; ptrv = &v[0];// equivale a ptrv=v; //Aritmtica ptrv + 2; //equivale a &v[2] ptrv + 6; //equivale a &v[6]
%b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $/
&n ambos casos, #trv no modi+ica la direccin de memoria a la que a#unta. &n la aritm3tica de #unteros la sumatoria de enteros a memorias =#trv W n> se reali$a en base a la cantidad de bytes del ti#o de datos del #untero =#trv W nS tJbytes>.
'i el arreglo es de ti#o int, cada #osicin del arreglo ocu#a ( bytes de memoria =m.quinas de 1M bits>, #or lo tanto avan$a =#trv W =( S (>>
&n el siguiente ejem#lo se inicia en la #rimera #osicin
int *ptrv, v[3] = {15, 18, 20, 46};
ptrv = v;//ptrv apunta a la direccin 2000
printf(%d, *ptrv); //valor 15 ptrv = ptrv + 1;//avanza a la posicin de direccin 2002 //ptrv = 2000 + (1 * 2) = 2000 + 2 = 2002 printf(%d, *ptrv); //valor 18 ptrv+=2; //avanza a la posicin de direccin 2006 //ptrv = 2000 + (2 * 2) = 2000 + 4 = 2006 printf(%d, *ptrv); //valor 46
Resumen de las O4eraciones con (unteros
1. A una variable #untero se le #uede asignar la direccin de memoria de una variable ordinaria =#vPV#>. (. A una variable #untero se le #uede asignar el valor de otra variable #untero =#vP#y>, siem#re y cuando ambos #unteros a#unten al 1 5 1 8 2 0 4 6 200 200 200 200 200 200 200 200 200 %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $0
mismo ti#o de datos o que el #untero #v sea un #untero gen3rico =#untero a void>. 1. A una variable #untero se le #uede asignar un valor nulo =cero> =#vP2!%%, 2!%% es una constante simblica con valor cero>. 4. !na cantidad entera #uede ser sumada o restada a una variable #untero =#7W1, #vWW>. 5. !na variable #untero #uede ser restada de otra siem#re y cuando ambas a#unten a elementos del mismo arreglo. M. *os variables #unteros #ueden ser com#aradas siem#re que ambas a#unten a datos del mismo ti#o de datos.
(unteros y Funciones
!n .rea en la cual desem#e:an un #a#el #rominente los a#untadores, en el lenguaje C, es en la transmisin de #ar.metros a +unciones. -or lo comn, los #ar.metros se transmiten #or valor a una +uncin en C, es decir, se co#ian los valores transmitidos en los #ar.metros de la +uncin llamada en el momento en que se invoca. 'i cambia el valor de un #ar.metro dentro de la +uncin, no cambia su valor en el #rograma que la llama. -or ejem#lo consid3rese el siguiente +ragmento8 ... X=5; printf (%d\n, x); funct(x); printf(%d\n, x); ...
void funct (int y) { ++y; printf(%d\n,y); return; } %a ejecucin del #rograma ser;a8 im#rime el nmero 5 y des#u3s llama a +unct. &l valor de G7G, que es 5, se co#ia en GyG y comien$a la ejecucin de +unct. *es#u3s, im#rime el nmero M y regresa +unct. 'in embargo, cuando se %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $1
incrementa el valor de GyG, el valor de G7G #ermanece invariable. As;, im#rime el nmero 5, G7G y GyG re+ieren a ( variables di+erentes. 'i deseamos usar +unct #ara modi+icar el valor de G7G, debemos de transmitir la direccin de G7G de la siguiente manera8 ... X=5; printf (%d\n, x); funct(&x); printf(%d\n, x); ...
void funct (int *py) { ++(*py); printf(%d\n, *py); return; } %a ejecucin del #rograma ser;a8 Im#rime nuevamente el nmero 5, y la l;nea 4 llama a +unct. A6ora, sin embargo, el valor trans+erido no es el valor entero de G7G sino el valor a#untador GV7G. &ste es la direccin de G7G. &l #ar.metro de +unct no es m.s y de ti#o int, sino #y de ti#o int S . =&s conveniente nombrar a las variables a#untadores comen$ando con la letra # #ara recordar tanto que se trata de un a#untador> la l;nea C a6ora aumenta al entero en la localidad #y< #y, sin embargo, no cambia y conserva su valor inicial GV7G. As;, #y a#unta al entero G7G de tal manera que cuando S#y, aumenta 7. %uego se im#rime M y cuando regresa +unct, im#rime tambi3n M. %os a#untadores son el mecanismo usado en el lenguaje C #ara #ermitir a una +uncin llamada modi+icar las variables de la +uncin que llama. (recauciones con los 4untadores
4untadores No Iniciali%ados:
'i se altera el valor al que a#unta un #untero no iniciali$ado, se estar. modi+icando cualquier #osicin de la memoria.
%b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina $2
main() { int* puntero; *puntero = 1200; /* Se machaca una zona cualquiera de la memoria */ }
Con#usi6n 3e !i4os:
!n #untero a un ti#o determinado #uede a#untar a una variable de cualquier otro ti#o. Aunque el com#ilador lo #uede advertir, no es un error. =A+ortunadamente, esto no ocurre en CWW>.
main() { int p; double numero; int* puntero;
p = № /* incorrecto, pero el compilador no aborta */ *p = 33; /* Un desastre */ }
4untadores a variables locales #uera de 'mbito:
'i un #untero a#unta a una variable local, cuando la variable desa#are$ca el #untero a#untar. a una $ona de memoria que se estar. usando #ara otros +ines. 'i se des-re+erencia el #untero, los resultados son im#revisibles y a menudo catastr+icos.
main() { int* puntero;
while (...) { int local; puntero = &local; /* puntero apunta a una variable local */ ... *puntero = 33; /* correcto */ } ...
/* ahora puntero apunta a una zona de memoria invlida */ %b&eti'o ")* Punteros o Apuntadores
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina /3
puntero = 50; /* catstrofe */ }
%b&eti'o #)* 5structuras
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina /(
&l uso de estructuras como una re#resentacin o a#ro7imacin de registros de datos, 6a sido una de las 6erramientas m.s idneas usada en la -rogramacin &structurada #ara #oder agru#ar varios ti#os de datos #rimitivos en un solo a la +inal.
Aqu; desarrollaremos los siguientes ;tems8
Conce4tos 5'sicos cceso a los com4onentes de una estructura. rreglos de &structuras &structuras nidadas 4untadores a estructuras. (aso de estructuras a las #unciones.
%b&eti'o #)* 5structuras
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina /
Conce4tos 5'sicos "na &structura es una coleccin de variables sim#les, que #ueden contener di+erentes ti#os de datos. &s un ti#o de dato de+inido #or el usuario. 'on tambi3n conocidas como Registros. Ayudan a organi$ar y manejar datos com#licados en #rogramas debido a que agru#an di+erentes ti#os de datos a las que se les trata como una sola unidad en lugar de ser vistas como unidades se#aradas. &n C se +orma una estructura utili$ando la #alabra reservada struct, seguida #or un cam#o etiqueta o#cional, y luego una lista de miembros dentro de la estructura. %a etiqueta o#cional se utili$a #ara crear otras variables del ti#o #articular de la estructura8 struct campo_etiqueta{ tipo_miembro miembro_1; tipo_miembro miembro_2; tipo_miembro miembro_3; : : tipo_miembro miembro_n; }; !n #unto y coma +inali$a la de+inicin de una estructura #uesto que 3sta es realmente una sentencia C. Algunos de los ejem#los usan la estructura8 struct stbarco{ char tipo[15]; char modelo[15]; char titular[20]; int anno; long int horas_motor; float precioventa; }; &n un #rograma, #odemos asociar una variable con una estructura utili$ando una sentencia similar a la siguiente8 struct stbarco stbarco_usado; %b&eti'o #)* 5structuras
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina /"
%a sentencia de+ine stbarcoJusado de ti#o struct stbarco. %a declaracin requiere el uso del cam#o etiqueta de la estructura. 'i esta sentencia est. contenida dentro de una +uncin, entonces la estructura, llamada stbarcoJusado, tiene un .mbito local a esa +uncin. 'i la sentencia est. contenida +uera de todas las +unciones de #rograma, la estructura tendr. un .mbito global. &s #osible declarar una variable usando esta sinta7is8 struct stbarco{ char tipo[15]; char modelo[15]; char titular[20]; int anno; long int horas_motor; float precioventa; };stbarco_usado; Aqu; la declaracin de variable va antes del #unto y coma +inal. Cuando se asocia slo una variable con el ti#o estructura, el cam#o etiqueta #uede ser eliminado, #or lo que ser;a #osible escribir8 struct { char tipo[15]; char modelo[15]; char titular[20]; int anno; long int horas_motor; float precioventa; };stbarco_usado;
cceso a los Com4onentes de una &structura -ara accesar a los miembros de las estructuras se usa el #unto u o#erador miembro =.>. %a sinta7is es8 estructuraNombre.miembroNombre -or ejem#lo en8 gets(stbarco_usado.modelo); Aqu;, stbarcoJusado es el nombre asociado con la estructura, y modelo es una variable miembro de la estructura, otro ejem#lo8 %b&eti'o #)* 5structuras
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina /#
gets(stbarco_usado.tipo); &sta sentencia leer. la marca del stbarcoJusado en el arreglo de caracteres, mientras la #r7ima sentencia im#rimir. el #recio de venta de stbarcoJusado en la #antalla. printf(%f, stbarco_usado.precioventa); &jem#lo de estructuras8 #include <stdio.h> #include <conio.h> struct datos { char num_control[9]; char nombre[30]; int edad; char sexo; char domicilio[30]; };
struct datos alumno; void main ( ) { clrscr( ); printf(\nIntroduce los datos del alumno:); printf(\nNmero de Control:); gets(alumno.num_control); printf(\nNombre:); gets(alumno.nombre); printf(\nEdad:); scanf(%d,&alumno.edad); printf(\nSexo:); alumno.sexo=getchar( ); printf(\nDireccin:); gets(alumno.domicilio); printf(\nLos datos capturados fueron:); printf(\nNmero de Control:); puts(alumno.num_control); printf(\nNombre:); puts(alumno.nombre); printf(\nEdad:); printnf(%d,alumno.edad); printf(\nSexo:); putchar(alumno.sexo); printf(\nDireccin:); puts(alumno.domicilio); getch ( ); }
%b&eti'o #)* 5structuras
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina /$
rreglos de &structuras -ueden ser construidas, es decir, conce#tuar a los elementos de un arreglo como estructuras, esto se #uede 6acer de la siguiente manera8 struct datos { char num_control[9]; char nombre[30]; int edad; char sexo; char domicilio[30]; };
struct datos alumnos[35]; /*Esta es la variable arreglo de estructura*/
-ara tener acceso a una determinada estructura, se inde7a el nombre de la estructura de la siguiente manera8 alumnosAiB.nombre< aqu; sabemos el nombre del alumno que se encuentra en la #osicin i del arreglo, y de esta manera #ara todos los datos. &structuras nidadas !na estructura #uede contener otras estructuras llamadas estructuras anidadas. %as estructuras anidadas a6orran tiem#o en la escritura de #rogramas que utili$an estructuras similares. 'e 6an de de+inir los miembros comunes solo una ve$ en su #ro#ia estructura y a continuacin utili$ar es estructura como un miembro de estructura. Consideremos las siguientes dos de+iniciones de estructuras8 struct empleado { char nombre_emp[30]; char direccion[25]; char ciudad[20]; char provincia[20]; long int cod_postal; double salario; };
struct clientes { %b&eti'o #)* 5structuras
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina //
char nombre_cliente[30]; char direccion[25]; char ciudad[20]; char provincia[20]; long int cod_postal; double saldo; };
&stas estructuras contienen muc6os datos di+erentes, aunque 6ay datos que est.n sola#ados. As;, se #odr;a dis#oner de una estructura, info_dir que contuviera los miembros comunes. struct info_dir { char direccion[25]; char ciudad[20]; char provincia[20]; long int cod_postal; }; &sta estructura se #uede utili$ar como miembro de las otras estructuras, es decir anidarse.
!n #untero tambi3n #uede a#untarse a una estructura. 'e #uede declarar un #untero a una estructura tal como se declara un #untero a cualquier otro objeto y se declara un #untero estructura tal como se declara cualquier otra variable estructura8 es#eci+icando un #untero en lugar del nombre de la variable estructura. struct persona { %b&eti'o #)* 5structuras
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina /0
char nombre[30]; int edad; int altura; int peso; }; struct persona empleado; struct persona persona *p; p = &empleado;
Cuando se re+erencia un miembro de la estructura utili$ando el nombre de la estructura, se es#eci+ica la estructura y el nombre del miembro se#arado #or un #unto =.>. -ara re+erenciar el nombre de una #ersona, utilice empleado.nombre. 'e re+erencia una estructura utili$ando el #untero estructura. 'e utili$a el o#erador -> #ara acceder a un miembro de ella.
(aso de &structuras a las Funciones
C #ermite #asar estructuras a +unciones, bien #or valor o bien #or re+erencia utili$ando el o#erador V. 'i la estructura es grande, el tiem#o necesario #ara co#iar un #ar.metro struct a la #ila #uede ser #ro6ibitivo.
&n tales casos, se debe considerar el m3todo de #asar la direccin de la estructura. &l siguiente #rograma muestra el #ase de la direccin de una estructura a una +uncin #ara entrada de datos.
%a misma variable la #asa #or valor a otra +uncin #ara salida de los cam#os. #include <stdio.h> /*Define el tipo de estructura info_persona*/ struct info_persona { char nombre[30]; char calle[30]; char ciudad[25]; char provincia[25]; char codigopostal[6]; }; /*Prototipos de funciones*/ %b&eti'o #)* 5structuras
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina /1
void entrad_pna(struct info_persona *pp); void ver_info(struct info_persona p); void main ( ) { struct info_persona reg_dat; entrad_pna(®_dat); /*Pasa por referencia la variable*/ ver_info(reg_dat); /*Pasa por valor*/ clrscr( ); printf(\nPulsa cualquier carcter para continuar\n); getchar( );
} void entrad_pna (struct info_persona *pp) { clrscr( ); puts(\nEntrada de datos de la Persona\n); /*Para acceder a los campos se utiliza el selector -> */ printf(\nNombre:); gets(pp->nombre); printf(\nCalle:); gets(pp->calle); printf(\nCiudad:); gets(pp->ciudad); printf(\nProvincia:); gets(pp->provincia); printf(\nCdigo Postal:); gets(pp->codigopostal); } void ver_info (struct info_persona p) { clrscr( ); puts(\n\t Informacin relativa a la persona); puts(p.nombre); puts(p.calle); puts(p.ciudad); puts(p.provincia); puts(p.codigopostal); } %b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina /2
%os arc6ivos en total inde#endencia con el lenguaje de #rogramacin que se trabaje siem#re 6an servido #ara #oder almacenar en +orma #ermanente datos yNo registros indis#ensables #ara transacciones de#endiendo de la organi$acin que la amerite en su determinado momento.
Aqu; desarrollaremos los siguientes ;tems8
Conce4tos 5'sicos !i4os de arcNivos rcNivos de !eFto. O4eraciones 9ue se reali%an sobre ellos. rcNivos 5inarios. O4eraciones 9ue se reali%an sobre ellos. &7em4los de (rogramas de rcNivos y mani4ulaci6n
%b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 03
Conce4tos 5'sicos *urante la 6istoria de los com#utadores se 6an usado varios m3todos distintos #ara el almacenamiento de datos. Al #rinci#io se recurri a cintas de #a#el #er+oradas, des#u3s a tarjetas #er+oradas. A continuacin se #as al so#orte magn3tico, em#e$ando #or grandes rollos de cintas magn3ticas abiertas. Oasta aqu;, todos los sistemas de almacenamiento e7terno eran secuenciales, es decir, no #ermit;an acceder al #unto e7acto donde se guardaba la in+ormacin sin antes 6aber #artido desde el #rinci#io y sin 6aber le;do toda la in+ormacin, 6asta el #unto donde se encontraba lo que est.bamos buscando. Con las cintas magn3ticas em#e$ lo que con el tiem#o ser;a el acceso aleatorio a los datos. 'e #od;a reservar #arte de la cinta #ara guardar cierta in+ormacin sobre la situacin de los datos, y a:adir ciertas marcas que 6icieran m.s sencillo locali$arla. -ero no +ue 6asta la a#aricin de los discos magn3ticos cuando 3sta t3cnica lleg a su sentido m.s am#lio. &n los discos es m.s sencillo acceder a cualquier #unto de la su#er+icie en #oco tiem#o, ya que se accede al #unto de lectura y escritura usando dos coordenadas +;sicas. -or una #arte la cabe$a de lecturaNescritura se #uede mover en el sentido del radio del disco, y #or otra el disco gira #ermanentemente, con lo que cualquier #unto del disco #asa #or la cabe$a en un tiem#o relativamente corto. &sto no #asa con las cintas, donde slo 6ay una coordenada +;sica. Con la invencin y #roli+eracin de los discos se desarrollaron los arc6ivos o arc6ivos de acceso aleatorio, que #ermiten acceder a cualquier dato almacenado en un arc6ivo en relativamente #oco tiem#o. Actualmente, los discos duros tienen una enorme ca#acidad y son muy r.#idos, aunque an siguen siendo lentos, en com#aracin con las memorias RA". &l caso de los C* es algo intermedio. &n realidad son secuenciales en %b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 0(
cuanto al modo de guardar los datos, cada disco slo tiene una #ista de datos grabada en es#iral. 'in embargo, este sistema, combinado con algo de memoria RA", #ro#orciona un acceso muy #r7imo al de los discos duros. %os datos que 6emos tratado 6asta el momento 6an residido en la memoria #rinci#al. 'in embargo, las grandes cantidades de datos se almacenan normalmente en un dis#ositivo de memoria secundaria. &stas colecciones de datos se conocen como arc6ivos. "n arcNivo es un conjunto de datos estructurados en una coleccin de entidades elementales o b.sicas denominadas registros que son de igual ti#o y constan a su ve$ de di+erentes entidades de nivel m.s bajos denominadas cam#os. !i4os de rcNivos 1. ependiendo de la direccin del flu!o de datos" o e entrada" los datos se leen #or el #rograma desde el arc6ivo. o e salida" los datos se escriben #or el #rograma 6acia el arc6ivo. o e entrada#salida" los datos #ueden ser escritos o le;dos. $. ependiendo del tipo de valores permitidos a cada b%te" o e texto" slo est.n #ermitidos ciertos rangos de valores #ara cada byte. Algunos bytes tienen un signi+icado es#ecial, #or ejem#lo, el valor 6e7adecimal @71A marca el +in de arc6ivo. 'i abrimos un arc6ivo en modo te7to, no ser. #osible leer m.s all. de un byte con ese valor, aunque el arc6ivo sea m.s largo. o &inarios" est.n #ermitidos todos los valores #ara cada byte. &n estos arc6ivos el +inal del arc6ivo se detecta de otro modo, de#endiendo del so#orte y del sistema o#erativo. %a mayor;a de las veces se 6ace guardando la longitud del arc6ivo. Cuando queramos almacenar valores enteros, o en coma +lotante, o im.genes, etc., deberemos usar este ti#o de arc6ivos.
%b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 0
'. (e)*n el tipo de acceso" o +rchivos secuenciales" imitan el modo de acceso de los antiguos arc6ivos secuenciales almacenados en cintas magn3ticas y o +rchivos de acceso aleatorio" #ermiten acceder a cualquier #unto de ellos #ara reali$ar lecturas yNo escrituras. ,. (e)*n la lon)itud de re)istro" o Lon)itud variable" en realidad, en este ti#o de arc6ivos no tiene sentido 6ablar de longitud de registro, #odemos considerar cada byte como un registro. ,ambi3n #uede suceder que nuestra a#licacin cono$ca el ti#o y longitud de cada dato almacenado en el arc6ivo, y lea o escriba los bytes necesarios en cada ocasin. Otro caso es cuando se usa una marca #ara el +inal de registro, #or ejem#lo, en arc6ivos de te7to se usa el car.cter de retorno de l;nea #ara eso. &n estos casos cada registro es de longitud di+erente. o Lon)itud constante" en estos arc6ivos los datos se almacenan en +orma de registro de tama:o contante. &n C usaremos estructuras #ara de+inir los registros. C dis#one de +unciones de librer;a adecuadas #ara manejar este ti#o de arc6ivos. o -ixtos" en ocasiones #ueden crearse arc6ivos que combinen los dos ti#os de registros, #or ejem#lo, dBA'& usa registros de longitud constante, #ero a:ade un registro es#ecial de cabecera al #rinci#io #ara de+inir, entre otras cosas, el tama:o y el ti#o de los registros. &s #osible crear arc6ivos combinando cada una de estas categor;as, #or ejem#lo8 arc6ivos secuenciales de te7to de longitud de registro variable, que son los t;#icos arc6ivos de te7to. Arc6ivos de acceso aleatorio binarios de longitud de registro constante, normalmente usados en bases de datos. Z tambi3n cualquier combinacin menos corriente, como arc6ivos secuenciales binarios de longitud de registro constante, etc. &n cuanto a cmo se de+inen estas #ro#iedades, 6ay dos casos8 'i son binarios o de te7to o de entrada, salida o entradaNsalida, %b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 0"
!n Flu7o =Stream>, no es m.s que una abstraccin que se re+iere a una corriente de datos que +luyen entre un origen o +uente =4roductor> y un destino o sumidero =consumidor>, entre el origen y el destino debe e7istir una cone7in o canal =4i4e> #or la que circulen los datos. %a a#ertura de un arc6ivo su#one establecer la cone7in del #rograma con el dis#ositivo que contiene el arc6ivo, #or el canal que comunica el arc6ivo con el #rograma van a +luir las secuencias de datos. Oay tres +lujos o canales abiertos autom.ticamente8 eFtern FIL& EstdinL eFtern FIL& EstdoutL eFtern FIL& EstderrL &stas tres variables se iniciali$an al comen$ar la ejecucin del #rograma #ara admitir secuencias de caracteres, en modo te7to. 'u contenido es el siguiente8 stdin asocia la entrada est.ndar =teclado> con el #rograma. stdout asocia la salida est.ndar =#antalla> con el #rograma. stderr asocia la salida de mensajes de error =#antalla> con el #rograma. Asi cuando se ejecuta #rint+=[Calle "ayor (.\>< se escribe en stdout, en #antalla< si se desea leer una variable entera con scan+=[Ud\,V7>< se ca#tan los d;gitos de la secuencia de entrada stdin. &l acceso a arc6ivos se 6ace con un bu++er intermedio. 'e #uede #ensar en el bu++er como un array donde se van almacenando los datos dirigidos al arc6ivo, o desde el arc6ivo< el bu++er se vuelca cuando de una +orma u otra se da la orden de vaciarlo. -or ejem#lo, cuando se llama a una +uncin #ara leer del arc6ivo una cadena, la +uncin lee tantos caracteres como que#an en el bu++er. A continuacin se obtiene la cadena del bu++er< una #osterior llamada a la +uncin obtendr. la siguiente cadena del bu++er %b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 0#
y as; sucesivamente 6asta que quede vac;o y se llene con una llamada #osterior a la +uncin de lectura. &l C trabaja con arc6ivos con bu++er, y est. dise:ado #ara acceder a una am#lia gama de dis#ositivos, de tal +orma que trata cada dis#ositivo como una secuencia, #udiendo 6aber secuencias de caracteres y secuencias binarias. Con las secuencias se sim#li+ica el manejo de arc6ivos en C. &n el #rograma el arc6ivo tiene un nombre interno que es un #untero a una estructura #rede+inida =#untero a arc6ivo>. &sta estructura contiene la in+ormacin sobre el arc6ivo, tal como la direccin del bu++er que utili$a, el modo de a#ertura del arc6ivo, el ltimo car.cter le;do del bu++er y otros detalles que generalmente el usuario no necesita saber. &l identi+icador del ti#o de la estructura es FIL& y est. declarada en el arc6ivo de cabecera stdio.6 &7em4lo: FILE *pf;
4ertura de un arcNivo SintaFis: FILE *fopen(char *nombre, char *modo); &sta +uncin sirve #ara abrir y crear arc6ivos en disco. &l valor de retorno es un #untero a una estructura )I%&. %os #ar.metros de entrada son8 1. nombre" una cadena que contiene un nombre de arc6ivo v.lido, esto de#ende del sistema o#erativo que estemos usando. &l nombre #uede incluir el camino com#leto. (. modo" es#eci+ica en ti#o de arc6ivo que se abrir. o se crear. y el ti#o de datos que #uede contener, de te7to o binarios8 o r" slo lectura. &l arc6ivo debe e7istir. o ." se abre #ara escritura, se crea un arc6ivo nuevo o se sobrescribe si ya e7iste. %b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 0$
o a" a:adir, se abre #ara escritura, el cursor se sita al +inal del arc6ivo. 'i el arc6ivo no e7iste, se crea. o r/" lectura y escritura. &l arc6ivo debe e7istir. o ./" lectura y escritura, se crea un arc6ivo nuevo o se sobrescribe si ya e7iste. o a/" a:adir, lectura y escritura, el cursor se sita al +inal del arc6ivo. 'i el arc6ivo no e7iste, se crea. o t" ti#o te7to, si no se es#eci+ica GtG ni GbG, se asume #or de+ecto que es GtG o b" ti#o binario. &7em4lo: FILE *archivo; archivo = fopen("ejemplo1.c", "r");
Clausura de un arcNivo SintaFis: int fclose(FILE *archivo); &s im#ortante cerrar los arc6ivos abiertos antes de abandonar la a#licacin. &sta +uncin sirve #ara eso. Cerrar un arc6ivo almacena los datos que an est.n en el bu++er de memoria, y actuali$a algunos datos de la cabecera del arc6ivo que mantiene el sistema o#erativo. Adem.s #ermite que otros #rogramas #uedan abrir el arc6ivo #ara su uso. "uy a menudo, los arc6ivos no #ueden ser com#artidos #or varios #rogramas. !n valor de retorno cero indica que el arc6ivo 6a sido correctamente cerrado, si 6a 6abido algn error, el valor de retorno es la constante &O). &l #ar.metro es un #untero a la estructura )I%& del arc6ivo que queremos cerrar.
%b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 0/
&7em4lo: fclose(archivo); N"LL y &OF %as +unciones de biblioteca que devuelvan un #untero =strc#y=>, +o#en=>?> es#eci+ican que si no #ueden reali$ar la o#eracin =generalmente si 6ay un error> devuelven N"LL. &sta es una macro de+inida en varios arc6ivos de cabecera, entre los que se encuentran stdio.6 y stdlib.6. %as +unciones de librer;a de &N' de arc6ivos generalmente em#ie$an #or + de +ile, tienen es#eci+icado que son de ti#o entero de tal +orma que si la o#eracin +alla devuelven &OF, tambi3n devuelven &OF #ara indicar que se 6a le;do el +in de arc6ivo. &sta macro est. de+inida en stdio.6
rcNivos de !eFto "n arcNivo de teFto es una secuencia de caracteres organi$adas en l;neas terminadas #or un car.cter de nueva l;nea. &n estos arc6ivos se #ueden almacenar canciones, +uentes de #rogramas, base de datos sim#les, etc. %os arc6ivos de te7to se caracteri$an #or ser #lanos, es decir, todas las letras tienen el mismo +ormato y no 6ay #alabras subrayadas, en negrita, o letras de distinto tama:o o anc6o. !na ve$ abierto el arc6ivo #ara escribir datos 6ay que grabar los datos en el arc6ivo. %a biblioteca C #ro#orciona diversas +unciones #ara escribir datos en el arc6ivo a trav3s del #untero a )I%& asociado. %as +unciones de entrada y salida de arc6ivos tienen muc6o #arecido a las +unciones utili$adas #ara entrada y salida de +lujos stdin =teclado> y stdout =#antalla>< #rint+=>, scan+=>, getc6ar=>, #utc6ar=>, gets=> y #uts=>. ,odas tienen una versin #ara arc6ivos que em#ie$a #or la letra +, as; se tiene +#rint+=>, +scan+=>, +#uts=>, +gets=>< la mayor;a de las +unciones es#ec;+icas de arc6ivos em#ie$an #or +.
%b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 00
Funciones 4utc=> y #4utc=> SintaFis putc(int caracter, FILE *archivo);
fputc(int caracter, FILE *archivo); &stas +unciones escriben un car.cter a un arc6ivo. &l valor de retorno es el car.cter escrito, si la o#eracin +ue com#letada con 37ito, en caso contrario ser. &O). %os #ar.metros de entrada son el car.cter a escribir, convertido a int y un #untero a una estructura )I%& del arc6ivo en el que se 6ar. la escritura. Funciones getc=> y #getc=> SintaFis getc( FILE *archivo);
fgetc(FILE *archivo); &stas +unciones leen un car.cter desde un arc6ivo. &l valor de retorno es el car.cter le;do como un unsigned c6ar convertido a int. 'i no 6ay ningn car.cter dis#onible, el valor de retorno es &O). &l #ar.metro es un #untero a una estructura )I%& del arc6ivo del que se 6ar. la lectura. Funciones #4uts=> y #gets=> SintaFis fputs(const char *cadena, FILE *archivo);
fgetc(const char *cadena, int n, FILE *archivo); %a +uncin #4uts escribe una cadena en un arc6ivo. 2o se a:ade el car.cter de retorno de l;nea ni el car.cter nulo +inal. %b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 01
&l valor de retorno es un nmero no negativo o &O) en caso de error. %os #ar.metros de entrada son la cadena a escribir y un #untero a la estructura )I%& del arc6ivo donde se reali$ar. la escritura. %a +uncin #gets est. dise:ada #ara leer cadenas de caracteres. %eer. 6asta n-1 caracteres o 6asta que lea un retorno de l;nea. &n este ltimo caso, el car.cter de retorno de l;nea tambi3n es le;do. &l #ar.metro n nos #ermite limitar la lectura #ara evitar desbordar el es#acio dis#onible en la cadena. &l valor de retorno es un #untero a la cadena le;da, si se ley con 37ito, y es 2!%% si se detecta el +inal del arc6ivo o si 6ay un error. %os #ar.metros son8 la cadena a leer, el nmero de caracteres m.7imo a leer y un #untero a una estructura )I%& del arc6ivo del que se leer.. Funciones #4rint#=> y #scan#=> SintaFis int fprintf(FILE *archivo, const char *formato, ...);
int fscanf(FILE *archivo, const char *formato, ...);
%a +uncin #4rint# +unciona igual que #rint+ en cuanto a #ar.metros, #ero la salida se dirige a un arc6ivo en lugar de a la #antalla. %a +uncin #scan# +unciona igual que scan+ en cuanto a #ar.metros, #ero la entrada se toma de un arc6ivo en lugar del teclado.
%b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 02
Funci6n #eo#=> SintaFis int feof(FILE *archivo);
&sta +uncin sirve #ara com#robar si se 6a alcan$ado el +inal del arc6ivo. "uy +recuentemente deberemos trabajar con todos los valores almacenados en un arc6ivo de +orma secuencial, la +orma que suelen tener los bucles #ara leer todos los datos de un arc6ivo es #ermanecer leyendo mientras no se detecte el +in de arc6ivo. &sta +uncin suele usarse como #rueba #ara veri+icar si se 6a alcan$ado o no ese #unto. &l valor de retorno es distinto de cero slo si no se 6a alcan$ado el +in de arc6ivo. &l #ar.metro es un #untero a la estructura )I%& del arc6ivo que queremos veri+icar.
&s una +uncin 6eredada de los tiem#os de las cintas magn3ticas. %iteralmente signi+ica GrebobinarG, y 6ace re+erencia a que #ara volver al #rinci#io de un arc6ivo almacenado en cinta, 6ab;a que rebobinarla. &so es lo que 6ace 3sta +uncin, sita el cursor de lecturaNescritura al #rinci#io del arc6ivo. &l #ar.metro es un #untero a la estructura )I%& del arc6ivo que queremos rebobinar.
%b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 13
rcNivos 5inarios
!n arc6ivo binario es una secuencia de bytes que tienen una corres#ondencia uno a uno con un dis#ositivo e7terno. As; que no tendr. lugar ninguna traduccin de caracteres. Adem.s, el nmero de bytes escritos =le;dos> ser. el mismo que los encontrados en el dis#ositivo e7terno. &jem#los de estos arc6ivos son )otogra+;as, im.genes, te7to con +ormatos, arc6ivos ejecutables =a#licaciones>, etc.
&sta +uncin tambi3n est. #ensada #ara trabajar con registros de longitud constante y +orma #areja con +read. &s ca#a$ de escribir 6acia un arc6ivo uno o varios registros de la misma longitud almacenados a #artir de una direccin de memoria determinada. &l valor de retorno es el nmero de registros escritos, no el nmero de bytes. %os #ar.metros son8 un #untero a la $ona de memoria donde se almacenar.n los datos le;dos, el tama:o de cada registro, el nmero de registros a leer y un #untero a la estructura )I%& del arc6ivo del que se 6ar. la lectura. Funci6n de &ntrada #read=> SintaFis fread(void *puntero, size_t tamao, size_t nregistros, FILE *archivo); &sta +uncin est. #ensada #ara trabajar con registros de longitud constante. &s ca#a$ de leer desde un arc6ivo uno o varios registros de la misma %b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 1(
longitud y a #artir de una direccin de memoria determinada. &l usuario es res#onsable de asegurarse de que 6ay es#acio su+iciente #ara contener la in+ormacin le;da. &l valor de retorno es el nmero de registros le;dos, no el nmero de bytes. %os #ar.metros son8 un #untero a la $ona de memoria donde se almacenar.n los datos le;dos, el tama:o de cada registro, el nmero de registros a leer y un #untero a la estructura )I%& del arc6ivo del que se 6ar. la lectura.
Funciones 4ara el acceso aleatorio &l acceso directo X aleatorio X a los datos de un arc6ivo se 6ace mediante su #osicin, es decir, el lugar relativo que ocu#an. ,iene la ventaja de que se #ueden leer y escribir registros en cualquier orden y #osicin. 'on muy r.#idos de acceso a la in+ormacin que contienen. &l #rinci#al inconveniente que tiene la organi$acin directa es que necesita #rogramar la relacin e7istente entre el contenido de un registro y la #osicin que ocu#an. %as +unciones #seek=> y #tell=> se usan #rinci#almente #ara el acceso directo a arc6ivos en C. Hstas consideran el arc6ivo como una secuencia de bytes< el nmero de bytes es el ;ndice del arc6ivo. 'egn se va leyendo o escribiendo registros o datos en el arc6ivo, el #rograma mantiene a trav3s de un #untero la #osicin actual. Con la llamada a la +uncin +tell=> se obtiene el valor de dic6a #osicin. %a +uncin +see]=> #ermite cambiar la #osicin del #untero a arc6ivo a una direccin determinada.
%b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 1
Funci6n #seek=> SintaFis fseek(FILE *archivo, long int desplazamiento, int origen);
&sta +uncin sirve #ara situar el cursor del arc6ivo #ara leer o escribir en el lugar deseado. &l valor de retorno es cero si la +uncin tuvo 37ito, y un valor distinto de cero si 6ubo algn error. %os #ar.metros de entrada son8 un #untero a una estructura )I%& del arc6ivo en el que queremos cambiar el cursor de lecturaNescritura, el valor del des#la$amiento y el #unto de origen desde el que se calcular. el des#la$amiento. &l #ar.metro origen #uede tener tres #osibles valores8 (EE01(E2 el des#la$amiento se cuenta desde el #rinci#io del arc6ivo. &l #rimer byte del arc6ivo tiene un des#la$amiento cero. (EE01345 el des#la$amiento se cuenta desde la #osicin actual del cursor. (EE01E6 el des#la$amiento se cuenta desde el +inal del arc6ivo. Funci6n #tell=> SintaFis ftell(FILE *archivo);
%a +uncin #tell sirve #ara averiguar la #osicin actual del cursor de lecturaNescritura de un arc6ivo. &l valor de retorno ser. esa #osicin, o -1 si 6ay algn error. &l #ar.metro de entrada es un #untero a una estructura )I%& del arc6ivo del que queremos leer la #osicin del cursor de lecturaNescritura.
%b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 1"
&7em4lo
// alea.c: Ejemplo de ficheros de acceso aleatorio. #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h>
struct stRegistro { char valido; // Campo que indica si el registro es vlido S->Vlido, N->Invlido char nombre[34]; int dato[4]; };
int Menu(); void Leer(struct stRegistro *reg); void Mostrar(struct stRegistro *reg); void Listar(long n, struct stRegistro *reg); long LeeNumero(); void Empaquetar(FILE **fa);
int main() { struct stRegistro reg; FILE *fa; int opcion; long numero; fa = fopen("alea.dat", "r+b"); // Este modo permite leer y escribir if(!fa) fa = fopen("alea.dat", "w+b"); // si el fichero no existe, lo crea. do { opcion = Menu(); switch(opcion) { case '1': // Aadir registro Leer(®); // Insertar al final: fseek(fa, 0, SEEK_END); fwrite(®, sizeof(struct stRegistro), 1, fa); break; case '2': // Mostrar registro clrscr(); printf("Mostrar registro: "); numero = LeeNumero(); fseek(fa, numero*sizeof(struct stRegistro), SEEK_SET); fread(®, sizeof(struct stRegistro), 1, fa); Mostrar(®); break; case '3': // Eliminar registro clrscr(); printf("Eliminar registro: "); numero = LeeNumero(); fseek(fa, numero*sizeof(struct stRegistro), SEEK_SET); %b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 1#
// Muestra un men con las opciones disponibles y captura una opcin del usuario int Menu() { char resp[20]; do { clrscr(); printf("MENU PRINCIPAL\n"); printf("--------------\n\n"); printf("1- Insertar registro\n"); printf("2- Mostrar registro\n"); printf("3- Eliminar registro\n"); printf("4- Mostrar todo\n"); printf("5- Eliminar registros marcados\n"); printf("0- Salir\n"); fgets(resp, 20, stdin); } while(resp[0] < '0' && resp[0] > '5'); return resp[0]; }
// Permite que el usuario introduzca un registro por pantalla void Leer(struct stRegistro *reg) { int i; char numero[6]; clrscr(); printf("Leer registro:\n\n"); reg->valido = 'S'; printf("Nombre: "); fgets(reg->nombre, 34, stdin); // la funcin fgets captura el retorno de lnea, hay que eliminarlo: for(i = strlen(reg->nombre)-1; i && reg->nombre[i] < ' '; i--) reg->nombre[i] = 0; %b&eti'o $)* Arc6i'os
Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 1$
// Muestra un registro en pantalla, si no est marcado como borrado void Mostrar(struct stRegistro *reg) { int i; clrscr(); if(reg->valido == 'S') { printf("Nombre: %s\n", reg->nombre); for(i = 0; i < 4; i++) printf("Dato[%1d]: %d\n", i, reg->dato[i]); } getch(); }
// Muestra un registro por pantalla en forma de listado, // si no est marcado como borrado void Listar(long n, struct stRegistro *reg) { int i; if(reg->valido == 'S') { printf("[%6ld] %-34s", n, reg->nombre); for(i = 0; i < 4; i++) printf(", %4d", reg->dato[i]); printf("\n"); } }
// Lee un nmero suministrado por el usuario long LeeNumero() { char numero[6]; fgets(numero, 6, stdin); return atoi(numero); }
// Elimina los registros marcados como borrados void Empaquetar(FILE **fa) { FILE *ftemp; struct stRegistro reg;