/*
  Laborbungen zu
   -> temperaturumwandlungen
   -> variablenvertauschungen
   -> mathematischen modellen

  autor : martin lampacher
  datum	: 29/09/05
  klasse: 4IB
*/

#include <stdio.h>
#include <math.h>

/*
  schreiben sie ein umrechnungsprogramm, das fahrenheit in celsius umwandelt.
  das programm soll die werte von 0 fahrenheit bis 300 fahrenheit in 20er
  schritten in celsius umrechnen und beide werte dann als tabelle ausgeben.
  die umrechnungsformel lautet: c = (5/9) * (f-32). beachten sie, dass die
  zahlen alle rechtsbuendig untereinander stehen sollen

  Funktion  : calc_temp_c. Gibt eine Tabelle mit den Temperaturen in
	      Fahrenheit von 0 bis 300 aus und die entsprechenden
	      Temperaturen in Celsius
  Parameter : keine
  Rueckgabe : void (leer)
*/
void calc_temp_c() {
  float c;
  int f;

  printf ("\nFahrenheit\tCelsius\n");
  for (f=0;f<=300;f+=20) {
    c = (float)((5.0/9) * (f-32));
    printf ("%6d  %15.4f\n",f,c);
  }
}

/*
  schreiben sie ein umrechnungsprogramm, das celsius in fahrenheit umwandelt
  und ebenfalls eine tabelle ausgibt. achten sie auf die richtige
  formatierung der zahlen

  Funktion  : calc_temp_f. Ist die selbe wie calc_temp_c, nur dass
	      aus den Temperaturen in Celsius jene in Fahrenheit
	      ausgerechnet werden
  Parameter : keine
  Rueckgabe : void (leer)
*/
void calc_temp_f() {
  int c;
  float f;

  printf ("\nCelsius\t    Fahrenheit\n");
  for (c=0;c<=300;c+=20) {
    f = c/(5.0/9.0) + 32;
    printf ("%6d %15.4f\n",c,f);
  }
}

/*
  verwenden sie fuer die berecnung der celsius- und fahrenheitwerte
  eine funktion

  Funktion  : calc_temp. Wenn einer der Parameter 0 ist, dann wird
	      dessen Wert anhand des 2. Parameters errechnet.
	      d.h., dass bei celsius = 0 die Temperatur in Celsius
	      anhand von temp (temperatur in Fahrenheit) berechnet
	      wird
  Input	    : celsius,temp vom Typ float
  Rueckgabe : die ausgerechnete Temperatur in Float
*/
float calc_temp (float celsius, float temp) {
  float back;
  if (celsius == 0) {
    back = (5.0/9.0) * (temp-32.0);
  }
  else {
    back = (celsius/(5.0/9.0)) + 32;
  }
  return back;
}

/*
  schreiben sie ein programm, das zwei zahlen in die variablen z1 und z2
  einliest. anschliesend sollen die zahlen ueber eine c-funktion swap()
  vertauscht werden. hier muessen sie referenzparameter verwenden
*/
/*
  Funktion  : swap. Vertauscht die zwei Werte an der Adresse von pz1 und pz2
  I/O       : pz1,pz2. Zwei Pointer, die auf Ganzzahlen zeigen. Inhalte
	      sollen vertauscht werden.
  Rueckgabe : void (leer)
*/
void swap (int *pz1, int *pz2) {
  int ptemp;
  temp = *pz1;
  *pz1 = *pz2;
  *pz2 = ptemp;
}
/*
  Funktion  : vartauschen. Liest zwei Variablen ein und ueber-
	      gibt sie der Funktion swap um sie zu vertauschen.
	      Gibt sie anschliessend wieder aus
  Parameter : keine
  Rueckgabe : void (leer)
*/
void vartauschen () {
  int z1,z2,temp;
  printf ("erste zahl eingeben: ");
  scanf	 ("%d",&z1);
  printf ("zweite zahl eingeben: ");
  scanf  ("%d",&z2);
  swap (&z1,&z2);
  printf ("erste Zahl : %d\nzweite Zahl : %d\n",z1,z2);
}

/*
  Schreiben Sie ein Programm, das die Falltiefe eines Steins in Sekunden
  von 1 bis 10 tabellarisch ausgibt. Es gilt : s=1/2gt^2. Schreiben Sie
  dieses Programm einema mit einer While - schleife und einmal mit einer
  for - schleife.

  Funktion  : einstein. Simuliert den Fall eines Steins aus der Hoehe
	      unendlich (kommt nie an). Gibt eine Tabelle mit den
	      Werten des Falls aus. Er faellt 10 Sekunden lang
  Parameter : keine
  Rueckgabe : void (leer)
*/
void einstein () {
  int t;
  double s;
  double g = 9.81;
  s = 0;
  t = 1;
  printf ("\n    Zeit      Strecke\n");
  while (t <= 10) {
    s += (1.0/2.0)*g*(pow(t,2));
    printf ("%6d %14.2f\n",t,s);
    t++;
  }
  /*
    mit forschleife geloest :
    for (t=1;t<=10;t++) {
      s += (1.0/2.0)*g*(pow(t,2));
      printf ("%6d %14.2f\n",t,s);
    }
  */
}

void calc_temp_c(void);
void calc_temp_f(void);
char getch(void);

main () {
  char ch;
  float temp;
  printf ("\n\n\n\nwas willst du machen?!\n");
  printf ("1) tabelle fahrenheit - celsius\n");
  printf ("2) tabelle celsius    - fahrenheit\n");
  printf ("3) celsius    - fahrenheit\n");
  printf ("4) fahrenheit - celius\n");
  printf ("5) variablen vertauschen\n");
  printf ("6) ein stein faellt!\n");
  printf ("deine auswahl ");
  ch = getchar();
  switch (ch) {
    case '1' : calc_temp_c();
	       break;
    case '2' : calc_temp_f();
	       break;
    case '3' : printf ("temperatur in celsius eingeben: ");
	       scanf ("%f",&temp);
	       temp = calc_temp (temp,0);
	       printf ("in fahrenheit : %5.2f",temp);
	       break;
    case '4' : printf ("temperatur in fahrenheit eingeben: ");
	       scanf ("%f",&temp);
	       temp = calc_temp (0,temp);
	       printf ("in celsius : %5.2f",temp);
	       break;
    case '5' : vartauschen();
	       break;
    case '6' : einstein ();
	       break;
    default  : printf ("LOP!");
  }
  getch();
}