PDA

Ver la versión completa : ayuda en QBASIC



jbarr90
18-05-2009, 00:43
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 :)

hystd
18-05-2009, 02:44
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.

jbarr90
18-05-2009, 02:57
Probé con el primer cambio que hiciste y funciono :D!
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! :)