Programm
-
habe folgendes programm:
#include <iostream>
using namespace std;
void main ()
{
double nArt;
double a = 180-20-0076.5;cout << "Art.Nr. eingben" <<endl;
cin >> nArt;if (nArt == 'a')
cout << "nummer: 11517" <<endl;else
cout << "Artikelnummer nicht vorhanden" <<endl;}
Es soll ein vereinfachungsprogramm werden: Es soll eine Artikelzahl wie zb. 150-45-4847.4 eingegeben werden. daraufhin soll dann die Lagernummer erscheinen.
Leider habe ich Probleme mit der deklaration der art.zahl. Ist es überhaupt möglich dass ich so eine Zahl mit Bindestrichen eingeben kann? Müsste ich die Zahl irgendwie als Wort deklarieren, weil im prinzip ist es ja keine zahl mit (bindestriche)Wenn ich jetzt ca. 100 artikelnummern habe mit den dazugehörigen Lagernummern macht da eine if/else schleife überhaupt sinn? Geht das nicht irgendwie anders??
Wär um jede hilfe dankbar.

Gruss Kuse
-
Mach aus dem double ein string.
Dann meinst du, du hast 100 Artikelnummer und dazu passende Lagernummer, da würd ich wohl map empfehlen.
Und dann noch etwas ganz schlaggebendes
ES GIBT KEINE IF-SCHLEIFEN!!!
-
ah cool. super.
wie funzt das mit dem map? gibts das auch auf deutsch? was ist das?
-
sceetch schrieb:
wie funzt das mit dem map? gibts das auch auf deutsch? was ist das?
Google. He? Google.
-
FreakY<3Cpp schrieb:
Mach aus dem double ein string.
Dann meinst du, du hast 100 Artikelnummer und dazu passende Lagernummer, da würd ich wohl map empfehlen.
Und dann noch etwas ganz schlaggebendes
ES GIBT KEINE IF-SCHLEIFEN!!!Meinst du nicht es würde auch eine einfaches Array reichen?
-
kannst mal mir anhand meines oben beschriebenen codes, zeigen wie der code aussehen könnte??
-
player4245 schrieb:
FreakY<3Cpp schrieb:
Mach aus dem double ein string.
Dann meinst du, du hast 100 Artikelnummer und dazu passende Lagernummer, da würd ich wohl map empfehlen.
Und dann noch etwas ganz schlaggebendes
ES GIBT KEINE IF-SCHLEIFEN!!!Meinst du nicht es würde auch eine einfaches Array reichen?
Und wie soll das Array aussehen?
string Numbers[MAX_NUMBERS][1];Oder wie ?

Zu jeder Artikelnummer gibt es eine passende Lagernummer, warum sollte map da nicht passen?
-
Hallo,
Hier ist ein komplettes Beispielprogramm:
#include <iostream> #include <string> using namespace std; #define MAX 5 struct { string Artikelnummer; string Lagernummer; }Elemente[MAX]; int main() { string ArtNum; bool found = false; cout << "Artikelnummer: ";cin >> ArtNum; cout << "Lagernummer: "; for(int loop=0;loop<MAX;loop++) { if(Elemente[loop].Artikelnummer==ArtNum) { cout << Elemente[loop].Lagernummer; found = true; } } if(found==false)cout << "(nicht gefunden)" << endl; cin.get(); return 0; }MAX kann beliebig gewählt werden. Das Programm ist so noch nicht lauffähig, da Die Elemente keinen Inhalt haben. (Läuft zwar schon, erfüllt aber keinen Zweck). In jedes Element muss also noch die Artikelnummer und die zugehörige Lagernummer geschrieben werden. Also ich finde diese Lösung auch ohne Benutzung von map ganz schön.
MfG, Jochen
-
Ein vector der eine Liste von pair hält, wäre auch noch eine Idee:
#include <iostream> #include <vector> #include <string> #include <utility> int main() { std::vector<std::pair<std::string, std::string> > Numbers; std::string ArtikelNummer; std::string LagerNummer; while(ArtikelNummer != "0" && LagerNummer != "0") { std::cin >> ArtikelNummer; std::cin >> LagerNummer; Numbers.push_back(make_pair(ArtikelNummer, LagerNummer)); } for(unsigned int i = 0; i < Numbers.size() - 1; i++) { std::cout << Numbers[i].first << " " << Numbers[i].second << std::endl; } }
-
cool. schöne lösungen.danke!!
@jochen du sagst man muss die elemente noch mit einem wert versehen. kannst du das mal machen,wenn ich zb. habe: steh grad auf dem schlauch. Brauch mal ein Bsp.ums zu verstehen. seh grad en bezug nicht wirklich.art.nr. 105-10-2467.5 lagernummer: 2117
art.nr. 108-48-4757.8 lagernummer: 3456
art.nr. 140-47-4564.2 lagernummer: 4567gruss
-
Du kannst die Werte so initialisieren:
Folgenden Code einfach in meinem Beispielprog an den Anfang von main() schreiben:Elemente[0].Artikelnummer="105-10-2467.5";Elemente[0].Lagernummer="2117"; Elemente[1].Artikelnummer="108-48-4757.8";Elemente[1].Lagernummer="3456"; Elemente[2].Artikelnummer="140-47-4564.2";Elemente[2].Lagernummer="4567";Das ist natürlich keine Optimale Lösung. Besser wäre es, wenn man die Werte aus einer Textdatei einlesen könnte. Werd dazu gleich mal was Posten.
MfG, Jochen
-
So, Hier die Version, die die Werte aus einer Textdatei datei.txt einliest:
(Auf das Abfangen eventueller Fehler habe ich mal verzichtet.)#include <string> #include <iostream> #include <fstream> using namespace std; struct SElem { string Artikelnummer; string Lagernummer; }*Elemente; int main() { ifstream dat_ein; dat_ein.open("datei.txt",ios_base::in); int Anzahl; dat_ein >> Anzahl; Elemente = new SElem[Anzahl]; for(int loop=0;loop<Anzahl;loop++) { dat_ein >> Elemente[loop].Artikelnummer; dat_ein >> Elemente[loop].Lagernummer; } dat_ein.close(); string ArtNum; bool found = false; cout << "Artikelnummer: ";cin >> ArtNum; cout << "Lagernummer: "; for(int loop=0;loop<Anzahl;loop++) { if(Elemente[loop].Artikelnummer==ArtNum) { cout << Elemente[loop].Lagernummer; found = true; break; } } if(found==false)cout << "(nicht gefunden)" << endl; cin.get(); delete[] Elemente; return 0; }Der Inhalt der Datei:
3 105-10-2467.5 2117 108-48-4757.8 3456 140-47-4564.2 4567Die erste Zahl in der Textdatei zeigt dem Programm, wie viele Datensätze in der Datei enthalten sind. Danach kommen die Daten: Erst die Artikelnummer, dann die Lagernummer.
MfG, Jochen
-
Noch besser wäre es natürlich, wenn in der Textdatei gar nicht drinstehen muss, wieviele Datensätze es gibt. Das wäre nämlich ein extrem unpraktisches Dateiformat, wenn man beim zufügen von Datensätzen an zwei Stellen etwas ändern muss. Und noch schlimmer wäre es, wenn man Datensätze entfernt aber vergisst die erste Zeile zu ändern.
Wie das genau geht, überlasse ich mal interessierten Lesern als Übung. Ist ganz einfach.
-
Hi Jochen. Habe ein ähnliches Prog. Aber wo speicher ich die datei.txt mit den infos ab? Muss ich nicht irgendwo einen Pfad angeben?
MFG
-
Hallo,
Die Datei datei.txt muss sich in dem selben Ordner befinden wie das Programm. Sollte sich die Datei sonstwo befinden, muss man natürlich noch einen Pfad mit angeben.MfG, Jochen
-
So, hier ist noch das Programm, das von SeppJ bevorzugt werden würde:
#include <string> #include <iostream> #include <fstream> #include <vector> using namespace std; struct SElem { string Artikelnummer; string Lagernummer; }; int main() { ifstream dat_ein; dat_ein.open("datei.txt",ios_base::in); vector<SElem> Elemente; while(!dat_ein.eof()) { SElem tmp; dat_ein >> tmp.Artikelnummer; dat_ein >> tmp.Lagernummer; Elemente.push_back(tmp); } int Anzahl = Elemente.size(); dat_ein.close(); string ArtNum; bool found = false; cout << "Artikelnummer: ";cin >> ArtNum; cout << "Lagernummer: "; for(int loop=0;loop<Anzahl;loop++) { if(Elemente[loop].Artikelnummer==ArtNum) { cout << Elemente[loop].Lagernummer; found = true; break; } } if(found==false)cout << "(nicht gefunden)" << endl; cin.get(); for(int loop=0;loop<Anzahl;loop++)Elemente.erase(0); return 0; }Der Inhalt der Datei müsste jetzt so aussehen:
(So wie vorher, nur ohne die errste Zeile)105-10-2467.5 2117 108-48-4757.8 3456 140-47-4564.2 4567Stimmt, die Lösung ist schöner. Ich weiss zwar nicht, wie vector intern arbeitet, aber führt das nicht zu einer starken Heapfragmentierung, wenn immer Speicher für ein weiteres Element reserviert werden muss, wenn ein neues Element hinzugefügt wird?
MfG, Jochen
-
Ich weiss zwar nicht, wie vector intern arbeitet
http://www.sgi.com/tech/stl/Vector.html
[3] When it is necessary to increase capacity(), vector usually increases it by a factor of two. It is crucial that the amount of growth is proportional to the current capacity(), rather than a fixed constant: in the former case inserting a series of elements into a vector is a linear time operation, and in the latter case it is quadratic.
Und ueber Fragmentierung rede ich erst, wenn viel Speicher benoetigt wird. Desweiteren kann das Suchen auch beim Einlesen der Elemente stattfinden, dann spart man sich das Array. Auch das manuelle Loeschen der Elemente am Ende ist ueberfluessig, das passiert automatisch, wenn der Destruktor von std::vector aufgerufen wird. Ich weiss jetzt nicht genau, was erase macht, aber wenn von vorn geloescht wird, dann muss der restliche Inhalt staendig um eins nach vorne kopiert werden. Besser man beginnt hinten ...
-
Stimmt, das mit dem löschen ist nicht ganz so optimal. Noch einfacher ist es, wenn man gleich den Destruktor "manuell" aufruft. Oder sehe ich da etwas falsch?
-
Jochen S. schrieb:
Stimmt, das mit dem löschen ist nicht ganz so optimal. Noch einfacher ist es, wenn man gleich den Destruktor "manuell" aufruft. Oder sehe ich da etwas falsch?
Faustregel: Man ruft NIEMALS Destruktoren manuell auf. Destruktoren werden automatisch aufgerufen, wenn der Programmfluss den Gültigkeitsbereich eines Objekts verlässt.
-
Jochen S. schrieb:
Noch einfacher ist es, wenn man gleich den Destruktor "manuell" aufruft.
Das will ich sehen! :p