Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: fernaEDLP en 11 Mayo 2018, 06:10 AM

Título: problema de cadenas en c
Publicado por: fernaEDLP en 11 Mayo 2018, 06:10 AM
hola que tal? tengo un problema en c que dice lo siguiente: cree dos cadenas cad1 y cad2 que puedan alamacenar hasta 80 caracteres, y cad1 se pueda inicializar por teclado, copie el contenido den cad1 en cad2 sin que copie el contenido de las vocales, aclaración: no se pueden usar funciones,no c porque mo código no funciona, yo hice lo siguiente:
int main()
{
   int i,j;
   char cad1[80];
   char cad2[80];
   gets(cad1);
   while(cad1!='\0')
   {
       i++;
   }

       for(j=0;j<=i;j++)
       {
           if(cad1[j]=='a') (estoy probando con una sola vocal,ya se que van las otras)
           {
               cad1[j]=' ';
           }
       }
       for(j=0;j<=i;j++)
       {
           if(cad1[j]!=' ')
          {
           cad2[j]=cad1[j];
           }
       }

       puts(cad2);



return 0;
}

pd: no entiendo porque un estudiante de ingeneiría industrial tiene que estudiar c  :-[




Título: Re: problema de cadenas en c
Publicado por: Kenji-chan en 11 Mayo 2018, 19:32 PM

int main(){
    int i,j;
    char cad1[80];
    char cad2[80];
    gets(cad1);
    while(cad1!='\0'){
/*este bucle while se seguira ejecutando mientras cad1 sea distinto que '\0'*/
        i++;//->aqui incrementamos el valor de i en 1 y dado que i nunca fue inicializado no sabemos cual es su valor inicial
    }//->cad1 nunca fue modificado asi que siempre sera distinto que '\0' y se repetira indefinidamente

    for(j=0;j<=i;j++){
         if(cad1[j]=='a') /*(estoy probando con una sola vocal,ya se que van las otras)*/{
             cad1[j]=' ';
         }
     }
    for(j=0;j<=i;j++){
         if(cad1[j]!=' '){
           cad2[j]=cad1[j];
         }
    }

    puts(cad2);



    return 0;
}
Título: Re: problema de cadenas en c
Publicado por: fernaEDLP en 11 Mayo 2018, 20:30 PM
int main()
{
    int i=0,j;
    char cad1[80];
    char cad2[80];
    gets(cad1);
    while(cad1!='\0')
    {
        i++;
    }

        for(j=0;j<=i;j++)
        {
            if(cad1[j]=='a')
            {
                cad1[j]=' ';
            }
        }

        for(j=0;j<=i;j++)
        {
           if(cad1[j]!=' ')
          {
            cad2[j]=cad1[j];
           }
        }

        puts(cad2);



return 0;
}
hola kenji gracias por responder, pero lo acabo de modificar y me sigue sin funcar en el codeblocks, es decir cuando  meto la palabra la muestra en pantalla y no ocurre nada el el programa queda estatico.

pd:hoy rendí y creo queme rompieron el traste :(

Título: Re: problema de cadenas en c
Publicado por: Kenji-chan en 11 Mayo 2018, 20:35 PM

while(cad1!='\0'){
       i++;
}


esta parte del código hace que tu programa quede estático
eso es porque dentro del bucle while nunca cambias la posición de cad1
lo que tienes que hacer es


while(cad1[i]!='\0'){
       i++;
}

con esto le dices que la posiciona de cad1 avance y no se quede estático
Título: Re: problema de cadenas en c
Publicado por: fernaEDLP en 11 Mayo 2018, 20:45 PM
int main()
{
   int i=0,j;
   char cad1[80];
   char cad2[80];
   gets(cad1);
   while(cad1!='\0')
   {
       i++;
   }

       for(j=0;j<=i;j++)
       {
           if(cad1[j]=='a')
           {
               cad1[j]=' ';
           }
       }

       for(j=0;j<=i;j++)
       {
          if(cad1[j]!=' ')
         {
           cad2[j]=cad1[j];
          }
       }

       puts(cad2);



return 0;
}

tenes razón pero ahora pasa lo siguiente: cuando pongo por ejemplo hola me imprime hol, hasta ahi va todo bien si pongo armario me pone prm ?¿, si pongo grande me devuelve gr4nde es como si evaluara la vocal pero de mala manera, que opinas de la lógica de mi código es buena o es mala? tal vez el problema esta ahí gracias de nuevo, estoy editando el comentario pero sigue sin aparecer el
Título: Re: problema de cadenas en c
Publicado por: Kenji-chan en 11 Mayo 2018, 21:01 PM
he encontrado 2 problemas aqui

for(j=0;j<=i;j++){/*-> a qui en j<=i, hola tiene 4 caracteres y es lo que vale i despues de salir del while, y cad1 tine 4 indices empezando desde 0
por lo tano cad1[0], cad1[1], cad1[2], cad1[3] son cuatro pero si le decimos que sea igual a cuatro nos incrementa en uno el indice cad1[4] que nos da un total de 5*/
            if(cad1[j]=='a'){
                cad1[j]=' ';
            }
        }
for(j=0;j<=i;j++){//> lo mismo aqui
           if(cad1[j]!=' '){
            cad2[j]=cad1[j];
/*aqui el string cad2[j] es sustituido por cad1[j], pero nunca pone el '\0'*/
           }
        }
Título: Re: problema de cadenas en c
Publicado por: fernaEDLP en 11 Mayo 2018, 21:17 PM
Cita de: Kenji-chan en 11 Mayo 2018, 21:01 PM
he encontrado 2 problemas aqui

for(j=0;j<=i;j++){/*-> a qui en j<=i, hola tiene 4 caracteres y es lo que vale i despues de salir del while, y cad1 tine 4 indices empezando desde 0
por lo tano cad1[0], cad1[1], cad1[2], cad1[3] son cuatro pero si le decimos que sea igual a cuatro nos incrementa en uno el indice cad1[4] que nos da un total de 5*/
           if(cad1[j]=='a'){
               cad1[j]=' ';
           }
       }
for(j=0;j<=i;j++){//> lo mismo aqui
          if(cad1[j]!=' '){
           cad2[j]=cad1[j];
/*aqui el string cad2[j] es sustituido por cad1[j], pero nunca pone el '\0'*/
          }
       }

entendí las 2 primeras correciones pero la del '\0' no la entendí,  no se supone que cuando recorro desde j=0 hasta j<i estaría recorriendo hasta el final de la cadena?, o el '\0' sirve también como un break? perdon por mi lentitud estoy hecho percha necesito una siesta
Título: Re: problema de cadenas en c
Publicado por: Kenji-chan en 11 Mayo 2018, 21:27 PM
si funciona de forma cimilar
ademas se me olvidabaotra cosa

for(j=0;j<=i;j++){
          if(cad1[j]!=' '){
           cad2[j]=cad1[j];
/*a qui la la escritura del cad2 no es correcta*/
          }
       }


ejemplo con 'armario'

en cad1 todas las 'a' son ' '(espacio en blanco)

por lo tanto

cad2[j] -> 0 -> no pones nada y se queda con lo que ya avía hai
cad2[j] -> 1 -> r
cad2[j] -> 2 -> m
cad2[j] -> 3 -> nada
cad2[j] -> 4 -> r
cad2[j] -> 5 -> i
cad2[j] -> 6 -> o
cad2[j] -> 7 -> '\0' esto tendia que ir al final
Título: Re: problema de cadenas en c
Publicado por: fernaEDLP en 12 Mayo 2018, 07:55 AM
int main()
{
    int i=0,j,k,l=0;
    char cad1[80];
    char cad2[80];
    gets(cad1);
    while(cad1!='\0')
    {
        i++;
    }

        for(j=0;j<i;j++)
        {
            if(cad1[j]=='a'||cad1[j]=='e'||cad1[j]=='i'||cad1[j]=='o'||cad1[j]=='u'||cad1[j]=='A'||cad1[j]=='E'||cad1[j]=='O'||cad1[j]=='U'||cad1[j]=='I')
            {
                cad1[j]=' ';
            }
        }
        for(k=0;cad1[k];k++)
        {
            cad2[l]=cad1[k];
            l++;
            cad2[l]='\0';

        }

        puts(cad2);



return 0;
}
hola kenji gracias por la ayuda ya lo pude resolver, te hago una última pregunta el hecho de poner cad2[l]='\0'; implica que eso se va a agregar al final de la copia de cad1 en cad 2?
Título: Re: problema de cadenas en c
Publicado por: Kenji-chan en 12 Mayo 2018, 09:07 AM
si ya lo tienes solo te hace falta algo


int main(){
    int i=0,j,k,l=0;
    char cad1[80];
    char cad2[80];
    gets(cad1);
    while(cad1!='\0'){
        i++;
    }

        for(j=0;j<i;j++){
            if(cad1[j]=='a'||cad1[j]=='e'||cad1[j]=='i'||cad1[j]=='o'||cad1[j]=='u'||cad1[j]=='A'||cad1[j]=='E'||cad1[j]=='O'||cad1[j]=='U'||cad1[j]=='I'){
                cad1[j]=' ';//-> a qui haces que cad1[j] sea igual a ' '(espacio en blanco)
            }
        }
        for(k=0;cad1[k];k++){
/*aqui te hace falta quitar los espacios en blancos que dejaste en cad1 con un if != ' ' bastara para eso*/
            cad2[l]=cad1[k];
            l++;
            cad2[l]='\0';

        }

        puts(cad2);



return 0;
}
Título: Re: problema de cadenas en c
Publicado por: fernaEDLP en 12 Mayo 2018, 10:18 AM
hola no lo decidí dejar asi como está, porque si pongo el if con cad[j}!=' ' ocurre que si el usuario me digita una frase con espacios por ejemplo "hola que tal", el programa me devuelve hlqtl, y no entendería que es lo que hace, en cambio si directamente copio el contenido de cad1 en cad2 me devuelve hl q tl, quedaria más claro así
Título: Re: problema de cadenas en c
Publicado por: Kenji-chan en 12 Mayo 2018, 19:08 PM
si pero dejar así el programa es muy poco elegante ya que la longitud del estring cad2 se ve reducida por 80-(n_vocales) alterando su tamaño original paa esto te propongo 2 soluciones, la primero usar un carácter que se use poco o no se use en una oración como por ejemplo un '*' de modo que

int main(){
    int i=0,j,k,l=0;
    char cad1[80];
    char cad2[80];
    gets(cad1);
    while(cad1!='\0'){
        i++;
    }

        for(j=0;j<i;j++){
            if(cad1[j]=='a'||cad1[j]=='e'||cad1[j]=='i'||cad1[j]=='o'||cad1[j]=='u'||cad1[j]=='A'||cad1[j]=='E'||cad1[j]=='O'||cad1[j]=='U'||cad1[j]=='I'){
                cad1[j]='*';//-> a qui haces que cad1[j] sea igual a '*'
            }
        }
        for(k=0;cad1[k];k++){
            if(cad1[k] != '*'){
                cad2[l]=cad1[k];
                l++;
                cad2[l]='\0';
            }
        }

        puts(cad2);



return 0;
}


la segundo consiste en cambiar un poco la filosofía del programa

quita_vocales.c

#include <stdio.h>

int main(int arv, char* argc[]){
int i = 0, j = 0;
char cad1[80], cad2[80];

gets(cad1);

while(cad1[i] != '\0'){
if(cad1[i] == 'a' || cad1[i] == 'A' ||
   cad1[i] == 'e' || cad1[i] == 'E' ||
   cad1[i] == 'i' || cad1[i] == 'I' ||
   cad1[i] == 'o' || cad1[i] == 'O' ||
   cad1[i] == 'u' || cad1[i] == 'U'){
i++;
continue;
/*mientras sea una vocal pasamos de ella*/
}
else{
cad2[j] = cad1[i];
j++;
cad2[j] = '\0';
/*si no es una vocal la almacenamos en cad2*/
}
i++;
}

puts(cad2);

getchar();
return 0;
}


aquí como veras envés de sacar la longitud del estring cad1 sacamos las vocales minetras escaneamos el string cad1

la sentencia continue
Citar
Fuerza a que comience una nueva vuelta dentro de la estructura correspondiente. Dentro de los ciclos
while, y do-while, se evalúa la condición de salida; en el for, se efectúa un salto a la expresión de incremento.
Se utiliza para saltarse el resto de la pasada actual a través de un bucle. El bucle no termina cuando se encuentra una sentencia continue, sencillamente no se ejecutan las sentencias que se encuentren a continuación en él, y se salta directamente a la siguiente pasada a través del bucle.
Título: Re: problema de cadenas en c
Publicado por: fernaEDLP en 13 Mayo 2018, 01:25 AM
Cita de: Kenji-chan en 12 Mayo 2018, 19:08 PM
si pero dejar así el programa es muy poco elegante ya que la longitud del estring cad2 se ve reducida por 80-(n_vocales) alterando su tamaño original paa esto te propongo 2 soluciones, la primero usar un carácter que se use poco o no se use en una oración como por ejemplo un '*' de modo que

int main(){
    int i=0,j,k,l=0;
    char cad1[80];
    char cad2[80];
    gets(cad1);
    while(cad1!='\0'){
        i++;
    }

        for(j=0;j<i;j++){
            if(cad1[j]=='a'||cad1[j]=='e'||cad1[j]=='i'||cad1[j]=='o'||cad1[j]=='u'||cad1[j]=='A'||cad1[j]=='E'||cad1[j]=='O'||cad1[j]=='U'||cad1[j]=='I'){
                cad1[j]='*';//-> a qui haces que cad1[j] sea igual a '*'
            }
        }
        for(k=0;cad1[k];k++){
            if(cad1[k] != '*'){
                cad2[l]=cad1[k];
                l++;
                cad2[l]='\0';
            }
        }

        puts(cad2);



return 0;
}


la segundo consiste en cambiar un poco la filosofía del programa

quita_vocales.c

#include <stdio.h>

int main(int arv, char* argc[]){
int i = 0, j = 0;
char cad1[80], cad2[80];

gets(cad1);

while(cad1[i] != '\0'){
if(cad1[i] == 'a' || cad1[i] == 'A' ||
   cad1[i] == 'e' || cad1[i] == 'E' ||
   cad1[i] == 'i' || cad1[i] == 'I' ||
   cad1[i] == 'o' || cad1[i] == 'O' ||
   cad1[i] == 'u' || cad1[i] == 'U'){
i++;
continue;
/*mientras sea una vocal pasamos de ella*/
}
else{
cad2[j] = cad1[i];
j++;
cad2[j] = '\0';
/*si no es una vocal la almacenamos en cad2*/
}
i++;
}

puts(cad2);

getchar();
return 0;
}


aquí como veras envés de sacar la longitud del estring cad1 sacamos las vocales minetras escaneamos el string cad1

la sentencia continue
hola muy buena la segunda solución, no sabía de la sentencia continue, en la facu en el primer modulo no se dan funciones, es todo con diagrama de flujo punteros, arreglos y cadenas. En el segundo si damos todo lo que es memoria dinámica, funciones y demas...
pero creo que voy a tener que rendir de nuevo la primer parte  :( gracias igual seguramente en el futuro postee mas dudas