[C-Anfänger]Array,Schleifen

11/16/2015 09:55 Ultim4te#1
Hey, ich bräuchte mal eure Hilfe!

In diesem Programm sollen Daten gespeichert und auf Wunsch ausgegeben werden.
Probleme:
-Beim Eingeben eines Produktes/Kunde muss ich direkt alle zehn Arrays eingeben. Eigendlich möchte ich nur ein Array pro eingeben.
-Bei der Ausgabe werden mir 10 Produktnamen, aber nur eine ProduktID und unzwar die 0 ausgebeben.

Selber habe ich schon viel gegoogelt und auch schon eine ähnliche Lösung gefunden die für mich als Anfänger sehr Komplex war. Ich nehme auch gerne Vorschläge für eine Verbesserung dieses Übungsprogrammes entgegen.

11/16/2015 15:22 .SkyneT.#2
Verbesserungen:
- Schleifenvariablen würde ich nur, wenn es nötig ist ausserhalb der Schleife deklarieren.
- Variablen sinnvoll benennen, später wirst du nicht mehr wissen was c,i,k ist, ohne den kompletten Code nocheinmal zu lesen.

Hier der verbesserte Code:
(Absichtlich als Bild, damit du es nicht mit Copy&Paste übernimmst :P )
11/16/2015 16:36 warfley#3
Quote:
- Schleifenvariablen würde ich nur, wenn es nötig ist ausserhalb der Schleife deklarieren.
Das ist Teil des strukturierten Programmierens und wird von Professoren und Lehrern meist so gelehrt, da es als sauberer Programmierstil gilt.
11/16/2015 17:05 .SkyneT.#4
Quote:
Originally Posted by warfley View Post
Das ist Teil des strukturierten Programmierens und wird von Professoren und Lehrern meist so gelehrt, da es als sauberer Programmierstil gilt.
Echt?
Es ist meiner Meinung nach komplett sinnlos den Gültigkeitsbereich einer Variable unnötig in die Länge zu ziehen. Und schöner/übersichtlicher finde ich es auch nicht, da ich die Variablen, wenn sie ausserhalb der Schleife sind, erst zuordnen/im weiteren Code suchen muss.

Ausserdem sollte diese Methode auch etwas mehr Arbeitsspeicher beanspruchen, da der Speicher erst beim Verlassen der Funktion freigegeben werden kann, anstatt nach Verlassen der Schleife.
(Bin mir hier nicht sicher, könnte auch falsch sein.
Und ja, ich weiß das das bisschen Speicher hier nicht relevant ist.)
11/16/2015 18:06 Jeoni#5
Quote:
Originally Posted by .SkyneT. View Post
Ausserdem sollte diese Methode auch etwas mehr Arbeitsspeicher beanspruchen, da der Speicher erst beim Verlassen der Funktion freigegeben werden kann, anstatt nach Verlassen der Schleife.
(Bin mir hier nicht sicher, könnte auch falsch sein.
Und ja, ich weiß das das bisschen Speicher hier nicht relevant ist.)
Abgesehen davon, dass dieses bisschen Speicher kaum bis keine Relevanz hätte, ist es bei den mir bekannten Compilern auch falsch. Der gesamte Speicher für lokale Variablen einer Funktion (egal, wo sie innerhalb der Funktion deklariert wurden) wird am Funktionsanfang durch dekrementieren vom Stackpointer (ESP / RSP) allokiert. Maximal können zwei lokale Variablen, nennen wir sie hier i1 und i2, die keine Überschneidung ihres Gültigkeitsbereichs aufweisen im Kompilat als eine einzige lokale Variable genommen werden. Beispielsweise wenn man zwei for-Schleifen untereinander hat. Da ist es dann aber egal, ob man in den beiden for-Schleifen direkt Zählvariablen mitdeklariert (ggf. beide gleich nennt) oder am Funktionsbeginn einmal eine Variable deklariert, die in beiden Schleifen zum Zählen benutzt wird.
Mit freundlichen Grüßen
Jeoni
11/16/2015 23:11 Slade100#6
habe gerade langeweile, hier hast du paar vorschläge um das zu verfeinern ^^
1. würde ich für 2 verschiedene for schleifen(solange diese nicht in einander sind) den selben counter i benutzen und nicht jedesmal ein andern.

2. würde ich am ende bei der while als bedingung auswahl != 5 statt auswahl <5 nehmen, damit der nicht abbricht sobald man mal ausversehn eine andere zahl eingibt.

3. würde ich die printfs beim menü, sodass man sieht bei welchem namen oder produkt man gerade ist und auch eine if schleife reinsetzen um sicherzustellen das keiner versucht mehr als 10 namen oder produkte einzufügen und wenn dann solls nicht klappen.
z.b beim menü :
Code:
if(nameCount<10)
printf("1.Name %i/10 eingeben\n",nameCount+1);
if(productCount<10)
printf("2.Produkt %i/10 eingeben\n", productCount+1);
und natürlich auch in die case 1 und 2 eine if bedingung z.b in case 1:
Code:
if(nameCount==10)
printf("die maximale kapazität von 10 namen ist bereits erreicht\n");
else {
printf("Vorname eingeben:");
scanf("%s", &Name[nameCount].Vorname);
++nameCount;
}
break;
11/17/2015 18:15 .SkyneT.#7
Quote:
Originally Posted by Slade100 View Post
3. würde ich die printfs beim menü, sodass man sieht bei welchem namen oder produkt man gerade ist und auch eine if schleife reinsetzen um sicherzustellen das keiner versucht mehr als 10 namen oder produkte einzufügen und wenn dann solls nicht klappen.
Es gibt keine "if-schleifen"! Eine Erklärung dafür ist aber hoffentlich nicht nötig :)

Grundsätzlich sind die 3 Vorschläge aber schon sinnvoll, da ein Benutzerfreundliches Programm jede mögliche Fehleingabe abdecken sollte ohne dabei abzustürzen.