Você está na página 1de 27

REPUBLICA BOLIVARIANA DE VENEZUELA MINISTERIO DEL PODER POPULAR PARA LA DEFENSA UNIVERSIDAD NACIONAL EXPERIMENTAL POLITECNICA DE LA FUERZA ARMADA

BOLIVARIANA U.N.E.F.A TSU. ANALISIS Y DISEO DE SISTEMAS ASIGNATURA: Lenguaje de Programacin

FACILITADORA:
ACOSTA DENIS

INTEGRANTES
ACOSTA GENESIS GONZALES YIMIS GUARISMA JAILIN IBARRA KARLA MEDRANO EDWIN

CIUDAD BOLIVAR, OCTUBRE 2012

Introduccin:
En programacin arreglos son colecciones de datos de un mismo tipo, algunas de sus funciones son ubicada cada elementos de una forma especifica dentro del mismo dichas funciones, son determinadas por procedimientos para reducir la duplicacin de cdigos en un programa; es decir, nos permite reusar cdigos. Otra parte tenemos la cadena de caracteres que nos indican una secuencia de la longitud arbitraria con las caractersticas de identificarse con smbolos, letras y nmeros. En otro punto los apuntadores en c es una herramienta muy potente de programacin que suele causar mucha confusin en los estudiantes que estn aprendiendo el proceso de disear, codificar, depurar y mantener el cdigo fuente de programa computacioneles.

ARREGLOS EN PROGRAMACION
Un arreglo es una coleccin de datos del mismo tipo, que se almacenan en posiciones consecutivas de memoria y reciben un nombre comn. Para referirse a un determinado elemento de un arreglo se deber utilizar el nombre del arreglo acompaado de un ndice el cual especifica la posicin relativa en que se encuentra el elemento. Los arreglos pueden ser: unidimensionales (vectores). Bidimensionales (matrices, tablas) Multidimensionales(tres dimensiones o ms). ARRAY UNIDIMENSIONALES O VECTORES

Los pasos para la utilizacin de un vector son; 1 Declarar el vector: consiste en establecer el nombre, el tamao y el tipo de los datos que se van a almacenar en el arreglo ejemplo: hay que diferenciar dos trminos : tamao del vector (T): es el nmero mximo de elementos que puede contener el vector. Nmero de elementos(N): que indica cuantos elementos hay almacenados en el arreglo en determinado momento. Nota N<=T. T = 10; Real: notas[T] 2 Llenar el vector con los datos: Se puede hacer en el momento de la declaracin asignando al vector los valores que necesitamos almacenar. Ejemplo. real : notas[10] = {2.3 , 3.5 , 4.2 , 3.3 , 3.0 , 4.9 , 4.2 , 3.0 , 2.0 , 1.5 }; recorriendo el arreglo as: para i = 1 hasta N .......leer( notas[i] ) fin del para 3 manipular la informacin guardada en el vector. Para esto es necesario recorrer dicha estructura y se puede hacer de la siguiente manera. para i = 1 hasta N ......mostrar ( notas[i] )

fin del para Las operaciones que se pueden realizar con los arreglos son las siguientes: - lectura (llenar el vector) - escritura (mostrar el vector) - asignacin (dar valor a una posicin especfica) - actualizacin (insercin , eliminacin, modificacin ) - ordenacin . (burbuja, insercin directa, seleccin directa, selle y quicksort). - bsqueda. (secuencial , binaria, hash( por claves) ).

Los procedimientos Estos suelen utilizarse para reducir la duplicacin de cdigos en un programa, permitir reusar los cdigos, descomponer problemas complejos en piezas simples (mejorando la mantenibilidad y facilidad de extensin del cdigo), mejora la lectura del cdigo de un programa, oculta o regula parte de un programa, etc. Los procedimientos son ejecutados cuando son llamados desde otros procedimientos, funciones o mdulos. Los procedimientos pueden recibir parmetros, pero no necesitan devolver un valor como las funciones. En el mbito de la programacin, un procedimiento es un tipo subalgoritmo, es el trmino para describir una secuencia de rdenes que hacen una tarea especfica de una aplicacin ms grande. Las declaraciones de procedimientos generalmente son especificadas por:

Un nombre nico en el mbito.- Nombre del procedimiento con el que se identifica y se distingue de otros. No podr haber otro procedimiento ni funcin con ese nombre (salvo sobrecarga o polimorfismo en programacin orientada a objetos). Una lista de parmetros.- Especificacin del conjunto de argumentos (pueden ser cero, uno o ms) que el procedimiento debe recibir para realizar su tarea. El cdigo u rdenes de procesamiento.- Conjunto de ordenes y sentencias que debe ejecutar el procedimiento. Cadena de caracteres, Es una secuencia ordenada de longitud arbitraria (aunque finita) de elementos que pertenecen a un cierto lenguaje formal o alfabeto anlogas a una frase o a una oracin. En general, una cadena de caracteres es una sucesin de caracteres (letras, nmeros u otros signos o smbolos). Caractersticas: Desde un punto de vista de la programacin, si no se ponen restricciones al alfabeto, una cadena podr estar formada por cualquier combinacin finita de todo el juego de caracteres disponibles (las letras de la 'a' a la 'z' y de la 'A' a la 'Z', los nmeros del '0' al '9', el espacio en blanco ' ', smbolos diversos '!', '@', '%', etc). En este mismo mbito (el de la programacin), se utilizan normalmente como un tipo de dato predefinido, para palabras, frases o cualquier otra sucesin de caracteres. En este caso, se almacenan en un vector de datos, o matriz de datos de una sola fila (array en ingls). Las cadenas se pueden almacenar fsicamente: Seguidas.

Enlazada letra a letra. Generalmente son guardados un carcter a continuacin de otro por una cuestin de eficiencia de acceso.

Longitud de cadenas de caracteres: Segn el concepto anterior, una cadena de caracteres es de una longitud finita y para ser declarada en el lenguaje C se hace de la siguiente manera: Longitud de una cadena (strlen): Devuelve la longitud de una cadena. lon = strlen(palabra);

Procedimiento y funciones para el tratamiento y manejos de sistemas.


Funciones de biblioteca que permiten procesar una cadena de caracteres como una entidad completa. Para usar estas funciones es necesario incluir la biblioteca string.h Asignacin (strcpy): Copia la segunda cadena en la primera cadena. strcpy (cadena1, cadena2); // cadena1 = cadena2 Comparacin (strcmp): Compara dos cadenas. Si son iguales devuelve 0; si la primera es menor que la segunda devuelve un valor < 0; si la primera es mayor que la segunda devuelve un valor > 0.

if (strcmp(cadena1, cadena2) == 0) // Son iguales if (strcmp(cadena1, cadena2) < 0) // cadena1 < cadena2 if (strcmp(cadena1, cadena2) > 0) // cadena1 >

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 esta 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 200 1000 x1 y2 ap100

Las

variables x e y son

declaradas

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 200 1000 x1 y1 ap100

Despus y obtiene el contenido de ap. En el ejemplo ap apunta a la localidad de memoria 100 -- la localidad de x. Por lo tanto, y obtiene el valor de x -- el cual es 1. x = ap; 100 200 1000 ap100

x 100 y 1

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 200 1000 x3 y1 ap100

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 por que se debe conocer en cuantos bytes esta 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 esta 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 */ }

Declaracin de un puntero
Un puntero, en C, se declara como sigue: TIPO * nombre_puntero ; Donde TIPO es cualquier tipo definido. Asi, un puntero a caracter se declararia de la siguiente forma:

char *pchar; Diferencia entre "*" y "&" En C, al contrario que en otros lenguajes de programacion, se puede obtener directamente la direccion de memoria de cualquier variable. Esto es posible hacerlo con el operador unario "&"; asi:

char a;

/* Variable 'a' de tipo char */

printf("la direccion de memoria de 'a' es: %p \n", &a); y para obtener lo apuntado por un puntero se utiliza el operador unario "*" de esta forma:

char a; char *pchar;

/* Variable 'a' de tipo char */ /* Puntero a char 'pchar' */

pchar = &a;

/* 'pchar' <- @ de 'a' */

printf("la direccion de memoria de 'a' es: %p \n", &a); printf("y su contenido es : %c \n", *pchar); Uno de los casos mas comunes donde se ve la relacion entre estos dos operadores es la declaracion y utilizacion de funciones:

void Funcion ( int *int_pointer ) /* Paso de una variable de tipo entero por REFERENCIA */ /* equivalente en Modula 2: PROCEDURE Funcion ( VAR a:INTEGER ) */ . . . int a; a=6; Funcion ( &a ); /* ya que la declaracion de la funcion pide la direccion de una variable de tipo entero */

Aritmtica de punteros
Un puntero apunta a una direccin de memoria. El lenguaje C permite sumar o restar cantidades enteras al puntero, para que apunte a una direccin diferente: aritmtica de punteros .

Consideremos un puntero a enteros: int* ptr; ptr apuntar a cierta direccin de memoria: Pero tambin tendrn un sentido puntero las expresiones ptr+1, ptr+2, que apunta a la etc. La

expresin ptr+k es

direccin

de ptrsumndole k veces el espacio ocupado por un elemento del tipo al que apunta (en este caso un int):

Ejemplo de aritmtica de punteros


int vector [100]; int *ptr; ... ptr = &vector[0]; *ptr = 33; *(ptr+1) = 44; *(ptr+2) = 90; /* ptr apunta al principio del vector */ /* igual que vector[0] = 33 */ /* igual que vector[1] = 44 */ /* igual que vector[2] = 90 */ /* un vector de enteros */ /* un puntero a enteros */

La expresin que se suma al puntero ha de ser entera y no tiene por qu ser constante. Obsrvese que ptr es lo mismo que ptr+0. La expresin sumada NO es el nmero de bytes que se suman a la direccin, es el nmero de elementos del tipo al que apunta el puntero: /* Supongamos que un "char" ocupa 1 byte */ /* y que un "double" ocupa 8 bytes */ char* ptrchar; double* ptrdouble;

... *(ptrchar+3) = 33; /* la direccin es ptrchar + 3 bytes */

*(ptrdouble+3) = 33.0; /* la direccin es ptrdouble + 24 bytes, ya que cada double ocupa 8 bytes */ El compilador "sabe" cmo calcular la direccin segn el tipo.

Aritmtica de punteros
A un puntero se le puede aplicar cualquier clase de operacin de suma o resta (incluyendo los incrementos y decrementos). /* Rellenar de unos los elementos del 10 al 20 */

int* ptr;

/* el puntero */ /* el vector */

int vector [100];

int i; /* variable contadora */ ptr = &vector[0]; /* ptr apunta al origen del vector */

ptr+=10; /* ptr apunta a vector[10] */ for ( i=0; i<=10; i++ ) { *ptr = 1;/*asigna 1 a la posicin de memoria apuntada por "ptr" */ ptr++; } /* ptr pasa al siguiente elemento */

Mtodos de Ordenamiento
1) Bubble Sort (Ordenamiento Burbuja): Es el algoritmo de ordenamiento ms sencillo de todos, conocido tambin como mtodo del intercambio directo, el funcionamiento se basa en la revisin de cada elemento de la lista que va a ser ordenada con el elemento siguiente, intercambiando sus posiciones si estn en el orden equivocado, para esto se requieren varias revisiones hasta que ya no se necesiten ms intercambios, lo que indica que la lista ha sido ordenada. El origen del nombre de este algoritmo proviene de la forma con la que suben por la lista los elementos durante los intercambios, tal y como si fueran "burbujas", el algoritmo fundamental de este mtodo es la simple comparacin de elementos siendo as el ms fcil de implementar.

Codificacin en Java: public static int[] OrdenarBurbuja(int[] n) { int temp; int t = n.length; for (int i = 1; i < t; i++) { for (int k = t- 1; k >= i; k--) { if(n[k] < n[k-1]) { temp = n[k]; n[k] = n[k-1]; n[k-1]= temp;

} } } return n; }

Codificacin en C#: Public int[] OrdenarBurbuja(int[]x) { int t= x.Length, temp; for(int i=1 ; i< t ; i++) { for(int j = t-1 ; j >= i; j--) { if(x[j] < x[j-1]) { temp= x[j]; x[j]= x[j-1]; x[j-1]= temp; } } } }

2) Quick Sort (Ordenamiento Rpido): Es el algoritmo de ordenamiento ms eficiente de todos, se basa en la tcnica de "Divide y Vencers", que permite en promedio, ordenar n elementos

en

un

tiempo

proporcional

n*log(n).

Algoritmo Fundamental: 1. Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote. 2. Resituar los dems elementos de la lista a cada lado del pivote, de manera que a un lado queden todos los menores que l, y al otro los mayores. Los elementos iguales al pivote pueden ser colocados tanto a su derecha como a su izquierda, dependiendo de la implementacin deseada. En este momento, el pivote ocupa exactamente el lugar que le corresponder en la lista ordenada. 3. La lista queda separada en dos sublistas, una formada por los elementos a la izquierda del pivote, y otra por los elementos a su derecha. 4. Repetir este proceso de forma recursiva para cada sublista mientras stas contengan ms de un elemento. Una vez terminado este proceso todos los elementos estarn ordenados. Codificacin en Java: void Quicksort(int[] vector, int first, int last) { int i=first, j=last; int pivote=vector[(first + last) / 2]; int auxiliar;

do { while(vector[i]<pivote) i++;

while(vector[j]>pivote) j--; if (i<=j) { auxiliar=vector[j]; vector[j]=vector[i]; vector[i]=auxiliar; i++; j--; } } while (i<=j);

if(first<j) { Quicksort(vector,first, j); }

if(last>i) { Quicksort(vector,i, last); } }

Codificacin en C#: void Quicksort(int[] v, int prim, int ult) { if (prim < ult)

{ /*Selecciona 1 elemento del vector y coloca los menores que l a su izq y los mayores a su derech*/ int p = Pivote(v, prim, ult, ult);

/* Repite el proceso para c/u de las particiones generadas en el paso anterior */ Quicksort(v, prim, p - 1); Quicksort(v, p + 1, ult); } }

/* Implementacin no clsica de la funcin Pivote. En lugar de recorrer el vector simultneamente desde ambos extremos hasta el cruce de ndices, se recorre desde el comienzo hasta el final */ int Pivote(int[] v, int prim, int ult, int piv) { int p = v[piv]; int j = prim;

// Mueve el pivote a la ltima posicin del vector Intercambia(v, piv, ult);

/* Recorre el vector moviendo los elementos menores o iguales que el pivote al comienzo del mismo */ for (int i = prim; i < ult; i++) { if (v[i] <= p) {

Intercambia(v, i, j); j++; } }

// Mueve el pivote a la posicin que le corresponde Intercambia(v, j, ult);

return j; }

void Intercambia(int[] v, int a, int b) { if (a != b) { int tmp = v[a]; v[a] = v[b]; v[b] = tmp; } }

3) Heap Sort (Ordenamiento por Montculos): Es un algoritmo de ordenamiento no recursivo, no estable, consiste en almacenar todos los elementos del vector a ordenar en un montculo (heap), y luego extraer el nodo que queda como nodo raz del montculo (cima) en sucesivas iteraciones obteniendo el conjunto ordenado. Basa su funcionamiento en una propiedad de los montculos, por la cual, la cima contiene siempre el menor elemento (o el mayor, segn se haya definido el montculo) de todos los almacenados en l.

Codificacin en Java: public class heap_Sort { public static void main(String a[]) { int i; int arr[] = {1,3,4,5,2}; System.out.println("Heap Sort"); System.out.println("\n---------------\n"); System.out.println("\nUnsorted array\n\n"); for (i = 0; i < arr.length; i++) System.out.print(" "+arr[i]); for(i=arr.length; i>1; i--) { fnSortHeap(arr, i - 1); } System.out.println("Sorted array"); System.out.println("\n---------------\n"); for (i = 0; i < arr.length; i++) { System.out.print(" "+arr[i]); } public void fnSortHeap(int arr[], int arr2) { int i, o; int lCh, rCh, mCh, root, tmp; root = (arr2-1)/2;

for(o = root; o >= 0; o--) { for(i=root;i>=0;i--) { lCh = (2*i)+1; rCh = (2*i)+2; if((lCh <= arr2) && (rCh <= arr2)) { if(arr[rCh] >= arr[lCh]) { mCh = rCh; } else { mCh = lCh; } } else { if(rCh > arr2) { mCh = lCh; } else { mCh = rCh; } }

if(arr[i] < arr[mCh]) { tmp = arr[i]; arr[i] = arr[mCh]; arr[mCh] = tmp; } } } tmp = arr[0]; arr[0] = arr[arr2]; arr[arr2] = tmp; return; } } }

Conclusin:

En sentido amplio los mtodos y tcnicas de programacin son herramientas utiles para el uso sintctico y semntico de algoritmos lgicos, mencionando los apuntadores, porque si usted no los puede usar apropiadamente entoces esta perdiendo la oportunidad y la flexibilidad que los lenguaje de programacin le ofrece. Debido que es la nica forma de expresar algunos clculos, generar cdigos compactos eficientes y a su vez trabaja explcitamente con arreglos, estructuras y funciones

Bibliografa:

Joyanes, L. fundamentos de programacin. Algoritmos, estructuras de datos y objetos , 1a edicin, McGeraw-hill,1998. Aho, A.Hopcroft, J. y Ulman J. Estructura de datos y algoritmos 1998 Deitel, H. y Deitel, P. Como programar en C 2a Edicion 1995. Nancy Zambrano. Alecia Elionora Acosta. Tipos y estructuras de datos 2005.

Você também pode gostar