minimum maximalwert ermitteln ?
-
Was passiert, wenn man bei Anzahl oder Wert 0, negative Zahl, Kommazahl, Buchstaben usw. eingibt?
-
Wie es im C++ den <algorithm>
gibt gibt es im C <cstdlib> bzw. <stdlib.h>Und dort gibt es einen qsort. Wobei vielleicht ein
binarysearch besser waehre.Wie man den braucht (qsort):
http://www.openbsd.org/cgi-bin/man.cgi?query=qsort&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html
-
joomoo schrieb:
Aber genau das wird doch mit meiner If-Abfrage gemacht?!?
Ja, im ersten Schleifendurchlauf. Ich meinte eher bei der Initialisierung
Spart die Verwendung von NaN oder winzigkleiner bzw. riesengroßer Werte als Startwert.
-
LordJaxom schrieb:
joomoo schrieb:
Aber genau das wird doch mit meiner If-Abfrage gemacht?!?
Ja, im ersten Schleifendurchlauf. Ich meinte eher bei der Initialisierung
Spart die Verwendung von NaN oder winzigkleiner bzw. riesengroßer Werte als Startwert.Aber bei der Initialisierung weißt du den Startwert doch noch gar nicht oder versteh ich dich falsch?
mfg.
-
Nee, ist schon ok. Ich hab Dich falsch verstanden, nicht umgekehrt, sorry
Was besseres (ausser nen bool isInitialized oder das Einlesen des ersten Wertes noch vor der Schleife) fällt mir momentan auch nicht ein.
-
LordJaxom schrieb:
Nee, ist schon ok. Ich hab Dich falsch verstanden, nicht umgekehrt, sorry
Was besseres (ausser nen bool isInitialized oder das Einlesen des ersten Wertes noch vor der Schleife) fällt mir momentan auch nicht ein.
die erste abfrage außerhalb der schleife wäre zumindest genau so gut. vorteile: es wird garantiert, dass mindestens ein wert eingelesen wird, denn sonst ist max und min nicht definiert, und es repräsentiert die logische struktur besser (ansichtssache). nachteil: zweimal die abfrage im quelltext.
-
jez versteh ichs ja
thx für hilfe
-
Hi... Hab auch so ein ähnliches Problem. Lese meine analogen Werte(0-5V) (0-255) in 10ms Takt von einer Velleman Karte aus. Und aus diesen sich ständig ändernden Werten möchte ich den Maximalwert bestimmen. Das was schon geschrieben wurde passt leider eher auf eine geringe Anzahl von Werten die schon feststehen.
Hat jemand ne Idee wie ich das Umstezen könnte?!
Danke falls das noch jemand ließt nach 7 Jahren
-
Mach einen neuen Thread auf, den 6 oder 7 Jahre alten thread liest sich keiner mehr durch.
Und wenn du aus einer Liste (egal wie viele Werte, egal wann und woher die stammen) den größten/kleinsten Wert herausfinden willst, dann geht das so:
- minimum <- erster Wert der Liste - maximum <- erster Wert der Liste - iteriere durch die Liste * falls aktueller Wert kleiner als minimum + minimum <- aktueller Wert * falls aktueller Wert kleiner als maximum + maximum <- aktueller Wert - gib maximum aus - gib minimum aus
Und sowas solltest du nach der ersten Seite eines jeden Tutorials doer Buches selbst hinkriegen.
-
Das kann man auch machen, wenn man die Werte gerade eingelesen hat.
Nebenbei kann man noch die Anzahl ermitteln und die Werte aufsummieren. Dann hat man auch gleich den Mittelwert.
-
Phobos5000 schrieb:
Das was schon geschrieben wurde passt leider eher auf eine geringe Anzahl von Werten die schon feststehen.
Hat jemand ne Idee wie ich das Umstezen könnte?!
Ganz genau so. Zumindest, wenn es in diesem Thread vernünftig gemacht wurde, was ich hoffe, dann spielt es keinerlei Rolle, wie viele Werte es sind und ob diese schon von vornherein feststehen oder erst nach und nach kommen. Aber ich will mir jetzt keinen langen Uraltthread durchlesen.
P.S.: Beim Überfliegen sehe ich, dass du dir hier einen C-Thread heraus gesucht hast, der falsch eingeordnet ist, wie schon im zweiten Beitrag gesagt wird. Absicht oder Unkenntnis? Willst du C oder C++ machen? In C++ geht das, was du beschreibst, so:
#include <iterator> #include <stdexcept> template <typename Iterator> typename std::iterator_traits<Iterator>::value_type dereferenced_max_element(Iterator begin, Iterator end) { if (begin == end) throw std::logic_error("Tried to find maximum of empty set!"); typename std::iterator_traits<Iterator>::value_type maximum = *begin; for(;begin != end; ++begin) if (*begin > maximum) maximum = *begin; return maximum; } #include <iostream> int main() { // Statische Menge int array[]={48,65,2,36,65,564,232,2,65,5,7}; std::cout << dereferenced_max_element(std::begin(array), std::end(array)) << '\n'; // Dynamische Menge std::istream_iterator<int> it(std::cin), end; std::cout << dereferenced_max_element(it, end) << '\n'; }
-
SeppJ schrieb:
In C++ geht das, was du beschreibst, so:
...
Besser noch
das Raddie Schleife nicht neu erfinden und std::max_element aufrufen.
-
camper schrieb:
SeppJ schrieb:
In C++ geht das, was du beschreibst, so:
...
Besser noch
das Raddie Schleife nicht neu erfinden und std::max_element aufrufen.Ich bin fälschlich davon ausgegangen, dass max_element nicht mit so etwas wie einem istream_iterator funktioniert, wie es hier gefragt war. Kurzer Test hat ergeben, dass es anscheinend doch geht, was natürlich viel besser ist. War mir bisher gar nicht bewusst, dass die stream_iteratoren intern ihre Werte speichern.
Ich kann mich natürlich damit heraus reden, dass der Thread-Wiedereröffner seine Iteratoren nicht unbedingt so handhabt. Vielleicht vergessen diese ihren Werte. Ist das dann noch ein gültiger Iterator? Ach, ich glaube ich denke gerade viel zu viel in das Problem hinein, der Thread-Wiedereröffner versteht wahrscheinlich sowieso nur noch Bahnhof und am Ende stellt sich heraus, dass er C machen möchte.
-
SeppJ schrieb:
am Ende stellt sich heraus, dass er C machen möchte.
was die definitiv bessere wahl ist.
wie wir alle wissen.
-
max_element erfordert lt. Standard einen ForwardIterator.
-
Bashar schrieb:
max_element erfordert lt. Standard einen ForwardIterator.
Eine Schwäche in der Iteratorhierarchie. istream_iterator hätte eigentlich alles, was ein forward_iterator bräuchte, außer dass er natürlich kein output iterator ist. Daher ist er nur als input iterator eingeordnet. max_element bräuchte natürlich die output-Eigenschaft gar nicht, braucht aber die multi-pass Eigenschaft, die der forward Iterator bringt. Der aber dummerweise auch mindestens noch ein input und ein output Iterator sein muss.
Meine Funktion kommt jedenfalls auch mit input Iteratoren zurecht, die nicht die multi-pass Eigenschaft haben, zu dem Preis, dass eventuell eine Exception geworfen wird. Möge der Thread-Nekromant entscheiden, von welcher Kategorie seine Iteratoren sind und dann entsprechend wählen.
-
SeppJ schrieb:
]Ganz genau so. Zumindest, wenn es in diesem Thread vernünftig gemacht wurde, was ich hoffe, dann spielt es keinerlei Rolle, wie viele Werte es sind und ob diese schon von vornherein feststehen oder erst nach und nach kommen. Aber ich will mir jetzt keinen langen Uraltthread durchlesen.
Hi Danke erstmal für die ganzen Zuschriften. Soweit ich das deinem Code erkennen kann setzt du da einen Maximal-Wert vorraus. Ich habe leider kein Maximal wert. Aus den (schätzung 1000 Werten) will ich den Maximalwert ermitteln ohne das ich einen Max Wert habe mit dem ich das vergleichen kann.
Sprich Beispiel:
Wert Zeit- 50 = 10ms
- 64 = 20ms
- 68 = ...
- 80 = ...
Aus den Werten will ich den Max wert haben. Aber womit ich die vergleichen soll versteh ich nicht. Danke für eure Hilfe bei meiner Unwissenheit
-
Dann initialisiere den Maximalwert mit dem kleinst-möglichen Wert dieses Datentyps. Das wurde hier auch schon gesagt, ist das so schwerz zu verstehen?
Angenommen Du bekommst nur positive Werte, dann setzt Du z.B.
max = -1
am Anfang.
Und für alle Messwerte:
`if(aktueller_messwert > max)max = aktueller_messwert `
-
Du kannst ja auch mitzählen wieviel Werte du schon bearbeitet hast.
Und beim ersten Durchlauf setzt du max auf den ersten Wert.asdyxc schrieb:
Angenommen Du bekommst nur positive Werte, dann setzt Du z.B.
max = -1
am Anfang.Da wäre 0 angebrachter, dann kann man auch einen unsigned Typ nehmen kann.
Zudem gibt es ja auch noch <climits> wo diese Grenzen definiert sind.
Aber dann muss man immer darauf achten, dass die Grenzen auch zu dem Variablen-Typ passt.
-
Zudem gibt es ja auch noch <climits> wo diese Grenzen definiert sind.
Ich hoffe, du hast nur aus Versehen ein c vor den Headernamen gesetzt.