C Mehrdimensionalen Arrays!

marko06

Cadet 4th Year
Registriert
Juni 2008
Beiträge
93
Mehrdimensionale Arrays!

Hallo Leute,

ich programmiere zurzeit ein Warenwirtschaftssystem in C für die Uni. Ich habe das Hauptprogramm soweit fertig. Es beinhaltet eine Produkteingabe, Kundeneingabe und weitere Menüpunkte. Nun soll ich für meine Produkte eine Rabattliste erstellen mit Hilfe von mehrdimensionalen Arrays.

So soll es dann ungefähr aussehen später:

Code:
************************************************************************************
RABATTLISTE
************************************************************
|         ID  |  Normalpreis  |            -5%  |           -10%  |             -15%   |
|           0  |             5      |            4.75  |            usw.
|           1  |             10    |              9.5  |            usw.

In meiner Produktdatenbank speichere ich ein Produkt mit einer ID, den Namen des Produktes, den Einzelpreis und so ab.

Also ich habe mir gedacht, dass ich eine Schleife benutze die für die jeweilige ID's die Rabatte ausrechnet aber ich weiß nicht genau wie ich die Daten in die mehrdimesionalen Arrays einfüge. Also ich kenn das jetzt nur allgemein so, dass wenn ich ein mehrdimensionaes Array erstelle mit "int tabelle [4] [3];", könnte ich dann mit tabelle[0] [0] = 5; diese Stelle mit einer 5 belegen. Das müsste doch irgendwie leichter gehen. Komme leider nicht auf eine Lösung. Vielleicht könnt ihr mir ein paar Tipps geben, wie ich das am besten machen könnte.

Danke schonmal

Edit: Das Beispiel ist mir nicht so gut gelungen, aber ihr seht ja bestimmt was ich meine.
 
Zuletzt bearbeitet:
Also das geht prinzipiell schon. hier stand Blödsinn, ist die Aufgabenstellung, dieses Mehrdimensionale Array zu erstellen und zu füllen?
Dann würde ich halt auch zwei Schleifen ineinander verschachteln, um die Daten zu vervollständigen. 'Einfacher' geht es m.E. nicht.
Sag mal mehr zur Struktur, ob du Klassen/Structs benutzt und was in welchen Variablen und Arrays steht
 
Zuletzt bearbeitet:
Nimm zwei ineinander verschachtelte Schleifen

Beispiel:

Code:
int zeilen = 4:
int spalten = 3;

int tabelle[zeilen][spalten];


for (int zeile = 0; zeile < zeilen; zeile++)		// iteration zeilen
{
	for (int spalte = 0; spalte = spalten; spalte++)	// iteration spalten
	{
		tabelle[zeile][spalte] = 0; 	// element zeile/spalte
	}
}
 
eruanno schrieb:
[/I]Also das geht prinzipiell schon, aber ich frage mich, warum du die Werte überhaupt dort ablegen willst. Du kannst auch eine Funktion schreiben die den Warenwert oder ID und den Rabatt übergeben bekommt und den vergünstigten Preis zurückgibt?

Für die Anerkennung ist die Trennung von der Berechnung der Rabate und der Ausgabe der kompletten Rabattliste entscheided sowie der Umgang mit mehrdimensionalen Arrays.
 
Ist dir das Befüllen des Arrays mittels Schleifen nicht bequem genug?

Code:
for (i=0; i<dimension_i_length; i++)
	for (j=0; j<dimension_j_length; j++)
		array[i][j] = calculation();

Chapeau, blackst0rm. ;)
 
eruanno schrieb:
Also das geht prinzipiell schon. hier stand Blödsinn, ist die Aufgabenstellung, dieses Mehrdimensionale Array zu erstellen und zu füllen?
Dann würde ich halt auch zwei Schleifen ineinander verschachteln, um die Daten zu vervollständigen. 'Einfacher' geht es m.E. nicht.
Sag mal mehr zur Struktur, ob du Klassen/Structs benutzt und was in welchen Variablen und Arrays steht

Also die Aufgabenstellung ist, dass ich eine Funktion erstelle "void rabattliste(Produkte* p, int artikel_anzahl);" innerhalb dieser Funktion sollen für alle Artikel(artikel_anzahl) aus dem Struct Array p eine Liste mit Preisrabatten erstellt werden. Für die Liste wird ein zweidimensionales Array benötigt. Innerhalb dieses Funktion soll die Rabattliste als Ganzes ausgegeben werden.

Also ich benutze das:

Code:
typedef struct Einprodukt {
		int produktid;
		char produktname[26];
		double preis;
		int anzahl;
		double gesamtpreis;
} Produkt;

Produkt meineProdukte[20];

Danke schonmal an blackst0rm und Shagrath.
 
Zuletzt bearbeitet:
Mit den Hinweisen zum Befüllen deines Rabatt-Arrays kommst du doch nun sicherlich weiter. ;)
 
Verstehe dein Problem nicht. Was genau willst du machen?
Wozu brauchst du ein 2D Array um über ein Struct mit Daten zu iterieren, zumal deine void Methode das erzeugte Array gar nicht zurück gibt.

2D Arrays macht man indem man ein normales array malloct, dann darüber iteriert und jedem platz einen pointer auf ein weiteres array verpasst.
Danach kannst du mit [][] drauf zugreifen. Erste Klammer sind Zeilen, die zweite die Spalten.
 
Ich kann zwar nicht wirklich C, aber habe mich mal an einer Lösungs versucht :)

Code:
#include <stdio.h>

typedef struct ProduktStruct {
	char *name;
	float preis;
} Produkt;


void rabattliste(Produkt *p, int artikel_anzahl) {
	float rabatt[3] = {0.05, 0.1, 0.15};
	int anzahlVonRabatten = sizeof(rabatt)/sizeof(rabatt[0]);
	float rabattListe[artikel_anzahl][anzahlVonRabatten];
	
	
	for(int i = 0; i < artikel_anzahl; i++) {
		for(int j = 0; j < anzahlVonRabatten; j++) {
			rabattListe[i][j] = p[i].preis - p[i].preis * rabatt[j];
		}
	}
	
	for(int i = 0; i < artikel_anzahl; i++) {
		printf("%s, %.2f", p[i].name, p[i].preis);
		for(int j = 0; j < anzahlVonRabatten; j++) {
			printf(", %.2f", rabattListe[i][j]);
		}
		printf("\n");		
	}
}

int main() {
	Produkt test[3] = {
		{ "Keks", 0.99 }, 
		{ "Kuchen", 5.99 },
		{ "Avocado", 0.79}
		};
	
	rabattliste(test, 3);
}

Code:
$ gcc -std=c99 test.c -o test; test.exe
Keks, 0.99, 0.94, 0.89, 0.84
Kuchen, 5.99, 5.69, 5.39, 5.09
Avocado, 0.79, 0.75, 0.71, 0.67
 
black90 schrieb:
Verstehe dein Problem nicht. Was genau willst du machen?
Wozu brauchst du ein 2D Array um über ein Struct mit Daten zu iterieren, zumal deine void Methode das erzeugte Array gar nicht zurück gibt.

2D Arrays macht man indem man ein normales array malloct, dann darüber iteriert und jedem platz einen pointer auf ein weiteres array verpasst.
Danach kannst du mit [][] drauf zugreifen. Erste Klammer sind Zeilen, die zweite die Spalten.

Ich hänge mal mein Programm an, vielleicht ist es dann einleuchtender.


Main.c:

Code:
#include "funktionen.h“

int main() {

menue:
		printf( "\n**************************\n"
				"* Warenwirtschaftssystem *"
				"**************************");
		

		printf( "\nOptionen:\n\n"
				"1: Neues Produkt eingeben\n"
				"2: Neuen Kunden eingeben\n"
				"3: Produkt ausgeben\n"
				"4: Kunden ausgeben\n"
				"5: Produktliste\n"
				"6: Kundenliste\n"
				"7: Produkt suchen\n"
				"8: Kunden suchen\n\n"
				"Auswahl: ");
		
		scanf("%i", &auswahl);
		
		switch (auswahl) {
		
				case 1 :
						printf( "\n**********************\n"
								"* WWS Produkteingabe *"
								"**********************");

						produkteingabe();

						goto menue; break;
				case 2 :	
						printf( "\n*********************\n"
								"* WWS Kundeneingabe *\n"
								"*********************\n");
						
						kundeneingabe();

						goto menue; break;
				case 3 :
						printf( "\n**********************\n"
								"* WWS Produkteingabe *"
								"**********************");
						
						produktausgabe();
						
						goto menue; break;
				case 4 :
						printf( "\n*********************\n"
								"* WWS Kundenausgabe *\n"
								"*********************\n");
						
						kundenausgabe();
						
						goto menue; break;
				case 5 :
						printf(	"\n********************\n"
								"* WWS Produktliste *\n"
								"********************\n");
						
						produktliste();
						
						goto menue; break;
				case 6 :
						printf( "\n*******************\n"
								"* WWS Kundenliste *\n"
								"*******************\n");
						
						kundenliste();
						
						goto menue; break;
				case 7 :
						printf( "\n*******************\n"
								"* WWS Produktsuche *\n"
								"*******************\n");
						
						produktsuche();		
						
						goto menue; break;
						
				case 8 :
						printf( "\n*******************\n"
								"* WWS Kundensuche *\n"
								"*******************\n");				
						
						kundensuche();
						
						goto menue; break;
				case 0 :
						exit(0); break;
						
				default : return -1;
		}
		return 0;
}

funktionen.c:

Code:
#include "funktionen.h"

Produkt meineProdukte[20]

void produkteingabe() {		
		printf("\nWie viele Produkte moechten Sie hinzufuegen: ");
		scanf("%i", &m)

		for (o=1; o<m; o++) {
					printf("\nBitte geben Sie die Produkt-ID fuer das %d Produkt ein: ", o+1);
					scanf("%d", &meineProdukte[o].produktid);
					printf("Produktname: ");
					einlesen(meineProdukte[o].produktname, 26);
					printf("Preis: ");
					scanf("%i", &meineProdukte[o].preis);
					printf("Anzahl: ");
					scanf("%i", meineProdukte[o].anzahl);
					meineProdukte[o].gesamtpreis = meineProdukte[o].preis * meineProdukte[o].anzahl
		}
}

Kunde meineKunden[20];

void kundeneingabe() {
			printf("/nWie viele Kunden moechten Sie hinzufuegen: ");
			scanf("%i", &n);

			for (i=1; i<n; i++) {
					printf("\nBitte geben Sie die Kunden-ID fuer den %d Kunden ein: ", i+1);
					scanf("%d", &meineKunden[i].kundenid);
					printf("\nNachname eingeben: ");
					einlesen(meineKunden[i].name, 28);
					printf("Vorname eingeben: ");
					einlesen(meineKunden[i],vorname, 28);
			}
}

Produkt meineProdukte[20]

void produktausgabe() {
			printf("\nBitte geben Sie die Produkt-ID ein: ");
			scanf("%i", &o);

			if (meineProdukte[o].produktid == o) {
					printf(	"\n\n==============================\n"
							"|						%i		|\n"
							"| Produktname:			%s		|\n"
							"| Einzelpreis:			%6.2lf	|\n"
							"| Gesamtpreis:			%6.2lf  |\n"
							"| Anzahl:				%i		|\n"
							"================================\n"
							,meineProdukte[o].produktid, meineProdukte[o].produktname, meineProdukte[o].preis, meineProdukte[o].gesamtpreis, meineProdukte[o].anzahl);
			}
			
			else {
					printf("\nDiese Produkt-ID exestiert nicht!\n");
			}			
}


void kundenausgabe() {
			printf( "\nBitte geben Sie die Kunden-ID ein: ");
			scanf("%i", &i);

			if (meineKunden[i].kundenid == i) {
						printf( "\n================================\n"
								"| Kunden-ID:		%i			|\n"
								"| Name:			%s			|\n"
								"| Vorname:			%s			|\n"
								"================================\n"
								, meineKunden[i].kundenid, meineKunden[i].name, meineKunden[i].vorname);
			}
			
			else {
					printf("\nDiese Kunden-ID exestiert nicht!\n");
			}
}

void produktliste() {
			for (o=1; o<m; o++) {
					printf(	"\nProdukt-ID:			%i\n"
							"Produktname:			%s\n"
							"Einzelpreis:			%6.2lf\n"
							"Gesamtpreis:			%6.2lf\n"
							"Anzahl:				%i\n"
							, meineProdukte[o].produktid, meineProdukte[o].produktname, meineProdukte[o].preis, meineProdukte[o].gesamtpreis, meineProdukte[o].anzahl
					)
			}
					
}

void kundenliste() {		
		for (i=1; i<n; i++) {
				printf( "\nKunden-ID:	%i\n"
						"Name:			%s\n"
						"Vorname:		%s\n"
						, meineKunden[i].kundenid, meineKunden[i].name, meineKunden[i].vorname);
		}

}

int einlesen(char x[], int laenge) {
		int charLaenge = 0, c;
		
		laenge--;
		
		fflush(stdin);
		
		while((c = fgetc(stdin)) != EOF) {
				if ( c == '\n') {
						break;
				}
		}
		
		if (c == EOF && charLaenge == 0) {
				return EOF;
		}
		x[charLaenge] = '\0';
		return charLaenge;
}

int equal (char x[], char y[]) {

		if (strlen(x) != strlen(y)) {
				if (x[i] != y[i]) {
						return 0;
				}
		}
		return 1;
}

void produktsuche() {
		char sucheP[26];
		
		printf("Bitte geben Sie einen Produktnamen ein: ");
		einlesen(sucheP, 26);
		
		for (o= 0; o < m; o++) {
				if (equal (meineProdukte[o].produktname, sucheP)){
						printf("An Stelle %i gefunden!", o);
								
				}	
		}		
}

void kundensuche() {
		char sucheK[26];
		
		printf("Bitte geben Sie einen Kundennamen ein: ");
		einlesen(sucheK, 26);
		
		for (i = 0; i < n; i++) {
				if (equal (meineKunden[i].name, sucheK) || equal (meineKunden[i].vorname, sucheK)) {
						printf("An Stelle %i gefunden!", i);
						printf(gefundenK);
				}
		}
}

funktionen.h:

Code:
#include <stdio.h>
#include <string.h>

int auswahl, o, m, i, n;

typedef struct Einprodukt {
		int produktid;
		char produktname[26];
		double preis;
		int anzahl;
		double gesamtpreis;
} Produkt;

typedef struct Einkunde {
		int kundenid;
		char name[28];
		char vorname[28];
} Kunde;

void produkteingabe();
void kundeneingabe();
void produktausgabe();
void kundenausgabe();
void produktliste();
void kundenliste();
void produktsuche();

int equal();
int einlesen();

Also mein Hauptprogramm soll jetzt um einen weiteren Menüpunkt erweitert werden. Ich soll eine Rabattliste für meine Produkte erstellen und die Aufgabenstellung dazu habe ich zuvor gepostet. Ich versuche gerade mit Hilfe der Tipps von Shagrath und blackst0rm diese Rabattliste zu erstellen.
Ergänzung ()

Sondai schrieb:
Ich kann zwar nicht wirklich C, aber habe mich mal an einer Lösungs versucht :)


Danke Sondai, ich denke das bringt mich schon ein gutes Stück weiter.
 
Zuletzt bearbeitet:
Goto ?! Wie gruselig ist das denn :/
Das ist nur ein Hinweis darauf, dass dein Code schlecht strukturiert ist. Würde ich dringend ausbauen und ersetzen.
 
voodoo44 schrieb:
Goto ?! Wie gruselig ist das denn :/
Das ist nur ein Hinweis darauf, dass dein Code schlecht strukturiert ist. Würde ich dringend ausbauen und ersetzen.

Ach sehe ich auch grad, das goto hatte ich schon durch ein "main();" ersetzt. Das war ne ältere Datei.
 
Naja wieso kein goto? Ich verstehe die Stigmatisierung dieses Schlüsselwortes überhaupt nicht.
Natürlich kann man damit viel mit machen und oftmals ist es nicht sinnvoll. An dieser Stelle jedoch finde ich, dass es die Lesbarkeit des Codes deutlich verbessert, da sofort klar wird was als nächstes geschieht. hier hat das auch wenig mit schlecht strukturiertem Code zu tun. Es währe ohne viel Aufwand möglich dies durch eine while Schleife zu ersetzen.

Edit: Bei genauem Lesen des codes tauch da noch einige andere Probleme auf.

Die gesamt einlesen kunktion ist fehlerhaft.

charLaenge ist in jedem fall null
was ist das c? nicht definierter Bezeichner
fflush(stdin) ist nicht definiert. Kann je nach Compiler funktionieren, nen Compilerfehler auslösen oder zur Laufzeit explodieren
die eingelesen chars werden nicht in das zielarray geschrieben
 
Zuletzt bearbeitet:
blackst0rm schrieb:
Naja wieso kein goto? Ich verstehe die Stigmatisierung dieses Schlüsselwortes überhaupt nicht.
Natürlich kann man damit viel mit machen und oftmals ist es nicht sinnvoll. An dieser Stelle jedoch finde ich, dass es die Lesbarkeit des Codes deutlich verbessert, da sofort klar wird was als nächstes geschieht. hier hat das auch wenig mit schlecht strukturiertem Code zu tun. Es währe ohne viel Aufwand möglich dies durch eine while Schleife zu ersetzen.

Edit: Bei genauem Lesen des codes tauch da noch einige andere Probleme auf.

Die gesamt einlesen kunktion ist fehlerhaft.

charLaenge ist in jedem fall null
was ist das c? nicht definierter Bezeichner
fflush(stdin) ist nicht definiert. Kann je nach Compiler funktionieren, nen Compilerfehler auslösen oder zur Laufzeit explodieren
die eingelesen chars werden nicht in das zielarray geschrieben

Also bei mir funktioniert alles, ohne Probleme. Ich arbeite mit ner Unix Maschine, die steht bei uns in der Uni.

_____

Also das habe ich jetzt dazu geschrieben, es funktioniert auch, nur es gibt mir die komplette Liste aus, egal wie viele Produkte ich einspeichere. Wie könnte ich das umändern, dass mir nur die Produkte angezeigt werden, die ich zuvor eingespeichert habe?
Hab nämlich ein Produkt eingespeichert mit Name: Tomaten, Preis: 10 und er gibt mir dann aus:

Tomaten, 10.00, 9.50, 9.00, 8.50, 8.00, 7.50
, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00
usw.

Code:
void rabattliste(Produkt *p, int akt_anz) {
		double rabatt[5] = {0.05, 0.1, 0.15, 0.20, 0.25};
		int anzahlVonRabatten = sizeof(rabatt)/sizeof(rabatt[0]);
		double rabattListe[akt_anz][anzahlVonRabatten];
		
		for(int i = 0; o < akt_anz; o++) {
				for(int j = 0; j < anzahlVonRabatten; j++) {
						rabattListe[o][j] = meineProdukte[o].preis - meineProdukte[o].preis * rabatt[j];
				}
		}
		for(int o = 0; o < akt_anz; o++) {
				printf("%s, %.2f", meineProdukte[o].produktname, meineProdukte[o].preis);
				for(int j = 0; j < anzahlVonRabatten; j++) {
						printf(", %.2f", rabattListe[o][j]);
				}
				printf("\n");	
		}
}
 
Du musst schon bei "akt_anz" die richtige Anzahl von Produkten übergeben.
Musst halt beim einlesen mitzählen wieviele eingeben werden und dem entsprechend den Wert immer mit erhöhen.

Habe gerade auch auslangeweile mal das System teilweise in Go implementiert.
http://pastebin.com/1jyeM8vF
 
Zuletzt bearbeitet:
Sondai schrieb:
Du musst schon bei "akt_anz" die richtige Anzahl von Produkten übergeben.
Musst halt beim einlesen mitzählen wieviele eingeben werden und dem entsprechend den Wert immer mit erhöhen.

Habe gerade auch auslangeweile mal das System teilweise in Go implementiert.
http://pastebin.com/1jyeM8vF

Jo stimmt, danke dir.

Sieht gut aus, ich bin noch im ersten Semester, daher lerne ich gerade erst C und Java etwas kennen.
 
Zurück
Oben