Menú

Mostrar Mensajes

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

Mostrar Mensajes Menú

Mensajes - BatchianoISpyxolo

#101
Cita de: leosansan en 26 Octubre 2012, 17:55 PM
Corrige algo porque sólo me sale " 1 ". No veo la sentencia - scanf- que permita entrar el tamaño de la figura. Supongo que estoy torpe, pero no me "cuadra" el código sin un scanf o un tamaño predeterminado. Perdona las observaciones. ¿O lo entras por el terminal?. Sí, eso es de ahí la conversión atoi. OK. Aclarado. Basta cambiar
Código (cpp) [Seleccionar]
figura(atoi(argv[1]));
por
       int num;
printf ("Entre un numero IMPAR:");
scanf ("%d",&num);
figura(num);

Pero no funciona correctamente ya que el 1 2 están desplazados una posición más a la derecha de lo que deberían; lo mismo le pasa al último 1.Saludos!

Disculpa, no me fijé. Es sencillo, para esos dos casos, basta con rectificar su salto inicial (jump) en un espacio.

Código modificado.

PD: cuidado con recoger valores numéricos por teclado  :D
#102
Cita de: 0xDani en 26 Octubre 2012, 16:02 PM
Pues ahora mismo no se cual es el error, pero si solo usas stat() para saber si es un directorio o un archivo, en la estructura dirent tambien hay un campo que te lo dice: d_type.

y aqui hay un ejemplo de la funcion stat(): http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html

Saludos.

Gracias por el d_type, se nota que no miré bien la struct dirent xD
#103
Cita de: 0xDani en 26 Octubre 2012, 15:43 PM
Nunca he visto un codigo en el que se le reserve memoria al puntero a dirent.

He hecho tantas pruebas y tantos cambios... El error está en el stat() que siempre me devuelve -1 cuando le paso el d_name de la entrada de directorio actual...
#104
Cita de: leosansan en 26 Octubre 2012, 15:39 PM
Lo haría con el código de cypascal, pero el tuyo es demasiado "denso": realmente has sacado la artillería pesada: strcpy, strcat, malloc ....
Pero reconozco que lo has "bordado", me parece increible.


Opino lo mismo que tú :P

PD: ya modifiqué el código para que sea exactamente la figura que se pide.
#105
Cita de: BatchianoISpyxolo en 26 Octubre 2012, 01:45 AM
...y si quieres generar la misma figura que la tuya solo le tienes que poner una condición para que genere correctamente las dos últimas filas.
#106
Ya que tu título habla sobre recursividad te voy a dar la solución recursiva y funcional en C. Vale para cualquier entero y si quieres generar la misma figura
que la tuya solo le tienes que poner una condición para que genere correctamente las dos últimas filas.

Uso la librería stdlib.h para malloc y la string.h para jugar con el salto inical.

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

void figura(int n) {

int aux(int n, char * jump) {

if (n < -1) return 0;
else {

if (n==1) {
jump[strlen(jump)-1] = '\0';
printf("%s1 2\n", jump);
} else if (n==0 || n==-1) {
jump[strlen(jump)-1] = '\0';
printf("%s1\n", jump);
} else {
int i;
printf("%s", jump);
for ( i=1; i<=n; i++ )
printf("%d ", i);
printf("\n");

}

jump = strcat(jump, "  ");
aux(n-2,jump);
}

}

char * jump = malloc(n*sizeof(char)+1);
strcpy(jump, "");
aux(n,jump);

free(jump);
jump = NULL;

}

void main (int argc, char * argv[]) {
figura(atoi(argv[1]));
}


Ejemplos de funcionamiento:

pyxolo@ubuntu:~/Escritorio$ ./f 3
1 2 3
1 2
 1
pyxolo@ubuntu:~/Escritorio$ ./f 5
1 2 3 4 5
 1 2 3
  1 2
   1
pyxolo@ubuntu:~/Escritorio$ ./f 7
1 2 3 4 5 6 7
 1 2 3 4 5
   1 2 3
    1 2
     1
pyxolo@ubuntu:~/Escritorio$ ./f 9
1 2 3 4 5 6 7 8 9
 1 2 3 4 5 6 7
   1 2 3 4 5
     1 2 3
      1 2
       1
pyxolo@ubuntu:~/Escritorio$ ./f 11
1 2 3 4 5 6 7 8 9 10 11
 1 2 3 4 5 6 7 8 9
   1 2 3 4 5 6 7
     1 2 3 4 5
       1 2 3
        1 2
         1
pyxolo@ubuntu:~/Escritorio$ ./f 13
1 2 3 4 5 6 7 8 9 10 11 12 13
 1 2 3 4 5 6 7 8 9 10 11
   1 2 3 4 5 6 7 8 9
     1 2 3 4 5 6 7
       1 2 3 4 5
         1 2 3
          1 2
           1
pyxolo@ubuntu:~/Escritorio$ ./f 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
 1 2 3 4 5 6 7 8 9 10 11 12 13
   1 2 3 4 5 6 7 8 9 10 11
     1 2 3 4 5 6 7 8 9
       1 2 3 4 5 6 7
         1 2 3 4 5
           1 2 3
            1 2
             1

#107
Programación C/C++ / Re: Variable index
26 Octubre 2012, 00:06 AM
A ver, la variable de control de un bucle es en sí misma una variable como cualquier otra que se ve alterada conforme un ciclo pueda tener inicio y fin.

Gracias a los ciclos podemos hacer que una variable, por ejemplo la de control, tome un rango de valores: a0, a1, aN

Por ello, podemos hacer un recorrido de una estructura tipo array a través del método de acceso índex o índice. Ya que cada elemento de esa estructura ocupa la posición 0..M-1, 0..N-1, 0..O-1, etc dependiendo de las dimensiones del array. Aunque para hacer arrays N-dimensionales
generalmente se usan punteros.

Ejemplo:

#include <stdio.h>

void main(){
int lista[10]; // vector de 10 elementos de tipo int
int i,j=1; // variable de control del ciclo for

/* Rellenamos el vector "lista" con los cuadrados de los primeros
10 números naturales */
for ( i=0; i<10; i++ )
lista[i] = j++*j;

/* Mostramos el vector "lista" con los cuadrados de los primeros
10 números naturales */
printf("El vector lista contiene los elementos:");
for ( i=0; i<10; i++ )
printf(" %d", lista[i]);
printf("\n");
}


Ahí tienes un ejemplo de ciclo con array y qué papel juega la variable de control al utilizarla como índice del array.

De todas formas, C, C++, etc. no son buenos lenguajes para aprender a programar.
#108
Bueno, estoy creando una shell básica en C y trato de crear el comando deltree. Lo que quiero hacer es poder diferenciar entre archivos y directorios para que cuando sea un directorio, hacer una llamada recursiva a la propia función. La idea, como todos sabréis, es yo le paso una ruta, y la función me borra todo el árbol de archivos y directorios cuya raíz es la ruta que le paso. (En el código no verifiqué todavía el argc, pero ahí no está el problema, sino en la struct stat que creo que no se actualiza correctamente.

El código:


// Includes de la shell
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/dir.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#define MAXENTRADA 2048

void deltree (char ** argv, int argc) {
   struct dirent *ent;
   struct stat fStat;
   DIR *dir = opendir(argv[1]);
   if(dir == NULL) {
       perror("Hubo un error");
   } else {
       while ( (ent=readdir(dir)) != NULL ) {

           if(strcmp(".",ent->d_name) == 0 ||
              strcmp("..",ent->d_name) == 0) continue;

           stat(ent->d_name, &fStat);

           if ( S_ISDIR(fStat.st_mode) )
               puts(ent->d_name);

       }

       closedir(dir);
       free(ent);
       ent = NULL;

   }
}


el stat(ent->d_name, &fStat); devuelve -1 pero cuando hago un stat("dir/archivo_válido", &fStat); funciona correctamente. Es decir, que cuando le paso un "string" a stat, funciona correctamente pero cuando le paso el d_name del struct dirent, su salida es -1...

¿Alguna ayudita para poder solucionar el código?

¡Gracias de antemano!
#109
Scripting / Re: Tipo de dato ARRAY en Batch
24 Julio 2012, 22:30 PM
Cita de: Binary_Death en 24 Julio 2012, 16:26 PM
Muy bien  :P el asunto de los arrays en batch es interesante. Hay muchos intentos de implementaciones, la cuestión es que finalmente rara vez resultan útiles salvo en casos muy especiales.
Hace unos años yo también me puse a hacer un código del estilo, aunque en mi caso era para la gestión de una base de datos más fácilmente.

No sabía demasiado, pero bueh, aquí está el código: http://pastebin.com/0nyUVQ00

Por lo que veo te está quedando muy bien. Mi consejo es ese, que si quieres hacer el proyecto bien hecho, procura que sea deseable usarlos para programar ;)

Sep. De todas formas se puede hacer un "include" de la "clase" tipo-array para tener toda la estructura en sólo un archivo.

Tiempo al tiempo xD

¡Saludetes!
#110
Lo primero que debo decir es que, como ya sabéis, la estructura ARRAY no existe primitivamente en Batch, pero es simulado su tipo de dato (array unidimensional) a través de un conjunto de scripts que nos va a permitir manejar dicha estructura.

Si no conoces la estructura array visita:

Array data type: http://en.wikipedia.org/wiki/Array_data_type
Array data structure: http://en.wikipedia.org/wiki/Array_data_structure

Como dije antes, trabajaremos con arrays unidimensionales.

Para generar dicha estructura usaremos adicionalmente una función para crear strings.

create_string.bat
:: Standard Array Datatype Library V-0.5
:: [@FUNCTION NAME]: Create String
:: [@FUNCTION DESCRIPTION]: This script allows us to create strings and establishes some methods for them.
:: [@AUTHOR]: Manoel A. Folgueira
:: [@WEBSITE]: http://batchispano.com
:: [@Twitter]: @ant0nlg
:: create_string string_name:(bunch of chars, string) "text":(bunch of chars)

@echo off

set "text=%2"
for /f "usebackq tokens=*" %%i in ('!text!') do (
set "%1=%%~i"
)

:: String length method
set /a %1_len=0
if "!%1!" NEQ "" (
set /a i=0
set /a %1_len=0
:length_counter
if "!%1:~%i%,1!" NEQ "" (
set /a %1_len+=1
set /a i+=1
goto :length_counter
)
)

set /a %1_limit=%1_len-1

goto :eof


A continuación, mostraré los scripts que nos permiten manejar la estructura. Los códigos se pueden mejorar (sort_array.bat optimizarlo a quicksort) y todavía se deben hacer algunos cambios a la estructura y quizás realizar una especificación para que no haya problemas a la hora de utilizarla. Finalmente veremos un ejemplo de como se comporta la estructura.

create_array.bat
:: Standard Array Datatype Library V-0.5
:: [@FUNCTION NAME]: Create Array
:: [@FUNCTION DESCRIPTION]: This peace of code will let you create an array from 0.
:: [@AUTHOR]: Manoel A. Folgueira
:: [@WEBSITE]: http://batchispano.com
:: [@Twitter]: @ant0nlg
:: create_array array_name:(bunch of chars, string) "delimiter":(char) "array_content":(string w/delimiter)

@echo off

if "%~3" NEQ "" (
call create_string del %2
call create_string content %3
call create_string %1 "[!content!]"
set /a content_l=!content_len! - 1
set /a offset=0
set /a index=0

for /l %%i in (0,1,!content_l!) do (
if "!content:~%%i,1!" EQU "!del!" (
set /a len=%%i-!offset!
call :set_value_index %1 !index! "content:~!offset!,!len!"
set /a offset=%%i+1
set /a index+=1
)
)
call :set_value_index %1 !index! "content:~!offset!,!content_len!"
set /a %1_limit=!index!
set /a %1_len=!index!+1

:: delete values
set del=
set content=
set content_l=
set offset=
set index=
set len=
)

goto :eof

:set_value_index
call create_string %1[%2] "!%~3!"
goto :eof


show_array.bat
:: Standard Array Datatype Library V-0.5
:: [@FUNCTION NAME]: Show Array
:: [@FUNCTION DESCRIPTION]: The array structure of the array passed is shown.
:: [@AUTHOR]: Manoel A. Folgueira
:: [@WEBSITE]: http://batchispano.com
:: [@Twitter]: @ant0nlg
:: show_array array_name:(bunch of chars, string)

@echo off

echo Vector: !%1!
for /l %%U in (0, 1, !%1_limit!) do (
echo %1[%%U] =^> !%1[%%U]!
)

goto :eof


insert_array.bat
:: Standard Array Datatype Library V-0.5
:: [@FUNCTION NAME]: Insert Array
:: [@FUNCTION DESCRIPTION]: You can add any value you want to the specified array.
:: [@AUTHOR]: Manoel A. Folgueira
:: [@WEBSITE]: http://batchispano.com
:: [@Twitter]: @ant0nlg
:: insert_array array_name:(bunch of chars, string) "delimiter":(char) "value":(any) position:(int)

@echo off

if %4 EQU !%1_len! (
set "%1[%4]=%~3"
set "%1="
set /a %1_len+=1
set /a %1_limit+=1
for /l %%i in (0, 1, !%1_limit!) do (
set "%1=!%1!%~2!%1[%%i]!"
)
set %1=[!%1:~1!]
) else if %4 LSS !%1_len! (
if %4 GEQ 0 (
set /a %1_len+=1
set /a %1_limit+=1
set /a limit=%4+1
for /l %%j in (!%1_limit!, -1, !limit!) do (
set /a bPos=%%j-1
call :set_value %1[%%j] "%1[!bPos!]"
)
call create_string %1[%4] "%~3"
set "%1="
for /l %%k in (0, 1, !%1_limit!) do (
set "%1=!%1!%~2!%1[%%k]!"
)
set %1=[!%1:~1!]
)
)

goto :eof

:set_value

call create_string %1 "!%~2!"

goto :eof


delete_array.bat
:: Standard Array Datatype Library V-0.5
:: [@FUNCTION NAME]: Delete Array
:: [@FUNCTION DESCRIPTION]: With this function, you are able to delete any index of the array.
:: [@AUTHOR]: Manoel A. Folgueira
:: [@WEBSITE]: http://batchispano.com
:: [@Twitter]: @ant0nlg
:: delete_array array_name:(bunch of chars, string) "delimiter":(char) position:(int)

@echo off

if !%1_len! EQU 1 (
set /a %1_len-=1
set /a %1_limit-=1
call create_string %1[0] ""
set "%1=[]"
) else (
if %3 EQU !%1_limit! (
set "%1[%3]="
set "%1="
set /a %1_len-=1
set /a %1_limit-=1
for /l %%i in (0, 1, !%1_limit!) do (
set "%1=!%1!%~2!%1[%%i]!"
)
set %1=[!%1:~1!]
) else if %3 LSS !%1_len! (
if %3 GEQ 0 (
set /a %1_len-=1
set /a %1_limit-=1
for /l %%j in (%3, 1, !%1_limit!) do (
set /a bPos=%%j+1
call :set_value %1[%%j] "%1[!bPos!]"
)
call create_string %1[!%1_len!] ""
set "%1="
for /l %%k in (0, 1, !%1_limit!) do (
set "%1=!%1!%~2!%1[%%k]!"
)
set %1=[!%1:~1!]
)
)
)

goto :eof

:set_value

call create_string %1 "!%~2!"

goto :eof


modify_array.bat
:: Standard Array Datatype Library V-0.5
:: [@FUNCTION NAME]: Modify Array
:: [@FUNCTION DESCRIPTION]: It allows you to modify the content of any index within the array limits.
:: [@AUTHOR]: Manoel A. Folgueira
:: [@WEBSITE]: http://batchispano.com
:: [@Twitter]: @ant0nlg
:: modify_array array_name:(bunch of chars, string) "delimiter":(char) "value":(any) position:(int)

@echo off

if %4 geq 0 (
if %4 leq !%1_limit! (
call create_string %1[%4] "%~3"
set "%1="
for /l %%i in (0, 1, !%1_limit!) do (
set "%1=!%1!%~2!%1[%%i]!"
)
set "%1=[!%1:~1!]"
)
)

goto :eof


sort_array.bat
:: Standard Array Datatype Library V-0.5
:: [@AUTHOR]: Manoel A. Folgueira
:: [@WEBSITE]: http://batchispano.com
:: [@Twitter]: @ant0nlg
:: sort_array array_name:(bunch of chars, string) "delimiter":(char)

@echo off

call create_string array "%~1"
if !%array%_len! gtr 0 (
for /l %%i in (0, 1, !%array%_limit!) do (
for /l %%j in (%%i, 1, !%array%_limit!) do (
if !%array%[%%j]! lss !%array%[%%i]! (
call create_string t "!%array%[%%i]!"
call create_string  %array%[%%i] "!%array%[%%j]!"
call create_string  %array%[%%j] "!t!"
)
)
)
set "%array%="
for /l %%k in (0, 1, !%array%_limit!) do (
set "%array%=!%array%!%~2!%array%[%%k]!"
)
if !%array%_len! EQU 1 (
set %array%=[!%array%!]
) else (
set "%array%=[!%array%:~1!]"
)
)

goto :eof


l_search_array.bat
:: Standard Array Datatype Library V-0.5
:: [@FUNCTION NAME]: Linear Search
:: [@FUNCTION DESCRIPTION]: It allows you to find elements within an array without any restriction.
:: [@AUTHOR]: Manoel A. Folgueira
:: [@WEBSITE]: http://batchispano.com
:: [@Twitter]: @ant0nlg
:: l_search_array array_name:(bunch of chars, string) "value":(any) "position-to-return":(bunch of chars, string)

@echo off

set /a %~3=-1
set /a index=0

:search_loop
if %~2 EQU !%1[%index%]! (
set /a %~3=!index!
goto :eof
)

if !index! gtr !%1_limit! (goto :eof)
set /a index+=1
goto :search_loop

goto :eof


b_search_array.bat
:: Standard Array Datatype Library V-0.5
:: [@FUNCTION NAME]: Binary Search
:: [@FUNCTION DESCRIPTION]: It allows you to find elements within an array efectively. Array must be sorted.
:: [@AUTHOR]: Manoel A. Folgueira
:: [@WEBSITE]: http://batchispano.com
:: [@Twitter]: @ant0nlg
:: b_search_array array_name:(bunch of chars, string) "value":(any) "position-to-return":(bunch of chars, string)

@echo off

set /a %~3=-1
set /a LowerLimit=0
set /a HigherLimit=!%1_limit!
:search_loop
set /a CentralLimit=(LowerLimit+HigherLimit)/2
if %~2 EQU !%1[%CentralLimit%]! (
set /a %~3=!CentralLimit!
) else if %~2 gtr !%1[%CentralLimit%]! (
set /a LowerLimit=CentralLimit+1
) else (
set /a HigherLimit=CentralLimit-1
)

if !LowerLimit! gtr !HigherLimit! (
set "LowerLimit="
set "HigherLimit="
set "CentralLimit="
goto :eof
) else if !%~3! NEQ -1 (
set "LowerLimit="
set "HigherLimit="
set "CentralLimit="
goto :eof
) else (
goto :search_loop
)

goto :eof


Como se puede apreciar, en ningún script se habilita la expansión de variables, por lo que deberemos habilitarla en nuestros scripts.

Aquí un ejemplo de cómo funciona la estructura array hasta el momento.

script.bat
@echo off
setlocal enabledelayedexpansion

call create_array vector " " "50 -1 9"
call show_array vector
echo.
call insert_array vector " " "0" 1
call show_array vector
echo.
call delete_array vector " " 2
call show_array vector
echo.
call modify_array vector " " "-1" 1
call show_array vector
echo.
call l_search_array vector "50" LPos
echo Posicion de 50 con busqueda linear: !LPos!
echo.
call sort_array vector " "
echo Vector Ordenado
call show_array vector
echo.
call b_search_array vector "50" BPos
echo Posicion de 50 con busqueda binaria: !BPos!
echo.

pause

goto :eof




Y con esto me despido... Comentarios, críticas, insultos, y demás locuras que se les ocurran serán excelentemente bienvenidas...

Recuerden que todavía está por perfeccionar para el uso "común" de todos nosotros ;)

A mí, de momento, ya me ayudó a implementar el tipo SET o CONJUNTO :)


¡Saludos!