Académique Documents
Professionnel Documents
Culture Documents
Los arreglos son una colección de variables del mismo tipo que se referencian utilizando
un nombre común. Un arreglo consta de posiciones de memoria contigua. La dirección
más baja corresponde al primer elemento y la más alta al último. Un arreglo puede tener
una o varias dimensiones. Para acceder a un elemento en particular de un arreglo se usa
un índice. El formato para declarar un arreglo unidimensional es:
Por ejemplo, para declarar un arreglo de enteros llamado a con diez elementos se hace
de la siguiente forma:
Int a[10]; En C, todos los arreglos usan cero como índice para el primer elemento. Por
tanto, el ejemplo anterior declara un arreglo de enteros
condiez elementos desde a[0] hasta a[9]. La forma como pueden seraccesados los
elementos de un arreglo, es de la siguiente forma:
num = a[2]; /* Asigna el contenido del 3er elemento a la variable num */ El lenguaje C no
realiza comprobación de contornos en los arreglos. En el caso de que sobrepase el final
durante una operación de asignación, entonces se asignarán valores a otra variable o a
un trozo del código, esto es, si se dimensiona un arreglo de tamaño N, se puede
referenciar el arreglo por encima de N sin provocar ningún mensaje de error en tiempo
de compilación o ejecución, incluso aunque probablemente se provoque un error en el
programa. Como programador se es responsable de asegurar que todos los arreglos
sean lo suficientemente grandes para guardar lo que pondrá en ellos
el programa. C permite arreglos con más de una dimensión, el formato general es:
tipo nombre_arr [ tam1 ][ tam2 ] ... [ tamN]; Por ejemplo un arreglo de enteros
bidimensionales se escribirá como:
pág. 2
int b[50][50]; Observar que para declarar cada dimensión lleva sus propios paréntesis
cuadrados.
Para acceder los elementos se procede de forma similar al ejemplo del arreglo
unidimensional, esto es,
t,i,num[t][i]); printf("\n"); }
Por ejemplo:
int num[3][4]={0,1,2,3,4,5,6,7,8,9,10,11}
ARREGLOS:
Las estructuras de datos que hemos visto hasta ahora (listas, tuplas, diccionarios,
conjuntos) permiten manipular datos de manera muy flexible. Combinándolas y
anidándolas, es posible organizar información de manera estructurada para representar
sistemas del mundo real.
pág. 3
Algunos ejemplos de problemas que requieren manipular grandes secuencias de
números son: la predicción del clima, la construcción de edificios, y el análisis de
indicadores financieros entre muchos otros.
La estructura de datos que sirve para almacenar estas grandes secuencias de números
(generalmente de tipo float) es el arreglo.
Los arreglos tienen algunas similitudes con las listas: los elementos tienen un orden y se
pueden acceder mediante su posición, los elementos se pueden recorrer usando un ciclo
for.
Sin embargo, también tienen algunas restricciones: todos los elementos del arreglo
deben tener el mismo tipo, en general, el tamaño del arreglo es fijo (no van creciendo
dinámicamente como las listas), se ocupan principalmente para almacenar datos
numéricos.
Los arreglos son los equivalentes en programación de las matrices y vectores
de las matemáticas. Precisamente, una gran motivación para usar arreglos es que hay
mucha teoría detrás de ellos que puede ser usada en el diseño de algoritmos para
resolver problemas verdaderamente interesantes.
Crear arreglos
El módulo que provee las estructuras de datos y las funciones para trabajar con arreglos
se llama NumPy, y no viene incluido con Python, por lo que hay que instalarlo por
separado.
El tipo de datos de los arreglos se llama array. Para crear un arreglo nuevo, se puede
usar la función array pasándole como parámetro la lista de valores que deseamos
agregar al arreglo:
>>>a= a r r a y ( [ 6,1,3,9,8])
>>>a
array([6, 1, 3, 9, 8])
pág. 4
Todos los elementos del arreglo tienen exactamente el mismo tipo. Para crear un arreglo
de números reales, basta con que uno de los valores lo sea:
>>>b= a r r a y ( [ 6.0,1,3,9,8])
>>>b
array([ 6., 1., 3., 9., 8.])
Otra opción es convertir el arreglo a otro tipo usando el método astype:
>>>aa r r a y ( [ 6 , 1 , 3 , 9 , 8 ] )
>>>a.a s t y p e ( float)
array([ 6., 1., 3., 9., 8.])
>>>a.a s t y p e ( complex)
array([ 6.+0.j, 1.+0.j, 3.+0.j, 9.+0.j, 8.+0.j])
pág. 5
>>>list( s i n ( x ) )
[0.0, 0.19509032201612825, 0.38268343236508978, 0.5555702330 1
960218, 0.70710678118654746, 0.83146961230254524,
0.9238795 3251128674, 0.98078528040323043, 1.0].
Los arreglos bidimensionales también son provistos por NumPy, por lo que debemos
comenzar importando las funciones de este módulo
pág. 6
Los arreglos tienen un atributo llamado shape, que es una tupla con los tamaños de
cada dimensión. En el ejemplo, a es un arreglo de dos dimensiones que tiene tres filas y
cuatro columnas:
>>>a.s h a p e
(3, 4)
Los arreglos también tienen otro atributo llamado size que indica cuántos elementos tiene
el arreglo:
>>>a.s i z e
12
Por supuesto, el valor de a.size siempre es el producto de los elementos de a.shape.
Hay que tener cuidado con la función len, ya que no retorna el tamaño del arreglo, sino
su cantidad de filas:
>>>len(a)
3
Las funciones zeros y ones también sirven para crear arreglos bidimensionales. En vez
de pasarles como argumento un entero, hay que entregarles una tupla con las cantidades
de filas y columnas que tendrá la matriz:
>>>z e r o s ( ( 3,2))
array([[ 0., 0.],
[ 0., 0.],
[ 0., 0.]])
>>>o n e s ( ( 2,5))
array([[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
Lo mismo se cumple para muchas otras funciones que crean arreglos; por ejemplo la
función random:
>>>f r o m numpy.random import r a n d o m
>>>r a n d o m ( ( 5,2))
array([[ 0.80177393, 0.46951148],
pág. 7
[ 0.37728842, 0.72704627],
[ 0.56237317, 0.3491332 ],
[ 0.35710483, 0.44033758],
[ 0.04107107, 0.47408363]])
Operaciones con arreglos bidimensionales
Al igual que los arreglos de una dimensión, las operaciones sobre las matrices se
aplican término a término:
>>>a= a r r a y ( [ [ 5,1,4],
... [0,3,2]])
>>>b= a r r a y ( [ [ 2,3,-1],
... [1,0,1]])
>>>a+ 2
array([[7, 3, 6],
[2, 5, 4]])
>>>a** b
array([[25, 1, 0],
[ 0, 1, 2]])
Cuando dos matrices aparecen en una operación, ambas deben tener exactamente la
misma forma:
>>>a= a r r a y ( [ [ 5,1,4],
... [0,3,2]])
>>>b= a r r a y ( [ [ 2,3],
... [-1,1],
... [0,1]])
>>>a+ b
Traceback (most recent call last):
File"<stdin>", line1, in <module>
V a l u e E r r o r : shape mismatch: objects cannot be broadcast to a single s h a p e
pág. 8
Obtener elementos de un arreglo bidimensional
Para obtener un elemento de un arreglo, debe indicarse los índices de su fila i y su
columna j mediante la sintaxis a[i, j]:
>>>a= a r r a y ( [ [ 3.21, 5.33, 4.67, 6.41],
[ 9.54, 0.30, 2.14, 6.57],
[ 5.62, 0.54, 0.71, 2.56],
[ 8.19, 2.12, 6.28, 8.76],
[ 8.72, 1.47, 0.77, 8.78]])
>>>a[1,2]
2.14
>>>a[4,3]
8.78
>>>a[-1,-1]
8.78
>>>a[0,-1]
6.41
También se puede obtener secciones rectangulares del arreglo usando el operador de
rebanado con los índices:
>>>a[2:3,1:4]
array([[ 0.54, 0.71, 2.56]])
>>>a[1:4,0:4]
array([[ 9.54, 0.3 , 2.14, 6.57],
[ 5.62, 0.54, 0.71, 2.56],
[ 8.19, 2.12, 6.28, 8.76]])
>>>a[1:3,2]
array([ 2.14, 0.71])
>>>a[0:4:2,3:0:-1]
array([[ 6.41, 4.67, 5.33],
[ 2.56, 0.71, 0.54]])
>>>a[::4, ::3]
array([[ 3.21, 6.41],
pág. 9
[ 8.72, 8.78]])
Para obtener una fila completa, hay que indicar el índice de la fila, y poner: en el de las
columnas (significa «desde el principio hasta el final»). Lo mismo para las columnas:
>>>a[2, :]
array([ 5.62, 0.54, 0.71, 2.56])
5.3. Archivos
Las reglas exactas para nombrar archivos varían tanto de un sistema a otro, pero todos
los sistemas operativos permiten cadenas de 1 a 8 caracteres como nombres de archivos
válidos. En muchos casos se permite también dígitos y caracteres especiales.
Estructura de Archivos
Los archivos pueden estructurarse de varias maneras. Tres posibles comunes son:
Secuencia de bytes
Secuencia de registros
pág. 10
Árbol
Tipos de Archivos
Archivos Regulares: Son los que contienen información del usuario.
Directorios: Son archivos de sistema que sirven para mantener la estructura del
sistema de archivos.
Archivos Especiales por Caracteres: Están relacionados con E/S y sirven para
modelar dispositivos de E/S en serie.
Archivos Especiales por Bloques: Sirven para modelar discos.
Acceso a Archivos
Los primeros sistemas operativos solo ofrecían un tipo de acceso a los archivos: Acceso
Secuencial. En estos sistemas, un proceso podía leer todos los bytes o registros de un
archivo en orden, comenzado por el principio, pero no podía saltar de un lado a otro y
leerlos en desorden.
Atributos de Archivos
Todo archivo tiene un nombre y ciertos datos. Además, todos los sistemas operativos
asocian información adicional a cada archivo. Llamamos a estos datos adicionales
Atributos del Archivo. La lista de atributos varía considerablemente de un sistema a otro.
pág. 11
Open
Close
Rea
Write
Append
Seek
Get attributes
Set attributes
Rename
Ejm:
char c1,c2,c3;
c1 = „a‟; c2 = ‟)‟; c3 = ‟9‟;
Características de caracteres:
Secuencialidad de los caracteres
comparar caracteres… c1>c2
mayúsculas < minúsculas..
Ejemplo:
int i;
for (i=65; i<91; i++)
Ejemplo:
char c;
for (c='a'; c<='z'; c++)
Problemas:
car1, car3,
pág. 12
Tabla ascii
Conversión mayúsculas a minúsculas…
Arreglo de caracteres
char a[N]={'r','u','t','h'};
Problema:
detectar un palíndrome
String:
Cadena de caracteres.
char linea[] = "buenos dias"
b u e n o s d i a s \0
0 1 2 3 4 5 6 7 8 9 10 11
Ejemplos:
como asignar datos a un string [string1.c]
ingresa nombre y saluda [string2.c]
despliega las letras del nombre separadas con un blanco [string3.c]
pág. 13
6. Funciones
6.1. Introducción
Subalgoritmo.
Se le llama así a cada una de las partes de un algoritmo más general que resuelve cada
una de las tareas particulares necesarias para que dicho algoritmo general alcance el
objetivo para el que fue diseñado, es decir resolver un problema.
Las variables globales: son declaradas de forma que puedan ser utilizadas (consultada
y/o modificada) desde cualquiera de los módulos que forman el programa. En este caso,
no puede haber dos variables globales con el mismo nombre, ya que esto produciría una
ambigüedad que el compilador no podría resolver.
Función.
También conocido como una subrutina o subprograma, como idea general, se presenta
como un Subalgoritmo que forma parte del algoritmo principal, el cual permite resolver
una tarea específica. Algunos lenguajes de programación, como Visual Basic .NET o
Fortran, utilizan el nombre función para referirse a subrutinas que devuelven un valor.
Una subrutina al ser llamada dentro de un programa hace que el código principal se
detenga y se dirija a ejecutar el código de la subrutina, en cambio cuando se llama a una
macro, el compilador toma el código de la macro y lo implanta donde fue llamado,
aumentando así el código fuente y por consiguiente el objeto.
pág. 14
Un nombre único en el ámbito: nombre de la función con el que se identifica y se distingue
de otras.
Un tipo de dato de retorno: tipo de dato del valor que la subrutina devolverá al terminar
su ejecución.
Una lista de parámetros: especificación del conjunto de argumentos (pueden ser cero,
uno o más) que la función debe recibir para realizar su tarea.
Donde se puede ver claramente donde inicia la función del programa y donde termina.
pág. 15
6.2. Funciones estándar
1. Cadenas de caracteres.
Len: Indica la cantidad de caracteres que tiene una determinada cadena.
Lcase y Ucase: Convierte cadenas de texto aminúscula y mayúscula.
2. Con números.
Round: se utiliza para redondear un número decimal, devolviendo un número entero.
Dim Mimumero As Long
Minumero = Round (245.8) '(La función devuelve 246)
3. Fechas
FormatCurrency: Formato en dinero.
Ejemplo:
FormatCurrency(txt1) esto quiere decir que los datos numéricos puestos en el text box
1 se dará en forma de dinero
FormatPercent: Porcentajes.
pág. 16
4. Presentar mensajes en pantalla
pág. 17
Ejemplos:
Ejemplos:
Cuadro de Mensaje
pág. 18
Función InputBox
La sintaxis es:
Salida de datos
El método Print visualiza datos en un formulario (objeto Form). Así mismo, permite
visualizar datos en la ventana inmediato (a través del objeto Debug), en una caja de
imagen (ControlPictureBox) o en una impresora (utilizando el objeto Printer)
6.4. Funciones definidas por el usuario
Son funciones que el usuario crea para cubrir necesidades que están fuera del alcance
de las funciones estándar. Cada función tiene una misión muy concreta, de modo que
nunca tiene un número de líneas excesivo y siempre se mantiene dentro de un tamaño
manejable. Es muy frecuente que al hacer una modificación para añadir una
funcionalidad o corregir un error, se introduzcan nuevos errores en partes del programa
que antes funcionaban correctamente.
Además, una misma puede ser llamada muchas veces en un mismo programa, e incluso
puede ser reutilizada por otros programas. Una función es capaz de mantener una gran
independencia con el resto del programa.
pág. 19
Para llamar a un procedimiento se escribe su nombre en el cuerpo del programa, y si los
necesita, se incluyen los parámetros entre paréntesis. Para invocar una función es
necesario hacerlo en una expresión.
Las ventajas de utilizar las funciones definidas por el usuario en SQL Server son:
Al igual que los procedimientos almacenados, las funciones definidas por el usuario
Transact-SQL reducen el costo de compilación del código Transact-SQL almacenando
los planes en la caché y reutilizándolos para ejecuciones repetidas. Esto significa que no
es necesario volver a analizar y optimizar la función definida por el usuario con cada uso,
lo que permite obtener tiempos de ejecución mucho más rápidos.
Las funciones CLR ofrecen una ventaja de rendimiento importante sobre las funciones
Transact-SQL para tareas de cálculo, manipulación de cadenas y lógica empresarial.
Transact-SQL se adecuan mejor a la lógica intensiva del acceso a datos.
Una operación que filtra datos basándose en restricciones complejas que no se puede
expresar en una sola expresión escalar se puede expresar como una función. La función
se puede invocar en la cláusula WHERE para reducir el número de filas que se envían
al cliente.
Tipos de funciones
Función escalar:
pág. 20
Las funciones escalares definidas por el usuario devuelven un único valor de datos del
tipo definido en la cláusula RETURNS. En una función escalar insertada no hay cuerpo
de la función; el valor escalar es el resultado de una sola instrucción. Para una función
escalar de varias instrucciones, el cuerpo de la función, definido en un bloque
BEGIN...END, contiene una serie de instrucciones de Transact-SQL que devuelven el
único valor. El tipo devuelto puede ser de cualquier tipo de datos excepto
Las funciones con valores de tabla definidas por el usuario devuelven un tipo de datos
table. Las funciones insertadas con valores de tabla no tienen cuerpo; la tabla es el
conjunto de resultados de una sola instrucción SELECT.
SQL Server proporciona numerosas funciones del sistema que se pueden usar para
realizar diversas operaciones. No se pueden modificar.
Pasar por valor implica crear una nueva variable dentro de la función y pasarle una copia
del valor de la variable externa. Si se modifica el valor de la variable copia, la variable
original queda inalterada.
Las enumeraciones, ya que su tipo subyacente es siempre SByte, Short, Integer, Long,
Byte, UShort, UInteger o ULong.
pág. 21
Pasando datos de tipo básico
Sea la función
void funcion (int x){
x=5;
System.out.println("dentro de la función: a="+x);
}
Sea la variable a que toma inicialmente el valor de 3. ¿Cuál será el valor de
a después de la llamada a la función funcion?
int a=3;
funcion(a)
;System.out.println("después de la llamada: a="+a);
Pasando objetos
Creamos una clase Entero muy sencilla que tiene como miembro dato un número entero
valor, y un constructor que inicializa dicho miembro público al crearse un objeto de la
clase Entero.
pág. 22
public class Entero {
public int valor;
public Entero(int valor){
this.valor=valor;
}
}
El valor devuelto por new al cear un objeto es una referencia a un objeto en memoria,
que hemos denominado objeto. Creamos un objeto aInt de la clase Entero para guardar
el número tres.
pág. 23
System.out.println("objeto.miembro "+aInt.valor);
funcion(aInt);
System.out.println("Después de llamar a la función");
System.out.println("objeto.miembro "+aInt.valor);
}
public static void function(Enter xInt){
xInt.valor=5;}
}
Estos dos ejemplos, nos ponen de manifiesto el significado de la frase "pasar por valor
un dato a una función", y el distinto comportamiento de los tipos básicos de datos, que
no se pueden modificar en el curso de la llamada a la función, de los objetos que si se
pueden modificar. La referencia a un objeto se pasa por valor a la función. Dentro de la
función, desde esta referencia podemos acceder a los miembros públicos de dicho objeto
para modificar su estado. Cuando la función retorna el objeto estará modificado.
String
Delegados
pág. 24
6.7. Punteros
Un puntero es un tipo simple que siempre está asociado a otro tipo (punteros a enteros,
a reales, a registros, etc.).
Se pueden ver los punteros como variables que almacenan direcciones de memoria; de
aquí se deduce:
El hecho de disponer de una dirección postal no garantiza que el lugar exista. Para
declarar variables de tipo puntero en la notación algorítmica se utiliza la sintaxis
siguiente: variable puntero a tipo
Por ejemplo:
Puntero a real
Una vez se declara un puntero pueden llevarse a cabo dos acciones básicas sobre el
mismo: Asignarle memoria para almacenar un dato del tipo al que apunta:
Crear
Destruir
pág. 25
Es posible asignar a un puntero el contenido de otro; para hacer esto es necesario que
la variable a la que vamos a asignar un Valor no apunte a ningún dato pues en ese caso
el dato original Quedaría inaccesible. Así pues, sólo deberíamos asignar un puntero a
otro si el Puntero asignado no tiene memoria reservada.
Código:
resultado = suma(175, 25)MsgBox "La suma de 175 + 25 = " & resultado, vbInformation,
"Resultado de funcion"
End Sub
pág. 26
Private Sub Form_Load()
End Sub
lblsuma.Caption = resultado
End Sub
Se acostumbra a elaborar un programa por cada sección a examinar, el cual debe incluir
por lo menos el programa de trabajo en un sentido estricto y el programa adscrito al
personal del trabajo a realizar. Cada programa permite el desarrollo del plan de trabajo
general, pero a un nivel más analítico, aplicado a un área en particular.
Por medio de cada programa, el auditor adquiere control sobre el desarrollo del examen,
pues estos además de ser una guía para los asistentes sirven para efectuar una
adecuada supervisión sobre los mismos, permitiendo también determinar el tiempo real
de ejecución de cada procedimiento para compararlo con el estimado y así servir de
pág. 27
pauta para la planeación de las próximas, así mismo, permite conocer en cualquier
momento el estado de adelanto del trabajo, ayudando a la toma de decisiones sobre la
labor pendiente por realizar.
Generalmente el programa de auditoría comprenderá una sección por cada área de los
estados financieros que se examinan. Cada sección del programa de auditoría debe
comprender:
Una introducción que describa la naturaleza de las cuentas examinadas y resuma los
procedimientos de contabilidad de la compañía.
Una descripción de los objetivos de auditoría que se persiguen en la revisión de la
sección.
Una relación de los pasos de auditoría que se consideran necesarios para alcanzar los
objetivos señalados anteriormente.
Esta sección debe tener columnas para indicar la persona que efectúa el trabajo, el
tiempo empleado y referencias cruzadas a las planillas o cédulas donde se realiza el
trabajo.
pág. 28
Bibliografía
Libros
Joyanes Aguilar, Luis. PROGRAMACIÓN EN C+; Algoritmos, estructura de datos y
objetos.
Joyanes Agular, Luis. METODOLOGIA DE LA PROGRAMACION; Diagramas de flujo
de algoritmos y programación estructurada. Pgs, 245.
Páginas de internet
http://profesores.fi-b.unam.mx/cintia/cmn5.pdf
https://es.scribd.com/doc/185569333/Trabajo-de-Investigaciona-Lgoritmo
http://programacionunefa.blogspot.mx/2008/06/arreglos-unidimensionales.html
http://sistemasoperativos.angelfire.com/html/5.3.html
http://sistemasdearchivosyproteccion-vera.blogspot.mx/2008/11/53-componentes-de-
un-sistema-de.html
pág. 29