Kann Aufgabe nicht lösen:(



  • Hallo zusammen,

    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... Bitte hilft mir, es ist sehr wichtig für mein Studium...

    Es geht um folgendes:
    In einer Apotheke müssen die Medikamente in ihrem Lagerbestand erfasst werden,
    um rechtzeitige Nachbestellungen zu ermöglichen. Die Datenhaltung der Medikamente
    soll hier mit einer Klasse realisiert werden.
    Die Klasse medic soll somit folgende Eigenschaften haben:
    private Daten:
    Ganzzahl art_nr für die Artikelnummer
    Zeichenfeld name
    Ganzzahl bestand für den Lagerbestand
    Gleitkommazahl preis

    öffentliche Methoden:
    Konstruktor ohne Parameter
    (setzt die Daten auf vernünftige Anfangswerte).
    Konstruktor mit Parametern.
    Zugri smethode sag_bestand(), die den Bestand als Rückgabewert
    liefert.
     eine Methode ausgabe(), die alle Daten eines Objektes ausgibt.
    Ihre Aufgabe:
    a) Schreiben Sie die De nition einer solchen Klasse mit allen diesen Daten und
    Methoden.
    b) Ergänzen Sie die angegebene Testfunktion main(): In einer Schleife über alle
    Medikamente sollen diejenigen ausgedruckt werden, deren Lagerbestand kleiner
    als 10 ist.

    Bis jetzt konnte ich leider nur so viel lösen:

    #include <stdio.h>
    #include <iostream>

    using namespace preis

    class medic
    {
    private: int art_nr;
    int name ;
    int bestand;
    int preis;

    public:
    int sag_bescheid(){return bestand};
    char text[30];
    strepy (text, "Keine Angaben");

    };

    int main ()
    {

    medic a;
    a.ausgabe ();

    medic b(125. "Benuron", 70,1.5);
    b.ausgabe;

    medic c = medic(12, "EPO", 7,1000);
    c.ausgabe ();

    medic liste [100]= {
    medic(125. "Benuron", 70,1.5),
    medic(342, "Granufink", 10, 31.49),
    medic(211, "Paracetamol", 120,11.95)
    };

    int i;
    for (i=0; i<=10; i++)
    {
    cout << i << ": " << i*i << endl;
    }

    int i;
    for (i=0; liste[i] && i<=10; i++)
    {
    text[i] = liste[i];
    }
    text[i] = 0;
    cout << "Der Lagerbestand von folgender Medikamente ist < 10: " << text << endl;

    system("PAUSE");
    return 0;
    }

    Viele Grüße



  • Und was ist die Frage?

    Der Programmcode sieht mir auch mehr nach schlecht abgetippt aus.

    Desweiteren ein guter Tipp, und das ist ein ernstgemeinter Ratschlag:

    Wenn du an der Aufgabe scheiterst und nicht genug Grips hast um dir das selbstständig zu erarbeiten, solltest du möglichst schnell die Uni verlassen und was anderes suchen. Ist ja keine Schande, nur sich durchzuschummeln bringt niemanden etwas und du versaust dir nur dein Leben.



  • Du solltest vielleicht besser mal die Klappe halten... Ich habe die ganze Scheiße selber geschrieben und ich brauch dich auch nicht davon überzeugen... Es geht einfach darum, dass ich keine Ahnung habe wie ich weitermachen soll. Erstens und Zweitens ist es wohl immer noch meine Angelegenheit, ob ich die Uni verlasse oder nicht... Glaubst du, ich würde mein ganzes Studium hinschmeißen nur, weil es in so einem Fach wie Informatik nicht funktioniert...


  • Mod

    Fang doch erstmal mit der Mediakamentenklasse an. Da hast du doch sehr genaue Vorgaben wie die aussehen soll. Und bis jetzt sieht das bei dir gar nicht so aus. Du kannst quasi jede Zeile aus der Aufgabenstellung als eine Zeile in der Medikamentenklasse ansehen. Gucken wir doch mal:

    Aufgabe:
    Die Klasse medic soll somit folgende Eigenschaften haben:
    private Daten:
    - Ganzzahl art_nr für die Artikelnummer

    Dein Programm:

    class medic
    {
    private: 
     int art_nr;
    

    Soweit so gut.

    Nächste Zeile:
    - Zeichenfeld name
    Dein Programm:

    int name ;
    

    Fällt dir hier vielleicht eine Diskrepanz zwischen Aufgabenstellung und deiner Umsetzung auf? Das musst du ändern.

    Ebenso kannst du mit allen weiteren Zeilen verfahren, zumindest für die Eigenschaften der Klasse.

    Die meisten Methoden sind auch Einzeiler, versuch diese nach dem gleichen Schema Zeile für Zeile zu erstellen. Wenn du einen besseren Ansatz fertig hast, kannst du dich ja nochmal melden.

    edit: Nachdem ich nun deine Reaktion auf Fellhuhns Antwort sehe bin ich unsicher, ob ich meine Hilfe nicht schnell wieder wegeditieren soll. Ich will aber mal im Zweifel für den Angeklagten sein und es als einmaligen Ausrutscher deinerseits ansehen.



  • Wäre empfehlenswert ja.

    In deinem Studium geht es nun einmal daran wissenschaftlich zu arbeiten. Und stumpfes abschreiben gehört nun einmal nicht in diese Rubrik. Auch wenn Profs gerne nach der Masche "Hier du dummer HiWi, mach mal meine Aufgabe..."-Arbeiten, ist das noch lange nichts was man nachmachen sollte.

    Wenn du also Hilfe suchst, was ja nicht verwerflich ist, tu dies auf eine anständige Weise und schrei nicht laut "Macht meinen Scheiss, bin zu doof". Das hilft niemanden, am wenigsten dir.



  • Am Besten werden wir jetzt wieder sachlich und hören auf uns anzupampen.

    Zum Thema hat Sepp ja schon was geschrieben.



  • Ich finde es nur etwas blöd einfach angemacht zu werden, obwohl man nur Hilfe sucht. Ich habe mich wirklich sehr lange damit beschäftigt, aber ich bin nicht voran gekommen. Und das kann ich euch leider nicht zeigen. Es sollte sich sicherlich nicht so anhören, dass ich will, dass mir jemand die Aufgabe hinklatscht, aber vielleicht erklärt, was ich da bis jetzt falsch gemacht habe.
    Danke, ein bisschen habe ich jetzt durch deine Erklärung verstanden. So ähnlich habe ich ja auch angefangen. Werde weiterprobieren. Ps, ich studiere nicht's Informatik-Technisches, eher wirtschaftlich, nur leider wird das Fach auch für eine kurze Zeit unterrichtet...



  • 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