// 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.

// Diese Funktionen werden in PointerU.cpp aufgerufen

// --------------- Aufgaben 3.12.8 -------------------------

// --------------- Aufgabe 1 -------------------------------


// a)

void AuswSort(int a[], int n)
{
for (int i=0; i<n-1; i++)
  {
    int min = i;
    for (int j=i+1; j<n; j++)
      if (a[j]<a[min]) min = j;
    int x = a[i];
    a[i] = a[min];
    a[min] = x;
  }
}

// b)

AnsiString isSorted(int a[], int n)
{
bool sorted=true;
for (int i=0; i<n-1; i++)
  if (a[i]>a[i+1]) sorted=false;
if (sorted) return "sortiert";
else return "nicht sortiert";
}
// c)

void Test(int A[], int n)
{
Form1->Memo1->Lines->Add("vorher: "+isSorted(A,n));
AuswSort(A,n);
Form1->Memo1->Lines->Add("nachher: "+isSorted(A,n));
}

void Aufgabe_3_12_8_1()
{
int a1[1]={1};       Test(a1,1);
int a21[2]={1,2};    Test(a21,2);
int a22[2]={2,1};    Test(a22,2);
int a31[3]={0,1,2};  Test(a31,3);
int a32[3]={0,2,1};  Test(a32,3);
int a33[3]={1,0,2};  Test(a33,3);
int a34[3]={1,2,0};  Test(a34,3);
int a35[3]={2,0,1};  Test(a35,3);
int a36[3]={2,1,0};  Test(a36,3);
}


// --------------- Aufgabe 2 -------------------------------

double Horner(double x, int n, double* p)
{ // p: Array mit den Koeffizienten des Polynoms,
  // n: der Grad des Polynoms
double s = 0;
for (int i=0; i<n+1; i++)
    s = s*x + p[n-i];
return s;
}

#include <cmath>
void test_HornerSinus()
{
double k3=3*2*1;
double k5=5*4*k3;
double k7=7*6*k5;
const int n=7; // Der Grad des Polynoms
double p[n+1]={0, 1, 0, -1/k3, 0, +1/k5, 0, -1/k7};
for (int i=1 ;i<=31 ;i++ )
  {
  double x=i/10.0;
  double s1=std::sin(x);
//s1=poly(x,n,p);
  double s2=Horner(x,n,p);
  Form1->Memo1->Lines->Add("x="+FloatToStr(x)+" sin="+s1+
         " Horn-sin="+FloatToStr(s2)+" diff="+std::abs(s1-s2));
  // Offensichtlich liefert die Taylor-Reihe für kleine Wist stimmen die beiden Ergebnisse für
  }
}

/* 
Die im C++Builder (aber nicht im C++-Standard) vordefinierte Funktion

  double poly(double x, int degree, double coeffs[]);  // #include <math.h>

berechnet wie Horner den Funktionswert des Polynoms,
dessen Koeffizienten im Array coeffs übergeben werden.
Dabei ist x der Wert, für den der Funktionswert be¬rechnet wird, und
degree der Grad des Polynoms.
*/

// --------------- Aufgabe 3 -------------------------------

// b)
int sum4(int a[])
{
// In dieser Funktion ist das Array in einen Zeiger konvertiert.
// Deswegen gilt bei einem 32-bit System sizeof(a)==4,
// und sizeof(a)/sizeof(a[0])==1;
Form1->Memo1->Lines->Add("sum4: sizeof(a)/sizeof(a[0])="+IntToStr(sizeof(a)/sizeof(a[0]) ));

int s=0;
for (int i=0;i< sizeof(a)/sizeof(a[0]);i++)
  s = s + a[i];
return s;
}

int sum(int a[], int n)
{
return 0;
}

void sizeof_Array()
{
// a)
int a[10];
// Im Gültigkeitsbereich des Arrays gilt bei einem 32-bit
// System sizeof(a)==10*4, und
//
//   sizeof(a)/sizeof(a[0])==10;
int s=sum(a,sizeof(a)/sizeof(a[0])); // sum wie im Text

// b)
sum4(a);
}

