Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  Vectorinhalt mit Eingabe verlgeichen  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
H4rdstyl3
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.04.2011
Beiträge: 19
Beitrag H4rdstyl3 Mitglied 17:30:03 24.04.2012   Titel:   Vectorinhalt mit Eingabe verlgeichen            Zitieren

Hiho,

Ich muss en Prog schreiben, indem ich in ner Schleife einen Wert einlese, den in zwei Variablen speicher und dann überprüfen muss, ob der eingebene Wert der größte bzw. der kleinste bis jetzt ist.... Ich komm nur einfach nicht übers einlesen hinweg weil ich offensichtlich irgendwas übersehe...-.-
hier mein Code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include<string>
#include<vector>
 
using namespace std;
int main(){
    double zahl=0;
    double zahl2=0;
    double zahl3=0;
    char schleifenbeender =' ';
    char beender=' ';
    vector<double> werte;
   
   
    while(cin>>zahl && schleifenbeender!='b'){
                    werte.push_back(zahl);
                    cout << zahl << endl;
                    zahl=zahl2;
    // ab hier weiß ich nicht mehr weiter
                   
   
    system("Pause");
   
    return 0;
}


hoffe mir kann geholfen werden

LG
H4rdstyl3
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.04.2011
Beiträge: 19
Beitrag H4rdstyl3 Mitglied 17:34:30 24.04.2012   Titel:              Zitieren

edit: ich möchte keinen kompletten Lösungsweg oder sonstiges, lediglich einen kleinen Hint wie ich die Sache angehen könnte ;)
pyhax
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.11.2011
Beiträge: 692
Beitrag pyhax Mitglied 17:42:59 24.04.2012   Titel:              Zitieren

1. Speichere den aktuellen Minimalwert / Maximalwert.
2. Prüfe, ob eingelesener Wert > Maximalwert oder < Minimalwert ist. Wenn ja, überschreibe Minimalwert bzw. Maximalwert.

_________________
Ich kann (teilweise): C++, Python, Java(ist lange her), PHP, D (Anfänger)
Helmut.Jakoby
Mitglied

Benutzerprofil
Anmeldungsdatum: 04.06.2009
Beiträge: 63
Beitrag Helmut.Jakoby Mitglied 17:50:24 24.04.2012   Titel:              Zitieren

Da ich es jetzt schon mal geschrieben habe....

Du hast nichts übersehen, sondern Du willst einen Lösungsansatz.
So wie ich das verstehe, sollst du keinen vector nutzen, sondern die zwei Variablen. Die könnten besser den Namen Min und Max haben (anstelle von zahl2 und zahl3)
Du initialisierst diese Variablen wie gehabt mit 0.
Nach dem einlesen von 'zahl' schaust du in Min, ob dort ein Wert kleiner dem eingelesenen Wert 'zahl' ist. Wenn nein, schreibst die den eingelesenen Wert 'zahl' in Min; Min hat jetzt den kleinsten jemals eingelesenen Wert und der eingelesenen Wert 'zahl' ist der bislang kleinste Wert, was Du ja ausgeben kannst.
Ähnlich verfährst Du mit Max.
Das machst Du natürlich solange in einer Schleife bis zum schleifenbeender.
PS. Wenn der eingelesene Wert 'zahl' nicht der kleinste oder größte Wert ist, solltest Du das auch ausgeben.
Gruß
pyhax
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.11.2011
Beiträge: 692
Beitrag pyhax Mitglied 18:04:04 24.04.2012   Titel:              Zitieren

Die Variablen sollten nicht mit Null initialisiert werden, sondern min sollte mit std::numeric_limits<double>::infinity() und max mit -std::numeric_limits<double>::infinity() initialisiert werden, da sonst negative Zahlen nicht als Min oder Max erkannt werden.

_________________
Ich kann (teilweise): C++, Python, Java(ist lange her), PHP, D (Anfänger)
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17941
Beitrag SeppJ Moderator 18:09:18 24.04.2012   Titel:              Zitieren

Die Variablen sollten mit dem ersten Wert initialisiert werden. Das ist die allgemeinste Lösung und funktioniert egal, um was für Objekte es sich handelt. Dann kann man sich diese Lösung als Funktionstemplate aufschreiben und immer wieder benutzen :live: . Ups, gibt's ja schon genau so in der Standardbibliothek :) .

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List


Zuletzt bearbeitet von SeppJ am 18:13:40 24.04.2012, insgesamt 2-mal bearbeitet
pyhax
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.11.2011
Beiträge: 692
Beitrag pyhax Mitglied 18:23:10 24.04.2012   Titel:              Zitieren

SeppJ schrieb:
Die Variablen sollten mit dem ersten Wert initialisiert werden. Das ist die allgemeinste Lösung und funktioniert egal, um was für Objekte es sich handelt. Dann kann man sich diese Lösung als Funktionstemplate aufschreiben und immer wieder benutzen :live: . Ups, gibt's ja schon genau so in der Standardbibliothek :) .


Meinst du min_element und max_element? Aber bei dem Beispiel ist es sinvoller, es selber zu schreiben, da man die Variablen min und max ja eh braucht um festzustellen, ob ein neuer min oder max wert hinzugekommen ist.

_________________
Ich kann (teilweise): C++, Python, Java(ist lange her), PHP, D (Anfänger)


Zuletzt bearbeitet von pyhax am 18:26:36 24.04.2012, insgesamt 1-mal bearbeitet
H4rdstyl3
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.04.2011
Beiträge: 19
Beitrag H4rdstyl3 Mitglied 18:31:53 24.04.2012   Titel:              Zitieren

Danke erstmal für die Antworten!

@Jakoby aber wie sollte ich das ohne Vector Container machen, dann würde ja nach jedem einlesen neue Zahlen als Referenz da sein anstatt einer eingelesenen Zahlenmenge die man zum Vergleich für die kleinste bzw größte Zahl braucht?

@Phyax & Seppj:

Bin noch ziemlich am Anfang des Buches und es wurden gerade mal logische Operatoren und eben am Ende des Kapitels der Vector Container vorgestellt..
Sind das was Phyax gepostet hat auch nch zwei weitere Vector-Container die von +unendlich bis - unendlich gehen oder was?

LG
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17941
Beitrag SeppJ Moderator 19:20:42 24.04.2012   Titel:              Zitieren

pyhax schrieb:

Meinst du min_element und max_element?
Ja. Und ich weiß, die laufen auf Iteratoren, da sie die Elemente nicht kopieren wollen. Aber wenn man wie hier Iteratoren hat, die ungültig werden können, dann ist das auch ganz flott selbst geschrieben:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <utility>
#include <iterator>
 
template<typename ForwardIterator>
std::pair<typename ForwardIterator::value_type, typename ForwardIterator::value_type>
minmax(ForwardIterator first, ForwardIterator last)
{
  typedef typename ForwardIterator::value_type val_t;
 
  val_t min = *first, max = *first;
  for (;first != last; ++first)
    {
      if (*first < min) min = *first;
      if (*first > max) max = *first;
    }
  return std::make_pair(min, max);
}
 
int main ()
{
  using namespace std;
  istream_iterator<double> it(cin), end;
  pair<double, double> result = minmax(it, end);
  cout << "Kleinste Zahl: " << result.first << '\n'
       << "Größte Zahl: " << result.second << '\n';
}


Oder etwas allgemeiner mit C++11, so dass die Funktion auch Pointer verträgt:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <tuple>
#include <iterator>
#include <type_traits>
 
template<typename ForwardIterator>
auto
minmax(ForwardIterator first, ForwardIterator last)
  -> std::tuple<
    typename std::remove_const<typename std::remove_reference<decltype(*first)>::type>::type,
    typename std::remove_const<typename std::remove_reference<decltype(*first)>::type>::type
    >
{
  typedef typename std::remove_const<typename std::remove_reference<decltype(*first)>::type>::type val_t;
 
  val_t min = *first, max = *first;
  for (;first != last; ++first)
    {
      if (*first < min) min = *first;
      if (*first > max) max = *first;
    }
  return std::make_tuple(min, max);
}
 
int main ()
{
  using namespace std;
  double min, max;
  tie(min, max) = minmax(istream_iterator<double>(cin), istream_iterator<double>());
  cout << "Kleinste Zahl: " << min << '\n'
       << "Größte Zahl: " << max << '\n';
}

(In C++11 sind std::min und std::max übrigend in der Lage, eine ganze Liste von Elementen als Argument zu verarbeiten)


Entschuldigung an die Threadersteller für die Komplettlösung! Ich glaube so sehr hilfreich ist das für einen Anfänger sowieso nicht wirklich.


Fällt eigentlich jemandem etwas besseres für die Zeilen 10, 11 und 14 im zweiten Beispiel ein? Ich gebe ja gerne zu, dass ich in C++11 noch nicht so fit bin, manchmal übersehe ich einfache Lösungen.

_________________
Du brauchst Hilfe?, Buchempfehlungen für C++,
Wie man in Fragen den richtigen Code postet,
The Definitive C++ Book Guide and List


Zuletzt bearbeitet von SeppJ am 19:22:31 24.04.2012, insgesamt 1-mal bearbeitet
314159265358979
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4658
Beitrag 314159265358979 Mitglied 19:29:47 24.04.2012   Titel:              Zitieren

C++:
typename std::iterator_traits<ForwardIterator>::value_type
c++.de :: C++ (auch C++0x und C++11) ::  Vectorinhalt mit Eingabe verlgeichen  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.