[HILFE] struct - anfänger fragen

phpMars

Erfahrenes Mitglied
Hi, ich habe folgende Aufgabe, welche ich überwinden muss.

Mit dem Programm LIEFERANTEN.CPP sollen für maximal 10 Lieferanten Informationen in einem Strukturarray erfasst werden. Die Struktur soll aus den Feldern Lieferantennummer, Name, Umsatz und Bonussatz bestehen. Die Eingabe der Lieferantendaten soll beendet werden, wenn entweder 10 Lieferanten erfasst wurden bzw. wenn für das Feld Lieferantennummer der Wert 0 eingegeben wurde. Nach der Eingabe soll der Bonus berechnet und die eingegebenen Lieferantendaten auf dem Bildschirm angezeigt werden. Außerdem sollen am Ende der Liste der Gesamtumsatz und die Bonussumme ermittelt werden.

So nun sagen die im Buch ich soll char nehmen um die eingegebenen Werte zu speichern. Aber wäre es nicht sinfoller hier strings zu benutzen, ich weiß ja nicht ob mal ein Lieferantenname größer ist, als der Speicher den ich zur Verfügung stelle.
Würde sowas überhaupt gehen?

Ich habe wie folgt angefangen:

Code:
# include <iostream>
using namespace std;
# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
# include <time.h>
# include <stdio.h>
# include <string>
# include <algorithm>

int main()
{
	struct _lieferanten
	{
		string _lieferantennummer;
		string _name;
		float _umsatz;
		float _bonussatz;
	}

	getchar();
	return 0;

}
 
Zuletzt bearbeitet:
Klar kannste da string nehmen - ist auch sinnvoll (wie du selbst ja gesagt hast) da du dann
dich nicht darum kümmern brauchst, wieviel Platz der String braucht.

Allerdings werden structs nicht in der Funktion selbst, sondern global darüber definiert:
Code:
# include <iostream>
# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
# include <time.h>
# include <stdio.h>
# include <string>
# include <algorithm>

using namespace std;

struct _lieferanten
{
	string _lieferantennummer;
	string _name;
	float _umsatz;
	float _bonussatz;
};


int main()
{
	_lieferanten Lieferanten[10];
	// Lieferanten initialisieren etc
	getchar();
	return 0;

}
 
habe ein Schulbuch

"Programmentwicklung mit C/C++ und HTML" vom Bildungsverlag Eins

und da steht es so drin das die struct in der Funktion definiert wird.
Aber irgendwie hab ich mehr Vertrauen in dir, als in dem Buch *g*

Habe das jetzt alles so:

Code:
//---------------------LIEFERRANTEN.CPP-----------------------
# include <iostream>
using namespace std;
# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
# include <time.h>
# include <stdio.h>
# include <string>
# include <algorithm>
//------------------------------------------------------------

struct _lieferanten K[10];
	{
		string _lieferantennummer;
		string _name;
		float _umsatz;
		float _bonussatz;
	}


int main()
{
	int i=0;
	
	do
	{
        cout << "Lieferanten - Strukturarray\n----------------------------------------------\n";
		cout << "Bitte geben Sie die Lieferrantennummer ein: ";
		cin >> K[i]._lieferantennummer;

		cout << "\nBitte geben Sie den Namen ein: ";		
		cin >> K[i]._name;

		cout << "\nBitte geben Sie den Umsatz ein: ";
		cin >> K[i]._umsatz;

		cout << "\nBitte geben Sie den Bonussatz ein: ";
		cin >> K[i]._bonussatz;

		i++;
	}
	while(i<=9);


	getch();
	return 0;

}

ist sowas möglich?
(ist natürlich noch nicht die fertige version)
 
Zu deinem Code, die Idee ist wohl richtig, allerdings die Umsetzung hapert noch ein wenig:
Du musst eine struct erstmal (global) definieren
Code:
struct _lieferanten
	{
		string _lieferantennummer;
		string _name;
		float _umsatz;
		float _bonussatz;
	}; // WICHTIG: Semikolon nicht vergessen
Dann kannst du sie in deiner Funktion (wie einen Datentyp) benutzen:
Code:
int main()
{
  _lierferanten DeineLieferanten[10];
  ...
}
 
Danke für deine Info...

habe jetzt wieder ein Problem.
Wenn ich 10 Lieferanten eingegeben habe oder wenn ich als Lieferantennummer 0 eingebe soll es abbrechen. Tuts aber nicht.
Kann mir jemand sagen wo mein Fehler liegt?

Code:
//---------------------LIEFERRANTEN.CPP-----------------------
# include <iostream>
using namespace std;
# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
# include <time.h>
# include <stdio.h>
# include <string>
# include <algorithm>
//------------------------------------------------------------

struct _lieferanten
	{
		string _lieferantennummer;
		string _name;
		float _umsatz;
		float _bonussatz;
	};


int main()
{
	int i=0;
	_lieferanten MeineLieferanten[10];

	do
	{
        cout << "Lieferanten - Strukturarray\n----------------------------------------------\n";
		cout << "Bitte geben Sie die Lieferrantennummer ein: ";
		cin >> MeineLieferanten[i]._lieferantennummer;

		cout << "\nBitte geben Sie den Namen ein: ";		
		cin >> MeineLieferanten[i]._name;

		cout << "\nBitte geben Sie den Umsatz ein: ";
		cin >> MeineLieferanten[i]._umsatz;

		cout << "\nBitte geben Sie den Bonussatz ein: ";
		cin >> MeineLieferanten[i]._bonussatz;
		cout << endl << endl;

		i++;
		
	}
	while(i<=9 || MeineLieferanten[i]._lieferantennummer != "0");

	

	getch();
	return 0;

}
 
Hi.

Das Problem ist, das du die Variable i inkrementierst und dann schon den nächsten Datensatz überprüfst, obwohl du den ja noch gar nicht eingegeben hast.

Außerdem möchtest du wohl, dass die Schleife nur solange läuft wie beide Bedingungen wahr sind.
Code:
  ...
  i++;
} while (i <= 9 && MeineLieferanten[i-1]._lieferantennummer != "0");

/edit: Außerdem ist es völlig OK die Struktur nur innerhalb einer Funktion zu definieren - wenn man sie nur innerhalb der Funktion braucht ist das eigentlich sogar eine gute Idee.

Warum verwendest du eigentlich einen Unterstrich am Anfang von jedem Bezeichner in der Struktur? Normalerweise sind solche Bezeichner (die mit 1 oder 2 Unterstrichen beginnen) reserviert für die Benutzung der System Bibliotheken und deshalb sollte man die nicht benutzen.
 
Zuletzt bearbeitet:
Ich habe hier "_variable" benutzt weil ich mal gelesen habe das ich es frei wählen kann ob ich mit einem Buchstaben anfange oder eben mit "_".

Danke für deinen Hinweis. Jetzt habe ich noch Folgendes festgestellt:
Wenn ich für die Lieferantennummer 0 eingebe, soll er ja rausgehen. Da aber erst am Ende der Schleife überprüft wird ob eine 0 eingegeben wurde muss ich es ja vorher schon überprüfen lassen.
Habe demnach diese Variante gewählt:

Code:
	do
	{
        cout << "Lieferanten - Strukturarray\n----------------------------------------------\n";
		cout << "Bitte geben Sie die Lieferrantennummer ein: ";
		cin >> MeineLieferanten[i]._lieferantennummer;

		if(MeineLieferanten[i]._lieferantennummer == "0")
			goto ausgabe;

		cout << "\nBitte geben Sie den Namen ein: ";		
		cin >> MeineLieferanten[i]._name;

		cout << "\nBitte geben Sie den Umsatz ein: ";
		cin >> MeineLieferanten[i]._umsatz;

		cout << "\nBitte geben Sie den Bonussatz ein: ";
		cin >> MeineLieferanten[i]._bonussatz;
		cout << endl << endl;
		
		
		i++;
		
		
	}
	while(i<=9 && MeineLieferanten[i-1]._lieferantennummer != "0");

ausgabe:
	for(i=0; i<=9; i++)
	{
		cout << endl << endl << i+1 << " . Lieferant: \n";
		cout << endl << "Lieferant: " << MeineLieferanten[i]._lieferantennummer;
		cout << endl << "Name: " << MeineLieferanten[i]._name;
		cout << endl << "Umsatz: " << MeineLieferanten[i]._umsatz;
		cout << endl << "Bonus: " << MeineLieferanten[i]._bonussatz;
		cout << endl << "--------------------------------------------";
	}
	getch();
	return 0;

Aber Sprünge sind ja generell verboten, gibts eie bessere Möglichkeit ?
 
Ich hab grad nochmal nachgeschaut und das mit den Unterstrichen stimmt so nicht ganz. Alles was mit 2 Unterstrichen oder alles was mit einem Unterstrich und einem Großbuchstaben anfängt ist reserviert.

Aber zu deiner Frage: Ja, es gibt eine bessere Möglichkeit. (obwohl goto's ja nicht unbedingt verboten sind, aber wenn man sie einsetzt braucht man schon einen trifftigen Grund)

Code:
do
{
    cout << "Lieferanten - Strukturarray\n----------------------------------------------\n";
    cout << "Bitte geben Sie die Lieferrantennummer ein: ";
    cin >> MeineLieferanten[i]._lieferantennummer;

    if(MeineLieferanten[i]._lieferantennummer == "0")
        break; // bricht die Schleife hier sofort ab.
    ...
} while (...);
 
Generell verboten ist natürlich Quatsch.

Du kannst aber an der Stelle ein break verwenden. Das bricht den nächst-oberen while, for oder case-Block ab. Dann fällt auch das label "ausgabe" weg und man weiss auf den ersten Blick, dass hier aus der do-while-Schleife rausgesprungen wird (ein break ist auch nur ein goto).
 
ist das soweit ok?

Code:
//---------------------LIEFERRANTEN.CPP-----------------------
# include <iostream>
# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
# include <time.h>
# include <stdio.h>
# include <string>
# include <algorithm>
using namespace std;
//------------------------------------------------------------

struct _lieferanten
	{
		string _lieferantennummer;
		string _name;
		float _umsatz;
		float _bonussatz;
	};


int main()
{
	int i=0,j=0;
	_lieferanten MeineLieferanten[10];
	float GesamtUmsatz=0, GesamtBonus=0;

	do
	{
        cout << "Lieferanten - Strukturarray\n----------------------------------------------\n";
		cout << "Bitte geben Sie die Lieferrantennummer ein: ";
		cin >> MeineLieferanten[i]._lieferantennummer;

		if(MeineLieferanten[i]._lieferantennummer == "0")
			break;

		cout << "\nBitte geben Sie den Namen ein: ";		
		cin >> MeineLieferanten[i]._name;

		cout << "\nBitte geben Sie den Umsatz ein: ";
		cin >> MeineLieferanten[i]._umsatz;

		cout << "\nBitte geben Sie den Bonussatz ein: ";
		cin >> MeineLieferanten[i]._bonussatz;
		cout << endl << endl;
		
		
		i++;
		j++;
		
	}
	while(i<=9 && MeineLieferanten[i-1]._lieferantennummer != "0");

	for(i=0; i<j; i++)
	{
		    cout << endl << endl << i+1 << " . Lieferant: \n";
			cout << endl << "Lieferant: " << MeineLieferanten[i]._lieferantennummer;
			cout << endl << "Name: " << MeineLieferanten[i]._name;
			cout << endl << "Umsatz: " << MeineLieferanten[i]._umsatz;
			cout << endl << "Bonus: " << MeineLieferanten[i]._bonussatz;
			cout << endl << "--------------------------------------------";
			GesamtUmsatz = GesamtUmsatz + MeineLieferanten[i]._umsatz;
			GesamtBonus = GesamtBonus + MeineLieferanten[i]._bonussatz;
	}
	cout << endl << "--------------------------------------------";
	cout << endl << "Gesamtzumsatz: " << GesamtUmsatz;
	cout << endl << "Gesamtbonus: " << GesamtBonus;
	getch();
	return 0;

}
 
Zurück