jueves, 24 de abril de 2008

Primer Año: Programacion Estructurada

Programación estructurada

Repaso de teoria para el final

Arreglos (tabla o lista): es una secuencia de datos del mismo tipo. El arreglo se utiliza para almacenar tipos tales como “char, int o float”.
Es un conjunto de elementos que tienen un nombre en comun y se identifica a cada uno de sus elementos mediande un subíndice.
Los elementos del arreglo se enumeran consecutivamente 0,1,2,3..etc. estos se denominan subíndices del array. Estos localizan la posición del elemento dentro del arreglo.
Un arreglo se almacena siempre con sus elementos en una secuencia de memoria continua.
Declaracion de un arreglo: se debe declarar antes de utilizarlo. Se declara igual que los otros tipos de datos pero se le debe indicar al compilador el tamaño del array:

Tipo nombrearray [numeros de elementos]
Ejemplo:
int numeros [10];
Esto hace guardar espacio de memoria para el array.
Subíndices de un Array: indice de un arreglo. Se pueden utilizar un entero, una constante, una variable o una expresión.
Almacenamiento en memoria de loa array: se almacenan en bloques continuos.
Tamaño: para obtener el numero necesario de bytes para su arreglo se usa el operador “sizeof”.
N= sizeof (edades);
Inicializacion de un Array: se deben asignar valores a los elementos de los arreglos antes de utilizarlos.
Ej: Precios [0] = 10;
Precios [1] = 20;
Pero se puede inicializar todo en una sola sentencia.
Int numeros [10] = (10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
Int numeros [] = (10, 9, 8, 7, 6, 5, 4, 3, 2, 1) el programa le asigna automaticamente 10.
For (i=9; i >0; i--)
Printf (“\n cuenta descendente %d = %d”, i, cuenta [i]);

Arreglos multidimensionales: son aquellos que tienen mas de una dimension, conocidos como tablas o matrices.
La sintaxis de un arreglo bidimensional es:
[][]
int puestos [10][80];
Un arreglo de dos dimensiones es un arreglo de un arreglo. O sea es un arreglo unidimensional y cada elemento es otro arreglo.
Inicializacion: int tabla [2][3] = {51,52,53,54,55,56};
Inserciones: tabla [2] [3] = 4;
Extracción: ventas = tabla [1] [1];
Lectura y escritura
Int tabla [4] [3] ;
Scanf (“%d”, &tabla [2] [3]);
Printf (“%4d”, tabla [1] [1] );

Arreglos de mas de dos dimensiones: un arreglo tridimensional se puede considerar como un conjunto de array bidimensionales combinados juntos para formar, en profundidad, una tercera dimension.
Int equipos [3] [15] [10];
Ej:
Un libro tiene tres dimensiones [paginas] [lineas] [columnas]. Que definen el tamaño de array. El tipo de datos del arreglo es char, ya que los elementos son caracteres.
¿Cómo acceder? Mediante bucles anidados.

Int pagina, linea, columna;
For (pagina = 0; pagina For (linea = 0; linea For (columna = 0; columna < columnas; ++columna)


Parámetro: información que se transmite entre modulos.
Utilización de arrays como parámetros: todos los arreglos ( en C) se pasan por referencia (direccion). Esto significa que cuando se llama a una funcion y se utiliza un array como parámetro, se debe tener cuidado de no modificar el array en una funcion llamada.
#define MAX [100]
double datos [MAX];
Se puede declarar una funcion que acepte un array como parámetro.
Double sumadedatos ( double datos [MAX]);

Cuando se para un arreglo a una funcion, se pasa realmente solo la direccion de la celda de memoria donde comienza el array. La funcion puede cambiar el contenido del array accediendo directamente a las celdas de memoria donde se almacenan los elementos del array. Aunque el array se pasa por valor, sus elementos se pueden cambiar como si hubieran pasado por referencia.
Ordenación de listas: la ordenación es el procedimiento mediante el cual se disponen los elementos del array en un orden especificado, tal como orden alfabetico u orden numerico.
El orden de clasificacion u ordenación puede ser descendente o ascendente.
Algoritmos de ordenación: inserción, burbuja, selección, rapido, fusion, montículo, shell, etc.
Algoritmo de la burbuja: uno de los metodos más faciles de ordenación.
Se compara cada elemento del array con el siguiente (por parejas), si no estan en el orden correcto se intercambian entre si sus valores.
Ej:
Lista [0] 6
Lista [1] 4
Lista [2] 10
Lista [3] 2
Lista [4] 8

Para intercambiar 2 valores, se necesita utilizar una tercera variable auxiliar que contenga el resultado inmediato.
Aux = Lista [0];
Lista [0] = Lista [1];
Lista [1] = Aux;


Búsquedas en listas: las 2 busquedas mas importantes son búsqueda secuencial y búsqueda dicotomica (binaria). La búsqueda seuencial es el metodo utilizado para listas no ordenadas y la dicotomica para listas ordenadas.
Búsqueda secuencial: este algoritmo busca el elemento dado, recorriendo secuencialmente el array desde un elemento al siguiente, comenzando en la primera posición del array y se detiene cuando se encuentra el elemento buscado o bien se alcanza el final del array.
Esta tarea repetitiva se realiza con el “mientras”.

Algoritmo búsqueda secuencial.
Ban = 0
Poner indice = índice array
Mientras ( Ban = 0) y ( Indice < ultimo) hacer
Si (A [indice] = elemento) entonces
Ban = 1
Sino
Incrementar Indice
Fin mientras

Si Ban = 1 entonces
Retorno (Indice)
Sino
Retorno ( -1)
Fin si
Fin

Estructuras: es una colección de uno o mas tipos de elementos denominados miembros, cada uno de los cuales puede ser un tipo de dato diferente.
Declaracion de una estructura: una estructura hay que declararla antes de utilizarla.
Struct
{


. . . .
}
Ej:
Struct colección_CD
{
char titulo [30];
char artista [25];
int num_canciones;
float precio;
char fecha_compra [8];
}
Acceso a estructuras: o se almacena información en la estructura o se recupera información de la estructura. Se puede acceder a los miembros de la estructura tanto por:
el operador (.) punto
el operador(->) puntero

Estructuras Anidadas: una estructura puede contener otras estructuras llamadas “estructuras anidadas”. Estas ahorran tiempo en la escritura de programas que utilizan estructuras similares.

Ej:
Empleado: Cliente:
Direccion Direccion
Info_dir Ciudad Info_dir Ciudad
Provincia Provincia
Cod_Postal Cod_Postal
Salario Saldo

Arreglos de punteros: si se necesita reservar muchos punteros a muchos valores diferentes, se puede declarar un array de punteros. Un arreglo de punteros es un array que contiene como elementos punteros, cada uno de los cuales apunta a un tipo de dato especifico.
Ej: Int * ptr [10];
Ptr [5] = &edad;
Ptr [4] = null;
De igual forma, se podria declarar un puntero a un arreglo de punteros a entero
Int * (ptr10) [ ];
(*ptr10) *\es un puntero prt10 es el nombre de la variable\*
(*ptr10) [ ] *\es un puntero a un arreglo\*
*(*ptr10) [ ] *\ es un puntero a un arreglo de punteros\*
int *(*ptr10) [ ] *\ es un puntero a un arreglo de punteros de variable int\*
Punteros a funciones: es posible tambien crear punteros que apunten a funciones. En lugar de direccional datos (variables, estructuras o array) los punteros de funciones apuntan a codigo ejecutable. Al igual que los datos, las funciones se almacenan en mamoria y tienen direcciones iniciales. Se pueden asignar las direcciones iniciales de funciones a punteros.
Sintaxis:
Tipo_de_retorno (*punterofuncion) ();
Los punteros a funciones permiten pasar una funcion como un argumento a otra funcion. Para pasar el nombre de una funcion como un argumentofuncion, se especifica el nombre de la funcion como argumento.
Concepto de funcion: en el lenguaje “C” un programa se divide en muchos modulos. Estos modulos se denominan funciones (pequeñas rutinas) que producen muchos beneficios:
aislar mejor los problemas
escribir programas correctos mas rapido
producir programas que son mucho mas faciles para mantener
funcion main ( )
El mejor medio para escribir un programa es escribir funciones independientes para cada tarea que haga el programa.
Cada funcion realiza una tarea y cuando se ejecuta return se retorna al punto en que fue llamada por el programa o funcion principal.
Funcion: un conjunto de sentencias que se pueden llamar desde cualquier parte de un programa. No se pueden anidar (funciones dentro de otras funciones).
Tipo_de_retorno nombrefuncion (listadeparametros)
{
cuerpo de la funcion
return expresión
}
Las funciones para poder ser ejecutadas, han de ser llamadas o invocadas. Cualquier expresión puede contener una llamada a una funcion que redirigira el control del programa a la funcion nombrada. Normalmente la llamada a una funcion se realizara desde la funcion principal mail ( ).


Prototipos de las funciones: la declaracion de una funcion se denomina prototipo.
Contienen la cabecera de la funcion. Un prototipo consta de los siguientes elementos:
nombre de la funcion
una lista de argumentos encerrados entre paréntesis y un punto y coma
Se recomienda que se declare una funcion si se llama a la funcion antes de que se defina.
Un prototipo declara una funcion y proporciona una información suficiente al compilador para verificar que la funcion esta siendo llamada correctamente. Poner un ; al final del prototipo de la funcion para convertirlo en sentencia.
Se situan normalmente antes de la funcion mail ( )
Diferencias entre declaracion y definición:
una declaracion proporciona un nombre y se listan sus caracteristicas. Es una indicacion de que algo existe en alguna posición.
Una definición proporciona un nombre de entidad y reserva espacio de memoria para esa entidad. Indica que existe un lugar en un programa donde existe realmente la entidad definida.
La declaracion solo contiene la cabecera de la funcion y una vez declarada la funcion, la definición completa de la funcion debe existir en algun lugar del programa, antes o después del main ( ).
Parámetros de una funcion:
Parámetro: información que se transmite entre modulos.
Suponiendo que se tenga la declaracion de una funcion “circulo” con tres argumentos:
Void circulo (int x, int y, int diámetro);
Cuando se llama a “circulo” se deben pasar tres parámetros a esta funcion. En el punto de llamada cada parámetro puede ser una constante, una variable o una expresión, como en el sig. Ejemplo:
Circulo (25, 40, vueltas*4);
Paso de parámetros por valor: significa que cuando C compila una funcion y el codigo que llama a la funcion, la funcion recibe una copia de los valores de los parámetros. Si se cambia el valor de un parámetro variable local, el cambio solo afecta a la funcion y no tiene efecto fuera de ella.
Paso de parámetros por referencia: es utilizada cuando una funcion debe modificar el valor del parámetro pasado y devolver este valor modificado a la funcion llamadora.
Cuando se modifica el valor del parámetro ( la variable local), este valor queda almacenado en la misma direccion de memoria, por lo que al retornar a la funcion llamadora la direccion de la memoria donde se almacenó el parámetro contendrá el valor modificado. Para pasar una variable por referencia, el símbolo & debe preceder al nombre de la variable y el parámetro variable correspondiente de la funcion debe declararse como puntero.
Ej:
Float x;
Int y;
Entrada (&x, &y);
. . .
void entrada ( float * x, int * y)
Diferencias entre paso de variables por valor y por referencia:
Reglas de paso por valor y por referencia:
Los parámetros valor reciben copias de los valores de los argumentos que se les pasan;
La asignación a parámetros valor de una funcion nunca cambian el valor del argumento original pasado a los parámetros;
Los parámetros para el paso por referencia ( declarados con *, punteros) reciben ña direccion de los argumentos pasados; a estos les debe preceder del operador &, excepto los array;M
En una funcion, las asignaciones a parámetros por referencia ( punteros) cambian los valores de los argumentos originales.
Ej: POR VALOR POR REFERENCIA
Float a, b; Float a, b;
Potrat1 (float x, float y) Potrat1 (float * x, float * y)
{ { . . . . . .
} }
Nota: todos los parámetros en C se pasan por valor. Para pasarlos por referencia hay que hacerlo con punteros y el operador &.
LEER FOTOCOPIA DE PROCEDIMIENTO

Ambito (alcance): el ambito de una variable determina cuales son las funciones que reconocen ciertas variables. Si una funcion reconoce una variable, es visible en esa funcion. El ambito es la zona de un programa en la que es visible una variable. Existen 4 tipos de ambitos: programa, archivo fuente, funcion y bloque. Se puede designar una variable para que este asociada a uno de estos ambitos. Tal variable es invisible fuera de su ambito y solo se puede acceder a ella en su ambito.
Ej:
int i; /* ambito del programa*/
Static int j; /* ambito de archivo*/
Float func (int k) /* k, ambito de funcion */

Ambito del programa: las variables que tienen este ambito pueden ser referenciadas por cualquier funcion en el programa completo; tales variables se llaman “variables globales”. Para hacer una variable global, declarela simplemente al principio de un programa, fuera de cualquier funcion.
Ej:
Int g, h; /* variables globales*/
Main ( )
{
. . .
}
Si se define una variable global, cualquier linea del resto del programa, no importa cuantas funciones y lineas de codigo le sigan, podra utilizar esa variable.
Ambito del archivo fuente: una variable que se declara fuera de cualquier funcion y cuya declaracion contiene la palabra reservada Static tiene ambito de archivo fuente.
Ej: i tiene ambito de archivo fuente:
Static int i;
Void fun. ( void)
{
. . .
}
Ambito de una funcion: se pueden referenciar desde cualquier parte de la funcion. Las variables declaradas dentro de la funcion son locales a la funcion. Las variables locales no se pueden utilizar fuera del ambito de la funcion en que estan definidas.
Ej:
Void calculo ( void)
{
double x, r, t; /*ambito de la funcion */
. . .
}
Ambito por bloque: son variables declaradas en un bloque y puede ser referenciada en cualquier parte del bloque, desde el punto en que esta declarada hasta el final del bloque. Las variables locales declaradas dentro de una funcion tienen ambito de bloque de la funcion; no son visibles fuera del bloque.
Ej:
Void func1 ( int x)
{
int i;
for ( i = x; i < x + 10; i ++)
func1 ( i );
}
/* aqui ya no es visible i */
};
Clases de almacenamiento: los especificadotes de clases (tipos) de almacenamiento permiten modificar el ambito de una variable. Pueden ser: auto, extern, register, static y typedef.
Variables automaticas (auto): son variables que se declaran dentro de una funcion. Le asigna espacio de memoria automáticamente. La palabra reservada auto es opcional.
Auto int total; es igual que int total;
Variables externas (extern): a veces se presenta el problema de que una funcion necesita utilizar una variable que otra funcion inicializa. Una de las soluciones es declarar la variable local con la palabra reservada “extern”. Cuando una variable se declara externa, se indica al compilador que el espacio de la variable esta definida en otro lugar.
Variables registro (register): con la palabra reservada “register” se sugiere al compilador que la variable se almacene en uno de los registros hardware del microprocesador. Debe de ser local a la funcion, nunca puede ser global al programa completo. Este se almacena en un registro si existen algunos disponibles.

Register int indice;
For (indice = 0; indice < 1000; indice ++)
. . .
Variables Estaticas (static): son opuestas a las automaticas. Las variables estaticas no se borran cuando la funcion termina y, en consecuencia, retienen sus valores entre llamadas a una funcion. Las variables “Static” se inicializa solo una vez. Las variables estaticas se utilizan normalmente para mantener valores entre llamadas a funciones.
Func_uno ( )
{
int i;
static int j = 25;
static int k = 100; /* j, k variables estaticas */
. . .
}
Tipos de funciones:

Funciones de caracter
Funciones numericas
Funciones de fecha y hora
Funciones de utilidad

2 comentarios:

Anónimo dijo...

Hola muchas gracias por publicar esto de programacion, me sera muy util para la cursada del año que viene Un abrazo

JR dijo...

Hola que tal??
segis publicando???
clases
del primer año
de sistemas???