C-Tutorials.de Logo

zum Inhaltsverzeichnis

C Tutorial: Unterprogramme/Funktionen


Unterprogramme/Funktionen:

In C werden einzelne Codeteile, die öfters benutzt werden, in ein so genanntes Unterprogramm „ausgelagert“. Zum Beispiel ist es wie beim gotoxy Unterprogramm aus einem vorhergendenden Teil sehr Code sparend. Es wäre ja Verschwendung, wenn man in jeder Stelle an der man den Curser ausrichten möchte, den selben Code erneut schreibt. AUßerdem macht es ein Programm wartbarerer und übersichtlicher.

COORD position;

  position.X = x;
  position.Y = y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);

Man schreibt den auszuführenden Dode ein Mal und muss dann in Zukunft diesen Unterprogramm nur noch mit einem kurzen Befehl aufrufen. Ein anderer Grund ist, dass die vielen Verschachtelungen dazu führen, dass der Code zu unübersichtlich wird.
Ein Unterprogramm, das immer notwendig ist um ein Programm zum laufen zu bekommen, ist das main Programm.
Jetzt aber endlich zum 'int' vor dem main und den '()' nach dem main. Das 'int' legt den Datentyp des Rückgabewertes eines Unterprogramms fest. Er steht immer vor dem Name des Unterprogramms. Gibt es keinen Rückgabewert, schreibt man 'void'. Der Rückgabewert ist eine beliebige Variable, die das Unterprogramm an den Ausführenden Code zurückliefern kann. Nach dem Name, in den Klammern, stehen die Übergabevariablen. Das kann eine sein oder auch mehrere. Gibt es keine, werden die Klammern leer gelassen. Die einzelnen Variablen werden in diesen Klammern deklariert, das heißt also du musst ihren Datentyp davor schreiben. Mit der Übergabevariable können Variablen übergeben werden, ohne die das Unterprogramm nicht funktionieren würde.

Frage:

Wie viele Übergabevariablen und Rückgabevariablen hat das main Programm bzw. das gotoxy Unterprogramm aus Teil 9?

int main ()
  {
  }

void gotoxy (int x, int y)
  {
  }

Lösung:

main: 1 Rückgabevariable / keine Übergabevariable
gotoxy: keine Rückgabevariable / 2 Übergabevariablen

Beispiel für ein Programm mit Unterprogramm, in dem das Unterprogramm die Addition ausführt. Du musst beim main mit Lesen beginnen:

#include <stdio.h>

float rechnung (float, float); //Prototyp des Unterprogramms

float rechnung (float z1, float z2) //Rückgabevariable: float / 2 Übergabevariablen
{ //Die Variablen, die übergeben werden, können im Unterprogramm einen anderen Namen haben!
float ergebnis; //ganz normale deklaration

  ergebnis = z1 + z2; //ausführen der Rechnung
  return(ergebnis); //Das was bei 'return()' in der Klammer steht ist die Rückgabevariable
}


int main ()
{
float zahl1;
float zahl2;
float erg;

  printf("Gib Zahl 1 ein: ");
  scanf("%f",&zahl1);
  printf("Gib Zahl 2 ein: ");
  scanf("%f",&zahl2);

  erg = rechnung(zahl1,zahl2);
  /*Hier wird das Unterprogramm 'rechnung' aufgerufen und die Variablen 'zahl1' und 'zahl2' übergeben.
  Zusätzlich wird erg der Rückgabewert des Unterprogramms 'rechnung' zugewiesen.*/

  printf("\nDas Ergebnis: %f",erg);

  getch();
}

Ein Unterprogramm muss genauso viele Übergabevariablen haben wie im Prototyp definiert wurden. Du kannst den Prototyp auch weglassen wenn das Unterprogramm im Code vor dem ersten Aufruf dieses Unterprogramms steht. Der Prototyp macht den Code allerdings übersichtlicher. Der Prototyp legt nur den Datentyp fest, nicht den Namen der übergebenen Variablen.
Grundsätzlich ist es nur möglich das ein Unterprogramm eine einzige Rückgabevariable haben kann. Übergabevariablen sind dagegen mehrere möglich.

Aufgabe:

Nimm den Taschenrechner aus einem vorhergenden Teil und lagere alle 4 Rechnungen in jeweils ein Unterprogramm aus. Lösung:

#include <stdio.h>

float mal (float,float); //für mal und geteilt ist ein Portotyp notendig,
float geteilt (float,float); //weil sie im Code nach dem main Programm stehen


float plus (float z1,float z2)
{
  return(z1+z2);
}



float minus (float z1,float z2)
{
  return(z1-z2);
}



int main ()
{
int auswahl;
float zahl1;
float zahl2;
int NochmalRechnen = 106;

  while(NochmalRechnen == 106)
    {
      printf("Moechtest du +(1), -(2), *(3) oder /(4) rechnen?");
      printf("\nDruecke die entsprechende Taste.");
      auswahl = getch();

      printf("\n\nGib Zahl 1 ein: ");
      scanf("%f",&zahl1);
      printf("Gib Zahl 2 ein: ");
      scanf("%f",&zahl2);

      switch(auswahl)
        {
          case 49:
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",plus(zahl1,zahl2));
              break;
          case 50:
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",minus(zahl1,zahl2));
              break;
          case 51:
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",mal(zahl1,zahl2));
              break;
          case 52:
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",geteilt(zahl1,zahl2));
              break;
          default:
              printf("\n\nDeine Auswahl entsprach keinem definierten Rechenzeichen!");
              break;
        }
      printf("\n\nNochmal? j fuer ja, eine andere Taste fuer nein druecken.");
      NochmalRechnen = getch();
      system("CLS");
    }
}



float mal (float z1,float z2)
{
  return(z1*z2);
}



float geteilt (float z1,float z2)
{
  return(z1/z2);
}

zum Inhaltsverzeichnis