lunes, 10 de junio de 2013

ARREGLOS

Un arreglo es un conjunto de celdas de memoria relacionadas entre si ya que todos tienen el mismo nombre y almacenan el mismo tipo de datos para referirse a una celda en particular algún elemento dentro del arreglo y entre corchetes [ ] el número de posición del elemento dentro del arreglo.
El primer elemento se almacena en la posición 0 del arreglo, es decir el primer elemento del arreglo se conoce como a[0], el segundo como a[1], el séptimo como a[6] y en general el elemento de orden i del arreglo a se conoce como a[i-1].
El número de posición que aparece dentro de los corchetes se conoce como índice y debe ser un número entero o una expresión entera, por ejemplo:
            printf ("%i", a[0]+a[5]+a[10]);

            x=a[7]/2;

            x=a[4]=12;
Para declarar un arreglo se emplea la siguiente sintaxis:
            tipo_de_dato nombre_del_arreglo [número de elementos];

            int a[12];

            float f[10];

            char nom_emp [30];
Ejemplo:
            #include <stdio.h>
            #include <conio.h>
           
            #define MAX 12
           
            void main(){
           
            int a[MAX], b[MAX], c[MAX], i, j=0, k=0;
           
            clrscr();
           
            printf ("Programa que almacena 12 numeros en un arreglo ");
            printf ("y luego los separa en dos de acuerdo a su valor.\n");
           
            for (i=0; i < MAX; i++){
                        printf ("Introduce el valor %i: ", i+1);
                        scanf ("%i", &a[i]);
            }
           
            for (i=0; i < MAX; i++)
           
                        if (a[i] < MAX){
                       
                                     b[j] = a[i];
                                     j++;
                        }

                        else {
                       
                                     c[k] = a[i];
                                     k++;
                        }

            printf ("\nLos numeros quedan asi:\n\n");
           
                        for (i=0; i < j; i++)
                                     printf ("%i\n", b[i]);

                        for (i=0; i < k; i++)
                                     printf ("\t%i\n", c[i]);

            getch();
            }

Arreglos unidimensionales

Un arreglo unidimensional es un tipo de datos estructurado que está formado por una colección finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar listas de elementos iguales. Los datos que se guarden en los arreglos todos deben ser del mismo tipo.

El tipo de acceso a los arreglos unidimensionales es el acceso directo, es decir, podemos acceder a cualquier elemento del arreglo sin tener que consultar a elementos anteriores o posteriores, esto mediante el uso de un índice para cada elemento del arreglo que nos da su posición relativa.
Para implementar arreglos unidimensionales se debe reservar espacio en memoria.

Los arreglos nos permiten hacer un conjunto de operaciones para manipular los datos guardados en ellos, estas operaciones son: ordenar, buscar, insertar, eliminar, modificar entre otras.


REPRESENTACION EN MEMORIA: Los arreglos guardan en memoria la cantidad de espacios que se le indican en la declaración.


Ejemplo: sea el siguente arreglo unidimensional donde se va a guardar 5 datos de tipo entero (integer)

x : array[1..5] of integer
En memoria el computador guarda 5 espacios: esto quiere decir en el arreglo X en la posición 1 guarda 34, en el arreglo X en la posición 2 guarda 22, asi hasta la última posición del arreglo X posicion 5 guarda 72.
X [1]
34
X [2]
22
X [3]
39
X [4]
63
X [5]
72

Declaracion de los arreglos unidimensionales: Se declara el tipo del arreglo, con la palabra reservada TYPE, luego se declara la variable de tipo arreglo, esto se hace en el bloque de declaracion de variables palabra reservada VAR.
Type
nombre_arreglo= array[x..y]of tipo_dato;
Ejemplos:
salarios= array [1…x] of real;
nombre_trabajador=array[1..x] of string;
Nota: El tipo de dato del arreglo puede ser: integer,real, boolean, string etc.
Variables tipo array
Var
sueldo:salarios;
nombre:nombre_trabajador;
Una vez declarados los arreglos procedemos a cargar información en ellos, para esto usamos estructuras repetitivas la mas recomendable por su facilidad es el for, una vez cargada la información se puede hacer cualquier operación de calculo y por último mostramos la información de los arreglos usando de igual manera la estructura repetitiva for.
carga de un arreglo, la letra i es el indice o subindice del arreglo e indica la posición del arreglo:
for i:=1 to num do
begin
readln(notas[i]);
end;
Mostrar la información de un arreglo, la letra i es el indice o subindice del arreglo e indica la posición del arreglo::
for i:=1 to num do
begin
writeln(notas[i]:3:1);
end;
Se han hechos programas que suman una cantidad de números usando dos variables, una para leer cada número y otra para acumular la suma. Este enfoque tiene la desventaja de que se pierden los valores de los sumandos. El uso de arreglos permite calcular la suma de los números con una cantidad mínima de código y a la vez conservar cada valor, como muestra el siguiente programa completo:

Program SumaN;

Uses
Crt;
Const
n = 5;
Var
nums: Array[1..n] Of Integer;
s, i: Integer;
Begin
For i:=1 To n Do
Begin
Write('Escriba el número: ');
ReadLn(nums[i]);
s := s + nums[i];
End;
WriteLn('La suma es: ', s);
End.

Nótese el uso de una constante para marcar el tamaño del arreglo; dicha constante, también sirve para controlar el For. De este modo, sólo se hace necesario cambiar un número para adecuar el programa a la escala apropiada

Ejercicios de arreglos unidimensionales:


* Dadas n cantidad de notas, calcular e imprimir el promedio de las notas y todas las notas que fueron mayor a la media calculada.

PROGRAM calificaciones;
USES CRT;
type
listacalificaciones=array[1..n]of real;
VAR
notas:listacalificaciones;
media,suma:real;
num,i:integer;

BEGIN
WRITELN('INTRODUZCA la cantidad de notas a procesar');
READLN(NUM);
suma:=0;

for i:=1 to num do

begin
readln(notas[i]);
suma:=suma+notas[i];
end;
media:=suma/num;
writeln('la media es:' , media:2:2);
writeln('la lista de calificaciones mayores a la media es:');
for i:=1 to num do
begin
if notas[i]>media then
writeln(notas[i]:3:1);
readln;
end;
END.

(*Escribir un programa en pascal que rellene un array con 11
numeros, luego dividirlos entre 3 y mostralos por pantalla *)

PROGRAM numeros;
USES CRT;
type
arreglonumeros=array[1..11]of real;
VAR
num:arreglonumeros;
i:integer;
numero:real;

BEGIN
for i:=1 to 11 do
begin
WRITELN('Introduzca el numero ' , i, ' a dividir');
readln(num[i]);
numero:=num[i]/3;
write('los numero resultantes de la division son:' ,numero:2:2);
readln;
end;
end.



Arreglos bidimensionales
Los arreglos bidimensionales son tablas de valores. Cada elemento de un arreglo bidimensional está simultáneamente en una fila y en una columna.
En matemáticas, a los arreglos bidimensionales se les llama matrices, y son muy utilizados en problemas de Ingeniería.
En un arreglo bidimensional, cada elemento tiene una posición que se identifica mediante dos índices: el de su fila y el de su columna.
Crear arreglos bidimensionales

Los arreglos bidimensionales también son provistos por NumPy, por lo que debemos comenzar importando las funciones de este módulo:
from numpy import *
Al igual que los arreglos de una dimensión, los arreglos bidimensionales también pueden ser creados usando la función array, pero pasando como argumentos una lista con las filas de la matriz:
a = array([[5.1, 7.4, 3.2, 9.9],
           [1.9, 6.8, 4.1, 2.3],
           [2.9, 6.4, 4.3, 1.4]])
Todas las filas deben ser del mismo largo, o si no ocurre un error de valor:
>>> array([[1], [2, 3]])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: setting an array element with a sequence.
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.shape
(3, 4)
Los arreglos también tienen otro atributo llamado size que indica cuántos elementos tiene el arreglo:
>>> a.size
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:
>>> zeros((3, 2))
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

>>> ones((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 ejemplom la función random:
>>> from numpy.random import random
>>> random((5, 2))
array([[ 0.80177393,  0.46951148],
       [ 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 = array([[5, 1, 4],
...            [0, 3, 2]])
>>> b = array([[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 = array([[5, 1, 4],
...            [0, 3, 2]])
>>> b = array([[ 23],
...            [-11],
...            [ 01]])
>>> a + b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape

CICLOS

Ciclos repetitivos

Algoritmo para ciclo repetitivo “Mientras
  1. Inicio
  2. Se definen las variables a usar
  3. Se declara el valor inicial  del  ciclo que puede ser una constante o una variable ingresada por teclado
  4. Se escribe < Mientras >y las condiciones que qué debe cumplir el ciclo
  5. Se ingresan las instrucciones a ejecutarse
  6. Se termina el ciclo con < FinMientras >
  7. Fin
El CICLO MIENTRAS ejecuta un bloque de acciones ‘mientras’ que una condición dada se cumpla, es decir, cuando la condición evalúa a verdadero. La condición es evaluada antes de ejecutar el bloque de acciones y si la condición no se cumple, el bloque no se ejecuta. De esta manera es que el número de repeticiones del bloque de acciones sea cero, pues, si la condición la primera vez evalúa a falso, el bloque no será ejecutado alguna vez. La forma general del ciclo mientras es la siguiente:



Donde, (condición) es la condición que determina si el bloque de acciones<bloque>es ejecutado o no. Si la condición evalúa a verdadero el bloque es ejecutado y si evalúa a falso no es ejecutado. Después de ejecutar el bloque de acciones se vuelve a evaluar la condición.

Algoritmo para  ciclo repetitivo “Para
  1. Inicio
  2. Se definen las variables a usar
  3. Se declara el valor inicial  del  ciclo que puede ser una constante o una variable ingresada por teclado
  4. Se escribe <Para> luego la variable y el valor inicial, <hasta> el limite <con paso> que indica el aumento o incremento
  5. Se escriben las instrucciones a ejecutarse
  6. La ultima ejecución del bucle normalmente ocurre
  7. <FinPara> que termina el bucle
  8. Fin
El CICLO PARA permite la ejecución repetida de un conjunto de acciones. El número de veces que el bloque es ejecutado esta determinado por los valores que puede tomar una variable contadora (de tipo entero), en un rango definido por un límite inferior (inclusive) y un límite superior (inclusive). Después de ejecutar el bloque de acciones en cada iteración, la variable contadora es incrementada en uno (1) automáticamente y en el momento en que la variable sobrepasa el límite superior el ciclo termina.
El valor final de la variable contadora depende mucho del lenguaje de programación utilizado, por lo tanto, no es recomendable diseñar algoritmos que utilicen el valor de la variable contadora de un ciclo para, después de ejecutar el mismo. De la definición de ciclo para se puede inferir que el bloque de acciones no se ejecuta alguna vez si el límite inferior es mayor al límite superior y que si el límite superior es mayor o igual al límite superior, el número de veces que el conjunto de acciones se ejecutará es igual a uno más el límite superior menos el límite inferior
Algoritmo para  ciclo repetitivo “Repetir Hasta
  1. Inicio
  2. Permite repetir hasta que la condición sea Verdadero
  3. Si la condición es falsa se vuelve a Repetir el bucle
  4. Después de ejecutar todas las sentencias
  5. Fin
El CICLO REPITA-HASTA es similar al ciclo HAGA-MIENTRAS, la diferencia esta en que el bloque de acciones se ejecuta nuevamente si la condición evalúa a falso y no se ejecuta más si evalúa a verdadero. Sobra advertir que el bloque de acciones se ejecuta por lo menos una vez. La forma general del ciclo repita-HASTA es la siguiente:



Donde, <bloque> es el bloque de acciones ejecutado y (condición) es la condición que determina si el bloque es ejecutado de nuevo no. Si la condición evalúa a falso el bloque es ejecutado de nuevo y si evalúa a verdadero no es ejecutado. Después de ejecutar el bloque de acciones se evalúa la condición.

CONDICIONALES

Las estructuras condicionales comparan una variable contra otro(s)valor (es), para que en base al resultado de esta comparación, se siga un curso de acción dentro del programa. Cabe mencionar que la comparación se puede hacer contra otra variable o contra una constante, según se necesite. Existen tres tipos básicos, las simples, las dobles y las múltiples.

Simples:

Las estructuras condicionales simples se les conoce como
Tomas de decisión. Estas tomas de decisión tienen la siguiente forma: 




Dobles:

Las estructuras condicionales dobles permiten elegir entre dos opciones o alternativas posibles en función del cumplimiento o no de una determinada condición. Se representa de la siguiente forma: 






Donde: 


Si:Indica el comando de comparación
Condición : Indica la condición a evaluar
Entonces : Precede a las acciones a realizar cuando se cumple la condición
Instrucción(es):Son las acciones a realizar cuando se cumple o no la condición
si no :Precede a las acciones a realizar cuando no se cumple la condición
Dependiendo de si la comparación es cierta o falsa, se pueden realizar una o más acciones. 


Múltiples: 

Las estructuras de comparación múltiples, son tomas de decisión especializadas que permiten comparar una variable contra distintos posibles resultados, ejecutando para cada caso una serie de instrucciones especificas. La forma común es la siguiente: 







Veamos algunos ejemplos donde se aplique todo lo anterior: 

Se pide leer tres notas del alumno, calcular su definitiva en un rango de 0-5 y enviar un mensaje donde diga si el alumno aprobó o reprobó el curso. Exprese el algoritmo usando Pseudocódigo y diagrama de flujos.

Pseudocódigo: 

INICIO
   Not1, Not2, Not 3 :REAL
   Def: REAL
   LEA Nota1, Nota2, Nota3
   Def ß (Not1 + Not2 + Not3) /3
   Si Def < 3 entonces
      Escriba
Reprobó el curso
   Sino
      Escriba
Aprobó el curso
   Fin-Si
FIN

Diagrama de flujo:



Se desea escribir un algoritmo que pida la altura de una persona, si la altura es menor o igual a 150 cm envíe el mensaje: Persona de altura baja; si la altura está entre 151 y 170 escriba el mensaje: Persona de altura media y si la altura es mayor al 171 escriba el mensaje: Persona alta. Exprese el algoritmo usando Pseudocódigo y diagrama de flujos. 


Pseudocódigo: 

INICIO 
   Altura: ENTERO 
   ESCRIBA Cuál es tu altura?  
   LEA Altura 
   Si Altura <=150 entonces 
      ESCRIBA persona de altura baja 
   Sino 
      Si Altura <=170 entonces 
         ESCRIBA persona de altura media 
      Sino 
         Si Altura>170 ENTONCES 
            ESCRIBA persona alta 
         Fin-Si 
      Fin-Si 
   Fin-Si 
FIN 

¡Es importante ser ordenado en el código que se escribe! 

Diagrama de flujo: 



Dado un numero entre 1 y 7 escriba su correspondiente día de la semana así: 

1- Lunes 2- Martes 3- Miércoles 4- Jueves 5- Viernes 6- Sábado 7- Domingo 
Exprese el algoritmo usando Pseudocódigo y diagrama de flujos. 

Pseudocódigo: Pseudocódigo: 

INICIO 
   Dia: ENTERO 
   ESCRIBA Diga un número para escribir su día 
   LEA Dia 
   En-caso-de Dia haga 
      Caso 1: ESCRIBA Lunes 
      Caso 2: ESCRIBA Martes 
      Caso 3: ESCRIBA Miércoles 
      Caso 4: ESCRIBA Jueves 
      Caso 5: ESCRIBA Viernes 
      Caso 6: ESCRIBA Sábado 
      Caso 7: ESCRIBA Domingo 
     SINO: ESCRIBA Escribió un numero fuera del rango 1-7 
   Fin-Caso 
FIN 

Diagrama de flujo: