Resultados 1 al 3 de 3

ayuda en QBASIC

  1. #1 ayuda en QBASIC 
    Iniciado
    Fecha de ingreso
    May 2009
    Mensajes
    2
    Descargas
    0
    Uploads
    0
    Hola a todos, estoy creando un algoritmo que permita asignar a la diagonal de una matriz cuadrada la sgte serie de números primos...

    |2 0 0 0 |
    |0 3 0 0 |
    |0 0 5 0 |
    |0 0 0 7 ..|

    Y esto tengo, pero al ejecutarlo me resulta la matriz sólo con 0.
    PD: No importa que la matriz no quede como asi como la escribi antes, tengo claro que en el programa saldrá

    2
    0
    0
    0
    3
    0
    0
    0
    5 (Si fuera de 3x3 la matrz)

    CLS
    '$DYNAMIC
    DIM A(1, 1) AS DOUBLE
    DIM B(1) AS DOUBLE
    INPUT "INGRESE ORDEN DE MATRIZ N"; N
    REDIM A(N, N)
    REDIM B(N)
    I = 2
    L = 1
    WHILE L < N
    Z = Y
    J = 2
    WHILE J < I
    X = I MOD J
    IF X = 0 THEN
    Z = W
    END IF
    J = J + 1
    WEND
    IF Z = Y THEN
    I = B(I)
    L = L + 1
    END IF
    I = I + 1
    WEND
    FOR I = 1 TO N
    FOR J = 1 TO N
    IF I = J THEN
    A(I, J) = B(I)
    ELSE
    A(I, J) = 0
    END IF
    NEXT J
    NEXT I
    FOR I = 1 TO N
    FOR J = 1 TO N
    PRINT A(I, J)
    NEXT J
    NEXT I
    Cuál es el error?
    Gracias a los que puedan ayudar
    Citar  
     

  2. #2  
    Moderador Global Avatar de hystd
    Fecha de ingreso
    Jul 2005
    Ubicación
    1, 11, 21, 1211...
    Mensajes
    1.596
    Descargas
    58
    Uploads
    0
    CLS
    '$DYNAMIC
    DIM A(1, 1) AS DOUBLE
    DIM B(1) AS DOUBLE
    INPUT "INGRESE ORDEN DE MATRIZ N"; N
    REDIM A(N, N)
    REDIM B(N)
    I = 2
    L = 1
    WHILE L < N
    Z = 0
    J = 2
    WHILE J < I
    X = I MOD J
    IF X = 0 THEN
    Z = 1
    END IF
    J = J + 1
    WEND
    IF Z = 0 THEN
    B(L) = I
    L = L + 1
    END IF
    I = I + 1
    WEND
    FOR I = 1 TO N
    FOR J = 1 TO N
    IF I = J THEN
    A(I, J) = B(I)
    ELSE
    A(I, J) = 0
    END IF
    NEXT J
    NEXT I
    FOR I = 1 TO N
    FOR J = 1 TO N
    PRINT A(I, J)
    NEXT J
    NEXT I
    Decir varias cosas...

    1º Con estos cambios te funciona.
    2º ¿Para que sirven las variables W e Y? Nunca llegas a utilizarlas
    3º No es nada eficiente, y para un N grande, la cosa va mal...
    4º Posibles mejoras:

    4.1º Añadir al segundo WHILE la condición de que si ya no es primo, no siga comprobando:
    ...
    WHILE J < I AND Z=0
    ...
    4.2º Evitar recorrer la matriz dos veces, una para meter los valores y otra para imprimirla. Es posible hacerlo todo en el mismo bucle:

    FOR I = 1 TO N
    FOR J = 1 TO N
    IF I = J THEN
    A(I, J) = B(I)
    ELSE
    A(I, J) = 0
    END IF
    PRINT A(I, J)
    NEXT J
    NEXT I
    4.3º (Y más importante). Intentar buscar otro algoritmo para la comprobación de números primos... El que utilizas se basa en comprobar si el número posee divisores (desde 1 hasta el propio número), y no es nada eficiente... Podrías comprobar por ejemplo, si el número es par o impar. En caso de que sea par (mayor que 2), ya sabemos que no es primo. Un número es par, si acaba en cifra par. En tu algoritmo puedes incluir que el bucle vaya contando de 2 en 2.

    Si estás interesado, echa un vistazo a google sobre tests de primalidad.

    Un saludo.
    Última edición por hystd; 18-05-2009 a las 03:56
    El optimista tiene ideas, el pesimista... excusas

    Citar  
     

  3. #3  
    Iniciado
    Fecha de ingreso
    May 2009
    Mensajes
    2
    Descargas
    0
    Uploads
    0
    Probé con el primer cambio que hiciste y funciono !
    Y también le corregí algo...

    CLS
    '$DYNAMIC
    DIM A(1, 1) AS DOUBLE
    DIM B(1) AS DOUBLE
    INPUT "INGRESE ORDEN DE MATRIZ N"; N
    REDIM A(N, N)
    REDIM B(N)
    I = 2
    L = 1
    WHILE L <= N
    Z = 0
    J = 2
    WHILE J < I
    X = I MOD J
    IF X = 0 THEN
    Z = 1
    END IF
    J = J + 1
    WEND
    IF Z = 0 THEN
    B(L) = I
    L = L + 1
    END IF
    I = I + 1
    WEND
    FOR I = 1 TO N
    FOR J = 1 TO N
    IF I = J THEN
    A(I, J) = B(I)
    ELSE
    A(I, J) = 0
    END IF
    NEXT J
    NEXT I
    FOR I = 1 TO N
    FOR J = 1 TO N
    PRINT A(I, J)
    NEXT J
    NEXT I
    1º Sin el =, dejaba el último número de la diagonal en 0.
    2º Las variables W e Y las tengo de un ejercicio anterior, pero era la idea vaga que tenia.
    3º Sé que no es eficiente, para un número grande, pero en este curso te evaluan si se ejecuta correctamente o no, aunque entre nos sabemos que no resulta eficiente para N muy grandes :P
    4º Las mejoras las probaré ahora y te digo :P
    5º Comprobado con las mejoras! :P

    PD: Muchisimas gracias por darte el tiempo de corregirlo!
    Última edición por jbarr90; 18-05-2009 a las 04:13
    Citar  
     

Temas similares

  1. Necesito ayuda para un programa en QBASIC
    Por Senohiper en el foro PROGRAMACION DESKTOP
    Respuestas: 2
    Último mensaje: 08-04-2009, 17:51
  2. Ayuda!! con qbasic
    Por ivanuhry en el foro GENERAL
    Respuestas: 5
    Último mensaje: 05-04-2009, 20:53
  3. Variables en qbasic
    Por Cypress en el foro PROGRAMACION DESKTOP
    Respuestas: 12
    Último mensaje: 18-10-2006, 21:05
  4. qbasic
    Por gellidyuz en el foro PROGRAMACION DESKTOP
    Respuestas: 1
    Último mensaje: 05-03-2006, 21:53
  5. Qbasic
    Por cristup en el foro PROGRAMACION DESKTOP
    Respuestas: 4
    Último mensaje: 23-10-2002, 21:46

Marcadores

Marcadores