19chris88 Geschrieben 16. November 2010 Geschrieben 16. November 2010 Hallo, ich schreibe ein programm um artikel einzugebe wie bekomme ich das hin, das nachdem die for schleife durchlaufen wurde, ich die for schleife verlasse. habe jetzt schmal etwas versucht, aber klappt noch nicht so richtig, vielleicht sieht jemand den fehler!! hier jetzt das programm #include <stdio.h> #include <stdlib.h> #define MAX 100 struct artikel{ char artikel_n[MAX]; double artikel_nr[MAX]; double artikel_p[MAX]; double artikel_best[MAX]; }a; int main(){ int i; char antw; printf("\n\n <<<<<<<<<< WARENLAGER >>>>>>>>>> \n\n"); printf(" Eingabe der Lagerbestaende\n"); struct artikel; do{ for (i=0; i < MAX-1; i++){ printf("\n Artikelname: "); scanf(" %s", &a.artikel_n[i]); printf("\n Artikelnummer: "); scanf(" %lf", &a.artikel_nr[i]); printf("\n Preis :"); scanf(" %lf", &a.artikel_p[i]); printf("\n Menge: "); scanf(" %lf", &a.artikel_best[i]); printf("\n Weiteren Artikel eintragen?Y/N \n\n"); scanf("%s",&antw); switch(antw){ case('N'): case('n'): break; } } } while(antw !='Y' && antw !='n'); printf("\n Uebersicht des Lagebestandes\n"); printf("\n Artikelname Artikelnummer Preis in Euro Menge "); printf("\n\n %s %3.lf %.2lf %.0lf\n\n",a.artikel_n, a.artikel_nr, a.artikel_p, a.artikel_best); system("pause"); return 0; } Zitieren
kleiner57990 Geschrieben 16. November 2010 Geschrieben 16. November 2010 Wenn du das ganze nur einmal machen willst warum dann überhaupt eine schleife ? Zitieren
19chris88 Geschrieben 16. November 2010 Autor Geschrieben 16. November 2010 ich möchte mehr als nur einen artikel eingeben, max 100 artikel die schleife läuft von 1 bis 100 Zitieren
kleiner57990 Geschrieben 16. November 2010 Geschrieben 16. November 2010 (bearbeitet) Warum benutzt du dann nicht einen boolsche wert ? bool a=True; if(a==True){ /* Deine anweisungen */ i++; a=False; } ein kurzes bsp Weist du denn im voraus wie viele Artikel du eingibst ? Bearbeitet 16. November 2010 von kleiner57990 Zitieren
Hexagon Geschrieben 16. November 2010 Geschrieben 16. November 2010 Moin. habe jetzt schmal etwas versucht, aber klappt noch nicht so richtig, vielleicht sieht jemand den fehler!! Ich zitiere mal Klotzkopp: "Funktioniert nicht" ist keine ausreichende Fehlerbeschreibung. Was funktioniert nicht? Zitieren
kleiner57990 Geschrieben 16. November 2010 Geschrieben 16. November 2010 Soweit ich das verstanden habe will er mehrer artikel eingeben bis maximal 100. Er hat alles in eine For-Schleife reingemacht,die logischerweise erst dann aufhört wenn es beim dem von ihm angegebenen wert erreicht ist. Er will die For-Schliefe nur einmal durchlaufen und dann wenn er mag noch mehr Artikel eingeben können. (So hab ich das mal verstanden) Zitieren
Hexagon Geschrieben 16. November 2010 Geschrieben 16. November 2010 Aber warum dann eine for-Schleife? So ganz erschließt sich mir der Sinn dann nicht. Und 100 Artikel mit mit einem 1 Zeichen langen Artikelnamen sind bestimmt auch nicht gewollt. :beagolisc Zitieren
kleiner57990 Geschrieben 16. November 2010 Geschrieben 16. November 2010 (bearbeitet) Ja das hab ich auch nicht so ganz verstanden warum er ne for-Schleife benutzt. Glaub ich auch nicht. Ich denke mal eine while-schleife die auf eine bool prüft wären da sinnvoller oder? Bearbeitet 16. November 2010 von kleiner57990 Zitieren
Hexagon Geschrieben 16. November 2010 Geschrieben 16. November 2010 Zumindest sollte er i gleich mit 0 initialisieren, die for-Schleife rauswerfen, im while-Statement prüfen auf 'n' bzw. 'N' und das i kleiner MAX ist. Und vorallem sollte er sich mal ein Array von "artikel" anlegen! :beagolisc Zitieren
lilith2k3 Geschrieben 16. November 2010 Geschrieben 16. November 2010 (bearbeitet) Das ganze Ding haut nicht hin .... #define MAX 100 Sowas bitte Unterlassen: 1) Wenn es eine Integerkonstante sein soll, glaube ich, spricht nichts dagegen, daß dann auch so hinzuschreiben, oder? 2) Wäre es sinnvoll, sich beim Benennen der Variablen ein wenig mehr Gedanken zu machen ... const int ArtikelMaximum = 100; Jeder andere Programmierer kann dann anhand des Variablennamens erkennen, worum es geht, nämlich um die maximale (maximal gewünschte) Anzahl an Artikeln. und char antwort; Überläufe werden von Dir überhaupt nicht berücksichtigt: char antw; ... scanf("%s",&antw); [/PHP] scanf nimmt zur Not auch einen ganzen Aufsatz entgegen, den Du dann in einem einzigen Byte (char) ablegen willst? Benutze lieber fgets: [PHP]fgets ($Zielstring , $LeseAnzahlBytes , $Stream); fgets(myString,100, stdin); Wofür steht diese Zeile struct artikel;? scanf("%s",&antw); switch(antw){ case('N'): case('n'): break; }[/PHP] Den ganzen Block solltest Du aus der for-Schleife herausnehmen. Desweiteren solltest Du für die Fälle 'N','n' keinen Switchblock verwenden, vorallem weil Du Dir mit dem [PHP]break ein Eigentor schießt. Wenn überhaupt, dann schreib folgendes: if (antw == 'N' || antw == 'n') break; Das versteht jeder. "Wenn antw ein großes N oder antw ein kleines N, dann verlasse die (do-while)-Schleife". Was deklarierst Du eigentlich an der Stelle? struct artikel{ char artikel_n[MAX]; double artikel_nr[MAX]; double artikel_p[MAX]; double artikel_best[MAX]; }a;[/PHP] Du deklarierst einen Artikel, der einen Namen (artikel_n) besitzt -den Du im Übrigen ruhig "char artikel_name" benennen könntest-, mit einer Länge von [i]MAX[/i], also 100 Zeichen. Bei _nr, _p, _best legst Du allerdings ein Array von Doubles an. Um Zeichenketten abzulegen, benötigst Du ein eindimensionales Array [PHP]char meinString[100]; willst Du mehere Zeichenketten ablegen, benötigst Du zweidimensionale Arrayschar meineStrings[10][100];. Sinnvoller wäre es, wenn Du mit C++ arbeiten würdest. Dort gibt es auch Strings. scanf(" %s", &a.artikel_n[i]); Das ganze würdest Du sinnvollerweise anders aufziehen: 1) ein Struct für Artikel anlegen 2) ein Array zur Verwaltung der einzelnen Artikel (später wirst Du es mit dynamischer Speicherverwaltung auch dynamisch erzeugen) Und dann über das Array auf die einzelnen Artikel, resp. Artikelmember zugreifen. printf("\n\n %s %3.lf %.2lf %.0lf\n\n",a.artikel_n, a.artikel_nr, a.artikel_p, a.artikel_best); Dazu sag ich jetzt nichts mehr. Hausaufgabe: 1) Code lesbarer gestalten Jede gute Benennung spart unnötige Kommentarzeilen ebenso wie Dokumentation. Der Code soll zeigen, was er tut. Tut er das nicht, macht ein Kommentar die Sache nur noch schlimmer. Code will nicht nur geschrieben werden, sondern vorallem gelesen. 2) Logik überdenken Was ist sinnvoller, eine Struktur, die versucht alle Artikel abzubilden, oder eine Struktur, die genau einen Artikel abbildet? 3) Überläufe bedenken und sichere(re) Funktionen benutzen 4) Überlegen, ob C++ nicht doch sinnvolle wäre 5) Überlegen, ob C/C++ überhaupt anfängertauglich ist Bearbeitet 16. November 2010 von lilith2k3 Zitieren
19chris88 Geschrieben 17. November 2010 Autor Geschrieben 17. November 2010 danke schonmal für die vielen tipps so, ich habe alle tipps versucht anzuwenden und einfach nochmal neu angefangen das programm zu programmieren. es funktioniert eig alles ganz gut, nur, wenn ich den ersten artikelnamen eingeben will, wird der übersprungen und ich fangen mit dem zweiten artikel an. woran liegt das? wenn ich nun noch die artikelnummer eingeben will wird der artikelname ganz übersprungen und ich kann nur die nummer eingeben. hier mein quellcode #include <stdio.h> #include <stdlib.h> struct artikel{ char artikle_n[50]; //Artikelname mit max. 50 Zeichen double artikel_nr; //Artikelnummer double artikel_p; //Artikelpreis double artikel_m; //Menge des vorhandenen Artikels }a[100]; int main(){ int anzahl, i; printf("\n ----------> WARENLAGER <---------- \n"); printf("\n Eingabe der einzelnen Artikel!! \n\n"); printf(" Wie viel Artikel wollen Sie eingeben? "); scanf(" %d",&anzahl); //Anzahl wie oft die Schleife durchlaufen werden soll printf("\n Sie geben jetzt %d Artikel ein.\n Wenn sie vorher beenden wollen einfach einen negativen Wert eingeben! \n\n",anzahl); for(i = 1; i <= anzahl+1; i++){ printf("\n Artikelname: "); fgets(a[i].artikle_n, 50, stdin); // sscanf(a[i].artikle_n, "%s", &a[i].artikle_n); printf("\n\n Artikelnummer: "); scanf(" %lf",&a[i].artikel_nr); } printf("\n"); printf("warenbestand"); for(i=0; i<= anzahl; i++){ printf(" %s",a[i].artikle_n); printf(" %.2lf",a[i].artikel_nr); } system("pause"); return 0; } über weitere hilfe bin ich sehr dankbar Zitieren
carstenj Geschrieben 17. November 2010 Geschrieben 17. November 2010 Hi, wenn du scanf zur Eingabe benutzt, wird der Zeilenumbruch (oder Return) als Zeichen gewertet. Das musst durch while(getchar() != '\n') abfangen. Generell funktioniert da aber eher nicht so viel, bei deinem Code. Weder die Anzahl der Artikel wird richtig gezählt, noch richtig ausgegeben. Ich habe das mal ein bisschen angepasst. Vergleich das einfach mal mit deinem Code. #include <stdio.h> #include <stdlib.h> struct artikel{ char artikel_n[50]; //Artikelname mit max. 50 Zeichen double artikel_nr; //Artikelnummer double artikel_p; //Artikelpreis double artikel_m; //Menge des vorhandenen Artikels }a[100]; int main(){ int anzahl, i; printf("\n ----------> WARENLAGER <---------- \n"); printf("\n Eingabe der einzelnen Artikel!! \n\n"); printf(" Wie viel Artikel wollen Sie eingeben? "); scanf(" %d",&anzahl); //Anzahl wie oft die Schleife durchlaufen werden soll printf("\n Sie geben jetzt %d Artikel ein.\n Wenn sie vorher beenden wollen einfach einen negativen Wert eingeben! \n\n",anzahl); for(i = 0; i < anzahl; i++){ while(getchar() != '\n'); printf("\n Artikelname: "); fgets(a[i].artikel_n, 50, stdin); // sscanf(a[i].artikle_n, "%s", &a[i].artikle_n); printf("\n\n Artikelnummer: "); scanf(" %lf",&a[i].artikel_nr); } printf("\n"); printf("warenbestand:\n"); for(i=0; i< anzahl; i++){ printf("Artikelname: %s",a[i].artikel_n); printf("Artikelnnummer: %.2lf\n",a[i].artikel_nr); } return 0; } Zitieren
Korhil Geschrieben 17. November 2010 Geschrieben 17. November 2010 Auch wenn die for-Schleife als sogenannte Zählerschleife eigentlich nur für Wiederholungen mit fest vorgegebener Anzahl gedacht ist, kann man die vielfältigsten Sachen damit machen. Aus diesem Grund habe ich mal ein kleines Beispiel geschrieben, das man auf den Fall problemlos ummünzen könnte (hab ich aber keine Lust zu): #include <stdio.h> int main() { int i, anzahl; char antwort, ENTERkiller; printf("Wie oft wollen Sie gefragt werden ?\n"); scanf("%d%c", &anzahl, &ENTERkiller); antwort = 'j'; for (i=1; (i<=anzahl) && (antwort=='j');i++) { //... printf("\n%i.Durchlauf",i); printf("\nWollen Sie nochmal ? (j/n)"); scanf("%c%c", &antwort, &ENTERkiller); } getchar(); } Hier wird auch schön gezeigt, das ein while(getchar() != '\n') nich notwendig ist. Die zweite Variable nimmt das Enter/Return auf, so dass danach normal weiter gearbeit werden kann - finde ich optisch eine übersichtlichere Sache als all die Schleifen im Code (persönliche Meinung). Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.