Subato

Erste c-Funktionen

Gegeben sei folgende C Header-Datei adsBeispiele.h:

#ifndef ADS_BEISPIELE_C__H
#define ADS_BEISPIELE_C__H

#include <stdbool.h>

unsigned long int factorial(unsigned int x); 

int mystery(int x, int z); 

unsigned int ggt(unsigned int a, unsigned int b); 

void eratosthenes(bool* array, unsigned int length); 

void matrixMult(double** a,double** b,double** c, unsigned int length); 

#endif

Implementieren Sie die einzelnen Funktionen in C. Hierbei sollten Sie mehr oder weniger die Lösungen aus dem Modul ADS übernehmen können. Einzig Arrays sind in diesem Fall anders notiert als in Java.

Die C-Datei soll dabei adsBeispiele.c heißen.

Die Funktionen im einzelnen:

  • Schreiben Sie die Fakultät. Sie brauchen sich nicht von den für Javaprogrammierer etwas ungewohnten Typen unsigned long int und unsigned int verwirren zu lassen.
  • Schreiben Sie die aus ADS bekannte Funktion mit folgender leicht erweiterter Spezifikation:
    $mystery(0, z) = 0$
    $mystery(x, z) = mystery(-x, -z)$ für $x<0$
    $mystery(x, z) = mystery(x-1, z) + z$
  • Verwenden sie für ggt den Euklid Algorithmus zur Berechnung des größten gemeinsamen Teilers.
  • void eratosthenes(bool* array, unsigned int length);
    Gegeben sei ein Array von Wahrheitswerten (in C notiert als bool* statt wie in Java als boolean[], aber Sie können den gleichen Zugriff per Index auf ein Array Element machen wie in Java per array[i]). Zusätzlich gegeben ist die Länge des Arrays im Parameter length (anders als in Java können Sie in C einen Array nicht nach seiner Länge fragen.) Implementieren Sie nun mit dem Sieb des Erathostenes die Funktion, so dass anschließend gilt: wenn array[i] true ist, dann gilt, dass i+2 eine Primzahl ist.
  • void matrixMult(double** a,double** b,double** c, unsigned int length)

    Realisieren Sie die Matrix-Multiplikation. Eine Matrix ist ein zweidimensionaler Array. Der erste Index gibt die Zeile, der zweite Index gibt die Spalte an. Nach Ausführung der Funktion, soll in der Matrix c das Ergebnis aus der Multiplikation von a und b stehen. Die Anzahl der Zeilen und Spalten wird durch den Parameter length angegeben.

Erste eigene Tests können Sie mit folgendem Testprogramm simpleMain.c machen:

#include "adsBeispiele.h"
#include <stdio.h>

int main(int argc, char** args){
  printf("Fakultät von 5: %lu\n",factorial(5));

  bool ar [10] = {false,false,false,false,false,false,false,false,false,false};
  eratosthenes(ar,10);
  printf("11 ist %s Primzahl.\n",ar[9]?"eine":"keine");

  printf("mystery(10,3) = %d\n",mystery(10,3));

  printf("ggt(10,4) = %d\n",ggt(10,4));

  double a0 [] = {1,2,3};
  double a1 [] = {4,1,0};
  double a2 [] = {5,2,-3};
  double* a []= {a0,a1,a2};

  double b0 [] = {2,1,-3};
  double b1 [] = {-1,0,4};
  double b2 [] = {1,2,-4};
  double* b [] = {b0,b1,b2};

  double c0 [] = {0,0,0};
  double c1 [] = {0,0,0};
  double c2 [] = {0,0,0};
  double* c [] = {c0,c1,c2};
  matrixMult(a,b,c,3);

  printf("Position c[0][1] = %f\n",c[0][1]);

  return 0;
}

Das Programm lässt sich dann mit folgendem Compileraufruf erzeugen:
 gcc -Wall -pedantic -o simpleMain simpleMain.c adsBeispiele.c


#include "adsBeispiele.h" unsigned long int factorial(unsigned int x){ } void eratosthenes(bool* array, unsigned int length){ } int mystery(int x, int z){ } unsigned int ggt(unsigned int a, unsigned int b){ } void matrixMult(double** a,double** b,double** c,unsigned int n){ }
c
You are not logged in and therefore you cannot submit a solution.