! f95 -I/usr/local/dislin/gf ec2grao_dislin.f90 -l dislin
! export LD_LIBRARY_PATH=/usr/local/dislin
! a.out

module comun ! para definir variables globais o programa
integer :: id_a, id_b, id_c, id_txt
end module comun

!----------------------------------------
program menu
use dislin
use comun
integer :: ip, ipv1, ipv2, iph, boton
external calcula

call swgtit ('Ecuacion de segundo grao')
call wgini('vert', ip) ! inicializa GUI
call wgbas(ip, 'hori', iph) ! pon contedor horizontal
call swgwth(10) ! pon anchura 
call wgbas(iph, 'vert', ipv1) ! pon contedor vertical
call wgltxt(ipv1, 'a:', '1', 80, id_a) ! pon widget para ler texto
call wgltxt(ipv1, 'b:', '1', 80, id_b) 
call wgltxt(ipv1, 'c:', '1', 80, id_c) 
call swgwth(40) ! pon anchura 
call wgbas(iph, 'vert', ipv2) ! pon contedor vertical
call wgpbut(ipv2,'Calcular', boton) ! pon un boton no GUI
call swgcbk(boton, calcula) ! conecta a pulsacion do boton con un subprograma
call wgstxt(ipv2, 2, 1, id_txt) ! cadro para mostrar texto
call wgfin ! para mostrar GUI
stop
end program menu

!---------------------------------------
subroutine calcula(id)
use comun
integer, intent(in) :: id
character(len=50) :: s

call gwgflt(id_a, a) ! lee o numero flotante da etiqueta de texto
call gwgflt(id_b, b)
call gwgflt(id_c, c)

! inserta a solución nunha cadea de caracteres
if(a==0) then
    if(b==0) then
        if(c==0) then
            s='Todo IR e solucion'
        else
            s='Non hai solucion'
        end if
    else
        write(s,'(a,f6.3)') 'x=', -c/b
    end if
else
    d=b*b-4*a*c;a2=2*a;rd=sqrt(abs(d))
    if(d<0) then
        write(s,'(a,f6.3,a,f6.3)') 'x=', -b/a2,' +- I*', rd/abs(a2)
    else if (d>0) then 
        write(s,'(a,f6.3,2a,f6.3)') 'x1=', (-b+rd)/a2,char(10),'x2=', (-b-rd)/a2
    else
		write(s,'(a,f6.3)') 'x1=x2=', -b/a2
    end if
end if
call swgtxt(id_txt,s)  ! mostra a solución no cadro de texto
return
end subroutine calcula
