Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Dividir una cadena en 2 matrices

Estas en el tema de Dividir una cadena en 2 matrices en el foro de C/C++ en Foros del Web. Q tal .. Tengo el siguiente problema recibo una cadena en este formato "1,2,3|4,5,6|7,8,9@9,8,7|6,5,4|3,2,1" donde , es el la separacion de los numeros donde | ...
  #1 (permalink)  
Antiguo 27/03/2012, 18:33
 
Fecha de Ingreso: febrero-2012
Mensajes: 11
Antigüedad: 12 años, 2 meses
Puntos: 0
Pregunta Dividir una cadena en 2 matrices

Q tal ..

Tengo el siguiente problema
recibo una cadena en este formato
"1,2,3|4,5,6|7,8,9@9,8,7|6,5,4|3,2,1"

donde , es el la separacion de los numeros
donde | es un salto de renglon y
@ es el inicio de la segunda matriz

1 2 3 9 8 7
4 5 6 y 6 5 4
7 8 9 3 2 1

y se deben de almacenar en 2 arreglos para realizar despues la multiplicacion

Alguna idea para poder comenzar..

e echo algunos ejemplos con la funcion strtok pero todavia soy muy nuevo en esto del C y no encuentro la forma correcta de hacerlo...

Saludos!!!!

Hasta el momento tengo algo asi:

Código:
r1=strtok(cadena,"@");
                while(r1 != NULL)
                {
                        r3 =strtok(r1,"|");

                        while(r3 != NULL)
                        {
                                r2=strtok(r3,",");

                                while(r2 != NULL)
                                {
                                        printf("%s\n", r2);

                                        r2=strtok(NULL,",");
                                }

                                r3=strtok(NULL,"|");
                        }

                        r1=strtok(NULL,"@");
                }

Última edición por rauln85; 27/03/2012 a las 19:01
  #2 (permalink)  
Antiguo 27/03/2012, 19:55
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Dividir una cadena en 2 matrices

Hola! hay algo q no entiendo se tiene que almacenar en dos arreglos o en dos matrices???? porque si fuesen arreglos el salto de linea no tendria sentido ya que se almacenaria de la siguiente manera en un arreglo, ejemplo:
// recorro la cadena mientras no sea @ y lo guardo en un arreglo
vec[9]=1 2 3 4 5 6 7 8 9

Ahora si fuese una matriz si tendria sentido ya que podria indicar que despues de | se guarda en la siguiente fila, ejemplo:
// recorro la cadena y mientras no sea | guardo en la fila 1
fila 1: 1 2 3
// se encontro el caracter | guardo en la fila 2
fila 2: 4 5 6
// se encontro el caracter | guardo en la fila 3
fila 3: 7 8 9
// fin de la cadena

Espero se me haya entendido, Saludos
  #3 (permalink)  
Antiguo 28/03/2012, 09:22
 
Fecha de Ingreso: febrero-2012
Mensajes: 11
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Dividir una cadena en 2 matrices

Gracias por responder... pues acerca del almacenamiento lo quiero hacer en un arreglo bidimensional que son las matrices, y los necesito en 2 para poder realizar la multiplicacion

Saludos
  #4 (permalink)  
Antiguo 28/03/2012, 10:32
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Dividir una cadena en 2 matrices

Ah ok tenia esa duda. Pudist mejorar el codigo q tenes?? Por que me parece que la funcion strtok no es la mejor opcion en este caso. Comentame en que andas y te sigo ayudando

Saludos
  #5 (permalink)  
Antiguo 28/03/2012, 10:35
 
Fecha de Ingreso: febrero-2012
Mensajes: 11
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Dividir una cadena en 2 matrices

pues sigo con el mismo codigo... tambien buscando otras alternativas para guardar en un arreglo[][],
  #6 (permalink)  
Antiguo 28/03/2012, 12:48
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Dividir una cadena en 2 matrices

Hola! al final termine usando strtok ya que la conoces y sabes como usarlo. Solo que yo lo use para dividir la cadena en dos:
cadena 1: "1,2,3|4,5,6|7,8,9"
cadena 2: "9,8,7|6,5,4|3,2,1"
Otra cosa importante que habia que hacer era convertir esos numeros en enteros, para eso use atoi

T dejo el codigo:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. #define FILA 3
  7. #define COLUMNA 3
  8.  
  9. void func(char *vec,int mat[][COLUMNA]);
  10. void imprimir(int mat[][COLUMNA]);
  11.  
  12. int main(void)
  13.  
  14. {
  15.     char vec[]="1,2,3|4,5,6|7,8,9@9,8,7|6,5,4|3,2,1";
  16.     int mat1[FILA][COLUMNA];
  17.     int mat2[FILA][COLUMNA];
  18.     int i,j;
  19.    
  20.     char *s=strtok(vec,"@");
  21.     // la primera llamada a strtok va a devolver esta cadena "1,2,3|4,5,6|7,8,9"
  22.     func(s,mat1);
  23.     while((s=strtok(NULL,"@"))!=NULL)
  24.     // la segunda llamada a strtok va a devolver esta cadena "9,8,7|6,5,4|3,2,1"
  25.     func(s,mat2);
  26.    
  27.     imprimir(mat1);
  28.     printf("\n");
  29.     imprimir(mat2);
  30.    
  31.     getchar();
  32.     return 0;
  33. }                                  
  34.  
  35. void func(char *vec,int mat[][COLUMNA])
  36. {
  37.      int i,j=0,k;
  38.      
  39.     for(i=0;i<FILA;i++) {
  40.           for(k=0;vec[j]!='|';j++) { // el for termina cuando encuentra '|'
  41.              if(vec[j]=='\0') // si es fin de linea sale del for
  42.                break;
  43.              if(!isdigit(vec[j])) // si no es un digito continua al siguiente ciclo
  44.                 continue;
  45.              else { // es un digito se guarda en la matriz
  46.                mat[i][k]=atoi(&vec[j]); // convierto el caracter numero a su representacion en entero
  47.                k++;
  48.              }
  49.            }
  50.            j++;
  51.     }
  52. }
  53.  
  54. void imprimir(int mat[][COLUMNA])
  55. {
  56.      int i,j;
  57.      
  58.      for(i=0;i<FILA;i++) {
  59.     for(j=0;j<COLUMNA;j++)
  60.     {
  61.                           printf("%d ",mat[i][j]);
  62.                           }
  63.                           printf("\n");
  64.     }
  65. }

El codigo esta comentado, si no lo entendes cualquier cosa pregunta. T dejo hacer la parte de multiplicacion de las matrices

Saludos

PD: la funcion imprimir solo esta para verificar si estaba bien lo que hacia
  #7 (permalink)  
Antiguo 28/03/2012, 12:49
 
Fecha de Ingreso: febrero-2012
Mensajes: 11
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Dividir una cadena en 2 matrices

Gracias lo checo y te aviso... la parte de la multiplicacion ya la tengo ..

Saludos!!
  #8 (permalink)  
Antiguo 28/03/2012, 16:38
 
Fecha de Ingreso: febrero-2012
Mensajes: 11
Antigüedad: 12 años, 2 meses
Puntos: 0
Pregunta Respuesta: Dividir una cadena en 2 matrices

ese código lo hice para la multiplicación de las matrices...
me podrías decir que esta mal, pues solo me el resultado de la primera fila correcto y el de las otras 2 están mal

Saludos.


Código:
int liA, liB , liC;
        int lzResultadoM[FILA][COLUMNA];

        for(liC=0; liC<3; ++liC){
                for(liB=0; liB<3; ++liB){
                        for(liA=0; liA<3; ++liA){
                                lzResultadoM[liC][liB] += liMatriz1[liC][liA] * liMatriz2[liA][liB];
                        }
                }
        }

        imprimir(lzResultadoM);
  #9 (permalink)  
Antiguo 28/03/2012, 19:13
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Dividir una cadena en 2 matrices

Hola! en este momento no te puedo ayudar con el codigo... pero si no me equivoco multiplicar dos matrices tiene propiedades, fijate si las encontras xq no me acuerdo cuales eran.
Igual t dejo un codigo que hic hace un par de meses; un poco dificil de entenderlo pero bueno te lo dejo igual
Código C:
Ver original
  1. int esProducto(int j,int m);
  2.  
  3. int ** matrizProducto(int mat1[][COLUMNA_M],int mat2[][COLUMNA_M],int iFila,int jCol,int mFila,int nCol)
  4.  
  5. {
  6.   int x;
  7.   int i=0,j; /* indices para la matriz 1 */
  8.   int m,n=0; /* indices para la matriz 2 */
  9.   //int auxMat[iFila][nCol];
  10.   int cant=0; /* acumulador */
  11.   int num=0;
  12.  
  13.   int **auxMat=NULL; /* declaro un puntero a puntero que es la matriz resultante del producto */
  14.   /* la matriz aux va a ser de dimension iFila*nCol */
  15.   auxMat=(int **)malloc(sizeof(int)*nCol); /* le asigno la cantidad de columnas (nCol) */
  16.   for(x=0;x<nCol;x++)
  17.     auxMat[x]=(int *)malloc(sizeof(int)*iFila); /* a cada columna le asigno iFilas */
  18.   int s=0,p=0; /* indices para la matriz auxiliar */
  19.  
  20.   if(esProducto(jCol,mFila)) /* si se puede multiplicar entra al if */
  21.   {
  22.    
  23.     while(cant!=(iFila*nCol)) { /* mientra no sea fin del producto */
  24.       for(j=0,m=0;j<jCol;j++,m++) /* mat1 avanza en columna y mat2 avanza en fila */
  25.       {
  26.     num+=mat1[i][j]*mat2[m][n]; /* suma de la multiplicacion fila*columna */
  27.       }
  28.       auxMat[s][p++]=num; /* guardo el producto en auxMat */
  29.       num=0; /* seteo num para el prox producto */
  30.       n++; /* mat2 cambia de columna */
  31.       if(n==nCol) /* salto de fila en mat1 y auxMat*/
  32.       {
  33.     i++; /* mat1 cambia de columna */
  34.     /* seteo los indices */
  35.     n=0;
  36.     p=0;
  37.     s=1;
  38.       }
  39.       cant++;
  40.     } /* fin del while */
  41.   return auxMat;
  42.   } /* fin del if */
  43.  
  44.   else
  45.     return NULL;
  46. }
  47.  
  48. int esProducto(int j,int m)
  49. {
  50.   return j==m;
  51. }

Te sigo ayudando mañana, Saludos
  #10 (permalink)  
Antiguo 29/03/2012, 09:51
 
Fecha de Ingreso: febrero-2012
Mensajes: 11
Antigüedad: 12 años, 2 meses
Puntos: 0
Respuesta: Dividir una cadena en 2 matrices

Gracias ya resolvi mi problema....

Saludos

Etiquetas: lenguajec, matrices, strtok
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:19.