Algorithmen
-
Hallo Leute,
ich weiß, dass das Thema hier nicht ganz reinpasst aber sonst wüsste ich leider auch nicht wo ich diese Fragen stellen könnte.Ich hatte eine Frage zum folgenden Programmausschnitt:
Eingabe: n ∈ N zaehler ← 0
for i ← 1 to n do
for j ← n downto i do zaehler ← zaehler + 1
return zaehlerWeiss jemand was diese Funktion macht und welche Programmiersprache das ist ?
-
@JohannesK Die "Programmiersprache" ist mathematisch orientierter Pseudocode, mit dem man in der Informatik häufiger zu tun hat, besonders wenn es ein wenig theoretischer wird.
Das verwirrendste für Neulinge mit Programmiererfahrung ist vielleicht die Zuweisung mit . Das kannst du einfach als bzw. lesen.
Ansonsten findet sich in solchem Code oft mathematische Notation, die du hoffentlich selbst in der Lage bist zu entschlüsseln.
Die Funktion berechnet eine Summe der Form . Es ist vielleicht gut, wenn du versuchst dir selbst zu erarbeiten, wie diese genau aussieht und hier vielleicht nochmal nachfragst, wenn du nicht weiterkommst.
-
@Finnegan Super vielen Dank ! Ich gebe mein bestes.
-
@Finnegan Weisst du was an diesem Code nicht stimmt ?
#include <iostream> using namespace std; int ffunk(int x){ int zahler = 0; for(int i = 0; i <= x; i++){ for(int j = x; j <= i; j--){ zahler = zahler + 1; return zahler; } cout << endl; } } int main(){ int n; cout << "Geben Sie n ein: " << endl; cin >> n; ffunk(n); }
-
Nein. Sag mir welche Beobachtung dich zu dem Schluss bringt, dass etwas nicht stimmt. Fehlermeldung des Compilers? Falschen Ergebnis?
-
@Finnegan Es kommt eine Fehlermeldung des Compilers
-
Welche? Bitte posten.
-
Ah, sehe schon. Nicht alle Kontrollpfade in
ffunk
geben einenint
zurück.Ich denke auch, du hast den Pseudocode nicht korrekt gelesen. Das
return
kommt erst, wenn alle Schleifen durch sind.
-
@Finnegan In Zeile 7 kriege ich eine Warnung:
"Loop will run at most once(loop increment never executed)"
in Zeile 14 bekomme ich einen Error:
"Non void function does not return a value in all control paths"
-
@Finnegan sagte in Algorithmen:
Ah, sehe schon. Nicht alle Kontrollpfade in ffunk geben einen int zurück.
Ich denke auch, du hast den Pseudocode nicht korrekt gelesen. Das return kommt erst, wenn alle Schleifen durch sind.Genau ich hab das ausprobiert aber mein nächstes Problem ist das ich keinen Wert als return value bekomme. Ich hoffe du kannst mir helfen.
#include <iostream> #include <iomanip> using namespace std; int ffunk(int x){ int zahler = 0; for(int i = 0; i <= x; i++){ for(int j = x; j <= i; j--){ zahler = zahler + 1; } } return zahler; } int main(){ int n; cout << "Geben Sie n ein: " << endl; cin >> n; ffunk(n); }
-
@JohannesK sagte in Algorithmen:
@Finnegan In Zeile 7 kriege ich eine Warnung:
"Loop will run at most once(loop increment never executed)"
Das ist die innere Schleife. Überleg mal, warum die überhaupt nur ein einziges mal durchlaufen werden kann. Du hast da einen Bug - schau mal auf die Schleifeneintrittsbedingung
-
-
@manni66 sagte in Algorithmen:
Woher weißt du das?
Kann sein das ich jetzt völlig falsch liege, aber kann es sein das ich ein Couturier für die Return Value vergessen habe
-
@manni66 Ich kann nur die Zahl n eingeben, aber der Compiler spuckt danach keinen Wert aus
-
@Finnegan Ich glaube ich hab den Fehler gemacht, dass ich j<=i geschrieben habe anstatt j >= i ?
-
@JohannesK sagte in Algorithmen:
@Finnegan Ich glaube ich hab den Fehler gemacht, dass ich j<=i geschrieben habe anstatt j >= i ?
Ja, ich denke auch.
-
Ich glaube ich habe es jetzt geschafft:
#include <iostream>
#include <iomanip>
using namespace std;int ffunk(int x){ int zahler = 0; for(int i = 0; i <= x; i++){ for(int j = x; j >= i; j--){ zahler = zahler + 1; } } return zahler; } int main(){ int n; cout << "Geben Sie n ein: " << endl; cin >> n; ffunk(n); cout << ffunk(n) << endl; }
-
@JohannesK sagte in Algorithmen:
ffunk(n);
cout << ffunk(n) << endl;Warum wird die Funktion jetzt zweimal aufgerufen?
-
@manni66 So kann mir das Ergebnis angezeigt werden
-
@JohannesK sagte in Algorithmen:
@manni66 So kann mir das Ergebnis angezeigt werden
Offensichtlich brachst du das erste Ergebnis nicht.