C-Kurs/Rekursives arbeiten/Musterlösung: Unterschied zwischen den Versionen
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...“) |
(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 ----------------------- */ |
/* | /* | ||
* 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; | ||
− | + | ||
− | |||
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 | + | 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( | + | return neg(succ(divi(sub(x, y), y))); |
} | } | ||
− | + | ||
− | return succ( | + | 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", | + | 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; }