// Lösungen zu "Richard Kaiser: C++ mit dem Borland C++Builder 2007", ISBN: 978-3-540-69575-2
// Copyright Richard Kaiser, 2007. http://www.rkaiser.de. All rights reserved.
// Diese Quelltexte dürfen in eigenen Programmen verwendet werden, wenn sie einen Hinweis auf die Quelle (die ersten beiden Zeilen) enthalten. In keinem Fall wird eine Haftung für direkte, indirekte, zufällige oder Folgeschäden übernommen, die sich aus der Nutzung ergeben.
// It is permitted to use this source text in programs of your own, provided that it contains a reference to the source (the first two lines above). All liabilities for use of the code are disclaimed.

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "MemU.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}

// --------------- Aufgabe 3.17.2, 1 -----------------------

void verschachtelt()
{
int i,j,k=7;
AnsiString s,t;
  {
  char j;
    {
    float i=0,j=i;
      {
      AnsiString i,j,k;
      i = "ckt"; j = "ra"; k = "vert"; // i, j, k: AnsiString
      s = s+k+j+i+" ";                 // i, j, k, s: AnsiString
      }
    i = 1; j = 2;                      // i, j: int
    t = FloatToStr(i)+" + "+FloatToStr(j)+" = "+FloatToStr(k);//i,j,k: int
      {
      AnsiString t,j,k,i=s;
        {
        char t,j,k;
        t = 's'; j = 'i'; k = 't';       // t, j, k: char
        s = AnsiString(' ')+j+t+k+ ' ';  // s: AnsiString, t, j, k: char
        }
        {
        char t,j,k;
        t = 'a'; j = 'D'; k = 's';       // t, j, k: char
        s = AnsiString(j) + t + k+s;     // s: AnsiString, t, j, k: char
        }
      t = "nz sch"; j = "ja ga"; k = "ön "; // t, j, k: AnsiString
      s = s+j+t+k+i;                        // s, t, j, k, i: AnsiString
      }
    }
  }
Form1->Memo1->Lines->Add(t);  // t: AnsiString
Form1->Memo1->Lines->Add(s);  // s: AnsiString
}

void __fastcall TForm1::Button_3_17_2Click(TObject *Sender)
{
verschachtelt();
/* Erzeugt die Ausgabe:
     1 + 2 = 7
     Das ist ja ganz schön vertrackt
*/
}


// --------------- Aufgabe 3.17.4, 1 -----------------------

double f(double x, int n)
{
static int count =0;
count=count+n;
int r=1;
for (int i=0; i<count; i++) r=r*x;
return r;
}

void __fastcall TForm1::Button_3_17_4_1Click(TObject *Sender)
{
int x=f(3,1); // for (int i=0; i<1; ...)
int y=f(4,2); // for (int i=0; i<3; ...)
}


// --------------- Aufgabe 3.17.4, 2 -----------------------

int Fibonacci(int n)
{
const int max=50;
static int f[max];
static bool firstTime=true;
if (firstTime)
{ // Wird nur beim ersten Aufruf der Funktion ausgeführt.
  f[0]=0;
  f[1]=1;

  for (int i=2; i<max; i++)
    f[i]=f[i-1]+f[i-2];
  firstTime=false;
}
if (0<=n && n<max) return f[n];
else return -1;
}

void __fastcall TForm1::Button_3_17_4_2Click(TObject *Sender)
{
for (int i=0; i<50; i++)
  Memo1->Lines->Add(IntToStr(Fibonacci(i)));
}

