Autor
|
Tema: ejercicio en C (Leído 7,557 veces)
|
howaboutno
Desconectado
Mensajes: 38
|
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
|
Así es como yo lo haría. #include <stdio.h> int cnoc(char*); void rotate(char*); int main(){ char cad[256]={}; printf("length=%20s\n", cad ); //NOTA: cuidado con el buffer overflow(printf("length=%s\n", cad);) int n=cnoc(cad); int i; for(i=0; i<n; i++){ //rotar n veces. Así conseguimos todas las combinaciones posibles rotate(cad); } } int cnoc(char cad[]){ // Devuelve el número de caracteres en una cadena int i=0; while(cad[i]) i++; return i; } void rotate(char cad[]){ //rotar la cadena 1 posición int n=cnoc(cad)-1; //n apunta a la untima posición char last= cad[n--]; //guardamos el valor de la ultima posición en variable last for(;n>=0;n--) cad[n+1]=cad[n]; //desplazamos todos los caracteres una posición hacia delante cad[0]=last; //como el primer elemento no tiene precedente tenemos que==> // ==>poner en él el que fue el el último }
EDIT: añado comentarios
|
|
« Última modificación: 30 Octubre 2012, 21:16 pm por tuket »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Espero que te sea útil. Prueba lo con números que es más visual la rotación: #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i,j=0,k; char cadena [80]; gets (cadena); k=strlen (cadena); puts("\n"); while (k>=1) { for (i=k;i<=strlen (cadena);i++) printf ("%c",cadena[i]); printf ("\b"); for (j=0;j<k ;j++) printf ("%c",cadena[j]); j++;k--;puts("\n"); } return 0; }
Saludos!.
|
|
« Última modificación: 30 Octubre 2012, 23:45 pm por leosansan »
|
En línea
|
|
|
|
lapras
|
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: tuket@debian:~$ ./a.out hole hol lho 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. for (i=k;i<strlen (cadena);i++)
. Simplemente modificando esas dos líneas
|
|
« Última modificación: 31 Octubre 2012, 00:24 am por tuket »
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
te dejo una solucion que quizas es algo confusa, aunque a mi me ha ido bien para repasar aritmetica de punteros: #include <stdio.h> #include <string.h> #define MAX 64 int main() { char cadena[MAX]; int i, longitud; printf("Introduce la cadena: "); fgets(cadena , MAX -1, stdin ); cadena[longitud-1]='\0'; longitud--; for (i=0; i<longitud; i++) { printf("%s%s\n", cadena +longitud -i +1, cadena ); cadena[longitud-i]=cadena[longitud-1-i]; cadena[longitud-1-i]='\0'; } return 0; }
la salida: 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
|
@xiruko: Me encanta.
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Otra forma consiste en indicar el numero de caracteres a imprimir mediante "%.*s" en la llamada a "printf": #include <stdio.h> int main (void) { char cad[] = "hola"; size_t nc = sizeof cad - 1; size_t i; for (i = 1; i < nc; i++) printf("%s%.*s\n", cad + nc - i , nc - i , cad ); return 0; }
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
Mensajes: 1.314
|
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
Mensajes: 438
|
Otra forma consiste en indicar el numero de caracteres a imprimir mediante "%.*s" en la llamada a "printf": #include <stdio.h> int main (void) { char cad[] = "hola"; size_t nc = sizeof cad - 1; size_t i; for (i = 1; i < nc; i++) printf("%s%.*s\n", cad + nc - i , nc - i , cad ); return 0; }
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 un saludo!
|
|
|
En línea
|
|
|
|
lapras
|
Lo bueno que tiene el código de rir3760 es que no hace ningún cambio en la cadena. Es genial.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
ejercicio 506
Ejercicios
|
ieman
|
0
|
3,927
|
13 Mayo 2005, 17:42 pm
por ieman
|
|
|
Ejercicio en C
Ejercicios
|
ߣ@î§
|
3
|
10,825
|
4 Septiembre 2005, 06:31 am
por ߣ@î§
|
|
|
Help Ejercicio 122 en C
Ejercicios
|
ANELKAOS
|
4
|
5,163
|
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
|
16,577
|
5 Septiembre 2010, 02:57 am
por TGa.
|
|
|
ejercicio conclase pag 70 ejercicio 1
Programación C/C++
|
flony
|
2
|
4,564
|
17 Octubre 2010, 12:16 pm
por Akai
|
|