Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/Rekursives arbeiten/Musterlösung

#include <stdio.h>


/*
 * Gibt Nachfolger des uebergebenen Wertes zurueck
 */
int succ(int x){
	return ++x;
}

/*
 * Gibt den inversen Wert eines uebergebenen Wertes zurueck
 */
int neg(int x){
	return -x;
}

//--------------Ab hier durch C-Kurs Teilnehmer -----------------------
/*
 * Gibt den Vorgaenger des uebergebenen Wertes zurueck
 */
int pred(int x){
	return neg(succ(neg(x)));
}

/*
 * Addition zweier Zahlen
 */
int add(int x, int y){
	if (y == 0) {
		return x;
	}

	if (x < 0 && y < 0) {
		return neg(add(neg(x), neg(y)));
	}

	if (y < 0) {
		return add(y, x);
	}

	return add(succ(x), pred(y));
}

/*
 * Subtraktion
 */
int sub(int x, int y){
	return add(x, neg(y));
}

/*
 * Multiplikation
 */
int mult(int x, int y){
	int inv = 0;

	if (x == 0 || y == 0) {
		return 0;
	}

	if (x < 0) {
		x = neg(x);
		inv = !inv;
	}

	if (y < 0) {
		y = neg(y);
		inv = !inv;
	}

	if (inv) {
		return neg(add(x, mult(x, pred(y))));
	}

	return add(x, mult(x, pred(y)));
}

/*
 * Division
 */
int div(int x, int y){
	int inv = 0;
	if (y == 0) {
		//undefiniert!!!
		return 0;
	}

	if (x == 0) {
		return 0;
	}

	if (x < 0) {
		x = neg(x);
		inv = !inv;
	}

	if (y < 0) {
		y = neg(y);
		inv = !inv;
	}

	if (x < y) {
		return 0;
	}

	if (inv) {
		return neg(succ(div(sub(x, y), y)));
	}

	return succ(div(sub(x, y), y));
}

/*
 * Modulo
 */
int mod(int x, int y){
	if (y == 0) {
		//undefiniert!!!
		return 0;
	}

	if (x == 0) {
		return 0;
	}

	if (y < 0) {
		y = neg(y);
	}

	if (x < 0) {
		return neg(mod(neg(x),y));
	}

	if (x < y) {
		return x;
	}

	return mod(sub(x,y),y);
}

/*
 * Potenziert eine angegebene Zahl mit dem angegebenen Exponenten
 */
int pot(int x, int y){
	if (y == 1) {
		return x;
	}

	if (y < 0) {
		return 0;
	}

	return mult(x,pot(x,pred(y)));
}

int main(){
	printf("add(-3,-7)  = %i\n", add(-3,-7));
	printf("sub(-3,7)   = %i\n", sub(-3,7));
	printf("mult(-3,-7) = %i\n", mult(-3,-7));
	printf("div(21,-7) = %i\n", div(21,-7));
	printf("mod(21,8)   = %i\n", mod(21,8));
	printf("pot(-7,3)   = %i\n", pot(-7,3));

	return 0;
}