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


 


Tema destacado: Concurso de desarrollo de aplicaciones EHN-DEV 2014


+  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 2,014 veces)
ZedGe

Desconectado Desconectado

Mensajes: 154


Ver Perfil
Ayuda con código para re ordenar array
« en: 2 Abril 2013, 17:47 »

Lo que necesito es que dado un array de largo 80, cree otro que re ordene los datos del anterior según la clase de los datos.

En otras palabras, entra un código de letras y numero, y necesito que en el nuevo arreglo, en cada casilla se guarden los números y letras por separado según se lean.

Adjunto una imagen para que me entiendan mejor, el primero es el código que entra, y lo de abajo es como necesito que quede el otro arreglo.




Este es el código erróneo que tengo hasta ahora:


Código:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <string.h>


using namespace std;


char* organizar(char *operacion);

int main()
{
    char dato_entrada[80];
    cout << "Ingrese Codigo: ";
    cin  >> dato_entrada;
    char* operacion = organizar(dato_entrada);
    printf(operacion);
    return 0;
}


char* organizar (char* operacion){

int largo=0;  //largo total
int largo2=0; //recorre aux2
int largo3=0; //recorre el codigo inicial
while (operacion[largo]!='\0') largo++;//cuenta el largo del codigo

char* aux2 = '\0'; //array que tendra la separaciones

while(largo3 < largo){

if(operacion[largo3] != '0' || operacion[largo3] != '1' || operacion[largo3] != '2'){
aux2[largo2] = strcpy(aux2[largo2],operacion[largo3]); //si encuentra un 0 1 o 2 lo guarda
printf(aux2[largo2]);
largo3++;
}

else if (operacion[largo3] != 'a' || operacion[largo3] != 'b' || operacion[largo3] != 'c'){
aux2[largo2] = strcpy(aux2[largo2],&operacion[largo3]); //si encuentra un a b o c lo guarda
printf(aux2[largo2]);
largo3++;
}

else largo2++;

}

return aux2;
}


En línea

Wofo

Desconectado Desconectado

Mensajes: 168


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

No he leído tu código, pero has incluido "stdio.h" dos veces.


En línea

Puntoinfinito


Desconectado Desconectado

Mensajes: 919


#! /win/archlinux


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

Más fácil todavía. Primero miras el tamaño de la char, todo y que sabemos su tamaño.

Código:
dato_entrada.size();

Ahora con un ciclo vas mirando una por una diciendo si es letra o número;

Código:
... !variable > Z ...

Esto lo verifica, entonces haces que vaya almacenando contenido a una misma posición que ya iras controlando con una variable y con append vas añadiendo, y en caso de que esto cambie (haces un else puro y duro) lo vaya almacenando a la siguiente posición y vaya ordenándolo. Y listo.
En línea

AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.
ZedGe

Desconectado Desconectado

Mensajes: 154


Ver Perfil
Re: Ayuda con código para re ordenar array
« Respuesta #3 en: 2 Abril 2013, 23:27 »


Esto lo verifica, entonces haces que vaya almacenando contenido a una misma posición que ya iras controlando con una variable y con append vas añadiendo, y en caso de que esto cambie (haces un else puro y duro) lo vaya almacenando a la siguiente posición y vaya ordenándolo. Y listo.

use el append pero me da problemas al querer trabajar con char* :/
En línea

Puntoinfinito


Desconectado Desconectado

Mensajes: 919


#! /win/archlinux


Ver Perfil WWW
Re: Ayuda con código para re ordenar array
« Respuesta #4 en: 3 Abril 2013, 16:26 »

Si muestras parte del código te puedo ayudar mucho mejor ;)

Ahora que caigo append es un parametro de la librería string, pero de todas maneras creo que se puede utilizar con char. La utilización tendría que ser;
Código
  1. char variable[4] = {'H', 'o','l'}; //creamos una sequencia char con un espacio libre
  2. append(variable[3],'a'); //lo rellenamos

Esto recuerda que se puede hacer de manera automática;

Código
  1. for (int i = 0;i<variable.size();i++) {
  2. append(variable[i],'loquesea');
  3. }
  4.  

Si continuas teniendo error, utiliza strcpy, que es el que utilizaba yo;

Código
  1. char a[12] = "World";       /*  12 = strlen("Hello World") + 1  */
  2. strcpy(a, "Hello World");

Saludos!!  :D
En línea

AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.
ZedGe

Desconectado Desconectado

Mensajes: 154


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

Me sigue dando errores al usar append o strcpy,que no puedo pasar de char a const char, o derrepente sale de char a char*
En línea

85

Desconectado Desconectado

Mensajes: 205



Ver Perfil WWW
Re: Ayuda con código para re ordenar array
« Respuesta #6 en: 4 Abril 2013, 02:40 »

El tema de const char* a char* o vice versa, es un tema de 'casting', se soluciona haciendo casting y listo, puesto que 'const' es tan sólo una protección del compilador a nivel código, para el programador, para que se remarquen que ciertas "cosas" son constantes. Y Siendo así, deberías o bien respetar esto o bien saber muy bien por qué habrías de cambiarlo..
En línea

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


Desconectado Desconectado

Mensajes: 919


#! /win/archlinux


Ver Perfil WWW
Re: Ayuda con código para re ordenar array
« Respuesta #7 en: 4 Abril 2013, 15:03 »

Sube código
En línea

AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



HACK AND 1337 : http://hackandleet.blogspot.com
WEBSITE: http://www.infiniterware.
ZedGe

Desconectado Desconectado

Mensajes: 154


Ver Perfil
Re: Ayuda con código para re ordenar array
« Respuesta #8 en: 4 Abril 2013, 17:11 »

El codigo es ese que subi en el post :S
En línea

85

Desconectado Desconectado

Mensajes: 205



Ver Perfil WWW
Re: Ayuda con código para re ordenar array
« Respuesta #9 en: 4 Abril 2013, 18:39 »

Si se trata de escribir una cadena alfanumérica y hacer que la misma se divida en bloques separados de letras o números, entonces en ese caso escribí un código simple que hace eso, el tema es que justo me dieron ganas de no hacer nada XD y lo dejé funcionando pero sin terminar ya que no llegué a implementar memoria dinámica para que quede terminado.
En lugar de eso existe un array de cadenas de un máximo aceptable de 20 cadenas, pero para ver como se hace te va a servir.
Tu código dijiste que estaba mal por eso te muestro este otro código.

Como te dije, está sin terminar pero por eso mismo si te interesa lo podés terminar, implementando memoria dinámica para el array de cadenas que vas a usar para guardar todos los bloques.

Código
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. //http://www.cplusplus.com/reference/cstdlib/realloc/
  5.  
  6.  
  7. int main(){
  8.  
  9.  
  10. char cadena[512];
  11. //char** array_de_cadenas_r = 0;
  12. //char** array_de_cadenas = (char**)malloc(sizeof(char)*1);
  13. //array_de_cadenas[0] = (char*)malloc(sizeof(char)*128);
  14.  
  15. char array_de_cadenas[20][128] = {{0}};
  16.  
  17. printf("ingrese la cadena..\n");
  18. scanf("%s", cadena);
  19.  
  20. int modo=0;
  21. int pos=-1;
  22. int let;
  23. int num;
  24. int i=0;
  25. int j;
  26. while(cadena[i]){
  27.  
  28. if(pos == 20) break;
  29.  
  30. if(cadena[i] >= 'a' && cadena[i]<='z'){
  31. let++;
  32. num=0;
  33. }
  34. else if(cadena[i] >= 'A' && cadena[i]<='Z'){
  35. let++;
  36. num=0;
  37. }
  38. else if(cadena[i] >= '0' && cadena[i]<='9'){
  39. num++;
  40. let=0;
  41. }
  42. else
  43. {
  44. let=0;
  45. num=0;
  46. }
  47.  
  48. if((modo==1&&let)||(modo==2&&num));
  49. else
  50. {
  51. pos++;
  52. j=0;
  53.  
  54. //int a=0;
  55. //char backup[512];
  56. //strcpy(backup, array_de_cadenas[a]);
  57. //array_de_cadenas_r = (char**)realloc(array_de_cadenas, sizeof(char)*(pos+1));
  58. //array_de_cadenas[pos] = (char*)malloc(sizeof(char)*128);
  59. }
  60.  
  61.  
  62. if(let){
  63.  
  64. array_de_cadenas[pos][j] = cadena[i];
  65. j++;
  66. modo=1;
  67. }
  68. else if(num){
  69.  
  70. array_de_cadenas[pos][j] = cadena[i];
  71. j++;
  72. modo=2;
  73. }
  74. else
  75. {
  76. modo=0;
  77. }
  78.  
  79. i++;
  80. }
  81.  
  82. for(int b=0; b<pos+1; b++){
  83.      printf(array_de_cadenas[b]);
  84.      putchar('\n');
  85. }
  86.  
  87. //for(int c=0; c<pos; c++) free(array_de_cadenas[c]);
  88. //free(array_de_cadenas);
  89.  
  90. system("pause");
  91. return 0;
  92. }
  93.  
En línea

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

Desconectado Desconectado

Mensajes: 154


Ver Perfil
Re: Ayuda con código para re ordenar array
« Respuesta #10 en: 4 Abril 2013, 19:22 »

gracias amigo lo adaptare a lo otro que necesito :P muchas gracias....

pero podrías explicarme algo??


Citar
if((modo==1&&let)||(modo==2&&num));
      else
      {
         pos++;
         j=0;
      }

para que es esa parte del codigo?
En línea

85

Desconectado Desconectado

Mensajes: 205



Ver Perfil WWW
Re: Ayuda con código para re ordenar array
« Respuesta #11 en: 5 Abril 2013, 00:50 »

Ak está el code, avisenme cualquier koza si algún detaye se habrá escapado XD

Eso que remarcastes significa lo siguiente, son todos los casos en los cuales se continúa copiando char por char hasta completar un bloque.
un bloque se forma o sólo por letras o sólo por números.
Entonces esa comprobación comprueba el estado de un par de flags o agrupación de flags, que informan el paso de un bloque a otro, o mejor dicho el final de un bloque.
Si se encuentra ante el final de un bloque, entonces se incrementa la posición en el array dinámico,  y se resetea el contador usado para copiar cadenas.

Código
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4. //http://www.cplusplus.com/reference/cstdlib/realloc/
  5.  
  6.  
  7. int main(){
  8.  
  9.  
  10. char cadena[512];
  11. char** array_de_cadenas = 0;
  12. char** array_de_cadenas_r = (char**)malloc(sizeof(char)*1);
  13. array_de_cadenas_r[0] = (char*)malloc(sizeof(char)*128);
  14. memset(array_de_cadenas_r[0],0,sizeof(char)*128);
  15.  
  16. // char array_de_cadenas[20][128] = {{0}};
  17.  
  18. printf("ingrese la cadena..\n");
  19. scanf("%s", cadena);
  20.  
  21. int modo=0;
  22. int pos=-1;
  23. int let=0;// contador usado como flag
  24. int num=0;// contador usado como flag
  25. int i=0;
  26. int j=0;
  27. while(cadena[i]){
  28.  
  29. //if(pos == 20) break;
  30. if(j==(128-2)) {
  31.  
  32. printf("uno de los bloques sobrepasa char=128-2\n");
  33. system("pause");
  34. return 0;
  35. }
  36. if(cadena[i] >= 'a' && cadena[i]<='z'){
  37. let++;
  38. num=0;
  39. }
  40. else if(cadena[i] >= 'A' && cadena[i]<='Z'){
  41. let++;
  42. num=0;
  43. }
  44. else if(cadena[i] >= '0' && cadena[i]<='9'){
  45. num++;
  46. let=0;
  47. }
  48. else
  49. {
  50. let=0;
  51. num=0;
  52. }
  53.  
  54. if((modo==1&&let)||(modo==2&&num));
  55. else
  56. {
  57. pos++;
  58. j=0;
  59. array_de_cadenas_r = (char**)realloc(array_de_cadenas_r, sizeof(char)*(pos+1));
  60. array_de_cadenas_r[pos] = (char*)malloc(sizeof(char)*128);
  61. memset(array_de_cadenas_r[pos],0,sizeof(char)*128);
  62. }
  63.  
  64.  
  65. if(let){
  66.  
  67. array_de_cadenas_r[pos][j] = cadena[i];
  68. j++;
  69. modo=1;
  70. }
  71. else if(num){
  72.  
  73. array_de_cadenas_r[pos][j] = cadena[i];
  74. j++;
  75. modo=2;
  76. }
  77. else
  78. {
  79. modo=0;
  80. }
  81.  
  82. i++;
  83. }
  84.  
  85. array_de_cadenas = array_de_cadenas_r;
  86. for(int b=0; b<pos+1; b++){
  87. printf(array_de_cadenas[b]);
  88. putchar('\n');
  89. }
  90.  
  91. for(int c=0; c<pos; c++) free(array_de_cadenas[c]);
  92. free(array_de_cadenas);
  93.  
  94. system("pause");
  95. return 0;
  96. }
  97.  


« Última modificación: 5 Abril 2013, 00:53 por 85 » En línea

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


Conectado Conectado

Mensajes: 1.445


Ver Perfil
Re: Ayuda con código para re ordenar array
« Respuesta #12 en: 5 Abril 2013, 04:03 »

Si se trata de escribir una cadena alfanumérica y hacer que la misma se divida en bloques separados de letras o números
En C otra forma de realizar esa operación es mediante las funciones isdigit e isalpha mas punteros a funciones, estos para alternar entre los sets a procesar (digitos ==> alfabeticos ==> digitos ...).

Si ignoramos por un momento la validación de errores de malloc y realloc, un ejemplo de ello es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. char **separar(char *p);
  5.  
  6. int main(void)
  7. {
  8.   char **mat;
  9.   int i;
  10.  
  11.   mat = separar("01ab210c");
  12.  
  13.   for (i = 0; mat[i] != NULL; i++){
  14.      printf("%2d: %3s\n", i, mat[i]);
  15.      free(mat[i]);
  16.   }
  17.   free(mat);
  18.  
  19.   return EXIT_SUCCESS;
  20. }
  21.  
  22. #include <string.h>
  23. #include <ctype.h>
  24.  
  25. char **separar(char *p)
  26. {
  27.   int (*pfn[2])(int) = {isdigit, isalpha};
  28.   int set;
  29.  
  30.   char **mat;
  31.   int i;
  32.   char *q;
  33.  
  34.   mat = malloc((strlen(p) + 1) * sizeof *mat);
  35.   i = 0;
  36.   set = isalpha(*p) != 0;
  37.  
  38.   while (pfn[set](*p)){
  39.      for (q = p + 1; pfn[set](*q); q++)
  40.         ;
  41.  
  42.      mat[i] = malloc(q - p + 1);
  43.      sprintf(mat[i], "%.*s", (int) (q - p), p);
  44.      i++;
  45.  
  46.      p = q;
  47.      set = !set;
  48.   }
  49.   mat[i] = NULL;
  50.  
  51.   mat = realloc(mat, ++i * sizeof *mat);
  52.  
  53.   return mat;
  54. }

La salida es la esperada:
Código:
0:  01
 1:  ab
 2: 210
 3:   c

También pueden utilizarse otras funciones, por ejemplo sscanf.

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 #13 en: 5 Abril 2013, 14:38 »

aweee k nivel   ;D
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,450 Último mensaje 18 Febrero 2004, 17:23
por zheo
Ordenar en Array¡
Java
Meg 10 3,538 Último mensaje 31 Enero 2010, 23:13
por tripled
ordenar array php
PHP
kakashi20 5 774 Ú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 645 Último mensaje 10 Abril 2013, 17:17
por rir3760
Quiero ver el código del método array.Clone() de C#
.NET
DanteInfernum 5 827 Último mensaje 27 Agosto 2013, 18:53
por DanteInfernum
Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines