Kann Aufgabe nicht lösen:(


  • Mod

    @krümelkacker: Eigentlich ist da noch eine Menge mehr falsch. Eigentlich sogar alles außer int art_nr; und int bestand; .

    Dem Threadersteller würde ich dringend dazu raten, das bisherige Programm gänzlich zu löschen und nochmal ganz sauber von vorne anzufangen, anstatt das bisherige Programm auszubessern.



  • Negative Bestände und Artikelnummern machen aber auch nicht viel Sinn.



  • was noch auffällt:
    - <stdio.h> ist kein C++-header sondern ein C-Header. In C++ benutzt man <cstdio>, wenn überhaupt.
    - du benutzt cout und endl ohne namespace std - das wird so kaum compilieren

    Wenn du Probleme hast solltest du konkret angeben, womit du probleme hast - und vor allem Fehlermeldungen vom Compiler gleich mitliefern wenn denn welche kommen.


  • Mod

    Fellhuhn schrieb:

    Negative Bestände und Artikelnummern machen aber auch nicht viel Sinn.

    Stimmt. Ich wollte zuerst nicht kleinlich sein, aber an einer Universität kann man auch etwas mehr Anspruch voraussetzen. Insofern: Es ist sogar alles falsch.



  • vll nicht unbedingt die schönste lösung, aber so gehts z.Bsp.

    entspricht auch ein einigen stellen nicht der aufgabenstellung - copy&paste ist also nicht^^

    /* medikament.hpp */
    #include <iostream>
    #include <string>
    
    class medikament
    {
    public:
    	typedef unsigned long artikel_nr_t;
    	typedef unsigned long size_t;
    	typedef float preis_t;
    
    	explicit medikament(artikel_nr_t artikel_nr = artikel_nr_t(), const std::string name = "unbekannt", preis_t preis = preis_t(), size_t bestand = size_t())
    	:	name(name), artikel_nr(artikel_nr), bestand(bestand), preis(preis)
    	{}
    
    	size_t sag_bestand() const
    	{
    		return bestand;
    	}
    
    	std::ostream& ausgabe(std::ostream& output = std::cout) const
    	{
    		output << name << " (" << artikel_nr << "), bestand:" << bestand << ", preis: " << preis;
    		return output;
    	}
    
    private:
    	std::string name;
    	artikel_nr_t artikel_nr;
    	size_t bestand;
    	preis_t preis;
    };
    
    std::ostream& operator<< (std::ostream& s, const medikament& these)
    {
    	return these.ausgabe(s);
    }
    
    /* main.cpp */
    
    #include <iostream>
    #include <iterator>
    #include <vector>
    
    #include "medikament.hpp"
    
    template<typename T>
    struct wenig_da
    {
    	wenig_da(T untere_grenze)
    	:	untere_grenze(untere_grenze)
    	{}
    
    	template<typename U>
    	bool operator()(const U& these) const
    	{
    		return these.sag_bestand() < untere_grenze;
    	}
    
    private:
    	T untere_grenze;
    };
    
    template<typename InputIterator, typename OutputIterator, typename Predicate>
    OutputIterator copy_if(InputIterator first, InputIterator last, OutputIterator result, Predicate pred)
    {
    	for(; first != last; ++first)
    	{
    		if(!pred(*first))
    			continue;
    
    		*result++ = *first;
    	}
    
    	return result;
    }
    
    int main()
    {
    	std::vector<medikament> medikamente;
    	medikamente.push_back(medikament(1, "eins", 3.2f, 0));
    	medikamente.push_back(medikament());
    	medikamente.push_back(medikament(3, "drei", 3.5f, 0));
    	medikamente.push_back(medikament(4, "vier"));
    	medikamente.push_back(medikament(5, "fuenf", 1.f, 95));
    
    	copy_if(
    		medikamente.begin(),
    		medikamente.end(),
    		std::ostream_iterator<medikament>(std::cout, "\r\n"),
    		wenig_da<medikament::size_t>(10)
    	);
    	std::cout << std::endl;
    }
    

    bb

    PS:
    gibts irgend ne standard-lib-funktion, mit der ich ein copy_if bauen kann? Oo
    ich hab weder ein std::copy_if gefunden( wieso eigtl nicht?:( ) noch irgendwas brauchbares anderes - std::transform ist auch nicht dafür geeignet, wenn man die operatoren nicht unintuitiv überladen möchte... -.-


  • Mod

    Du könntest doch mit remove_copy_if ein copy_if bauen, du musst halt nur die Bedingung umkehren.

    Ich würde auch (entgegen der Aufgabenstellung) einen eigenen Datentypen für den Preis nehmen. float ist äußerst schlecht für Geld geeignet, allein schon angefangen damit, dass z.B. 0.1 oder das häufige 0.99 nicht exakt darstellbar sind.



  • SeppJ schrieb:

    Du könntest doch mit remove_copy_if ein copy_if bauen, du musst halt nur die Bedingung umkehren.

    Ich würde auch (entgegen der Aufgabenstellung) einen eigenen Datentypen für den Preis nehmen. float ist äußerst schlecht für Geld geeignet, allein schon angefangen damit, dass z.B. 0.1 oder das häufige 0.99 nicht exakt darstellbar sind.

    japp - hätt ich auch gemacht, war mir aber zu viel arbeit... ^^



  • SeppJ schrieb:

    Du könntest doch mit remove_copy_if ein copy_if bauen, du musst halt nur die Bedingung umkehren.

    so weit ich das verstehe, müsste man dazu aber erst mal alles kopieren -> es würde nicht mehr mit inputiteratoren sondern max. noch mit forwarditeratoren gehen

    oder!?

    bb


  • Mod

    unskilled schrieb:

    SeppJ schrieb:

    Du könntest doch mit remove_copy_if ein copy_if bauen, du musst halt nur die Bedingung umkehren.

    so weit ich das verstehe, müsste man dazu aber erst mal alles kopieren -> es würde nicht mehr mit inputiteratoren sondern max. noch mit forwarditeratoren gehen

    oder!?

    bb

    Hmm, vielleicht könnte man da was à la Erase-Remove-Idiom basteln. Habe aber gerade keine Zeit darüber nachzudenken, will zum Fußballgucken gehen.



  • Nach Scott Meyers:

    template <typename InputIterator, typename OutputIterator, typename Predicate>
    OutputIterator copy_if(InputIterator begin, InputIterator end,
                           OutputIterator destBegin,
    		       Predicate p)
    {
       while (begin != end)
       {
         if (p(*begin)) *destBegin++ = *begin;
         ++begin;
       }
       return destBegin;
    }
    

    copy_if wurde scheinbar aus Versehen nicht in die Standardbibliothek aufgenommen.

    Was eigene Datentypen für Geld angeht, ich würde einfach in Cent rechnen. Es dürfte ja selten vorkommen, dass man Geldbeträge miteinander multipliziert (3€ * 4€ = 12€²?).


Anmelden zum Antworten