|
101
|
Programación / Programación C/C++ / Re: Recursividad en C++, programas que no comprendo muy bien
|
en: 26 Octubre 2012, 22:22 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
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
|
|
|
106
|
Programación / Programación C/C++ / Re: Recursividad en C++, programas que no comprendo muy bien
|
en: 26 Octubre 2012, 01:45 am
|
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) { } else if (n==0 || n==-1) { } else { int i; for ( i=1; i<=n; i++ ) } aux(n-2,jump); } } char * jump = malloc(n *sizeof(char)+1); aux(n,jump); jump = NULL; } void main (int argc, char * argv[]) { }
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 / Programación C/C++ / Re: Variable index
|
en: 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++ ) }
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
|
Programación / Programación C/C++ / sys/stat, stat() problema (?) [Lenguaje C]
|
en: 25 Octubre 2012, 22:58 pm
|
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) { } 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) ) } closedir(dir); 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
|
Programación / Scripting / Re: Tipo de dato ARRAY en Batch
|
en: 24 Julio 2012, 22:30 pm
|
Muy bien 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/0nyUVQ00Por 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
|
Programación / Scripting / [BATCH] Tipo de dato ARRAY en Batch
|
en: 24 Julio 2012, 14:08 pm
|
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_typeArray data structure: http://en.wikipedia.org/wiki/Array_data_structureComo 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!
|
|
|
|
|
|
|