Zum Inhalt springen
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

Aus FreitagsrundenWiki
Ugene (Diskussion | Beiträge)
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...“
 
P.brodmann (Diskussion | Beiträge)
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;
}