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: Unterschied zwischen den Versionen

(CKURS Review Formatierung+ ausgabe+ C Stadard + include)
K
Zeile 1: Zeile 1:
 
<pre>
 
<pre>
 
#include <stdio.h>
 
#include <stdio.h>
#include <stdlib.h>
 
  
  
Zeile 18: Zeile 17:
 
}
 
}
  
/*--------------Ab hier durch C-Kurs Teilnehmer ----------------------- */
+
//--------------Ab hier durch C-Kurs Teilnehmer -----------------------
 
/*
 
/*
 
  * Gibt den Vorgaenger des uebergebenen Wertes zurueck
 
  * Gibt den Vorgaenger des uebergebenen Wertes zurueck
Zeile 82: Zeile 81:
 
  * Division
 
  * Division
 
  */
 
  */
int divi(int x, int y){
+
int div(int x, int y){
 
int inv = 0;
 
int inv = 0;
 
if (y == 0) {
 
if (y == 0) {
Zeile 108: Zeile 107:
  
 
if (inv) {
 
if (inv) {
return neg(succ(divi(sub(x, y), y)));
+
return neg(succ(div(sub(x, y), y)));
 
}
 
}
  
return succ(divi(sub(x, y), y));
+
return succ(div(sub(x, y), y));
 
}
 
}
  
Zeile 161: Zeile 160:
 
printf("sub(-3,7)  = %i\n", sub(-3,7));
 
printf("sub(-3,7)  = %i\n", sub(-3,7));
 
printf("mult(-3,-7) = %i\n", mult(-3,-7));
 
printf("mult(-3,-7) = %i\n", mult(-3,-7));
printf("divi(21,-7) = %i\n", divi(21,-7));
+
printf("div(21,-7) = %i\n", div(21,-7));
 
printf("mod(21,8)  = %i\n", mod(21,8));
 
printf("mod(21,8)  = %i\n", mod(21,8));
 
printf("pot(-7,3)  = %i\n", pot(-7,3));
 
printf("pot(-7,3)  = %i\n", pot(-7,3));
Zeile 167: Zeile 166:
 
return 0;
 
return 0;
 
}
 
}
 +
 
</pre>
 
</pre>

Version vom 4. September 2010, 11:23 Uhr

#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;
}