Ayuda con código para re ordenar array

Iniciado por ZedGe, 2 Abril 2013, 17:47 PM

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

ZedGe

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:


#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;
}

Wofo

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

Puntoinfinito

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

dato_entrada.size();

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

... !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.
AHORA EN SOFTONIC || CLICK HERE!!
Base64: QWNhYmFzIGRlIHBlcmRlciAxIG1pbnV0byBkZSB0dSB2aWRhLiBPbOkh



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

ZedGe

Cita de: Puntoinfinito en  2 Abril 2013, 21:03 PM

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* :/

Puntoinfinito

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 (cpp) [Seleccionar]

char variable[4] = {'H', 'o','l'}; //creamos una sequencia char con un espacio libre
append(variable[3],'a'); //lo rellenamos


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

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


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

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


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



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

ZedGe

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*

85

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..
Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/

Puntoinfinito

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



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

ZedGe

El codigo es ese que subi en el post :S

85

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 (cpp) [Seleccionar]

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//http://www.cplusplus.com/reference/cstdlib/realloc/


int main(){


char cadena[512];
//char** array_de_cadenas_r = 0;
//char** array_de_cadenas = (char**)malloc(sizeof(char)*1);
//array_de_cadenas[0] = (char*)malloc(sizeof(char)*128);

char array_de_cadenas[20][128] = {{0}};

printf("ingrese la cadena..\n");
scanf("%s", cadena);

int modo=0;
int pos=-1;
int let;
int num;
int i=0;
int j;
while(cadena[i]){

if(pos == 20) break;

if(cadena[i] >= 'a' && cadena[i]<='z'){
let++;
num=0;
}
else if(cadena[i] >= 'A' && cadena[i]<='Z'){
let++;
num=0;
}
else if(cadena[i] >= '0' && cadena[i]<='9'){
num++;
let=0;
}
else
{
let=0;
num=0;
}

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

//int a=0;
//char backup[512];
//strcpy(backup, array_de_cadenas[a]);
//array_de_cadenas_r = (char**)realloc(array_de_cadenas, sizeof(char)*(pos+1));
//array_de_cadenas[pos] = (char*)malloc(sizeof(char)*128);
}


if(let){

array_de_cadenas[pos][j] = cadena[i];
j++;
modo=1;
}
else if(num){

array_de_cadenas[pos][j] = cadena[i];
j++;
modo=2;
}
else
{
modo=0;
}

i++;
}

for(int b=0; b<pos+1; b++){
      printf(array_de_cadenas[b]);
      putchar('\n');
}

//for(int c=0; c<pos; c++) free(array_de_cadenas[c]);
//free(array_de_cadenas);

system("pause");
return 0;
}

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