C++ Algorithmen
-
Ich bin gerade an einer Übung dran wo ich probleme hab :
In einem Array als Beispiel:
float Zahl[24]; ist gegeben soll ich die grösste Zahl in float maxTemp und niedrigste Zahl in float minTemp speichern.
Könnte man das so in etwa machen?
void CTempSensor::calculateMinMaxTemp(){ float tmp = 0; float tmph = 0; float m_Zahl[24]; for(int i = 0; i<24;i++){ if(m_Zahl[i]>m_Zahl[i+1]){ tmp = m_last24hrsTemp[i+1]; m_Zahl[i+1] = m_Zahl[i]; m_Zahl[i]= tmp; } m_maxTemp = tmp; } for(int i = 0; i<24;i++){ if(m_Zahl[i]<m_Zahl[i+1]){ tmph = m_Zahl[i+1]; m_Zahl[i+1] = m_Zahl[i]; m_Zahl[i]= tmph; } m_minTemp = tmph; } }
-
Ahh, die klassische Strategie: Kopiere drei verschiedene Programme aus dem Internet und damit der Lehrer nicht merkt, dass man abgeschrieben hat, nimmt man abwechselnd immer je eine Zeile aus jedem abgekupferten Programm
Das funktioniert vielleicht bei deinen Deutschhausaufgaben, aber nicht beim Programmieren. Und solange du dir nicht einmal die Mühe machst, es ernsthaft selber zu versuchen, hat es auch keinen Sinn, dir zu helfen.
-
Warum zwei Schleifen? Das kannste geschickter lösen: Wenn die Anzahl der Daten >0 ist initialisierst du
min
undmax
mit dem ersten Element und prüfst dann nur noch alle weiteren Elemente gegenmin
undmax
.
-
DocShoe schrieb:
Warum zwei Schleifen?
Weil eines der Programme, von denen er abgeschrieben hat,
BubblesortCocktail shaker sort war.
-
Wir dürfen ja auch im Internet schauen .
Ich habe auch den Bubblesort Algorithmus benutzt ,weil das auch legitim ist .Ich habe 2 Schleifen genommen, weil ich ja einmal den kleinsten Wert raussuchen will und einmal den grössten .
Ich habe mittels tutorials den code erstellt.
Ist er so richtig?
-
lolly2333 schrieb:
Ist er so richtig?
Findet er die größte und die kleinste Zahl?
-
Ja findet er .
Aber hier meinen ja leute das es schöner geht
Das Problem ist aber was passier wenn das i nicht nicht grösser als das i+1 ist?Müsste ich da nicht irgendwie 2 Bedingungen in der ersten if Bedingung einbauen ?
Oder denke ich zu kompliziert ?
-
lolly2333 schrieb:
Ja findet er .
Woher weißt du das? Insbesondere, wenn du dir diese Frage stellst?
lolly2333 schrieb:
Das Problem ist aber was passier wenn das i nicht nicht grösser als das i+1 ist?
-
lolly2333 schrieb:
Ja findet er
Hast du ein Pech. Mit etwas mehr Glück würds dir um die Ohren fliegen und du könntest mehr daraus lernen.
Was ich schon mal seltsam finde, ist, dass du auf 25 Elemente zugreifst, dein Array aber nur 24 Elemente hat.
-
Ich mache es mal für den maximal Wert :
void CTempSensor::calculateMinMaxTemp(){ float tmp = 0; float tmph = 0; float m_Zahl[24]; for(int i = 0; i<24;i++){ if(m_Zahl[i]>m_Zahl[i+1]){ tmp = m_Zahl[i+1]; m_Zahl[i+1] = m_Zahl[i]; m_Zahl[i]= tmp; } if(m_Zahl[i]<m_Zahl[i+1]){ tmp = m_Zahl[i]; m_Zahl[i] = m_Zahl[i+1]; m_Zahl[i+1]= tmp; } m_maxTemp =....... worin soll ich das dann speichern? } }
Ich hoffe das ihr wenig helfen könnt?
Auch wenn ihr nicht gerne anscheinend bei Aufgaben hilft
-
Doch wir helfen gerne. Hilfe zur Selbsthilfe steht ganz oben. Du greifst immernoch auf ein 25tes Element zu (i+1), das ist fatal.
-
void CTempSensor::calculateMinMaxTemp(){ float tmp = 0; float tmph = 0; float m_Zahl[24]; int length = 24-1; for(int i = 0; i<length;i++){ if(m_Zahl[i]>m_Zahl[i+1]){ tmp = m_Zahl[i+1]; m_Zahl[i+1] = m_Zahl[i]; m_Zahl[i]= tmp; } if(m_Zahl[i]<m_Zahl[i+1]){ tmp = m_Zahl[i]; m_Zahl[i] = m_Zahl[i+1]; m_Zahl[i+1]= tmp; } m_maxTemp =....... worin soll ich das dann speichern? } }
Das mit der Länge hatte ich irgendwie vergessen
Die 2 Bedingungen müssten jetzt richtig sein?
Aber die frage ist wo ich jetzt den maximalen Wert speichern soll
-
Ok, das geht zwar schöner, aber belassen wir es mal dabei. In der for-Schleife tauschst du Arrayelemente. Das verstehe ich nicht. Du willst doch das größte und kleinste Element im Array finden. Klar kann ich das Array nach der Größe sortieren und dann das erste und letzte Element ausgeben. Aber das ist ja extrem umständlich. Wenn ich zur Arbeit fahre, fahr ich ja auch nicht über Honolulu.
Was du brauchst, ist ein Merkmechanismus. Irgendjemand muss sich merken, was aktuell die kleinste und größte Zahl ist.
-
Ich poste jetzt mal die Aufgabe :
Die Methode retrieveLastMeasurements() erzeugt 24 Zufallswerte und weist Sie dem Array (1) m_last24hrsTemp[24] zu. Rufen Sie diese Methode im Konstruktor von CTempSensor auf, um
das Array zu initialisieren.
b) Die private Methode void calculateMinMaxTemp() soll aus den 24 Messwerten im Array m_last24hrsTemp[24] die Minimal- und die Maximaltemperatur heraussuchen und in die
Attribute m_minTemp bzw. m_maxTemp speichern. Implementieren Sie diese Methode. Rufen Sie die
Methode dann im Konstruktor auf, um m_minTemp und m_maxTemp zu initialisieren.Der Konstruktor zeigt zwar noch Fehler auf die ich nicht verstehe aber ok.
Die Header war so vorgegeben . Nur den Konstruktor habe ich mit den member Variablen ergänzt.Hier meine Idee :
Header:
#ifndef CTEMPSENSOR_H_ #define CTEMPSENSOR_H_ #include <iostream> using namespace std; class CTempSensor { private: float m_last24hrsTemp[24]; // array of last 24 measurements [vorgegeben] float m_minTemp; // minimum Temp of last 24hrs [vorgegeben] float m_maxTemp; // maximum Temp of last 24hrs [vorgegeben] void calculateMinMaxTemp(); public: CTempSensor(float minTemp = 0 , float maxTemp = 0); virtual ~CTempSensor(); void retrieveLastMeasurements(); // erzeugt 24 Zufallswerte [vorgegeben] void print(); // gibt die Messdaten aus [vorgegeben] float checkTempRange(float, float); // [vorgegeben] }; #endif /* CTEMPSENSOR_H_ */
cpp jetzt so:
da waren auch paar implementierte Methoden dabei:
#include "CTempSensor.h" #include <iostream> // Header fuer die Standard-IO-Objekte (z.B. cout, cin) #include <cstdlib> // fuer random values #include <iomanip> // fuer setw() #include <string> using namespace std; // Erspart den scope vor Objekte der // C++-Standard-Bibliothek zu schreiben // z.B. statt "std::cout" kann man "cout" schreiben CTempSensor::CTempSensor(float minTemp,float maxTemp) { CTempSensor::retrieveLastMeasurements(); m_minTemp = minTemp; m_maxTemp = maxTemp; } // generiert 24 Zufallswerte zw. 5 und 95 Grad [vorgegeben] void CTempSensor::retrieveLastMeasurements() { for (int i=0; i<24;i++) { m_last24hrsTemp[i] = (rand() % 900 + 50) / (float)10; } } // gibt min/max und die 24 Messwerte aus [vorgegeben] void CTempSensor::print() { cout << "min: " << m_minTemp << " | max: " << m_maxTemp << " | Letzte 24 Messwerte: "; for (int i=0; i<24;i++) { cout << setw(4) << m_last24hrsTemp[i] << " | " ; } cout << endl; } // gibt den Prozentsatz der Werte in der Range zurueck [gegeben fuer Aufgane 3c] float CTempSensor::checkTempRange(float low, float high) { int inRange = 0; int outOfRange = 0; for (int i=0; i<24;i++) { if (m_last24hrsTemp[i] < low || m_last24hrsTemp[i] > high) { outOfRange++; } else { inRange++; } } return 100*inRange/24.; } CTempSensor::~CTempSensor() { // TODO Auto-generated destructor stub } void CTempSensor::calculateMinMaxTemp(){ float m_last24hrsTemp[24]; int length =24-1; for(int i = 0; i<lenght;i++){ if(m_last24hrsTemp[i]>m_last24hrsTemp[m_maxTemp]){ m_maxTemp = i; } } for(int i = 0; i<length;i++){ if(m_last24hrsTemp[i]<m_last24hrsTemp[m_minTemp]){ m_minTemp = i; } } }
-
Ich wollte nur darauf hinweisen, dass er wieder dieselbe Frage in verschiedenen Foren postet und dann einfach versucht, Teilergebnisse aus Diskussionen auf andere Foren zu verteilen, so dass man meint, er hätte selbst etwas raus gefunden, so dass er wieder wo anders weiter geholfen bekommt, usw.
Hier ist er aktuell auch bei "uns":
http://www.informatikerboard.de/board/thread.php?threadid=3882Außerdem War er auch hier schon mit anderen Fragen, parallel auch in verschiedenen Mikrocontroller-Foren und so, Hauptsache es gibt eine C/C++ Sparte.
Hier war er zb in diesem Forum:
https://m.c-plusplus.net/344399Immer wenn eher antik wirkende C++-Aufgaben auftauchen, bei denen alle Membervariablen ein m_... vorne dran haben und alle Klassen ein großes "C", dann ist es wohl derselbe...
-
Nur so nebenbei. Mehrere Schleifen sind gar nicht notwendig für die Ermittlung des maximalen und minimalen Wertes. Das lässt sich schön in einer Schleife abbilden.
float min = m_last24hrsTemp[0]; float max = m_last24hrsTemp[0]; int len = sizeof(m_last24hrsTemp); for(int i = 1; i < len ; i++) { if(m_last24hrsTemp[i] > max) max = m_last24hrsTemp[i]; if(m_last24hrsTemp[i] < min) min = m_last24hrsTemp[i]; }
-
Deine Lösung ist fehlerhaft (Zeile 4)...
Aber so eine einfache Lösung sollte wohl jeder Programmieranfänger selber hinbekommen.
-
@inflame woran merkt es denn der Compiler in deinem Code das nur Max der maximale Wert ist ?
Du erstellst zu Beginn ja nur das Max an der Nullten , also ersten Stelle des Arrays .
Soll ich also in meinem Code auch einfach >m_maxTemp schreiben ?
Ich verstehe gar nicht warum String sich wegen mir so viel Mühe macht .
Wenn er nicht helfen will kann er doch einfach weg gehen .
Wenn ich Probleme bei einer Aufgabe habe und merke , dass im Informatiker Forum überhaupt gar nichts los ist , kann ich die Frage doch in einem anderen Forum Posten .Und bisher habe ich keinen einzigen Tipp von irgendjemanden bekommen .
Die Ansätze waren von mir selbst .
Auch in diesem Forum haben sich paar Leute nur lustig gemacht um eine Ansätze .
Oder sage ich was falsch ?
-
lolly33332 schrieb:
Ich verstehe gar nicht warum String sich wegen mir so viel Mühe macht .
Weil du ein Fass ohne Boden bist, in dem Hilfsbereitschaft sinnlos versenkt wird. In Foren wie diesem sind Leute unterwegs, die anderen helfen wollen. Wenn lernresistente Leute wie du dafür sorgen, dass Hilfsbereitschaft sinnlos vergeudet wird, dann wird anderen, die die Hilfe eher verdienen würden, schlechter geholfen. Das wurmt hilfbereite Leute wie as_string und mich. Ich bin etwas überrascht, dass du hier noch Antworten bekommst, wo doch schon nach dem ersten Beitrag klar war, dass das völlig sinnlos ist. Ich zwinge ungern andere Leute, jemandem nicht zu helfen, aber das hier geht echt zu weit: [/closed]