Menu

Permitir definir la salida de un subproceso como arreglo

2015-04-28
2015-05-05
  • Compsystems

    Compsystems - 2015-04-28

    Biblioteca de operaciones en el campo delos números complejos

    La siguiente biblioteca, solo contiene la función suma de números complejos (próximamente mas operadores aritméticos sobre C),

    me idee la forma de operar números complejos como arreglos, pero la arquitectura actual de PSEIT solo permite que la variable de salida sea un numero y no un arreglo de números, mi sugerencia es que PSEINT soporte este tipo de datos en la salida de un subproceso.

    SubProceso suma_ = sumaNComplejos( numComplejo1 por referencia, numComplejo2 por referencia )
    dimension suma_[2]
    definir suma_ como real
    definir parteReal_ como real
    definir parteImaginaria_ como real
    parteReal_ = numComplejo1[1] + numComplejo2[1]
    //imprimir parteReal_
    parteImaginaria_ = numComplejo1[2] + numComplejo2[2]
    //imprimir parteImaginaria_

    suma_[1] = parteReal_
    suma_[2] = parteImaginaria_
    // a+bi + c+di = (a+c) + (b+d)*i //
    
    imprimir "la suma es ", ConvertirATexto(suma_[1]), "+", ConvertirATexto(suma_[2]), "*i"
    

    Fin SubProceso

    Proceso tipodedato_numerocomplejo
    Dimension numComplejo1[2];
    Definir numComplejo1 Como Real;

    Dimension numComplejo2[2];
    Definir numComplejo2 Como Real
    
    Dimension numComplejo3[2];
    Definir numComplejo3 Como Real
    
    imprimir "ingrese el primer numero complejo, parte real"
    leer  numComplejo1[1]
    
    imprimir "ingrese el primer numero complejo, parte imaginaria"
    leer  numComplejo1[2]
    
    imprimir "el numero complejo es ", ConvertirATexto(numComplejo1[1]), "+", ConvertirATexto(numComplejo1[2]), "*i"
    
    imprimir ""
    imprimir "ingrese el segundo numero complejo, parte real"
    leer  numComplejo2[1]
    
    imprimir "ingrese el segundo numero complejo, parte imaginaria"
    leer  numComplejo2[2]
    
    imprimir "el numero complejo es ", ConvertirATexto(numComplejo1[1]), "+", ConvertirATexto(numComplejo1[2]), "*i"
    imprimir ""
    
    imprimir sumaNComplejos(numComplejo1, numComplejo2)
    

    FinProceso

    Gracias por el desarrollo de PSEINT

     
  • Compsystems

    Compsystems - 2015-04-28
    • Agregados resta y multiplicación de números complejos

    SubProceso expresion_nc <- imprimir_numComplejo( numComplejo1 por referencia )
    Definir expresion_nc Como cadena;
    expresion_nc = ConvertirATexto(numComplejo1[1])

    Si numComplejo1[2] <> 0 Entonces
        Si numComplejo1[2] > 0 Entonces
            expresion_nc = expresion_nc+"+"+ConvertirATexto(numComplejo1[2])+"*i"
        sino 
            expresion_nc = expresion_nc+ConvertirATexto(numComplejo1[2])+"*i"
        FinSi
    Fin Si
    

    Fin SubProceso

    SubProceso suma_ = suma_NComplejos( numComplejo1 por referencia, numComplejo2 por referencia )
    dimension suma_[2]
    definir suma_ como real
    definir parteReal_ como real
    definir parteImaginaria_ como real
    parteReal_ = numComplejo1[1] + numComplejo2[1]
    //imprimir parteReal_
    parteImaginaria_ = numComplejo1[2] + numComplejo2[2]
    //imprimir parteImaginaria_

    suma_[1] = parteReal_
    suma_[2] = parteImaginaria_
    // (a+bi) + (c+di) = (a+c) + (b+d)*i //
    
    imprimir "la suma es ", imprimir_numComplejo(suma_)
    

    Fin SubProceso

    SubProceso resta_ = resta_NComplejos( numComplejo1 por referencia, numComplejo2 por referencia )
    dimension resta_[2]
    definir resta_ como real
    definir parteReal_ como real
    definir parteImaginaria_ como real
    parteReal_ = numComplejo1[1] - numComplejo2[1]
    //imprimir parteReal_
    parteImaginaria_ = numComplejo1[2] - numComplejo2[2]
    //imprimir parteImaginaria_

    resta_[1] = parteReal_
    resta_[2] = parteImaginaria_
    // (a+bi) - (c+di) = (a+c) + (b+d)*i //
    
    imprimir "la resta es ", imprimir_numComplejo(resta_)
    

    Fin SubProceso

    SubProceso multiplicacion_ = multiplicacion_NComplejos( numComplejo1 por referencia, numComplejo2 por referencia )
    dimension multiplicacion_[2]
    definir multiplicacion_ como real
    definir parteReal_ como real
    definir parteImaginaria_ como real
    parteReal_ = (numComplejo1[1] * numComplejo2[1]) - (numComplejo1[2] * numComplejo2[2])
    //imprimir parteReal_
    parteImaginaria_ = (numComplejo1[1] * numComplejo2[2]) + (numComplejo1[2] * numComplejo2[1])
    //imprimir parteImaginaria_

    multiplicacion_[1] = parteReal_
    multiplicacion_[2] = parteImaginaria_
    // (a+bi) * (c+di) { ( ac ) - ( bd ), ( ( ad ) + ( b*c ) ) }
    
    imprimir "la multiplicacion es ", imprimir_numComplejo( multiplicacion_ )
    

    Fin SubProceso

    Proceso tipodedato_numerocomplejo
    Dimension numComplejo1[2];
    Definir numComplejo1 Como Real;

    Dimension numComplejo2[2];
    Definir numComplejo2 Como Real
    
    Dimension numComplejo3[2];
    Definir numComplejo3 Como Real
    
    imprimir "ingrese el primer numero complejo, parte real"
    leer  numComplejo1[1]
    
    imprimir "ingrese el primer numero complejo, parte imaginaria"
    leer  numComplejo1[2]
    
    imprimir "el numero complejo es ", imprimir_numComplejo(numComplejo1)
    imprimir ""
    imprimir "ingrese el segundo numero complejo, parte real"
    leer  numComplejo2[1]
    
    imprimir "ingrese el segundo numero complejo, parte imaginaria"
    leer  numComplejo2[2]
    
    imprimir "el numero complejo es ", imprimir_numComplejo(numComplejo2)
    imprimir ""
    
    imprimir suma_NComplejos( numComplejo1, numComplejo2 )
    imprimir resta_NComplejos( numComplejo1, numComplejo2 )
    imprimir multiplicacion_NComplejos( numComplejo1, numComplejo2 )
    

    FinProceso

     
  • Compsystems

    Compsystems - 2015-04-30

    // Biblioteca de operaciones aritmeticas en el campo de los números complejos
    // version 0.0.5 actualizacion Abril 30 2015 Por Compsystems

    SubProceso negativo_ <- negativo_NComplejo( numComplejo1 por referencia )
    dimension negativo_[2]
    definir negativo_ como real
    definir parteReal_ como real
    definir parteImaginaria_ como real
    parteReal_ = -numComplejo1[1]
    //imprimir parteReal_
    parteImaginaria_ = -numComplejo1[2]
    negativo_[1] = parteReal_
    negativo_[2] = parteImaginaria_
    // -(a+bi) = -a + -b*i //

    Fin SubProceso

    SubProceso expresion_nc <- imprimir_numComplejo( numComplejo1 por referencia )
    Definir expresion_nc Como cadena;
    definir a,b como real
    a = numComplejo1[1]
    b = numComplejo1[2]

    Si a = 0 Entonces
        expresion_nc = "0"
    Sino
        expresion_nc = ConvertirATexto(a)
    Fin Si
    
    Si b <> 0 Entonces
        Si b > 0 Entonces
            Si b = 1 Entonces
                expresion_nc = expresion_nc+"+"+ConvertirATexto(b)+"*i"
            Sino
                expresion_nc = expresion_nc+"+"+ConvertirATexto(b)+"*i"
            Fin Si
    
        sino 
            expresion_nc = expresion_nc+ConvertirATexto(b)+"*i"
        FinSi
    Sino
        expresion_nc = expresion_nc+"+0*i"
    Fin Si
    

    Fin SubProceso

    SubProceso suma_ = suma_NComplejos( numComplejo1 por referencia, numComplejo2 por referencia )
    dimension suma_[2]
    definir suma_ como real
    definir parteReal_ como real
    definir parteImaginaria_ como real
    definir a,b,c,d como real
    a = numComplejo1[1]
    b = numComplejo1[2]
    c = numComplejo2[1]
    d = numComplejo2[2]

    parteReal_ = a+c
    //imprimir parteReal_
    parteImaginaria_ = b+d
    //imprimir parteImaginaria_
    
    suma_[1] = parteReal_
    suma_[2] = parteImaginaria_
    // (a+bi) + (c+di) = (a+c) + (b+d)*i //
    
    imprimir "la suma es igual a: ", imprimir_numComplejo(suma_)
    

    Fin SubProceso

    SubProceso resta_ = resta_NComplejos( numComplejo1 por referencia, numComplejo2 por referencia )
    dimension resta_[2]
    definir resta_ como real
    definir parteReal_ como real
    definir parteImaginaria_ como real
    definir a,b,c,d como real
    a = numComplejo1[1]
    b = numComplejo1[2]
    c = numComplejo2[1]
    d = numComplejo2[2]

    parteReal_ = a-c
    //imprimir parteReal_
    parteImaginaria_ = b-d
    //imprimir parteImaginaria_
    
    resta_[1] = parteReal_
    resta_[2] = parteImaginaria_
    // (a+bi) - (c+di) = (a-c) + (b-d)*i
    
    imprimir "la resta es igual a: ", imprimir_numComplejo(resta_)
    

    Fin SubProceso

    SubProceso multiplicacion_ = multiplicacion_NComplejos( numComplejo1 por referencia, numComplejo2 por referencia )
    dimension multiplicacion_[2]
    definir multiplicacion_ como real
    definir parteReal_ como real
    definir parteImaginaria_ como real
    definir a,b,c,d como real
    a = numComplejo1[1]
    b = numComplejo1[2]
    c = numComplejo2[1]
    d = numComplejo2[2]

    parteReal_ = a*c  -  b*d
    //imprimir parteReal_
    parteImaginaria_ =  a*d  +  b*c 
    //imprimir parteImaginaria_
    
    multiplicacion_[1] = parteReal_
    multiplicacion_[2] = parteImaginaria_
    // (a+bi) * (c+di) = ( a*c  -  b*d ) +  ( a*d  +  b*c )*i
    
    imprimir "la multiplicacion es igual a: ", imprimir_numComplejo( multiplicacion_ )
    

    Fin SubProceso

    SubProceso divicion_ = divicion_NComplejos( numComplejo1 por referencia, numComplejo2 por referencia )
    dimension divicion_[2]
    definir divicion_ como real
    definir parteReal_ como real
    definir parteImaginaria_ como real
    definir denominador_ como real
    definir a,b,c,d como real
    a = numComplejo1[1]
    b = numComplejo1[2]
    c = numComplejo2[1]
    d = numComplejo2[2]

    denominador_ = (c*c  +  d*d)
    parteReal_ = (a*c  +  b*d)/denominador_
    //imprimir parteReal_
    parteImaginaria_ =  (b*c  - a*d)/denominador_
    //imprimir parteImaginaria_
    
    divicion_[1] = parteReal_
    divicion_[2] = parteImaginaria_
    // (a+bi) / (c+di) = (a*c  +  b*d)/(c*c  +  d*d) +  ( (b*c  - a*d)/(c*c  +  d*d) )*i
    
    imprimir "la divicion es ", imprimir_numComplejo( divicion_ )
    

    Fin SubProceso

    SubProceso potenciacion_ = potenciacion_NComplejos( numComplejo1 por referencia, exponente_ )
    dimension potenciacion_[2]
    definir potenciacion_ como real
    definir parteReal_ como real
    definir parteImaginaria_ como real
    definir a,b, mult como real
    a = numComplejo1[1]
    b = numComplejo1[2]
    mult = 1

    Si exponente_ > 1 Entonces
        Para cont=1 Hasta exponente_ Hacer
            mult_ = mult * numComplejo1
        Fin Para
    Sino
    
    Fin Si
    
    imprimir "la potenciacion es igual a: ", imprimir_numComplejo( potenciacion_ )
    

    Fin SubProceso

    Proceso ejemplos_tipodedato_numerocomplejo
    Dimension numComplejo1[2];
    Definir numComplejo1 Como Real;

    Dimension numComplejo2[2];
    Definir numComplejo2 Como Real
    
    Dimension numComplejo3[2];
    Definir numComplejo3 Como Real
    
    imprimir "ingrese el primer numero complejo, parte real"
    leer  numComplejo1[1]
    
    imprimir "ingrese el primer numero complejo, parte imaginaria"
    leer  numComplejo1[2]
    
    imprimir "el numero complejo es ", imprimir_numComplejo(numComplejo1)
    imprimir ""
    imprimir "ingrese el segundo numero complejo, parte real"
    leer  numComplejo2[1]
    
    imprimir "ingrese el segundo numero complejo, parte imaginaria"
    leer  numComplejo2[2]
    
    imprimir "el numero complejo es ", imprimir_numComplejo(numComplejo2)
    imprimir ""
    
    imprimir suma_NComplejos( numComplejo1, numComplejo2 )
    imprimir resta_NComplejos( numComplejo1, numComplejo2 )
    imprimir multiplicacion_NComplejos( numComplejo1, numComplejo2 )
    imprimir divicion_NComplejos( numComplejo1, numComplejo2 )
    imprimir negativo_NComplejo( numComplejo1 )
    

    FinProceso

    //ingrese el primer numero complejo, parte real
    //> 3
    //ingrese el primer numero complejo, parte imaginaria
    //> 4
    //el numero complejo es 3+4i
    //
    //ingrese el segundo numero complejo, parte real
    //> 5
    //ingrese el segundo numero complejo, parte imaginaria
    //> 6
    //el numero complejo es 5+6
    i
    //
    //la suma es 8+10*i

    //la resta es -2-2*i

    //la multiplicacion es -9+38*i

     
  • Compsystems

    Compsystems - 2015-05-05

    En el foro de QBASIC64 encontré un biblo de Ns complejos, que fácil seria portarla si PSEINT soportara registros

    Fuente
    http://www.qb64.net/forum/index.php?topic=12557.0

    TYPE CNum
    real AS SINGLE
    imaginary AS SINGLE
    END TYPE
    SUB AddC (Result AS CNum, Ex1 AS CNum, Ex2 AS CNum)
    Result.real = Ex1.real + Ex2.real
    Result.imaginary = Ex1.imaginary + Ex2.imaginary
    END SUB
    SUB SubC (Result AS CNum, Ex1 AS CNum, Ex2 AS CNum)
    Result.real = Ex1.real - Ex2.real
    Result.imaginary = Ex1.imaginary - Ex2.imaginary
    END SUB
    SUB MulC (Result AS CNum, Ex1 AS CNum, Ex2 AS CNum)
    Result.real = Ex1.real * Ex2.real - Ex1.imaginary * Ex2.imaginary
    Result.imaginary = Ex1.real * Ex2.imaginary + Ex1.imaginary * Ex2.real
    END SUB
    SUB DivC (Result AS CNum, Ex1 AS CNum, Ex2 AS CNum)
    Result.real = (Ex1.real * Ex2.real + Ex1.imaginary * Ex2.imaginary) / (Ex2.real * Ex2.real * Ex2.imaginary * Ex2.imaginary)
    Result.imaginary = (Ex1.imaginary * Ex2.real - Ex1.real * Ex2.imaginary) / (Ex2.real ^ 2 + Ex2.imaginary ^ 2)
    END SUB
    SUB ExpC (Result AS CNum, Ex1 AS CNum, Expn)
    xp = INT(Expn)
    Result.real = 1
    Result.imaginary = 0
    IF xp <> Expn THEN
    IF xp > Expn THEN xp = xp - 1
    dec = Expn - xp
    whl = Expn - dec
    DIM test(1 TO 2) AS CNum
    ExpC test(1), Ex1, whl
    NrtC test(2), Ex1, 1 / dec
    MulC Result, test(1), test(2)
    EXIT SUB
    END IF
    IF xp > 0 THEN
    FOR x = 1 TO xp
    MulC Result, Result, Ex1
    NEXT x
    ELSEIF xp < 0 THEN
    FOR x = 1 TO ABS(xp)
    DivC Result, Result, Ex1
    NEXT x
    END IF
    END SUB
    SUB SqrC (result AS CNum, Ex1 AS CNum)
    result.real = SQR((Ex1.real + SQR(Ex1.real ^ 2 + Ex1.imaginary ^ 2)) / 2)
    result.imaginary = SGN(Ex1.imaginary) * SQR((-Ex1.real + SQR(Ex1.real ^ 2 + Ex1.imaginary ^ 2)) / 2)
    END SUB
    SUB NrtC (Result AS CNum, Ex1 AS CNum, root)
    DIM test(1 TO 2) AS CNum
    test(1).real = AbsC(Ex1) ^ (1 / root)
    test(1).imaginary = 0
    test(2).real = COS(ArgC(Ex1) / root)
    test(2).imaginary = SIN(ArgC(Ex1) / root)
    MulC Result, test(1), test(2)
    END SUB
    SUB ConC (Result AS CNum, Ex1 AS CNum)
    Result.real = Ex1.real
    Result.imaginary = -Ex1.imaginary
    END SUB
    FUNCTION AbsC (Ex1 AS CNum)
    AbsC = SQR(Ex1.real ^ 2 + Ex1.imaginary ^ 2)
    END FUNCTION
    FUNCTION ArgC (Ex1 AS CNum)
    IF Ex1.real > 0 THEN ArgC = ATN(Ex1.imaginary / Ex1.real)
    IF Ex1.real < 0 THEN IF Ex1.imaginary >= 0 THEN ArgC = ATN(Ex1.imaginary / Ex1.real) + _PI ELSE ArgC = ATN(Ex1.imaginary / Ex1.real) - _PI
    IF Ex1.real = 0 THEN IF Ex1.imaginary = 0 THEN EXIT SUB ELSE ArgC = SGN(Ex1.real) * _PI / 2
    END FUNCTION
    SUB LogC (Result AS CNum, Ex1 AS CNum)
    Result.real = LOG(AbsC(Ex1))
    Result.imaginary = ArgC(Ex1)
    END SUB
    SUB Str2CNum (Result AS CNum, Numb AS STRING)
    num$ = LCASE$(Freechar$(Numb, 32))
    x = INSTR(num$, "+")
    y = INSTR(num$, "i")
    IF x = 0 THEN
    IF y = 0 THEN
    Result.real = VAL(num$)
    Result.imaginary = 0
    ELSE
    num$ = Freechar$(num$, 105)
    Result.real = 0
    Result.imaginary = VAL(num$)
    END IF
    ELSE
    num$ = Freechar$(num$, 105)
    Result.real = VAL(MID$(num$, 1, x - 1))
    Result.imaginary = VAL(MID$(num$, x + 1, LEN(num$) - x))
    END IF
    END SUB
    FUNCTION CNum2Str$ (Ex1 AS CNum)
    IF Ex1.real <> 0 THEN real$ = STR$(Ex1.real) ELSE real$ = ""
    IF Ex1.imaginary <> 0 THEN IF Ex1.imaginary <> 1 THEN imaginary$ = STR$(Ex1.imaginary) + "i" ELSE imaginary$ = "i" ELSE imaginary$ = ""
    IF real$ <> "" AND imaginary$ <> "" THEN op$ = "+" ELSE op$ = ""
    CNum2Str$ = real$ + op$ + imaginary$
    END FUNCTION
    FUNCTION Freechar$ (Sentence$, Char)
    x$ = Sentence$
    DO UNTIL x = LEN(x$)
    x = x + 1
    IF MID$(x$, x, 1) = CHR$(Char) THEN
    x$ = MID$(x$, 1, x - 1) + MID$(x$, x + 1, LEN(x$) - x)
    x = x - 1
    END IF
    LOOP
    Freespace$ = x$
    END FUNCTION

     

Anonymous
Anonymous

Add attachments
Cancel





Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.