If Abfrage im Array



  • Hey Leute !
    Bin neuling und brauche unbedingt eure Hilfe.
    Ich habe einen Array, der einen Kinosaal beschreibt.
    Nun soll in diesem Kinosaal ein Teil einer festvorgegebenen Reihe mit Leuten besetzt werden. Beim Nächsten Schritt, dürfen diese reservierten Plätze ja nicht mehr überschrieben werden. Meine If-Anweisung löst dieses Problem aber nicht:

    for (sitze_count=0; sitze_count<SITZE; sitze_count++)
    {
    if ((test_matrix[wunschreihe][sitze_count])=X)
    ((test_matrix[wunschreihe][sitze_count])=0);
    var_bestellt=(var_bestellt+1);
    printf("%d \n",var_bestellt);
    if (var_bestellt >= wunsch) break;

    Das Problem liegt wohl in den ersten Beiden Zeilen. Dem Program interessiert nicht, ob in dem Feld nen X steht oder nicht, es setzt immer den Wert 0. Somit funktioniert mein Prinzip mit der Zählvariable auch nicht.
    Bitte helft mir schnell oder sagt mir, was ihr noch für infos brucht



  • = ist der zuweisungsoperator
    (a=5;)
    für if's brauchst nen vergleichsoperator nähmlich ==
    und warum sind da runde klammern nach dem if?wenn dann geschweifte { und }
    also müsste die zeile so aussehen:

    if ((test_matrix[wunschreihe][sitze_count])==X)
    {
    test_matrix[wunschreihe][sitze_count])=0;
    }
    ausserdem fehlt für die erste for imho die schließende klammer }
    ist X eine variable?
    wenn ja dann ok,aber wenns ein string ist dann muss es 'X' heissen
    var_bestellt=(var_bestellt+1);
    warum nicht var_bestell++; ?

    hoffe das hilfst erstmal

    ps:so viele fehler..ich hoffe das ist keine fake :p 😉



  • Erstmal Danke für die Hilfe !! Allerdings funzt das Ding noch immer net. Habs jetzt so geschrieben.

    for (sitze_count=0; sitze_count<SITZE; sitze_count++)
    {
    if ((test_matrix[wunschreihe][sitze_count])==0)
    ((test_matrix[wunschreihe][sitze_count])=1);
    var_bestellt=(var_bestellt+1);
    printf("%d \n",var_bestellt);
    if (var_bestellt >= wunsch)
    break;
    }

    Wenn er im Array 0 findet soll er eins schreiben. Jedesmal wenn er diesen wechsel vollzieht, soll die Zählvariabel einen heraufgesetzt werden. Wenn die Zählvariabel größer oder gleich dem vorher eingegebenen Wunsch ist, soll die Schleife aufhören. So möchte ich erreichen, dass er zunächst kontrolliert ob der Platz noch frei ist und denn nicht zu viele Plätze vergibt. Die Kontrolle funzt aller dings immer noch nicht. Ist ein Platz bereits im ersten Durchgang mit 1 besetzt worden, wird er im zweiten trotzdem wiederbelegt.
    Wo liegt der Fehler?



  • hi
    ich versteh nicht genau was du machen willst aber ich aber mal diesess programm gemacht dass einen kinosaal mit einer bestimmten anzahl leutchen füllt.ich würde es wahrscheinlich anders machen also so aber es kommen darin array's, if's und break's vor, also so ziemlich dass was du wissen wolltest.ich hoffe es hilft!

    #include <iostream>
    
    #define MAX_X 10
    #define MAX_Y 20
    
    int sitz[MAX_X][MAX_Y];
    char sitz_zeichen[2]={'-','#'};
    void zeichne_raum();
    void leute_rein(int anzahl_leute);
    
    int main(int argc, char *argv[])
    {
      leute_rein(125);
      zeichne_raum();
    
    {int temp;cout <<"beliebige zahl zum beenden";cin>>temp;}
      return 0;
    }
    
    void zeichne_raum()
    {
    int x,y;
    for (x=0;x!=MAX_X;x++)
        {
        for (y=0;y!=MAX_Y;y++)
            {
    //        cout<<sitz[x][y]<<" ";  einfachere version 
              cout << sitz_zeichen[  sitz[x][y]  ]<<" ";
              }
        cout <<"\n";
        }
    }
    
    void leute_rein(int anzahl_leute)
    {
    int x,y;
    for (x=0;x!=MAX_X;x++)
        {
        for (y=0;y!=MAX_Y;y++)
            {
                if (sitz[x][y]==0)
                {sitz[x][y]=1;anzahl_leute--;}
            if (anzahl_leute<=0) {break;}
            }
            if (anzahl_leute<=0) {break;}
       }    
    cout << "\n\n"<< anzahl_leute <<" haben keinen platz gekriegt\n\n";
    cout << (MAX_X*MAX_Y)<<" sitze sind noch frei\n\n";
    }
    

    viel spass

    ps:
    versuch deinen code durch tabs,einrücken übersichtlicher zu machen, dann sieht man fehler sehr viel leichter.



  • nimm doch in den for-Schleifen lieber < als != und vor "haben keinen Platz bekommen" solltest du noch "Leute" schreiben, oder so ähnlich, sonst steht da zB 5 haben keinen Platz bekommen... 🙂

    Ach, und von MAX_X*MAX_Y sitze sind noch frei halt ich auch nich viel...

    [ Dieser Beitrag wurde am 27.11.2002 um 17:20 Uhr von D1BAKEL editiert. ]



  • "Ach, und von MAX_X*MAX_Y sitze sind noch frei halt ich auch nich viel..."
    -stimmt sorry, lol.kommt ja immer das selbe raus.muss man halt noch ne zweite variable von abziehen

    "5 haben keinen Platz bekommen"
    ja das steht dann da 🙂
    es ging ja glaub ich auch mehr um arrays und so, darum denk ich das ist nicht sooo schlimm.

    "in den for-Schleifen lieber < als != "
    hm,ja ich weiss wenn man dann in 3er-schritten zählt ist das nicht so toll.aber ich hab mir angewöhnt wenn ma schluss nur x++ (1er-schritte) steht != zu nehmen.ob das jetzt gut ist, ist mal was anderes 🙄



  • Hi, sorry, wollte nich pingelig sein, mein folgendes Beispiel is auch Anprangerungen in jedem Sinne schuldig... 🙂 Naja, ich hab mir grad nochma Gedanken gemacht, und das son bisschen modifiziert, sollte jetzt alles klappen... Bei mir jedenfalls 🙂

    #include <iostream.h>
    
    const int MAX_X = 10;
    const int MAX_Y = 20;
    
    int g_frei = MAX_X * MAX_Y;
    int g_sitz[MAX_X][MAX_Y];
    
    char sitz_zeichen[2]={'-','#'};
    
    void zeichne_raum() {
        for(int x = 0; x < MAX_X; x++, cout << "\n")
            for(int y = 0; y < MAX_Y; cout << sitz_zeichen[g_sitz[x][y++]]);
        cout << endl;
    }
    
    void leute_rein(unsigned int anzahl_leute) {
    
        for(int x = 0; x < MAX_X && anzahl_leute && g_frei; x++)
            for(int y = 0; y < MAX_Y && anzahl_leute && g_frei; y++)
                (!g_sitz[x][y]++) ? g_frei--, anzahl_leute-- : g_sitz[x][y]--;
    
        if(anzahl_leute) cout << anzahl_leute <<" Leute haben keinen Platz gekriegt.\n\n";
        if(g_frei)       cout << g_frei <<" Sitze sind noch frei.\n\n";
    }
    
    int main(int argc, char *argv[]) {
        leute_rein(125);
        zeichne_raum();
        leute_rein(33);
        leute_rein(50);
    
        return 0;
    }
    

    So, in der Konsole steht dann ungefähr folgendes:

    75 Sitze sind noch frei.
    
    ####################
    ####################
    ####################
    ####################
    ####################
    ####################
    #####---------------
    --------------------
    --------------------
    --------------------
    
    42 Sitze sind noch frei.
    
    8 Leute haben keinen Platz gekriegt.
    
    Press any key to continue
    

    Okay, kannst ja ma son bisschen am Quellcode rumspielen...

    D1B



  • hallo,
    kein problem wegen Fehler in meinem prog. ich habe hier ja uch paar sachen entdeckt 😉 (nicht pingelig gemeint oder so,ich mach halt manches anders)
    "if(anzahl_leute) cout << anzahl_leute <<" Leute haben keinen Platz gekriegt.\n\n";"
    das mit dem if(anzahl_leute) find ich cool,ich hätte wahrscheinlich
    if(anzahl_leute==..) geschrieben

    "#include <iostream.h>" anstelle von #include <iostream>
    ich habs früher auch immer ohne das .h geschrieben aber angeblich ist das bei standard-headern nicht üblich

    "const int MAX_X = 10;"
    hm,welchen vorteil hat das?ist das schneller als #define MAX_X 10 ?

    fehlt nicht die deklaration von den funktionen?geht aber trotzdem..

    "void leute_rein(unsigned int anzahl_leute)"
    int is doch 4 bytes,unsigned doch auch wo ist der unterschied?(sorry,newb)

    in main() könnte nochmal zeichne_raum(); rein damit man sieht das der raum wirklich voll ist

    {int temp;cout <<"beliebige zahl zum beenden";cin>>temp;}
    hatte ich benutzt damit das konsolenfenster nicht gleich wieder verschwindet bevor man was erkennt

    "for(int x = 0; x < MAX_X && anzahl_leute && g_frei; x++)
    for(int y = 0; y < MAX_Y && anzahl_leute && g_frei; y++)"
    ist besser als meins imo.

    "(!g_sitz[x][y]++) ? g_frei--, anzahl_leute-- : g_sitz[x][y]--;"
    naja,war ja als erklärung gedacht da wollte ich nicht gleich mit ? und : und so rumwerkeln

    cu



  • Hi Kollege, also ich geh mal der Reihe nach vor:

    Naja, das mit dem if(Anzahl_leute) und if(g_frei) hab ich gemacht, das da nich steht "0 Leute..." oder "0 freie Plätze..."

    Das mit dem #include <iostream.h> is einfach noch ne Angewohnheit von früher, wenns auch ohne ".h" geht, dann machs ruhig 🙂 Ich werd auch ma versuchen, mich umzustellen...

    Ich hab const int statt #define genommen, weil... Ich glaub das is auch ne Angewohnheit, es soll aber imho besser sein. Auch für den Precompiler. (Lasst mich am Leben, wenn ich da was falsches gesagt hab 🙂 ) Find ich auf jeden Fall übersichtlicher.

    Die Deklinationen der Funktionen braucht man nur anzugeben, wenn die Funktionen Referenzen vor der Definition haben, sie also im Quelltext früher benutzt werden, als sie definiert werden. Da ich die Main() aber hinter den andren Funktionen hab, kennt der Kompiler die Funktionen schon.

    Die Geschichte mit unsigned is ne reine Formsache. Da man ja nich negativ viele Leute ins Kino schicken kann, kann man das auch im Kopf der Funktion ersichtlich machen. Dass man schon beim Aufrufen der Funktion sieht, dass ne positive ganze Zahl erwartet wird.

    Ja sicher kann man zeichne_Raum() nochmal in die Main() machen, so oft du willst. 🙂

    Dieses "beliebige Zahl zu Beenden eingeben" find ich auch nicht so schön, machs aber ruhig. Is bei dir denn mit meinem Quellcode das Fenster geschlossen worden, bevor du was sehen konntest? Bei mir sagt er eh "Press any key to continue" und dann beendet er erst nach drücken einer belibiegen Taste. Wenn man dieses "beliebige Zahl eingeben" auch noch verwendet, muss man zu beenden ja erst irgendne Zahl eingeben, die noch mit Enter bestätigen und dann noch ne beliebige Taste drücken, ich finde das letzt Aktion ausreicht.

    Naja, was dir von meinem "wirren" Style gefällt, darfst du übernehmen 🙂

    mfG D1B



  • hi!
    ja,bei mir geht das fenster immer gleich wieder zu..
    und wenn ich nur 'EINE beliebige taste zum beenden' habe gehts meistens auch aus weil ich dauernd dopppelt auf F9 drücke

    mit dem unsigned:naja,hast recht aber vielleicht will mans ja mal so erweitern dass die leute auch wiederrausgehen: leute_rein(-15);

    das main ganz unten steht findet ich irgendwie verwirrend,meistens schreibe ich meine funktionen und schieb sie dann möglichst weit nach unten wo sie nicht stören..

    und soll es doch ruhig "0 freie plätze" sagen,lieber zuviel info als zu wenig. 😉

    cu


Anmelden zum Antworten