Kann Aufgabe nicht lösen:(



  • sunn** schrieb:

    ich habe hier eine Aufgabe vor mir liegen, welche wir bald abgeben müssen und ich habe stundenlang versucht, aber ich komme leider nicht weiter...

    Was wurde denn als Literatur empfohlen?
    Kannst Du Dich an Beispielen aus der Vorlesung orientieren?
    Im Prinzip ist die Aufgabenstellung schon die halbe Lösung.
    Was ein Zeichenfeld ist, wie man Methoden definiert u.s.w. müsstest Du im Buch/Skript nachlesen können. Was für Hilfe erwartest Du denn jetzt, wenn man Dir die Lösung nicht "hinklatschen" soll/braucht? Ich häng mal überall ein //<-!? dran, wo was falsch ist...

    sunn** schrieb:

    #include <stdio.h>
    #include <iostream>
    
    using namespace preis   //<-!? preis ist kein Namensraum. Semikolon fehlt.
    
    class medic 
    { 
      private:   int art_nr; 
                 int name   ;  //<-!? Guck nach, was "int" bedeutet.
                 int bestand;
                 int preis;
                 
      public:    
                 int sag_bescheid(){return bestand};  //<-!? Semikolon überflüssug
                 char text[30]; //<-?! Wozu ist das gut an dieser Stelle?
                 strepy (text, "Keine Angaben"); //<-!? hat hier nichts zu suchen
    
      //<-!? Konstruktoren fehlen
    };
    
    int main ()
    {
        medic a;
        a.ausgabe ();
        
        medic b(125. "Benuron", 70,1.5); //<-!? Diesen Konstruktor gibt es nicht
        b.ausgabe; //<-!? Klammern fehlen
        
        medic c = medic(12, "EPO", 7,1000); //<-!? s.o.
        c.ausgabe ();
        
        medic liste [100]= {
              medic(125. "Benuron", 70,1.5),
              medic(342, "Granufink", 10, 31.49),
              medic(211, "Paracetamol", 120,11.95)
              };
    
        //<-!?  Überleg Dir, wie Du die Medikamente am besten speicherst
        //<-!?  a,b,c lassen sich hier schlecht über Indizes addressieren
              
        int i;
        for (i=0; i<=10; i++)
        {
            cout << i << ": " << i*i << endl;   //<-!? Sinn?
        }
        
        int i;
        for (i=0; liste[i] && i<=10; i++)  //<-!? liste[i] nix gut hier
        {
            text[i] = liste[i];  //<-?! Was ist text? Was soll das?
        }
        text[i] = 0; //<-!? auch hier gibt's kein text
        cout << "Der Lagerbestand von folgender Medikamente ist < 10: " << text << endl;
    
        //<-!? Hier fehlt offensichtlich etwas
             
    system("PAUSE");
    return 0;
    }
    

    Mann mann mann ....


  • 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