Autor Tema: Comparar dos arrays (arreglos) si cumplen una secuencia cíclica en C (lenguajeC)  (Leído 6651 veces)

jorge1g

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
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
« Última modificación: 16 de Abril 2021, 19:24 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Comparar dos arrays para ver si cumplen una secuencia cíclica en C
« Respuesta #1 en: 20 de Diciembre 2020, 23:25 »
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
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

jorge1g

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re: Comparar dos arrays para ver si cumplen una secuencia cíclica en C
« Respuesta #2 en: 21 de Diciembre 2020, 17:20 »
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.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Comparar dos arrays para ver si cumplen una secuencia cíclica en C
« Respuesta #3 en: 22 de Diciembre 2020, 01:03 »
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.

NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

jorge1g

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re: Comparar dos arrays para ver si cumplen una secuencia cíclica en C
« Respuesta #4 en: 22 de Diciembre 2020, 08:20 »
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).

mark255

  • Sin experiencia
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Comparar dos arrays para ver si cumplen una secuencia cíclica en C
« Respuesta #5 en: 23 de Diciembre 2020, 00:01 »
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  :)
« Última modificación: 23 de Diciembre 2020, 00:51 por mark255 »

jorge1g

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 5
    • Ver Perfil
Re: Comparar dos arrays para ver si cumplen una secuencia cíclica en C
« Respuesta #6 en: 23 de Diciembre 2020, 08:17 »
¡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!.

mark255

  • Sin experiencia
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Comparar dos arrays para ver si cumplen una secuencia cíclica en C
« Respuesta #7 en: 06 de Enero 2021, 00:57 »
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

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re: Comparar dos arrays para ver si cumplen una secuencia cíclica en C
« Respuesta #8 en: 06 de Enero 2021, 20:03 »
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.

Código: [Seleccionar]
#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

mark255

  • Sin experiencia
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Comparar dos arrays para ver si cumplen una secuencia cíclica en C
« Respuesta #9 en: 06 de Enero 2021, 23:30 »
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.

....

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) 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??? , lástima no halla una manera de ir directamente a un mensaje concreto

saludos
« Última modificación: 06 de Enero 2021, 23:35 por mark255 »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Comparar dos arrays para ver si cumplen una secuencia cíclica en C
« Respuesta #10 en: 07 de Enero 2021, 13:18 »
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.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re: Comparar dos arrays para ver si cumplen una secuencia cíclica en C
« Respuesta #11 en: 07 de Enero 2021, 21:01 »
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.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".