jueves, 11 de junio de 2015

EJERCICIOS CON MATRICES Y BUENAS PRACTICA DE PROGRAMACIÓN (Semana catorce)

RECORRIDO SOBRE MATRICES

Algoritmo_imprime_por_fila(mat, m,n)
                Variables:
                     i,j: entero
                INICIO
                           PARA i DESDE 1 HASTA m CON_VARIACION +1
                                   PARA j DESDE 1HASTA n CON_VARIACION +1
                                               ESCRIBA(mat[i][j])
                                   Fin (PARA)
                          Fin (PARA)
                FIN
Fin (imprime_por_fila)

Algoritmo_imprime_columna (mat, m,n)
                     Variables:
                     i,j: entero
                INICIO
                           PARA i DESDE 1 HASTA n CON_VARIACION +1
                                   PARA j DESDE 1HASTA m CON_VARIACION +1
                                               ESCRIBA(mat[j][i])
                                   Fin (PARA)
                          Fin (PARA)
                FIN
Fin (imprime_por_columna)

Ejemplo 1

Escriba una matriz que de los puntos intercalados dentro de la matriz como se realiza en una tabla de ajedrez.

Void imprime_ajedrez(matrix,m,n)
                Variables:
                 i: entero
                INICIO
                               PARA i DESDE 1 HASTA m CON_VARIACION +1
                                               SI i % 2 <> 0
                                                               Imprime_fila_intercalada(matrix, i, 1, n)
                                               DE_LO_CONTRARIO
                                                               Imprime_fila_intercalada(matrix,i,2,n)
                                               Fin(SI)
                               Fin(PARA)
                FIN
Fin(imprime_ajedrez)


 Void imprime_fila_intercalada(matriz, fila, inicio, fin)
                Variables:
                  j: entero
                INICIO
                               PARA j DESDE inicio HASTA fin CON_VARIACION +2
                                               ESCRIBA(matriz[fila][j]
                               Fin(PARA)
                FIN
Fin(imprime_fila_intercalada)


EJERCICIO 

se requiere un algoritmo que simule el juego de buscaminas. El juego tendrá 2 etapas:
La primera es el plantado de minas, inicialmente se debe preguntar al usuario el número de minas a colocar el cual no debe exceder a 10, el software debe validar que no supere este número y que tenga al menos una mina.  Luego el primer jugador llenará el campo de 5 x 5 con minas siendo estas representadas por el número 1, ubicándolas usando las coordenadas X(fila) y Y(columna).  la segunda fase consiste en un segundo jugador tratando de no toparse con las minas. Esto es ensayando y contando cuantas fases ha superado.  Se debe ir ingresando coordenadas y marcando con 2 en los intentos que no se encuentre una mina.

Variables  de entrada:
  minas[5][5]: enteros
  i,j: enteros
 cx, cy: entero
 cantminas: entero
 oport: entero
 encuentra: entero

 variables de salida:
 aciertos: entero


 Algoritmo buscaminas
          variables:
                minas[5][5]: enteros
                i,j,cx, cy,cantminas, oport, encuentra: entero
     INICIO
          PARA i DESDE 1 HASTA 5 CON_VARIACION +1
                   PARA j DESDE 1 HASTA 5 CON_VARIACION +1
                         minas[i][j]=0
                    Fin(PARA)
           Fin(PARA)
           ESCRIBA("ingrese el número de minas a colocar")
           LEA  (cantminas)
           MIENTRAS cantminas<1 v cantminas>10
                     ESCRIBA ("la cantidad de minas debe ser mayor a 1 y menor o igual a 10")
                     LEA (cantminas)
           FIN (MIENTRAS)
                    oport=25 - cantminas
           PARA i DESDE 1 HASTA cantminas CON_VARIACION+1
                     ESCRIBA("ingrese las coordenadas X y Y")
                     LEA (x,y)
                     MIENTRAS minas [x][y]< >0
                               ESCRIBA ("posición ocupada, ingrese la coordenada de nuevo")
                               LEA (x,y)
                      FIN (MIENTRAS)
                           minas [x][y]=1
            FIN (PARA)
            ESCRIBA ("modo jugador")
                aciertos=0
                 encuentra=0
            PARA i DESDE 1 HASTA oport CON_VARIACION +1
                       SI encuentra==0
                                ESCRIBA("ingrese las coordenadas de su intento")
                                LEA [x][y]
                               MIENTRAS minas [x][y]==2
                                          ESCRIBA("posición ocupada, ingrese la coordenada de nuevo")
                                          LEA (x,y)
                               FIN (MIENTRAS)
                                   SI minas[x][y]=1
                                     encuentra=1
                                    DE_LO_CONTRARIO
                                       minas[x][y] =2
                                       aciertos=aciertos +1
                                   FIN (SI)
                       FIN (SI)
         FIN (PARA)
         ESCRIBA("el usuario alcanzó un número de aciertos igual a:  ", aciertos)         
     FIN
Fin(buscaminas)

BUENAS PRACTICAS DE PROGRAMACIÓN

  • Escribe tus programas lo más simple y directo posible. Keep it simple.
  • Ajusta las opciones del programa para que arroje la mayor cantidad de errores y advertencias posibles al compilar, tu aplicación tendrá menores chances de obtener errores aleatorios.
  • Explicar el propósito, funcionamiento completo y el resultado esperado.
  • Dentro de las funciones definidas, establece un espaciado o indentación, que resalte la estructura funcional de la aplicación y facilite la lectura al programador al que le corresponda analizar el código
  • Se recomienda declarar variables en líneas separadas, ya que se facilita la descripción de cada variable mediante comentarios.
  • Poner un espacio después de cada coma(,) facilita la legibilidad del código.
  • No uses variables cuyo nombre no posea algún significado descriptivo, una variable con nombres significativos permite al lector entender el contexto del código y permite disminuir la cantidad de documentación asociada.
  • Se recomienda usar:  numero_de_filas=input(‘Entre el número de filas: ’)                                                               En lugar de: m=input(‘Entre el número de filas: ’);
  • Comenta cuando sea justo y necesario.
  • Se recomienda como buena costumbre, añadir al inicio de cada función, un bloque de comentarios que expliquen el comportamiento general de la función, así se facilita la búsqueda de errores.
  • Se recomienda usar:   % aplica la formula de la sumatoria de los enteros hasta n                 Suma=(n*(n+1))/2                                                                                                               En lugar de: suma=(n*(n+1))/2
  • Es altamente recomendada la definición de variables locales al inicio de la implementación de cada función, como un bloque de código bien separado del bloque que contenga las instrucciones ejecutables, ésta separación puede consistir en una línea en blanco, o bien un comentario que denote la utilidad de cada bloque.
  • En caso de usar operadores binarios (por ejemplo +, -, &&, ||, entre otros) se recomienda poner espacio a los extremos de cada operador, de modo que se resalte su presencia y se facilite la lectura del código. 
  • Se recomienda en algunas operaciones complejas, hacer uso de paréntesis redundantes o innecesarios que sirven para poder agrupar expresiones dentro de tales operaciones.
  • Evita la incorporación de más de una instrucción por línea. Esto reduce notoriamente la legibilidad del código, ya que el programador habitualmente está acostumbrado a leer una instrucción por línea.
  • Si el código soporta la separación de sentencias en varias líneas, procura realizar una separación coherente, en el que cada punto de ruptura tenga sentido.
  • Si una instrucción abarca más de una línea, recuerda realizar la indentación necesaria.
  • Cuando escribas operaciones que hagan uso de muchos operadores, procura revisar que las operaciones se estén realizando en el orden que tu esperas que se realicen.
  • Si el lenguaje soporta llaves({}) para la separación de bloques, es altamente recomendado usarlas, ello facilita el proceso de distinción de bloques de código en forma rápida, permitiendo identificar y reparar errores en el código con menos dificultad.
  • Si deseas evitar omitir una llave, abre y cierra el bloque de código que deseas crear, y luego introduce código dentro del bloque, con eso te aseguras la victoria.
  • Nunca olvides inicializar los contadores y sumadores.
Referencias
‘Arbeláez Velázquez Andrés’-recomendaciones para la programación en Matlab
http://www2.udearroba.co/mod/resource/view.php?id=79212

MATRICES (Semana trece)


MATRICES


Es un arreglo de M * N elementos organizados en dos dimensiones donde M es el número de filas o reglones y N el número de columnas.
Para representar una matriz se necesita un nombre de matriz se necesita un nombre de matriz acompañado de dos índices.
Mat [R,C]
Donde R indica el renglón y C indica la columna, donde se encuentra almacenado el dato.


Representación gráfica de una matriz
























Creación de una matriz

Aunque existen diferentes de crear vectores en Matlab, la más sencilla es crearlas manualmente  así:
Nombre_de_la_matriz[a11 a12..a1n; a21 a22 a2n; am1  am2 amn]
Por ejemplo para crear la matriz  








En Matlab se da el comando notas=[531;442;355]

Acceso a los componentes de una matriz 

En Matlab  cada vez que se quiere hacer referencia a un componebte particular de una matriz basta con dar su nombre y el índice correspondiente entre parentisis
Ej para acceder directamente fila 2 columna 3 de la matriz notas basta con dar el comando notas(2,3).

El acceso a todos los componentes de una matriz

para acceder a todos los componentes de una matriz solo basta con utilizar una variable que sirva como índice sobre las filas cuyo valor cambie entre 1 y el número total de filas, y usar una variable que sirva como índice de las comunas, cuyo valor cambie entre 1 el número de columnas. Para esto nos valemos dos ciclos para anidados.


En Matlab sería
For fila=1:3
      For columna=1:3
            Notas(fila,columna)=input(‘ingrese datos:’);
   End
End 

APLICACIONES 

Las matrices son una herramienta muy útil no sólo en el campo de las matemáticas y la física como era de esperar; sino también en el campo de las ciencias sociales, por ejemplo en economía y en geografía. Esta gran utilidad se debe a que las matrices aportan un nuevo lenguaje facilitando el trabajo en una gran cantidad de ámbitos


Referencias
http://www2.udearroba.co/pluginfile.
http://www.utm.mx/~mgarcia/PE4%28Arreglos%29.pdf
http://matematica.laguia2000.com/general/aplicaciones-de-las-matrices#ixzz3clnRDp4b

EJEMPLOS VECTORES (Semana doce)


Ejemplo de operaciones con vectores


expresión à  operación 

x + k   à  Suma a los elementos del vector x el escalar k

x – k   à  Resta a los elementos del vector x el escalar k

k*x     à  Multiplicación los elementos del vector x por el escalar k

x / k    à  División los elementos del vector x por el escalar k

k .^ x  à Potenciación del escalar k a cada uno de los elementos de x

x .^ k  à Potenciación los elementos del vector x a la potencia escalar k

x + y  à Suma de los vectores x e y con el mismo tamaño

x – y   à Resta de los vectores x e y con el mismo tamaño

x .* y   à Multiplicación elemento a elemento

x ./ y   à División elemento a elemento por la derecha

x .\ y   àDivisión elemento a elemento por la izquierda

x .^ y  à Potenciación elemento a elemento

x '       à Transposición compleja conjugada

x .’      à  Transposición

cross (x,y) à producto cruz de los vectores x e y de dimensión 3

dot (x,y)     à  producto punto de los vectores x e y

prod(x)       à  calcula el producto de los valores de x.

sum(x)        à  calcula la suma de los valores de x.

cumprod(x) à  calcula un producto acumulado de los valores de x.

cumsum(x) à  calcula la suma acumulada de los valores de x.

sort(x)         à  ordena los elementos del vector x.



EJEMPLO_1


Se realiza una encuesta en la facultad de ingeniería de la Universidad de Antioquía en la cual se pregunta a cada estudiante en que semestre se encuentra (1-10) y en que programa estudia:
1. Sistemas        
2. Civil                                                   
3. Ambiental                                          
4. Industrial                                          
5. Electrónica                                     
6. Telecomunicaciones
7. Bioingeniería
8. Sanitaria
9. Materiales
10. Eléctrica
Se requiere que recoger  esta información y mostrar los porcentajes de distribución por semestre y carrera.

Variables de entrada
carreras[10], semestre[10]:entero
carr, sem, bandera, total:entero
variables de salida
porcentaje:real

Algoritmo estudiantes

     variables: 
          carreras[10], semestre[10]:entero
          carr, sem, bandera, total:entero
          porcentaje:real

     INICIO
             PARA i DESDE 1 HASTA 10 CON_VARIACION+1
                   carreras[i]=0
                  semestre[i]=0
              Fin(PARA)
                    bandera=0
                   total=0
                   MIENTRAS bandera==0
                     ESCRIBA ("¿En qué semestre está?")
                     LEA (sem)
                     ESCRIBA ("¿En qué carrera está?")
                     LEA (carr)
                       semestre[sem]=semestre[sem]+1
                       carreras [carr]=carreras[carr]+1
                       total=total+1
                     ESCRIBA ("ingrese 0 si desea continuar y otro valor para terminar")
                     LEA(bandera)
                     Fin(MIENTRAS)
          PARA i DESDE 1 HASTA 10 CON_VARIACION+1
                  porcentaje =(semestre [i]/total)*100
                   ESCRIBA ("Porcentaje semestre ", i, porcentaje")
                   Fin (PARA)
           PARA i DESDE 1 HASTA 10 CON_VARIACION+1
               porcentaje =(carreras [i]/total)*100
               ESCRIBA ("Porcentaje carrera", i, porcentaje")
               Fin (PARA)
     FIN
Fin(estudiantes)


Problema
Censo en la ciudad de Medellín.
• Mpio: código del municipio
• Dir: dirección
• Np: número de personas vivienda
• Cmed: acumulado censo


Algoritmo censo_en_medellín
     Variables:
         mpio,cemd,np,bandera: enteros
        dir:alfanumérica
INICIO
      cmed=0
     MIENTRAS bandera == 0
        LEA(mpio,dir,np)
           cmed=cmed+np
     FIN(MIENTRAS)
     ESCRIBA(cmed)
     LEA(bandera)
     FIN
Fin(censo_en_medellín)


Agregamos otro municipio
• 1. Medellín
• 2. Bello

Algoritmo censo_en_medellín_y_bello
    Variables:
      mpio,cemd, cbel, np,bandera: enteros
      dir:alfanumérica
   INICIO
        cmed=0
       MIENTRAS bandera == 0
       LEA(mpio,dir,np)
            SI (mpio==1)
               cmed=cmed+np
           DE_LO_CONTRARIO
               cbel=cbel + np
           Fin(SI)
         LEA(bandera)
       Fin(MIENTRAS)
       ESCRIBA(cmed, cbel)
       FIN
 Fin(censo_en_medellín)


Algoritmo censo
        Variables:
              mpio,th,np,bandera,acmpio[125]: enteros
             dir: alfanumérica
  INICIO
          PARA i DESDE 1 HASTA 125 CON_VARIACION +1
                 acmpio[i] = 0
          Fin(PARA)
          MIENTRAS bandera == 0
               LEA(mpio,dir,np)
                acmpio[mpio] = acmpio[mpio] + np
              LEA(bandera)
          Fin(MIENTRAS)
          imprime_vector(acmpio, 125)
           th = suma_vector(acmpio,125)
          ESCRIBA(th)
  FIN
Fin(censo_en_medellín)


Void imprime_vector(V,n)
  Variables: i:entero
           INICIO
                   PARA i DESDE 1 HASTA n CON_VARIACION +1
                         ESCRIBA(i, V[i])
                   Fin(PARA)
              FIN


  Fin(imprime_vector)

referencia
http://www.utm.mx/~vero0304/HCPM/5-Arreglos-Vectores.pdf