lunes, 26 de septiembre de 2016

Suma en Lenguajes Diferentes

Autor: Constanza Couselo

   
Competencia: Desarrollo de Software(Nivel 1) 
Asignatura: Programacion II
Palabras clave: Python, C,Algoritmo

Introducción:

    La actividad desarrollada consistía en escribir un pequeño software basado en un algoritmo corto que ejecutara la suma de numeros ingresados por la entrada estandar como parametros en dos lenguajes distintos.

Solución:

    Dada la sencillez del algoritmo no se desarrollaron diagramas de flujo ni análisis extensivos mas allá del hecho de solo investigar por cuenta propia el mecanismo de funcionamiento de los ciclos en los diferentes lenguajes (C,Python), para este trabajo en particular, el ciclo for y while.

    Como se manifestó en la introducción, el programa recibe una serie de numeros que guarda en las variable "argv" que es utilizada por algunos lenguajes para tomar sucesivos parametros por medio de la entrada estandar, esto quiere decir que cuando se invoca el programa se le pasan los parametros directamente, por ejemplo: "%suma 1 2 3 4 5".

    Los dos programas muestran al usuario el mismo resultado y cumplen la misma función sin embargo cada uno tiene su propia implementación con ligeras diferencias que pueden ser observadas con detenimiento al analizar los dos diferentes codigos presentados:

Codigo en C 
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    unsigned long int suma=0;
    int i;

    for(i=0;i<argc;i++)
    {
        suma+=atoi(argv[i]);
    }

    fprintf(stderr,"total de suma = %d\n", suma);

    return 0;
}
Codigo en lenguaje Python
#! /usr/bin/python

import sys
suma = 0
i=1
while i < len(sys.argv):
    valor = sys.argv[i]
    suma = suma + int(valor)
    i+=1
print 'el resultado de la suma es: ' + str(suma)

 

Reflexión:
  
    Como actividad introductoria y a pesar de la sencillez se puede concluir que nos sirve como estudiantes para adquirir destreza en el razonamiento relativo a que las cosas se pueden hacer de muchas formas, no obstante, para algunos casos se requieren de soluciones que brinden optimización de tiempo respecto del desarrollo e implementación hecho que puede ser comprobado en relación a la cantidad de lineas de código requeridas por los distintos lenguajes para la escritura de un programa lo que implica para un caso de la vida laboral un tiempo menor de desarrollo con la consecuente entrega oportuna de los trabajos encomendados.

Circuito Millonario

Autor: Constanza Couselo

Competencia: Desarrollo de Software(Nivel 1)
Palabras clave: robot, lego, NXT, NXC, algoritmo, robótica


Introducción:
La actividad desarrollara se llama "circuito millonario" y consta de tres secciones de operación del robot ya armado y correctamente programado; de forma global el robot debera sortear una serie de obstáculos y búscar incidencias que le permitan  aumentar o disminuir su puntos.  
La primera lógica de programación responde a la presencia de obstáculos visuales dispuestos a modo de laberinto, los cuales deben ser sorteados utilizando para la detección de estos el sensor de ultra sonido el cual nos devuelve la distancia medida en centímetros respecto del punto de obstaculización. En la medida de que el robot encuentre un obstáculo a una cantidad definida de centímetros, gira en un ángulo determinado lo que le permite avanzar hasta el siguiente obstáculo de manera lineal hasta que se cumpla nuevamente la condición de cercanía; al finalizar la primera etapa del circuito, se asigna un puntaje por completitud.  
La segunda etapa consiste en el seguimiento de una línea negra la cual es escaneada constantemente por un sensor de luz orientado hacia el suelo. En esta etapa, el seguimiento de la línea se efectúa utilizando un algoritmo sencillo de calibración en tiempo de ejecución el cual hace girar la máquina en pequeños incrementos a fin de mantenerse en los límites que determinan el ancho de línea, el robot concluye su seguimiento en la medida de la actuación de un sensor de tacto; tal como en la etapa anterior, cuando detecta la presencia de un obstáculo se da por terminada la etapa y se asigna un puntaje por conclusión de la misma.  
La tercera etapa , el robot debe encontrar puntos negros dispuestos aleatoriamente en la superficie de juego y utiliza para estos fines el mismo sensor usado en la etapa anterior con un algoritmo condicional que establece que encontró un punto en la medida de estar en un valor de umbral de reflexión de luz programado como constante; cuando encuentra un punto suma puntaje, si choca contra la pared se resta puntaje y si la cantidad de choques es igual a tres se termina la ejecución del programa. Cada evento de suma de puntajes en las tres etapas se muestra por la pantalla integrada del robot .

Solución:
La extructura de la programación de software en lenguaje NXC cuenta con una tarea que es la principal (task main()), tres sub rutinas principales y tres auxiliares, cada una para una parte del circuito, a saber sub laberinto(), sub lineaNegra(), sub puntosNegros(), sub playSound(), sub girarIzquierda() y sub girarDerecha() respectivamente.
La tarea principal y unica que contiene el programa tan solo se ocupa de invocar a las sub rutinas asociadas una tras otra en consecuencia con lo manifestado en el parrafo anterior. De las tres rutinas restantes comenzaremos a explicar el funcionamiento de la primera que es "sub laberinto()", esta enciende primero el sensor de ultrasonido, luego va avanzando hasta que encuentra el obstáculo, la verificación del mismo la hace en la evaluación de condición especificada en el cuerpo del bucle while el cual al ser un bucle sin instrucciones interiores actua como retardo para que siga avanzando, finalizado lo anterior gira en un angulo conocido explicitamente hacia la izquierda, para continuar avanzando hasta que encuentra el segundo obstaculo a la distancia definida y así hasta que finaliza la primera etapa lugar en el cual actualiza la variable global puntos con una cantidad de 100 para continuar reproduciendo una melodia alusiva al término de la etapa y salida por la pantalla del robot la cantidad de puntos adquiridos.
sub laberinto()
         {

             SetSensorLowspeed(IN_4);
             OnFwd(OUT_BC, VELOCIDAD_LABERINTO);
             while(SensorUS(IN_4)> 9);
                 Off(OUT_BC);
             OnFwd(OUT_B,50); //girar a la izquierda
             OnRev(OUT_C,50);
             Wait(500); //establecer tiempo de giro en 90º
             Off(OUT_BC);


             OnFwd(OUT_BC,VELOCIDAD_LABERINTO);
             while(SensorUS(IN_4)> 8);
                 Off(OUT_BC);
             OnFwd(OUT_C,80); //girar a la derecha
             OnRev(OUT_B,40);
             Wait(500);

             OnFwd(OUT_BC,VELOCIDAD_LABERINTO);
             while(SensorUS(IN_4)> 7);
                 Off(OUT_BC);
             OnFwd(OUT_C,60);
             OnRev(OUT_B,60);
             Wait(400); //establecer tiempo de giro en 90º

             OnFwd(OUT_BC,VELOCIDAD_LABERINTO);
             while(SensorUS(IN_4)> 9);
                 Off(OUT_BC);
             OnFwd(OUT_B,80); //girar a la izquierda
             OnRev(OUT_C,70);
             Wait(TIEMPO_GIRO_LAB); //establecer tiempo de giro en 90º
             Off(OUT_BC);

             puntos +=100; //sumar 100 puntos
             playSound();
             NumOut(0,0,puntos); // mostrar por pantalla cantidad de puntos
             Wait(2000);
    }
La siguiente sub rutina asociada es aquella que hace el seguimiento de la linea negra la cual utiliza dos sensores, primero el de luz y luego el de tacto. El código le ordena al robot que ejecute un ciclo condicionado a una bandera llamada i la cual parte con un valor de uno (equivalente a true) y que se actualiza a un valor de cero (false) en la medida de la activación del sensor de tacto, el robot comienza avanzando, el resto del tiempo verifica que el valor devuelto por la función Sensor(IN_X) (donde X es la entrada a la cual se conectó el sensor) sea menor que el UMBRAL definido como constante, este sensor devuelve numeros que son significantes de una atenuación o incremento del factor de luminosidad emitido por un diodo led y que es detectado por el sensor, para un valor mayor de 40 entramos en el campo visual del color negro y asi va subiendo en la escala, para nuestros fines basta con decir que a mayor de 40 que el robot ejecute un algoritmo de calibración el cual hace girar levemente el robot hacia la derecha hasta que vuelve al valor devuelto en función de la detección de un valor de reflexión que denota el encuentro con el color blanco instancia en la cual gira levemente a la izquierda hasta que vuelve a encontrar el negro.
Una vez que el sensor de tacto se activó, la bandera i se cambia a 0 y con esto se sale del ciclo while pasando el control a las instrucciones que la suceden las cuales hacen que el robot gire a la izquierda en 90°, que sume 50 puntos a la variable "puntos", que reproduzca el sonido e imprima por pantalla la cuenta total de puntos acumulados.

sub lineaNegra()
                {
                    int i=1;
                    SetSensorTouch(IN_1);
                    SetSensorLight(IN_3);
                    OnFwd(OUT_BC, 40);
                    while (i) //mientras i sea uno
                    {
                        OnFwd(OUT_BC, 40);

                        if (Sensor(IN_3) > UMBRAL) //si salió de la linea negra
                        {
                            Off(OUT_BC);
                            girarDerecha();
                            until(Sensor(IN_3) <= UMBRAL); //esta dentro de la linea negra
                            OnFwd(OUT_BC,40);
                            girarIzquierda();
                            until(Sensor(IN_3) >= UMBRAL); //está fuera de la linea negra
                        }
                        if(SENSOR_1 == 1)i = 0;

                  }
                  Off(OUT_BC);

                  OnRev(OUT_C,100); //girar a la izquierda

                  Wait(500); //establecer tiempo de giro en 90º
                  OnFwd(OUT_BC,100);
                  Wait(200);
                  Off(OUT_BC);
                  puntos += 50; // sumar 50 puntos
                  playSound(); // reproducir sonido
                  NumOut(0,0,puntos);
                  Wait(2000);

             }

Por último, la subrutina dedicada a la detección de puntos negros es un poco mas complicada que las anteriores ya que realiza dos evaluaciones, una para el sensor de tacto y otra para los puntos negros; cuando el sensor de tacto se activa, la incidencia se acumula en una variable llamada choques a fin de llevar la cuenta de los mismos y adicionalmente se descuentan puntos, en la medida de que el robot choque por tres veces consecutivas se cambia el estado de la bandera i para que el ciclo termine su ejecución y finalice el programa; para la detección de los puntos negros, dentro del ciclo de control while se verifica tal como en el apartado anterior la evaluación de reflexión lumínica del sensor de luz, si esta cae en un valor mayor que el umbral ejecuta las instrucciones que estan detro del bloque de verificación determinado por la instrucción if(Sensor(IN_3) < UMBRAL) tal como se puede vislumbrar en el código fuente del procedimiento mostrado a continuación:

sub puntosNegros()
               {

                    int i=1;
                    int ran;
                    int choques=0;
                    SetSensorTouch(IN_1);
                    SetSensorLight(IN_3);
                    while(i)
                    {
                        OnFwd(OUT_BC, 75);
                        if(SENSOR_1==1) // si el sensor de tacto es activado
                        {
                            puntos = puntos - 50; // restar puntos
                            choques ++; // subir en uno la variable choques
                            OnRev(OUT_BC,60); // retroceder por medio segundo
                            Wait(500);
                            Off(OUT_BC);
                            OnRev(OUT_B,100); // girar aleatoriamente
                            Wait(Random(1000));
                            Off(OUT_BC);
                            playSound(); // reproducir sonido
                            if(choques==3)i = 0;
                      }
                      if (Sensor(IN_3) < UMBRAL) // si el sensor esta dentro del umbral
                      {
                          puntos = puntos + 30; // sumar 30 puntos, detecto punto negro
                          Off(OUT_BC); // detener motores y esperar un segundo
                          Wait(1000);
                          OnRev(OUT_B,100); // retroceder medio segundo
                          Wait(Random(500));
                          NumOut(0,0, puntos); //mostrar por pantalla puntos acumulados
                          playSound(); // reproducir sonido
                       }
                   }
                   Wait(20000); // esperar veinte segundos
              }



Reflexión:

La actividad desarrollada, entretenida y didáctica, sin duda me sirvió para potenciar el emfoque a la integración de sistemas ya que el uso de distintos sensores en conjunto con el modulo de control BRICK y agregando a esto la interfaz de programación BRIXCC provee funcionalidad extendida a la mera programación secuencial de procedimientos desde una perspectiva del desarrollo de aplicaciones finales sin uso de instrumentos auxiliares externos.
Como reflexión respecto de la competencia a validar considero que se efectuaron todos los procesos esperados ya que primero efectué un análisis de que es lo que se debía hacer, luego con un diagrama de flujo pude obtener la lógica programática mas simple posible para llevarla finalmente a un código equilibrado y que interactuara de forma natural con un usuario normal mediante las interfaces disponibles como lo son el teclado y la pantalla.