43
REPUBLICA BOLIVARIANA DE VENEZUELA MINISTERIO DEL PODER POPULAR PAR LA DEFENSA UNIVERSIDAD NACIONAL EXPERIMENTAL POLITECNICA DE LA FUERZAS ARMADAS T.S.U ANALISIS Y DISEÑO DE SISTEMAS SEMESTRE 2, SECCION 02 CIUDAD BOLIVAR – ESTADO BOLIVAR PROFESORA: INTEGRANTES: DENIS ACOSTA RICHARD FLORES CI:19.475.691 DELSINE OLISMAR CI: 19.078.403

Arreglos, funciones y procedimientos

Embed Size (px)

Citation preview

Page 1: Arreglos, funciones y procedimientos

REPUBLICA BOLIVARIANA DE VENEZUELAMINISTERIO DEL PODER POPULAR PAR LA DEFENSA

UNIVERSIDAD NACIONAL EXPERIMENTAL POLITECNICADE LA FUERZAS ARMADAS

T.S.U ANALISIS Y DISEÑO DE SISTEMASSEMESTRE 2, SECCION 02

CIUDAD BOLIVAR – ESTADO BOLIVAR

PROFESORA: INTEGRANTES:

DENIS ACOSTA RICHARD FLORES CI:19.475.691 DELSINE OLISMAR CI: 19.078.403 PAULA VERA CI: 20.555.808 STEPHANIE ORTIZ CI: 24.542.177 PAULO VERA CI: 21.178.991

CIUDAD BOLIVAR, 03 DE NOVIEMBRE DE 2012

Page 2: Arreglos, funciones y procedimientos

INTRODUCCION

Los arreglos permiten implementar, representar y manipular de una manera muy conveniente al tipo abstracto de dato secuencia, en particular permiten implementar de manera sencilla los cambios de valores que pueda tener una variable tipo secuencia. Los arreglos se dividen:

Arreglos unidimensionales. Arreglos multidimensionales. Arreglo con múltiple subíndices

Funciones y Procedimientos

Funciones: una función del punto de vista de programación, se define como un proceso que recibe valores de entrada (llamados argumentos) el cual retorna un valor resultante.

Procedimientos: Los procedimientos pueden asimilar a una función que no retorna un resultado, y que puede retornarmás de un valor mediante el uso de parámetros argumentos por referencia.

Lenguaje de programación

Un lenguaje de programación es un idioma artificial diseñado para expresar procesos que pueden ser llevadas a cabo por máquinas como las computadoras. Y está constituido por los diferentes tipos de lenguajes, lenguaje en máquina, lenguaje de bajo nivel, lenguaje de alto nivel, etc.

Page 3: Arreglos, funciones y procedimientos

Arreglos

La mayoría de los lenguajes de programación (JAVA, C, PASCAL, etc.) poseen el tipo arreglo. Como veremos, los arreglos permiten implementar, representar y manipular de una manera muy conveniente al tipo abstracto de dato secuencia, en particular permiten implementar de manera sencilla los cambios de valores que pueda tener una variable tipo secuencia.

Un arreglo es un conjunto de datos o una estructura de datos homogéneos que se encuentran ubicados en forma consecutiva en la memoria RAM (sirve para almacenar datos en forma temporal). Un arreglo puede definirse como un grupo o una colección finita, homogénea y ordenada de elementos. Los arreglos pueden ser de los siguientes tipos:

De una dimensión. De dos dimensiones. De tres o más dimensiones.

Tipos de arreglos

Arreglos unidimensionales. Arreglos multidimensionales. Arreglo con múltiple subíndices.

Arreglos unidimensionales

Es un tipo de datos estructurado que está formado de una colección finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar listas de elementos iguales. Están formados por un conjunto de elementos de un mismo tipo de datos que se almacenan bajo un mismo nombre, y se diferencian por la posición que tiene cada elemento dentro del arreglo de datos. Al declarar un arreglo, se debe inicializar sus elementos antes de utilizarlos. Para declarar un arreglo tiene que indicar su tipo, un nombre único y la cantidad de elementos que va a contener.

Arreglos multidimensionales

Es un tipo de dato estructurado, que está compuesto por dimensiones. Para hacer referencia a cada componente del arreglo es necesario utilizar n índices, uno para cada dimensión. El término dimensión representa el número de índices utilizados para referirse a un elemento particular en el

Page 4: Arreglos, funciones y procedimientos

arreglo. Los arreglos de más de una dimensión se llaman arreglos multidimensionales.

Arreglos con múltiple subíndices

Es la representación de tablas de valores, consistiendo de información arreglada en renglones y columnas. Para identificar un elemento particular de la tabla, deberemos de especificar dos subíndices; el primero identifica el renglón del elemento y el segundo identifica la columna del elemento. A los arreglos que requieren dos subíndices para identificar un elemento en particular se conocen como arreglo de doble subíndice. Note que los arreglos de múltiples subíndices pueden tener más de dos subíndices. El estándar ANSI indica que un sistema ANSI C debe soportar por lo menos 12 subíndices de arreglo.

Operaciones con arreglos

Las operaciones en arreglos pueden clasificarse de la siguiente forma:

Lectura: este proceso consiste en leer un dato de un arreglo y asignar un valor a cada uno de sus componentes

Escritura: Consiste en asignarle un valor a cada elemento del arreglo. Asignación: No es posible asignar directamente un valor a todo el

arreglo Actualización: Dentro de esta operación se encuentran las

operaciones de eliminar, insertar y modificar datos. Para realizar este tipo de operaciones se debe tomar en cuenta si el arreglo está o no ordenado.

Ordenación. Búsqueda. Insertar. Borrar. Modificar.

Ordenaciones en Arreglos

La importancia de mantener nuestros arreglos ordenados radica en que es mucho más rápido tener acceso a un dato en un arreglo ordenado que en uno desordenado. Existen muchos algoritmos para la ordenación de elementos en arreglos, algunos de ellos son:

Page 5: Arreglos, funciones y procedimientos

Selección directa

Este método consiste en seleccionar el elemento más pequeño de nuestra lista para colocarlo al inicio y así excluirlo de la lista. Para ahorrar espacio, siempre que vayamos a colocar un elemento en su posición correcta lo intercambiaremos por aquel que la esté ocupando en ese momento.

Ordenación por burbuja

Es el método de ordenación más utilizado por su fácil comprensión y programación, pero es importante señalar que es el más ineficiente de todos los métodos. Este método consiste en llevar los elementos menores a la izquierda del arreglo ó los mayores a la derecha del mismo. La idea básica del algoritmo es comparar pares de elementos adyacentes e intercambiarlos entre sí hasta que todos se encuentren ordenados.

Ordenación por mezcla

Este algoritmo consiste en partir el arreglo por la mitad, ordenar la mitad izquierda, ordenar la mitad derecha y mezclar las dos mitades ordenadas en un array ordenado. Este último paso consiste en ir comparando pares sucesivos de elementos (uno de cada mitad) y poniendo el valor más pequeño en el siguiente hueco.

Funciones y Procedimientos

Funciones: una función del punto de vista de programación, se define como un proceso que recibe valores de entrada (llamados argumentos) el cual retorna un valor resultante. Las funciones son sub-programas dentro de un programa que se pueden invocar (ejecutar), desde cualquier parte del programa, es decir, desde otra función, desde la misma función o desde el programa principal cuantas veces sea necesario.

Las funciones se usan cuando existen dos o más porciones de algoritmos dentro de un programa que son iguales o muy similares, por ejemplo, en un algoritmo se puede emplear varias veces una porción de algoritmo que eleva a una potencia dada un número real. De esta manera se define una función que al ser invocada ejecute dicho código, y en el lugar donde estaba la porción de algoritmo original, se hace un llamado (ejecución) de la función creada.

Page 6: Arreglos, funciones y procedimientos

Procedimientos: existen porciones de código similares que no calculan un valor si no que por ejemplo, presentan información al usuario, leen una colección de datos o calculan más de un valor. Como una función debe retornar un único valor este tipo de porciones de código no se podrían codificar como funciones. Para superar este inconveniente se creó un concepto más claro de un procedimiento. Los procedimientos pueden asimilar a una función que no retorna un resultado, y que puede retornar más de un valor mediante el uso de parámetros argumentos por referencia. Los procedimientos son muy utilizados en los efectos laterales que se pueden llevar a cabo: imprimir en pantalla, modificar variables, leer datos, etc.

Lenguaje de programación

Un lenguaje de programación es un idioma artificial diseñado para expresar procesos que pueden ser llevadas a cabo por máquinas como las computadoras. Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana. Está formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el código fuente de un programa informático se le llama programación.

También la palabra programación se define como el proceso de creación de un programa de computadora, mediante la aplicación de procedimientos lógicos, a través de los siguientes pasos:

El desarrollo lógico del programa para resolver un problema en particular.

Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa).

Ensamblaje o compilación del programa hasta convertirlo en lenguaje de máquina.

Prueba y depuración del programa. Desarrollo de la documentación.

Existe un error común que trata por sinónimos los términos 'lenguaje de programación' y 'lenguaje informático'. Los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo HTML

Page 7: Arreglos, funciones y procedimientos

(lenguaje para el marcado de páginas web que no es propiamente un lenguaje de programación, sino un conjunto de instrucciones que permiten diseñar el contenido de los documentos).

Permite especificar de manera precisa sobre qué datos debe operar una computadora, cómo deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural. Una característica relevante de los lenguajes de programación es precisamente que más de un programador pueda usar un conjunto común de instrucciones que sean comprendidas entre ellos para realizar la construcción de un programa de forma colaborativa.lenguaje de programación: es un conjunto de elementos y símbolos que permiten ejecutar una serie acciones con las cueles controlamos el computador .

Tipos de lenguajes de programación

Lenguaje en maquina

En informática, cualquier lenguaje artificial que puede utilizarse para definir una secuencia de instrucciones para su procesamiento por un ordenador o computadora. Es complicado definir qué es y qué no es un lenguaje de programación. Se asume generalmente que la traducción de las instrucciones a un código que comprende la computadora debe ser completamente sistemática. Normalmente es la computadora la que realiza la traducción.

Lenguaje de bajo nivel

Se llaman de bajo nivel porque están muy cercanos al hardware del ordenador. Es necesario conocer a fondo la arquitectura de la máquina para la que se va a programar. El primer lenguaje de este tipo que se utilizó fue el lenguaje máquina, que consiste en un conjunto de instrucciones en binario, es decir, con ceros y unos, con los cuales se indica al ordenador qué hacer. Este lenguaje es muy complicado y la posibilidad de cometer errores es muy alta, por lo que ya no se utiliza. Para solventar estas dificultades apareció el lenguaje ensamblador, que consiste en asignar una abreviatura a cada instrucción en binario, de forma que sea más fácil recordarla y más difícil equivocarse. Sin embargo, con este lenguaje sigue siendo necesario conocer muy bien el hardware del ordenador.

Page 8: Arreglos, funciones y procedimientos

Lenguaje de alto nivel Los primeros programas ensambladores producían sólo una

instrucción en lenguaje de máquina por cada instrucción del programa fuente. Para agilizar la codificación, se desarrollaron programas ensambladores que podían producir una cantidad variable de instrucciones en lenguaje de máquina por cada instrucción del programa fuente

Lenguajes compilados

En informática, un lenguaje cuyos programas se traducen a código máquina antes de ejecutarse, a diferencia de un lenguaje interpretado, cuyos programas se traducen y ejecutan instrucción por instrucción.

Lenguajes interpretados

Se puede también utilizar una alternativa diferente de los compiladores para traducir lenguajes de alto nivel. En vez de traducir el programa fuente y grabar en forma permanente el código objeto que se produce durante la corrida de compilación para utilizarlo en una corrida de producción futura, el programador sólo carga el programa fuente en la computadora junto con los datos que se van a procesar

Lenguajes de programación declarativos

Se les conoce como lenguajes declarativos en ciencias computacionales a aquellos lenguajes de programación en los cuales se le indica a la computadora qué es lo que se desea obtener o qué es lo que se está buscando, por ejemplo: Obtener los nombres de todos los empleados que tengan más de 32 años. Eso se puede lograr con un lenguaje declarativo como SQL. Lenguaje de descripción de máquina,lenguaje de programación, como el PostScript, que se utiliza para describir la salida a una impresora o a una pantalla, que a su vez usan las instrucciones del lenguaje de descripción de página para construir el texto y los gráficos para crear la imagen de la página. El lenguaje de descripción de página es como otros lenguajes de ordenador o computadora, con un flujo lógico de programa que permite una manipulación sofisticada de la salida.

Page 9: Arreglos, funciones y procedimientos

Cadena de caracteres

En programación, una cadena de caracteres, palabra, ristra de caracteres o frase (string en inglés) es una secuencia ordenada de longitud arbitraria (aunque finita) de elementos que pertenecen a un cierto lenguaje formal o alfabeto análogas a una frase o a una oración. En general, una cadena de caracteres es una sucesión de caracteres (letras, números u otros signos o símbolos).

Desde un punto de vista de la programación, si no se ponen restricciones al alfabeto, una cadena podrá estar formada por cualquier combinación finita de todo el juego de caracteres disponibles (las letras de la 'a' a la 'z' y de la 'A' a la 'Z', los números del '0' al '9', el espacio en blanco ' ', símbolos diversos '!', '@', '%', etc). En este mismo ámbito (el de la programación), se utilizan normalmente como un tipo de dato predefinido, para palabras, frases o cualquier otra sucesión de caracteres. En este caso, se almacenan en un vector de datos, o matriz de datos de una sola fila (array en inglés). Las cadenas se pueden almacenar físicamente:

Seguidas. Enlazados letra a letra.

Generalmente son guardados un carácter a continuación de otro por una cuestión de eficiencia de acceso.

Un caso especial de cadena es la que contiene cero caracteres, a esta cadena se la llama cadena vacía; en teoría de autómatas es común denotar a la misma por medio de la letra griega .

Operación con cadena de caracteres

Siguiendo en el ámbito de la informática, al considerar las cadenas como un tipo de datos, hay que definir (o conocer) cuales son las operaciones que podemos hacer con ellas, en principio éstas podrían ser muchas y llegar a ser muy sofisticadas, aquí se exponen algunas de ellas:

Asignación: Consiste en asignarle una cadena a otra. Concatenación: Consiste en unir dos cadenas o más (o una cadena

con un carácter) para formar una cadena de mayor tamaño. Búsqueda: Consiste en localizar dentro de una cadena una subcadena

más pequeña o un carácter.

Page 10: Arreglos, funciones y procedimientos

Extracción: Se trata de sacar fuera de una cadena una porción de la misma según su posición dentro de ella.

Comparación: Se utiliza para comparar dos cadenas.

ProcedimientosLa programación con procedimientos tiene dos ventajas importantes:- Los procedimientos permiten dividir la programación de una aplicación en unidades de código lógicas separadas, lo que facilita su depuración y mantenimiento.- Los procedimientos utilizados en un programa pueden actuar como bloques básicos en otros programas, normalmente con una mínima modificación o incluso sin cambios.

Tipos de podrecimientos

En Visual Basic se utilizan varios tipos de podrecimientos: - Los procedimientos Sub que no devuelven ningún valor.- Los procedimientos Function que devuelven un valor.- Los procedimientos Property que permiten crear propiedades para una clase.Si ha observado en los desarrollos realizados hasta ahora, los procedimientos conducidos por eventos son Sub. A su vez podemos clasificar los procedimientos en: - Procedimientos intrínsecos. Son los procedimientos predefinidos en Visual Basic. En este capítulo estudiaremos los más comunes dentro del tratamiento de cadenas de caracteres y expresiones numéricas.

- Procedimientos extrínsecos. Son los procedimientos definidos por el usuario.

Procedimientos Intrínsecos

Los procedimientos intrínsecos los podemos clasificar en:

- Procedimientos para manipular cadenas de caracteres.- Procedimientos para manipular expresiones numéricas.- Procedimientos varios.

Procedimientos para cadenas de caracteres

Una cadena de caracteres es sinónimo de constante de caracteres (se denomina también literal) y es simplemente una secuencia de caracteres

Page 11: Arreglos, funciones y procedimientos

ANSI encerrados entre comillas. Por ejemplo:"Introducir valor" "AFIOO8G-79"

Una cadena de caracteres puede ser manipulada directamente o a través de una variable de caracteres o variable alfanumérica en la que se haya almacenada previamente. Por ejemplo:

Dim etiqueta As Stringetiqueta = InputBox("Etiqueta")etiqueta = etiqueta & "01"

Utilizando el operador de concatenación (&) y los procedimientos de cadenas de caracteres, podemos agrupar las variables y las constantes de caracteres para formar una expresión de caracteres.

Así mismo, utilizando los operadores de relación podemos comparar cadenas de caracteres. Por ejemplo:

Dim cad1 As String, cad2 As String...If cad1 > cad2 Then...

Decir que una cadena es menor, igual o mayor que otra, significa indicar si está antes por orden alfabético, si tienen exactamente los mismos caracteres o si está después por orden alfabético, respectivamente.

Descripción de Procedimientos para cadenas de caracteres

A continuación vamos a ver procedimientos que nos permiten manipular cadenas de caracteres:

Función Len

Da como resultado el número de caracteres de una cadena. Su sintaxis es:

     nombre_variable=Len(expresión_cadena)

Ejemplo:

Page 12: Arreglos, funciones y procedimientos

     Text3.Text = Left(texto, 2) Función Left

Da como resultado el número de caracteres de la expresión_de_cadena situados más a la izquierda. Su sintaxis es:

     nombre_variable=Left(expresión_cadena, n)

Ejemplo:

     Text3.Text = Left(texto, 2)

donde expresión_de_cadena es cualquier expresión de cadenas de caracteres y n es una expresión numérica.

Si n es mayor que Len (expresión_de_cadena), el resaltado es la cadena de caracteres completa. Si n es igual a 0, el resultado es una cadena de caracteres completa.

Función Rigth

Muestra los dos últimos caracteres de la cadena texto y su sintaxis es:

     nombre_variable=Rigth(expresión_cadena, n)

Ejemplo:

     Text3.Text = Right(texto, 2)

Función Mid

Muestra la cadena texto empezando por el primer carácter y con la longitud de la cadena texto y su sintaxis es:

       nombre_variable= Mid(expresión_cadena, n[,m])

Ejemplo:

     Text3.Text = Mid(texto, 1, Len(texto))

Page 13: Arreglos, funciones y procedimientos

Función Instr

Compara dos cadenas de caracteres a partir de una posición numérica en la cadena devolviendo un 0 o un 1 en función de si son iguales o no y su sintaxis es:

       pos= Instr([n,]cadena,cadena_buscada)

Ejemplo:

     Text5.Text = InStr(2, texto, texto)

Función String

Devuelve una cadena de caracteres a partir de un numero(por el que estará formada la cadena resultante) y una cadena que compararemos, y su sintaxis es:

     cadena = String(n,caracter)

Ejemplo:

     Text6.Text = String(1, "a")

Función Str

Convierte una expresión numérica en en una expresión de caracteres y su sintaxis es:

       cadena = Str(n)

Ejemplo:

      Text7.Text = Str(7)

Función Val

Devuelve el valor numérico de una cadena de caracteres y su sintaxis es:

        numero = Val(expresión_de_cadena)

Ejemplo:

Page 14: Arreglos, funciones y procedimientos

        Text8.Text = Val(texto)

Función Chr

Devuelve el asci a un carácter introducido y su sintaxis es

       nombre_variable = Chr(codigo_caracter)

Ejemplo:          Text9.Text = Chr(7)

Función Asc

Devuelve el código de caracter de la primera letra y su sintaxis es:

      codigo_caracter =Asc(expresión_de_cadena)

Ejemplo:

      Text10.Text = Asc("j")

Función Space

Devuelve un numero de espacios y su sintaxis es:

       Cadena =space(numero)

Ejemplo:

       Text11.Text = Space(4)

Variable Date

Devuelve la fecha del sistema y la guarda en una variable y su sintaxis es:        cadena = Date

Ejemplo:

       texto = Date

Page 15: Arreglos, funciones y procedimientos

Sentencia Time

Devuelve la hora del sistema y su sintaxis es:

       cadena = Time

Ejemplo:

      texto = Time

Función UCase y LCase

Convierte una cadena de caracteres a mayúsculas y a minúsculas respectivamente, y su sintaxis es:

      cadena=LCase(expresion_de_cadena)

Ejemplo:

      Text15.Text = LCase(texto)

Procedimientos para expresiones numéricas

Una expresión numérica puede ser una constante, una variable, una función o un conjunto de constantes, variables y funciones unidas por operadores.

Funciones trigonometricas

Las siguientes funciones dan como resultado los valores del seno, coseno, tangente y arco tangente, respectivamente. Su sintaxis es:

      valor = Sin (angulo)      valor = Cos (angulo)      valor = Tan(angulo)       valor = Ant(angulo)

Funciones logarítmicas y exponencial

Page 16: Arreglos, funciones y procedimientos

Log da como resultado el logaritmo neperiano (base e) y Exp da como resultado el valor del número e elevado a la expresión. Su sintaxis es:

     variable = Log(Expresión)     variable = Exp(Expresión)

Funciones de Conversión

Visual Basic proporciona las funciones de conversión siguientes. Cada función convierte una expresión a un tipo de datos específico.

     CBool(expresión) ---> conversión a un valor de tipo Boolean     CByte(expresión) ---> conversión a un valor de tipo Byte     CCur(expresión) ---> conversión a un valor de tipo Currency     CDate(expresión) ---> conversión a un valor de tipo Date     CDbl(expresión) ---> conversión a un valor de tipo Double     CDec(expresión) ---> conversión a un valor de tipo Decimal     CInt(expresión) ---> conversión a un valor de tipo Integer     CLng(expresión) ---> conversión a un valor de tipo Long     CSng(expresión) ---> conversión a un valor de tipo Single     CVar(expresión) ---> conversión a un valor de tipo Variant

LOS APUNTADORES:

Los apuntadores son variables que almacenan direcciones de memoria.

En general una variable contiene un valor específico dependiendo de como fue declarada.

Un apuntador contiene la dirección de una variable que contiene un valor específico.

Una variable se refiere directamente a un valor y un apuntador se refiere indirectamente a un valor.

Apuntadores usados en C debido a que a veces son la única manera de expresar un cálculo.

Se puede llegar a obtener un código más compacto y eficiente.

Page 17: Arreglos, funciones y procedimientos

Cuando se emplean sin cuidado pueden crear programas imposibles de entender.

Cuentan con una declaración propia.

Los apuntadores disponen de dos operadores: El operador unario o monádico “&” devuelve la dirección de memoria de una variable; El operador de indirección o desreferencia “*” devuelve el ``contenido de un objeto apuntado por un apuntador''.

Declaración De Apuntadores:

Cuando se declara una variable, el compilador reserva un espacio de memoria para ella y asocia el nombre de ésta a la dirección de memoria desde donde comienzan los datos de esa variable. Las direcciones de memoria se suelen describir como números en hexadecimal. Un apuntador es una variable cuyo valor es la dirección de memoria de otra variable. Se dice que un apuntador “apunta” a la variable cuyo valor se almacena a partir de la dirección de memoria que contiene el apuntador. Por ejemplo, si un apuntador p almacena la dirección de una variable x, se dice que “p apunta a x”.

Los apuntadores como cualquier otra variable deben de ser declarados antes de que puedan ser utilizados.

El tipo de un apuntador lo proporciona implícitamente el tipo de la variable a la que apunta.

Los apuntadores pueden ser declarados para apuntar a objetos de cualquier clase.

La sintaxis general de declaración es:

<tipo> * <variable>

Ejemplos de declaraciones:

La variable contPtr es del tipo apuntador a entero, (int *) y se lee ``contPtr es un apuntador a int'' o ``contPtr apunta a una variable entera''.

Page 18: Arreglos, funciones y procedimientos

NOTA: Un apuntador a cualquier tipo de variables es una dirección en memoria, la cual es una dirección entera, pero un apuntador NO es un entero.

La razón 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 función del tamaño del dato. Por lo tanto para un apuntador a un char, se agrega un byt a la dirección 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.

Los Operadores De Los Apuntadores:

Un operador de dirección &:

Representa la dirección de memoria de la variable que le sigue; Operador unario que regresa la dirección de su operando, ejemplo:

                            main()

                           {                                             int y;                                             int *yPtr;

                                            y = 5;                                             yPtr = &y;                             }

Un operador de indirección o de desreferencia:

*. El operador * aplicado al nombre de un apuntador indica el valor de la variable apuntada; Regresa el valor del objeto hacia el cual su operando apunta, es decir un apuntador, ejemplo:

                           main()

                            {                                          int x,y;                                          int *py;

Page 19: Arreglos, funciones y procedimientos

                                       y = 5;                                       *py = y;                                       x = *py + 5;                                      printf(''%d %d nn'',*py,x);                             }

Veamos con un ejemplo en C la diferencia entre todos estos conceptos

Es decir: int x = 25, *pint;

pint = &x;

La variable pint contiene la dirección de memoria de la variable x. La expresión: *pint representa el valor de la variable (x) apuntada, es decir 25. La variable pint también tiene su propia dirección: &pint

Inicialización de apuntadores:

< Almacenamiento > < Tipo > * < Nombre > = < Expresión >

Si <Almacenamiento> es extern o static, <Expresión> deberá ser una expresión constante del tipo <Tipo> expresado.

Si <Almacenamiento> es auto, entonces <Expresión> puede ser cualquier expresión del <Tipo> especificado.

Ejemplos:

La constante entera 0, NULL (cero) proporciona un apuntador nulo a cualquier tipo de dato:

int *p;

p = NULL; //actualización

El nombre de un arreglo de almacenamiento static o extern se transforma según la expresión:

a) float mat[12];

float *punt = mat;

Page 20: Arreglos, funciones y procedimientos

b) float mat[12];

float *punt = &mat[0];

Un “cast” apuntador a apuntador:

int *punt = (int *) 123.456;

Inicializa el apuntador con el entero. Esto es, en la dirección a la que apunta la variable punt se almacena el valor 123.

Un apuntador a carácter puede inicializarse en la forma:

char *cadena = Esto es una cadena”;

Se pueden sumar o restar valores enteros a las direcciones de memoria en la forma:

(aritmética de apuntadores)

static int x;

int *punt = &x+2, *p = &x-1;

Equivalencia: Dos tipos definidos como APUNTADORES a objeto P y apuntador a objeto son equivalentes sólo si P y Q son del mismo tipo. Aplicado a matrices:

nombre_apuntador = nombre_matriz;

Apuntadores y Funciones:

Cuando C pasa argumentos a funciones, los pasa por valor, es decir, si el parámetro es modificado dentro de la función, una vez que termina la función el valor pasado de la variable permanece inalterado.

Hay muchos casos que se quiere alterar el argumento pasado a la función y recibir el nuevo valor una vez que la función 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 dirección del argumento a la función.

Page 21: Arreglos, funciones y procedimientos

Para entender mejor lo anterior consideremos la función 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 estrecha relación entre apuntadores y arreglos, tanto que pueden ser usados en forma casi indistinta. En C, un nombre de un arreglo es un índice a la dirección de comienzo del arreglo. En esencia, el nombre de un arreglo es un puntero al arreglo.

Page 22: Arreglos, funciones y procedimientos

Una variable de tipo arreglo puede considerarse como un apuntadora tipo del arreglo.

Los apuntadores pueden ser utilizados en cualquier operación que involucre subíndices de arreglos.

Ejemplo:

main() {

            int tabla[10],i,x,*pt,*ptr;                         pt = &tabla[0];                         x = *pt;

                        for (i=0; i!10; i++)                                 *(pt+i) = random();                         ptr = tabla;

                        for (i=0; i!10; i++)                                 printf(''%d nn'',*(ptr+i),tabla[i]);

}  

Cuando se suma 1 a un apuntador el incremento se adecua al tamaño en memoria del objeto apuntado.

Un apuntador es una variable, por lo que operaciones como pa = a y pa++ son permitidas.

Un nombre de un arreglo es una constante, no una variable, de ahí que a = pa o a++ o p = a.

Arreglos de apuntadores:

Los arreglos pueden contener apuntadores.

El uso más común es el de formar arreglos de cadenas de caracteres.

Cada entrada en el arreglo es un apuntador al primer carácter de la cadena.

Page 23: Arreglos, funciones y procedimientos

Sea la declaración:

char * mensaje[4] = {''Hola'',''Adios'',''Bye'',''Salut''}

Cada cadena está almacenada en memoria como una cadena de caracteres terminada en NULL n0.

En el arreglo no están colocadas las cadenas, tan solo están almacenados los apuntadores.

Aunque el arreglo es de tamaño fijo, permite el acceso a cadenas de caracteres de cualquier longitud.

En C se pueden tener arreglos de apuntadores ya que los apuntadores son variables.

A continuación se muestra un ejemplo de su uso: ordenar las líneas de un texto de diferente longitud.

Los arreglos de apuntadores son una representación de datos que manejan de una forma eficiente y conveniente líneas de texto de longitud variable.

¿Cómo se puede hacer lo anterior?

Guardar todas las líneas en un arreglo de tipo char grande. Observando que \n marca el fin de cada línea.

Guardar los apuntadores en un arreglo diferente donde cada apuntador apunta al primer caracter de cada línea.

Comparar dos líneas usando la función de la biblioteca estándar strcmp().

Si dos líneas están desacomodadas -- intercambiar (swap) los apuntadores (no el texto). 

Page 24: Arreglos, funciones y procedimientos

Arreglos de apuntadores (Ejemplo de ordenamiento de cadenas).

Con lo anterior se elimina:

El manejo complicado del almacenamiento.

Alta sobrecarga por el movimiento de líneas.

Apuntadores y arreglos multidimensionales:

Puede provocar confusión el uso de arreglos de dos dimensiones y un arreglo de apuntadores.

Considerar:

                             int a[10][10];                                 int *b[10];

El uso de a y b puede ser parecido, desde el momento en que a[5][5] y b[5][5] son referencias validas a un int

El arreglo a es un arreglo verdadero, existen 100 celdas de memoria asignadas y se efectúa el cálculo de subíndices rectangulares convencional para localizar un elemento dado

Sin embargo, a b la declaración solo le asigna 10 apuntadores, cada uno de los cuales deberá de apuntar a un arreglo de enteros

Page 25: Arreglos, funciones y procedimientos

La desventajas de b son:

Ocupa más espacio, suponiendo que cada uno apunta a un arreglo de 10 elementos, el tamaño será de 10 apuntadores más 100 elementos.

Se debe de crear el espacio de los arreglos antes de asignarlos.

o La declaración b tiene dos ventajas:

o El acceso se hace más rápido, una inderección es más rapida que el hacer una multiplicación seguida de una suma.

o El tamaño de los arreglos apuntados por cada una de las diez  localidades pueden ser diferentes.

Un arreglo multidimensional puede ser visto en varias formas en C, por ejemplo:

Un arreglo de dos dimensiones es un arreglo de una dimensión, donde cada uno de los elementos es en sí mismo un arreglo.

Por lo tanto, la notación

a[n][m]

nos indica que los elementos del arreglo están guardados renglón por renglón.

Cuando se pasa una arreglo bidimensional a una función se debe especificar el número de columnas -- el número de renglones es irrelevante.

La razón de lo anterior, es nuevamente los apuntadores. C requiere conocer cuantas son las columnas para que pueda brincar de renglón en renglón en la memoria.

Considerando que una función deba recibir int a[5][35], se puede declarar el argumento de la función como:

f( int a[][35] ) { ..... }

o aún

Page 26: Arreglos, funciones y procedimientos

f( int (*a)[35] ) { ..... }

En el último ejemplo se requieren los parénteis (*a) ya que [ ] tiene una precedencia más alta que *.

Por lo tanto:

int (*a)[35]; declara un apuntador a un arreglo de 35 enteros, y por ejemplo si hacemos la siguiente referencia a+2, nos estaremos refiriendo a la dirección del primer elemento que se encuentran en el tercer renglón de la matriz supuesta, mientras que

int *a[35]; declara un arreglo de 35 apuntadores a enteros.

Ahora veamos la diferencia (sutil) entre apuntadores y arreglos. El manejo de cadenas es una aplicación común de esto.

Considera:

char *nomb[10];

char anomb[10][20];

En donde es válido hacer nomb[3][4] y anomb[3][4] en C.

Sin embargo:

anomb es un arreglo verdadero de 200 elementos de dos dimensiones tipo char.

El acceso de los elementos anomb en memoria se hace bajo la siguiente fórmula 20*renglon + columna + dirección_base

En cambio nomb tiene 10 apuntadores a elementos.

NOTA: si cada apuntador en nomb indica un arreglo de 20 elementos entonces y solamente entonces 200 chars estarán disponibles (10 elementos).

Con el primer tipo de declaración se tiene la ventaja de que cada apuntador puede apuntar a arreglos de diferente longitud.

Page 27: Arreglos, funciones y procedimientos

Considerar:

char *nomb[] = { "No mes", "Ene", "Feb", "Mar", .... };

char anomb[][15] = { "No mes", "Ene", "Feb", "Mar", ... };

Lo cual gráficamente se muestra en la figura. Se puede indicar que se hace un manejo más eficiente del espacio haciendo uso de un arreglo de apuntadores y usando un arreglo bidimensional.

Arreglo de 2 dimensiones VS. arreglo de apuntadores.

Diferentes formas de declarar a[i][j]:

Cuando se ve la referencia a un arreglo de dos dimensiones, a[i][j] , no se puede deducir inmediatamente como fue declarado a :

o Como un arreglo de 10 arreglos de tamaño 20

Page 28: Arreglos, funciones y procedimientos

int a[10][20];

o Como un arreglo de tamaño 20 de vectores de longitud variable

int *a[10];

o Como un apuntador de apuntadores a enteros

int **a;

o Como un apuntador a un arreglo de enteros de tama~no 20

int (* a)[20];

o Para poder direccionar un elemento de un apuntador de apuntadores se sigue la regla:

tab[i][j] * ( *(tab + i) + j)

ARGUMENTOS EN LA LÍNEA DE COMANDOS:

o Existe una forma de transmitr al programa los argumentos de la línea de comando, o parámetros, cuando comienza la ejecución

o Cuando se invoca el main() se le puede pasar dos argumentos, (los nombres son por convención):

o argc es el número de argumentos en la línea de comandos.o argv[] es un apuntador a un arreglo de cadena de caracteres que

contienen los argumentos, uno por cadena

Ejemplo de uso:

main( int argc, char *argv[]) { int i; for (i=0; i!argc; i++) printf(''Argumento %d :'' %s'',); }  

Ya que el primer elemento del arreglo, ( *argv[] ) apunta a la cadena que contiene el nombre del comando, argc es al menos igual a 1.

Page 29: Arreglos, funciones y procedimientos

Esta estructura de datos es creada por el sistema operativo, (Unix u otro), por lo que la única preocupación del programador es usarla, no generarla.

Fallas comunes con apuntadores:

A continuación se muestran dos errores comunes que se hacen con los apuntadores:

No asignar un apuntador a una dirección de memoria antes de usarlo:

int *x

*x = 100;

lo adecuado será, tener primeramente una localidad física de memoria, digamos int y;

int *x, y;

x = &y;

*x = 100;

Indirección no válida:

Supongamos que se tiene una función llamada malloc() la cual trata de asignar memoria dinámicamente (en tiempo de ejecución), la cual regresa un apuntador al bloque de memoria requerida si se pudo o un apuntador a nulo en otro caso.

char *malloc() -- una función de la biblioteca estándar que se verá más adelante.

Supongamos que se tiene un apuntador char *p

Considerar:

*p = (char *) malloc(100): /* pide 100 bytes de la memoria */

*p = 'y';

Existe un error en el código anterior. ¿Cuál es?

Page 30: Arreglos, funciones y procedimientos

El * en la primera línea ya que malloc regresa un apuntador y *p no apunta a ninguna dirección.

El código correcto deberá ser:

p = (char *) malloc(100);

Ahora si malloc no puede regresar un bloque de memoria, entonces p es nulo, y por lo tanto no se podrá hacer:

*p = 'y';

Un buen programa en C debe revisar lo anterior, por lo que el código anterior puede ser reescrito como:

p = (char *) malloc(100): /* pide 100 bytes de la memoria */

if ( p == NULL )

{

printf("Error: fuera de memoria\n");

exit(1);

}

*p = 'y';

Apuntadores de mayor complejidad:

int *p; p es un apuntador a un entero

int *p[10]; p es un arreglo de 10 apuntadores a enteros

int (*p)[10]; p es un apuntador a un arreglo de 10 enteros

int *p(void); p es una función que devuelve un apuntador a entero

Page 31: Arreglos, funciones y procedimientos

int p(char *a); p es una función que acepta un argumento que es un apuntador a carácter, devuelve un entero

int *p(char *a); p es una función que acepta un argumento que es un apuntador a carácter, devuelve un apuntador a entero

int (*p)(char *a); p es un apuntador a función que acepta un argumento que es un apuntador a carácter, devuelve un apuntador a entero

int (*p(char *a))[10]; p es una función que acepta un argumento que es un apuntador a carácter, devuelve un apuntador a un arreglo de 10 enteros

int p(char (*a)[]); p es un apuntador a función que acepta un argumento que es un apuntador a un arreglo de caracteres, devuelve un apuntador a entero

int p(char *a[]); p es un apuntador a función que acepta un argumento que es un arreglo de apuntadores a caracteres, devuelve un apuntador a entero

int *p(char a[]); p es una función que acepta un argumento que es un arreglo de caracteres, devuelve un apuntador a entero

int *p(char (*a)[]); p es una función que acepta un argumento que es un apuntador a un arreglo de caracteres, devuelve un apuntador a entero

int *p(char *a[]); p es una función que acepta un argumento que es un apuntador a un arreglo de apuntadores a caracteres, devuelve un apuntador a entero

int (*p)(char (*a)[]); p es una función que acepta un argumento que es un apuntador a un arreglo de caracteres, devuelve un apuntador a entero

int *(*p)(char (*a)[]); p es un apuntador a una función que acepta un argumento que es un apuntador a un arreglo de apuntadores a caracteres, devuelve un apuntador a entero

int *(*p)(char *a[]); p es un apuntador a una función que acepta un argumento que es un arreglo de apuntadores a caracteres, devuelve un apuntador a entero

int(*p[10])(void); p es una arreglo de 10 apuntadores a función, cada función devuelve un entero

Page 32: Arreglos, funciones y procedimientos

int (*p[10])(char * a); p es un arreglo de 10 apuntadores a función; cada función acepta un argumento que es un apuntador a carácter y devuelve un entero

int *(*p[10])(char a); p es un arreglo de 10 apuntadores a función; cada función acepta un argumento que es un carácter, y devuelve un apuntador a entero

char *(*p[10])(char * a); p es un arreglo de 10 apuntadores a función; cada función acepta un argumentoque es un carácter, y devuelve un apuntador a carácter.

Page 33: Arreglos, funciones y procedimientos

Conclusión

Al tratar el tema de lenguajes de programación estamos hablando de los arreglos y de los tipos de lenguaje donde cada de uno de ellos cumplen con una función de diseñar y expresar procesos que pueden ser llevados a cabos por maquinas como la computadora.

Donde a través de pasos cumplen con la ejecución, como: El desarrollo lógico del programa para resolver un problema en partícula también tomando en cuenta el lenguaje de máquina que consta de números binarios (cero y uno) el lenguaje de alto y bajo nivel , lenguaje compiladores , lenguaje interpretados y los lenguaje compiladores.

Son lenguajes donde su desarrollo consiste en la función y la ejecución de ensamblaje o compilación del programa hasta convertirlo en el proceso que se desea ejecutar.