/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Algoritmo con cadena de Caracteres

 
      Índice del Foro elrincondelc.com -> Algoritmos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Geekne



Registrado: 01 Abr 2011
Mensajes: 7

MensajePublicado: 04/04/2011 4:26 pm
Título: Algoritmo con cadena de Caracteres

Hola. Tengo que hacer un algoritmo que compare dos cadenas (a y b) y que guarde los elementos iguales en una tercera (c) esto fue lo que hice:



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

#define tf 20

char cadenaa[tf];
char cadenab[tf];
char cadenac[tf];

void comparacion(char cadenaa, char cadenab, char *cadenac, int tua, int tub);

main(){

int i, tua, tub, j;

    printf("\nIngrese el tamaño de la cadena A (20max.) : ");
    scanf("%d", &tua);

    printf("\nIngrese los %d elementos: ", tua);

    for(i=0;i<tua;i++){
        scanf("%s", &cadenaa[i] );
    }

    printf("\nIngrese el tamaño de la cadena B (20max.) : ");
    scanf("%d", &tub);

    printf("\nIngrese los %d elementos: ", tub);

    for(j=0;j<tub;j++){
        scanf("%s", &cadenab[j] );
    }


    comparacion(cadenaa, cadenab, cadenac, tua, tub)

}


void comparacion(char cadenaa, char cadenab, char cadenac, int tua, int tub)
{

int i, aux, j, cont=0;

    if(tua>tub){
        for(i=0;i<=tua;i++){
            aux=strcmp(cadenaa, cadenab);
           
            if (aux==0){
                cadenac[cont]=cadenaa[i];
                cont=cont+1;
            }
        }
               
    }
    else
    {
   
        for(j=0;j<=tub;j++){
            aux=strcmp(cadenab, cadenaa);

            if(aux==0){
                cadenac[cont]=cadenab[j];
                cont=cont+1;
            }
        }
    }

}


Pero me salen errores en el paso de los parametros y no comprendo porque son /: ademas se supone que debo pasar "cadenac" como parametro por referencia pero no se como hacerlo.. sugerencias?
_________________
Backtrackr4
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 6586
Ubicación: Mexico

MensajePublicado: 04/04/2011 6:56 pm
Título:

Necesitas seguir un curso sobre C ya que hay algunos errores de concepto y malas practicas que, de ser posible, deberias corregir ahora que es tiempo.

Cuando desarrollas una funcion que recibira un array como argumento debes declarar el parametro con el tipo "char *" o bien "char []". En tu caso eso falta en los primeros:
Código:
void comparacion(char cadenaa, char cadenab, char *cadenac, int tua, int tub);

Y si las cadenas no deben modificarse dentro de la funcion se debe agregar "const" para asi indicar "solo lectura".

La logica en las llamadas a la funcion scanf esta mal ya que tu pides caracteres, con ellos el especificador debe ser "%c" pero en su lugar utilizas "%s" que es para cadenas (mas bien palabras).

Tambien hay que separar (mas bien tener bien claras las diferencias entre) el concepto de contenedor (el array) y de contenido (la cadena). Esto porque en el programa que debes realizar no necesitas las longitudes de las cadenas.

Por ultimo necesitas describir con mas detalle el algoritmo, por ejemplo:
¿Los caracteres iguales deben estar en la misma posicion o esta no importa?
¿Como se procesan los caracteres repetidos?

Un saludo
_________________
Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short.
--
Mentat Handbook
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 6586
Ubicación: Mexico

MensajePublicado: 05/04/2011 7:40 am
Título:

Caso mas simple: dos elementos son iguales solo si se trata del mismo caracter en la misma posicion.

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

#define NUM_CHARS  20

char *iguales(char const a[], char const b[], char r[]);

int main(void)
{
   char a[NUM_CHARS] = "coma";
   char b[NUM_CHARS] = "cena";
   char r[NUM_CHARS];
   
   printf("a == \"%s\"\n", a);
   printf("b == \"%s\"\n", b);
   printf("r == \"%s\"\n", iguales(a, b, r));
   
   return EXIT_SUCCESS;
}

char *iguales(char const a[], char const b[], char r[])
{
   size_t i;
   size_t j;
   size_t num_chars;
   
   num_chars = strlen(a) < strlen(b) ? strlen(a) : strlen(b);
   j = 0;
   for (i = 0; i < num_chars; i++)
      if (a[i] == b[i])
         r[j++] = a[i];
   r[j] = '\0';
   
   return r;
}


Un saludo
_________________
Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short.
--
Mentat Handbook
Volver arriba
Geekne



Registrado: 01 Abr 2011
Mensajes: 7

MensajePublicado: 06/04/2011 11:08 am
Título:

MIra lo que tengo ahora:

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

#define tf 21

char cadenaa[tf];
char cadenab[tf];
char cadenac[tf];

//void comparacion(char *cadenaa, char *cadenab, char *cadenac, int tua, int tub);
void validacion(char ca, char cb, int tub, int tua);

int main(void){

int i, tua, tub, j;

   do{

      printf("\nIngrese el tamaño de la cadena A (20max.) : ");
      scanf("%d", &tua);
   
   }while(tua>20);

   printf("\nIngrese los %d elementos: ", tua);

   for(i=0;i<tua;i++){
      scanf("%s", &cadenaa[i] );
   }
   
   do{

      printf("\nIngrese el tamaño de la cadena B (20max.) : ");
      scanf("%d", &tub);

   }while(tub>20);

   printf("\nIngrese los %d elementos: ", tub);

   for(j=0;j<tub;j++){
      scanf("%s", &cadenab[j] );
   }
   
   
   validacion(cadenaa, cadenab, tub, tua);
   //comparacion(cadenaa, cadenab, cadenac, tua, tub);
return 0;
}


/*void comparacion(char *cadenaa, char *cadenab, char *cadenac, int tua, int tub)
{

int i, aux, j, cont=0;

   if(tua>tub){
      for(i=0;i<=tua;i++){
         aux=strcmp(cadenaa, cadenab);
         
         if (aux==0){
            cadenac[cont]=cadenaa[i];
            cont=cont+1;
         }
      }
            
   }
   else
   {
   
      for(j=0;j<=tub;j++){
         aux=strcmp(cadenab, cadenaa);

         if(aux==0){
            cadenac[cont]=cadenab[j];
            cont=cont+1;
         }
      }
   }

}*/

void validacion(char ca[20], char cb[20], int tub, int tua)
{

int i, j;

   for(i=0;i<tua;i++){
      printf("\nCadena A: %s\n", ca[i] );
   }

   for(j=0;j<tub;j++){
      printf("\nCadena B: %s\n", cb[j] );
   }
}[/quote]


Tengo el procedimiento validacion, para imprimir las dos cadenas y ver si se guardan bien los caracteres.

Me salen estos errores:

Cita:
*aviso: el paso del argumento 1 de ‘validacion’ crea un entero desde un puntero sin una conversión.

*el paso del argumento 2 de ‘validacion’ crea un entero desde un puntero sin una conversión

*tipos en conflicto para ‘validacion’

*la declaración previa de ‘validacion’ estaba aquí


Question
_________________
Backtrackr4
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 6586
Ubicación: Mexico

MensajePublicado: 06/04/2011 3:28 pm
Título:

Como ya te habia comentado necesitas de un buen curso o libro a la mano para que empiezes a resolver los dudas que surgan en tu aprendizaje del lenguaje C.

Todavia no indicas que es exactamente lo que debe hacer el algoritmo, sin ello no es posible ayudarte a corregir el programa.

En lo que concierne al lenguaje C el error mas importante es que estas tratando de leer y escribir caracteres utilizando el especificador de formato "%s".

La funcion que mencionas "validacion" deberia llamarse "imprimir" ya que eso es lo que hace. Y como en C toda cadena termina con el caracter '\0' no es necesario la longitud de ellas. Deberia ser:
Código:
void imprimir(char const a[], char const b[])
{
   int i;

   for (i = 0; a[i] != '\0'; i++)
      printf("%c", a[i]);
   putchar('\n');

   for (i = 0; b[i] != '\0'; i++)
      printf("%c", b[i]);
   putchar('\n');
}

En ella:

1) Se verifica el final de la cadena con la expresion "a[i] != '\0'"
2) Si esa condicion es falsa se imprime el caracter utilizando "%c".
3) Despues de imprimir la cadena se pasa a la siguiente linea imprimiendo el caracter de avance de linea '\n' mediante la funcion "putchar".

De nuevo para ayudarte con el algoritmo debes describir este a detalle.

Un saludo
_________________
Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short.
--
Mentat Handbook
Volver arriba
Geekne



Registrado: 01 Abr 2011
Mensajes: 7

MensajePublicado: 07/04/2011 9:53 am
Título:

Gracias por la ayuda. Le llame validacion porque en realidad la impresion de las cadenas no es importante. solo lo hice para saber si se leia bien Wink Igual ya me compilo perfecto, seguire haciendolo. Mr. Green

y en realidad lo que tengo que hacer es un algoritmo que dados 2 vectores A y B de cadenas de hasta 20 caracteres (no necesariamente ordenadas) genere un tercer vector C coon los elementos comunes de A y B. (usando insercion ordenada). Shocked
_________________
Backtrackr4
Volver arriba
Geekne



Registrado: 01 Abr 2011
Mensajes: 7

MensajePublicado: 07/04/2011 4:15 pm
Título:

AYUDA! Ni idea on la comparacion... Shocked

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

#define tf 20

char cadenaa[tf];
char cadenab[tf];
char cadenac[tf];

void comparacion(char *cadenaa, char *cadenab, char *cadenac, int tua, int tub);
void validacion(char ca[], char cb[], char cc[], int tub, int tua);

int main(void){

int i, tua, tub, j;

    do{

        printf("\nIngrese el tamaño de la cadena A (20max.) : ");
        scanf("%d", &tua);
   
    }while(tua>20);

    printf("\nIngrese los %d elementos: ", tua);

    for(i=0;i<tua;i++){
        scanf("%s", &cadenaa[i] );
    }
   
    do{

        printf("\nIngrese el tamaño de la cadena B (20max.) : ");
        scanf("%d", &tub);

    }while(tub>20);

    printf("\nIngrese los %d elementos: ", tub);

    for(j=0;j<tub;j++){
        scanf("%s", &cadenab[j] );
    }
   
   
    comparacion(cadenaa, cadenab, cadenac, tua, tub);
    //validacion(cadenaa, cadenab, cadenac, tub, tua);
   
return 0;
}


void comparacion(char cadenaa[], char cadenab[], char cadenac[], int tua, int tub)
{

int i=0, aux, j, tuc=0, k;

       
    for(j=0;j<=tub;j++){   
        if(cadenab[i]==cadenaa[j]){
            cadenac[i]=cadenab[i];
            tuc=tuc+1;
        }
       
    i=i+1;           

    }

    for(k=0;k<tuc;k++){
        printf("\nCadena C: %c", cadenab[k] ); //imprimiendo la cadena C

    }
           
       

}

void validacion(char ca[], char cb[], char cc[], int tub, int tua)
{

int i, j, k;

    for(i=0;i<tua;i++){
        printf("\nCadena A: %c", ca[i] );
    }

    for(j=0;j<tub;j++){
        printf("\nCadena B: %c", cb[j] );
    }
   
    for(k=0;k<tub;k++){
        printf("\nCadena C: %c", cb[k] );
    }
}

_________________
Backtrackr4
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 6586
Ubicación: Mexico

MensajePublicado: 07/04/2011 5:36 pm
Título:

En buen plan: me parece vas demasiado rapido o bien, por alguna razon, quieres que alguien mas haga el programa.

Como ya te habia comentado no es necesario conocer el tamaño del contenedor (el array) para imprimir su contenido (la cadena) ya que si bien el tamaño del primero es el limite no tiene porque coincidir con el tamaño del segundo (en realidad nunca coinciden).

Por ejemplo la funcion imprimir solo requiere de tres parametros y en su forma mas corta es (en C lo usual es primero imprimir la cadena y solo despues avanzar a la linea siguiente):
Código:
void imprimir(char const a[], char const b[], char const c[])
{
   printf("%s\n%s\n%s\n", a, b, c);
}


La insercion ordenada es simplemente agregar un elemento a una lista (array, lista vinculada, etc.) colocandolo en su posicion correcta segun algun criterio de ordenacion.

Por ejemplo si tenemos la lista:
Código:
1 --> 2 --> 4 --> 5


Y se desea insertar en orden el valor 3 entonces primero se desplazan (como es tu caso al utilizar arrays) los elementos que correspondan una posicion a la derecha, de esta forma (??? es el "hueco"):
Código:
1 --> 2 --> ??? --> 4 --> 5


El ultimo paso es simplemente colocar ahi el valor:
Código:
1 --> 2 --> 3 --> 4 --> 5

La idea detras de la insercion ordenada es realizar al mismo tiempo los dos pasos (insercion y ordenacion).


Aun no haz indicado en detalle el algoritmo. Sin eso ayudarte es bien dificil.


Un algoritmo que funciona pero no excluye los duplicados dentro de una cadena:

1) Encuentra la cadena mas corta, esta sera A. La cadena mas larga sera B. Aqui como ya te comente el tamaño del contenedor no importa, lo importante es el tamaño del contenido.

2) Procesa cada uno de los caracteres de la cadena A (mediante un bucle):

2.1) El caracter del paso dos lo comparas con cada uno de los caracteres de la cadena B (otro bucle).

2.1.A) Si hay coincidencia debes extraer el caracter (eliminacion fisica) de la cadena B, formas para hacerlo hay varias. La mas sencilla es simplemente sobrescribiendo el caracter con el ultimo y el ultimo con un '\0' (para asi indicar la extraccion). Ya que el caracter es comun a ambas cadenas lo insertas en orden en la cadena de resultado.

2.1.B) Si no hay coincidencia la accion es ... nada.

3) Regresas al paso 2.

Asi seria a grandes rasgos pero si cumple con los requisitos de tu programa es algo que todavia no sabemos.

Un saludo
_________________
Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short.
--
Mentat Handbook
Volver arriba
Geekne



Registrado: 01 Abr 2011
Mensajes: 7

MensajePublicado: 10/04/2011 9:26 am
Título:

Yaa lo resolvi, gracias
_________________
Backtrackr4
Volver arriba
      Índice del Foro elrincondelc.com -> Algoritmos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com