• Viernes 8 de Noviembre de 2024, 04:02

Autor Tema:  qbasic  (Leído 2203 veces)

nicob

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
qbasic
« en: Miércoles 25 de Noviembre de 2009, 00:29 »
0
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
  1.  

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: qbasic
« Respuesta #1 en: Jueves 26 de Noviembre de 2009, 00:06 »
0
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
  1.  
  2. IF pflia = flia THEN
  3.     'PRINT "codigo exitente"
  4.     'SLEEP 2
  5.     'CLS
  6.     IF ppadres = padres THEN
  7.         IF phijo = hijo THEN
  8.             PRINT "codigo existente"
  9.             SLEEP 2
  10.             CLS
  11.             INPUT "ingrese cod cuenta: ", pccuenta$
  12.         END IF
  13.     END IF
  14. ELSE
  15.   'EXIT DO
  16. END IF
  17.  
  18.  
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
  1. Type Registro
  2.      Cuenta as string  * 8
  3.      dCuenta as string * 20
  4.      pIni as string * 4
  5.      pFin as string * 4
  6. end type
  7. dim elReg as registro
  8. const LargoReg= 36 ' 8+20+4+4
  9. ' utilizando una estructura en vez de field, al hacer get debes indicar el destino (o el origen al hacer put)
  10. get #1, h,elReg
  11.  

También te recomiendo usar  la instrucción freefile para referirte a los ficheros:

Código: Visual Basic
  1. dim ff as integer
  2. ff= freefile
  3.  
  4. open ruta for random as #ff len=largoReg
  5. get #ff,1,elReg
  6. ...
  7. close #ff
  8.  
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
  1. ' en vez de esto:
  2. x = LOF(1) / 36
  3. for k= 1 to x
  4.     get #1,k
  5.     if pFin$="Hola" then ...
  6.    ' acciones
  7. next
  8.  
  9. puedes usarlo así:
  10. do while not EOF(ff)
  11.     get #ff,,elReg
  12.     if elReg.pFin= "Hola" then ....
  13.    ' acciones
  14. Loop
  15.  
«Ma non troppo»
----> ModoVacaciones = False<----