[Ayuda] Ejercicio sencillo en C

Iniciado por Torino10, 23 Abril 2012, 18:09 PM

0 Miembros y 1 Visitante están viendo este tema.

Torino10

Hola como están!

Les vengo con una consulta...

Tengo que hacer un programita que de acuerdo a una palabra ingresada, por ejemplo "programa", me genere una nueva palabra con todas las letras de la primera pero sin las letras que se repiten.

En el caso de la palabra "programa", la nueva seria "progam"

Y bueno despues tengo que contar la cantidad de veces que se repiten... Pero eso es sencillo...

Lo que no se como hacer es lo de guardar solo una vez las que se repiten...

No pido que me hagan la tarea, sino que me puedan dar una idea de como hacerlo...

Saludos! ;)
"Tanto si crees que puedes, como si crees que no puedes, estas en lo correcto"

Ferno

Bueno, mi idea es que uses un arreglo auxiliar.

1) Guardas la primer letra de la palabra a parsear en un arreglo auxiliar.
2) Comienza el loop: tomas la segunda letra, te fijas si aparece en el arreglo auxiliar recorriéndolo y comparándolo con tu letra actual, si no aparece, la insertas, sino, a otra cosa.

¿Está claro? Tomas una letra, recorres el arreglo auxiliar comparando cada elemento con tu letra actual. Si no aparece en el arreglo auxiliar, la insertas y haces lo mismo con las demas letras hasta acabar tu palabra. Si aparece, no insertas nada, tomas otra letra de tu palabra y continúa...

Torino10

Gracias por responder.

La "idea" de como hacerlo la tengo, lo que me esta costando es codificar...

Tengo esto que hice rapidamente y pero no realiza lo que quiero

    printf("Ingrese cadena: ");
    gets(cadena);
   
    aux[0]=cadena[0];
   
    for (int i=1; i<strlen(cadena); i++)
        {
        for (int j=0; j<strlen(aux); j++)
            {
            if (cadena[i]!=aux[j])
               {
               aux[i]=cadena[i];
               }               
            }
        }


El código tiene un error de lógica por lo que no esta realizando lo que quiero pero no se de que manera lo puedo hacer...
Espero que me den una ayudita mas!
"Tanto si crees que puedes, como si crees que no puedes, estas en lo correcto"

durasno

Hola! el problema es que en:
if (cadena[i]!=aux[j])
   aux[i]=cadena[i];

no estas comparando con toda la cadena de aux sino con un caracter. Solo comparas un caracter y directamente lo guardas

Esto es lo q primero q se me ocurrio
    printf("Ingrese cadena: ");
    gets(cadena);

    aux[0]=cadena[0];

    for (i=1; i<strlen(cadena); i++)
        {
              cont=0;
        for (j=0; j<strlen(aux); j++)
            {
                 
            if (aux[j]!=cadena[i])
               {
                cont++;
               }             
            }
            if(cont==strlen(aux)){
           
            aux[i-rep]=cadena[i];
            }
            else rep++;
        }
puts(aux);


Fijate si lo entendes sino pregunta,saludos
Ahorrate una pregunta, lee el man

maxim_o

Cita de: durasno en 24 Abril 2012, 18:46 PM
Hola! el problema es que en:
if (cadena[i]!=aux[j])
   aux[i]=cadena[i];

no estas comparando con toda la cadena de aux sino con un caracter. Solo comparas un caracter y directamente lo guardas

Esto es lo q primero q se me ocurrio
    printf("Ingrese cadena: ");
    gets(cadena);

    aux[0]=cadena[0];

    for (i=1; i<strlen(cadena); i++)
        {
              cont=0;
        for (j=0; j<strlen(aux); j++)
            {
                 
            if (aux[j]!=cadena[i])
               {
                cont++;
               }             
            }
            if(cont==strlen(aux)){
           
            aux[i-rep]=cadena[i];
            }
            else rep++;
        }
puts(aux);


Fijate si lo entendes sino pregunta,saludos

Eso tampoco funcionaria, en un principio hay un par de errorcillos....
No puedes comparar con strlen(aux), por que si la cadena es de 20 y solo hay ocupados (inicializados) x posiciones la demas son aleatorios o cualquier cosa que haya en la memoria por lo que falla.... Se compara if (cont==i-rep)...
Al igual que la entrada en el segundo for tambien....
Y luego una vez termine el bucle para que la funcion puts no imprima todo lo que haya en ese array debes ponerle el caracter nulo '\0' en i-rep.


Quedaría asi:


#include <string.h>
#include <stdlib.h>
#include <stdio.h>

int main(){
char cadena[20];
char aux[20];
int i;
int cont=0;
int j;
printf("Inserte la cadena de texto: ");
gets(cadena);
aux[0]=cadena[0];
int rep=0;
for(i=1;i<strlen(cadena);i++){
    for(j=0;j<(i-rep);j++){
    if(cadena[i]!=aux[j])
         cont++;
}
     if (cont==(i-rep)){
        aux[i-rep]=cadena[i];
}
     else
rep++;
cont=0;
}
aux[i-rep]='\0';
puts(aux);
return(0);
}



durasno

Lo compilast al menos??? se supone que Torino10  deberia hacer antes q nada:
for(i=0; i<MAX_ARREGLO;i++)
    aux[i]='\0'; // asi t gusta?


Yo no subi un programa subi parte del codigo q el necesitaba

Saludos
Ahorrate una pregunta, lee el man

maxim_o

Tranquilo, no lo tomes a mal!! Solo dije que sin poner el caracter nulo fallaba y se podia solucionar de esa manera.... Torino10 según lo que puso no hacia nada de eso... por eso lo dije....
Rellenando el array de carácteres nulos si que debe funcionar.

Saludos

Torino10

Gracias a los dos por la ayuda, me sirvio mucho!

El algoritmo de durasno funcionaba a la perfeccion solo que yo no hacia esto

for (i=0; i<20;i++)
        aux[i]='\0';


Saludos! Y gracias nuevamente  :D
"Tanto si crees que puedes, como si crees que no puedes, estas en lo correcto"