20 Leute stossen an
-
Hallöle
Als Programmieranfänger sucht man sich hier und da immer mal wieder Aufgaben aus um zu testen ob man sie lösen kann. Wer nicht programmiert der lernt auch nicht. Ich habe eine Aufgabe gefunden und auch gelöst. Würde nur mal gerne wissen ob das Sinn ergibt die so zu lösen oder ob ich noch zu kompliziert denke.
Die Aufgabe ist im Quelltext vermerkt.#include <iostream> #include <cstdlib> //return EXIT_SUCCESS using namespace std; int rechnen(int); //Funktionsdeklaration (Prototyp) int main(int argc, char *argv[]) { int anzahl; int eingabe = 20; //Kein fester Wert (normalerweise Eingabeprompt) anzahl = eingabe; //Hilfsvariable, da Veränderung, für Ausgabe wird aber Original gebraucht!! if(eingabe <= 1) cout << "MEHR als 2 eingeben" << endl; //Weniger als 2 Personen ist sinnlos for( anzahl; anzahl >= 1; --anzahl ) { rechnen(anzahl); /*Es soll nur die Ausgabe des letzten Wertes erfolgen, NICHT die Zwischenergebnisse, also erst rechnen lassen, dann das letzte Ergebnis ausgeben. Test wann 'anzahl' == 1 ist, dann ausgeben*/ if(anzahl == 1) cout << "Bei " << eingabe << " Leuten wird insgesamt " << rechnen(anzahl) << " mal angestossen" << endl; } //Anmerkung: anzahl ist verändert '0', eingabe ist 'wie vorgegeben' return EXIT_SUCCESS; } int rechnen( int anzahl ) { //Implementierung static int neueAnzahl = 0, zwischen = 0; //Initialisierung ist zwar nicht notwendig ... zwischen = --anzahl; neueAnzahl = zwischen + neueAnzahl; return neueAnzahl; } /*Aufgabe: Es befinden sich eine bestimmte Anzahl Leute in einem Raum die alle miteinander anstossen sollen. Jeder stösst mit jedem an, wie oft wird insgesamt angestossen?. Mathematisch gesehen -> x = y * (y - 1) / 2 --- Arithmetische Folge aber mit MINUS 1 Hier aber mal mit Schleife und Funktion ausprobiert! In der Funktion 'static' Variable um den Wert dauerhaft zu speichern während der Funktionsabarbeitung*/
Ich habe zuerst die Aufgabe mathematisch gelöst mit Papier und Stift. Arithmetische Folge
Doch ich wollte Schleifen und Funktionen üben. Rekursive Funktion habe ich nicht hinbekommen. Ich bastel noch dran.
Zeiger kenn ich noch nicht und Klassen will ich erst lernen wenn ich weiss wie man mit Funktionen und Schleifen einigermassen 'richtig' umgeht.Für Kommentare und Rügen wäre ich dankbar.
Ich erwarte keine Problemlösungen, die erarbeite ich mir selber.Danke im voraus und schönen Tag noch.
-
denkst zu kompliziert
-
Viel zu kompliziert!
-
aber derbe
-
Du solltest an deinem Stil noch etwas arbeiten. Die Einrückung macht den Codefluss virwirrender anstatt verständlicher. Ansonsten ist es positiv zu sehen, dass jemand weiss, dass es auch eine Leertaste auf der Tastatur gibt.
Zu deiner Aufgabe - da kann ich mich meinem Vorredner nur anschliessen. Das ist noch zu kompliziert. Du kannst die Formel doch auch direkt umsetzen, ohne Schleifen.
-
groovemaster schrieb:
Du solltest an deinem Stil noch etwas arbeiten. Die Einrückung macht den Codefluss virwirrender anstatt verständlicher.
Liegt, denke ich, am Forum. Wenn im Quelltext Tabs und Leerzeichen gemischt werden dann bekommt das Forum Probleme mit der Darstellung, da es sich für eine Tab-Breite entscheiden muss, die möglicherweise mit der von Mulinexus Editor differiert
.
-
Du kannst die Anzahl der "Stöße" auch mit
( n )
( 2 )
ausdrücken (n über 2), was ja
m! / n! * (m-n)! ist
So könntest du also letztlich die Rechnung auf die Fakultät zurückführen und das Ergebnis in einer Zeile ausrechnen.
-
interpreter schrieb:
Du kannst die Anzahl der "Stöße" auch mit
( n )
( 2 )
ausdrücken (n über 2), was ja
m! / n! * (m-n)!Also bei mir ist , wie bereits vom OP erkannt wurde. Du hattest m und n zu späterer Stunde vertauscht
.
-
Das ich das Programm auch mit der Formel hätte schreiben können war ja klar.
#include <iostream> #include <cstdlib> //return EXIT_SUCCESS using namespace std; int main(int argc, char *argv[]) { int eingabe = 20, ergebnis; if(eingabe >= 2) { ergebnis = eingabe * (eingabe -1) / 2; cout << "Bei " << eingabe << " Leuten wird " << ergebnis << " mal angestossen" << endl; } else cout << "Das war wohl nix" << endl; return EXIT_SUCCESS; }
Wie ich in meinem Posting ja erwähnte.
Ich wollte die Formel umgehen und es mit Funktion und Schleife probieren um zu lernen wie man damit umgeht. Die Rekursive Funktion habe ich noch nicht begriffen, deshalb der Umweg.
Es sollte einfach nur eine 'Alternative' Lösung sein. Ich will halt noch üben.
Ansonsten ist es natürlich Quatsch, ich weißDanke & Gruß
-
Mulinexus schrieb:
Ich wollte die Formel umgehen und es mit Funktion und Schleife probieren um zu lernen wie man damit umgeht.
Deswegen kam ja der Vorschlag von interpreter es über Fakultät und Binomialkoeffizient zu lösen.