/*
  Autor : Lampacher Martin
  Datum : 26/10/05
  Fach  : Systeme
*/
#include <stdio.h>
#include <conio.h>
#include <math.h>

/*
  fuer INTEGERARRAYS
  Diese Funktion liefert den groessten vor-
  kommenden Wert im Array mit der Adresse von
  'intarray'. Es wird nur 'laenge' lang
  gesucht (so viele Felder). 
*/
int max (int intarray[], int laenge) {
  int maximum,i;
  maximum = intarray[0];
  for (i = 0; i < laenge; i++)
    if (intarray[i] > maximum) 
      maximum = intarray[i];
  return maximum;
}

/*
  fuer INTEGERARRAYS
  Selbe Funktion wie 'max', nur dass diese
  nicht indiziert sondern mit dem Pointer
  selbst arbeitet
*/
int max_p (int *parray, int laenge) {
  int maximum,i;
  maximum = *parray;
  for (i = 0; i < laenge; i++) {
    if (*parray > maximum)
      maximum = *parray;
    parray++;
  }
  return maximum;
}

/*
  fuer INTEGERARRAYS
  Diese Funktion liefert den kleinsten vor-
  kommenden Wert im Array mit der Adresse von
  'intarray'. Es wird nur 'laenge' lang
  gesucht (so viele Felder). 
*/
int min (int intarray[], int laenge) {
  int minimum,i;
  minimum = intarray[0];
  for (i = 0; i < laenge; i++)
    if (intarray[i] < minimum) 
      minimum = intarray[i];
  return minimum;
}

/*
  fuer INTEGERARRAYS
  Selbe Funktion wie 'min', nur dass diese
  nicht indiziert sondern mit dem Pointer
  selbst arbeitet
*/
int min_p (int *parray, int laenge) {
  int minimum,i;
  minimum = *parray;
  for (i = 0; i < laenge; i++) {
    if (*parray < minimum)
      minimum = *parray;
    parray++;
  }
  return minimum;
}

/*
  fuer FLOATARRAYS
  Diese Funktion liefert das Skalarprodukt der
  Arrays mit den Adressen von 'pa' und 'pb'.
  Es wird nur 'laenge' lang gesucht (so viele Felder).
  Ich nehme die beiden Arrays gleich lang! 
*/
float skalarprodukt (float *pa, float *pb, int laenge) {
  int produkt,i;
  produkt = 0;
  for (i = 0; i < laenge; i++) {
    produkt += (float) *pa++ * *pb++;
  }
  return produkt;
}

/*
  fuer FLOATARRAYS
  Selbe Funktion wie 'skalarprodukt', nur dass diese
  nicht indiziert sondern mit dem Pointer
  selbst arbeitet
*/
float skalarprodukt_p (float pa[], float pb[], int laenge) {
  int produkt,i;
  produkt = 0;
  for (i = 0; i < laenge; i++) {
    produkt += (float) pa[i] * pb[i];
  }
  return produkt;
}

/*
  fuer FLOATARRAYS
  Simuliert ein eindimensionales Array
  als eine Matrix mit der Zeilenanzahl
  'zeilen' und 'spalten' Spalten. Der
  Wert von 'zeile'/'spalte' soll zurueck-
  gegeben werden
*/
float matzugr (float array[], int zeilen, int spalten,
               int zeile, int spalte) {
  int index;
  index = (spalten * (zeile-1) + spalte) - 1;
  return array[index];
}

/*
  fuer FLOATARRAYS
  Selbe Funktion wie 'matzugr', nur dass diese
  nicht indiziert sondern mit dem Pointer
  selbst arbeitet
*/
float matzugr_p (float *parray, int zeilen, int spalten,
                 int zeile, int spalte) {
  int index;
  index = (spalten * (zeile-1) + spalte) - 1;
  while (index-- > 0) 
    parray++;
  return *parray;
}

/* HAUPTPROGRAMM */
main () {
  char ch = '\0';  
  /*
    arrays und zaehlvariable, welche
    je nach Auswahl gebraucht werden
  */
  int i,interg,intarr[10];
  float floaterg,floatarr1[6],floatarr2[6];

  /*
    solange bei dem Menu nicht 'n' gedrueckt wurde,
    wird dieses Programm wiederholt
  */
  while (ch != 'n') {
    clrscr();
    printf ("\n\n1) Das Maximum eines Arrays\n");
    printf ("2) Das Minimum eines Arrays\n");
    printf ("3) Skalarprodukt zweier Arrays\n");
    printf ("4) Zugriff auf ein Element einer Matrix\n");
    printf ("--- Druecken sie 'n' zum Beenden des Programms ---");
    ch = getch();
    switch (ch) {
      /* Das Maximum eines Arrays soll ausgegeben werden */
      case '1' : printf ("\n\nArrayausgabe:");
                 for (i = 0; i <= 9; i++) {
                   intarr[i] = (i*17)/13;
                   printf ("\n - %d wert : %d",i,intarr[i]);
                 }
                 printf ("\n\nMaximum bei Indizierung: %d",max(intarr,10));
                 printf ("\nMaximum mit Pointer    : %d",max_p(intarr,10));
		 getch();
		 break;
      /* Das Minimum eines Arrays soll ausgegeben werden */
      case '2' : printf ("\n\nArrayausgabe:");
                 for (i = 0; i <= 9; i++) {
                   intarr[i] = (i*17)/13;
                   printf ("\n - %d wert : %d",i,intarr[i]);
                 }
                 printf ("\n\nMinimum bei Indizierung: %d",min(intarr,10));
                 printf ("\nMinimum mit Pointer    : %d",min_p(intarr,10));
		 getch();
		 break;
      /* Den Skalarwert zweier Arrays ausgeben */
      case '3' : printf ("\n\nArrays sind gefuellt mit 1,2,3 im ersten");
                 printf ("\n und 3,2,1 im zweiten array.");
                 floatarr1[0] = 1; floatarr2[0] = 3;
                 floatarr1[1] = 2; floatarr2[1] = 2;
                 floatarr1[2] = 3; floatarr2[2] = 1;
                 printf("\nMit indizierung : %10.4f",skalarprodukt(floatarr1,floatarr2,3));
                 printf("\nMit Pointern    : %10.4f",skalarprodukt_p(floatarr1,floatarr2,3));
		 getch();
		 break;
      /*
       Auf einen Wert einer Matrix zugreifen, welche durch ein
       eindimensionales Array simuliert wird
      */
      case '4' : printf ("\n\nArray ist gefuellt mit : 1,2,3,4,5,6");
                 floatarr1[0] = 1; floatarr1[3] = 4;
                 floatarr1[1] = 2; floatarr1[4] = 5;
                 floatarr1[2] = 3; floatarr1[5] = 6;
                 printf ("\nich moechte den wert in zeile 2 spalte 3, also 6");
                 printf ("\nmit Indizierung : %10.4f",matzugr(floatarr1,2,3,2,3));
                 printf ("\nmit Pointer     : %10.4f",matzugr_p(floatarr1,2,3,2,3));
		 getch();
		 break;
    }
  }
}
