Programmieren
 
 
 
 
 
C-Grundkurs
 
 
 
 
 
.. Beispiel: Ohmsches Gesetz (mit Zeigerarray auf Funktionen)
 
 

 
 
 
 
 
Dieses Programm demonstriert ein Zeigerarray auf Funktionen, am Beispiel des Ohmschen Gesetzes. Alle Programmteile gründen auf Themen, die in den vorhergehenden Kapiteln beschrieben wurden.

Das Programm gibt ein Menü aus, in dem gewählt werden kann, welche Größe des Ohmschen Gesetzes berechnet werden soll. Nach deren Auswahl erscheinen Eingabeaufforderungen, welche die einzugebende Größe benennen. Aus den jeweils zwei Eingaben wird die ausgewählte dritte Größe berechnet.

Zum Erhalt der jeweils zwei Fließkommazahlen wird die Funktion getFPzahl() benutzt, die ihrerseits auf der Funktion fstrgin() in der Includedatei fstrgin.h basiert.
 

 


 

// ohmges.cpp
// -----------  Version 07.04.2008
//              Model: beliebig
//              Fliesskommaemulation ein (bei IPC@CHIP)
//              www.GoBlack.de, D.Schwarzer


// Deklaration von Funktionen der statischen Bibliothek
#include <stdio>        // für printf()
#include <conio.h>      // für getch()
#include <math.h>       // für HUGE_VAL= grösste Fliesskommazahl

// Laden einer eigenen Funktionen zur Abfrage der Tastatur
#include "fstrgin.h"

//                                  fstrgin.h zum Kopieren ansehen
// ===============================================================


// getFPzahl()
// Die Funktion holt eine maximal 10stellige, doppeltgenaue
// Fließkommazahl durch Tastatureingaben. Es kann der Funktion ein
// String für die Eingabeaufforderung übergeben werden. Ihre
// Rückgabe ist die eingegebene doppeltgenaue Fliesskommazahl oder
// HUGE_VAL, wenn die Eingabe mit [ESC] abgebrochen wurde.
// die benutzte Funktion fstrgin() wurde mit der Includedatei
// fstrgin.h geladen.

double getFPzahl(char* prompt)
{
  char txtbuf[11];
  printf("%s", prompt);
  if(fstrgin(txtbuf, 10, FLT, "")==-1) return(HUGE_VAL);
  return(atof(txtbuf));
}



// R(), U(), I()
// Definition der drei Funktionen des Ohmschen Gesetzes. Wegen
// ihren geringen Länge wurden sie in einer Zeile geschrieben.
// Ihre Adressen werden in das Array der Funktionen übertragen.
double R (double u, double i) { return(u/i); }
double U (double r, double i) { return(r*i); }
double I (double u, double r) { return(u/r); }



// main()
// Aus einem Menü heraus kann eine Berechnung des Ohmschen Gesetzes 
// gewählt werden. Die eingegebene Zahl für das Menü wird zur
// Auswahl der entsprechenden Funktion benutzt, sowie für die
// Ausgabe von Strings für die Eingabeaufforderung
void main (void)
{
  char   c=0;                     // Menü-Auswahlzeichen
  double x, x1, x2;               // Ergebnis x, Eingaben x1, x2 
  
  // Stringarray für die in den Funktionen auftretenden Groessen,
  // in der Abfolge, wie sie jeweils eingegeben werden 
  char* prompt[]={"\r\n U= ","\r\n I= ","\r\n R= ",
                  "\r\n R= ","\r\n I= ","\r\n U= ",
                  "\r\n U= ","\r\n R= ","\r\n I= " };

  // Deklaration und Definition eines Zeigerarrays auf Funktionen
  // vom Typ double name(double,double)
  double(*fktptr[])(double,double)={R, U, I};


  while(1){
    // Ausgabe des Menüs
    printf("\r\n\n");
    printf("\r\n  [0] .. Widerstand berechnen");
    printf("\r\n  [1] .. Spannung berechnen");
    printf("\r\n  [2] .. Strom berechnen");
    printf("\r\n[ESC] .. Ende des Programms  ");

    // warten auf eine Wahleingabe c enthält den ASCIIcode
    c=getch();
    if(c==ESC) return;         // bei 0x1B Programm beenden
    if(c==CR)  continue;       // bei 0x0D Schleife neu beginnen
    printf("\r\n\n");          // Abstand zur Berechnung

    c=c-0x30;                  // ASCIIcode in c in eine Zahl 
    if(c<0 || c>2) continue;   // wandeln und Test ob Zahl = 0,1,2

    // Zwei Fliesskomma-Eingaben holen. Anhand der Zahl in c wird
    // die Eingabeaufforderung im Array prompt[] ausgewählt

    x1=getFPzahl(prompt[3*c+0]);
    x2=getFPzahl(prompt[3*c+1]);

    // Die geholten Zahlen x1,x2 dürfen nicht den Wert 0 besitzen
    // Bei x1,x2 ungleich 0 wird über die Zahl in c die benötigte
    // Funktion des Arrays der Funktionen für das ohmsche Gesetz
    // aufgerufen
 
    if (x1!=0 && x2!=0){
      x= fktptr[c](x1,x2);          // Aufruf einer der Funktionen
      printf("%s%f",prompt[3*c+2], x);         // Ausgabe Ergebnis
    }
  }
}

 


 

 

 

 

www..de