elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ejercicio en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: ejercicio en C  (Leído 7,017 veces)
howaboutno

Desconectado Desconectado

Mensajes: 38


Ver Perfil
ejercicio en C
« 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 =)


En línea

lapras

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: ejercicio en C
« Respuesta #1 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


« Última modificación: 30 Octubre 2012, 21:16 pm por tuket » En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: ejercicio en C
« Respuesta #2 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!.
« Última modificación: 30 Octubre 2012, 23:45 pm por leosansan » En línea

lapras

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: ejercicio en C
« Respuesta #3 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
« Última modificación: 31 Octubre 2012, 00:24 am por tuket » En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: ejercicio en C
« Respuesta #4 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!
« Última modificación: 31 Octubre 2012, 00:30 am por xiruko » En línea

lapras

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: ejercicio en C
« Respuesta #5 en: 31 Octubre 2012, 00:39 am »

@xiruko: Me encanta.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: ejercicio en C
« Respuesta #6 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: ejercicio en C
« Respuesta #7 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.
En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: ejercicio en C
« Respuesta #8 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!
En línea

lapras

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: ejercicio en C
« Respuesta #9 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.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ejercicio 506
Ejercicios
ieman 0 3,789 Último mensaje 13 Mayo 2005, 17:42 pm
por ieman
Ejercicio en C
Ejercicios
ߣ@î§ 3 10,637 Último mensaje 4 Septiembre 2005, 06:31 am
por ߣ@î§
Help Ejercicio 122 en C
Ejercicios
ANELKAOS 4 4,924 Último mensaje 15 Septiembre 2005, 23:41 pm
por Arcangel_RZ
[Ejercicio] Aca tienen un ejercicio para practicar « 1 2 3 »
Programación Visual Basic
Dreamaker 20 15,810 Último mensaje 5 Septiembre 2010, 02:57 am
por TGa.
ejercicio conclase pag 70 ejercicio 1
Programación C/C++
flony 2 4,320 Último mensaje 17 Octubre 2010, 12:16 pm
por Akai
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines