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

(Die Seite wurde neu angelegt: „<pre> #include <stdio.h> * Gibt Nachfolger des uebergebenen Wertes zurueck: int succ(int x){ return ++x; } /* * Gibt den inversen Wert eines uebergeben...“)
 
(CKURS Review Formatierung+ ausgabe+ C Stadard + include)
Zeile 1: Zeile 1:
 
<pre>
 
<pre>
 
#include <stdio.h>
 
#include <stdio.h>
 +
#include <stdlib.h>
 +
  
 
/*
 
/*
Zeile 16: Zeile 18:
 
}
 
}
  
//--------------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 27: Zeile 29:
 
  * Addition zweier Zahlen
 
  * Addition zweier Zahlen
 
  */
 
  */
int add(int x, int y){
+
int add(int x, int y){
 
if (y == 0) {
 
if (y == 0) {
 
return x;
 
return x;
 
}
 
}
+
 
 
if (x < 0 && y < 0) {
 
if (x < 0 && y < 0) {
 
return neg(add(neg(x), neg(y)));
 
return neg(add(neg(x), neg(y)));
 
}
 
}
+
 
 
if (y < 0) {
 
if (y < 0) {
 
return add(y, x);
 
return add(y, x);
 
}
 
}
+
 
 
return add(succ(x), pred(y));
 
return add(succ(x), pred(y));
 
}
 
}
Zeile 55: Zeile 57:
 
int mult(int x, int y){
 
int mult(int x, int y){
 
int inv = 0;
 
int inv = 0;
int result = x;
+
 
 
 
if (x == 0 || y == 0) {
 
if (x == 0 || y == 0) {
 
return 0;
 
return 0;
 
}
 
}
+
 
 
if (x < 0) {
 
if (x < 0) {
 
x = neg(x);
 
x = neg(x);
 
inv = !inv;
 
inv = !inv;
 
}
 
}
+
 
 
if (y < 0) {
 
if (y < 0) {
 
y = neg(y);
 
y = neg(y);
 
inv = !inv;
 
inv = !inv;
 
}
 
}
+
 
 
if (inv) {
 
if (inv) {
 
return neg(add(x, mult(x, pred(y))));
 
return neg(add(x, mult(x, pred(y))));
 
}
 
}
+
 
 
return add(x, mult(x, pred(y)));
 
return add(x, mult(x, pred(y)));
 
}
 
}
Zeile 81: Zeile 82:
 
  * Division
 
  * Division
 
  */
 
  */
int div(int x, int y){
+
int divi(int x, int y){
 
int inv = 0;
 
int inv = 0;
 
if (y == 0) {
 
if (y == 0) {
Zeile 87: Zeile 88:
 
return 0;
 
return 0;
 
}
 
}
+
 
 
if (x == 0) {
 
if (x == 0) {
 
return 0;
 
return 0;
 
}
 
}
+
 
 
if (x < 0) {
 
if (x < 0) {
 
x = neg(x);
 
x = neg(x);
 
inv = !inv;
 
inv = !inv;
 
}
 
}
+
 
 
if (y < 0) {
 
if (y < 0) {
 
y = neg(y);
 
y = neg(y);
 
inv = !inv;
 
inv = !inv;
 
}
 
}
+
 
 
if (x < y) {
 
if (x < y) {
 
return 0;
 
return 0;
 
}
 
}
+
 
 
if (inv) {
 
if (inv) {
return neg(succ(div(sub(x, y), y)));
+
return neg(succ(divi(sub(x, y), y)));
 
}
 
}
+
 
return succ(div(sub(x, y), y));
+
return succ(divi(sub(x, y), y));
 
}
 
}
  
Zeile 121: Zeile 122:
 
return 0;
 
return 0;
 
}
 
}
+
 
 
if (x == 0) {
 
if (x == 0) {
 
return 0;
 
return 0;
 
}
 
}
+
 
 
if (y < 0) {
 
if (y < 0) {
 
y = neg(y);
 
y = neg(y);
 
}
 
}
+
 
 
if (x < 0) {
 
if (x < 0) {
 
return neg(mod(neg(x),y));
 
return neg(mod(neg(x),y));
 
}
 
}
+
 
 
if (x < y) {
 
if (x < y) {
 
return x;
 
return x;
 
}
 
}
+
 
 
return mod(sub(x,y),y);
 
return mod(sub(x,y),y);
 
}
 
}
Zeile 148: Zeile 149:
 
return x;
 
return x;
 
}
 
}
+
 
 
if (y < 0) {
 
if (y < 0) {
 
return 0;
 
return 0;
 
}
 
}
+
 
 
return mult(x,pot(x,pred(y)));
 
return mult(x,pot(x,pred(y)));
 
}
 
}
  
 
int main(){
 
int main(){
printf("%i\n", add(-3,-7);
+
printf("add(-3,-7)  = %i\n", add(-3,-7));
printf("%i\n", sub(-3,7));
+
printf("sub(-3,7)  = %i\n", sub(-3,7));
printf("%i\n", mult(-3,-7));
+
printf("mult(-3,-7) = %i\n", mult(-3,-7));
printf("%i\n", div(3,-7));
+
printf("divi(21,-7) = %i\n", divi(21,-7));
printf("%i\n", pot(-7,3));
+
printf("mod(21,8)  = %i\n", mod(21,8));
 +
printf("pot(-7,3)  = %i\n", pot(-7,3));
 +
 
 
return 0;
 
return 0;
 
}
 
}
 
</pre>
 
</pre>

Version vom 4. September 2010, 11:21 Uhr

#include <stdio.h>
#include <stdlib.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 divi(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(divi(sub(x, y), y)));
	}

	return succ(divi(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("divi(21,-7) = %i\n", divi(21,-7));
	printf("mod(21,8)   = %i\n", mod(21,8));
	printf("pot(-7,3)   = %i\n", pot(-7,3));

	return 0;
}