Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

for schleife vorzeitig beenden

Empfohlene Antworten

Veröffentlicht

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;    


}

Wenn du das ganze nur einmal machen willst warum dann überhaupt eine schleife ?

ich möchte mehr als nur einen artikel eingeben, max 100 artikel

die schleife läuft von 1 bis 100

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 von kleiner57990

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?

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)

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

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 von kleiner57990

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 :D

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 Arrays

char 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 von lilith2k3

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

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;

}


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).

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.