La serie mas larga?

Iniciado por LiLou, 15 Febrero 2011, 19:13 PM

0 Miembros y 1 Visitante están viendo este tema.

LiLou

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):

int main(){
   
    int t1[M], t2[M];  //t1 = serie actual, t2 = serie mas larga
    int n1, n2=0;     //longitud de las series (n1 se inicializa dentro de la accion leer_e)
    int x;            //lector
   
    printf("Intro. serie de enters acabada en 0:\n");
    scanf("%d", &x);     //inicializacion del primer entero
    leer_e(t1, n1, x);   //inicializacion de la 1a serie
    while(!u_s_o_d(x)){  //ultima serie ordenada decrec. 
                        tratar_t(t1, n1, t2, n2);
                        leer_e(t1, n1, x);
                        }
    resultado(t2, n2);   
   
    return 0;
}


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í:
void tratar_t(int t1[], int &n1, int t2[], int &n2){
     
     int i, j;     
     
     if(n1>n2){
               j=0;               
               for(i=0; i<=n1; i++){
                              t1[i]=t2[j];
                              j++;
                              }
               n2=j;               
     }
     //else no hacer nada, la serie mas larga es la ultima t2
   
}


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.

N0body

#1
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...

LiLou

#2
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:

#include <stdio.h>
#define M 100
void leer_e(int t[], int &n, int &e);
bool u_s_o_d(int &n);
void tratar_t(int t1[], int &n1, int t2[], int &n2);
void resultado(int t[], int &n);

int main(){

   int t1[M], t2[M];  //t1 = serie actual, t2 = serie mas larga
   int n1, n2=0;     //longitud de las series (n1 se inicializa dentro de la accion leer_e)
   int x;            //lector

   printf("Intro. serie de enters acabada en 0:\n");
   scanf("%d", &x);     //inicializacion del primer entero
   leer_e(t1, n1, x);   //inicializacion de la 1a serie
   while(!u_s_o_d(n1)){  //ultima serie ordenada decrec.  
                       tratar_t(t1, n1, t2, n2);
                       leer_e(t1, n1, x);
                       }
   resultado(t2, n2);    

   return 0;
}

void leer_e(int t[], int &n, int &e){
   
    int i=0;
    n=0;
    while(t[i]<=e || e!=0){
                   t[i]=e;
                   scanf("%d", &e);
                   i++;
    }
    n=i;      //longitud de t1
    printf("%d", n); //para comprobar que valor tiene n
}

bool u_s_o_d(int &n){
   
    return(n==0);    
}


void tratar_t(int t1[], int &n1, int t2[], int &n2){

    int i, j;    

    if(n1>n2){
              j=0;              
              for(i=0; i<=n1; i++){
                             t1[i]=t2[j];
                             j++;
                             }
              n2=j;              
    }
    //else no hacer nada, la serie mas larga es la ultima t2

}

void resultado(int t[], int &n){
   
    int i;
   
    printf("\nSerie mes larga: %d\n", n);
    for(i=0; i<n; i++) printf("%d ", t[i]);
    putchar('\n');
}  



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.