問題4の答え

上から順に条件判断して、過不足無く尽くしていれば正解です。
 real(kind=double) :: a, b, c
 real(kind=double) :: x1, x2, d
 
 print *, "### a x^2 + b x + c = 0 ###"
 print *, "a = ?"
 read *, a
 print *, "b = ?"
 read *, b
 print *, "c = ?"
 read *, c

 if (a==0.0d0) then
    print *, "1-ji houtei-siki ", b,"x +",c,"= 0"
    if (b==0.0d0) then
       if (c==0.0d0) then
          print *, " 'x' ha nin-i."
       else
          print *, " kai nashi."
       end if
    else
       x1 = -c/b
       print *, " kai = ", x1
    end if
 else
    d = b**2 - 4.0d0*a*c
    if (d==0.0d0) then
       x1 = b/(2.0d0*a)
       print *, " juukai = ", x1
    else if (d > 0.0d0) then
       x1 = ( -b+sqrt(d) )/( 2.0d0*a )
       x2 = ( -b-sqrt(d) )/( 2.0d0*a )
       print *, " kai1 =", x1
       print *, " kai2 =", x2
    else
       x1 = ( -b )/( 2.0d0*a )        ! real part
       x2 = ( sqrt(-d) )/( 2.0d0*a )  ! imaginary part
       print *, " kai1 =", cmplx(x1, x2,kind=double)
       print *, " kai2 =", cmplx(x1,-x2,kind=double)
    end if
 end if
長いですね。
でも、数学的な内容は高校レベルですよ。

最初のif文は、変数の値がゼロの場合を処理しています。
ゼロ割り(DIVISION BY ZERO)
は手計算でも遭遇する典型的なエラーですが、 プログラミングの場合も十分に注意する必要があります。
割り算には気をつける。基本ですね。
また条件の設定が甘いと
NaN
となる場合があります。『NaN』というのは「Not a Number」(非数)という意味で、 何かおかしな計算が行われた事を示しています。
今の場合『sqrt(-1.0d0)』が「実数の範囲で値を持たない」ため『NaN』になります。
「複素数の範囲では」きちんと値を持ちます。かっこの中の「型」が重要なのです。

他にもプログラミングに特有のエラー(数値的な誤差)、というのもあって、 そこまで考慮に入れるとこのプログラムも完璧とは言えません。
ただ、少し深い知識が必要で難しいので、それについては別の機会に。