{keine Verwendung von Funktionen (function), da sich mit Proceduren hier
 Vorteilhafter arbeiten läßt.}
uses crt; {Benutze aus Unit folgende Befehle:}
          {ClrScr;window;GotoXY;TextBackground;TextColor}
          {ReadKey;KeyPressed;}
          {Sound;Delay;NoSound}

{KompaktSchreibWeise der Komplexen Zahl}
type  komplex=record re,im:double;end;

{***************************************************************************}
{* PROCEDURE 1 *************** M E N U *************************************}
{***************************************************************************}
procedure MENU;                                              {Keine Rückgabe}
begin
 textbackground(LightGray);            {Hellgrauer GesamtHintergrund}
 window(1,1,80,25); clrscr;            {Erstellen des GesamtHintergrundes}
 textbackground(Brown);                {Braunes MenuFenster}
 window(7,1,74,15); clrscr;            {Erstellen des MenuFenster}
 textcolor(Yellow);                    {gelber Text}
 gotoxy(7,2);write('* Taschenrechner für Komplexe Zahlen (C)94 by Dave Sun*');
 gotoxy(6,3);write('ÄÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÄ');
 textcolor(LightGray);                 {Hellgrauer Text}
 window(26,5,76,14);                   {MenuFenster im MenuFenster erspart}
 writeln('EINGABE................--> "1"'); {gotoxy}
 writeln('ADDITION...............--> "2"');
 writeln('SUBTRAKTION............--> "3"');
 writeln('MULTIPLIKATION.........--> "4"');
 writeln('DIVISION...............--> "5"');
 writeln('BETRÄGE................--> "6"');
 writeln('PROGRAMMENDE...........--> "ESC"');
 textcolor(DarkGray);                  {DunkelGrauer Text}
 window(10,13,76,16);                  {MenuFenster im MenuFenster}
 writeln('Mit diesem Programm können Grundrechenarten mit zwei Komlexen');
 write('Zahlen ausgeführt werden. Wählen Sie mit den Tasten 1 bis 6.');
 textbackground(Red);                  {Rotes EingabeFenster}
 window(5,17,76,24); clrscr;           {Erstellen des EingabeFenster}
end;
{***************************************************************************}
{* PROCEDURE 2 *** F Ü R 'S   M E N U   E I N G A B E **********************}
{***************************************************************************}
procedure MENU_EINGABE(var tast:char);              {Rückgabe eines Zeichens}
begin
 textbackground(Brown);                 {Braunes MenuFenster}
 textcolor(White);                      {Weißer Text sichtbarer Cursor}
 window(70,14,70,14);clrscr;            {MenuFenster Positionieren}
 while keypressed do tast:=readkey;     {Tastenpuffer leer machen}
 repeat                                 {Read_Schleife}
 tast:=readkey;                         {Taste auslesen}
 until ((ord(tast)=27)OR((tast>'0')AND(tast<'7'))); {ESC oder Zahl von 1-6}
 if ord(tast)=27 then tast:='0';        {ESC -> Null-Zeichen}
end;
{***************************************************************************}
{* PROCEDURE 3 ******** E I N G A B E **************************************}
{***************************************************************************}
procedure EINGABE(var zahl:KOMPLEX;nummer:BYTE);  {nur Rückgabe komlexe Zahl}
var fehler:word;            {Zum Ablegen des IOResult}
begin
 textbackground(Red);       {Rotes AusgabeFenster}
 textcolor(14);             {Gelber Text}
 window(6,22,76,24);        {Erstellen des EingabeFenster}
 {$I-}                      {CompilerAnweisung: Ein-/Ausgabe-Prüfung "OFF"}
 repeat                     {Lese Schleife}
  clrscr;                   {MiniEingabeFenster löschen}
  write('Geben Sie den Real  -  Teil der ',nummer,' komlexen Zahl an : ');
  readln(zahl.re);          {Eingabe RealTeil der Komplexen Zahl}
  write('Geben Sie den Imaginär-Teil der ',nummer,' komlexen Zahl an : ');
  readln(zahl.im);          {Eingabe ImaginärTeil der Komplexen Zahl}
  fehler:=IOResult;         {IOResultat auf FehlerVariable Ablegen}
  if fehler<>0 then begin   {Wurde eine unzulässige Eingabe durchgeführt}
     Sound(220);            {entspricht Beep}
     Delay(200);            {SoundLänge 200ms}
     NoSound;               {Sound ausschalten}
  end;
 until (fehler=0);          {ENDE der LeseSchleife, wenn kein Fehler}
 {$I+}                      {CompilerAnweisung: Ein-/Ausgabe-Prüfung "ON"}
 clrscr;                    {Nachträglich Fensterchen löschen}
end;
{***************************************************************************}
{* PROCEDURE 4 ****** Z A H L E N A U S G A B E ****************************}
{***************************************************************************}
procedure AUSGABE(k1,k2,k3:KOMPLEX; c:CHAR);                 {keine Rückgabe}
begin
 textbackground(Red);                  {Rotes AusgabeFenster}
 textcolor(LightRed);                  {HellRoter Text}
 window(14,18,76,21); clrscr;          {Erstellen des AusgabeFensters}
                                       {Formatierte Ausgabe der Zahlen}
 writeln('  Komplexe Zahl 1  = ',k1.re:10:8,'  ',k1.im:10:8);
 writeln('  Komplexe Zahl 2  = ',k2.re:10:8,'  ',k2.im:10:8);
   write('  Komplexe Zahl 3  = ',k3.re:10:8,'  ',k3.im:10:8);
 textcolor(Yellow);                    {Gelber Text}
 gotoxy(1,2);write(c);                 {Ausgabe des Operators}
 if c<>' ' then begin                  {'=' nur wenn Operator<>' '}
    gotoxy(1,3);                       {'='- Zeichen Positionieren}
    write('=');end;                    {Ausgabe des Zeichens}
end;
{***************************************************************************}
{* PROCEDURE 5 ***** A D D I T I O N ***************************************}
{***************************************************************************}
procedure ADDITION(k1,k2:KOMPLEX;var k3:KOMPLEX);           {Rückgabe nur k3}
begin
  k3.re:=k1.re+k2.re;       {RealTeile addieren}
  k3.im:=k1.im+k2.im;       {ImaginärTeile addieren}
end;
{***************************************************************************}
{* PROCEDURE 6 ***** S U B T R A K T I O N *********************************}
{***************************************************************************}
procedure SUBTRAKTION(k1,k2:KOMPLEX;var k3:KOMPLEX);        {Rückgabe nur k3}
begin
  k3.re:=k1.re-k2.re;       {RealTeile subtrahieren}
  k3.im:=k1.im-k2.im;       {ImaginärTeile subtrahieren}
end;
{***************************************************************************}
{* Procedure 7 ***** M U L T I P L I K A T I O N ***************************}
{***************************************************************************}
procedure MULTIPLIKATION(k1,k2:KOMPLEX;var k3:KOMPLEX);     {Rückgabe nur k3}
begin
  k3.re:=(k1.re*k2.re)-(k1.im*k2.im);
  k3.im:=(k1.re*k2.im)+(k1.im*k2.re);
end;
{***************************************************************************}
{* Procedure 8 ****** D I V I S I O N **************************************}
{***************************************************************************}
procedure DIVISION(k1,k2:KOMPLEX;var k3:KOMPLEX);           {Rückgabe nur k3}
begin       {a+bi -> Z-Quer=a-bi; (a-bi)*(a+bi)=a^2+b^2}
  if( (k2.re*k2.re)+(k2.im*k2.im) )<>0 then begin    {Nenner muß <>0 sein}
     k3.re:=( (k1.re * k2.re   ) + (k1.im*k2.im) ) / {Bildung des RealTeils}
            ( (k2.re * k2.re   ) + (k2.im*k2.im) );

     k3.im:=( (k1.re * (-k2.im)) + (k1.im*k2.re) ) / {Bildung ImaginärTeil}
            ( (k2.re *   k2.re ) + (k2.im*k2.im) );
  end
  else begin                         {Ist Nenner = 0}
    textbackground(Red);             {Rotes AusgabeFenster}
    textcolor(14);                   {Gelber Text}
    window(15,22,40,24);             {Erstellen des FehlerFenster}
    Sound(220);                      {entspricht Beep}
    Delay(200);                      {SoundLänge 200ms}
    NoSound;                         {Sound ausschalten}
    writeln('Division durch Null');  {FehlerAusgabe}
    writeln('Bestätige mit Enter');
    readln;                          {Warten auf Enter}
    clrscr;                          {Schrott weglöschen}
    k3.re:=0;k3.im:=0;               {löschen von k3}
  end;
end;
{***************************************************************************}
{* Procedure 9 ****** B E T R Ä G E   B I L D E N **************************}
{***************************************************************************}
procedure BETRAEGE(k1,k2,k3:KOMPLEX);                        {keine Rückgabe}
begin
 textbackground(Red);        {Rotes AusgabeFenster}
 textcolor(14);              {Gelber Text}
 window(30,22,76,24);        {Erstellen des AusgabeFensters}
                             {Formatierte Ausgabe der ZahlenBeträge}
 writeln('|Zahl 1| = ',sqrt(k1.re*k1.re+k1.im*k1.im):10:8);
 writeln('|Zahl 2| = ',sqrt(k2.re*k2.re+k2.im*k2.im):10:8);
 write  ('|Zahl 3| = ',sqrt(k3.re*k3.re+k3.im*k3.im):10:8);
end;
{***************************************************************************}
{********** E N D E   D E S   P R O C E D U R E N T E I L S ****************}
{***************************************************************************}
 
 
 
 

{***************************************************************************}
{************************* H A U P T P R O G R A M M  **********************}
{***************************************************************************}
var aufgabe :CHAR;                         {Variable zur Aufgaben Abfrage}
    k1,k2,k3:KOMPLEX;                      {Komplexe initialisieren}
begin
 k1.re:=0.0; k1.im:=0.0;                   {alle Zahlen auf Null setzen}
 k2.re:=0.0; k2.im:=0.0;                   {alle Zahlen auf Null setzen}
 k3.re:=0.0; k3.im:=0.0;                   {alle Zahlen auf Null setzen}
 MENU;                                     {gesamte Oberfläche Ausgeben}
 AUSGABE(k1,k2,k3,' ');                    {Zeige die Null - Zahlen}

 repeat                                    {Große ProgrammSchleife}
   MENU_EINGABE(aufgabe);                  {Was soll ich machen}
   case aufgabe of                         {Allgemeine Case Abfrage}
      '0': begin textbackground(Black);    {Schwarzer GesamtHintergrund}
                 textcolor(LightGray);     {HellGraue TextFarbe}
                 window(1,1,80,25);        {Erstellen des GesamtHintergrundes}
                 clrscr;end;               {Bildschirm löschen und Tschüß}
      '1': begin k1.re:=0.0; k1.im:=0.0;   {Eingabe vorbereiten}
                 k2.re:=0.0; k2.im:=0.0;   {alle Zahlen auf Null setzen}
                 k3.re:=0.0; k3.im:=0.0;
                 AUSGABE(k1,k2,k3,' ');    {Zeige die Null - Zahlen}
                 EINGABE(k1,1);            {1.komlexe Zahl eingeben}
                 AUSGABE(k1,k2,k3,' ');    {Ausgabe der aktuellen Zahlen}
                 EINGABE(k2,2);            {1.komlexe Zahl eingeben}
                 AUSGABE(k1,k2,k3,' ');end;{Ausgabe der aktuellen Zahlen}

      '2': begin ADDITION(k1,k2,k3);       {Addition ausführen}
                 AUSGABE(k1,k2,k3,'+');end;{Ausgabe der aktuellen Zahlen}
      '3': begin SUBTRAKTION(k1,k2,k3);    {Subtraktion ausführen}
                 AUSGABE(k1,k2,k3,'-');end;{Ausgabe der aktuellen Zahlen}
      '4': begin MULTIPLIKATION(k1,k2,k3); {Multiplikation ausführen}
                 AUSGABE(k1,k2,k3,'*');end;{Ausgabe der aktuellen Zahlen}
      '5': begin DIVISION(k1,k2,k3);       {Division ausführen}
                 AUSGABE(k1,k2,k3,':');end;{Ausgabe der aktuellen Zahlen}
      '6': BETRAEGE(k1,k2,k3);             {Beträge bilden und Ausgabe}
      else writeln('keine Funktion!');     {Sicherheitshalber nochmal else}
   end;                                    {ENDE der Case Anweisung}
 until (aufgabe='0');                      {ENDE der Großen ProgrammSchleife}
end.
{***************************************************************************}
{***************** E N D E   H A U P T P R O G R A M M  ********************}
{***************************************************************************}