c_einsteiger-problem_lauflicht



  • hallo.
    ich hoffe das ich hier mit meinem problem richtig bin.
    komme an irgendeiner stelle nicht weiter,naja bin ja neuling im programmieren.

    habe folgendes problem.
    programmiert werden soll ein lauflicht mit variabler anzahl lichter.
    wichtig ist das es über eine whileschleife programmiert werden soll und man die anzahl eingeben kann.die darstellung soll in der form:
    beispiel: xoooo erfolgen-mit hilfe von carriage return soll im nächsten durchgang:oxooo dargestellt werden-usw.
    um zu sehen ob und was passiert habe ich allerdings vorerst \n eingegeben-also nit wundern.
    bisher habe ich folgenden code-mit dem ich allerdings nit weiterkomme-vielleicht kann ja jemand ordnung reinbringen so dass ich es verstehe.
    also:

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<time.h>
    #include<conio.h>
    
    void sleep(clock_t wait);
    void main(void)
    
    {
    	char  anzahl,durchgang,i,ausgabe;
    
    printf ("Dieses Programm gibt ein Lauflicht auf dem Bildschirm aus,bei dem sie die Anzahl der Elemente bestimmen koennen.\n");
    printf ("Bitte geben sie die Anzahl der gewuenschten Zeichen ein:\n");
    
    scanf  ("%c",&anzahl);
    
    durchgang=0;
    while(durchgang<anzahl,!kbhit() )
    {
    
    	for(i=0;i<anzahl;i++)
    	{
    		if (i=anzahl)
    		{ausgabe='X';}
    		else
    		{ausgabe='O';}
    	}
    
    	printf ("%c\n",ausgabe);
    	++durchgang;
    
    if (++durchgang=anzahl)
    
    	durchgang=0;	
    
    sleep( (clock_t)1 * CLOCKS_PER_SEC ); /*angabe der wartezeit-hier könnte auch "sleep(500);"stehen*/
    }
    
    while(!kbhit()); 		
    
    //system("pause");
    
    }
    
    /*Funktion time*/
    
    void sleep( clock_t wait )
    {
       clock_t goal;
       goal = wait + clock();
       while( goal > clock() );
    
    }
    

    ich hoffe es sind nicht zu viele fehler dabei 😞
    bin gespannt,

    grüsse



  • ich nochmal.

    natürlich muss das untere while(!kbhit()); entfallen-war ein schnipsel.

    mfg



  • Vergleich ==
    Zuweisung =



  • ja stimmt.
    du meinst das bei:if (++durchgang==anzahl)

    durchgang=0;

    oder?
    trotzdem kommen bei mir nur "x" ,jedoch niemals "o".
    und auch immer nur ein zeichen,eigentlich müssten ja soviel zeichen dargestellt werden wie vom benutzer angegeben wurde und nur ein x wandert durch die nullen.
    das ist mein problem.
    danke schon mal



  • Ja, und die anderen Male als du if benutzt hast 😉



  • hmm.
    stimmt auch wieder.
    aber es führt immer noch nicht zum gewünschten aussehen.
    1. jetzt kommt als erstes ein,ich denke mal,ascii zeichen,danach unendlich viele nullen
    und
    2.wird immer nur ein zeichen besetzt,es soll aber wie oben erwähnt aussehen.
    kann es sein das der carriage return zu früh kommt?dann stimmt doch die abfolge der bedingungen irgendwo nicht oder?
    sitze nun schon stunden davor-das muss doch zu lösen sein-bin schon fast verzweifelt darüber.
    habe mittlerweile folgenden code:

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<time.h>
    #include<conio.h>
    
    void sleep(clock_t wait);
    void main(void)
    
    {
    	char  anzahl,durchgang,i,j,ausgabe;
    
    printf ("Dieses Programm gibt ein Lauflicht auf dem Bildschirm aus,bei dem sie die Anzahl der Elemente bestimmen koennen.\n");
    printf ("Bitte geben sie die Anzahl der gewuenschten Zeichen ein:\n");
    
    scanf  ("%c",&anzahl);
    
    durchgang=0;
    while(durchgang<anzahl,!kbhit() )
    {
    
    	for(i=0;i<durchgang;i++)
    	{
    		for (j=0;j<i;j++)
    		if (j==i)
    		{ausgabe='X';}
    		else
    		{ausgabe='O';}
    	}
    
    	++durchgang;
    
    if (++durchgang==anzahl)
    
    	durchgang=0;	
    printf ("%c\r",ausgabe);
    
    sleep( (clock_t)1 * CLOCKS_PER_SEC ); /*angabe der wartezeit-hier könnte auch "sleep(500);"stehen*/
    }
    
    //system("pause");
    
    }
    
    /*Funktion time*/
    
    void sleep( clock_t wait )
    {
       clock_t goal;
       goal = wait + clock();
       while( goal > clock() );
    
    }
    


  • So hab grad keine Lust auf C, deshalb mal was anderes 🙂

    Ich hoffe es hilft dir trotzdem, ansonsten frag einfach nach!

    Python - Pseudocode that actually runs:

    durchgang = 0
    anzahl = 5
    
    while durchgang < anzahl:
    	for position in range(anzahl):
    		if position == durchgang:
    			print 'X',
    		else:
    			print 'O',
    
    	print "\r",
    	durchgang += 1
    

    Sollte eigentlich alles klar sein, außer vlt "for position in range(anzahl)"
    ist aber nur wichtig für dich zu wissen, dass es das Gleiche wie
    "for(position=0; position < anzahl; position++)" wäre!

    lg icepacker



  • wahrscheinlich bin ich zu blöd dazu.
    ich raffs nicht wo der fehler steckt.
    pythoncode hilft mir auch nit weiter-kappier ja das c noch nit mal.
    muss wohl warten bis jemand lust auf c hat 🙂



  • #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<time.h>
    #include<conio.h>
    
    void sleep(clock_t wait);
    
    void main(void)
    {
        char anzahl,durchgang,i,j,ausgabe;
    
        printf("Dieses Programm gibt ein Lauflicht auf dem Bildschirm aus,bei dem sie die Anzahl der Elemente bestimmen koennen.\n");
        printf("Bitte geben sie die Anzahl der gewuenschten Zeichen ein:\n");
    
        scanf("%c", &anzahl);
    
        durchgang = 0;
        while(durchgang < anzahl, !kbhit()) [b]// was hat das komma da verloren? beispiel: int foo=3, bar = (foo=9,2,3,4,5,6,7); bar ist jetzt 7, foo=9. machts sinn?[/b]
        {
            for(i=0;i<durchgang;i++)
            {
                for (j=0;j<i;j++) [b]// die for-schleife ist sinnlos, weil "ausgabe" nicht ausgegeben wird[/b]
                    if (j==i)
                        ausgabe='X';
                    else
                        ausgabe='O';
            }
            ++durchgang;
    
            if (++durchgang == anzahl)
                durchgang=0;	
    
            printf("%c\r", ausgabe);
    
            sleep( (clock_t)1 * CLOCKS_PER_SEC ); /*angabe der wartezeit-hier könnte auch "sleep(500);"stehen*/
        }
    
    //system("pause");
    }
    
    /*Funktion time*/
    
    void sleep( clock_t wait )
    {
        clock_t goal;
        goal = wait + clock();
        while( goal > clock() );
    }
    


  • Ich analysier dir das mal 😉

    Ich habs mir auf Papier aufgeschrieben:

    anzahl
    --------|
     XOOOO  |
     OXOOO  |
     OOXOO  | durchgang
     OOOXO  |
     OOOOX  |
    

    Du siehst, die Stelle an der X ist, ist gleich dem Wert der Variablen durchgang;
    durchgang wird jede Zeile um 1 erhöht.

    So zum Code:
    In meinem Code ist die gleiche While-Schleife wie bei deinem C Code.
    Die While Schleife ist dafür zuständig so lange zu laufen bis das X am "Ende" ist,
    weil anzahl gleich benötigte Durchgänge!

    Danach kommt eine For-Schleife, die ist für die jeweils eigenen Zeilen zuständig.
    Jetzt kommt endlich die Überprüfung, ob X oder O ausgegeben werden soll:
    Wie wir auf dem Papier schon festgestellt haben ist Position von X gleich durchgang also:

    if position == durchgang:
                print 'X',
    

    ist dies nicht der Fall wird O ausgegeben 👍

    So ich hoffe ich konnte dir so mehr helfen, als wenn ich dir den C Code geben würde
    und du den einfach nur stumpfsinnig kopierst 🙂



  • oh man...
    also jetzt siehts so aus.
    bin ich auf dem richtigen weg oder stimmt etwas grundsätzliches daran nicht?

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<time.h>
    #include<conio.h>
    
    void sleep(clock_t wait);
    void main()
    
    {
    	int anzahl,durchgang,position;
    	char  ausgabe;
    
    printf ("Dieses Programm gibt ein Lauflicht auf dem Bildschirm aus,bei dem sie die Anzahl der Elemente bestimmen koennen.\n");
    printf ("Bitte geben sie die Anzahl der gewuenschten Zeichen ein:\n");
    
    scanf  ("%d",&anzahl);
    
    durchgang=0;
    while(durchgang<anzahl)
    {
    
    	for(position=0;position<durchgang;position++)
    	{
    
    			if (position==durchgang)
    			{ausgabe='X';}
    			else
    			{ausgabe='O';}
    	}
    
    	printf ("%c\n",ausgabe);
    	sleep( (clock_t)1 * CLOCKS_PER_SEC ); /*angabe der wartezeit-hier könnte auch "sleep(500);"stehen*/
    ++durchgang;
    
    }
    
     	if(++durchgang>anzahl)
    		durchgang=0;
    
    //system("pause");
    
    }
    
    /*Funktion time*/
    
    void sleep( clock_t wait )
    {
       clock_t goal;
       goal = wait + clock();
       while( goal > clock() );
    
    }
    


  • Ja es stimmt etwas Grundsätzliches nicht.

    Deshalb mein Tipp, dass du erstmal das Problem verstehst, zur Not eben mit Papier und Bleistift.

    Deine For-Schleife ist zum Beispiel wieder total daneben, dabei hatte ich die imo
    richtige Version schon geposted 🙄



  • schluchtz jammer



  • theo2 schrieb:

    schluchtz jammer

    Schlaf ne Nacht drüber 😉 👍



  • so mit schlafen war nit viel-ne pause hat auch gereicht 😮

    laut meinem compiler sind jetzt null fehler und der funktionstest entspricht auch den forderungen mit folgendem code:

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<time.h>
    #include<conio.h>
    
    void sleep(clock_t wait);
    void main()
    
    {
    	int anzahl,durchgang,position;
    	char  ausgabe;
    
    printf ("Dieses Programm gibt ein Lauflicht auf dem Bildschirm aus,bei dem sie die Anzahl der Elemente bestimmen koennen.\n");
    
    printf ("Bitte geben sie die Anzahl der gewuenschten Zeichen ein:\n");
    scanf  ("%d",&anzahl);
    
    durchgang=0;
    while(durchgang<anzahl)
    {
    
    	for(position=0;position<anzahl;position++)
    	{
    
    			if (position==durchgang)
    			{ausgabe='X';}
    
    			else
    			{ausgabe='O';}
    
    			printf ("%c",ausgabe);
    
    	}
    printf("\r");
    	sleep( (clock_t)1 * CLOCKS_PER_SEC ); /*angabe der wartezeit-hier könnte auch "sleep(500);"stehen*/
    
    	++durchgang;
    
    	if(durchgang==anzahl&&(!kbhit()))
    	durchgang=0;
    
    }
    
    //system("pause");
    
    }
    
    /*Funktion time*/
    
    void sleep( clock_t wait )
    {
       clock_t goal;
       goal = wait + clock();
       while( goal > clock() );
    
    }
    

    das einzige was mich jetzt noch stört,ist das die abbruchbedingung"kbhit" erst nach ablauf der for schlaife wirksam wird und nicht sofort.
    wie müsste man das anpassen?

    gibts sonst noch irgendwelche erkennbaren mängel?

    achja-danke für die unterstützung und die geduld mit mir. 👍

    gutsnächtle



  • Wenn du erst nach der for()-Schleife auf kbhit() prüfst, kann es natürlich auch erst an der Stelle wirksam werden. Die Schleife müsstest du notfalls per break verlassen:

    while(!kbhit())
    {
      for(pos=0;pos<anzahl;++pos)
      {
        if(kbhit()) break; //bei Tastendruck Schleife beenden
        if(pos=durchgang)
          printf("X");
        else
          printf("o");
      }
      printf("\r");
      sleep(500);
      durchgang=(durchgang+1)%anzahl;
    }
    

    (ich bin mir nicht ganz sicher, wie kbhit() funktioniert - eventuell mußt du bei Tastendruck ein eigenes Abbruch-Flag für die äußere while-Schleife setzen)


Log in to reply