0 Daumen
657 Aufrufe

Aufgabe: Gegebenenen Code in eine bessere Schleife umändern.

Gegebender, zu ändernder Code:

#include <iostream>

int main(){

unsigned int n;
std::cin >> n;
unsigned int f = 1;
if (n != 0) {
  do {
    f = f * n;
    --n;
  } while (n > 0);
}
std::cout << f << std::endl;

return 0;}


Von mir gänderter Code:
#include <iostream>
int main(){
 
unsigned int n;
std::cin >> n;
unsigned int f = 1;

for(f=1;n != 0;--n){
  f = f*n;
}

std::cout << f << std::endl;
 
  return 0;
}


Frage:
Ich habe die do-while-Schleife in eine for-Schleife geändert weil ich sowieso n decrementiere. 
Die Schleife ist sauberer, kleiner und übersichtlicher. 

Was gibt es noch für Vorteile?

Avatar von

2 Antworten

+2 Daumen

Die for-Schleife ist kleiner und übersichtlicher, ansonsten hat das keine Vorteile, denn die CPU muss auch bei der Bearbeitung der for-Schleife alle Aktionen aus dem vorherigen Code ausführen :

unsigned int f = 1; // Anfangsbedingung in for-Schleife
if (n != 0) // Abbruchbedingung in for-Schleife
{
  do {
    f = f * n; // dito
    --n; // Schleifenzähler in for-Schleife
  } while (n > 0); // Abbruchbedingung in for-Schleife
}

Abgesehen davon haben beide Programme eine Schwachstelle. Gibt man für n den Wert -1 oder eine andere negative Zahl ein, werden die Schleifen (wohl unbeabsichtigt) je nach Rechnerarchitektur bis zu 2^32 oder 2^64 mal ausgeführt.

Avatar von

Hast du evt. eine geeignete Lösung oder Empfehlung welche besser als die for-Schleife ist ?


Aufgabenstellung ist aus der gegebenen do-while-Schleife entweder eine for- oder While-Schleife zu machen. Und begründen wieso die anderen besser sind.

+1 Daumen

Aloha :)

Die do-while-Schleife wird mindestens 1-mal durchlaufen, weil die Bedinung erst am Ende geprüft wird. Sie ist also eine Fuß-gesteuerte Schleife. Daher benötigt der ursprüngliche Code vor(!) dem ersten Schleifendurchlauf eine zusätzliche if-Bedingung zur Prüfung, ob n ungleich 0 ist.

Bei einer while- oder for-Schleife wird die Bedinung vor dem Schleifendurchgang getestet. Sie sind also Kopf-gesteuerte Schleifen. Solche Schleifen werden je nach Prüfbedinung kein einziges Mal durchlaufen. Dadurch kann man auf die zusätzliche if-Bedinung aus dem ursprünglichen Code verzichten.

int main(void) {
unsigned int n;
std::cin >> n;
unsigned int f= n?n:1u;
while (n-->2) f*= n;
std::cout << f << std::endl;
return 0;
}
Avatar von

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

0 Daumen
1 Antwort
0 Daumen
1 Antwort
0 Daumen
1 Antwort

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community