Bedeutung von while

m.yldz

Grünschnabel
Hi gentelmen :D

ich hab ne Frage und zwar hab ich eine Aufgabe bekommen, ein Programm zu erstellen, dass die Potenz ausrechnet.
Das Programm sieht so aus:

C++:
#include <stdio.h>


void power(){

    int x, y, potenz=1;
   printf("Programm zur Berechnung der Potenz");
   printf("\nBitte geben Sie x ein: ");
    scanf("%d",&x);
    printf("\nBitte geben Sie y ein: ");
    scanf("%d",&y);
    while(y--) potenz*=x;
printf("Die Potenz von x hoch y ist: %d.\n", potenz);
}
int main(){
power();
    return 0;
}
Der Kollege hat mir gesagt ich soll while benutzen, er hat quasi die Rechnung eingefügt.

Nun... was bedeutet dieses while?
 
Zuletzt bearbeitet von einem Moderator:
Der Kollege hat mir gesagt ich soll while benutzen, er hat quasi die Rechnung eingefügt.
Ja, stimmt soweit.

ich hab ne Frage und zwar hab ich eine Aufgabe bekommen, ein Programm zu erstellen, dass die Potenz ausrechnet.
Das Programm sieht so aus:
Äh...

Machen wir es so: Ich beantworte dir deine Frage jetzt, und danach erkläre ich, warum dein Code auf vielen Ebenen nicht optimal und in gewissen Fällen sogar falsch ist, ok?

Also:
Nun... was bedeutet dieses while?
while() heisst auf deutsch "während", was du sicher schon herausgefunden hast. Und genau das ist es auch.
Nämlich:
Während(Bedingung erfüllt) tue { }.

Dein Kollege hat zusätzlich eine Abkürzung benutzt. Ich hole ein bisschen aus:
C:
unsigned int power(unsigned int base, unsigned int exponent)
{
    //Power (potenz, ^) ist die Operation, die * zusammenfasst, genauso wie * + zusammenfasst (z.B. 3 mal (2 addieren) = 2+2+2 = 3*2), 3 mal (2 multiplizieren) = 2 * 2 * 2 = 2^3 = 8.
   //Kennst du wahrscheinlich alles schon. Nun willst du den umgekehrten Weg gehen: 2^3 bekommst du, also willst du zu 2 * 2 * 2 umformen.
    //Nun sollte der '--'-Operator schon bekannt sein: Hier ist es der post-decrement-Operator, d.h.:
    int y = 3;
    int x = y--; //post-decrement
    int z = --y; //pre-decrement
    //y ist jetzt 1, z ist 1, x ist 3. Lass dir ruhig Zeit damit, und frage auch nach: Das ist schon ein relativ fortgeschrittenes Konzept.
    //Dein while-Code, also:
    while(y--) {
         //Code...
    }
    //ist eigentlich folgendes:
loop:
    if(y != 0) {
        y=y-1;
        //Code...
        goto loop; //springe zurück zum marker loop
    }
    y=y-1;
 
    //Also: WÄHREND y!=0 (für dich hier logischer: y > 0), zähle von y runter und multipliziere die Teilpotenz mit x.
}

Ist die Frage nach dem while damit beantwortet? Wenn nein, einfach nachfragen :)
Wenn es dich interessiert, weiterlesen, falls du nur die Frage beantwortet haben wolltest, kannst du hier abbrechen.

Nun zum anderen Teil:
Programme sollten modular sein, um wiederverwendbar zu sein. Das ist bei deiner Potenzfunktion nicht der Fall.
Es gibt im Standard schon so eine Funktion, sie heisst pow() und nimmt 2 Argumente und hat einen Rückgabewert. Warum? Die Standardfunktion nimmt ihre Werte von den Parametern. Stell dir vor, du wolltest hundert mal die Pythagorasformel auf Dreiecke anwenden und müsstest jedes Mal den Wert abtippen, da deine Funktion nun halt mal so funktioniert. Deine Funktion gibt an, dass sie eine Potenz berechnet, aber als Programmiererin kannst du den Wert nicht weiterverwenden, da er nur ausgegeben wird; dein Programm kennt den Wert also nicht.

Nun zur Verbesserung:
C:
int power(int base, unsigned int exp) //Unsigned int = Natürliche Zahlen mit 0 bis ~4 Mrd.
{
    //Dieser Code ist, was dein Programm eigentlich tun sollte. Mehr dazu später.
    int ret = 1;
    while(exp--) ret *= base;
    return ret;
}
Der Code funktioniert.
Nun wolltest du noch eine Eingabe haben.

C:
int power(int base, unsigned int exp) //Unsigned int = Natürliche Zahlen mit 0 bis ~4 Mrd.
{
    //Dieser Code ist, was dein Programm eigentlich tun sollte. Mehr dazu später.
    int ret = 1;
    while(exp--) ret *= base;
    return ret;
}

int main(int argc, char* argv[])
{
    int base = 0;
    unsigned int exp = 0;

    printf("Geben Sie die Basis ein:\n"); //x / y sind nichtdeskriptiv.
    scanf("%d", &base);
    printf("Geben Sie den Exponenten ein:\n"); //x / y sind nichtdeskriptiv.
    scanf("%u", &exp);

    printf("%d^%u = %d\n", base, exp, power(base, exp));

    return 0;
}
Nun. Was war jetzt an deinem Code falsch? Nun: Du hast erlaubt, dass man negative Zahlen eingibt. Für die Basis ist das egal, der Code funktioniert auch da (z.B. (-2)^3 = 4 * (-2) = -8). Aber als Exponent würde das ziemlich lange durchlaufen und trotzdem nie das korrekte Ergebnis liefern: x^(-y) = 1/(x^y). Und das kannst du als int gar nicht darstellen. Zudem kannst du dir überlegen, ob die Loopbedingung "y--" jemals 0 ist, wenn sie bei y < 0 startet (die Antwort ist ja, aber nur wegen einer Imperfektion von Computern: Wird ein Wert zu negativ, ist er wieder positiv. Aber das hat viel mit Zahlentheorie zu tun, die ich dir hier ersparen möchte).

Und nun hast du eine Funktion, die schon korrekter ist, aber noch immer ein grosses Problem hat: x^y ist immer grösser/gleich x, also x^y >= x für y != 0. Nun ist aber auch die positive Seite von Integern begrenzt, wird ein Wert also grösser als ~2Mrd, hat er keinen Platz mehr und wird negativ (Overflow-errors).
Allerdings würde eine Korrektur dieser Eigenheit noch weiter führen, was in dieser Anwendung wohl nicht zielführend ist. Bei Interesse bist du aber herzlich eingeladen, nachzufragen.

Gruss
cwriter
 
Zuletzt bearbeitet:
Vielen vielen Dank Cwriter!!! :):cool:!
In der nächsten Zeit bekomme ich weitere Aufgaben. Dann hoffe ich kannst du mir helfen bei der einen oder anderen Frage. Wahrscheinlich hast du gemerkt das ich Anfängerin bin. Aber lerne fleißig C und Java. :D
 
Zurück