guia teorica programacion ii (1)

Upload: velasquez-oscar

Post on 13-Oct-2015

31 views

Category:

Documents


1 download

TRANSCRIPT

  • Docentes Colaboradores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 2

    Lcdo. Rubn Cova Lcdo. Luis Rigual

    Lcda. Gladimar Serrano Lcda. Nakary Ortega. MSc

    Ing. Leonardo Malav. MSc Lcdo. Franklin Mundaray

    Lcda. Lisblein Arismendi TSU Rodolfo Ortz

    Lcdo. Edinson Gonzlez

  • ndice

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 3

    Pgina Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    6

    Introduccin 6

    Arreglos 8

    Unidimensionales 9

    Cadenas 11

    Bidimensionales 12

    Arreglo de Cadenas 14

    Multidimensionales 15

    Operaciones con Arreglos Unidimensionales 15

    Inicializacin 15

    Lectura 17

    Escritura 17

    Asignacin 17

    Operaciones con Arreglos Bidimensionales 18

    Inicializacin 18

    Lectura 20

    Escritura 20

    Asignacin 20

    Rutinas de Ordenamiento 21

    Intercambio 21

    Seleccin 22

    Insercin 24

    Burbuja 25

    Rutinas de Bsqueda 27

    Secuencial 27

    Binaria 28

    Objetivo 2.- Funciones y Recursividad 30 Introduccin 30

    Definicin 31

  • ndice

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 4

    Declaracin 31

    Tipos de Funciones 32

    Llamadas a una Funcin 34

    Salidas de una Funcin 35

    Paso de parmetros a una Funcin 36

    Por valor 36

    Por referencia 37

    Visibilidad de las Funciones 37

    Recursividad 38

    Ventajas 40

    Inconvenientes 40

    Consideraciones Generales 40

    Solucin Iterativa vs Solucin Recursiva 41

    Objetivo 3.- Punteros o Apuntadores 44

    Introduccin 44

    Definicin 45

    Naturaleza de los Punteros 46

    Declaracin 47

    Inicializacin 49

    Operaciones de Direccin e Indireccin 50

    Aritmtica de Punteros 53

    Relacin entre Arreglos y Punteros 55

    Punteros y Funciones 57

    Precauciones con el uso de Punteros 58

    Objetivo 4.- Estructuras 61 Introduccin 61

    Conceptos Bsicos 62

    Acceso a los componentes de una estructura 63

    Arreglos de Estructuras 65

    Estructuras Anidadas 65

  • ndice

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 5

    Apuntadores a estructuras 66

    Paso de estructuras a las funciones 67

    Objetivo 5.- Archivos 69 Introduccin 69

    Tipos de archivos 71

    Archivos de Texto. Operaciones que se realizan sobre ellos 76

    Archivos Binarios. Operaciones que se realizan sobre ellos 80

    Ejemplos de Programas de Archivos y manipulacin 83

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 6

    Una estructura de datos es una coleccin de datos que pueden ser

    caracterizados por su organizacin y las operaciones que definen en ella. Las

    estructuras de datos son muy importantes en los sistemas de computadora. Los

    tipos de datos ms frecuentes utilizados en los diferentes lenguajes de

    programacin son:

    Datos simples

    Estndar Entero, real, carcter y lgico

    Estructura de datos

    Estticos Vectores y matrices, registro y archivos

    Dinmicos Lineales: Lista, pilas y colas

    No lineales: rboles y grafos

    Las estructuras de datos estticas son aquellas en las que el tamao

    ocupado en memoria se define antes que el programa se ejecute y el mismo no

    puede ser modificado durante la ejecucin.

    Los tipos de datos que vimos hasta hora son datos simples cuya

    caracterstica comn es que cada variable representa a un elemento; en cambio

    los tipos de datos estructurados tienen como particularidad que con un nombre o

    identificador se puede representar mltiples datos individuales y a su vez cada

    uno de estas puede ser referenciado independientemente.

    Aqu desarrollaremos los siguientes tems:

    Arreglos

    Unidimensionales

    Cadenas

    Bidimensionales

    Arreglo de Cadenas

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 7

    Multidimensionales

    Operaciones con Arreglos Unidimensionales

    Inicializacin

    Lectura

    Escritura

    Asignacin

    Operaciones con Arreglos Bidimensionales

    Inicializacin

    Lectura

    Escritura

    Asignacin

    Rutinas de Ordenamiento

    Intercambio

    Seleccin

    Insercin

    Burbuja

    Rutinas de Bsqueda

    Secuencial

    Binaria

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 8

    Arreglos

    Se define como una coleccin finita, homognea y ordenada de

    elementos.

    Finita: todo arreglo tiene un lmite, es decir, debe determinarse cual ser el

    nmero mximo de elementos que podrn formar parte del arreglo.

    Homognea: Todos los elementos de un arreglo son del mismo tipo o

    naturaleza (todos enteros, todos bolanos, etc.), pero nunca una combinacin

    de distintos tipos.

    Ordenada: Se debe determinar cul es el primer elemento, el segundo, el

    tercero y el ensimo elemento.

    ARREGLO

    En C, todos los arreglos constan de posiciones de memoria contiguas. La

    direccin ms baja corresponde al primer elemento y la direccin ms alta al

    ltimo elemento. Los arreglos pueden tener de una a varias dimensiones. El

    arreglo ms comn es la cadena, que simplemente es un arreglo de caracteres

    terminado por un nulo.

    1 ELEMENTO 2 ELEMENTO N- ELEMENTO

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 9

    En cuanto a las dimensiones los arreglos se pueden clasificar:

    Unidimensional o vectores: un solo ndice

    Bidimensional o matriz: dos ndices

    Multidimensional: ms de dos ndices

    Arreglos Unidimensionales

    Un arreglo unidimensional es un tipo de datos estructurado que est

    formado de una coleccin finita y ordenada de datos del mismo tipo. Es la

    estructura natural para modelar listas de elementos iguales.

    El tipo de acceso a los arreglos unidimensionales es el acceso directo, es

    decir, podemos acceder a cualquier elemento del arreglo sin tener que consultar

    a elementos anteriores o posteriores, esto mediante el uso de un ndice para cada

    elemento del arreglo que nos da su posicin relativa.

    La forma general de declaracin de un arreglo unidimensional es:

    tipo nombre_de_variable[tamao];

    Los arreglos tienen que declararse explcitamente para que el compilador

    pueda reservar espacio en memoria para ellos. En la declaracin tipo declara el

    tipo base del arreglo, que es el tipo de cada elemento del arreglo. El valor de

    tamao indica cuntos elementos mantendr el arreglo. Por ejemplo, para

    declarar un arreglo de 100 elementos de tipo double denominado Notas se usa la

    instruccin:

    double Notas[100];

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 10

    Un elemento se puede acceder indexando el nombre del arreglo. Esto se

    hace colocando el ndice del elemento entre corchetes justo detrs del nombre

    del arreglo. Por ejemplo,

    Notas[3] = 12.23;

    asigna al elemento nmero 3 de Notas el valor 12.23.

    En C, todos los arreglos tienen el 0 como ndice de su primer elemento. Por

    tanto, cuando se escribe char p[10];se est declarando un arreglo de caracteres que tiene diez elementos, desde p[0] hasta p[9]. Por ejemplo, el siguiente

    programa carga un arreglo de enteros con los nmeros desde el 0 hasta el 99:

    #include 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

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 11

    Cadenas

    El uso ms comn de los arreglos unidimensionales, es como cadenas de

    caracteres. En C, una cadena es un arreglo de caracteres terminado en nulo. (Un

    nulo es un cero.) Por tanto, una cadena contiene los caracteres que la

    conforman seguidos de un nulo. La cadena terminada en nulo es el nico tipo de

    cadena definido en C.

    Cuando se declara un arreglo de caracteres para una cadena, es

    necesario que se declare con un carcter ms que la cadena ms larga que

    pueda contener, esto dejar sitio para el carcter nulo. Por ejemplo, para

    declarar un arreglo Apellido que contenga una cadena de hasta 25 caracteres,

    se escribir:

    char Apellido[26] ;

    C incluye una gran variedad de funciones de manipulacin de cadenas.

    Las ms comunes son las siguientes:

    Nombre Funcin

    strcpy(c1, c2) Copia c2 en c1.

    strcat(c1, c2) Concatena c2 al final de c1.

    strlen(c1) Devuelve la longitud de c1.

    strcmp(c1, c2) Devuelve 0 si c1 y c2 son iguales; menor que 0 si c1c2.

    strchr(c1, car) Devuelve un puntero a la primera ocurrencia de car en c1.

    strstr(c1, c2) Devuelve un puntero a la primera ocurrencia de c2 en c1.

    Estas funciones usan el archivo de cabecera estndar . El

    siguiente programa ilustra el uso de estas funciones de cadenas:

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 12

    #include . #include 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;

    }

    Si se ejecuta este programa y se introducen las cadenas "hola" y "hola", la

    salida es

    longitudes: 4 4

    Las cadenas son iguales

    hola hola

    sta es una prueba

    o est en hola

    hola encontrado

    Arreglos Bidimensionales

    Este tipo de arreglos al igual que los anteriores es un tipo de dato

    estructurado, finito ordenado y homogneo. El acceso a ellos tambin es en

    forma directa por medio de un par de ndices.

    Los arreglos bidimensionales se usan para representar datos que pueden

    verse como una tabla con filas y columnas. La primera dimensin del arreglo

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 13

    representa las columnas, cada elemento contiene un valor y cada dimensin

    representa una relacin.La representacin en memoria se realiza de dos formas:

    almacenamiento por columnas o por renglones.

    Para declarar un arreglo num de enteros bidimensional de tamao 10,20 se

    escribir

    int num[10] [20];

    De forma similar, para acceder al punto 1,2 del arreglo d se escribir

    num[1][2]

    El siguiente ejemplo carga un arreglo bidimensional con los nmeros del 1

    al 12 y luego los imprime fila a fila.

    #include int main(void) {

    int t, i, num [3][4]; for (t=0; t

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 14

    En este ejemplo, num[0][0] tiene el valor 1, num[0][l] el valor 2, num[0][2] el

    valor 3, y as sucesivamente. El valor de num[2][3] es 12. Se puede representar el

    arreglo como sigue:

    num [t] [i]

    1 2 3 4 0 1 2 3 4 1 5 6 7 8 2 9 10 11 12

    Los arreglos bidimensionales se almacenan en matrices fila-columna, en las

    que el primer ndice indica la fila y el segundo indica la columna. Esto significa

    que el ndice ms a la derecha cambia ms rpido que el de ms a la izquierda

    cuando accedemos a elementos del arreglo en el orden en que realmente se

    han almacenado en memoria.

    Arreglos de Cadenas

    Para crear un arreglo de cadenas se utiliza un arreglo de caracteres

    bidimensional. El tamao del ndice izquierdo determina el nmero de cadenas y

    el tamao del ndice derecho especifica la longitud mxima de las cadenas. El

    cdigo que sigue declara un arreglo de 30 cadenas, cada una con una longitud

    mxima de 79 caracteres.

    char arreglo_cad[30][80];

    Es bastante fcil acceder a una cadena individual: simplemente se

    especifica slo el ndice izquierdo. Por ejemplo, la siguiente declaracin llama a

    gets() con la tercera cadena de arreglo _cad.

    gets (arreglo_cad[2]) ;

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 15

    La declaracin anterior equivale funcionalmente a

    gets(&arreglo_cad[2][0]);

    Arreglos Multidimensionales

    Este tambin es un tipo de dato estructurado, que est compuesto por n

    dimensiones. Para hacer referencia a cada componente del arreglo es necesario

    utilizar n ndices, uno para cada dimensin. C permite arreglos de ms de dos

    dimensiones. La forma general de declaracin de un arreglo multidimensional es:

    tipo nombre [Tamao1][Tamao2][Tamao3]...[TamaoN];

    Operaciones con Arreglos Unidimensionales

    Las operaciones en arreglos pueden clasificarse de la siguiente forma:

    Inicializacin

    Lectura

    Escritura

    Asignacin

    Inicializacin

    C permite la inicializacin de arreglos en el momento de declararlos. La

    forma general de inicializacin de un arreglo, que aparece a continuacin, es

    similar a la de otras variables:

    especificador_de_tipo nombre_de_arreglo [tamao1 ]...[tamao N]= {lista_de_valores};

    La lista_de_valores es una lista de constantes separadas por comas cuyo

    tipo es compatible con el especificador_de_tipo. La primera constante se coloca

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 16

    en la primera posicin del arreglo, la segunda constante en la segunda posicin,

    y as sucesivamente. Obsrvese que un punto y coma sigue a }.

    En el ejemplo que sigue se inicializa un arreglo de enteros de 10 elementos

    con los nmeros del 1 al 10:

    int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    Inicializacin de arreglos no delimitados

    Como se podr suponer, resulta tedioso contar los caracteres de cada

    mensaje manualmente para determinar la dimensin correcta del arreglo. Se

    puede hacer que el compilador calcule automticamente las dimensiones de los

    arreglos. Si en una instruccin de inicializacin de un arreglo no se especifica el

    tamao del arreglo, el compilador automticamente crea un arreglo

    suficientemente grande para mantener todos los inicializadores presentes. Esto es

    lo que se denomina arreglo no delimitado.

    char mensaje[26] = Bienvenido al Sistema;

    Adems de ser menos tedioso, el uso de la inicializacin de arreglos no

    delimitados permite cambiar cualquiera de los mensajes sin temor a teclear una

    cuenta incorrecta accidentalmente. El uso de inicializaciones de arreglos no

    delimitados no est restringido a los arreglos unidimensionales.

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 17

    Lectura

    Este proceso consiste en leer un dato de un arreglo y asignar un valor a

    cada uno de sus componentes. La lectura se realiza de la siguiente manera:

    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]);

    Escritura

    Consiste en imprimir o mostrar por pantalla el valor de cada posicin del

    arreglo. La escritura se realiza de la siguiente manera:

    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]);

    Asignacin

    No es posible asignar directamente un valor a todo el arreglo, por lo que se

    realiza de la manera siguiente:

    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;

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 18

    Operaciones con Arreglos Bidimensionales

    Las operaciones en arreglos bidimensionales pueden clasificarse de la

    siguiente forma:

    Inicializacin

    Lectura

    Escritura

    Asignacin

    Inicializacin

    Los arreglos multidimensionales se inicializan del mismo modo que los

    unidimensionales. Por ejemplo, lo siguiente inicializa cuads con los nmeros del 1

    al 10 y sus cuadrados.

    int cuads[10] [2] = { 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81, 10, 100,

    };

    Cuando se inicializan arreglos multidimensionales se pueden aadir llaves

    para encerrar los inicializadores de cada dimensin. Esto se denomina

    agrupamiento subagregado. Por ejemplo, la declaracin anterior se podra haber

    escrito tambin como:

    int cuads[10][2] = { {1, 1}, {2, 4}, {3, 9}, {4, 16}, {5, 25},

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 19

    {6, 36}};

    Cuando se utiliza agrupamiento subagregado, si no se proporcionan

    suficientes inicializadores para un grupo dado, los restantes miembros se inicializan

    a cero automticamente.

    Inicializacin de arreglos no delimitados

    Para los arreglos multidimensionales se deben especificar todas excepto la

    dimensin ms a la izquierda. (Las otras dimensiones se necesitan permitir al

    compilador de C indexar el arreglo adecuadamente.) De este modo se puede

    construir tablas de longitudes variables, y el compilador asignar

    automticamente suficiente espacio para ellas. Por ejemplo, a continuacin se

    muestra la inicializacin del arreglo no delimitado cuads:

    int cuads[] [2] = { 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81, 10, 100,

    };

    La ventaja de esta declaracin sobre la versin de tamao delimitado es

    que la tabla puede alargarse o acortarse sin tener que cambiar las dimensiones

    del arreglo.

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 20

    Lectura

    Este proceso consiste en leer un dato de un arreglo y asignar un valor a

    cada uno de sus componentes. La lectura se realiza de la siguiente manera:

    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]); } }

    Escritura

    Consiste en imprimir o mostrar por pantalla el valor de cada posicin del

    arreglo. La escritura se realiza de la siguiente manera:

    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]); } }

    Asignacin

    No es posible asignar directamente un valor a todo el arreglo, por lo que se

    realiza de la manera siguiente:

    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; } }

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 21

    Ordenacin y Bsqueda

    La ordenacin y bsqueda de elementos son tareas que se realizan

    frecuentemente en el procesamiento de datos, esto debido a que muchas

    actividades humanas requieren que a diferentes colecciones de datos utilizados

    se pongan en un orden especfico y se localicen de manera rpida; ejemplos

    claros son las oficinas de correos y las empresas de mensajera que ordenan el

    correo y los paquetes por cdigos postales, con el fin de conseguir una entrega

    eficiente. Lo que supone un rea interesante e intrnseca desde el punto de vista

    terico y prctico en la programacin. Por tal motivo esta unidad est dedicada

    a estudiar los mtodos de ordenamiento y bsqueda, as como su

    implementacin en el lenguaje C.

    Rutinas de Ordenamiento

    1. Ordenacin por intercambio: es el mtodo ms sencillo, ordena los elementos de una lista en orden ascendente. La tcnica se basa en la

    lectura sucesiva de la lista a ordenar, comparando el elemento inferior de

    la lista con los restantes y efectuando intercambio de posiciones cuando el

    orden resultante de la comparacin no sea correcto. El funcionamiento de

    este mtodo se puede observar grficamente a continuacin:

    Se tiene el siguiente arreglo a:

    En la iteracin 0 ocurrira lo siguiente:

    8 4 6 2

    Se realiza intercambio 4 8 6 2

    4 8 6 2

    No se realiza intercambio 4 8 6 2

    4 8 6 2

    Se realiza intercambio 2 8 6 4

    8 4 6 2

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 22

    Vector inicial Vector resultante

    En la iteracin 1 pasara lo siguiente:

    2 8 6 4

    Se realiza intercambio 2 6 8 4

    2 6 8 4

    Se realiza intercambio 2 4 8 6

    Vector inicial Vector resultante

    En la iteracin 2 se tendra:

    2 4 8 6

    Se realiza intercambio 2 4 6 8

    Vector inicial Vector resultante

    Implementacin 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. Ordenacin por seleccin: El funcionamiento de este mtodo se puede observar grficamente a continuacin: considrese un arreglo a con 5

    valores enteros:

    51 21 39 80 35

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 23

    51 21 39 80 35

    Iteracin 0 Seleccionar 21 e intercambiar 21 y a[0]

    21 51 39 80 35

    Iteracin 1 Seleccionar 35 e intercambiar 35 y a[1]

    21 35 39 80 51

    Iteracin 2 Seleccionar 39 e intercambiar 39 y a[2]

    21 35 39 80 51

    Iteracin 3 Seleccionar 51 e intercambiar 35 y a[3]

    21 35 39 51 80

    Iteracin 4 Lista ordenada

    Despus de observar grficamente el mtodo se puede deducir lo siguiente:

    El mtodo selecciona el elemento ms pequeo de la lista a. Lo

    intercambia con el primer elemento a[0]. Ahora el valor ms pequeo est

    en la primera posicin del vector.

    Considerar las posiciones de la lista a[1], a[2], a[3],, seleccionar el

    elemento ms pequeo e intercambiarlo con a[1]. Ahora los dos valores

    ms pequeos de a estn en orden.

    Continuar este proceso encontrando o seleccionando el elemento ms

    pequeo de los restantes intercambiarlos adecuadamente.

    Implementacin 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; } } } }

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 24

    3. Ordenacin por insercin: El funcionamiento de este mtodo se puede

    observar grficamente a continuacin:

    50

    Comienzo con 50

    20 50

    Se inserta 20 en la posicin 0 y 50 se mueve a la

    posicin 1

    20 40 50

    Se inserta 40 en la posicin 1 y 50 se mueve a la

    posicin 2

    20 40 50 80

    Se inserta 80 en la posicin 3

    20 30 40 50 80

    Se inserta 30 en la posicin 1 y se desplaza a la

    derecha la sublista derecha

    Despus de observar grficamente el mtodo se puede deducir lo siguiente:

    El primer elemento a[0] se considera ordenado; es decir, la lista inicial

    consta de un elemento.

    Se inserta a[1] en la posicin correcta; delante o detrs de a[0],

    dependiendo de que sea menor o mayor. Es decir, se explora la lista desde

    a[i] hasta a[n] buscando la posicin correcta de destino; esto es la posicin

    a insertar dentro de la lista ordenada.

    Por cada iteracin se mueve hacia a la derecha del vector todos los

    elementos mayores que la posicin a insertar, para dejar vaca esa

    posicin.

    Insertar ele elemento en la posicin correcta.

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 25

    Implementacin 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

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 26

    20 40 50 80 30

    Intercambio 80 y 30

    20 40 50 30 80

    Elemento mayor es 80

    En la iteracin 1 se tiene:

    20 40 50 30 80

    20 y 40 ordenados

    20 40 50 30 80

    40 y 50 ordenados

    20 40 50 30 80

    Intercambio 50 y 30

    20 40 30 50 80

    50 y 80 elementos mayores ordenados

    En la iteracin 2 se tiene:

    20 40 30 50 80

    20 y 40 ordenados

    20 40 30 50 80

    Intercambio 40 y 30

    20 30 40 50 80

    40, 50 y 80 elementos mayores ordenados

    En la iteracin 3 se tiene:

    20 30 40 50 80

    20 y 30 ordenados

    20 30 40 50 80

    Lista ordenada

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 27

    Implementacin 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 Bsqueda

    1. Bsqueda secuencial: esta bsqueda trata de buscar un elemento de un

    arreglo utilizando un valor destino llamado clave. En una bsqueda

    secuencial, los elementos de una lista o vector se exploran en secuencia, es

    decir uno despus del otro. Este mtodo compara cada elemento del

    arreglo con la clave de bsqueda. Dado que el vector no est en un orden

    prefijado, es probable que el elemento a buscar pueda ser el primero, el

    ltimo o cualquier otro.

    El siguiente ejemplo especifica grficamente el mtodo, en la cual

    se trata de buscar el elemento 6 en el siguiente arreglo a:

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 28

    10 05 31 22 06

    6 valor devuelto ndice 4

    Implementacin del mtodo en C:

    int busqueda_secuencial(int a[], int n, int clave) { int i; for(i=0; i

  • Objetivo 1.- Arreglos, Cadenas de Caracteres, Rutinas de Ordenamiento y Rutinas de Bsqueda

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 29

    120 275 325 510

    El ltimo valor de la primera mitad es

    275, la bsqueda contina con la

    primera mitad de elementos.

    120 275

    El ltimo valor de la primera mitad es

    120, que es ms pequeo que el valor

    que se est buscando, la bsqueda

    contina con la segunda mitad de

    elementos.

    275

    Se observa por ltimo que no ha

    habido xito en la bsqueda ya que

    228 es distinto a 275

    Implementacin del mtodo en C:

    int busquedabinaria (int a[], int bajo, int alto, int clave) { int central, valorcentral; while(bajo

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 30

    Cuando se habla de modularidad en Lenguaje C se emplea el trmino

    funcin que no es ms que una seccin de cdigo independiente que genera un

    conjunto de eventos derivados de una posterior llamada en una parte de la

    seccin principal del programa, lo que conlleva que se pueda trabajar en una

    forma ms ordenada y generando aplicaciones ms robustas y poderosas

    combinando ejecuciones iterativas y/o recursivas.

    Aqu desarrollaremos los siguientes tems:

    Introduccin

    Definicin

    Declaracin

    Tipos de Funciones

    Llamadas a una Funcin

    Salidas de una Funcin

    Paso de parmetros a una Funcin

    Por valor

    Por referencia

    Visibilidad de las Funciones

    Recursividad

    Ventajas

    Inconvenientes

    Solucin Iterativa vs Solucin Recursiva

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 31

    Definicin

    Una funcin es una parte de cdigo independiente del programa principal

    y de otras funciones, que puede ser llamada envindole unos datos (o sin enviarle

    nada), para que realice una determinada tarea y/o proporcione unos resultados.

    La forma general de definicin de una funcin es:

    tipo nombre(lista de parmetros) { cuerpo de la funcin

    }

    El tipo especifica el tipo de valor que devuelve la sentencia return de la

    funcin. El valor puede ser cualquier tipo vlido; si no se especifica ninguno, se

    asume un resultado entero. La lista de parmetros es la lista de nombres de

    variables separados por comas con sus tipos asociados que reciben los valores de

    los argumentos cuando se llama a la funcin. Una funcin puede no tener

    parmetros, en cuyo caso la lista de parmetros est vaca; sin embargo, los

    parntesis son necesarios.

    Declaracin

    Cada funcin debe ser declarada. Su forma general es: tipo

    nombre_funcin (lista de tipos (y nombres) de los argumentos); si una funcin va

    usar argumentos, debe declarar variables que acepten los valores de los

    argumentos. Estas variables se llaman parmetros formales de la funcin y se

    comportan como variables locales dentro de la funcin, crendose al entrar en la

    funcin y destruyndose al salir. La declaracin de parmetros aparece despus

    del nombre de la funcin al definirla. Los parmetros formales tienen que ser del

    mismo tipo que los argumentos usados al llamar una funcin (el compilador no

    dar error pero los resultados sern inesperados).

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 32

    Al igual que con variables locales, se pueden hacer asignaciones a los

    parmetros de una funcin o usarlos en cualquier expresin vlida. Se pueden

    usar como cualquier otra variable.

    Una funcin es visible para ella misma y otras funciones desde el momento

    en que se define. Es visible para el propio cuerpo de la funcin, es decir, la

    recursividad est permitida. El cdigo de una funcin es privado a esa funcin y

    slo se puede acceder a l mediante una llamada a esa funcin. Las variables

    definidas dentro de una funcin son locales (a no ser que las definamos globales)

    por lo que no conservan su valor de una llamada a otra (excepto si se declaran

    como static, entonces el compilador no las destruye y almacena su valor para la

    prxima llamada, aunque la variable tiene limitado el mbito al interior de la

    funcin).

    En C, todas las funciones estn al mismo nivel, es decir, no se puede definir

    una funcin dentro de otra funcin. Esto es por lo que C no es tcnicamente un

    lenguaje estructurado por bloques.

    El cdigo de una funcin es privado a esa funcin y slo se puede acceder

    a l mediante una llamada a esa funcin. Las variables definidas dentro de una

    funcin son locales (a no ser que las definamos globales) por lo que no conservan

    su valor de una llamada a otra (excepto si se declaran como static, entonces el

    compilador no las destruye y almacena su valor para la prxima llamada, aunque

    la variable tiene limitado el mbito al interior de la funcin).

    Tipos de Funciones

    Muchos autores establecen la siguiente clasificacin a la hora de tipificar

    las funciones en Lenguaje C:

    a. Funciones que no tienen parmetros y que no devuelven ningn

    valor: Son aquellas que no tienen parmetros de entrada, realizan

    acciones en su cuerpo de programa y no devuelven ningn valor.

    Utilizan la palabra reservada void como tipificador de datos

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 33

    Ejemplo:

    void mostrar(void) { printf("Despliegue de datos"); return; }

    b. Funciones que tienen parmetros y que no devuelven ningn valor:

    Son aquellas que tienen parmetros de entrada, realizan acciones

    en su cuerpo de programa y no devuelven ningn valor. Utilizan

    cualquiera de las palabras reservadas como tipificadores de datos

    a nivel de los parmetros de entrada en cuanto a la funcin su

    tipificador es void

    Ejemplo:

    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 que no tienen parmetros y que devuelven valor: Son

    aquellas que no tienen parmetros de entrada, realizan acciones en

    su cuerpo de programa y devuelven algn valor. Utilizan cualquiera

    de las palabras reservadas como tipificadores de datos a nivel de

    funcin.

    Ejemplo:

    int suma(void) { int a=10, b=20, suma; suma = a+b; return suma; }

    d. Funciones que tienen parmetros y que devuelven valor: Son

    aquellas que tienen parmetros de entrada, realizan acciones en su

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 34

    cuerpo de programa y devuelven algn valor. Utilizan cualquiera de

    las palabras reservadas como tipificadores de datos a nivel de los

    parmetros de entrada y de funcin

    Ejemplo:

    int suma(int a, int b) { int sumando; sumando = a+b; return sumando; }

    Llamadas a Funciones

    Las funciones son llamadas para su ejecucin desde cualquier parte del

    cdigo, teniendo en cuenta que antes deben haber sido declaradas (y por

    supuesto definidas).

    La llamada de una funcin se produce mediante el uso de su nombre en

    una sentencia, pasando una lista de argumentos que deben coincidir en nmero

    y tipo con los especificados en la declaracin (en otro caso se producira una

    conversin de tipos o resultados inesperados).

    En general, se pueden pasar argumentos a las funciones de dos formas, por

    valor y por referencia.

    La llamada por valor copia el valor de un argumento en el parmetro

    formal de la funcin. De esta forma, los cambios en los parmetros de la funcin

    no afectan a las variables que se usan en la llamada (es la llamada ms usual, es

    decir, en general no se pueden alterar las variables usadas para llamar a la

    funcin).

    La llamada por referencia copia la direccin del argumento en el

    parmetro. Dentro de la funcin se usa la direccin para acceder al argumento

    usado, significando que los cambios hechos a los parmetros afectan a la

    variable usada en la llamada.

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 35

    Es posible simular una llamada por referencia pasando un puntero al

    argumento, entonces, al pasar la direccin, es posible cambiar el valor de la

    variable usada en la llamada.

    Ejemplo:

    #include

    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

    Para salir de un funcin se utiliza la sentencia return que produce la salida

    inmediata de la funcin hacia el cdigo que la invoc. La sentencia puede

    devolver un valor acorde con el tipo usado al declarar la funcin que puede ser

    una constante, una variable o una expresin. En caso de obviarse la sentencia

    return, la funcin terminar con se ejecucin de la ltima instruccin. En este caso

    la funcin devuelve el valor cero a excepcin de las funciones de tipo void, que

    no devuelve ningn valor.

    Ejemplo:

    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*/

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 36

    { int sum; sum = a+b; return sum; /*sale de la funcin*/ }

    Paso de parmetros a una Funcin

    Los parmetros formales de una funcin son variables locales que se crean

    al comenzar la funcin y se destruyen cuando termina. El tipo de dato de cada

    parmetro formal debe ser el mismo que el tipo de los argumentos se utilicen al

    llamar a la funcin. Este error no se detecta en la compilacin y para remediarlo,

    se deben usar los prototipos de funciones. El nico caso en el que los tipos pueden

    no coincidir los parmetros formales y los argumentos es cuando el argumento es

    de tipo char y el parmetros formal es de tipo int; la conversin, en este caso, se

    hace a int. Los parmetros de una funcin pueden ser valores (llamada por valor)

    o direcciones (llamada por referencia)

    Por valor: El parmetro de la funcin recibe el valor de la variable que

    se utiliza como argumento. Cualquier modificacin sobre estos

    parmetros no afecta a las variables que se utilizan para llamar a la

    funcin, puesto que el parmetro en estos casos es una copia de la

    variable. Solo se pueden pasar por valor los tipos atmicos, es decir no

    son arrays ni estructuras.

    Ejm:

    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); }

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 37

    Por referencia: Cuando un argumento es una direccin, el parmetro

    recibe la direccin de la variable que se ha pasado como argumento

    al invocar a la funcin. Por lo tanto, el parmetro deber declararse

    como un puntero y de esta forma se puede modificar el contenido de

    las variables. Si una funcin tiene que devolver ms de un valor, lo har

    utilizando sus parmetros y necesariamente los argumentos deben

    pasarse por referencia.

    Ejm:

    a)

    void cursor(int *x, int *y); main() { int fila, columna;

    cursor(&fila, &columna);

    }

    void cursor(int *x, int *y) { ....

    *x =20; .....

    }

    b)

    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; }

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 38

    Visibilidad de una Funcin

    Una funcin declarada en un archivo tiene un alcance global; es

    decir, se puede invocarla desde cualquier punto dentro este archivo.

    Cuando se quiere acceder a ella desde otro archivo, hay que incluir

    en este ltimo la declaracin de dicha funcin. A diferencia de las

    variables externas, donde es necesario modificar el tipo de

    almacenamiento mediante la palabra reservada extern, las funciones no

    necesitan de este modificador: una funcin puede ser invocada desde

    cualquier mdulo. El uso de la palabra extern se usa para facilitar la

    compresin del cdigo. Si quiere restringir el uso de la funcin a un solo

    mdulo, se usa el modificador static en su declaracin. Esta caracterstica

    permite disear mdulos con informacin y herramientas privadas.

    Recursividad

    Hasta ahora se ha trabajado en lenguaje C dando soluciones

    iterativas a nuestros algoritmos. Con este estudio de la recursividad se

    pretende que se entienda la diferencia entre una solucin iterativa y su

    versin recursiva viendo las ventajas e inconvenientes que la utilizacin de

    una u otra aportan. Ejm: Cmo disear una funcin que calcule la

    potencia de X? Se puede llegar al siguiente planteamiento:

    Se podra pensar en la frmula de la potencia de la manera siguiente:

    pot(X,n) = X pot(X, n-1)

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 39

    pot(X,n-1) = X pot(X, n-2)

    .

    .

    pot(X,0) = 1

    Se dice que es recursiva ya que la definicin se da en trminos de

    una versin ms pequea de s misma. Un algoritmo recursivo es un

    algoritmo que expresa la solucin de un problema en trminos de una

    llamada a s mismo. La llamada a s mismo se conoce como llamada

    recursiva.

    Ejemplo:

    void funcionRecursiva(int a) {

    funcionRecursiva(a+1);

    }

    Para que un algoritmo recursivo no se convierta en infinito debe

    contener una condicin que garantice la terminacin del algoritmo

    recursivo en un tiempo finito. Es lo que se conoce como CONDICIN DE

    PARADA, que debe hacer que no se generen ms llamadas recursivas.

    Tambin debe contener un PASO DE LA RECURSIVIDAD, que

    garantice que al ejecutar el algoritmo recursivo se tiende a la condicin de

    parada. Una funcin declarada en un archivo tiene un alcance global; es

    decir, se puede invocarla desde cualquier punto dentro este archivo.

    Cuando se quiere acceder a ella desde otro archivo, hay que incluir en

    este ltimo la declaracin de dicha funcin. A diferencia de las variables

    externas, donde es necesario modificar el tipo de almacenamiento

    mediante la palabra reservada extern, las funciones no necesitan de este

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 40

    modificador: una funcin puede ser invocada desde cualquier mdulo. El

    uso de la palabra extern se usa para facilitar la compresin del cdigo. Si

    quiere restringir el uso de la funcin a un solo mdulo, se usa el modificador

    static en su declaracin. Esta caracterstica permite disear mdulos con

    informacin y herramientas privadas.

    Ventajas

    Proporciona simplicidad en la comprensin de los problemas.

    Es un mtodo natural de resolver problemas.

    Permite una gran potencia de clculo.

    La correccin de los algoritmos se comprueba fcilmente.

    Inconvenientes

    Aumenta el consumo de recursos de la mquina (sobre todo de la

    pila).

    Es ms lenta que las soluciones iterativas equivalentes (siempre que

    exista 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

    En las llamadas a funciones:

    Los parmetros que se pasan

    Las variables locales de las funciones

    La direccin de retorno de esa llamada (la instruccin del algoritmo

    llamante a ejecutar cuando finalice la ejecucin del algoritmo

    llamado)

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 41

    Se almacenan en la pila del programa.

    Solucin Iterativa vs Solucin Recursiva

    Algoritmo que dado un nmero imprime 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);

    }

    Informacin que aparece por pantalla si se hace la llamada a la

    funcin decrementa (5):

    5 4 3 2 1 Fin del algoritmo iterativo

    Solucin recursiva void decrementa(int a) {

    if (a>0) //CONDICIN DE PARADA: a==0 {

    printf(%d ,a); decrementa(a-1); /*PASO DE LA RECURSIVIDAD*/

    } else printf(Fin del algoritmo recursivo \n);

    }

    Informacin que aparece por pantalla si se hace la llamada a la

    funcin decrementa (5):

    5 4 3 2 1 Fin del algoritmo recursivo

    La siguiente figura ilustra la ejecucin paso a paso del algoritmo recursivo:

    A la vuelta de la recursividad no se ejecuta ninguna sentencia.

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 42

    Dado el siguiente ejemplo analice el caso e indique la secuencia de

    valores que se imprimen.

    void main(void) {

    P7(5); } void P7(int a) {

    printf(%d \t,a); if (a>0) //CONDICIN DE PARADA, a==0 {

    a--; P7(a); //PASO DE LA RECURSIVIDAD

    } printf(%d \t,a);/*Cundo se ejecuta esta sentencia */

    }

    La siguiente figura muestra la ejecucin paso a paso del algoritmo anterior:

    A la vuelta de la recursividad se ejecuta la sentencia:

    printf(%d \t,a); /* (2) */

    Informacin que aparece por pantalla

    5 4 3 2 1 0 0 0 1 2 3 4

    Calcule la funcin factorial de forma iterativa y recursiva.

  • Objetivo 2.- Funciones y Recursividad

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 43

    Solucin Iterativa Solucin Recursiva

    int factorial(int n)

    {

    int i;

    int fact=1;

    for (i= n; i>0 ;i--)

    fact=fact*(i);

    return(fact);

    }

    int factorial(int n)

    {

    int fact;

    if (n == 0) /* CONDICIN DE PARADA */

    fact = 1;

    else

    fact = n * factorial (n - 1); /* PASO DE LA RECURSIVIDAD */

    return(fact);

    }

    Seguimiento de la versin recursiva de la funcin factorial:

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 44

    En los cursos de programacin el estudio de los punteros siempre se ha

    considerado un reto para los alumnos, tanto en el aprendizaje como en su

    aplicacin. En el lenguaje de programacin C, los apuntadores son una de las

    caractersticas ms poderosas y tiles, en el desarrollo de programas. El manejo

    de punteros requiere que el alumno modifique su forma de pensar con respecto

    al uso de los identificadores. Los punteros son variables que almacenan como

    valor la direccin de memoria que ocupa otro dato (una variable, constante,

    elementos de arreglos, funciones, entre otras); en otras palabras, los punteros

    hacen referencia a un tipo de dato almacenado en memoria.

    Esta capacidad de los punteros permite que referencias a funciones,

    puedan ser utilizadas como argumentos en el llamado a otra funcin.

    Los punteros guardan una relacin muy estrecha con los arreglos y

    cadenas, proporcionando una va alternativa para acceder a los elementos

    individuales del arreglo. Los punteros son el elemento fundamental en la creacin

    de estructuras de datos dinmicas (listas, pilas, colas, listas enlazadas, rboles y

    grafos), a travs de la asignacin dinmica de memoria.

    Aqu desarrollaremos los siguientes tems:

    Definicin

    Naturaleza de los Punteros

    Declaracin

    Inicializacin

    Operaciones de Direccin e Indireccin

    Aritmtica de Punteros

    Relacin entre Arreglos y Punteros

    Punteros y Funciones

    Precauciones con el uso de Punteros

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 45

    Definicin

    Un puntero o un apuntador es una variable que almacena como dato la

    direccin de memoria de otro identificador como puede ser un arreglo, una

    funcin u otra variable. Los punteros son variables que almacenan como valor la

    direccin de memoria que ocupa otro dato (una variable, constante, elementos

    de arreglos, funciones, entre otras); en otras palabras, los punteros hacen

    referencia a un tipo de dato almacenado en memoria. Esta capacidad de los

    punteros permite que referencias a funciones, puedan ser utilizadas como

    argumentos en el llamado a otra funcin.

    Hasta los momentos habamos visto variables cuyos datos podan ser

    valores de tipo numrico, alfanumrico y lgico o booleanos, ahora estamos

    conociendo otro tipo de dato, como lo son las direcciones de memoria, que son

    capaces de almacenarlas en una variable especial conocida como apuntador.

    Los punteros pueden ser usados para:

    Fundamentalmente son usados para el manejo de memoria en

    forma dinmica, permitiendo un uso ms eficiente de este recurso.

    Comunicar informacin entre una funcin y sus puntos de llamada.

    Permite devolver varios datos desde una funcin mediante los

    argumentos de la funcin.

    Permiten que referencias a otras funciones puedan ser especificadas

    como argumentos de otra funcin. (pasar funciones 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.

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 46

    Representan de una forma ms conveniente los arreglos

    multidimensionales, permitiendo que un arreglo multidimensional sea

    reemplazado por un array de punteros de menor dimensin.

    Son el soporte de enlace que utilizan estructuras avanzadas de

    datos en memoria dinmica como las listas, pilas, colas y rboles.

    Naturaleza de los Punteros

    Entender cmo trabajan los punteros requiere un repaso de cmo se

    almacenan los datos en memoria. Primero debemos recordar que la memoria

    est compuesta por celdas de memoria y cada celda posee dos reas, una que

    es la direccin (valor fijo permite identificar la posicin de dicha celda) y la otra es

    la informacin (dato almacenado en la celda). Al momento de declarar una

    variable, por ejemplo int x, el compilador le asigna a x una direccin de memoria,

    fija, donde almacenar su valor. Los valores almacenados en memoria ocupan

    una o ms celdas contiguas de memoria (palabras o bytes adyacentes). El

    nmero de celdas de memoria requeridas para almacenar un valor depende del

    tipo de dato. Por ejemplo, un carcter ser almacenado en 1 byte (8 bits) de

    memoria; un entero normalmente necesita 2 bytes continuos. Un valor punto

    flotante puede necesitar 4 u 8 bytes. Para acceder a un valor de una variable,

    almacenado en memoria, se hace mencin al nombre de la variable.

    int x; x = 4; printf("%d",x);

    Hay dos operadores de apuntadores: & y *. & es un operador monario que

    devuelve la direccin de memoria de su operando. (Recurdese que un

    operador monario slo necesita un operando.)

    Celda de Memoria Direccin x Valor x

    F8E 4

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 47

    El segundo operador de apuntadores, *, es el complemento de &. Es un

    operador monario que devuelve el valor que se encuentra en la direccin que le

    sigue.

    Ejemplo:

    Supongamos que v es una variable que representa un determinado dato.

    El compilador automticamente asignar celdas de memoria para este

    dato. Podemos acceder a los datos si conocemos su localizacin (la direccin)

    de la primera celda de memoria. La direccin de memoria de v puede se

    determinada mediante la expresin &v. Ahora vamos asignar la direccin de v a

    otra variable llamada, pv. As, pv = &v

    Esta nueva variable (pv) es un puntero a v, puesto que a la

    posicin de memoria donde se almacena v, pv representa la direccin de v y no

    su valor, pv es referida como una variable apuntadora, La relacin entre v y pv

    est ilustrada en la figura siguiente

    Direccin de v Valor de v

    pv v

    El dato representado por v (es decir, el dato almacenado en las celdas de

    memoria de v) puede ser accedido mediante la expresin *pv, donde * es el

    operador indireccin, que opera slo sobre una variable puntero. Por tanto; *pv y

    v representa el mismo dato (el contenido de las mismas celdas de memoria).

    Declaracin

    Cuando se declara un puntero, como es una variable, el compilador

    tambin le asigna celdas de memoria fija, pero el dato que almacena es la

    direccin de memoria de otro identificador, que posee el mismo tipo de dato que

    el puntero. Los punteros, como son identificadores, al ser declarados deben tener

    un tipo de dato asociado (numrico, alfanumrico o lgico), y este tipo de dato

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 48

    debe ser igual al tipo de dato de la variable que ocupa la direccin de memoria

    que el puntero almacena. Para declarar un puntero se realiza igual que el resto

    de las variables, pero al nombre del puntero le precede el smbolo * (asterisco),

    que leeremos puntero a. Entonces se dice que un puntero apunta a un tipo de

    datos especfico.

    Sintaxis:

    * ;

    equivale a

    *;

    Donde:

    Tipo_dato: Es el tipo de dato del puntero.

    Nombre_puntero: Es el nombre del puntero

    Ejemplo:

    int* : es un tipo de dato puntero a enteros.

    float *: es un tipo de dato puntero a datos tipo float.

    float* ptry; ptry, es un puntero que apunta a tipos de datos float.

    int *ptrx; ptrx, es un puntero que apunta a tipos de datos enteros.

    Tambin se puede decir:

    *ptrx, es una variable que almacena direcciones de memoria que

    contienen tipos de datos int (enteros).

    *ptry, es una variable que almacena direcciones de memoria que

    contienen tipos de datos float.

    Se debe tener muy claro que "ptrx" es una variable del tipo "puntero a int",

    que "*ptrx" NO es una variable de tipo "int".

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 49

    Declaraciones de Punteros

    int *PuntAInt; // Tipo puntero a enteros (int)

    char *PuntACar; // Tipo puntero a caracteres (char)

    double *punto; // Tipo puntero a double

    Un puntero, puede apuntar a cualquier tipo de dato definido por el usuario,

    no slo a tipos simples. Es muy importante tener en cuenta que primero debe

    declararse el tipo de datos al que apunta (un array, clase, funcin, etc.) y

    despus el tipo de datos puntero.

    Inicializacin

    Como pasa con todas las variables en C, cuando se declara un puntero

    slo se reserva el espacio de memoria para almacenarlo, pero no se asigna

    ningn valor inicial, el contenido de la variable puntero permanecer sin cambios,

    de modo que el valor inicial del puntero ser aleatorio e indeterminado

    (denominado comnmente como basura). Debemos suponer que contiene una

    direccin no vlida de memoria. Al intentar realizar operaciones con punteros NO

    INICIALIZADOS, ocurrir un error no slo en el programa, sino tambin en el

    sistema operativo, porque se intenta acceder a una direccin de memoria NO

    EXISTENTE o NO VLIDA. Todos los punteros deben ser inicializados antes de ser

    utilizados.

    A las variables de tipo punteros slo pueden asignrseles:

    el valor cero (0 o la constante NULL ),

    otro puntero con el mismo tipo de dato,

    una direccin de memoria de una variable que posea el mismo tipo

    de dato que el puntero. Las direcciones de memoria deben ser

    asignadas slo con el operador de direccin & (ampersand).

    Punteros Nulos:

    int *ptrx = 0;

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 50

    float *ptry = NULL;

    int *ptrz;

    Es posible realizar la asignacin de un puntero a otro, si ambos son del

    mismo tipo de datos.

    ptrz = ptrx; //el puntero ptrz recibe la direccin de memoria que tiene

    almacenada el puntero ptrx.

    Operadores de Direccin e Indireccin

    Operador de Direccin o Referencia. (Operador &). Es un operador monario

    (slo requiere un operando) que devuelve la direccin de memoria del

    operando, es decir, lo que hace es devolver la direccin que en memoria ocupa

    el objeto sobre el que se aplica. Literalmente significa la direccin de.

    Un ejemplo de su uso para inicializar un puntero es:

    int x =10;

    int *ptrx = &x;

    ptrx, posee como valor la direccin de memoria que ocupa la

    variable x.

    Entonces se dice que ptrx apunta a x

    Celda de Memoria ptrx Direccin Valor 0xF8E 0xF8A

    Celda de Memoria x Direccin Valor 0xF8A 10

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 51

    La representacin grfica

    Este operador NO es aplicable a expresiones constantes, pues stas no se

    almacenan en ninguna direccin de memoria especfica sino que se incrustan en

    las instrucciones. Por ello, no es vlido hacer directamente:

    int px = &10; // Error 10 no es una variable con direccin propia

    Tampoco es vlido aplicar & a variables declaradas con la clase de

    almacenamiento register, ni campos de slo lectura (readonly), pues si stos

    pudiesen ser apuntados por punteros se correra el riesgo de poderlos modificar

    ya que a travs de un puntero se accede a memoria directamente, sin tenerse en

    cuenta si en la posicin accedida hay algn objeto, por lo que mucho menos se

    considerar si ste es de slo lectura.

    NOTA: El operador & puede aplicarse slo a operandos lvalue (algo a lo

    que se puede asignar un valor, como una variable).

    Operador de Indireccin o Desreferencia de memoria. (Operador *): Es un

    operador monario que acta slo sobre operandos de tipo puntero. Este

    operador devuelve el valor de la variable a la que apunta el puntero. Es decir,

    devuelve el valor almacenado en la direccin de memoria apuntada por el

    puntero. Literalmente significa el valor de.

    Ejemplo:

    int x = 10;

    int *ptrx = &x;

    int z ;

    z = *ptrx ; // se asigna a la variable z el valor 10.

    Puntero Variable

    ptrx x

    10

    x ptrx

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 52

    Con el operador de Indireccin (*), tambin se pueden asignar valores a

    una direccin de memoria apuntada por un puntero, es decir, se puede alterar el

    valor de la variable a la que apunta un puntero.

    Ejemplo:

    int x = 10;

    int *ptrx = &x;

    *ptrx = 30; // se asigna a la variable x el valor 30.

    NOTA: No debemos confundir el operador * en la declaracin

    del puntero (int *p), con el operador * (asterisco) en las

    instrucciones (*p=10 o z=*p).

    No se puede desreferenciar un puntero NULL, produce un error en tiempo

    de ejecucin.

    Ejemplo referenciando:

    #include

    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; }

    Tras la secuencia de asignaciones

    p1 = &x;

    p2 = p1;

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 53

    tanto p1 como p2 apuntan a x. Por tanto, tanto p1 como p2 se refieren al

    mismo objeto. A continuacin se muestra un ejemplo de salida del programa,

    confirmando esto.

    Valores apuntados por p1 y p2: 99 99

    Direcciones en p1 y p2: 0063FE00 0063FE00

    Obsrvese que las direcciones se muestran usando el modificador de

    formato de printf( ) %p. que hace que printf( ) muestre una direccin en el

    formato utilizado por la computadora en cuestin.

    Ejemplo desreferenciando:

    { int* puntero; int variable;

    puntero = &variable; *puntero = 33; /* mismo efecto que variable=33 */ }

    Varios apuntadores pueden apuntar a la misma variable:

    int* puntero1; int* puntero2; int var;

    puntero1 = &var; puntero2 = &var; *puntero1 = 50; /* mismo efecto que var=50 */ var = *puntero2 + 13; /* var=50+13 */

    Aritmtica de Punteros

    Los Apuntadores pueden ser utilizados como operandos vlidos en los

    siguientes tipos de expresiones:

    Aritmticas.

    Relacionales.

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 54

    Los apuntadores no pueden ser utilizados como operandos vlidos con

    todos los operadores. Los apuntadores slo pueden realizar:

    Operaciones Aritmticas:

    o Sumarle o restarle un valor entero: Incremento/Decremento.

    Ejemplo:

    ptrx++; ptrx--; ++ptrx; --ptrx;

    ptrx=ptrx+5 ; ptrx=ptrx-4; ptrx+=3; ptrx-=2;

    o Restar un apuntador de otro. Resta de direcciones de

    memoria.

    Ejemplo:

    ptrx = ptrx ptry;

    Operaciones Relacionales: Es posible comparar dos variables de tipo

    puntero en una expresin relacional, usando operaciones

    relacionales de igualdad (= =), desigualdad (!=) y comparacin (, ==).

    La aritmtica de punteros, tiene sentido slo cuando el puntero posee

    asignado varias direcciones continuas de memoria, es decir, cuando se ejecuta

    sobre un arreglo. Es muy poco probable que dos variables de un mismo tipo de

    datos posean direcciones contiguas de memoria a no ser que sean elementos

    adyacentes que formen parte de un arreglo.

    Ejemplo

    # include void main() { int *px, *py; static int a[6]= { 1, 2, 3, 4, 5, 6]; px=&a[0]: py=&a[5]:

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 55

    printf (px=%x py%x, px, py); printf (\n\npy- px=%x, py - px); }

    La ejecucin del programa produce la siguientes salida: px=52 py=5c py px=5

    Relacin entre Arreglos y Punteros

    Los nombres de los arreglos, son un tipo especial de punteros, que apuntan

    a la direccin de memoria del primer elemento del arreglo. Recordemos que los

    arreglos poseen elementos almacenados en direcciones contiguas de memoria.

    Cada elemento del arreglo posee una direccin de memoria.

    Ejemplo:

    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 puntero, que

    apunta, a la primera direccin de memoria del arreglo. Por lo tanto se est

    realizando una asignacin de punteros. Cualquier posicin de un elemento en el

    arreglo se puede obtener con el operador de direccin.

    ptrv = &v[4]; //ptrv apunta a la posicin 4 del arreglo.

    ptrv = &v[7]; //ptrv apunta a la posicin 7 del arreglo.

    Con aritmtica de punteros, es posible acceder a la direccin de cada

    elemento del arreglo.

    Ejemplo: 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]

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 56

    En ambos casos, ptrv no modifica la direccin de memoria a la que

    apunta.

    En la aritmtica de punteros la sumatoria de enteros a memorias (ptrv + n)

    se realiza en base a la cantidad de bytes del tipo de datos del puntero (ptrv + n*

    t_bytes).

    Tipos Datos Tamao Byte (mquina 16 bits) Tamao Byte (mquina 32 bits)

    char 1 byte 1 byte

    int 2 bytes 4 bytes

    long 4 bytes 4 bytes

    float 4 bytes 4 bytes

    Si el arreglo es de tipo int, cada posicin del arreglo ocupa 2 bytes de

    memoria (mquinas de 16 bits), por lo tanto avanza (ptrv + (2 * 2))

    En el siguiente ejemplo se inicia en la primera posicin

    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 Operaciones con Punteros

    1. A una variable puntero se le puede asignar la direccin de memoria

    de una variable ordinaria (pv=&p).

    2. A una variable puntero se le puede asignar el valor de otra variable

    puntero (pv=py), siempre y cuando ambos punteros apunten al

    1 5 1 8 2 0 4 6

    200 200 200200200200 200200200

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 57

    mismo tipo de datos o que el puntero pv sea un puntero genrico

    (puntero a void).

    3. A una variable puntero se le puede asignar un valor nulo (cero)

    (pv=NULL, NULL es una constante simblica con valor cero).

    4. Una cantidad entera puede ser sumada o restada a una variable

    puntero (px+3, pv++).

    5. Una variable puntero puede ser restada de otra siempre y cuando

    ambas apunten a elementos del mismo arreglo.

    6. Dos variables punteros pueden ser comparadas siempre que ambas

    apunten a datos del mismo tipo de datos.

    Punteros y Funciones

    Un rea en la cual desempean un papel prominente los apuntadores, en

    el lenguaje C, es en la transmisin de parmetros a funciones. Por lo comn, los

    parmetros se transmiten por valor a una funcin en C, es decir, se copian los

    valores transmitidos en los parmetros de la funcin llamada en el momento en

    que se invoca. Si cambia el valor de un parmetro dentro de la funcin, no

    cambia su valor en el programa que la llama. Por ejemplo considrese el siguiente

    fragmento:

    ...

    X=5; printf (%d\n, x); funct(x); printf(%d\n, x); ...

    void funct (int y) { ++y; printf(%d\n,y); return; }

    La ejecucin del programa sera: imprime el nmero 5 y despus llama a

    funct. El valor de "x", que es 5, se copia en "y" y comienza la ejecucin de funct.

    Despus, imprime el nmero 6 y regresa funct. Sin embargo, cuando se

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 58

    incrementa el valor de "y", el valor de "x" permanece invariable. As, imprime el

    nmero 5, "x" y "y" refieren a 2 variables diferentes.

    Si deseamos usar funct para modificar el valor de "x", debemos de transmitir

    la direccin de "x" de la siguiente manera:

    ...

    X=5; printf (%d\n, x); funct(&x); printf(%d\n, x); ...

    void funct (int *py) { ++(*py); printf(%d\n, *py); return; }

    La ejecucin del programa sera: Imprime nuevamente el nmero 5, y la

    lnea 4 llama a funct. Ahora, sin embargo, el valor transferido no es el valor entero

    de "x" sino el valor apuntador "&x". Este es la direccin de "x". El parmetro de

    funct no es ms y de tipo int, sino py de tipo int * . (Es conveniente nombrar a las

    variables apuntadores comenzando con la letra p para recordar tanto que se

    trata de un apuntador) la lnea 9 ahora aumenta al entero en la localidad py; py,

    sin embargo, no cambia y conserva su valor inicial "&x". As, py apunta al entero

    "x" de tal manera que cuando *py, aumenta x. Luego se imprime 6 y cuando

    regresa funct, imprime tambin 6. Los apuntadores son el mecanismo usado en el

    lenguaje C para permitir a una funcin llamada modificar las variables de la

    funcin que llama.

    Precauciones con los Apuntadores

    Apuntadores No Inicializados:

    Si se altera el valor al que apunta un puntero no inicializado, se

    estar modificando cualquier posicin de la memoria.

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 59

    main() { int* puntero; *puntero = 1200; /* Se machaca una zona cualquiera de la memoria */ }

    Confusin De Tipos:

    Un puntero a un tipo determinado puede apuntar a una variable de

    cualquier otro tipo. Aunque el compilador lo puede advertir, no es un error.

    (Afortunadamente, esto no ocurre en C++).

    main() { int p; double numero; int* puntero;

    p = &numero; /* incorrecto, pero el compilador no aborta */ *p = 33; /* Un desastre */ }

    Apuntadores a variables locales fuera de mbito:

    Si un puntero apunta a una variable local, cuando la variable

    desaparezca el puntero apuntar a una zona de memoria que se estar

    usando para otros fines. Si se des-referencia el puntero, los resultados son

    imprevisibles y a menudo catastrficos.

    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 */

  • Objetivo 3.- Punteros o Apuntadores

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 60

    puntero = 50; /* catstrofe */ }

  • Objetivo 4.- Estructuras

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 61

    El uso de estructuras como una representacin o aproximacin de

    registros de datos, ha sido una de las herramientas ms idneas usada en

    la Programacin Estructurada para poder agrupar varios tipos de datos

    primitivos en un solo a la final.

    Aqu desarrollaremos los siguientes tems:

    Conceptos Bsicos

    Acceso a los componentes de una estructura.

    Arreglos de Estructuras

    Estructuras Anidadas

    Apuntadores a estructuras.

    Paso de estructuras a las funciones.

  • Objetivo 4.- Estructuras

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 62

    Conceptos Bsicos

    Una Estructura es una coleccin de variables simples, que pueden contener

    diferentes tipos de datos. Es un tipo de dato definido por el usuario. Son tambin

    conocidas como Registros.

    Ayudan a organizar y manejar datos complicados en programas debido a

    que agrupan diferentes tipos de datos a las que se les trata como una sola

    unidad en lugar de ser vistas como unidades separadas.

    En C se forma una estructura utilizando la palabra reservada struct, seguida

    por un campo etiqueta opcional, y luego una lista de miembros dentro de la

    estructura. La etiqueta opcional se utiliza para crear otras variables del tipo

    particular de la estructura:

    struct campo_etiqueta{ tipo_miembro miembro_1; tipo_miembro miembro_2; tipo_miembro miembro_3; : : tipo_miembro miembro_n; };

    Un punto y coma finaliza la definicin de una estructura puesto que sta es

    realmente una sentencia C. Algunos de los ejemplos usan la estructura:

    struct stbarco{ char tipo[15]; char modelo[15]; char titular[20]; int anno; long int horas_motor; float precioventa; };

    En un programa, podemos asociar una variable con una estructura

    utilizando una sentencia similar a la siguiente:

    struct stbarco stbarco_usado;

  • Objetivo 4.- Estructuras

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 63

    La sentencia define stbarco_usado de tipo struct stbarco. La declaracin

    requiere el uso del campo etiqueta de la estructura. Si esta sentencia est

    contenida dentro de una funcin, entonces la estructura, llamada stbarco_usado,

    tiene un mbito local a esa funcin. Si la sentencia est contenida fuera de todas

    las funciones de programa, la estructura tendr un mbito global. Es posible

    declarar una variable usando esta sintaxis:

    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 punto y coma final. Cuando

    se asocia slo una variable con el tipo estructura, el campo etiqueta puede ser

    eliminado, por lo que sera posible escribir:

    struct { char tipo[15]; char modelo[15]; char titular[20]; int anno; long int horas_motor; float precioventa; };stbarco_usado;

    Acceso a los Componentes de una Estructura

    Para accesar a los miembros de las estructuras se usa el punto u operador

    miembro (.). La sintaxis es:

    estructuraNombre.miembroNombre

    Por ejemplo en:

    gets(stbarco_usado.modelo);

    Aqu, stbarco_usado es el nombre asociado con la estructura, y modelo es

    una variable miembro de la estructura, otro ejemplo:

  • Objetivo 4.- Estructuras

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 64

    gets(stbarco_usado.tipo);

    Esta sentencia leer la marca del stbarco_usado en el arreglo de

    caracteres, mientras la prxima sentencia imprimir el precio de venta de

    stbarco_usado en la pantalla.

    printf(%f, stbarco_usado.precioventa);

    Ejemplo de estructuras:

    #include #include 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 ( ); }

  • Objetivo 4.- Estructuras

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 65

    Arreglos de Estructuras

    Pueden ser construidas, es decir, conceptuar a los elementos de un arreglo

    como estructuras, esto se puede hacer de la siguiente manera:

    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*/

    Para tener acceso a una determinada estructura, se indexa el nombre de

    la estructura de la siguiente manera: alumnos[i].nombre; aqu sabemos el nombre

    del alumno que se encuentra en la posicin i del arreglo, y de esta manera para

    todos los datos.

    Estructuras Anidadas

    Una estructura puede contener otras estructuras llamadas estructuras

    anidadas. Las estructuras anidadas ahorran tiempo en la escritura de programas

    que utilizan estructuras similares. Se han de definir los miembros comunes solo una

    vez en su propia estructura y a continuacin utilizar es estructura como un

    miembro de estructura. Consideremos las siguientes dos definiciones de

    estructuras:

    struct empleado { char nombre_emp[30];

    char direccion[25]; char ciudad[20]; char provincia[20]; long int cod_postal; double salario;

    };

    struct clientes {

  • Objetivo 4.- Estructuras

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 66

    char nombre_cliente[30]; char direccion[25]; char ciudad[20]; char provincia[20]; long int cod_postal; double saldo;

    };

    Estas estructuras contienen muchos datos diferentes, aunque hay

    datos que estn solapados. As, se podra disponer 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;

    }; Esta estructura se puede utilizar como miembro de las otras

    estructuras, es decir anidarse.

    struct empleado { char nombre_emp[30];

    struct info_dir direccion_emp; double salario;

    };

    struct clientes { char nombre_cliente[30];

    struct info_dir direccion_clien; double saldo;

    };

    Apuntadores a Estructuras

    Un puntero tambin puede apuntarse a una estructura. Se puede

    declarar un puntero a una estructura tal como se declara un puntero a

    cualquier otro objeto y se declara un puntero estructura tal como se

    declara cualquier otra variable estructura: especificando un puntero en

    lugar del nombre de la variable estructura.

    struct persona {

  • Objetivo 4.- Estructuras

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 67

    char nombre[30]; int edad; int altura; int peso;

    }; struct persona empleado; struct persona persona *p; p = &empleado;

    Cuando se referencia un miembro de la estructura utilizando el

    nombre de la estructura, se especifica la estructura y el nombre del

    miembro separado por un punto (.). Para referenciar el nombre de una

    persona, utilice empleado.nombre. Se referencia una estructura utilizando el puntero estructura. Se utiliza el operador -> para acceder a un miembro de

    ella.

    Paso de Estructuras a las Funciones

    C permite pasar estructuras a funciones, bien por valor o bien por

    referencia utilizando el operador &. Si la estructura es grande, el tiempo

    necesario para copiar un parmetro struct a la pila puede ser prohibitivo.

    En tales casos, se debe considerar el mtodo de pasar la direccin

    de la estructura. El siguiente programa muestra el pase de la direccin de

    una estructura a una funcin para entrada de datos.

    La misma variable la pasa por valor a otra funcin para salida de los

    campos.

    #include /*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*/

  • Objetivo 4.- Estructuras

    Recopilado por: Docentes del rea de Programacin / Trayecto I / Trimestre II Unidad Curricular: Algoritmia y Programacin Mdulo: Programacin I Pgina 68

    void entrad_pna(struct info_persona *pp); void ver_info(struct info_persona p); void main ( ) { struct info_persona reg_dat; entrad_pna(&reg_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