You are on page 1of 21

DISEO DE PROYECTOS

Presentado por LUIS ENRIQUE GOMEZ MONTAA

Al tutor HAROLD JARAMILLO

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA CEAD GIRARDOT SEPTIEMBRE DE 2011

INTRODUCCION A LA PROGRAMACION Captulo 1 Revisin de conceptos generales de programacin

Programacin: Es un proceso mediante el cual se convierten especificaciones generales de la solucin de un problema, en instrucciones que el computador puede interpretar y que producen los resultados deseados (desarrollo de software). Programa: Lista de instrucciones que el computador sigue para convertir datos en informacin. Estas dependen del lenguaje de programacin que se utilice. Un programa debe ser: Confiable y funcional Comprensible Documentado Fases para la creacin de un programa Definicin del problema: clara y precisa Anlisis del problema: requiere identificar Datos de salida (informacin que debe producir el programa). Datos de entrada (datos que debe suministrar el usuario para lograr los resultados esperados. Datos de proceso (frmulas necesarias para procesar los datos)

Diseo de la solucin: Lista ordenada y cronolgica de los pasos a seguir para lograr resultados (diagramas de flujo, pseudocdigo, etc.). Debe ser simple, clara, precisa, exacta, tener un orden lgico e indicar su inicio y final. Codificacin: Escribir la solucin del problema en un lenguaje de programacin (traducir el diagrama de flujo o pseudocdigo en instrucciones que puedan ser interpretadas por el computador). Prueba y depuracin: ejecutar el software para identificar y eliminar los errores (de sintaxis o de tipo lgico). Documentacin: gua que facilita futuras modificaciones del software.

Programacin estructurada: Se caracteriza por organizar las instrucciones de manera secuencial, de tal manera que es posible leer la codificacin desde el inicio hasta el final en forma continua sin saltar de un lugar a otro, siguiendo el camino lgico establecido por el programador. En este paradigma de programacin se debe prestar especial atencin a la etapa de diseo de la solucin, una vez establecidos los pasos secuenciales, la codificacin es ms fcil. Caractersticas: la estructura del programa se realiza de la manera ms clara y precisa posible, para ello utiliza: Secuencia: Sucesin simple de operaciones Seleccin: Bifurcacin condicional de una o ms operaciones Iteracin: Repeticin de tareas mientras se cumple una o ms condiciones Ventajas: Tiene una estructura clara y por ende una buena presentacin. Es ms fcil de comprender Facilita la revisin de la codificacin Reduce el tiempo de prueba y depuracin Identacin: utilizacin de sangras (espacios) para facilitar la lectura del programa puesto que muestra en forma grfica las relaciones entre las instrucciones. Para aprovechar la Identacin en un programa en C++ se sugiere: Escribir en la misma columna los indicadores de inicio y fin de cada bloque de sentencias. Utilizar diferentes sangras para indicar anidamientos de instrucciones. Escribir una instruccin por lnea Lenguaje de Programacin C Segn Cesar Becerra: C es un lenguaje de nivel medio: combina elementos de lenguajes de alto nivel con la funcionalidad del ensamblador. Su cdigo es transportable: funciona en equipos APPLE como en IBM.

Es estructurado: permite el uso de subrutinas (parte del cdigo que maneja sus propias variables y que pueden ser llamadas en diferentes partes del programa principal). Funcionalidad: en un comienzo se utiliz por su potencia y eficacia en programas de sistemas (sistemas operativos, interpretes, editores, ensambladores, compiladores, administradores de bases de datos); pero actualmente para todo tipo de desarrollos. C es compilador, los lenguajes al ser ejecutados pueden interpretarse (lnea a lnea), o compilarse (utiliza compilador para ejecutarse, todo el programa fuente se convierte en programa objeto, de manera que el compilador lo ejecuta directamente). Estructura general de un programa en Lenguaje C Un programa en C++ est constituido bsicamente por: Directivas del pre-procesador: [declaracin de variables globales] [prototipos de funciones] Funcin main [definiciones de funciones] Directivas del Pre-procesador: En este se encuentra Los archivos de cabecera que permiten indicarle al compilador que se va a hacer uso de las funcionalidades que proporcionan ciertas bibliotecas (en este caso predefinidas). Por ejemplo para emplear la biblioteca de entrada/salida iostream s e d e b e incluir iostream.h. #include <iostream.h> Declaracin de variables y constantes globales: Las variables y constantes globales son aquellas cuyo valor afecta a todo el programa. Cabecera de funciones: Se realiza una descripcin a manera de prototipo de las funciones que se crearan ms adelante. Funcin main(): Todo programa escrito en C++ est constituido por funciones, y la funcin principal es main(). Definicin de funciones: Es necesario crear las funciones que se definieron. Declaracin de variables y constantes globales: Las variables y constantes globales son aquellas cuyo valor afecta a todo el programa.

Cabecera de funciones: Se realiza una descripcin a manera de prototipo de las funciones que se crearan ms adelante. Funcin main(): Todo programa escrito en C++ est constituido por funciones, y la funcin principal es main(). Definicin de funciones: Es necesario crear las funciones que se definieron como prototipos para darle viabilidad al programa. Sentencias: cada una de las ordenes que se le da al compilador por medio del lenguaje para que efectu una accin. Definicin de Compilador Un traductor es cualquier programa que toma como entrada un texto escrito en un lenguaje, llamado fuente y da como salida otro texto en un lenguaje, denominado objeto. En el caso de que el lenguaje fuente sea un lenguaje de programacin de alto nivel y el objeto sea un lenguaje de bajo nivel (ensamblador o cdigo de mquina), a dicho traductor se le denomina compilador. Un ensamblador es un compilador cuyo lenguaje fuente es el lenguaje ensamblador. Un intrprete no genera un programa equivalente, sino que toma una sentencia del programa fuente en un lenguaje de alto nivel y la traduce al cdigo equivalente y al mismo tiempo lo ejecuta. Histricamente, con la escasez de memoria de los primeros ordenadores, se puso de moda el uso de intrpretes frente a los compiladores, pues el programa fuente sin traducir y el intrprete juntos daban una ocupacin de memoria menor que la resultante de los compiladores. Por ello los primeros ordenadores personales iban siempre acompaados de un intrprete de BASIC (Spectrum, Commodore VIC-20, PC XT de IBM, etc.). La mejor informacin sobre los errores por parte del compilador as como una mayor velocidad de ejecucin del cdigo resultante hizo que poco a poco se impusieran los compiladores. Hoy en da, y con el problema de la memoria prcticamente resuelto, se puede hablar de un gran predominio de los compiladores frente a los intrpretes, aunque intrpretes como los incluidos en los navegadores de Internet para interpretar el cdigo JVM de Java son la gran excepcin. Ventajas de compilar frente a interpretar: Se compila una vez, se ejecuta n veces. En bucles, la compilacin genera cdigo equivalente al bucle, pero interpretndolo se traduce tantas veces una lnea como veces se repite el bucle. El compilador tiene una visin global del programa, por

Ventajas del intrprete frente al compilador: Un intrprete necesita menos memoria que un compilador. En principio eran ms abundantes dado que los ordenadores tenan poca memoria. Permiten una mayor interactividad con el cdigo en tiempo de desarrollo. Un compilador no es un programa que funciona de manera aislada, sino que necesita de otros programas para conseguir su objetivo: obtener un programa ejecutable a partir de un programa fuente en un lenguaje de alto nivel. Algunos de esos programas son el preprocesador, el linker, el depurador y el ensamblador. El preprocesador se ocupa (dependiendo del lenguaje) de incluir ficheros, expandir macros, eliminar comentarios, y otras tareas similares. El linker se encarga de construir el fichero ejecutable aadiendo al fichero objeto generado por el compilador las cabeceras necesarias y las funciones de librera utilizadas por el programa fuente. El depurador permite, si el compilador ha generado adecuadamente el programa objeto, seguir paso a paso la ejecucin de un programa. Finalmente, muchos compiladores, en vez de generar cdigo objeto, generan un programa en lenguaje ensamblador que debe despus convertirse en un ejecutable mediante un programa ensamblador.

El compilador C ++ DIRECTIVA INCLUDE (Archivos con extensin h): Los archivos con extensin h (Ejemplo: stdio.h, conio.h etc) se llaman archivos de cabecera, contienen informacin tcnica que requiere el compilador para la buena operacin de las funciones que usan los programas. Un programa necesita directivas para incluir archivos, algunas de ellas son: #include <stdio.h> #include <conio.h> Los archivos con extensin h vienen con el compilador. Pero tambin el programador puede crear archivos propios, de este tipo. DIRECTIVA #define: (Definicin de Macros) La directiva #define se utiliza para definir un identificador y una cadena que ser sustituida cada vez que se ut i l i ce el identificador que se use en el programa. Al identificador se le denomina nombre de la macro y al proceso de reemplazamiento sustitucin de macro.

E l siguiente programa est usando directivas para incluir (macro) constantes. Ejemplos: #define mensaje El sistema no tiene Solucin Otro tipo de macro podra ser: #define CIERTO 1 #define FALSO 0 Una vez se define una macro se puede usar el nombre de ella como parte de la definicin de otra, ejemplo: #define UNO 1 #define DOS UNO + UNO #define TRES UNO + DOS Declaracin de Variables Antes del main() o despus de l se deben definir las variables, ejemplo: float a, b, x; Las variables que se declaran dentro del main() se dice que son variables locales, las que se declaran fuera se dicen globales, cuando se analice el concepto de funcin se ampliar la diferencia entre estos tipos de variables. La siguiente tabla muestra los distintos tipos de dato que se pueden usar en C para declarar variables. TIPOS DE DATOS BASICOS RECONOCIDOS POR TURBO C TAMAO RANGO en Bytes de la de valores que puede Cuando usamos variable almacenar char 1 0 . . 255 . . . Z, $ int 2 -32767 . . 322768 Para almacenar nmeros enteros double 8 1.7E-308. . 1.7E308 Para almacenar nmeros reales float 4 3E-38. . 3E38 Variables que almacenan nmeros reales pointer 2 Punteros near,_es,_es, ss Para variables que guardan direcciones de memoria long double 10 3.4E-4932 a 1.1 E 4932 Variables reales Tipos de datos bsicos TIPO

Depuracin de Programas La depuracin permite determinar las causas de los errores y por tanto facilita la correccin de los mismos, en un programa determinado. El proceso de depuracin 1. Estudio de los sntomas del error 2. Determinacin de las causas 3. Correccin 4. Prueba. Pueden existir varias causas de error que se pueden agrupar en dos grandes grupos: 1. Errores de sintaxis 2. Errores lgicos: Para el primer caso, al momento de compilar el programa, este detecta los errores y es posible corregirlos.

Ventana de compilacin Los errores lgicos son ms difciles de corregir, pues el compilador no los detecta. Un ejemplo vlido se muestra al analizar un programa para el pago de la nmina de 500 empleados, se produce una equivocacin a la hora de hacer la frmula de los descuentos, en lugar de realizar la resta se hace una suma. Como se puede ver en este ejemplo es un error muy grave, pero de anlisis y no de sintaxis, por lo tanto el

programa no lo detectar. Por lo tanto es indispensable realizar una buena interpretacin del problema para desarrollar el diseo y codificacin del programa.

CAPITULO 2 FUNCIONES La forma ms razonable de encarar el desarrollo de un programa complicado es aplicar lo que se ha dado en llamar "Programacin Top-Down". Esto implica que, luego de conocer cual es la meta a alcanzar, se subdivide esta en otras varias tareas concurrentes, por ejemplo: Leer un teclado, procesar datos, mostrar los resultados. Luego a estas se las vuelve a dividir en otras menores: Y as se contina hasta llegar a tener un gran conjunto de pequeas y simples tareas, del tipo de "leer una tecla" "imprimir un carcter". Luego slo resta abocarse a resolver cada una de ellas por separado. De esta forma el programador, slo se las tendr que ver con diminutas piezas de programa, de pocas lneas, cuya escritura y correccin posterior es una tarea simple. Tal es el criterio con que est estructurado el lenguaje C, donde una de sus herramientas fundamentales son las funciones. Todo compilador comercial trae una gran cantidad de Libreras de toda ndole, matemticas, de entrada - salida, de manejo de textos, de manejo de grficos, etc., que solucionan la mayor parte de los problemas bsicos de programacin. Sin embargo ser inevitable que en algn momento tenga que crear mis propias funciones, las reglas para ello son las que desarrollaremos en este captulo. Comencemos con algunos conceptos bsicos: para hacer que las instrucciones contenidas en una funcin, se ejecuten en determinado momento, no es necesario ms que escribir su nombre como una lnea de sentencia en mi programa. Convencionalmente en C los nombres de las funciones se escriben en minscula y siguen las reglas dadas anteriormente para los de las variables, pero deben ser seguidos, para diferenciarlas de aquellas por un par de parntesis Definicin de una Funcin La definicin de una funcin puede ubicarse en cualquier lugar del programa, con slo dos restricciones: debe hallarse luego de dar su prototipo, y no puede estar dentro de la definicin de otra funcin (incluida main() ). Es decir que a diferencia de Pascal, en C las definiciones no pueden anidarse. N OTA: no confundir definicin con llamada; una funcin puede llamar a tantas otras como desee. La definicin debe comenzar con un encabezamiento, que debe coincidir totalmente con el prototipo declarado para la misma, y a continuacin del mismo, encerradas por llaves se escribirn las sentencias que la componen; por ejemplo:

#include <stdio.h> float mi_funcion(int i, double j ); /* DECLARACION observe que termina en ";" */ main() { float k ; int p ; double z ; ........... k = mi_funcion( p, z ); /* LLAMADA a la funcin */ ........... } /* fin de la funcin main() */ float mi_funcion(int i, double j ) /* DEFINICION observe que NO lleva ";" */ { float n ................... printf("%d", i ); /* LLAMADA a otra funcin */ ................... return ( 2 * n ); /* RETORNO devolviendo un valor float */ } Ahora se describirn ms puntualmente las distintas modalidades que adoptan las funciones. Declaracin de una Funcin Antes de escribir una funcin es necesario informarle al Compilador los tamaos de los valores que se le enviarn en el stack y el tamao de los valores que ella retornar al programa invocante. Estas informaciones estn contenidas en la DECLARACION del PROTOTIPO DE LA FUNCION. Formalmente dicha declaracin queda dada por: tipo del valor de retorno nombre_de_la_funcin(lista de tipos de parmetros) A lgunos ejemplos : float mi_funcion(int i, double j ) ; double otra_funcion(void) ; otra_mas(long p) ; void la_ultima(long double z, char y, int x, unsigned long w) ; El primer trmino del prototipo da, como hemos visto el tipo del dato retornado por la funcin; en caso de obviarse el mismo se toma, por omisin, el tipo int. Sin embargo, aunque la funcin devuelva este tipo de dato, para evitar malas interpretaciones es conveniente explicitarlo.

Ya que el "default" del tipo de retorno es el int, debemos indicar cuando la funcin NO retorna nada, esto se realiza por medio de la palabra VOID (sin valor). De la misma manera se acta, cuando no se le enviarn argumentos. Ms adelante se profundizar sobre el tema de los argumentos y sus caractersticas. La declaracin debe anteceder en el programa a la definicin de la funcin. Es normal, por razones de legibilidad de la documentacin, encontrar todas las declaraciones de las funciones usadas en el programa, en el HEADER del mismo, junto con los include de los archivos *.h que tienen los prototipos de las funciones de Librera. Si una ms de nuestras funciones es usada habitualmente, podemos disponer su prototipo en un archivo de texto, e incluirlo las veces que necesitemos, segn se vio en captulos previos. Llamados de Funcin Una vez que en su programa se ha definido una funcin, esta puede ser llamada las veces que sean necesarias. Para llamar a una funcin basta con hacer referencia a su nombre y si la misma requiere de parmetros estos debern indicarse dentro de parntesis. Para llamar a una funcin que no requiera de parmetros se deber indicar el nombre de la misma seguida de parntesis vacios. Por ejemplo, para llamar a la funcin cuadrado() vista anteriormente, podemos emplear: cout << cuadrado(25); cout << cuadrado(X); R = cuadrado(X); // guardar en R el cuadrado de X Prototipos Para utilizar una funcin en un programa, se requiere en primer lugar declararla y despus definirla. La declaracin de la funcin le indica al compilador el nombre, el tipo de dato devuelto por la funcin y los parmetros pasados a la funcin. A la declaracin de una funcin se le llama tambin el prototipo Un prototipo es una declaracin de una funcin. Consistente simplemente en el encabezado de la funcin, terminado con punto y coma (;) lo que hace es avisar al compilador, como se va a llamar la funcin y si recibe y devuelve informacin. La estructura de un prototipo es: <tipo> func(<lista de declaracin de parmetros>); Ejemplo: int Mayor(int a, int b);// es un prototipo de funcin que devuelve un entero y recibe dos parmetros enteros.

Aunque C++ permite realizar el prototipo de la siguiente manera: int Mayor(int,int); Sin necesidad de escribir el nombre de las variables; entonces La estructura de un programa en C++ quedara as: [directivas del pre-procesador: includes y defines] [declaracin de variables y constantes globales] [prototipos de funciones] [declaraciones de clases] funcin main () [definiciones de funciones]//definidas en los prototipos [definiciones de clases] Recursividad Esta es la propiedad que tienen las funciones en C++ de poder llamarse a s mismas. Se dice que una funcin es recursiva cuando se autollama. No todas las funciones pueden llamarse a s mismas (ser recursivas), deben estar diseadas especialmente para que tengan un final y no se conviertan en ciclos o bucles infinitos. Es importante notar que cuando una funcin se llama a s misma, una nueva copia de esta funcin es la que se ejecuta. Las variables locales de la segunda f uncin no interfieren con las variables locales de la primera, as mismo, las variables locales no se pueden afectar mutuamente. Tomemos como ejemplo un programa que calcule el factorial de un nmero entero introducido por el usuario. El factorial est definido como el producto del nmero en cuestin por todos los nmeros enteros menores que l, de tal manera que el factorial de 5=5*4*3*2*1 = 120. El cdigo puede quedar as: #include <iostream.h> double factorial(int valor); int K=1; // variable global, para un contador general int main() { int num; cout << "Introduzca un numero" << endl; cin >> num; cout << endl; cout << El factorial del nmero es << factorial(num) << endl; cout << "La funcin se llamo en forma recursiva " << k << " veces" << endl; return 0; } double factorial(int valor) { double R; if(valor<=1) return 1; else {

R= (valor*factorial(valor-1)); K = K+1; } return resultado; } 1. La funcin se declara de tipo doble, puesto que los valores que retorna la funcin pueden ser demasiado grandes. 2. Tambin se utiliza una variable global (K), que sirve de contador, para determinar el nmero de iteraciones que la funcin se repite. 3. El programa empieza solicitndole un nmero entero y despus llama por primera vez a la funcin factorial ( ). La recursividad necesita una condicin para terminar el proceso en el momento especifico, por sta razn, la funcin factorial () determina en primer lugar si el valor pasado como parmetro de la funcin es igual a 1, en cuyo caso la funcin retorna 1. Si el valor del parmetro es mayor que 1, entonces la funcin factorial ( ) se llama a s misma tomando como parmetro el valor original menos uno, multiplicando ste valor por el valor del parmetro original y almacenando el resultado en la variable llamada resultado. (se recomienda realizar una prueba de escritorio para entender un poco ms el movimiento de la funcin y sus iteraciones)

CAPITULO 3 APUNTADORES Los apuntadores son una parte fundamental de C. Si usted no puede usar los apuntadores apropiadamente entonces est perdiendo la potencia y la flexibilidad que C ofrece bsicamente. El secreto para C esta en el uso de apuntadores. C usa los apuntadores en forma extensiva PORQUE Es la nica forma de expresar algunos clculos. Se genera cdigo compacto y eficiente. Es una herramienta muy poderosa. C usa apuntadores explcitamente con: Arreglos, Estructuras y Funciones Declaracin de Apuntador Apuntador: es una variable a la que se asigna una direccin de memoria. El apuntador debe definirse con el mismo tipo de la variable a la cual apunta. Ejemplo: si se define la variable llamada X, de tipo entero, el apuntador que contendr su direccin debe ser de tipo entero, as: int X; \\ define la variable X de tipo entero int *px; \\ define un variable tipo puntero llamada px Definicin de un apuntador: para diferenciar un apuntador de otra variable, al nombre del puntero se le antepone un asterisco (*) Ejemplo: int *px; Al definir un apuntador o puntero, este contiene una direccin que no indica una variable conocida, si se desea que contenga la direccin de una variable, esta se debe asignar. La sintaxis es: px=&x; con esta instruccin ahora se tiene almacenado en px la direccin de memoria donde se encuentra la variable x. A la variable x, se le debe asignar un valor, porque hasta el momento esta vaca. Esto se puede hacer de dos formas: X=10; *px = 10;

Se debe tener claro que de acuerdo a las asignaciones que se realicen, se van a presentar diferencias en el contenido de las variables y los apuntadores. Ej. int x, *px; px = &x; \\ asigna a px la direccin de la variable x *px = 10; \\ asigna el valor 10 a la variable x, es lo mismo que decir x = 10. \\ Prcticamente la expresin *px es la variable x. Ejercicio: analizar el siguiente programa: void main ( ) void main ( ) { int x, *px; { int x, *px; px = &x; px = &x; *px = 0; x = 0; *px = *px + 5; x = x + 5; x = *px 1; x = x 1; printf ( %d %d , x, *px ); printf ( %d %d , x, *px ); getch ( ); getch ( ); }} Situar un asterisco delante del nombre de una variable. char *ptr1; //puntero a un char "utilizado para las cadenas de longitud variable". int *ptr2; //puntero a un entero. float *ptr3; //puntero a un float int *p1, num1, num2, *p2; //punteros a enteros *p1, *p2 Recuperar direccin del puntero. Situar & delante de variable. Definicin de un Apuntador Un apuntador es una variable que contiene la direccin en memoria de otra variable. Se pueden tener apuntadores a cualquier tipo de variable. El operador unario o mondico & devuelve la direccin de memoria de una variable. El operador de indireccin o dereferencia * devuelve el ``contenido de un objeto apuntado por un apuntador''. Para declarar un apuntador para una variable entera hacer: int *apuntador; Se debe asociar a cada apuntador un tipo particular. Por ejemplo, no se puede asignar la direccin de un short int a un long int.

Para tener una mejor idea, considerar el siguiente cdigo: main() { int x = 1, y = 2; int *ap; ap = &x; y = *ap; x = ap; *ap = 3; } Cuando se compile el cdigo se mostrar el siguiente mensaje: warning: assignment makes integer from pointer without a cast. Con el objetivo de entender el comportamiento del cdigo supongamos que la variable x est en la localidad de la memoria 100, y en 200 y ap en 1000. Nota: un apuntador es una variable, por lo tanto, sus valores necesitan ser guardados en algn lado. int x = 1, y = 2; int *ap; ap = &x; 100 x 1 y 200 2 ap 1000 100

Las variables x e y son declaradas e inicializadas con 1 y 2 respectivamente, ap es declarado como un apuntador a entero y se le asigna la direccin de x (&x). Por lo que ap se carga con el valor 100. y = *ap; 100 x 1 y 200 1 ap 1000 100

de memoria 100 -- la localidad de x. Por lo tanto, y obtiene el valor de x -- el cual es 1. x = ap; 100 x 100 y 200 1 ap 1000 100

Como se ha visto C no es muy estricto en la asignacin de valores de diferente tipo (apuntador a entero). As que es perfectamente legal (aunque el compilador genera un aviso de cuidado) asigna el valor actual de ap a la variable x. El valor de ap en ese momento es 100. *ap = 3; 100 x 3 y 200 1 ap 1000 100

Finalmente se asigna un valor al contenido de un apuntador (*ap). Importante: Cuando un apuntador es declarado apunta a algn lado. Se debe inicializar el apuntador antes de usarlo. Por lo que: main() { int *ap; *ap = 100; } puede generar un error en tiempo de ejecucin o presentar un comportamiento errtico. El uso correcto ser: main() { int *ap; int x; ap = &x; *ap = 100; } Con los apuntadores se puede realizar tambin aritmtica entera, por ejemplo: main() { float *flp, *flq; *flp = *flp + 10; ++*flp; (*flp)++; flq = flp; } NOTA: Un apuntador a cualquier tipo de variables es una direccin en memoria la cual es una direccin entera, pero un apuntador NO es un entero.

La razn por la cual se asocia un apuntador a un tipo de dato, es porque se debe conocer en cuntos bytes est guardado el dato. De tal forma, que cuando se incrementa un apuntador, se incrementa el apuntador por un ``bloque'' de memoria, en donde el bloque est en funcin del tamao del dato. Por lo tanto para un apuntador a un char, se agrega un byte a la direccin y para un apuntador a entero o a flotante se agregan 4 bytes. De esta forma si a un apuntador a flotante se le suman 2, el apuntador entonces se mueve dos posiciones float que equivalen a 8 bytes. Apuntadores y Funciones Cuando C pasa argumentos a funciones, los pasa por valor, es decir, si el parmetro es modificado dentro de la funcin, una vez que termina la funcin el valor pasado de la variable permanece inalterado. Hay muchos casos que se quiere alterar el argumento pasado a la funcin y recibir el nuevo valor una vez que la funcin ha terminado. Para hacer lo anterior se debe usar una llamada por referencia, en C se puede simular pasando un puntero al argumento. Con esto se provoca que la computadora pase la direccin del argumento a la funcin. Para entender mejor lo anterior consideremos la funcin swap() que intercambia el valor de dos argumentos enteros: void swap(int *px, int *py); main() { int x, y; x = 10; y = 20; printf("x=%d\ty=%d\n",x,y); swap(&x, &y); printf("x=%d\ty=%d\n",x,y); } void swap(int *px, int *py) { int temp; temp = *px; /* guarda el valor de la direccion x */ *px = *py; /* pone y en x */ *py = temp; /* pone x en y */ } Apuntadores y Arreglos Existe una relacin estrecha entre los punteros y los arreglos. En C, un nombre de un arreglo es un ndice a la direccin de comienzo del arreglo. En esencia, el nombre de un arreglo es un puntero al arreglo. Considerar lo siguiente:

int a[10], x; int *ap; ap = &a[0]; /* ap apunta a la direccin de a[0] */ x = *ap; /* A x se le asigna el contenido de ap (a[0] en este caso) */ *(ap + 1) = 100; /* Se asigna al segundo elemento de 'a' el valor 100 usando ap*/ Como se puede observar en el ejemplo la sentencia a[t] es idntica a ap+t. Se debe tener cuidado ya que C no hace una revisin de los lmites del arreglo, por lo que se puede ir fcilmente ms all del arreglo en memoria y sobreescribir otras cosas. C sin embargo es mucho ms sutil en su relacin entre arreglos y apuntadores. Por ejemplo se puede teclear solamente: ap = a; en vez de ap = &a[0]; y tambin *(a + i) en vez de a[i], esto es, &a[i] es equivalente con a+i. Y como se ve en el ejemplo, el direccionamiento de apuntadores se puede expresar como: a[i] que es equivalente a *(ap + i) Sin embargo los apuntadores y los arreglos son diferentes: Un apuntador es una variable. Se puede hacer ap = a y ap++. Un arreglo NO ES una variable. Hacer a = ap y a++ ES ILEGAL. NOTA: Esta parte es muy importante, asegrese haberla entendido. Con lo comentado se puede entender como los arreglos son pasados a las funciones. Cuando un arreglo es pasado a una funcin lo que en realidad se le est pasando es la localidad de su elemento inicial en memoria. Por lo tanto: strlen(s) es equivalente a strlen(&s[0]) Esta es la razn por la cual se declara la funcin como: int strlen(char s[]); y una declaracin equivalente es int strlen(char *s); ya que char s[] es igual que char *s.

La funcin strlen() es una funcin de la biblioteca estndar que regresa la longitud de una cadena. Se muestra enseguida la versin de esta funcin que podra escribirse: int strlen(char *s) { char *p = s; while ( *p != '\0' ) p++; return p - s; } Se muestra enseguida una funcin para copiar una cadena en otra. Al igual que en el ejercicio anterior existe en la biblioteca estndar una funcin que hace lo mismo. void strcpy(char *s, char *t) { while ( (*s++ = *t++) != '\0' ); } En los dos ltimos ejemplos se emplean apuntadores y asignacin por valor. Nota: Se emplea el uso del carcter nulo con la sentencia while para encontrar el fin de la cadena. Ejercicios 1. Escribir el programa que ordena las lneas de un texto ledo desde la entrada estndar, donde cada lnea tiene diferente longitud, segn lo descrito en la seccin de arreglo de apuntadores. 2. Escribir una funcin que convierta una cadena s a un nmero de punto flotante usando apuntadores. Considerar que el nmero tiene el siguiente formato 99999999.999999, es decir, no se dar en notacin cientfica. La funcin deber suministrrsele una cadena y deber devolver un nmero.

3. Escribir un programa que encuentre el nmero de veces que una palabra dada (esto es, una cadena corta) ocurre en una sentencia (una cadena larga). Leer los datos de la entrada estndar. La primera lnea es una sola palabra, en la segunda lnea se tiene un texto general. Leer ambas hasta encontrar un carcter de nueva lnea. Recordar que se debe insertar un carcter nulo antes de procesar. La salida tpica podra ser: La palabra es "el" La sentencia es "el perro, el gato y el canario" La palabra ocurri 3 veces.

You might also like