elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Ayuda con código para re ordenar array
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con código para re ordenar array  (Leído 1,877 veces)
leosansan


Desconectado Desconectado

Mensajes: 1.232



Ver Perfil
Re: Ayuda con código para re ordenar array
« Respuesta #14 en: 5 Abril 2013, 18:28 »

Creo que con un contador, bandera o flag y un array para guardar los parciales "va que chuta":

Código
  1. 01ab210c213qwe31zxc213
  2.  
  3. 01
  4. ab
  5. 210
  6. c
  7. 213
  8. qwe
  9. 31
  10. zxc
  11. 213
  12. Presione una tecla para continuar . . .
  13.  

Código
  1.  
  2. #include<stdio.h>
  3.  
  4. int main(){
  5.  
  6.    int i,j=0,k=0,cont=0;
  7.    char cadena[80]="01ab210c213qwe31zxc213";;
  8.    char array_de_cadena[40][6] = {{0}};
  9.    puts("01ab210c213qwe31zxc213\n");
  10. //scanf("%s", cadena);
  11. for (i=0;cadena[i]!='\0';i++){
  12.        if (cadena[i]>47 && cadena[i]<58 ){
  13.            if (cont==1){
  14.                array_de_cadena[j][k]='\0';j++;k=0;
  15.            }
  16.        array_de_cadena[j][k]=cadena[i];k++;cont=2;
  17.        }
  18.        else {
  19.            if (cont==2){
  20.                array_de_cadena[j][k]='\0';j++;k=0;
  21.            }
  22.            array_de_cadena[j][k]=cadena[i];k++;cont=1;
  23.        }
  24.   }
  25.    for (i=0;i<=j;i++)
  26.        printf ("%s \n",array_de_cadena[i]);
  27.    return 0;
  28. }
  29.  

Saluditos!. ...


« Última modificación: 5 Abril 2013, 18:32 por leosansan » En línea

85

Desconectado Desconectado

Mensajes: 205



Ver Perfil WWW
Re: Ayuda con código para re ordenar array
« Respuesta #15 en: 5 Abril 2013, 21:19 »

eiiiii no vale poner varias cosas en una línea para que parezca más corto XD


En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
leosansan


Desconectado Desconectado

Mensajes: 1.232



Ver Perfil
Re: Ayuda con código para re ordenar array
« Respuesta #16 en: 5 Abril 2013, 23:20 »

eiiiii no vale poner varias cosas en una línea para que parezca más corto XD


 ;-) ;-) ;-) Lo "rectifico" y aún así, además de corto es "simple" siguiendo el principio de la navaja de Ockham: «en igualdad de condiciones, la explicación más sencilla suele ser la correcta»

Código
  1. #include<stdio.h>
  2.  
  3. int main(){
  4.  
  5.    int i,j=0,k=0,cont=0;
  6. char cadena[80]="01ab210c213qwe31zxc213";;
  7.    char array_de_cadena[40][6] = {{0}};
  8. puts("01ab210c213qwe31zxc213\n");
  9.    for (i=0;cadena[i]!='\0';i++){
  10.        if (cadena[i]>47 && cadena[i]<58 ){
  11.            if (cont==1){
  12.                array_de_cadena[j][k]='\0';
  13.                j++;
  14.                k=0;
  15.            }
  16.        array_de_cadena[j][k]=cadena[i];
  17.        k++;
  18.        cont=2;
  19.        }
  20.        else {
  21.            if (cont==2){
  22.                array_de_cadena[j][k]='\0';
  23.                j++;
  24.                k=0;
  25.            }
  26.            array_de_cadena[j][k]=cadena[i];
  27.            k++;
  28.            cont=1;
  29.        }
  30.   }
  31.    for (i=0;i<=j;i++)
  32.        printf ("%s \n",array_de_cadena[i]);
  33.    return 0;
  34. }
  35.  

Un abrazo y Saluditos!. ....

P.D: Sería más corto con el uso de sscanf, pero no sería más simple ni en igualdad de condiciones respecto a los propuestos.
« Última modificación: 5 Abril 2013, 23:27 por leosansan » En línea

rir3760


Conectado Conectado

Mensajes: 1.349


Ver Perfil
Re: Ayuda con código para re ordenar array
« Respuesta #17 en: 6 Abril 2013, 05:50 »

Sería más corto con el uso de sscanf, pero no sería más simple ni en igualdad de condiciones respecto a los propuestos.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char *cad = "01ab210c213qwe31zxc213";
  7.   char tok[40][6] = {{0}};
  8.   int i;
  9.   int j;
  10.   int nc;
  11.  
  12.   puts("01ab210c213qwe31zxc213");
  13.  
  14.   i = 0;
  15.   while (
  16.      sscanf(cad,  "%[0123456789]%n", tok[i], &nc) == 1 ||
  17.      sscanf(cad, "%[^0123456789]%n", tok[i], &nc) == 1
  18.   ){
  19.      cad += nc;
  20.      i++;
  21.   }
  22.  
  23.   for (j = 0; j < i; j++)
  24.      printf ("tok[%d] == %s\n", j, tok[j]);
  25.  
  26.   return 0;
  27. }

A mi me parece aceptable (no hay nada realmente complicado).

----

Edito:

Por otra parte si la aproximación debe ser "simplicidad a rajatabla" (no me gusta ya que la biblioteca estándar esta para eso: para explotarla) podemos basarnos en una operación XOR:
Código
  1. #include <stdio.h>
  2.  
  3. #define IS_DIGIT(ch) ((ch) >= '0' && (ch) <= '9')
  4.  
  5. int main(void)
  6. {
  7.   char cad[] = "01ab210c213qwe31zxc213";
  8.   char tok[40][6] = {{0}};
  9.   int i;
  10.   int j;
  11.   int k;
  12.  
  13.   puts("01ab210c213qwe31zxc213");
  14.  
  15.   j = 0;
  16.   k = 0;
  17.   for (i = 0; cad[i] != '\0'; i++){
  18.      tok[j][k] = cad[i];
  19.  
  20.      if (IS_DIGIT(cad[i]) ^ IS_DIGIT(cad[i + 1])){
  21.         j++;
  22.         k = 0;
  23.      }else
  24.         k++;
  25.   }
  26.  
  27.   for (i = 0; i < j; i++)
  28.      printf("tok[%d] == %s\n", i, tok[i]);
  29.  
  30.   return 0;
  31. }

Por supuesto con las limitaciones que tiene el uso del array para almacenar los tokens: resultados incorrectos si se sobrepasa la capacidad del elemento (token) o del array en si.

----

Edito 2:

Cambie la versión utilizando sscanf por una ultima mas corta (y por supuesto mas fea). Y no tienen que preguntarme: ya no es tan aceptable (esto ultimo hay que tomarlo con un poco de humor).

Un saludo
« Última modificación: 6 Abril 2013, 18:50 por rir3760 » En línea

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
leosansan


Desconectado Desconectado

Mensajes: 1.232



Ver Perfil
Re: Ayuda con código para re ordenar array
« Respuesta #18 en: 6 Abril 2013, 14:43 »

"Sin dudarlo un instante" me quedo con el segundo. Es una simplificación del mío al mirar un caracter y el siguiente y decidir en función de ello lo que hacer.

Código
  1. #include<stdio.h>
  2.  
  3. int main(){
  4.  
  5.    int i,j=0,k=0,cont=0;
  6. char cadena[80]="01ab210c213qwe31zxc213";
  7.    char array_de_cadena[40][6] = {{0}};
  8. puts("01ab210c213qwe31zxc213\n");
  9.    for (i=0;cadena[i]!='\0';i++){
  10.         array_de_cadena[j][k]=cadena[i];
  11.        if ((cadena[i]>47 && cadena[i]<58) ^ (cadena[i+1]>47 && cadena[i+1]<58)){
  12.                j++;
  13.                k=0;
  14.        }
  15.            else
  16.                k++;
  17.        }
  18.    for (i=0;i<=j;i++)
  19.        printf ("%s \n",array_de_cadena[i]);
  20.    return 0;
  21. }

Muy agudo rir.
Sólo me queda la duda de no introducir el caracter nulo al final de cada cadena.


Saluditos!. ...

P.D: Lo que no entiendo es a cuento de que vino el código que habías posteado anteriormente  :silbar:
« Última modificación: 6 Abril 2013, 15:02 por leosansan » En línea

85

Desconectado Desconectado

Mensajes: 205



Ver Perfil WWW
Re: Ayuda con código para re ordenar array
« Respuesta #19 en: 6 Abril 2013, 16:12 »

rir usando macros para hacer el código más legible?  ;-)
En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
rir3760


Conectado Conectado

Mensajes: 1.349


Ver Perfil
Re: Ayuda con código para re ordenar array
« Respuesta #20 en: 6 Abril 2013, 18:19 »

Sólo me queda la duda de no introducir el caracter nulo al final de cada cadena.
No hay problema. Cuando se declara un array y se inicializa mediante una lista de valores:
Código
  1. char tok[40][6] = {{0}};
Los valores faltantes se toman como cero.

P.D: Lo que no entiendo es a cuento de que vino el código que habías posteado anteriormente :silbar:
¿El primero? Me parecio un buen ejemplo del uso de un interruptor y punteros a funciones.

rir usando macros para hacer el código más legible?  ;-)
No la veo mal. La alternativa era isdigit pero esta no garantiza el resultado uno o cero, se debe forzar y con ello el condicional (con macro):
Código
  1. if (IS_DIGIT(cad[i]) ^ IS_DIGIT(cad[i + 1])){
Termina así (con isdigit):
Código
  1. if (!!isdigit(cad[i]) ^ !!isdigit(cad[i + 1])){
En mi opinión demasiado forzado, a falta de opciones no queda mas (remedio) que utilizar la macro.

Un saludo
En línea

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
85

Desconectado Desconectado

Mensajes: 205



Ver Perfil WWW
Re: Ayuda con código para re ordenar array
« Respuesta #21 en: 7 Abril 2013, 16:37 »

Si eso estaba puesto para inicializar en cero..
Y con respecto a mi segundo código y el primero de rir, usaban memoria dinámica porque no se sabe cuántos bloques (de letras o números) van a resultar. Lo que pasa que asumimos un número así por decir 40 para hacerla más fácil.
En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda para pasar un array que esta en ARGV[] a un array INTEGER..
Programación General
nitr0us 7 3,336 Último mensaje 18 Febrero 2004, 17:23
por zheo
Ordenar en Array¡
Java
Meg 10 3,478 Último mensaje 31 Enero 2010, 23:13
por tripled
ordenar array php
PHP
kakashi20 5 703 Último mensaje 28 Febrero 2013, 15:53
por kakashi20
Ordenar un array de manera que queden del más cercano a M hasta el más alejado
Programación C/C++
maritere22 3 599 Último mensaje 10 Abril 2013, 17:17
por rir3760
Quiero ver el código del método array.Clone() de C#
.NET
DanteInfernum 5 748 Último mensaje 27 Agosto 2013, 18:53
por DanteInfernum
Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines