• Viernes 3 de Mayo de 2024, 05:30

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - MutenRo

Páginas: [1]
1
Retos / Re: El Problema De Los Bloques
« en: Lunes 21 de Febrero de 2005, 13:43 »
Hola Nagisa,

lo de la entrada estándar se me pasó (lo comentas al final del e-mail y yo me concentré en el recuadro del enunciado donde no se menciona nada al respecto).

Por lo demás a mi me funciona perfectamente y con las intrucciones del ejemplo se obtiene la salida esperada.

Yo utilizo el Visual C++ tanto para C como para C++ y tal vez haya escrito algo que no sea estrictamente de C (por ejemplo los comentarios de una línea con //).
Trata de compilarlo en C++.

El programa lee las intrucciones con un fscanf y comprueba si ha asignado las cuatro variables que se leen en cada línea (todas tienen 4). Sale del programa cuando no se han asignado las cuatro variables (escribas quit o cualquier otra cosa).

Y lo de presuponer un solo espacio pues creo que es lógico dado que en el ejemplo vienen así todos los comandos...

Un saludo.

2
Retos / Re: El Problema De Los Bloques
« en: Domingo 20 de Febrero de 2005, 21:27 »
Bueno, aqui va mi solución, a ver qué os parece....
Las órdenes van en el fichero orden.txt (podeis copiar las del ejemplo).

#include <stdio.h>
#include <string.h>

void posicion(short array[][25], short bloque, short* fila, short* columna)
{
                // devuelve la posición (en el array) en la que se encuentra un bloque
   int i,j=-1;
   for(i=0; i<25; i++, j=-1)
   {
      while(array[++j] != -1)
      {
         if (array[j] == bloque)
         {
            *fila=i;
            *columna=j;
            break;
         }
      }
   if (array[j] == bloque) break;
   }
}

void limpia(short array[][25], short fila, short columna)
{
   // devuelve los bloques de encima a sus posiciones originales
   short bloque;
   while((bloque=array[fila][++columna]) != -1)
   {
      array[bloque][0]=bloque; // ponerlo en la posicion inicial
      array[bloque][1]=-1; // fin de la pila
   }
}

void main(void)
{
FILE *fichero;
short array[25][25];
short i, j, num_bloques=10, origen, destino, fila_o, col_o, fila_d, col_d;
char orden_1[6], orden_2[6];

//inicializo el array
for (i=0; i<25; i++)
{
   for (j=0; j<25; j++)
      array[j]=0;
}
for (i=0; i<25; i++)
{
   array[0]=i;
   array[1]=-1; // con -1 indicamos fin de pila
}

//lectura de órdenes y ejecución
fichero=fopen("orden.txt", "r");
if (fichero != NULL)
{
fscanf(fichero,"%d", &num_bloques);
while ((fscanf(fichero,"%s %d %s %d", orden_1, &origen, orden_2, &destino)) == 4)
{
   posicion(array, origen, &fila_o, &col_o);
   posicion(array, destino, &fila_d, &col_d);

   if (origen == destino || fila_o == fila_d)
   {
      // printf("\nOrden incorrecta, origen y destino no pueden coincidir.");
   }

   else if (strcmp(orden_1,"move") == 0 && strcmp(orden_2,"onto") == 0)
   {
   limpia(array,fila_o, col_o);
   limpia(array,fila_d, col_d);
   array[fila_d][col_d + 1]=array[fila_o][col_o];// lo movemos
   array[fila_d][col_d + 2]=-1; // indicamos fin de pila
   array[fila_o][col_o]=-1; // indicamos fin de pila en el origen
   }
   
   else if (strcmp(orden_1,"move") == 0 && strcmp(orden_2,"over") == 0)
   {
   limpia(array,fila_o, col_o);
   for (i=0;array[fila_d]!=-1;i++);
   array[fila_d]=array[fila_o][col_o];// movemos el bloque
   array[fila_d][++i]=-1;// fin de pila en el destino
   array[fila_o][col_o]=-1; // indicamos fin de pila en el origen
   }

   else if (strcmp(orden_1,"pile") == 0 && strcmp(orden_2,"onto") == 0)
   {
   limpia(array,fila_d, col_d);
   i=0;
   while(array[fila_o][col_o + i] != -1)
      {
         array[fila_d][col_d + i + 1]=array[fila_o][col_o + i];
         i++;
      }
   array[fila_d][col_d + i + 1]=-1; // indicamos fin de pila en el destino
   array[fila_o][col_o]=-1; // indicamos fin de pila en el origen
   }

   else if (strcmp(orden_1,"pile") == 0 && strcmp(orden_2,"over") == 0)
   {
   for(j=0; array[fila_d][j]!=-1; j++); //localizamos el final
   i=0;
   while(array[fila_o][col_o + i] != -1)
      {
         array[fila_d][j + i]=array[fila_o][col_o + i];
         i++;
      }
   array[fila_d][j + i]=-1; // indicamos fin de pila en el destino
   array[fila_o][col_o]=-1; // indicamos fin de pila en el origen
   }
   else
   {
      // printf("\nComando incorrecto.\n");
   }
}


fclose(fichero);
}
else
{
perror("Error al abrir el fichero");
}

//rutina de impresión
for (i=0; i<num_bloques; i++)
{
   printf("\n%d:",i);
   j=0;
   while (array[j] != -1)
   {
      printf(" %d", array[j++]);
   }
}
printf("\n");

}

3
Retos / Re: El Problema De Los Bloques
« en: Sábado 19 de Febrero de 2005, 13:21 »
Bueno, parece que sí se pueden deshacer los bloques mediante un "move a onto b" por ejemplo pero esto requiere hacer un movimiento que tal vez no te interesa sólo para deshacer una pila. De hecho creo que con este sistema es imposible volver a la posición inicial donde cada bloque está en su lugar de origen, ¿verdad? :blink:

4
Retos / Re: El Problema De Los Bloques
« en: Sábado 19 de Febrero de 2005, 01:06 »
Hola Nagisa, tengo una duda.

Según el esquema de funcionamiento descrito sería imposible volver a deshacer las pilas que se forman, verdad? Es decir, no hay ordenes para volver a llenar los 'huecos' que se ven en la salida del programa ejemplo. Lo cual significa que siempre se mueven los bloques de unas pilas a otras hasta que al final se pueda llegar a una situación en la que tienes una sola pila con todos los bloques, momento en el que ya ninguna orden sería válida.

¿Es así?

5
Visual C++ / Re: Libreria "conio.h
« en: Viernes 18 de Febrero de 2005, 20:19 »
Cierto, JuanK.

¿cómo se puede saber qué otros ficheros hacen falta?

¿dónde se encuentra el código de las funciones declaradas?

Un saludo.

6
C/C++ / Re: Problema De Memoria
« en: Viernes 18 de Febrero de 2005, 17:21 »
Como dice Ruben3D lo más seguro es que se agote la memoiria del sistema.

Comentas que el error ocurre en un bucle de unas 500 iteraciones, cuando va por la 46. Realmente es necesario mantener toda esa información en memoria?

Posiblemente el programa esté mal hecho en el sentido de que no se libera el espacio que ya no necesita usarse. Utiliza el operador delete siempre que hayas terminado de utilizar algo inicializado con new.

7
Visual C++ / Re: Libreria "conio.h
« en: Viernes 18 de Febrero de 2005, 17:13 »
Aquí la tienes.

8
C/C++ / Re: Redireccionamiento
« en: Domingo 13 de Febrero de 2005, 22:50 »
Gracias Cirrus, ¡con lo sencillo que era!

Basta con hacer algo así de simple para obtener e imprimir la primera palabla que da como salida un programa:

// lee.c
#include <stdio.h>
void main(void)
{
   char palabra[81];
   scanf("%s", palabra);
   printf("%s",palabra);
}

Ejemplo: c:\>dir | lee

Salida: El (dir simpre empiza imprimiendo "El volumen de la unidad C...")

9
C/C++ / Re: Decompilador
« en: Domingo 13 de Febrero de 2005, 22:30 »
No es que sea un decompilador pero si sabes algo de ensamblador te recomiendo el IDA.

Es un desensamblador que puede trabajar con un montón de procesadores y puede identificar la mayoría de lenguajes de programación utilizados, identificando las llamadas a las funciones estándar y llamadas al API, así como muchas otras facilidades.

10
C/C++ / Redireccionamiento
« en: Domingo 13 de Febrero de 2005, 20:00 »
Muy buenas a todos,
soy nuevo en este foro y éste es mi primer mensaje.

Quiero hacer un programa en C de manera que pueda leer e interpretar la salida que da en pantalla otro programa (en tiempo real). Para ello quiero hacer uso del operador | tan conocido en los tiempos del DOS. Se trataría de un programa que se ejecuta por la línea de comandos (como en el DOS), al igual que el MORE, SORT o FIND y produce los resuldados dependiendo de la entrada del proceso anterior.

Sería algo así: C:\> programa | mi_programa

"programa" puede ser cualquier cosa que produzca mensajes en pantalla, como por ejemplo DIR.

¿Cómo se programa tal cosa?

Gracias.

Páginas: [1]