domingo, 9 de octubre de 2011

Numeros Capicuos


Autor: Cristian Lara
Competencia: Desarrollo de Software


Descripción de la Actividad

Analice y desarrolle un programa que permita determinar si un número es capicúa.Un numero es Capicúa si se lee del mismo modo de derecha a izquierda que de izquierda a derecha.

Solución



Ejemplos:

1.      1234 à P à El numero no es capicúa.
2.      111111 à P à El numero es capicúa.
3.      1234554321 à P à El numero es capicúa.
4.      11àPà El numero es capicúa.
5.      1àPà El numero es capicúa.



Entrada/salida de datos:

Entrada de datos en valores enteros del [0,+∞] y la salida, es un texto identificando si “el numero es capicúa” o no lo es.


Proceso del programa:
Numero= leer.nextInt();             //Ingresa los números positivos
If(numero>0)                    //validar si el numero es positivo
 X=numero                                        //traspasa el numero para desglosarlo

While (x!=0)                      // mientras x sea distinto de 0 ocurre la operación
                Resto=x%10
                nInvertido=nInvertido*10+resto  // hace la operacion de invertir el numero
                x=x/10
if(nInvertido==numero)  // si es haci es capicúa
                SOP(“el numero es capicúa”)
Else
                SOP(“el numero no es capicúa”)





Generalización:


 

 Codigo e imagen del programa:


Código.
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rodrigosoto.cristianlara;

/**
 *
 * @author Rodrigo.Soto & Cristian.Lara
 */
import java.util.*;
public class NumeroCapicua {

public static void main(String[]args) {
int numero;
int x,nInvertido,resto;
Scanner leer= new Scanner(System.in);
System.out.println("Ingrese un número ");
numero = leer.nextInt();
if(numero>0){
   

x=numero;
nInvertido=0;
resto=0;

while(x!=0)

{ resto=x%10;
nInvertido=nInvertido*10+resto;
x=x/10;}

if(nInvertido==numero)
System.out.println("El numero es capicua");
else
System.out.println("El numero no es capicua");}
}}



Reflexión

Al principio me pareció algo extraño el programa por la razón que desconocía que eran los números capicuos pero una vez consultado a la profesora pude despejar la duda y ponerme a trabajar en el programa.


Java básico aplicando el método de los 4 pasos.

Autor: Cristian Lara
Competencia: Desarrollo de Software

Descripción de la Actividad


Se  presentaron en clases los elementos básicos relacionados con el lenguaje de programación Java. En la presente actividad se busca  haber revisado la presentación publicada en la semana 1 (Presentación del curso y elementos base) y su comprensión, específicamente en lo que se refiere al Método de los 4 pasos para la resolución de problemas de programación, mas los ejercicios hechos en clases.


Solución




Paso 1: Ejemplos Entrada/Salida

5 ->[Proceso]-> v
A ->[Proceso]-> Error
-1 ->[Proceso]-> El numero es:
S ->[Proceso]-> Error
@@ ->[Proceso]-> Error
5+5->[Proceso]-> Error
0 ->[Proceso]-> El numero es:
1 ->[Proceso]-> I
20 20 ->[Proceso]-> XX
10A ->[Proceso]-> Error
3_3->[Proceso]-> Error
~.~ ->[Proceso]-> Error
NN ->[Proceso]-> Error
___->[Proceso]-> Error
!!!! ->[Proceso]-> Error

Paso 2: Análisis y Diseño

while(numero>0){
 
Una solución para este problema es que el numero ingresado por el usuario (numero) hacer un while donde (numero) sea mayor a 0





Para poder realizar el programa tube que tener varias cosas en cuenta por ejemplo:
En ningún número se puede poner una misma letra más de tres veces seguidas (XIII = 13;)
Si entre dos cifras cualesquiera existe otra menor, ésta restará su valor a la siguiente (XIX = 19;)



Paso 3: Especificación en DA



Paso 4: Implementación en Java

package numerosromano;

import java.io.*;
import java.util.*;

public class Numerosromano
{
    public static void main (String[]args)throws IOException{
    //variables a utilizar
    int miles;
    int centenas;
    int decenas;
    int unidades;
    int num;
    String numeroromano;
   
    System.out.println("Ingrese numero a convertir");

    Scanner leer = new Scanner(System.in);
    System.out.print("... ");
     try
    {  
        numeroromano = leer.nextLine();
        num = Integer.parseInt(numeroromano);
    }
    catch(NumberFormatException e)
    {
        System.out.println("ERROR");
       
        numeroromano = leer.nextLine();
        num = Integer.parseInt(numeroromano);
       
    }
            
  
    if((num>0)&&(num<5001))
    {
            //Calculo para poder llegar al resultado
        miles=num/1000;
        centenas=num/100;
        decenas=(num%100)/10;
        unidades=(num%100)%10;

        System.out.println();
        System.out.print(" En numeros romanos: ");

        switch(miles)//ocupamos pa variable miles
        {
            case 1:
            System.out.print("M");
            centenas=(num%1000)/100;
            break;
            case 2:
            System.out.print("MM");
            centenas=(num%1000)/100;
            break;
            case 3:
            System.out.print("MMM");
            centenas=(num%1000)/100;
            break;
            case 4:
            System.out.print("_IV_");
            centenas=(num%1000)/100;
        }

        switch(centenas)//ocupamos pa variable centenas
        {
            case 1:
            System.out.print("C");
            break;
            case 2:
            System.out.print("CC");
            break;
            case 3:
            System.out.print("CCC");
            break;
            case 4:
            System.out.print("CD");
            break;
            case 5:
            System.out.print("D");
            break;
            case 6:
            System.out.print("DC");
            break;
            case 7:
            System.out.print("DCC" );
            break;
            case 8:
            System.out.print("DCCC");
            break;
            case 9:
            System.out.print("CM");
            break;
        }
        switch(decenas)//ocupamos pa variable decenas
        {
            case 1:
            System.out.print("X");
            unidades=(num%100)%10;
            break;
            case 2:
            System.out.print("XX");
            unidades=(num%100)%10;
            break;
            case 3:
            System.out.print("XXX");
            unidades=(num%100)%10;
            break;
            case 4:
            System.out.print("XL");
            unidades=(num%100)%10;
            break;
            case 5:
            System.out.print("L");
            unidades=(num%100)%10;
            break;
            case 6:
            System.out.print("LX");
            unidades=(num%100)%10;
            break;
            case 7:
            System.out.print("LXX");
            unidades=(num%100)%10;
            break;
            case 8:
            System.out.print("LXXX");
            unidades=(num%100)%10;
            break;
            case 9:
            System.out.print("XC");
            unidades=(num%100)%10;
            break;
        }
        switch(unidades)//ocupamos pa variable unidades
        {
            case 1:
            System.out.print("I");
            break;
            case 2:
            System.out.print("II");
            break;
            case 3:
            System.out.print("III");
            break;
            case 4:
            System.out.print("IV");
            break;
            case 5:
            System.out.print("V");
            break;
            case 6:
            System.out.print("VI");
            break;
            case 7:
            System.out.print("VII");
            break;
            case 8:
            System.out.print("VIII");
            break;
            case 9:
            System.out.print("IX");
            break;
        }
     System.out.println();

   }
  }
}//fin de la clase

Captura de pantalla


Reflexión

En esta actividad aplique lo que previamente nos pasaron en clases complementándolo con recursos encontrados en Internet.

Funcionamiento básico de la CPU

Autor: Cristian Lara
Competencia: Gestión en TI.



Descripción de la Actividad


Esta actividad posee 2 partes: realizar el calculo de área de una circunferencia con números reales y calcular el promedio de una lista de números dados.


El Código de 32 bits, que realice la siguiente acción:
Solicitar por teclado el diámetro de una circunferencia y calcular el área mostrando el resultado por pantalla.

También Se requiere , resolver el problema usando el simulador de CPU Simuproc, indicando ademas el funcionamiento de los ciclos de reloj para las primeras 4 instrucciones del codigo propuesto.

 Ejemplo:
 #056   <- primera direccion de memoria
  110   ;cantidad de numeros a promediar

;numeros a promediar
#061  <- segunda direccion de memoria
    10
    100
    111
    101
    100
 +  10
 ---------
 11000 / 110 = 100 -> promedio = 4



Solución


Código circunferencia:





msg "ingrese ahora el diametro "; muestra el mensaje en la pantalla
in ax,1  ; Ingresa datos del teclado
stf 021  ;  Guarda los numeros en la posicion de memoria 021
ldf 021  ; luego carga los numeros que se encontraban en la memoria 021
divf 089 ; Divide  el que se encuentra en la  memoria 089
stf 028  ; guarda el numero en 028
ldf 028  ; Carga el numero que anterior mente guardamos en 028
mulf 028 ; lo multiplica por si mismo
stf 010 ; luego lo guarda en la  memoria 010
ldf 010 ; despues cara el numero que guardamos en 010
mulf 090 ; multiplica el numero de la posision 090
stf 011 ;   y multiplica el numero de memoria 011
out 1,ax; Muestra resultado en pantalla
hlt     ; fin del programa


#089
0100000000000000
0000000000000000


#90
0100000001001000
1111010111000010

Ciclos:

Leo en PC la proxima direccion a ejecutar :000
Envio al MAR la proxima direccion de mem a leer. 
Llevo al MDR al contenido de dicha direccion de memoria.
Le entrego al IR el dato para que lo decodifique e incremento el PC.
Leo de la pos 089 de memoria el valor a copiar en CX
Escribo 101 en CX

Leo en PC la proxima direccion a ejecutar: 001
Envio al MAR la proxima direccion de mem a leer
Llevo al MDR el contenido de dicha direccion de memoria
Le entrego al IR el dato para que lo decodifique e incremento el PC
LDB: 094 a esta direccion le sumo el valor de BX: 50 posiciones
Llevo al MAR el contenido de la direccion 0C6
Cargo en AX el contenido de la direccin

Leo en PC la proxima direccion a ejecutar: 002 
Envio al MAR la proxima direccion de mem a leer
Llevo al MAR el contenido de dicha direccion de memoria
Le entrego al IR el dato para que lo decodifique e incremento el PC
Llevo la pos de mem 050 a MAR de donde esta lo que voy a sumar con AX 
Llevo al MDR el contenido de la direccion 050 
Leo AX y MDR para ser llevados a la ALU y realizar la suma
Despues de realizada la SUMA, almaceno el resultado en AX

Leo en PC la proxima direccion a ejecutar: 003
Envio al MAR la proxima la proxima  direccion de mem a leer
Llevo al MAR el contenido de dicha direccion de memoria
Le entrego al IR el dato para que lo decodifique e incremento el PC
Llevo la Pos de mem 050 a MAR que es de donde voy a guardar AX
Leo AX para ser llevado a MDR antes de ser escrito en memoria
Llevo a MDR el contenido de AX para luego escribirlo en 050
Escribo en la Pos 050 el valor 11111010

leo en PC la proxima direccion a ejecutar : 004
Envio al MAR la proxima  direccion de mem a leer
Llevo al MAR el contenido de dicha direccion de memoria
Le entrego al IR el dato para que lo decodifique e incremento el PC
Leo BX (registro a incrementar) para llevarlo a la ALU Y sumarle 1
Escribo BX registro (registro ya incrementado)

También podemos decir que un ciclo del reloj tiene que ver con la velocidad del procesador incorporado  
en la CPU del ordenador y se mide en megaherz (MHz) y a velocidad del reloj 
corresponde al numero de pulsaciones por segundo.

Promedios

#SimuProc 1.4.3.0

MOV CX,089   ;Copia el contenido a CX
LDB 094      ; luego carga en AX el contenido
ADD 050      ; Lo ocupamos para poder sumar
STA 050      ;  Guardamos  el contenido AX en direccion de memoria 050
INC BX       ; Incrementamos en 1 el valor del contenido de BX
LOOP 001     ; Repetimos la accion
DIV 089      ; Lo usamos para poder dividir
MSG "El promedio es = " ; Muestra en pantalla un mensaje correspondiente
EAP          ;Nos permite mostrar en pantalla nuestro mensaje
XAB          ; Intercambiamos los registros AX y BX
HLT          ;fianl del programa


#089
   101       ;cantidad de numeros a promediar


             ;Numeros a promediar
#094
   1001101
   1010101
   1110
   11110
   101100

Reflexión

Encontré muy difícil poder ocupar lo que es el simuproc y ver como trabaja un procesador en tiempo real, pero practicando logre el objetivo.







Mi primer Programa en NXC

Autor: Cristian Lara
Competencia: Desarrollo de Software
Palabras Clave: Programación, NXC, robótica.


Descripción


Se pide programar un robot para tour, que sea capaz de recorrer una ruta
establecida, dentro de un parque de atracciones. En este parque existen diferentes
obstáculos que deben ser evadidos para mantener la seguridad de sus pasajeros, y además
existen puntos de descanso en los que el robot debe detenerse para que los pasajeros
puedan tomar fotografías y el guía pueda indicar las atracciones del lugar. Esta ruta de tour
debe ser recorrida un total de 2 veces.
En términos prácticos, ya que no se cuenta con un robot (ni un parque de atracciones) a escala
real, con ayuda de su robot NXT, deben simular esta actividad en la mesa de competición
preparada para la ocasión.

Debe tomar en cuenta:

● Que la ruta no es precisa, pero el robot debe esquivar los obstaculos exactamente en la
manera pedida.
● El robot debe llegar y detenerse en todas las estaciones para tomar fotos y luego
continuar su recorrido. Cada una de estas pausas será de 2 segundos.
● Al volver el robot al punto de partida la primera vez, podrá ser mínimamente
reposicionado (con la mano) en la zona de partida de ser necesario.
● Cuando el robot termine su segundo recorrido (en el que también debe detenerse en los
puntos para sacar fotografías y mantener la ruta) el robot debe detenerse, y no seguir
funcionando.


Codigo Fuente documentado:


task main()
     {
    repeat (2)//repetir 2 veces el recorrido
     {
    OnFwd (OUT_BC,50); //encendido de motores y primera salida
    Wait ( 1000);//espera 1 segundo
    Off (OUT_BC);  //apagado de motores en primera estación durante 2 segundos
    Wait (2000);//espera 2 segundos
    OnFwd (OUT_BC,50); //encendido de motores
    Wait (2000);//espera 2 segundos
    OnRev (OUT_C,50); //primera vuelta
    Wait (450);//espera casi medio segundos
    OnFwd (OUT_C,50);
    Wait (3000);//espera 3 segundos
    Off (OUT_BC); //apagado de motores en segunda estacion durante 2 segundos
    Wait (2000);//espera 2 segundos
    OnFwd (OUT_BC,50); //encendido de motores
    OnRev (OUT_C,50); //segunda vuelta
    Wait (500);//espera medio segundos
    OnFwd (OUT_C,50);
    Wait (4000);//espera 4 segundos
    OnFwd (OUT_C,70); //realiza una curva para esquivar un obstáculo
    Wait (1000);//espera 1 segundos
    OnFwd (OUT_B,80);//el motor B gira en una velocidad de 80 para poder realizar la curva
    Wait (1200);//espera 1,2 segundos    
    OnFwd (OUT_BC,50);// los 2 motores avanzan a una velocidad de 50
    Wait (2000);//espera 2 segundos
    Off (OUT_BC); //apagado de motores en tercera estación durante 2 segundos
    Wait (2000);//espera 2 segundos
    OnFwd (OUT_BC,50); //encendido de motores
    Wait (1000);//espera 1 segundos
    OnRev (OUT_C,50); //tercera vuelta
    Wait (380);//espera unos  segundos
    OnFwd (OUT_C,50);//baja su velocidad a 50
    Wait (4000);//espera 4 segundos
    Off (OUT_BC); //se detiene en el punto de partida
    Wait (2000);//espera 2 segundos
    OnRev (OUT_C,50); //cuarta vuelta para quedar en posicion inicial
    Wait (1000);//espera 2 segundos
    OnFwd (OUT_BC,50);// se normalizan a una misma velocidad los motores
    Wait (1000);//espera 2 segundos
    }
    Off (OUT_BC); //apagado de motores y fin del recorrido 
      }//fin

deo de la actividad Realizada.



Reflexión
Creo que esta primera actividad de robot al principio, al igual que mis compañeros nos pareció un tanto difícil  pero después con el tiempo aprendimos a manejar el lenguaje de estos y así poder completar este objetivo.