
Hace una semana me dejaron de tarea en la escuela, programar un ehm.. “simulador” de una maquina URM (Unlimited Register Machine) un modelo de computadora muy primitivo y básico, aunque es de los primeros modelos desarrollados, ha sido probado que puede resolver algoritmos de alta complejidad.
Esto les podrá servir un poco si necesitan hacer algo parecido, ya que en la internet, hay pocos ejemplos de este modelo, sumo uno mas con este.
El programa está escrito en C puro básicamente:
El programa lee instrucciones desde un txt en este formato:
Z(3)
Z(4)
Z(5)
S(4)
S(5)
J(1,5,8)
J(1,1,4)
Z(5)
S(3)
J(2,3,12)
J(1,1,4)
(Que en este caso es una multiplicación).
carga las instrucciones a un arreglo
y finalmente un switch lee y ejecuta las instrucciones.
Muy sencillo, se puede mejorar muchísimo con objetos, funciones, etc.
acá el code ->
-
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
-
/*www.chirango.com
-
Programado por Toily el 16 de Octubre 2008 para la Fundación Arturo Rosenblueth
-
rosenblueth.mx
-
Objetivo didáctico*/
-
-
int main() {
-
int tamano = 0; //inicializacoón de la variable que determina el tamaño del arreglo
-
int lin,col; //navega arreglo para imprimirlo
-
int i =0; //navega arreglo para llenarlo
-
int j =0; //navega arreglo para llenarlo
-
char c; //char para capturar caracter del archivo
-
char valor[1024]; //auxiliar para baajar los valores que se leen en formato char a int en el arreglo de instrucciones
-
valor[0] = ‘\0′; //inicializar valor como cadena vacia
-
-
-
//Necesario para abrir el archivo
-
FILE *file;
-
file = fopen("suma.txt", "r"); //nombre de archivo
-
-
/* abrir archivo */
-
if(file==NULL) {
-
printf("No existe el archivo.\n");
-
return 1;
-
}
-
else {
-
printf("Leyendo archivo y cargando programa…\n");
-
//Archivo abierto
-
//Leer archivo
-
/*calcular el tamaño del programa basado en el numero de) encontrados*/
-
while(1) {
-
c = fgetc(file);
-
if(c!=EOF) {
-
if(c==’)'){ //calcular el tamaño del programa para crear el arreglo…
-
tamano++;
-
}
-
}
-
else {
-
printf("El programa tiene %i lineas\nCargando programa al arreglo de instrucciones…\n",tamano);
-
fclose(file);
-
break; //fin del archivo
-
}
-
}
-
file = fopen("suma.txt", "r");
-
int instrucciones [tamano][4]; //crear arreglo basado en el tamaño del programa o el numero de ) que haya encontrado
-
-
lin=0;
-
col=0;
-
while(1) {
-
c = fgetc(file);
-
if(c!=EOF) {
-
-
if(c==’\n’) c=’\0′; //hack para corregir el salto de linea en la cadena y que no pase al arreglo de instrucciones
-
-
/*Cargado de programa al arreglo
-
instrucciones [lin] [col]
-
por ser un arreglo de enteros, las instrucciones corresponden así:
-
Z = 0
-
S = 1
-
J = 2
-
C = 3
-
*/
-
switch (c) {
-
case ‘Z’:
-
c=’0′;
-
break;
-
case ‘S’:
-
c=’1′;
-
break;
-
case ‘J’:
-
c=’2′;
-
break;
-
case ‘C’:
-
c=’3′;
-
break;
-
default:
-
break;
-
}
-
-
if( c==’(‘ || c==’,’ || c==’)’ ) {
-
// Navegacion dentro del arreglo para acomodar los numeros en sus lugares y,0 para instrucciones);
-
if(c==’(‘ || c==’,'){
-
col++;
-
}
-
-
if(c==’)'){
-
lin++;
-
col=0;
-
}
-
-
memset(valor, 0, 1024); //resetea la variable valor para poder ser usada de nuevo
-
}else{
-
valor[strlen(valor)] = c;
-
valor[strlen(valor)] = ‘\0′;
-
}
-
instrucciones[lin][col] = atoi(valor); //atoi convierte de cadena a entero para bajarlo al arreglo int
-
}
-
else {
-
printf("———–\nPrograma cargado con éxito:\n\n");
-
break; //fin del archivo
-
}
-
}
-
for (i = 0; i < lin; i++){//muestra el contenido del programa
-
for (j = 0; j < 4; j++){
-
printf(" %i ",instrucciones[i] [j]);
-
}
-
printf("\n");
-
}
-
printf("\nCerrando archivo…\n");
-
fclose(file);
-
/***************************************** TERMINA LECTURA DE ARCHIVO y no mames falta lo demás xD ************************/
-
int registros[256]; //tira de registros manipulables;
-
//int registros[6] = { 2, 2, 3, 0, 5, 6 };
-
-
-
int cabezal=0; //variable para recorrer el arreglo de instrucciones
-
//int largo=0;//conocer el tamaño de la tira de registros
-
int k=0;//auxiliar para contar
-
-
-
printf("\nIndique los valores de los registros (-1 para terminar)\n");
-
while(1){//llenado de la tira de registros
-
printf("\n%i: ",k+1);
-
scanf( "%d", ®istros[k]);
-
//if(k>0 && registros[k]>registros[k-1]) largo = registros[k] //conocer el valor mas alto para crear la tabla de registros
-
if(registros[k]<0)break;
-
k++;
-
}
-
-
-
/*
-
Z = 0
-
S = 1
-
J = 2
-
C = 3
-
*/
-
-
while(1){
-
switch (instrucciones[cabezal][0]) {
-
case 0: //Z crea un 0 en el registro X
-
registros[ (instrucciones[cabezal][1])-1 ]=0; //-1 para la correccion del espacio ya que el array empiezxa en 0
-
cabezal++;
-
break;
-
case 1:
-
registros[ (instrucciones[cabezal][1])-1 ]++;
-
cabezal++;
-
break;
-
case 2:
-
if( registros[ (instrucciones[cabezal][1])-1 ] == registros[ (instrucciones[cabezal][2])-1 ]){
-
cabezal= instrucciones[cabezal][3]-1;
-
}else{
-
cabezal++;
-
}
-
break;
-
case 3:
-
registros[ (instrucciones[cabezal][2])-1 ]=registros[ (instrucciones[cabezal][1])-1 ];
-
cabezal++;
-
break;
-
default:
-
break;
-
}
-
-
if(cabezal==lin) break;
-
}
-
-
for (j = 0; j < 10; j++){
-
printf("%i: %i \n",j+1,registros[j]);
-
}
-
-
return 0;
-
}
-
}
-
-
Lamentablemente ( y lo acepto xD jaja) estoy OXIDADISMO en C así que el programa esta bastante sucio, estructuradisimo, y mal muy mal hecho, PERO lo interesante es que explica el algoritmo de manera MUY simple.
Saludos banda geeky





















![Blog de una muy buena amiga donde relata su devenir en este mundo n.n [Sombra del Silencio]](http://img139.imageshack.us/img139/8162/dioneud9.gif)
No muy mal toily no andes poniendo nuestras tareas en la Internet, jajaja.
Me parece perfecto lo que haces la verdad si tienes toda la razón hay muy poco ejemplos acerca de esta maquinita y los pocos que encuentras son muy complejos y elavorados.
La verdad es bueno empezar a enter el funcionamiento de la URM con algo simple y sencillo como lo que hicimos nosotros. No me mal entiendan si es lo bastante complicado para realizar la tareas principales que exige la urm.
Un saludo