Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: howaboutno en 30 Octubre 2012, 19:53 pm



Título: ejercicio en C
Publicado por: howaboutno en 30 Octubre 2012, 19:53 pm
hola, me estoy atascando de nuevo....
Hacer un programa para que dada una palabra de no mas de 20 caracteres  y efectúe todas las rotaciones posibles de dicha palabra de forma que el último carácter pase al primero y los demás corran un espacio, es decir si la palabra fuera “HOLA”  el resultado debe ser :
HOLA
AHOL
LAHO
OLAH
 
claro, llego hasta el punto de recorrer la cadena pero luego es que no hay funcion alguna para eso... eso, que lo que no tengo claro como hacer correr un espacio el caracter... ideas? sugerencias? pistas?
gracias =)


Título: Re: ejercicio en C
Publicado por: lapras en 30 Octubre 2012, 21:03 pm
Así es como yo lo haría.

Código
  1. #include <stdio.h>
  2.  
  3. int cnoc(char*);
  4. void rotate(char*);
  5.  
  6. int main(){
  7. char cad[256]={};
  8. scanf("%s",cad);
  9. printf("length=%20s\n", cad); //NOTA: cuidado con el buffer overflow(printf("length=%s\n", cad);)
  10. int n=cnoc(cad);
  11.  
  12.  
  13. int i;
  14. for(i=0; i<n; i++){ //rotar n veces. Así conseguimos todas las combinaciones posibles
  15. rotate(cad);
  16. printf("%s\n", cad);
  17. }
  18. }
  19.  
  20.  
  21. int cnoc(char cad[]){  // Devuelve el número de caracteres en una cadena
  22. int i=0;
  23. while(cad[i]) i++;
  24. return i;
  25. }
  26.  
  27. void rotate(char cad[]){ //rotar la cadena 1 posición
  28. int n=cnoc(cad)-1; //n apunta a la untima posición
  29. char last= cad[n--]; //guardamos el valor de la ultima posición en variable last
  30. for(;n>=0;n--) cad[n+1]=cad[n]; //desplazamos todos los caracteres una posición hacia delante
  31. cad[0]=last; //como el primer elemento no tiene precedente tenemos que==>
  32. // ==>poner en él el que fue el el último
  33. }
EDIT: añado comentarios


Título: Re: ejercicio en C
Publicado por: leosansan en 30 Octubre 2012, 23:42 pm
Citar
Espero que te sea útil. Prueba lo con números que es más visual la rotación:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.    int i,j=0,k;
  8.    char cadena [80];
  9.    gets (cadena);
  10.    k=strlen (cadena);
  11.    puts("\n");
  12.    while (k>=1)
  13.            {
  14.                for (i=k;i<=strlen (cadena);i++)
  15.                    printf ("%c",cadena[i]);
  16.                printf ("\b");
  17.                for (j=0;j<k  ;j++)
  18.                        printf ("%c",cadena[j]);
  19.                j++;k--;puts("\n");
  20.            }
  21.    return 0;
  22. }
Saludos!.


Título: Re: ejercicio en C
Publicado por: lapras en 31 Octubre 2012, 00:14 am
Me mola tu código leosansan.
Por cierto, ¿para que pones printf("\b")? ¿es por que te sale algún carácter raro?
Lo digo por que me suena que en algunas plataformas el carácter nulo es imprimible y tu codigo accede al ultimo caracter de la string (NULL) y lo imprime.
Yo  que estoy en linux, tu código imprime esto:
Código
  1. tuket@debian:~$ ./a.out
  2. hole
  3.  
  4.  
  5. hol
  6.  
  7. lho
  8.  
  9. olh

Parece que en linux no se imprime el carácter nulo entonces al borrar se queda con una letra menos. Tal vez el remedio sería no imprimir ese carácter para no tener que borrarlo.
Código
  1. k=strlen (cadena)-1;
  2. for (i=k;i<strlen (cadena);i++)
  3.  
.
Simplemente modificando esas dos líneas


Título: Re: ejercicio en C
Publicado por: xiruko en 31 Octubre 2012, 00:28 am
te dejo una solucion que quizas es algo confusa, aunque a mi me ha ido bien para repasar aritmetica de punteros:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAX 64
  4.  
  5. int main() {
  6.  
  7. char cadena[MAX];
  8. int i, longitud;
  9.  
  10. printf("Introduce la cadena: ");
  11. fgets(cadena, MAX-1, stdin);
  12. longitud=strlen(cadena);
  13. cadena[longitud-1]='\0';
  14. longitud--;
  15.  
  16. for (i=0; i<longitud; i++) {
  17. printf("%s%s\n", cadena+longitud-i+1, cadena);
  18. cadena[longitud-i]=cadena[longitud-1-i];
  19. cadena[longitud-1-i]='\0';
  20. }
  21.  
  22. return 0;
  23. }

la salida:

Código:
xiruko:~$ gcc rotar.c -o rotar
xiruko:~$ ./rotar
Introduce la cadena: hola
hola
ahol
laho
olah
xiruko:~$

un saludo!


Título: Re: ejercicio en C
Publicado por: lapras en 31 Octubre 2012, 00:39 am
@xiruko: Me encanta.


Título: Re: ejercicio en C
Publicado por: rir3760 en 31 Octubre 2012, 01:42 am
Otra forma consiste en indicar el numero de caracteres a imprimir mediante "%.*s" en la llamada a "printf":
Código
  1. #include <stdio.h>
  2.  
  3. int main (void)
  4. {
  5.   char cad[] = "hola";
  6.   size_t nc = sizeof cad - 1;
  7.   size_t i;
  8.  
  9.   puts(cad);
  10.   for (i = 1; i < nc; i++)
  11.      printf("%s%.*s\n", cad + nc - i, nc - i, cad);
  12.  
  13.   return 0;
  14. }

Un saludo


Título: Re: ejercicio en C
Publicado por: leosansan en 31 Octubre 2012, 07:42 am
Me mola tu código leosansan.
Por cierto, ¿para que pones printf("\b")? ¿es por que te sale algún carácter raro?
En W7 sale un espacio en blanco después de imprimir los primeros caracteres, por eso tengo que eliminarlo. Por lo que comentas, en Linux no sucede eso, por lo que podrías eliminarlo.


Título: Re: ejercicio en C
Publicado por: xiruko en 31 Octubre 2012, 12:31 pm
Citar
Otra forma consiste en indicar el numero de caracteres a imprimir mediante "%.*s" en la llamada a "printf":
Código
  1. #include <stdio.h>
  2.  
  3. int main (void)
  4. {
  5.   char cad[] = "hola";
  6.   size_t nc = sizeof cad - 1;
  7.   size_t i;
  8.  
  9.   puts(cad);
  10.   for (i = 1; i < nc; i++)
  11.      printf("%s%.*s\n", cad + nc - i, nc - i, cad);
  12.  
  13.   return 0;
  14. }

joder rir3760, siempre posteas codigos mucho mas simples que los mios usando "trucos" como en este caso esto del printf() xD

donde has aprendido esto por ejemplo? podrias recomendarme algun libro o web que no sea de iniciacion en C sino que profundice mas?

en cuanto a tu codigo, me ha gustado sobretodo lo de usar sizeof para saber el tamaño de la cadena, no lo habia pensado y asi me evitaria incluir la libreria string en el codigo. en fin... gracias por todo y a ver si puedes recomendarme algo :rolleyes:

un saludo!


Título: Re: ejercicio en C
Publicado por: lapras en 31 Octubre 2012, 13:13 pm
Lo bueno que tiene el código de rir3760 es que no hace ningún cambio en la cadena. Es genial.


Título: Re: ejercicio en C
Publicado por: xiruko en 31 Octubre 2012, 13:46 pm
claro, si puedes escoger cuantos caracteres elegir entonces no hacen falta historias para mover un NULL por la cadena ni nada asi. por eso digo que a mi me gustaria saber de donde saca estas cosas xD


Título: Re: ejercicio en C
Publicado por: leosansan en 31 Octubre 2012, 13:49 pm

donde has aprendido esto por ejemplo? podrias recomendarme algun libro o web que no sea de iniciacion en C sino que profundice mas?

http://www.cplusplus.com/reference/clibrary/cstdio/printf/
Citar
Pero no hay color rir nos lleva mucho, mucho de ventaja. Es un fenómeno en el conocimiento y manejo de comandos y librerías. siempre que postea algo es algo para estudiar y aprender. Es toda una fortuna contar con sus aportaciones.
Saludos!.


Título: Re: ejercicio en C
Publicado por: rir3760 en 1 Noviembre 2012, 18:49 pm
podrias recomendarme algun libro o web que no sea de iniciacion en C sino que profundice mas?
Si ya manejas bien el lenguaje C dos libros de calidad son "The Standard C Library" de P. J. Plauger y "Algorithms in C" de Robert Sedgewick, el primero sobre la biblioteca estándar de C y el segundo sobre algoritmos (búsqueda, ordenación, grafos, etc.).

Pero, va de nuevo la advertencia: no son libros para principiantes.

Otro muy bueno para un nivel de principiante/intermedio es "Pointers on C", no es un libro solo sobre punteros sino que se le da el énfasis que requieren. Otras de sus ventajas son enseñar el lenguaje según el estándar y cubrir mas temas que "K&R2".

Todos ellos, hasta donde tengo entendido, en ingles.

Un saludo


Título: Re: ejercicio en C
Publicado por: BatchianoISpyxolo en 1 Noviembre 2012, 22:07 pm
Bueno aquí te dejo este pdf de mi facultad:

http://www.dc.fi.udc.es/~so-grado/CursoC.pdf

No es gran cosa, pero hay algún que otro tema bastante interesante como punteros y arrays multidimensionales, y está en español.

Eso sí es para iniciarse.


Título: Re: ejercicio en C
Publicado por: xiruko en 2 Noviembre 2012, 15:02 pm
gracias a los 3 por las recomendaciones, aunque primero probare alguno de los dos libros de rir3760 a ver si puedo seguirlo mas o menos.

un saludo!