Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Cas980 en 15 Marzo 2014, 06:03 AM

Título: Ayuda con programa
Publicado por: Cas980 en 15 Marzo 2014, 06:03 AM
Necesito crear un programa que a partir de una frase la imprima por palabras pero sin usar la funcion strtok, tengo lo siguiente pero no logro que imprima. Espero me puedan ayudar.
Por ejemplo si la frase es "hoy es viernes"
debe imprimir:
hoy
es
viernes

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;


int mi_strtok(char* frase)
{
    int cont = 0;
    int x,c=0;
   
    while(*frase++ != '\0')
    {
       if(*frase!= ' ')
         {  
               
              cont++;
             
           }
       else
           {
               for(x=c;x<cont;x++)
               {
                  cout<<frase[x];
                  }
                  c=c+cont;
                 
               
           }
           
       }
           
    return 0;
}

main()
{
    char frase[500];
    cout<<"Ingrese la frase: ";
    gets(frase);  
    mi_strtok(frase);
   
    getch();
Título: Re: Ayuda con programa
Publicado por: milx86 en 15 Marzo 2014, 07:13 AM
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
void mi_strtok(char *frase);

int main(void) {
    char frase[100];
    cout<<"Ingrese la frase: ";
    gets(frase);
    mi_strtok(frase);
    getch();
    return 0;
}

void mi_strtok(char *frase)
{
    int i;
     for(i=0; frase[i]!='\0';i++)
     {
         if(frase[i]==' '){
             cout<<"\n";
             continue; //Saltar a la sgte iteración para que no imprima el espacio.
         }
         cout<<frase[i];

     }
}

Espero esto te sirva  :)
Título: Re: Ayuda con programa
Publicado por: amchacon en 15 Marzo 2014, 12:14 PM
Que manía tienen los profesores de mezclar C y C++.

Yo cambiaría:
Código (cpp) [Seleccionar]
cout<<"\n";

Por:
Código (cpp) [Seleccionar]
cout<<endl;

Ya que con endl se refresca el flujo de salida además.
Título: Re: Ayuda con programa
Publicado por: leosansan en 15 Marzo 2014, 14:43 PM
Cita de: amchacon en 15 Marzo 2014, 12:14 PM
Que manía tienen los profesores de mezclar C y C++.
....................................

Por no hablar de librerías innecesarias con el uso de funciones no recomendadas:

Código (cpp) [Seleccionar]

..............
#include <conio.h> <== No aconsejable por no ser estándar
#include <stdio.h> <== Sobraría usando cin.getline
...........................
gets(frase); <== No aconsejable, en su lugar, por ejemplo, usaría la que sigue
cin.getline(frase, 100, '\n');
.....................
getch(); <== No aconsejable por no ser estándar



¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Título: Re: Ayuda con programa
Publicado por: milx86 en 15 Marzo 2014, 16:47 PM
Cita de: amchacon en 15 Marzo 2014, 12:14 PM
Que manía tienen los profesores de mezclar C y C++.
amchacon tienes razon, estoy iniciando la carrera de informatica y no puedo evitar el coraje cuando la maestra llama "C" a C++   :-( los consideran como iguales -.-
Y eso de "refrescar el flujo" no sabia, te agradezco :D

Cita de: leosansan en 15 Marzo 2014, 14:43 PM
Por no hablar de librerías innecesarias con el uso de funciones no recomendadas:

Código (cpp) [Seleccionar]

#include <conio.h> <== No aconsejable por no ser estándar

Seguro esta en windows, a mi me decian que le ponga el getch() para que no se me cierre el programa rapido :/
Título: Re: Ayuda con programa
Publicado por: amchacon en 15 Marzo 2014, 16:49 PM
Para eso tienes el cin.get()

Que además es estándar.
Título: Re: Ayuda con programa
Publicado por: leosansan en 15 Marzo 2014, 19:54 PM
Y porfi, la próxima vez elige en GeSHi las etiquetas de C++ para que el código salga coloreado y sea más fácil de visualizar.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Título: Re: Ayuda con programa
Publicado por: Yoel Alejandro en 15 Marzo 2014, 22:11 PM
Aunque no queda mucho que aportar aquí, la idea fundamental es que si se haya espacio imprimir en su lugar un '\n', de otro modo imprimir el carácter normal. Se puede mejorar un poco usando isspace() (requiere <ctype.h>) para que dicho reemplazo ocurra no sólo con ' ', sino con cualquier carácter de espacio (tabulador, etc).

Presento mi versión enteramente en C. Usa un modo seguro de ingreso de datos usando fgets() (controla la cantidad de caracteres que se ingresan) y atendiendo a la recomendación de leosansan su usa la función estándar getchar() en lugar de getch(). Su salida:

Intro frase: Anita lava la tina
Anita
lava
la
tina


Código (cpp) [Seleccionar]

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

void mi_strtok( char *frase );

int main( ) {

   char frase[101];

   printf("Intro frase: ");
   fflush( stdout );
   fgets(frase, 101, stdin);

   mi_strtok( frase );

   putchar('\n');
   return 0;
}

void mi_strtok( char *frase ) {

   int i;
   char c;

   i = 0;
   while ( ( c = frase[i++] ) != '\0' ) {
      if ( !isspace(c) )
         putchar(c);
      else
         putchar('\n');
   }
}
Título: Re: Ayuda con programa
Publicado por: amchacon en 15 Marzo 2014, 22:55 PM
La función original no escribe en la pantalla ;D, sino que "fragmenta" una cadena en varios trozos.

Presento la mía que hace lo mismito que la strtok:
Código (cpp) [Seleccionar]
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

char* mi_strtok( char *frase,const char* delim);
char coincidencia(const char letra,const char* diccionario,const int tam);

int main( )
{
   char frase[101];

   printf("Intro frase: ");
   fflush( stdout );
   fgets(frase, 101, stdin);
   char* s;

   if ( ( s = mi_strtok( frase, ",") ) != NULL )
       printf( "%s\n", s );

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

   return 0;
}

char* mi_strtok( char *frase,const char*delim )
{
   static char* frase_actual = NULL;
   char* principio;

   if (frase != NULL)
   {
       frase_actual = frase;
   }
   else if (frase_actual == NULL) return NULL;

   principio = frase_actual;

   const int tam = strlen(delim);
   char c;

   while ( ( c = *frase_actual ) != '\0' )
   {
       if (coincidencia(c,delim,tam))
       {
           *frase_actual = '\0';
           frase_actual++;
           return principio;
       }

       frase_actual++;
   }

   frase_actual = NULL;

   return principio;
}

char coincidencia(const char letra,const char* diccionario,const int tam)
{
   int i = 0;
   for (; i < tam;i++)
   {
       if (letra == diccionario[i]) return 1;
   }
   return 0;
}


La entrada: "1,2,3,4" me genera:
Citar1
2
3
4
Título: Re: Ayuda con programa
Publicado por: Yoel Alejandro en 15 Marzo 2014, 23:14 PM
Casualmente hace unos días estaba pensando en cómo podría hacer un código que imitara la función estándar strtok() .... aunque al final no me senté a hacerlo.

Pero ya hoy obtuve la respuesta, y una solución hábil por cierto  ;D
Título: Re: Ayuda con programa
Publicado por: amchacon en 15 Marzo 2014, 23:19 PM
Me he dado cuenta que no hace falta la funcion strlen, simplemente basta con cambiar la condición funcion coincidencia:

Código (cpp) [Seleccionar]
char coincidencia(const char letra,const char* diccionario)
{
   int i = 0;
   for (;diccionario[i];i++)
   {
       if (letra == diccionario[i]) return 1;
   }
   return 0;
}


Un parametro menos ^^
Título: Re: Ayuda con programa
Publicado por: Yoel Alejandro en 16 Marzo 2014, 01:00 AM
En ese caso es más sucinto:
Código (cpp) [Seleccionar]

char coincidencia(const char letra,const char* diccionario)
{
  int i = 0;
  while ( diccionario[i] )
  {
      if (letra == diccionario[i++]) return 1;
  }
  return 0;
}
Título: Re: Ayuda con programa
Publicado por: amchacon en 16 Marzo 2014, 02:08 AM
Incluso más todavía:
Código (cpp) [Seleccionar]
char coincidencia(const char letra,char* diccionario)
{
    while (*diccionario)
        if (letra == *diccionario) return 1;
        else diccionario++;
    return 0;
}


^^
Título: Re: Ayuda con programa
Publicado por: leosansan en 16 Marzo 2014, 13:20 PM
Cita de: amchacon en 16 Marzo 2014, 02:08 AM
Incluso más todavía:
Código (cpp) [Seleccionar]
char coincidencia(const char letra,char* diccionario)
{
    while (*diccionario)
        if (letra == *diccionario) return 1;
        else diccionario++;
    return 0;
}


^^

Creo que dejaste atrás const:

Código (cpp) [Seleccionar]
char coincidencia(const char letra,const char* diccionario)

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)

Título: Re: Ayuda con programa
Publicado por: amchacon en 16 Marzo 2014, 13:25 PM
Cita de: leosansan en 16 Marzo 2014, 13:20 PM
Creo que dejaste atrás const:
Me lo dejé aposta, si le pongo el const no puedo aumentar el puntero ;)
Título: Re: Ayuda con programa
Publicado por: rir3760 en 16 Marzo 2014, 14:18 PM
Cita de: amchacon en 16 Marzo 2014, 13:25 PMMe lo dejé aposta, si le pongo el const no puedo aumentar el puntero
Se puede calificar con const el tipo del segundo parámetro:
char coincidencia(const char letra, const char *diccionario) ...

/* O bien */
char coincidencia(const char letra, char const *diccionario) ...

Ya que ello afecta al objeto apuntado.

Supongo estabas pensando en "char * const diccionario" donde el calificador si es un problema.

Un saludo
Título: Re: Ayuda con programa
Publicado por: amchacon en 16 Marzo 2014, 15:11 PM
Cierto, muy buena observación ^^