Programación General > Visual Basic para principiantes
qbasic
(1/1)
nicob:
quien me puede corregir la siguiente codificacion?
lo q quiero lograr es comparar la igualdad de una variable de archivo del tipo alfanumerico 1.001.000 conotra ingresasda por teclado con un input del mismo tipo, para saber si son iguales o si ya existe en el archivo.
les adjunto mi codificacion sepan entender que soy nuevo en esto.'SCREEN 12
'LINE (1, 1)-(1000, 100), 15, BF
'COLOR 5
LOCATE 4, 30: PRINT "BIENVENIDOS A SU SISTEMA"
OPEN "c:qbasicfinalcuenta.txt" FOR RANDOM AS #1 LEN = 36
FIELD #1, 8 AS ccuenta$, 20 AS dcuenta$, 4 AS pini$, 4 AS pfin$
CLS
DO
x = LOF(1) / 36
DO
LOCATE 8, 1: INPUT "Ingrese c para cargar o s para salir: ", sal$
IF UCASE$(sal$) = "C" OR UCASE$(sal$) = "S" THEN
EXIT DO
ELSE
LOCATE 8, 1: PRINT " "
LOCATE 9, 1: PRINT "codigo erroneo ingresa bien dolobu"
SLEEP 2
LOCATE 9, 1: PRINT " "
END IF
LOOP
IF UCASE$(sal$) = "S" THEN
PRINT "gracias por su visita"
EXIT DO
ELSE
DO
LOCATE 10, 1: INPUT "Ingrese cod. Cuenta: ", pccuenta$
IF VAL(pccuenta$) = 0 THEN
PRINT "el codigo debe ser distinto de cero"
ELSE
EXIT DO
END IF
LOOP
FOR h = 1 TO x
GET #1, h
'x = LOF(1) / 36
pflia = VAL(MID$(pccuenta$, 1, 1))
ppadres = VAL(MID$(pccuenta$, 3, 2))
phijo = VAL(MID$(pccuenta$, 6, 3))
flia = VAL(MID$(ccuenta$, 1, 1))
padres = VAL(MID$(ccuenta$, 3, 2))
hijo = VAL(MID$(ccuenta$, 6, 3))
IF pflia = flia THEN
'PRINT "codigo exitente"
'SLEEP 2
'CLS
IF ppadres = padres THEN
IF phijo = hijo THEN
PRINT "codigo existente"
SLEEP 2
CLS
INPUT "ingrese cod cuenta: ", pccuenta$
END IF
END IF
ELSE
'EXIT DO
END IF
NEXT
LOCATE 11, 1: INPUT "Ingrese desc. cuenta: ", pdcuenta$
'LOCATE 12, 1: INPUT "Ingrese numero de cuenta: ", pcta$
DO
LOCATE 13, 1: INPUT "Ingrese g para grabar o c para cancelar: ", can$
IF UCASE$(can$) = "G" OR UCASE$(can$) = "C" THEN
EXIT DO
END IF
LOOP
IF UCASE$(can$) = "G" THEN
x = x + 1
LSET ccuenta$ = pccuenta$
LSET dcuenta$ = pdcuenta$
'LSET cta$ = pcta$
LSET pini$ = STR$(0)
LSET pfin$ = STR$(0)
PUT #1, x
LOCATE 14, 20: PRINT "los datos han sido guardados"
SLEEP 2
ELSE
LOCATE 14, 20: PRINT "los datos no han sido guardados"
SLEEP 2
END IF
END IF
CLS
LOOP
'RUN "c:qbasicmetpuntmenu.bas"
--- Código: Visual Basic ---
Nebire:
puedes poner unos datos del fichero: c:qbasicfinalcuenta.txt ?
De entrada lo que veo es que en el interior del bucle for...next no deja opciones.. Miremos los condicionales dentro del bucle
--- Código: Visual Basic --- IF pflia = flia THEN 'PRINT "codigo exitente" 'SLEEP 2 'CLS IF ppadres = padres THEN IF phijo = hijo THEN PRINT "codigo existente" SLEEP 2 CLS INPUT "ingrese cod cuenta: ", pccuenta$ END IF END IFELSE 'EXIT DOEND IF El 'exit do' está comentado, y los otros if anidados no ofrecen alternativas, por lo que los 3 if podrían suplirse como un 'if1 and if 2 and if3 luego'.
Otra cosa que veo, es que señalas que quieres comparar cadenas, pero parece ser que Pflia, flia, Ppadres, padres, Phijos e hijos son variables numéricas ( pués hiciste asignación sobre ellas Val(..)).
Por lo demás, los bucles do..loop puedes condicionarlos con un while, no realizar luego dentro una instrucción a propósito para salir del bucle.
Para hacerte una corrección exhaustiva conviene que detalles cual es el propósito del programa para ver qué, no corresponde con ello.
...Básicamente es correcto, quizás en vez de field, yo usaría una estructura.. así, resulta más intuitivo qué son esas variables...
--- Código: Visual Basic ---Type Registro Cuenta as string * 8 dCuenta as string * 20 pIni as string * 4 pFin as string * 4end typedim elReg as registroconst LargoReg= 36 ' 8+20+4+4' utilizando una estructura en vez de field, al hacer get debes indicar el destino (o el origen al hacer put)get #1, h,elReg
También te recomiendo usar la instrucción freefile para referirte a los ficheros:
--- Código: Visual Basic ---dim ff as integerff= freefile open ruta for random as #ff len=largoRegget #ff,1,elReg...close #ff Usando freefile, puedes abrir varios archivos sin tener que recordar qué número le toca, resulta más dinámico, puedes abrir y cerrar, volver a abrir, etc... como usas una variable, no tienes que preocuparte del número de canal...
Si el tamaño del archivo es dependiente del tamaño de registro tus bucles pueden basarse en eof en vez de calcular el número de registros
--- Código: Visual Basic ---' en vez de esto:x = LOF(1) / 36for k= 1 to x get #1,k if pFin$="Hola" then ... ' accionesnext puedes usarlo así:do while not EOF(ff) get #ff,,elReg if elReg.pFin= "Hola" then .... ' accionesLoop
Navegación
Ir a la versión completa