Zum Inhalt springen

for schleife vorzeitig beenden


Empfohlene Beiträge

Geschrieben

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;    


}

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

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?

Geschrieben

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)

Geschrieben

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

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

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

Geschrieben (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 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
Geschrieben

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

Geschrieben

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;

}


Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...