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...“) |
PaulG (Diskussion | Beiträge) K (verschob „Ckurs/Rekursives arbeiten/Musterlösung“ nach „C-Kurs/Rekursives arbeiten/Musterlösung“) |
||
| (3 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
<pre> | <pre> | ||
#include <stdio.h> | #include <stdio.h> | ||
| + | |||
/* | /* | ||
| Zeile 27: | Zeile 28: | ||
* 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 56: | ||
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 87: | Zeile 87: | ||
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(div(sub(x, y), y))); | ||
} | } | ||
| − | + | ||
return succ(div(sub(x, y), y)); | return succ(div(sub(x, y), y)); | ||
} | } | ||
| Zeile 121: | Zeile 121: | ||
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 148: | ||
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( | + | printf("div(21,-7) = %i\n", div(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> | ||
Aktuelle Version vom 5. März 2013, 17:37 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;
}