Sunteți pe pagina 1din 13

Programacin modular

Es una tcnica de diseo de software que se enfoca en separar la funcionalidad de un programa en modulos independientes e intercambiables de tal manera que cada uno obtenga todo lo necesario para ejecutar su funcin deseada. Gracias a este tipo de programacin, los problemas se separan en los mdulos de tal manera que ninguno interacte con algn otro mdulo del sistema. En algunos casos los mdulos deben interactuar entre s para lograr su propsito, aunque es recomendable que logren su meta sin necesidad de interaccin alguna con otros mdulos. Estos mdulos en la mayora de lenguajes de programacin son llamados funciones. Algunos lenguajes pueden distinguir entre funciones que retornan valores y funciones que no retornan valores. En C/C++, por ejemplo, el lenguaje asume que toda funcin devolver un valor (ya sea nulo o cualquier tipo de dato diferente). Cuando hablamos de funciones en C/C++ debemos saber que podemos llamarlas de 3 formas diferentes: Llamado por asignacin: La funcin es asignada a una variable. Llamado por condicin: La funcin se llama dentro del argumento de un condicional o un ciclo. Llamado directo: Se llama directamente en el programa, no necesita ser asignada a una variable y tampoco es necesario pasarla como parmetro a un ciclo o condicional. Todos los identicadores en C/C++ deben ser declarados antes de ser usados. Esto se cumple tanto para funciones como para variables. Para las funciones esta declaracin debe ser hecha antes de la primera llamada a la funcin. El prototipo correcto de la declaracin de funciones es hacerlo antes de la funcin principal. El tener la declaracin antes del primer uso de la funcin permite al compilador revisar el nmero y tipo correcto de argumentos usados en la llamada. La declaracin da mucha informacin sobre la funcin. Al principio de esta, da a conocer el tipo de dato a retornar. Y entre los parntesis, da a conocer el tipo de datos que reciben los parmetros y el nmero de parmetros que recibir la funcin. Los nombres de las variables de los parmetros pueden ser omitidos en la

declaracin. Generalmente, al dejarlos en blanco, te da la exibilidad de renombrar las variables a tu antojo en cualquier momento.

Imagen 1: Ejemplo simple de declaracin de funciones

Arreglos
Un arreglo es una serie de elementos del mismo tipo colocados en lugares de memoria contiguos que pueden ser referenciados individualmente agregando un ndice a un identicador nico. Esto signica que, por ejemplo, podremos almacenar 5 (o ms) valores de tipo entero en un arreglo sin necesidad de declarar 5 diferentes variables, cada una con un identicador diferente. En vez de eso, usando un arreglo podremos almacenar estos 5 valores diferentes del mismo tipo, con un mismo identicar nico. Como una variable comn, un arreglo debe ser declarado antes de ser usado. Los arreglos son un tipo de bloques no dinmicos de memoria y su tamao debe ser determinado antes de su ejecucin, por lo tanto el valor al crear el arreglo debe ser una constante. Se comete un error al hacerlo por medio de una variable o crearlo en medio de la ejecucin y esto puede llevar a que existan errores en tiempo de ejecucin.

Inicializar arreglos
Cuando declaramos un arreglo de mbito local, si no especicamos sus elementos, estos no sern inicializados a un valor por defecto, por lo que su contenido ser indeterminado hasta que almacenemos algunos valores en ellos. La inicializacin de un arreglo se puede hacer inmediatamente despus de ser declarado, con los valores deseados entre llaves. Cuando todos los valores se especican en la inicializacin, C/C++ permite dejar el tamao de este en blanco (el compilador reconocer automticamente el tamao del arreglo).

Accediendo a los valores de un arreglo


En cualquier parte de un programa podemos acceder a un elemento del arreglo como si se tratara de una variable comn y corriente, pudiendo as leer y modica su valor. Como se hace? Se llama al nombre del arreglo y entre los corchetes se inserta el ndice del elemento al cual deseamos acceder. Los ndices, en la mayora de lenguajes de programacin comienzan desde 0, a diferencia de las matemticas donde comienzan desde 1.

Arreglos como parmetros


En algn momento necesitaremos pasar un arreglo como un parmetro a alguna funcin. En C/C++ no es posible pasar un bloque completo de memoria por valor como parmetro a una funcin, pero s podemos pasar su direccin de memoria. En la practica, esto tiene el mismo efecto y es mucho ms rpido y tiene una operacin ms eciente. A n de aceptar arreglos como parmetros, la nica cosa que se debe hacer al declarar la funcin es especicar en sus parmetros el tipo de datos que contiene el arreglo, un identicador (puede ser cualquier nombre que cumpla los requisitos de las variables) y un par de corchetes vacos (no es necesario volver a especicar el tamao). Al llamar una funcin que recibe un arreglo como parmetro basta con slo poner el identicador de nuestro arreglo, sin necesidad de colocar corchetes vacos o el tamao de este.

Arreglos multidimensionales
Este tipo de arreglos podran ser descritos como arreglos de arreglos. Podramos imaginar este tipo de arreglos como una tabla hecha de elementos, existen arreglos de muchas dimensiones, aunque los ms utilizados son los bidimensionales (constan de columnas y las, algo as como una hoja de clculo).

Imagen 2: Ejemplo simple con arreglos

Los arreglos multidimensionales slo son una abstraccin para los programadores, ya que podemos obtener los mismos resultados con un arreglo unidimensional multiplicando los dos ndices y el resultado sera el tamao del arreglo unidimensional.

Ficheros
Para la entrada/salida de cheros en C (este caso utilizaremos C, por lo de la programacin modular, en C++ sera orientada a objetos que explicar ms adelante) necesitamos utilizar un puntero FILE, este puntero permite al programa hacer un seguimiento del chero al cual est accediendo.

fopen
Para abrir un chero necesitamos usar la funcin fopen, la cual retorna un puntero FILE. Cuando hayas abierto un chero, puedes utilizar el puntero FILE para permitirle al compilador el realizar acciones de entrada y salida en el chero.

La funcin fopen recibe siempre dos parmetros, el primero es la direccin donde est alojado el chero (si no existe, colocamos el nombre de cmo queremos llamar el nuevo chero) y el segundo parmetro recibe el modo en que abriremos nuestro chero, que es lo que explicar a continuacin. Modos de apertura de cheros

Constante
r w a r+ w+ a+ Abrir para slo lectura Abrir para escritura Abrir para anexar

Accin realizada

Abrir para lectura y escritura Abrir para lectura y escritura ( sobreescribiendo el archivo) Abrir para lectura y escritura (anexa si existe el archivo)

Si el archivo no existe o est protegido para slo lectura, el puntero retornar NULL. Por lo que es preferible que el usuario sea aquel que ingrese la direccin del chero que desea abrir.

fclose
Cuando hayas dejado de trabajar con el chero, debes cerrarlo usando la funcin fclose, slo recibe un parmetro: el puntero que contiene nuestro chero. Esto se hace con el n de borrar cualquier dato que haya quedado en nuestro buffer y no hubiera sido utilizado para ser escrito en el chero. La funcin retornar 0 si el puntero hacia el chero ha sido cerrado de forma exitosa, de otro modo retornar EOF, e intentar volver a cerrar el archivo.

Lectura y escritura de cheros


Para trabajar con la entrada y salida de texto, usamos fprintf y fscanf, ambos son similares a printf y scanf a excepcin de que aqu debes pasar un puntero FILE como primer argumento. Tambin es posible leer un solo carcter al tiempo gracias a la funcin fgetc. Esta funcin toma un puntero FILE y retorna un entero. Este entero es un carcter ledo del chero y contiene un valor adecuado para ser almacenado en un unsigned char (en el rango de 0 a 255).

Como es posible leer un carcter a la vez del chero, tambin es posible escribir carcter por carcter gracias a la funcin fputc. Esta funcin lee dos parmetros, el primero es el entero a copiar y el segundo parmetro es el puntero FILE.

Recursividad
Una funcin es recursiva cuando expresa la solucin de un problema con llamadas a s mismo. La primera llamada se plantea bajo un tamao N, las siguientes llamadas seguirn plantendose bajo problemas de igual naturaleza que el original pero el valor de N ir disminuyendo. Llegar un caso en que la resolucin del problema sea sucientemente manejable para poder resolverlo de forma no recursiva y es all donde estaremos frente un caso base. Las claves para implementar un algoritmo recursivo son las siguientes: Cada llamada se debera denir sobre un problema de mayor complejidad. Ha de existir al menos un caso base para evitar que la recurrencia sea innita. Los algoritmos recursivos pueden ser menos ecientes en cuestin de tiempo que los algoritmos iterativos, pero suelen ser mucho ms ecientes en espacio. Aunque la recursin sea un recurso muy poderoso con el cual podemos expresar soluciones simples a cierto tipo de problemas, tenemos que considerar que no todos los problemas pueden ser resueltos de forma recursiva. Existen 2 tipos de recursiones: Directa: Donde la funcin se llama directamente a si misma. Indirecta: Donde la funcin llama otra funcin, y sta, en algn momento, llama nuevamente a la primer funcin.

Expresiones
Las expresiones se pueden representar por medio de: Notacin de injo Notacin de postjo Notacin de prejo

Notacin de injo
Los operadores se escriben entre los operandos. Esta es la forma en la que usualmente copiamos expresiones matemticas. La notacin de injo necesita

informacin extra para hacer que el orden de evaluacin de operadores sea claro: reglas incorporadas en el lenguaje sobre la procedencia y asociatividad de operador, y parntesis que permiten omitir este orden.

Notacin de postjo
Este tipo de notacin es conocido tambin como RPN (Reverse Polish Notation). Los operadores se escriben despus de los operandos. El orden de evaluacin de los operadores siempre es de izquierda a derecha, y los parntesis no pueden ser usados en este tipo de notacin. Los operadores actan en los valores que estn a su izquierda.

Notacin de injo
a+b a+b*c x*y+v*w (a + b) * (c - d) * e * f a+b*c/d*f

Notacin de postjo
ab+ abc*+ xy*vw*+ ab+cd-*e*f* abc*d/f*+

Existen varios algoritmos para convertir una expresin desde notacin de injo a notacin de postjo. El algoritmo ms popular fue el algoritmo shunting-yard creado por el famoso matemtico Edsger W. Djikistra. Algoritmo Shunting-Yard: 1. Los operandos del arreglo injo pasan directamente al arreglo postjo. 2. En el tope de la pila, debe quedar siempre un operador que tenga mayor prioridad que todos los dems almacenados en la pila. 3. Cuando se encuentre un operador en el tope de la pila de mayor prioridad que el que se est analizando en el arreglo injo, debe pasar al arreglo postjo todos los operadores de la pilas mientras se siga cumpliendo esta condicin o la pila quede vaca. 4. Cuando se deje de cumplir el ciclo anterior, el operador que se est analizando en ese momento en el arreglo injo debe pasar a la pila. 5. Una vez localizado el carcter NULO en el arreglo injo, todos los operadores de la pila deben pasar directamente al arreglo postjo.

Notacin de prejo
Este tipo de notacin es conocido como Polish Notation. Los operadores son escritos antes de los operandos. Si bien en esta notacin los operadores son evaluados de izquierda a derecha, usan sus valores a su derecha, y si estos valores involucran clculos entonces cambian el orden en que los operadores tienen que ser evaluados.

Notacin de injo
a+b a+b*c x*y+v*w (a + b) * (c - d) * e * f a+b*c/d*f

Notacin de prejo
+ab +a*bc +*xy*vw ***+ab-cdef +a*/*bcdf

Manejo dinmico de memoria


Es un espacio de memoria que se reserva en tiempo de ejecucin. La principal ventaja frente a la memoria esttica es que sta puede variar durante la ejecucin del programa. Es necesaria cuando no conocemos el nmero de datos a tratar; su nico problema es que es ms lenta, pues es en tiempo de ejecucin donde se determina la memoria a usar. Apuntador: Un campo apuntador es un campo de memoria que almacena la direccin de memoria de otro campo. Entonces se dice que dicho campo quedo apuntando o haciendo referencia a otro campo. Nota: Los campos apuntadores slo pueden contener direcciones de memoria. Un campo apuntador slo puede hacer referencia a un campo.

Listas
Las listas, las pilas y las colas son estructuras de datos dinmicas debido a que no se reserva una zona esttica o ja de memoria para su almacenamiento, sino que el espacio ocupado crece o decrece a medida que evoluciona o se ejecuta.

Listas ligadas simples


Una alternativa al almacenamiento contiguo es utilizar punteros o ligas para referenciar los elementos de una lista lineal, el mtodo se basa en almacenar la direccin del sucesor en el elemento actual, con este mtodo los elementos de la lista no necesitan ser fsicamente adyacentes o contiguos en memoria. Una lista est constituida por nodos cuyo orden se establece por medio de punteros hacia otras partes (en este caso slo utilizaremos 2 partes), una parte que contiene la informacin asociada al elemento y otra parte que hace referencia a la direccin de memoria en donde est almacenado el siguiente elemento.

Listas doblemente ligadas


Tienen dos ligas, una hacia el nodo anterior y otra hacia el nodo siguiente. Se manejan igual que las listas simples ligadas, slo que ya se debe tener en cuenta el uso de la liga hacia el nodo anterior.

Listas ligadas circularmente


Una lista ligada circularmente es una lista en la cual el ltimo nodo es ligado al primer elemento de la lista. La ventaja de este tipo de estructura es que siempre se puede llegar a cualquier nodo siguiendo las ligas. El nico problema es que si no se tiene cuidado, al realizar una bsqueda podemos llegar a ocasionar un ciclo innito. Se podra evitar fcilmente utilizando un registro cabeza.

Pilas (Stacks)
Una pila es una estructura de datos lineal en la que los elementos se pueden aadir o eliminar por el nal, es decir por la cima o el tope de la pila. Es una coleccin ordenada de elementos por donde slo se puede acceder por un solo lugar, el tope de la pila. Se conocen como estructuras LIFO (Last Input, First Input).

Imagen subida por Fibi en http://de.wikipedia.org bajo Creative Commons CC-BY-SA

Colas (Queques)
Es una estructura de datos lineal en la que los elementos se almacenan por el extremo inferior de la cola y son eliminados o atendidos por el principio o por la cabeza de la cola. Se conocen como estructuras FIFO (First Input, First Output).

Imagen subida por Gauldock en http://es.wikipedia.org

Programacin Orientada a Objetos


La programacin orientada a objetos se puede denir como una losofa para programar en la cual se encapsulan datos y cdigos para formar objetos que interactan entre s para formar resultados esperados. Objetos: Es un paquete que contiene datos y cdigo en forma de subrutinas que operan sobre los datos del propio objeto. Los datos que guarda un objeto se llaman atributos, mientras que los subprogramas o procedimientos que operan sobre los datos, se los conoce con el nombre de mtodos. Herencia: Es el proceso mediante el cual un objeto se dene o se crea adquiriendo las propiedades de otro, es decir, hereda los atributos y los mtodos de un objeto superior. Polimorsmo: Es un mecanismo mediante el cual se puede lograr que una misma operacin se realice de diferentes formas segn los objetos en que se aplican. Clase: Se utiliza el trmino de clase para describir a los objetos de un mismo tipo. Normalmente la denicin de una clase es la declaracin de un tipo de datos que involucra la especicacin de los atributos y los mtodos de un objeto. Cuando se declara una variable del tipo de dato de la clase, se crear un objeto que ya contiene los atributos y mtodos asociados. Una clase es una coleccin de objetos similares. Atributo: Es un dato o variable que caracteriza el estado de un objeto. Mtodo: Es un procedimiento o accin que cambia el estado de un objeto. Mensaje: Es una peticin de un objeto a otro objeto al que se le solicita ejecutar uno de sus mtodos. El objeto que enva la peticin se denomina emisor y el que recibe la peticin se denomina receptor. Constructor: Es un mtodo cuya funcin es inicializar los atributos de la clase e instalar o crear los objetos en memoria. Destructor: Permite liberar el estado de un objeto y/o destruir el propio objeto. Encapsulamiento: El objeto es auto-contenido, es decir que la misma denicin de objeto inuye tanto en sus atributos como en los mtodos que actan sobre los atributos.

Abstraccin: El concepto de abstraccin se reere a identicar las funcionalidades ms importantes de un objeto y aquello que le hace diferente a los dems. Se puede denir un objeto como un agente abstracto que le permite comunicarse con otros sin revelarse el detalle de su funcionamiento interno a sus caractersticas internas.

Diferencias entre clase y objeto


Un objeto es simplemente un elemento, no importa lo complejo que pueda ser. Una clase, por el contrario describe una familia de elementos similares. Una clase es como un esquema o plantilla que se utiliza para denir o crear objetos. Caractersticas de los objetos: 1. Se agrupan en un tipo de dato llamado clase. 2. Tienen datos internos que denen su estado actual. 3. Soportan ocultacin de datos. 4. Pueden heredar propiedades de otros objetos. 5. Pueden comunicarse con otros objetos pasando mensajes. 6. Tienen mtodos que denen su comportamiento.

Ficheros
Podemos utilizar 3 clases para manipular cheros en C++. ofstream: Se utiliza para crear objetos que puedan manipular cheros y es de slo escritura. ifstream: Se utiliza para crear objetos que puedan manipular cheros y es de slo lectura. fstream: Se utiliza para crear objetos que puedan manipular cheros y es de lectura y escritura.

open()
Para abrir un chero necesitamos utilizar el mtodo open(). Este mtodo recibe dos parmetros el primero que es el nombre de nuestro chero a abrir y el segundo, que es opcional, es el modo de apertura. Las clases mencionadas anteriormente crean el objeto con el modo de apertura necesario, pero hay otros mtodos opcionales y que en algn momento nos pueden servir.

Instruccin
ios::in ios::out ios::binary ios::ate ios::app ios::trunc

Descripcin
Operaciones de lectura (por defecto en ifstream) Operaciones de escritura (por defecto en ofstream) Abrir el chero en modo binario (recomendado para cheros .bin) La posicin inicial sera al nal del chero. Toda escritura en el chero es hecha al nal del mismo. Si el archivo exista anteriormente y tena informacin. Borra esa informacin existente e ingresa la nueva.

Se pueden ingresar varios de estos modos de apertura como argumento utilizando un operador OR a nivel de bits para separar cada uno.

close()
Cuando se haya dejado de trabajar con el archivo, se debe enviar un mensaje al mtodo close() con el n de borrar cualquier dato que haya quedado en nuestro buffer. Esta funcin no recibe ningn parmetro.

Manipulacin de cheros
is_open() Este mtodo nos verica que nuestro archivo haya abierto de forma exitosa. Devuelve un valor booleano, True si la operacin fue exitosa o False si hubo algn error al momento de abrir el archivo. bad() Este mtodo retorna True si la operacin de lectura o escritura falla. fail() Retorna True en los mismos casos en que bad(), pero tambin toma en cuenta si ocurre un error en el formato. eof() Retorna True cuando el chero abierto para lectura alcanza el nal. good() Retorna False en los mismo casos que cualquiera de los mtodos anteriores retornara True.

S-ar putea să vă placă și