Programm zur Lagerverwaltung? (Übung)



  • Hallo ich möchte ein Programm erstellen zur Lagerverwaltung. Ich muss mithilfe von Strukturen arbeiten. Das Programm soll ungefähr so gegen: Als erstes ein Auswahlmenü: 1. Artikel hinzufügen 2.Programm beenden. Wenn man Artikel hinzufügen nimmt soll man artikelnummer und preis eingeben beim ersten mal hinzufügen. Danach soll man soll ich noch eine Stückzahl hinzufügen.
    Beispiel
    Artikelnummer: 123456d
    Preis 14.00
    Stückzahl 3
    Das soll mit mehreren Artikel möglich sein und wenn ich die Artikelnummer bereits verwendet wurde kann man nur die Stückzahl verändern. (Der Preis muss nicht ausgeben werden)
    Ich muss also auch mit Arrays arbeiten das habe ich gemerkt. Das habe ich bisher:

    #include <iostream>
    #include <string>
    using namespace std;
    
    	struct artikel
    {
    	string artikelnummer;
    	int preis;
    };
    
    struct stock
    {
    	int vorrat;
    };
    
    
    void hauptprogramm ()
    {
    	
    
    }
    
    
    void menu()
    {
    	cout << "Auswahlmenu: :\n(1) Artikel hinzufuegen \n(0): Programm beenden  \n\n Befehl: ";
    	char input = ' ';
    	cin >> input;
    	cout << " \n\n\n";
    	switch (input)
    	{
    	case('1'):
    		hauptprogramm();
    		break;
    		return;
    		break;
    		break;
    	default:
    		cout << "Programm beendet\n\n\n";
    		break;
    	}
    }
    int main() {
    	menu();
    	return 0;
    }
    
    

    Wie muss ich jetzt weitermachen? und wie mache ich eine schleife, sodass ich immer wieder "artikel hinzufügen" drücken kann bis ich auf "Programm beenden drücke, also eine Schleife



  • int main ist ganz unten. da hab ich mich vertan



  • Schreibe in eine Zeile vor Deinem Code ``` und in eine Zeile nach deinem Code ```. Alternativ markiere Deinen Code und klicke auf das </> in der Symbolleiste über dem Eingabefeld.

    Du kannst Deine Beiträge auch noch nachträglich bearbeiten. Den Menüpunkt "Bearbeiten" findest Du in dem Drei-Punkte-Menü rechts unter Deinen Beiträgen.

    Danke.



  • @Swordfish danke das wusste ich nicht



  • @KarlSr Was für Schleifenarten kennst du denn in C++? Wenn du das nicht direkt in C++ lösen kannst, wie könnte sowas in Pseudocode aussehen?

    Zu deinem Code:

    Was soll Zeile 35-37?
    Warum wechselst du die Sprache (stock, input auf Englisch, dann aber hauptprogramm, menue, artikel etc.)? Das ändert zwar nichts an der Korrektheit des Codes, aber ist ungewohnt. Üblicherweise benennt man seine Variablen und Funktionen mit englischen Bezeichnern.

    Warum hat dein stock nur ein int?

    Dein Preis ist ein int. Es ist eine gute Idee Geldbeträge mit Integer Typen zu verrechnen. Aber, in deinem Beispiel schreibst du 14.00, also gehe ich davon aus, dass eine mögliche Eingabe auch 14.99 sein könnte. Das würde mit intnicht direkt funktionieren. Du könntest da drinnen den Betrag direkt in Cent (falls es Euro sind, über die wir reden) speichern, das müsstest du bei der Eingabe aber berücksichtigen, bzw entsprechend Umwandeln.

    Du hast schon richtig angemerkt, dass du sowas wie ein Array brauchst. Dynamische Arrays in C++ heißen vector https://en.cppreference.com/w/cpp/container/vector

    Dann bin ich inzwischen ein großer Freund davon schon Anfängern nahe zu legen, ein Unittest Framework zu verwenden und direkt Code so zu schreiben, dass die einzelnen Funktionen getestet werden können.



  • @Schlangenmensch sagte in Programm zur Lagerverwaltung? (Übung):

    Du hast schon richtig angemerkt, dass du sowas wie ein Array brauchst. Dynamische Arrays in C++ heißen vector https://en.cppreference.com/w/cpp/container/vector

    Da hier wohl immer ein Lookup nach der Artikelnummer passieren soll, böte sich eventuell auch eine (unordered_)map an. Siehe https://en.cppreference.com/w/cpp/container/map / https://en.cppreference.com/w/cpp/container/unordered_map



  • kann jemand einfach mal darüber schauen und mir sagen wo der Fehler liegt?` Die stückzahl soll sich um 1 erhöhen wenn arrayname erneut eingeben wird ansonsten wird soll der array normal weitergeführt werden (untererer Teil)

    #include <iostream>
    #include <string>
    using namespace std;
    
    
        struct artikel
    {
    	string artikelnummer;
    	float preisf;
    	
    	
    	};
    
    struct stock
    	{
    		int vorrat;
    	};
    
    int main() 
    {
    	int antwort = 0;
    
    	artikel* arrayname;
    	arrayname = new artikel[50];
    	stock* arrstock;
    	arrstock = new stock[50];
    	arrstock[0].vorrat = 1;
    	cout << "Auswahlmenue: Artikel hinzufuegen (1) oder Programm beenden (0): ";
    	cin >> antwort;
    	cout << " " << endl;
    	for (int i = 0; i < 50; i++) {
    		for (int j = i + 1; j < 50; j++)
    		{
    			if (i > 50)
    			{
    				cout << "Fehler: Speicher voll" << endl;
    				delete[] arrayname;
    			}
    			if (antwort == 0)
    			{
    				cout << "Programm beendet";
    				delete[] arrayname;
    			}
    			else
    
    				
    				cout << "Artikel hinzufuegen: ";
    			cin >> arrayname[i].artikelnummer;
    			cout << "Preis: ";
    			cin >> arrayname[i].preisf;
    			cout << "Stueckzahl: ";
    			cout << arrstock[i].vorrat << endl;
    			cout << " " << endl;
    
    			if (arrayname[i].artikelnummer == arrayname[j].artikelnummer)
    			{
    				cout << "Artikelnummer:" << arrayname[i].artikelnummer << endl;
    				cout << "Stueckzahl: " << arrstock[i].vorrat + 1 << endl;
    			}
    
    		}
    	return 0;
    }
    ```


  • Die ganze Schleifenlogik ist falsch:

    • die Abfrage auf i > 50 kann dort niemals erfüllt sein (da der Schleifenindex nur bis < 50 zählt).
    • auch die 2. Abfrage antwort == 0 gehört dort nicht hin (und führt zu einer doppelten Freigabe des Arrays -> Bumm)
    • du fragst dort 50*50/2 mal nach der Artikelnummer und dem Preis

    Du solltest bei "Artikel hinzufügen" nach der Artikelnummer fragen.
    Die Schleife benötigst du nur für die Suche nach dieser Artikelnummer (warum meinst du, hier zwei zu benötigen?).
    Und wenn du die Position gefunden hast, dann erhöhe dessen Stückzahl, ansonsten füge den neuen Artikel (mit vorheriger Abfrage nach dem Preis) hinzu.

    Erzeuge dir am besten eigene Funktionen für die Teilaufgaben (Menü, Artikel hinzufügen, Artikel suchen, ...).



  • @KarlSr sagte in Programm zur Lagerverwaltung? (Übung):

    arrstock[0].vorrat = 1;

    Wieviele "Vorräte" werden hier initialisiert?



  • Das ist das geringste Problem an dem Code.

    Mir fällt noch ein, daß man so noch eine zusätzlichen Variable benötigt, welche die aktuelle Anzahl der Artikel speichert (also besser gleich vector<> verwenden).

    Und warum ist vorrat in einer eigenen Struktur untergebracht (anstatt Teil des Artikels zu sein)? Dann benötigt man auch keine zwei getrennten Arrays (bzw. vector<>).


Log in to reply