Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: nanto en 4 Marzo 2014, 07:46 am



Título: Ayuda con arrays y punteros
Publicado por: nanto en 4 Marzo 2014, 07:46 am
Buenas noches.. Espero puedan ayudarme o prestarme alguna idea. Mi duda surge cuando al generar una cierta cantidad de arrays de tipo char de forma iterativa (obtengo los resultados esperados), cumpliendo ciertas condiciones de ordenamientos entre sus componentes
Código
  1. for(i=l1; i<=l3-1; i++){
  2. t=0;
  3. for(j=i-1; j>=0; j--){
  4.   s++;
  5.   aux1=S3[j];
  6.   S3[j]=S3[j+1];
  7.   S3[j+1]=aux1;
  8.   arreglo[s]=S3;
  9.   printf("\n\n Permuta %i en ciclo %i es:%s y Arreglo es %s",s,t,S3,arreglo[s]);
  10. }
  11. }
  12.  
Pero al terminas  e  imprimirlos nuevamente de esta forma
Código
  1. for(j=0;j<=cant;j++){
  2.   printf("\n\n Permuta %i es:%s",j, arreglo[j]);
  3. }
  4.  
solo arroja en las tantas iteraciones el ultimo arrays generado, y requiero guardar todos los resultados para generar otras permutaciones. Nota:
Código
  1. char *arreglo, S3, aux1;
  2.  

Gracias


Título: Re: Ayuda con arrays y punteros
Publicado por: eferion en 4 Marzo 2014, 08:28 am
Si he entendido bien... lo que necesitas es guardar los resultados intermedios... cierto??

Si es así necesitarás crear tantos arrays como resultados intermedios quieras guardar ... lo suyo entonces es meter tu algoritmo en una función que admita dos arrays... uno que contiene los valores iniciales y otro para almacenar los resultados tras la permutación. Lo único que tienes que hacer entonces es ir pasando los arrays de forma ordenada para almacenar los resultados intermedios.

Código
  1. void permutacion( char* origen, char* destino );
  2.  
  3. // Lo de void main () lo pongo para escribir menos, al fin y al cabo es solo
  4. // un ejemplo
  5. void main( )
  6. {
  7.  char* inicio;
  8.  char* permutacion1;
  9.  char* permutacion2;
  10.  char* permutacion3;
  11.  char* final;
  12.  
  13.  // Inicializacion de los arrays
  14.  // ...
  15.  
  16.  permutacion( inicio, permutacion1 );
  17.  permutacion( permutacion1, permutacion2 );
  18.  permutacion( permutacion2, permutacion3 );
  19.  permutacion( permutacion3, final );
  20.  
  21.  // Liberación de recursos
  22.  // ...
  23. }


Título: Re: Ayuda con arrays y punteros
Publicado por: rir3760 en 4 Marzo 2014, 16:16 pm
Espero puedan ayudarme o prestarme alguna idea. Mi duda surge cuando al generar una cierta cantidad de arrays de tipo char de forma iterativa
Con esta sentencia:
Código
  1. char *arreglo, S3, aux1;
El otro fragmento que pones no es valido, supongo en realidad la declaracion de las variables es:
Código
  1. char **arreglo, *S3, *aux1;

Para evitar confusiones mejor publica el código fuente completo.

Un saludo


Título: Re: Ayuda con arrays y punteros
Publicado por: Yoel Alejandro en 4 Marzo 2014, 18:46 pm
Para ayudarte mejor creo que debes darnos más información sobre el contexto de tu trabajo. Pareciera que quisieras ordenar un arreglo de cadenas, .... ahora no le veo sentido a guardar los resultados de las permutaciones.

Ten en cuenta que el número de permutaciones puede ser mayor a la cantidad de elementos del arreglo, o sea que no sabrás de antemano cuántas cadenas intermedias debes guardas. Quizá se requiera dimensionamiento dinámico (aumento de la longitud del vector en tiempo de ejecución).

Por otra parte, si tratas de implementar un algoritmo de ordenamiento, ¿por qué la permutación de los elementos se realiza incondicionalmente, es decir, sin verificar ninguna condición de orden entre los elementos?

Debes aclararnos mejor sobre el trabajo que se quiere realizar ...


Título: Re: Ayuda con arrays y punteros
Publicado por: nanto en 4 Marzo 2014, 20:42 pm
Holaaaa. Gracias!
Seré más claro... Supongamos que abc y wz son dos palabras o cadenas de eventos generados por dos componentes independientes de un Sistema (respectivamente). Según las condiciones del sistemas el ordenamiento no es cualquier ordenamiento... Al comenzar con la concatenacion abcwz yo espero esto.
abwcz
awbcz
wabcz
wabzc
wazbc
wzabc
guardando los resultados anteriores para reusarlos podría generar estos otros (pero los pierdo, y me imprime wzabc)
awbzc
awzbc
abwzc
Algo de memoria perdida... El código es este
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int l3,l1,l2,i,j,s,k,t;
  4.  
  5. int main(void){
  6. printf("Programa que concatena dos segmentos\n\n");  
  7. printf("Introduzca la longitud del primer segmento:");
  8. scanf("%i",&l1);/*Se piden los datos*/
  9. printf("Introduzca el primer segmento:");
  10. char S1[l1];
  11. scanf("%s", S1);
  12. printf("\nIntroduzca la longitud del segundo segmento:");
  13. scanf("%i", &l2);
  14. char S2[l2];
  15. printf("Introduzca  segundo segmento:");
  16. scanf("%s",S2);
  17. l3=l1+l2;  
  18. int cant;
  19. cant=factorial(l3)/(factorial(l2)*factorial(l1));
  20. printf("\n\n El numero de permutaciones es:%d",cant);
  21. char S3[l3];
  22. for(i=0; i<l1; i++){
  23.  S3[i]=S1[i];
  24. }
  25. j=0;
  26. for(i=l1; i<l3; i++){
  27.  S3[i]=S2[j];
  28.   j++;
  29. }
  30. printf("\n\n El segmento es:%s",S3);
  31.  
  32. fflush(stdin);
  33.  
  34. //dato = (char*)malloc(cant);
  35.  
  36. char aux1; /*Tamaño maximo de 100*/
  37. char *arreglo[cant];  
  38. //char* dato;    
  39. s=0;
  40. arreglo[0]=S3;
  41. printf("\n\n OjO es:%s",arreglo[s]);
  42. for(i=l1; i<=l3-1; i++){
  43.   t=0;
  44.   for(j=i-1; j>=0; j--){
  45.     s++;
  46.     aux1=S3[j];
  47.     S3[j]=S3[j+1];
  48.     S3[j+1]=aux1;
  49.     arreglo[s]=S3;
  50.     printf("\n\n Permutacion %i en ciclo %i es:%s y Arreglo es %s",s,t,S3,arreglo[s]);
  51. //   t=0;
  52. //   while(abs(i+1-j)>1){
  53. // aux1=S3[j+1];
  54. //      S3[j+1]=S3[i+1];
  55. //      S3[i+1]=aux1;
  56. //      s++; t++;
  57. // arreglo[s]=S3;
  58. // printf("\n\n Permutacion %i en ciclo %i es:%s y arreglo es %s",s,t,S3,arreglo[s]);
  59. //   }      
  60.   }        
  61. }
  62. //printf("\n\n Permuta DOS es:%s",arreglo[2]);
  63. for(j=0;j<=cant;j++){
  64.   printf("\n\n Permuta %d es:%s",j,arreglo[j]);
  65. }
  66.  
  67. return EXIT_SUCCESS;
  68. }
  69.  
  70.  


Título: Re: Ayuda con arrays y punteros
Publicado por: leosansan en 4 Marzo 2014, 23:22 pm

¡¡¡Tienes definida la función factorial dentro de la función main!!!. Debe estar fuera.

Ya nos dirás lo que sucede después.


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Ayuda con arrays y punteros
Publicado por: nanto en 5 Marzo 2014, 00:07 am
Eso es irrelevante al problema.. puede estar afuera o adentro...  Te entiendo!  Es una función y por ende puede ser usado por otros programas. Porque? Para su mejor  aprovechamiento es recomendable que este afuera.


Título: Re: Ayuda con arrays y punteros
Publicado por: ivancea96 en 5 Marzo 2014, 01:28 am
No se ponen funciones dentro de otras funciones.

PD:
Código
  1. for(i=0; i<=l1; i++){
  2.  
  3.  S3[i]=S1[i];
  4.  
  5. }
  6.  
  7. j=0;
  8.  
  9. for(i=l1; i<l3; i++){
  10.  
  11.  S3[i]=S2[j];
  12.  
  13.   j++;
  14.  
  15. }

Después de eso, en el caso de por ejemplo, l1=2 y l2=3, sobrarán 5 caracteres en l3.


Título: Re: Ayuda con arrays y punteros
Publicado por: Gh057 en 5 Marzo 2014, 02:08 am
es cierto lo que comenta ivancea96, estás generando una alta dependencia, aparte que el código se transforma poco a poco en un delirio; es uno de los puntos centrales del paradigma de la programación estructurada, separar código en funciones cortas y auto suficentes, que hagan una sola tarea, y que te permita abstraer el problema de "como lo hace" (se inicia el concepto de encapsulación).

en este momento no encuentro un buen link para orientarte sobre el concepto de la programación estructurada o modular, y formas de crear un función de manera correcta, pero con más o menos detalles en cualquier buen libro de lenguaje C se explica lo anteriormente dicho, igualmente ya te han indicado ese punto ivancea96 como leosansan.


Título: Re: Ayuda con arrays y punteros
Publicado por: nanto en 5 Marzo 2014, 02:37 am
Holaaa.... Nunca he dicho lo contrario Gh057, pero creo que era necesario fomentar este punto ( Porque no se debe colocar funciones dentro del programa principal?). Es distinto decir, no se debe a no se puede!

Efectivamente, se estaba contando de más. Si las longitudes L1 y L2 son 3 y 2 respectivamente. El contador i va de 0 a 2 (antes de 0 a 3) y el otro i de 3 a 4.
Código
  1. for(i=0; i<l1; i++){
  2.     S3[i]=S1[i];
  3. }
  4. j=0;
  5. for(i=l1; i<l3; i++){
  6.    S3[i]=S2[j];
  7.    j++;
  8. }
  9.  
Ahora, no se a que te refieres ivancea96,  con que sobran 5 caracteres en L3 (longitud del string 5).


Título: Re: Ayuda con arrays y punteros
Publicado por: Gh057 en 5 Marzo 2014, 02:47 am
es por el segundo for, estás iniciando desde la longitud de l1... si tiene 3, recorrerías un par de posiciones solamente.

(agrego) otro tema que veo es que declaras los arreglos justo cuando los vas a llenar... eso en c++ está permitido, pero en ansi c, no es aconsejable. por lo cual deberías o bien pasar el código a c++ o bien (yo aunque sea en c++ lo prefiero así) declararlas al inicio...

básicamente es asignarles a los tres arreglos la memoria a ocupar dinámicamente en ejecución; luego agregarlos al tercero para efectuar la permutación, mediante alguna regla impuesta en tu algoritmo con una variable auxiliar local por ejemplo. (aunque según lo primero que posteas, esas permutaciones puedes lograrlas modificando el algoritmo de ordenamiento de burbuja, que utiliza dos variables en cada extremo, van intercambiando los valores mientras se aproximan).

resumiendo, el código puede quedarte funcional, pero te recomiendo que lo reescribas tanto para tomar buenos hábitos, como para solucionar más rápidamente los problemas que se te vayan presentando al generar código. saludos

 




Título: Re: Ayuda con arrays y punteros
Publicado por: nanto en 5 Marzo 2014, 02:51 am
Okey, perfecto ya te entiendo.  Tomare tu consejo en C e intentare modificar el algoritmo de Ordenamiento de Burbuja. Gracias... Saludos...


Título: Re: Ayuda con arrays y punteros
Publicado por: ivancea96 en 5 Marzo 2014, 04:31 am
Porque no se debe colocar funciones dentro del programa principal?

Código:
Main es una función.
Poner funciones dentro de funciones es una mala práctica, además de absurdo.
En C++ genera error.
Genera código más difícil de leer.

Me parecen suficientes razones.


Título: Re: Ayuda con arrays y punteros
Publicado por: leosansan en 5 Marzo 2014, 06:17 am
Holaaa.... Nunca he dicho lo contrario Gh057, pero creo que era necesario fomentar este punto ( Porque no se debe colocar funciones dentro del programa principal?). Es distinto decir, no se debe a no se puede!
..............................................................

Me ratifico en lo que te indiqué: no se debe. El hecho obvio de que si se puede hacer es que tú lo has hecho, mal pero lo has hecho.

Cuestión de semántica nada más.


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


P.D: ¡¡¡UFFFFF...!!!, como está hoy el personal .....