Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: jorge1g en 20 de Diciembre 2020, 16:03
-
Hola a todos:
Estoy empezando a programar en lenguaje C y me han puesto una práctica que consiste en saber si dos arrays de números siguen una secuencia cíclica dada, es decir, tiene la misma secuencia, con independencia de que estén rotadas.
Por ejemplo, para estas dos cadenas de números, el programa devolvería que las cadenas son idénticas:
cadena1[5]={1,6,3,9,1}
cadena2[5]={3,9,1,1,6}
Ademas, no puedo usar ni break, ni goto ni continue.
¿Alguien me puede echar una mano? Muchas gracias
-
Se me ocurre que una forma de solucionarlo podría ser ordenar los números, de menor a mayor por ejemplo.
Una vez ambos arrays estén ordenados, deberían ser exactamente iguales.
Es decir, en la posición - de ambos arrays estará el mismo número, en posición [1] también,... etc..
Si en alguna posición el valor de un array no coincide con el otro, entonces es que NO se cumple la secuencia cíclica
-
Muchas gracias Kabuto por tu repuesta. Pero creo que no me he explicado bien. Lo que necesito es comparar dos cadenas que sigue la misma secuencia, aunque no empiecen por el mismo número. Es decir, en el ejemplo que puse:
1,6,3,9,1
3,9,1,1,6
La secuencia es que al 1 le siga el 6, a este el 3, a este el 9 a este el 1, a este el 1, a este el 6 y así cíclicamente (el último numero de la cadena se enlaza con el primero). Por ejemplo, estas tres cadenas seguirían una secuencia cíclica idéntica:
1,6,3,9,1
3,9,1,1,6
1,1,6,3,9
6,3,9,1,1
Si aplico lo que tu indicas, solo me diría que ambas cadenas contienen los mismos números, pero no que sigan la secuencia. Por ejemplo, diría que las siguientes cadenas cumplen la condición:
1,6,3,9,1
3,1,9,1,6
Idénticos números, pero no siguen la misma secuencia cíclica.
Espero haberme explicado. Gracias de todos modos.
-
Vaale, ahora sí lo he entendido.
Y de momento solo puedo decir que quién se le haya ocurrido proponer este ejercicio.., es una mala persona ;D
Nunca había visto este ejercicio y ahora mismo no sabría como resolverlo, al menos no de forma eficiente.
Este es de esos ejercicios que no solo exige saber programar, si no también tener ingenio para decidir "qué es lo que hay que programar"...
Así a bote pronto, se me ocurre una forma, pero creo que podría requerir bastante código y por tanto no se si sería buena solución o existe una más ingeniosa, simple y eficiente.
A mí lo que se me ocurre es "desplazar" una posición los elementos de uno de los arrays y ver si tras desplazar coincide con el otro array.
Si no coincide, se vuelve a desplazar y se vuelve a comprobar.. y así sucesivamente hasta que coincida, o hasta que los elementos hayan dado una vuela completa.
Es decir, tenemos estos arrays:
1,6,3,9,1
3,9,1,1,6
Cogemos el primero y desplazamos una posición todos sus elementos:
1,1,6,3,9
3,9,1,1,6
¿Coinciden? No, desplazamos otra vez..
9,1,1,6,3
3,9,1,1,6
¿Coinciden? No, desplazamos otra vez..
3,9,1,1,6
3,9,1,1,6
¿Coinciden?, Sí, pues entonces es que sí cumplen la secuencia cíclica.
Si tras hacer 5 desplazamientos (porque son 5 elementos) nunca coincide con el otro array, es que NO cumplen la secuencia cíclica.
De este modo se puede solucionar, pero quizás existe otra forma más eficiente...aunque a mi no se me ocurra.
De hecho, esto que propongo es básicamente lo que hacemos nosotros mentalmente para discenir a simple vista si cumplen la secuencia o no.., desplazar números hasta comprobar que llega un momento en que ambos coinciden.
Programar esto puede ser algo engorroso, así que sería importante "modular" el código en al menos un par de funciones.
Una función que desplace los elementos de un array, y otra función que compare dos arrays y diga si son iguales o no.
-
Muchas gracias, Kabuto. Lo probaré.
(Y, sí, el que me puso la práctica tiene un "poquito" de mala leche, por no decir nada mas fuerte... ;D).
-
hola jorge
desde luego hay que darle un poco al tarro y tener claro lo
que quieres para darle solución
te digo un poco como lo he hecho y te reiras del poco código que lleva
hice una función para el incremento rotativo es decir que si estas en
medio del array y llegas la final, siga contando desde el principio
eso no tiene secreto
para el bucle, si lo ves esta muy claro pero para llegar ahí he tenido
que hacer algunas pruebas y simplificar un poco
espero te guste como ha quedado, creo que funciona bien ;)
https://paste.ofcode.org/5SrtWQH9tWjVZfvkqWmmhJ
suerte :)
-
¡Muchas gracias, mark255!! Me ha resultado muy, muy útil tu programa.
Es cierto que no es mucho código. Es mas, como decía Kabuto, pensar como hacerlo que, al final, codificarlo.
¡Muchas gracias a todos!.
-
hola jorge
parece que el código te sirvió, me alegro ;)
no sabía que el pastebin duraba solo una semana, dejo otros que creo han de durar :)
https://www.online-ide.com/vFp2VZeYBE
https://www.onlinegdb.com/BJogtuf0P
https://pastebin.onionsearchengine.com/paste.php?id=401
saludos
-
Buenas, mejor dejar el código en el propio hilo y asi evitar pérdidas. En https://aprenderaprogramar.com/foros/index.php?topic=1460.0 está explicado cómo pegar código.
#include <stdio.h>
#define TAM 5 // tamaño del array
// incremento circular
void inc(int* p) { if(*p == TAM-1) *p=0; else (*p)++; }
int main(void)
{
int a_base[TAM]={ 1, 6, 3, 9, 1 }; // array base
int a_test[TAM]={ 3, 9, 1, 1, 6 }; // array a comprobar
int b=0; // índice para el array base
int t=0; // índice para el array test
int cnt=0; // contador de ciclos
// si la base ha llegado al final (está contenida)
// o si test ha llegado al final (no está contenida)
// entonces acabo el bucle
while(b<TAM && t<TAM)
{
if(a_base[b]==a_test[t]) { b++; inc(&t); } // si son iguales incremento
else { b=0; t=++cnt; } // si no, empiezo en siguiente ciclo
}
// si la base llegó al final entonces si está contenida
printf("El array base %sestá en el array comprobado\n", b==TAM ? "" : "no ");
return 0;
}
/* mark255 */
/* secuencia ciclica
https://aprenderaprogramar.com/foros/index.php?PHPSESSID=hd9t2mfl0pbkad0ij8pj0h5llq&topic=7854.0
*/
Salu2
-
Buenas, mejor dejar el código en el propio hilo y asi evitar pérdidas. En https://aprenderaprogramar.com/foros/index.php?topic=1460.0 (https://aprenderaprogramar.com/foros/index.php?topic=1460.0) está explicado cómo pegar código.
....
Salu2
hola ogramar
entiendo lo que dices y sería así, si al insertar el código este tuviese coloreado :)
tal como queda en el foro (así lo veo yo) (https://i.imgur.com/c7njIYq.png) no facilita la lectura además de que queda muy anticuado :(
en los enlaces si va coloreado y en algunos también se puede ejecutar y ver el funcionamiento del programa ;)
puestos a pedir pediría un tema oscuro para la página 8)
por otro lado el enlace que me has pasado esta muy bien explicado
pero para encontrarlo he tenido buscar y pasar por 15 mensajes que poco tiene que ver con el insertado de códig (https://i.imgur.com/IZgyRtv.png)o ??? , lástima no halla una manera de ir directamente a un mensaje concreto
saludos
-
Hola.
Siempre podemos combinar ambas opciones.
Insertar el código en el foro con sus etiquetas [ CODE ] correspondientes, que es verdad que presenta un aspecto un poco "espartano", pero tiene la ventaja de que pervive en el tiempo.
Y además un enlace a una de estas páginas que permiten compartir el código con la sintaxis coloreada e incluso algunas permiten compilar y correr el programa en línea.
La desventaja es que el enlace puede caducar con el tiempo, a veces en muy poco tiempo...
Pero bueno, si se combinan ambos, en un lado u otro estará siempre el código disponible.
-
Hola mark255, recomendamos siempre que el código quede en los foros debido a que los enlaces suelen terminar fallando con el tiempo y dificultan la navegación. Como ha indicado Kabuto, además de pegar el código se puede añadir un enlace como forma "combinada" si se desea. Saludos.