Translate

jueves, 27 de febrero de 2014

Uso de Condicionales en PseInt

Muchas veces necesitamos tomar desiciones, o adaptar nuestros programas a ciertas situaciones
para ello usaremos las condicionales.
Bueno.. retomaremos el programa anterior
Proceso segundo_programa_de_ejemplo
Definir numero_dos como entero;
Definir saludo como caracter;
Definir tengo_hambre como logico; numero_dos <- 2;
saludo <- 'hola';
tengo_hambre <- verdadero;

Escribir saludo;
Escribir numero_dos;
Escribir 'tengo habre es' ,tengo_hambre;

FinProceso
 Y haremos que en caso de que tengo hambre sea verdadero
nos diga 'voy a comer' y en caso contrario 'entonces no como'

para ello usamos una desición simple del tipo Si-Entonces

Si tengo_hambre Entonces
        Escribir 'voy a comer';
    Sino
        Escribir 'entonces no como';
    FinSi

también se puede escribir como

Si tengo_hambre == verdadero Entonces
        Escribir 'voy a comer';
    Sino
        Escribir 'entonces no como';
    FinSi

 pero... ¿Qué significa el '=='?

Operadores lógicos


Así como en la matemáticas, en la lógica se usan algunos operadores, en este caso usaremos == para indicar que es exactamente igual, dependiendo el lenguaje podemos usar un != para indicar que no es igual, usaremos el > para indicar que el valor es mayor que otro o el < para indicar que el valor es menor que otro. Abordaremos este tema posteriormente para agregar otro tipo de operadores no tan básicos.

Y nuetro programa básico queda como:

 Proceso segundo_programa_de_ejemplo
   
    Definir numero_dos como entero;   
    Definir saludo como caracter;
    Definir tengo_hambre como logico; numero_dos <- 2;
   
    saludo <- 'hola';
    tengo_hambre <- verdadero;
   
    Escribir saludo;
    Escribir numero_dos;
    Escribir 'tengo habre es ' ,tengo_hambre;
   
    Si tengo_hambre Entonces
        Escribir 'voy a comer';
    Sino
        Escribir 'entonces no como';
    FinSi
   
FinProceso

si cambiáramos el valor de la variable tengo_hambre por falso, entonces cambiaría la elección que hiciera el programa.

Ahora veamos como usarlo con numeros. para el caso de una condición basada en números debemos de usar forsozamente SIEMPRE operadores lógicos, en este caso comprobaremos si el número usado es el dos.

 Si numero_dos == 2 Entonces
        Escribir 'el numero es dos';
    Sino
        Escribir 'el numero no es dos';
    FinSi

Si cambiamos el valor numeríco del número cambiaremos la salida del programa.

Y así nuestro programa quedaría como:

Proceso segundo_programa_de_ejemplo
   
    Definir numero_dos como entero;   
    Definir saludo como caracter;
    Definir tengo_hambre como logico; numero_dos <- 2;
   
    saludo <- 'hola';
    tengo_hambre <- verdadero;
   
    Escribir saludo;
    Escribir numero_dos;
    Escribir 'tengo habre es ' ,tengo_hambre;
   
    Si tengo_hambre Entonces
        Escribir 'voy a comer';
    Sino
        Escribir 'entonces no como';
    FinSi
   

Si numero_dos == 2 Entonces
        Escribir 'el numero es dos';
    Sino
        Escribir 'el numero no es dos';
    FinSi


FinProceso

viernes, 14 de febrero de 2014

Uso de Variables en PseInt


Introducción

El elemento más básico de todos los lenguajes de programación son las variables, debemos de considerar a las variables como aquellos elementos que nos permiten tener un valor almacenado y disponible para nuestro uso.

Creando una variable


Como nuestro PC es algo tonto, debemos decirle que necesitamos y como, incluso... cada vez que necesitemos trabajar con valores debemos decirle que tipo de valor vamos a usar y como le llamaremos para no confundirlo.

¿Qué tipos de valores hay?


En PseInt se reconocen los siguientes tipos básicos o simples:

  1. Entero para valores como 1, 2, 3, 1000
  2. Real para valores como 1.1, 2.2, 3.3, 1000.365
  3. Logico para valores como verdadero, falso
  4. Caracter para valores como 'hola', 'adios', 'tres tristes tigres tragaban trigo'

¿Cómo lo llevo a la práctica?


Muy sencillo, cada vez que le queramos decir al pc que necesitamos una variable deberemos escribir la palabra mágica definir, pero también deberemos decirle que tipo de valos vamos a guardar, para eso usamos la palabra mágica como.
Ahora unos ejemplos:

Definir numero_dos como entero;
Definir saludo como caracter;
Definir tengo_hambre como logico;

Ahora tenemos las variables.. pero no les hemos metido nada... vamos a meterle algún valor. Esto se hace mediante la palabra mágica <-, para usarla ponemos la variable a la izquierda y a la derecha ponemos el valor. Si el valor no es del tipo que se peude guardar en el tipo de variable marcará error. Ahora hagamos un fragmento de un programa que imprima algo:

Definir numero_dos como entero;
Definir saludo como caracter;
Definir tengo_hambre como logico;  numero_dos <- 2;
saludo <- 'hola';'
tengo_hambre <- verdadero;

Bueno.. tras este moderado éxito haremos un programa que ya deberemos de entender.
Proceso primer_programa_de_ejemplo
Definir numero_dos como entero;
Definir saludo como caracter;
Definir tengo_hambre como logico; numero_dos <- 2;
saludo <- 'hola';'
tengo_hambre <- verdadero;

Escribir saludo;
Escribir numero_dos;
Escribir 'tengo habre es' ,tengo_hambre;

FinProceso
Espero te haya agradado el tema y te haya servido.

lunes, 20 de mayo de 2013

Login en Prolog

A veces, cuando desarrollamos algún sistema experto necesitamos restringir el acceso al sistema. A continuación presentaré una forma sencilla de controlar el acceso con contraseña.

% Base de datos de usuarios
user('Admin','qwerty'). 

% sistema
misistema :- write('acceso concedido!!'),nl.

%control de acceso
login :- write('Usuario:'), nl, read(Name), write('Pasdword'), nl, read(Password), nl, verifica( Usuario, Password).

verifica( Usuario,Password) :- user( Usuario, Password), misistema. 


sábado, 5 de mayo de 2012

Crear una máquina virtual en Matlab ( léase compilador )

Un poco de teoría

Primero conoceremos que son los ensambladores :3

Ensambladores

  1. Ensambladores de una pasada
    1. Con salida en Binario ( Conocidos también como load and go )
    2. Con salida simbólica-binaria
  2. Ensambladores de dos pasadas

Ensamblador de dos pasadas

En este pequeño tutorial se realizará un ensamblador de dos pasadas.

Primer paso

En el primer paso la prioridad es obtener las tablas

Pasos a realizar durante el primer paso

  • Tratamiento de etiquetas( instrucciones ).
  • Buscar en tabla de símbolos (si no está, pasar al siguiente paso).
  • Insertar en tabla de símbolos.
  • Tratamiento de código de operación.
  • Buscar en tabla de código de operación y actualizar campo de dirección.
  • Escribir código de operación.
  • Buscar en tabla de pseudo- instrucciones y hacer el tratamiento de la pseudo-instrucción.
  • Análisis del operando (en caso de la creación de un código intermedio).
  • Almacenar en tabla de símbolos.
  • Buscar en tabla de símbolos.
  • Sustituir por dirección en tabla de símbolos.

Segundo paso

Sus objetivos son obtener el programa en simbólico y binario, crear las tablas para el linker ( enlazador o ligador ), y localizar las variables ( puede incluir un dump ).

Pasos a realizar durante el segundo paso

  • Tratamiento del código de operación
  • Buscar en tabla de código de operación.
    • Actualizar contador de direcciones.
    • Buscar tabla de pseudo-instrucción (si es símbolo).
  • Tratamiento del operando.
    • Buscar en tabla de símbolo (si es símbolo).
    • Obtener valor
  • Escribir código objeto

Tablas a usar


( pendiente aunque ya estén en el código :P )


Codificando

Borrar variables anteriores y limpiar área de impresión





%% Universidad Autónoma de Tlaxcala
% Blanca Leticia Milácatl López
%%



%% Inicialización
clear, clc
%% TABLAS
%Para poder realizar la conversión se proveen las siguientes tablas
%% tabla de direccion simbolica de los simbolos de direccion
tabla_direccion_simbolica_simbolos_direccion = [];

codigo_de_caracteres_hexadecimales_letras = ['A'; 'M'; 'Y';
    ' '; 'B'; 'N'; 'Z'; '('; 'C'; 'O';
    '0'; ')'; 'D'; 'P'; '1'; '*'; 'E';
    'Q'; '2'; '+'; 'F'; 'R'; '3'; ';';
    'G'; 'S'; '4'; '-'; 'H'; 'T'; '5';
    '.'; 'I'; 'U'; '6'; '/'; 'J'; 'V';
    '7'; '='; 'K'; 'W'; '8'; 'L';
    'X'; '9']; %caracter y código

diagn = ['\n'];

codigo_de_caracteres_hexadecimales_hexa = ['41'; '4D'; '59';
    '20'; '42'; '4E'; '5A'; '28'; '43'; '4F';
    '30'; '29'; '44'; '50'; '31'; '2A'; '45';
    '51'; '32'; '2B'; '46'; '52'; '33'; '2C';
    '47'; '53'; '34'; '2D'; '48'; '54'; '35';
    '2E'; '49'; '55'; '36'; '2F'; '4A'; '56';
    '37'; '3D'; '4B'; '57'; '38'; '4C';
    '58'; '39']; %caracter y código

diagn_num = ['OD'];

%% tabla del conjunto de instrucciones a hexa
conjunto_instrucciones=['AND',% 0 or 8 AND M to AC
'ADD',% 1 or 9 Add M to AC, carry to E
'LDA',% 2 or A Load AC from M
'STA',% 3 or B Store AC in M
'BUN',% 4 or C Branch unconditionally to m
'BSA',% 5 or D Save return address in m and branch to m+1
'ISZ',% 6 or E Increment M and skip if zero
'CLA',% 7800 Clear AC
'CLE',% 7400 Clear E
'CMA',% 7200 Complement AC
'CME',% 7100 Complement E
'CIR',% 7080 Circulate right E and AC
'CIL',% 7040 Circulate left E and AC
'INC',% 7020 Increment AC, carry to E
'SPA',% 7010 Skip if AC is positive
'SNA',% 7008 Skip if AC is negative
'SZA',% 7004 Skip if AC is zero
'SZE',% 7002 Skip if E is zero
'HLT',% 7001 Halt computer
'INP',% F800 Input information and clear flag
'OUT',% F400 Output information and clear flag
'SKI',% F200 Skip if input flag is on
'SKO',% F100 Skip if output flag is on
'ION',% F080 Turn interrupt on
'IOF'];%F040 Turn interrupt off

hexa_instrucciones ={'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7800',
'7400',
'7200',
'7100',
'7080',
'7040',
'7020',
'7010',
'7008',
'7004',
'7002',
'7001',
'F800',
'F400',
'F200',
'F100',
'F080',
'F040'
};

%% Leer el código fuente
fid = fopen('miarchivo.txt','r');
cadenas = fread(fid, '*char')';
fclose(fid);

%% Separar parte de fuconamiento y área de datos

%cadenas= textscan(fid,'%s')
%cadenas=cell2struct(textread('miarchivo.txt','%s', 'whitespace', ''),,1)
[f,c] = size(cadenas);
indice = findstr(cadenas,'HLT')
primeraparte = cadenas(1:indice+3)
segundaparte = cadenas(indice+5:c)

%% Obtener la posicion inicial en memoria
[ppf,ppc] = size(segundaparte);
pos_inicial = findstr(primeraparte,'ORG')+3;
cadnasdepuesorg=cadenas(pos_inicial-3:c)
inicio_memoria = primeraparte(pos_inicial:ppc);
inicio_memoria=textscan(inicio_memoria,'%d');
inicio_memoria=inicio_memoria{1};


%% obtiene la dirección de cada línea a partir de la posición inicial en
%% memoria

programasinorgend = cadnasdepuesorg(1:findstr(cadnasdepuesorg,'END')-1) %guardamos eliminando org y ends
lineas = strread(programasinorgend,'%s','delimiter',sprintf('\n'));
lineas = string(char(lineas))
[num_lineas,c]=size(lineas);

direcciones = [inicio_memoria:inicio_memoria+num_lineas]; %se necesitará pasar a hexadecimal despues

%% imprimir el programa ya con direcciones de referencia
for i=1:num_lineas-1
    %disp(direcciones(i))
    disp(sprintf('%s\t%s',num2str(direcciones(i)),lineas(i+1,:)));
end

% obtiene las líneas
programa_por_lineas = strread(cadenas,'%s','delimiter',sprintf('\n'));
for i=1:num_lineas-1
    %programa_por_lineas(i,:)=sprintf('%s\t%s',num2str(direcciones(i)),lineas(i+1,:));
    programa_por_lineas(i,:)={sprintf('%s\t%s',num2str(direcciones(i)),lineas(i+1,:))};
end
% compostura para que salga bien
n_programa_por_lineas=[cellstr(programa_por_lineas(1:num_lineas-1));cellstr(programa_por_lineas(num_lineas+1))];

disp('Programa con direcciones de memoria')
disp(n_programa_por_lineas)

%% Preparar la TABLA DE SIMBOLOS DE DIRECCION
[spf,spc] = size(segundaparte);
parte_tabla_simbolos = segundaparte(1:findstr(segundaparte,'END')-1)
parte_tabla_simbolos = strread(parte_tabla_simbolos,'%s','delimiter',sprintf('\n'));

[tsf,tsc]=size(parte_tabla_simbolos); %tamaño de la parte donde se saca la tabla de símbolos

tabla_simbolos=[];
valor_tabla_simbolos=[];
%ooops pequeño error, usar el k tiene las direcciones si se puede y guardar
%dirección y símbolo
for num_lineas_felices=1:1:tsf
    %valor_tabla_simbolos(num_lineas_felices)=
    [simbolo,resto] = strtok(parte_tabla_simbolos(num_lineas_felices,:));
    tabla_simbolos=[tabla_simbolos, simbolo];
    disp( simbolo );
    [tipo_dato,resto1]=strtok(resto(1,:));
    
    %pendiente:
    %tratar aquí x para saber el tipo de dato, si es DEC usar str2num
    %luego num2hexpara guardar su valor hexadecimal
    %si es HEX ya está en hexadecimal
    switch upper(char(tipo_dato))
        case 'DEC'
            num = str2num(char(resto1));
            hexad = num2hex(single(num));
            resto1 = hexad;
        case 'HEX'
            num = hex2dec(char(resto1));
            hexad = num2hex(single(num));
            resto1 = hexad;
        otherwise
            error('tipo de datos no reconocido')
    end
    
    valor_tabla_simbolos=[valor_tabla_simbolos;resto1];
    disp(resto1);
    
end
%%valor_tabla_simbolos=char(parte_tabla_simbolos) %no sé para que había
%%puesto esto XD

%simbolos_y_sus_valores(i,:)=strrep(parte_tabla_simbolos(i,:), tabla_simbolos(i,:), valor_tabla_simbolos(i,:)); % pendiente remplazar los
%valores en el programa con las direcciones


%obtener de direcciones los ´ltimos índces hasta el tamaño de simbolos
[datosf, datosc]=size(char(valor_tabla_simbolos));
[programaf,programac]=size(n_programa_por_lineas);

dir_inicio_remplazo = programaf-datosf;

programa_con_direcciones_muy_felices = n_programa_por_lineas; % pendiente cambiar tamañoi

instrucciones=[];
direcciones_instr = [];

for ind = programaf:-1:dir_inicio_remplazo+1
   cad=char(tabla_simbolos(1,programaf+1-ind));
   instr=cad(1:3)
   instrucciones=[instrucciones;instr];
    %programaf-ind
    direcciones_instr=[direcciones_instr;num2str( direcciones(dir_inicio_remplazo-1+(programaf-ind)) )];
    
   % valor_tabla_simbolos(programaf+1-ind,:)
    programa_con_direcciones_muy_felices(dir_inicio_remplazo+(programaf-ind)) = cellstr(sprintf('%s\t%s %s',num2str( direcciones(dir_inicio_remplazo-1+(programaf-ind)) ),instr,valor_tabla_simbolos(programaf+1-ind,:)))
end




copia_tabla_simbolos = tabla_simbolos;

%for i=1:dir_inicio_remplazo
%    strrep(copia_tabla_simbolos(i)
%end

%% encontrar los mnemónicos en las tablas y reemplazar

. . .


Notas

La variable fid es por file identifier o identificador de archivo, no confundir con find.
Este código es a fuerza bruta, no está optimizado.

He estado ayudando en este proyecto, más avances pronto. No olviden comentar.

 

martes, 13 de marzo de 2012

Como saltarse los surveys que cobran por SMS

Aquí veremos un método para brincarse los surveys que se ponen en algunas páginas para ganar dinero a costa de la información que desea el usuario.
En este caso analizaremos el caso de una página de torrents que pone sus encuestas para que alguien se registre
Tomamos un survey y nos pone en espera hasta terminarlo... hasta allí todo normal..

¿Y cuál es el problema? Al terminar survey observamos la trampa, nos piden mandar un SMS, algunas veces incluso las compañías que aparecen no existen en nuestro país.


Como no nos resignamos usaremos un truco muy simple, cualquiera que tenga cuenta en alguna red social podrá realizarlo sin problemas.
Este truco solamente funciona desde un navegador Mozilla firefox, ( Para los que no lo sepan, es un buscador similar a internet explorer ), lo pueden descargar desde la página oficial (  http://www.mozilla.org/en-US/firefox/all.html ).
Para ahorrar tiempo, la versión 10.0.2 en castellano la encuentran en ese sitio con los siguientes links:
Español de México
Español de Chile
Español de Argentina
Español de España

Posteriormente procedemos a instalar el complemento NoScript


Cargamos la página en cuestión, y en el caso de esta redirige si detecta que tratamos de saltar la publicdad, así que oprimimos la "X" que está en la parte de enmedio del navegador antes de que nos cambie de página, en menos de cuatro intentos generalmente se logra y nos deja la página lista para usar. En este caso me registro.



Al oprimir enviar se envía el registro sin problemas



Cualquier duda pueden comentar esta publicación.

Fuentes: http://www.sb-innovation.de/f59/how-bypass-surveys-asia-torrents-registration-page-27143/

viernes, 2 de marzo de 2012

Problema de filtrado simple de imágenes en Matlab

Programa Original
ima=imread('F:\matlab\figuras\zu.bmp');
R=1;G=2;B=3;fondo=100;
[f,c,p]=size(ima);
for(i=1:f)
    for(j=1:c)
        if((ima(i,j,R)==255&&ima(i,j,G)==255&&ima(i,j,B)==255))
            sin_fondo(i,j,R)=fondo;
             sin_fondo(i,j,G)=fondo;
              sin_fondo(i,j,B)=fondo;
        else
             sin_fondo(i,j,R)=ima(i,j,R);
             sin_fondo(i,j,G)=ima(i,j,G);
             sin_fondo(i,j,B)=ima(i,j,B);
subplot(1,3,1)
imshow(ima)
subplot(1,3,3)
imshow(uint&(sin_fondo))
Respuesta

clear,clc
ima=imread('F:\matlab\figuras\zu.bmp');
R=1;G=2;B=3;fondo=100;
[f,c,p]=size(ima);
sin_fondo = ima;
for i=1:f
    for j=1:c
        if ima(i,j,R)==255 && ima(i,j,G)==255 && ima(i,j,B)==255 
            sin_fondo(i,j,R)=fondo;
             sin_fondo(i,j,G)=fondo;
             sin_fondo(i,j,B)=fondo;
% El código comentado no está mal, pero gasta procesamiento se soluciona
% con sin_fondo=ima
%         else
%              sin_fondo(i,j,R)=ima(i,j,R);
%              sin_fondo(i,j,G)=ima(i,j,G);
%              sin_fondo(i,j,B)=ima(i,j,B);
        end
    end
end
subplot(1,3,1)
imshow(ima)
subplot(1,3,3)
imshow(sin_fondo) 

miércoles, 29 de febrero de 2012

Problema de subplots en Matlab

Programa Original
clc
fig=imread('leucocito.bmp');
corte=imread('leucocito_1.bmp');
R=1; G=2; B=3;
hist_R=imhist(corte(:,:,1));
hist_G=imhist(corte(:,:,2));
hist_B=imhist(corte(:,:,3));
subplot(2,4,1)
imshow(corte)
title('image corte')
subplot(2,4,2)
plot(hist_R)
title('canal R')
subplot(2,4,3)
plot(hist_G)
title('canal G')
subplot(2,4,4)
plot(hist_B)
title('canal  B')
cortes=imread('leucocito_2.bmp');
R=1; G=2; B=3;
hist_Red=imhist(cortes(:,:,1));
hist_Green=imhist(cortes(:,:,2));
hist_Blue=imhist(cortes(:,:,3));
subplot(1,4,1)
imshow(cortes)
title('image cortes')
subplot(1,4,2)
plot(hist_Red)
title('canal Red')
subplot(1,4,3)
plot(hist_Green)
title('canal Green')
subplot(1,4,4)
plot(hist_Blue)
title('canal  Blue')
Respuesta

clear, clc
fig=imread('leucocito.bmp');
corte=imread('leucocito_1.bmp');
R=1; G=2; B=3;
hist_R=imhist(corte(:,:,R));
hist_G=imhist(corte(:,:,G));
hist_B=imhist(corte(:,:,B));


%primer renglón
subplot(2,4,1)
imshow(corte)
title('image corte')
subplot(2,4,2)
plot(hist_R)
title('canal R')
subplot(2,4,3)
plot(hist_G)
title('canal G')
subplot(2,4,4)
plot(hist_B)
title('canal  B')
% segundo renglon
cortes=imread('leucocito_2.bmp');
hist_Red=imhist(cortes(:,:,R));
hist_Green=imhist(cortes(:,:,G));
hist_Blue=imhist(cortes(:,:,B));
subplot(2,4,5)
imshow(cortes)
title('image cortes')
subplot(2,4,6)
plot(hist_Red)
title('canal Red')
subplot(2,4,7)
plot(hist_Green)
title('canal Green')
subplot(2,4,8)
plot(hist_Blue)
title('canal  Blue')