elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  La serie mas larga?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: La serie mas larga?  (Leído 2,267 veces)
LiLou

Desconectado Desconectado

Mensajes: 19


Ver Perfil
La serie mas larga?
« 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.
 


En línea

N0body

Desconectado Desconectado

Mensajes: 95


Ver Perfil
Re: La serie mas larga?
« Respuesta #1 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...


« Última modificación: 15 Febrero 2011, 21:20 pm por N0body » En línea

LiLou

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: La serie mas larga?
« Respuesta #2 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.
« Última modificación: 17 Febrero 2011, 11:03 am por LiLou » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
PELICULA LARGA
Multimedia
JS11 2 2,161 Último mensaje 1 Abril 2005, 06:59 am
por Songoku
grabar pelicula muy larga
Multimedia
charlymeec 2 3,270 Último mensaje 1 Marzo 2006, 14:22 pm
por charlymeec
Clave wep demasiado larga « 1 2 »
Hacking Wireless
chocho1 10 13,916 Último mensaje 24 Abril 2012, 22:33 pm
por TheInfinityJoker
El DNI electrónico ha muerto: ¡larga vida al DNI 3.0!
Noticias
wolfbcn 1 1,706 Último mensaje 3 Octubre 2013, 10:29 am
por crazykenny
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines