Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: LiLou en 15 Febrero 2011, 19:13 pm



Título: La serie mas larga?
Publicado por: LiLou en 15 Febrero 2011, 19:13 pm
Hola. A ver si me podéis ayudar con éste código que no acabo de entender.

Entrada: Secuencia de enteros acabada en 0.
Salida: La serie de enteros ordenada decrecientemente más larga.

Ejemplo:
10 4 2 4 3 1 1 0

La serie mas larga seria 4 3 1 1

Ésta es la funcion main (dada por mi profesora):

Código
  1. int main(){
  2.  
  3.    int t1[M], t2[M];  //t1 = serie actual, t2 = serie mas larga
  4.    int n1, n2=0;     //longitud de las series (n1 se inicializa dentro de la accion leer_e)
  5.    int x;            //lector
  6.  
  7.    printf("Intro. serie de enters acabada en 0:\n");
  8.    scanf("%d", &x);     //inicializacion del primer entero
  9.    leer_e(t1, n1, x);   //inicializacion de la 1a serie
  10.    while(!u_s_o_d(x)){  //ultima serie ordenada decrec.  
  11.                        tratar_t(t1, n1, t2, n2);
  12.                        leer_e(t1, n1, x);
  13.                        }
  14.    resultado(t2, n2);    
  15.  
  16.    return 0;
  17. }

Las acciones leer_e, u_s_o_d, y resultado, ya las tengo (si hace falta, os las muestro).
El problema creo que reside en el "núcleo" del programa, que es la acción tratar_t.
Mi version es tal que así:
Código
  1. void tratar_t(int t1[], int &n1, int t2[], int &n2){
  2.  
  3.     int i, j;    
  4.  
  5.     if(n1>n2){
  6.               j=0;              
  7.               for(i=0; i<=n1; i++){
  8.                              t1[i]=t2[j];
  9.                              j++;
  10.                              }
  11.               n2=j;              
  12.     }
  13.     //else no hacer nada, la serie mas larga es la ultima t2
  14.  
  15. }

Os explico. Se trata de ir comprobando cual es la serie mas larga, copiandola en t2, hatsa que se llegue al final de la secuenia. n1 representa la longitud de la serie ordenada decr. y se compara con n2 (la última serie ordenada decr. mas larga). Si resulta que n1 es mas grande que n2, entonces se ha de copiar la serie(actual) t1 con longitud n1 en t2.
Entonces mi pregunta es, se copia bien t1 en t2?

Si creéis que el algoritmo esta bien, os mostraré el resto del programa para encontrar el problema, pues el resultado me sale siempre 0.
 


Título: Re: La serie mas larga?
Publicado por: N0body en 15 Febrero 2011, 21:18 pm
Si no sabemos qué es lo que hacen tus otras funciones, decir que ayudemos sería como ofuscar el código... es posible, pero lo mejor sería que nos facilites el trabajo si es que te vamos a ayudar...

Por lo menos pon una descripcion de que hace cada función. Por ejemplo, yo al principio supuse que leer_e ingresaba los numeros en tl, pero también la usas más abajo, además no entiendo para que es el argumento x, ni por que el primer entero lo introduces en un scanf en el main y no lo haces todo de una en leer_e... Y obviamente que deduzco quecuando le pasas nl como argumento, en la función está definido por referencia, de modo que la función pueda inicializarla...

Osea, puede ser un error en el ingreso, es muy importante que facilites las funciones, después de todo, ¿cuanto tiempo te puede llevar copiar y pegarlas?
Directamente pon todo el código, incluyendo las definiciones que hagas al principio...


Título: Re: La serie mas larga?
Publicado por: LiLou en 15 Febrero 2011, 23:14 pm
Es que no quería "sobrecargar" el codigo y centrarme en lo importante, pero tienes razón, ahora que me leo no se entiende muy bien sin el resto.

Aquí esta todo:

Código
  1. #include <stdio.h>
  2. #define M 100
  3. void leer_e(int t[], int &n, int &e);
  4. bool u_s_o_d(int &n);
  5. void tratar_t(int t1[], int &n1, int t2[], int &n2);
  6. void resultado(int t[], int &n);
  7.  
  8. int main(){
  9.  
  10.    int t1[M], t2[M];  //t1 = serie actual, t2 = serie mas larga
  11.    int n1, n2=0;     //longitud de las series (n1 se inicializa dentro de la accion leer_e)
  12.    int x;            //lector
  13.  
  14.    printf("Intro. serie de enters acabada en 0:\n");
  15.    scanf("%d", &x);     //inicializacion del primer entero
  16.    leer_e(t1, n1, x);   //inicializacion de la 1a serie
  17.    while(!u_s_o_d(n1)){  //ultima serie ordenada decrec.  
  18.                        tratar_t(t1, n1, t2, n2);
  19.                        leer_e(t1, n1, x);
  20.                        }
  21.    resultado(t2, n2);    
  22.  
  23.    return 0;
  24. }
  25.  
  26. void leer_e(int t[], int &n, int &e){
  27.  
  28.     int i=0;
  29.     n=0;
  30.     while(t[i]<=e || e!=0){
  31.                    t[i]=e;
  32.                    scanf("%d", &e);
  33.                    i++;
  34.     }
  35.     n=i;      //longitud de t1
  36.     printf("%d", n); //para comprobar que valor tiene n
  37. }
  38.  
  39. bool u_s_o_d(int &n){
  40.  
  41.     return(n==0);    
  42. }
  43.  
  44.  
  45. void tratar_t(int t1[], int &n1, int t2[], int &n2){
  46.  
  47.     int i, j;    
  48.  
  49.     if(n1>n2){
  50.               j=0;              
  51.               for(i=0; i<=n1; i++){
  52.                              t1[i]=t2[j];
  53.                              j++;
  54.                              }
  55.               n2=j;              
  56.     }
  57.     //else no hacer nada, la serie mas larga es la ultima t2
  58.  
  59. }
  60.  
  61. void resultado(int t[], int &n){
  62.  
  63.     int i;
  64.  
  65.     printf("\nSerie mes larga: %d\n", n);
  66.     for(i=0; i<n; i++) printf("%d ", t[i]);
  67.     putchar('\n');
  68. }  
  69.  
  70.  

Ejecutadlo para que veáis vosotros mismos cual es el resultado.

Un saludo.

Edit:

Rectifico, en la funcion u_s_o_d, el parametro no es el lector x, sino n1.