[HILFE] struct - anfänger fragen

Ja, im Prinzip ist das OK würde ich sagen (wenn ich jetzt nichts übersehen hab).

Allerdings könntest du natürlich in der while Bedingung die Überprüfung ob MeineLieferanten[i-1]._lieferantennummer != "0" ist rausnehmen, denn das prüfst du ja schon sofort wenn die lieferantennummer eingegeben wurde.

Dann würde ich lieber aussagekräftigere Variablennamen benutzen. Und du brauchst auch nicht i und j gleichzeitig in der Schleife hochzählen, da ja beide immer den gleichen Wert haben.
Code:
int lieferanten = 0;

do {
  ...
} while (++lieferanten < 10);

for (int j = 0; j < lieferanten; ++j) {
  ...
}

/edit: Ach, eine Sache wäre da noch:

Du prüfst nicht ob überhaupt etwas eingelesen werden konnte. Das heißt wenn jetzt ein böswilliger Benutzer z.B. statt einer Gleitkommazahl was ganz anderes eingibt, dann funktioniert dein Programm nicht mehr.
Code:
if (cin >> MeineLieferanten[i]._lieferantennummer) {
  // Einlesen hat geklappt.
  ...
} else {
  // unerwartetes Ende der Eingabe, oder ein
  // allgemeiner Stream Fehler.
  cerr << "Lesefehler.\n";
  break;
}
...
if (cin >> MeineLieferanten[i]._umsatz) {
  // Einlesen hat geklappt.
  ...
} else {
  // Ups, entweder hat der Benutzer keine
  // Gleitkommazahl eingeben, oder Eingabe ist
  // zu Ende oder sonst. Streamfehler.
  cerr << "Lesefehler.\n";
  break;
}
Das müßtest du bei jedem Wert machen den du einliest. Wenn du das nicht tust und es tritt ein Fehler beim Einlesen auf, dann wird der Wert der Variablen nicht geändert, d.h. du würdest dann mit ganz falschen Werten einfach weiterrechnen.
 
Zuletzt bearbeitet:
Danke...
Ich werde das mal überarbeiten :)

edit

Ich habe eine Frage, unter Borland kann ich die Funktion clrscr(); benutzen um mein Konsolenbildschirm zu reseten. Aber unter dem Visual Studio Net macht er das nicht?

ERROR C2065: 'clrscr' : undeclared identifer

Gibts für den Microsoft Compiler einen anderen ausdruck ?
 
Zuletzt bearbeitet:
Naja, clrscr und gotoxy sind halt kein Standard und deshalb gibt's sie eigentlich auch nur bei Borland.

Allerdings könntest du unter Windows die Funktion clrscr so selbst definieren:
Code:
#ifdef WIN32
# ifdef __BORLANDC__
#  include <conio.h>
# else

void clrscr (void) {
  system ("cls");
}

# endif
#else /* WIN32 */
void clrscr(void) { }
#endif
Erst wird geprüft ob es sich um eine Windows Plattform handelt. Ist das der Fall, wird geprüft ob es sich um einen Borland-Compiler handelt. Wenn ja, dann gibt es conio.h und clrscr usw. Wenn nicht, definieren wir clrscr selbst.

Wenn es kein Windows ist, dann wird clrscr einfach als leer definiert.
 
DANKE!
Funktioniert einwandfrei....

Habe wieder eine neue Frage :rolleyes:
Angenommen ich gebe für meine Lieferantennummer MR 05 ein... dann wird ja das MR in die Variable MeineLieferanten[ i ]._lieferantennummer gespeichert aber das 05 wird in der nächsten Variable gespeichert.

Kann ich das verhindern, sodass auch ein Leerzeichen in der Variable gespeichert wird ?
 
Ja, du kannst z.B. die komplette Zeile in den String einlesen:
Code:
cout << "Bitte geben Sie die Lieferrantennummer ein: ";

if (getline (cin, MeineLieferanten[i]._lieferantennummer)) {
  // komplette Zeile in MeineLieferanten[i]._lieferantennummer 
  // eingelesen.
  ...
} else {
  // Fehler...
  ...
}
 
Da ich gerade zuhause bin, konnte ich nochmal nachschauen, was die Namensregelung betrifft.

Arnold Willemer . Einstieg in C++ . Erschienen in Galileo Computing, Bonn 2005
Seite 34 1.3.3 Namensregelung und Syntaxgraph

"[...] Ein Name muss mit einem Buchstaben oder einem Unterstrich beginnen und darf anschließend beliebig viele Buchstaben, Unterstriche und Ziffern enthalten. [...]"


Arnold Willemer . Einstieg in C++ . Erschienen in Galileo Computing, Bonn 2005
Seite 35 1.3.3 Namensregelung und Syntaxgraph

"Zur Bildung eines Namens dürfen Sie im Graph in Pfeilrichtung immer den Kurven nachfahren.[...]

http://www.willemer.de/informatik/cpp/grafident.gif
 
Ja, allgemein gesprochen werden so Bezeichner gebildet.

Ich hab so schnell keine bessere (offizielle) Quelle gefunden, aber naja:
http://www.informit.com/guides/content.asp?g=cplusplus&seqNum=185&rl=1 hat gesagt.:
Reserved Identifiers

Every identifier that starts with two consecutive underscores, for example:

__exit

is reserved. Therefore, you shouldn't use such an identifier for class names, functions, constants, macros, and so on. Many people wonder why this restriction applies to data members of a class or local variables declared at a block scope. The reason is that compilers often insert temporary variables and objects into user-written code. These compiler-generated identifiers mustn't clash with user-defined ones. To avoid such clashes, compiler-generated identifiers often start with a double underscore.

The same restriction applies to every identifier that starts with a single underscore followed by a capital letter, for example:

_TEMP
_Abs

In addition, any identifier that starts with a single underscore is reserved in the global namespace. This means that you can safely use identifiers such as

_value
_s

for local variables, class data members and so on, so long as these names aren't declared globally.
(allerdings ist Danny Kalev mit Sicherheit eine Instanz in Sachen C++ und wahrscheinlich etwas bekannter als Arnold Willemer ;))

/edit: Der letzte Absatz bedeutet ja, das wenn du die Struktur global definierst am besten keinen Unterstrich an den Anfang des Bezeichners machen solltest.
 
Zuletzt bearbeitet:
Zurück