viertel
Senior Dabei seit: 04.03.2003 Mitteilungen: 27700
Herkunft: Hessen
Beitrag No.40, eingetragen 2020-11-25
Welchen Sinn hat Beitrag #37?
Soweit ich erkennen kann ist es nur ein Quote von #36 🤔
In #36 habe ich die Code-Darstellung vervollständigt.
Zum einen solltest du bei längeren Codes diesen mit Numerierung ausgeben, also auf das [num] von [Quelltext [num.] klicken.
Und wenn du es dann noch schaffst, bei dem eingefügten Text
\sourceon nameDerSprache
\numberson
\sourceoff
das nameDerSprache durch C++ zu ersetzen, dann ist ein weiterer Schritt für die Lesbarkeit getan.
2020-11-25 00:37 - piteo in Beitrag No. 34 schreibt:
Das Programm will die geschweifte Klammer vor else haben, richtig, weil das, was hinter if (...) kommt, entweder eine Anweisung ist, oder eine Menge von Anweisungen zwischen geschweiften Klammern.
Genau so verhält es sich auch bei der for-Schleife: Nach for (...) kommt eine öffnende geschweifte Klammer, die zugehörige schließende ist die zweite vor else. So gehört "else" also zu "for" statt zu "if", und das mag das Programm nicht.
Noch etwas:
else-Schleifen gibt es nicht. Hinter "else" kommt das, was Dein Programm machen soll, wenn die Bedingung in den Klammern hinter "if" nicht erfüllt ist. Und das ist nicht: dem "rufenden" main-Programm zu sagen: "true", alles stimmt. Das wäre zu früh, wenn die for-Schleife noch gar nicht dazu gekommen ist, i auf 2 zu erhöhen (das macht das i++), damit das dritte Element von count angesehen wird (das mit dem Index 2).
Die Idee der zweiten Schleife ist: Wenn eine Ziffer nicht genau einmal vorkommt, dann kann dem main-Programm sofort mitgeteilt werden: false! Ansonsten müssen aber alle 9 Ziffern geprüft werden, um zu wissen: "Jede Ziffer kommt genau einmal vor". Erst nach Abschluss der Schleife, wenn nämlich i nicht mehr kleiner als 10 ist, kann dem main-Programm mitgeteilt werden: true!
Ich habe den Kommentar, das "return true;" hinter die for-Schleife einzufügen, beherzigt. Nun funktioniert das einigermaßen. Was mir aber auffällt: Es werden sehr viele true´s zurückgegeben. Ich frage mich, woran das jetzt liegt? Müssen nicht nur lediglich "9" Stück (true´s) zurückgegeben werden, da "Feld[9]"ist?:
#include <iostream>
using namespace std;
bool justOnce(int *feld, int size);
bool justOnce(int feld[], int size)
{
if (size==-1)
{
feld[0] = -7;
return false;
}
if (feld == NULL)
throw runtime_error("nullptr not expected");
int count[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
for (int i = 0; i < size; i++)
{
if (feld[i] <= 9 && feld[i] >= 1)
count[feld[i]]++;
}
for (int i = 1; i < 10; i++)
{
if (count[i] != 1)
{
cout << "false" << endl;
return false;
}
else
{
cout << "true" << endl;
}
}
return true;
};
int main()
{
int feld[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
justOnce(feld, 9);
cout << justOnce(feld, 9) << endl;
return 0;
}
Bei "false" werden mir 8 false´s ausgegeben. Aber: Ich habe ja {1, 2, 3, 9, 5, 6, 7, 8, 9}; - das sind 9 Felder.
Hier ist das Feld[8] "false". Irgendwas stimmt nicht oder? Ist das normal?
Und wieso macht das Programm hier mit der zweiten for-Schleife weiter, nachdem "return false;" ausgeführt worden ist? Wieso funktioniert das hier? Ich blicke hier nicht durch ... ;(
viertel
Senior Dabei seit: 04.03.2003 Mitteilungen: 27700
Herkunft: Hessen
Beitrag No.42, eingetragen 2020-11-25
Du kannst uns erzählen, was du willst😲
Bei dieses Fragen hast du nie und nimmer einen Bleistifttest (auch Schreibtischtest genannt) durchgeführt. Oder zumindest nicht ordentlich.
Denn dann würde dir sofort auffallen, woher die ganzen trues und falses kommen.
Kajam
Aktiv Dabei seit: 18.02.2020 Mitteilungen: 316
Beitrag No.44, vom Themenstarter, eingetragen 2020-11-25
2020-11-25 17:18 - DerEinfaeltige in Beitrag No. 39 schreibt:
Du rufst die Funktion in der main zweimal auf.
Im ersten Fall erhälst du daher in der zweiten Schleife 9 mal die Ausgabe des Strings "true", insgesamt also 18 mal.
Weiterhin gibst du das Ergebnis des Funktionsaufrufs an die Konsole aus.
Dieses ist "1", da der bool'sche Wert true als Zahl 1 interpretiert wird.
Im zweiten Fall gibst du erst für 1,2,3 jeweils den String "true" an die Konsole aus.
Bei 4 wird dann die if-Bedingung erfüllt, der String "false" ausgegeben und der Wert false zurückgegeben.
Es wird also zweimal "true", "true", "true", "false" und anschließend der Rückgabewert false als 0 ausgegeben.
Das ganze verdoppelt sich also. Und nach false wird auch das Programm beendet.
Was ist denn die Aufrufung der Funktion in der main?
Das hier: justOnce(feld, 9); ?
Wo ist denn die zweite Aufrung?
Könntest du mir das erklären, weil das ist mir neu.
Kajam
Aktiv Dabei seit: 18.02.2020 Mitteilungen: 316
Beitrag No.45, vom Themenstarter, eingetragen 2020-11-25
2020-11-25 17:24 - viertel in Beitrag No. 42 schreibt:
Du kannst uns erzählen, was du willst😲
Bei dieses Fragen hast du nie und nimmer einen Bleistifttest (auch Schreibtischtest genannt) durchgeführt. Oder zumindest nicht ordentlich.
Denn dann würde dir sofort auffallen, woher die ganzen trues und falses kommen.
Kajam
Aktiv Dabei seit: 18.02.2020 Mitteilungen: 316
Beitrag No.46, vom Themenstarter, eingetragen 2020-11-25
Das Problem ist jetzt: Ich möchte, dass mir alle true´s und false´s via "cout" ausgegeben werden. Das geht aber doch gar nicht, wenn return false; und return true; im Programm integriert sind, denn das Programm schließt sich immer, sobald eins davon erfüllt ist. Das heißt, ich lösche die Ausgaben via "cout" und lasse es einfach mit cout << justOnce(feld, 9) ausgeben. Ich bekomme nicht einzelne Ausgaben der Felder, ob true oder false, sondern das Endresultat, ob ture(1) oder false(0).
DerEinfaeltige
Senior Dabei seit: 11.02.2015 Mitteilungen: 2621
Beitrag No.47, eingetragen 2020-11-25
2020-11-25 17:59 - Kajam in Beitrag No. 46 schreibt:
Das Problem ist jetzt: Ich möchte, dass mir alle true´s und false´s via "cout" ausgegeben werden.
Warum willst du das?
Die Aufgabe ist, eine Funktion zu implementieren, die überprüft, ob das Array die gewünschte Eigenschaft besitzt, jede Zahl von 1 bis 9 exakt einmal zu enthalten.
Die Antwort ist als bool'scher Wert zurückzugeben.
Eine Ausgabe ist allenfalls zu Test- oder Demonstrationszwecken interessant, hat aber weder mit der Funktionalität noch der Aufgabenstellung etwas zu tun.
----------------- Why waste time learning when ignorance is instantaneous?
- Bill Watterson -
Kajam
Aktiv Dabei seit: 18.02.2020 Mitteilungen: 316
Beitrag No.50, vom Themenstarter, eingetragen 2020-11-25
1. Es wird ein Array definiert.
2. Die Funktion boolOnce(feld, 9) über der Main Funktion wird ausgeführt.
3. Es wird die Funktion ausgegeben. 1 oder 0.
Kajam
Aktiv Dabei seit: 18.02.2020 Mitteilungen: 316
Beitrag No.52, vom Themenstarter, eingetragen 2020-11-25
Und hier wird nur einmalig 1 oder 0 zurück gegeben, nicht doppelt. Aber davor alles doppelt (mehrmals) mit den ganzen trues und falses. Woran lag das? Ich will das noch verstehen :)
DerEinfaeltige
Senior Dabei seit: 11.02.2015 Mitteilungen: 2621
Beitrag No.53, eingetragen 2020-11-25
C++
justOnce(feld, 9);
Hier rufst du die Funktion auf.
Als Seiteneffekt werden ein paar Ausgaben an die Standardausgabe geleitet.
Der Rückgabewert der Funktion wird ignoriert.
Hier rufst du die Funktion erneut mit den gleichen Argumenten auf und leitest den Rückgabewert diesmal an die Standardausgabe.
Wieder treten als Seiteneffekt ein paar Ausgaben an die Standardausgabe auf.
----------------- Why waste time learning when ignorance is instantaneous?
- Bill Watterson -
Kajam
Aktiv Dabei seit: 18.02.2020 Mitteilungen: 316
Beitrag No.54, vom Themenstarter, eingetragen 2020-11-25
Aso, beides (justOnce(feld, 9);, und cout << justOnce(feld, 9) << endl;)
ist eine Funktionsaufrufung und quasi das gleiche? Das heißt, ich kann eins davon wegnehmen? Dann am besten das erste, denn das zweite ignoriert den Ruckgabewert 0 oder 1 also nicht. Alles klar.
viertel
Senior Dabei seit: 04.03.2003 Mitteilungen: 27700
Herkunft: Hessen
Beitrag No.55, eingetragen 2020-11-26
Und immer noch behaupte ich: Bei einem ordentlichen Schreibtischtest hättest du selbst gemerkt, woher die doppelte Ausgabe kommt!
Aber es ist ja so viel einfacher, sich hier die Finger wund zu schreiben und zu fragen, solange noch jemand Lust hat, zu antworten.
In einer Klausur hast du dann niemanden, den du fragen kannst.
Wenn du dann die Techniken nicht kennst/kannst, läufst du gegen die Wand😛