[RETO] + Funcion Extraer Numeros de Cadenas! [Cpp/C]

Iniciado por x64core, 4 Enero 2012, 22:41 PM

0 Miembros y 2 Visitantes están viendo este tema.

Sagrini

#20

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

void getnumbs (char *cadena)
{ int cont;
for (cont=0; cont<strlen (cadena); cont++)
if (cadena [cont] >= '0' && cadena [cont] <= '9') printf ("%c", cadena [cont]);
}

int main ()
{ getnumbs ("ewiuc3dskhd8nkd62ndsnk9"); return 0; }


sagrini@pc10-1:~/Escritorio$ nano code.c
sagrini@pc10-1:~/Escritorio$ gcc -o code code.c
sagrini@pc10-1:~/Escritorio$ ./code
38629juanra@pc10-1:~/Escritorio$


38629
Process returned 0 (0x0)     execution time : 0.018 s
Press ENTER to continue.




Al que dude que mi código no sea válido, que lea las normas jajaja
Un saludo! Sagrini

m0rf

Citar38629
Process returned 0 (0x0)     execution time : 0.018 s
Press ENTER to continue.

Hola Sagrini, podrias poner con que codigo haces las pruebas de tiempo de ejecución? Es para hacerme una idea.

Por cierto es más rápido un while o un for? Segun lo que tengo entendido es más rápido un for me parece. Que opinión tienen?

Saludos.
Si todos fuéramos igual de inteligentes no existiría la mediocridad porque no podríamos apreciarla. Aprecias la mediocridad?

El_Java

Cita de: Sagrini en  5 Enero 2012, 18:29 PM
Al que dude que mi código no sea válido, que lea las normas jajaja
Si somos flexibles con la descripción del reto (RETO: Funcion Extraer Valores Numericos de Cadenas) podemos entender que se imprima y ya está, pero en su sentido más extricto dice que extraigas, pero no te dice nada de mostrarlo en la salida por consola (porque podria ser en un archivo perfectamente), por lo que lo más correcto es devolver un dato del mismo tipo que procesas (char *, string, etc) pero solo con valores númericos.

@m0rf: en los demás IDE no sé, pero en Codeblocks cuando terminas de ejecutar la aplicación te sale ese mensaje.

PD: tu código va a ser de los/el más eficiente, está en C y no usas estructuras stl como el string, enhorabuena. campeón. Si quieres más eficiencia, guarda strlen(cadena) en una variable, así no tienes que calcularlo 2000 veces

x64core

#23
@Eternal Idol:
Si, fue error mio no escribir todos los detalles :/
porque si modificara tendrian que funcionar hasta con cadenas de tipo: "ndwhe28bdm9n82g1b@n9  #.:Lnhq"
aunque la mayoria si funcionasen perfectamente ( si no es todas )





@m0rf:
yo lo voy a hacer de esta forma:
clock_t ini, end;
 double sec;

 ini = clock();
 // call function
 end = clock();

 sec = (double)(end - ini) / CLOCKS_PER_SEC;


claro que en un bucle de 1000 ciclos...
si alguien tiene una mejor forma de hacerlo que diga por fa :)





@m0rf:
segun lo que sé un for...





@Sagrini:

en la funcion tendria que hacer la tarea de obtener los caracteres devolviendolos en una variable como parametro o como retorno no debe
debe imprimirlos porque al fin y al cabo no se imprimiran , lo hacemos para demostracion lo que nos interesa es la velocidad de la funcion...




@El_Java:

Y las Librerías de tu code?




EDIT:

Gente e agregado la cadena que sera la que determinara la velocidad de nuestras funciones, por favor tomenla en cuenta ( Pido disculpas por no escribirla desde principio aunque creo visto que todas nuestras funciones cumplen con las espectativas de tal cadena :) )


BlackZeroX

#24
@RHL

Pon en rojo lo que tienes en color amarillo, estoy ciego, pero no tanto como para no ver lo que escribes, seria mejor que hicieras citas por medio de su nick (en este estilo) que citar su publicación, ya que si estoy ciego para ver el amarillo pero da un poco de flojera leerte así!¡.

Otras cosas respecto al Reto...

Segun entiendo lo que se pretende es utilizar un algoritmo de dificultad O(X) [lineal] ¿no?... si es asi usa mi primer codigo, y si esta abierto a criterio e ingenio pues toma en consideración el segundo solo como prueba de test (Tiene un errores de retornos, retorna TODOs los numeros pero de manera desordenada... ademas es una de las mas lentas)!¡...

Dulces Lunas!¡.
The Dark Shadow is my passion.

El_Java

#25
El caso que yo uso una plantilla para programar con miles de macros y librerias, y se me ha olvidado añadir las que necesita, ahora mismo lo hago.

Saludos!

rir3760

Cita de: GarbageCollector en  5 Enero 2012, 18:18 PM
¡Absurda! ¿Porqué?! :xD

const char *p;

indica que los caracteres apuntados por p no serán modificados como es el caso de la función. La función printf también hace uso de const char *.

BlackZeroX (Astaroth) se refiere (supongo) a que no es necesario declarar la variable ya que en su lugar puedes utilizar el parámetro "s". De hacerlo así la función se reduce a:
int extraernum(const char *s)
{
   int n = 0;
   
   while (*s){
      if (isdigit(*s))
         n = 10 * n + *s - '0';
     
      s++;
   }
   
   return n;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

ace332

#27
Cita de: rir3760 en  6 Enero 2012, 00:23 AM
BlackZeroX (Astaroth) se refiere (supongo) a que no es necesario declarar la variable ya que en su lugar puedes utilizar el parámetro "s". De hacerlo así la función se reduce a:
int extraernum(const char *s)
{
  int n = 0;
 
  while (*s){
     if (isdigit(*s))
        n = 10 * n + *s - '0';
     
     s++;
  }
 
  return n;
}


Un saludo
Gracias

Uknow

Aqui va otra forma diferente, sin duda no es practica, ni rapida, ni versatil, pero hey! funciona. xD
Código (cpp) [Seleccionar]

//typedef int (* mprintf) ( const char * format, ... );
//mprintf myprintf = (mprintf)0x77c4186a;
//myprintf("%c", cad[x]);

unsigned short mstrlen(char *cad)
{
  char *pcad = cad;
  while(*pcad++);
  return pcad - cad;
}

void extraer(char *cad)
{
unsigned short x = 0;
while(x++ <= mstrlen(cad))
if(cad[x] <=  57 && cad[x] >= 48 )
((int (*)( const char * format, ... ) )0x77c4186a)("%c", cad[x]);

}

int main()
{
char cad[] = "sdh!w2 28 :-)  9ndk#1@b______dy0--hveybd@  # qism083  s'kl...: su2b7h ++bjsnbvxj77ygv1hiiiioms90nms sjbah b#!1!  --R-E-D--0+-w++ONE***WWW.";
extraer(cad);
return 0;
}

Sagrini

@MORF:
Lo he hecho con Codeblocks, que me muestra la salida de tiempo. No sé exactamente cómo calcula los tiempos (supongo que de una forma parecida a RHL, pero ni idea xD), pero ahí está. Luego, la mecánica del while () no es muy diferente de la del for (), pero depende del uso que se le vaya a dar. Generalmente, while () es más simple, pero en este caso for () es más adecuado.
Por cierto, tu código es MUY parecido al mío, y tu mensaje ha sido modificado varias veces. A ver, no seamos... ¬¬

@EL_JAVA:
Cita de: El_Java en  5 Enero 2012, 20:45 PM
Si somos flexibles con la descripción del reto (RETO: Funcion Extraer Valores Numericos de Cadenas) podemos entender que se imprima y ya está, pero en su sentido más extricto dice que extraigas, pero no te dice nada de mostrarlo en la salida por consola (porque podria ser en un archivo perfectamente), por lo que lo más correcto es devolver un dato del mismo tipo que procesas (char *, string, etc) pero solo con valores númericos.
Mi código (a mi parecer) es completamente válido. Yo me atengo a las reglas, si las reglas son tan flexibles...