Objective C - Countdown

09/11/2014 12:49 Evese#1
Hallo zusammen,
habe vor 2 Tagen angefangen Objective-C zu lernen. Habe mir ein dickes Buch mit 1800 Seiten gekauft und schaue mir viele Videos an um mich in die Materie zu arbeiten.

Heute bzw. gerade hab ich meine erste eigene Sache allein geschrieben. Einen Countdown der in der Konsole ausgegeben wird (also in der Konsole von XCode). Ich hätte gerne das ein "Profi" mal drüber schaut und sagt ich was verbessern könnte oder ob ein formeller Fehler besteht. Wenn ich es lerne, dann schon richtig.

Dient natürlich auch als Vorlage für jemanden der es braucht :D

Eine Frage hätte ich auch: Ich weiß zwar dass ich hier void benutzen muss um die Funktion zu erstellen aber so richtig verstanden habe ich es noch nicht. Ich weiß das void nichts zurück gibt. Aber kann mir das jemand nochmal genauer erkläre wann ich void benutzte und welche alternativen es zu void gibt?

Hier der Code:



:handsdown:
09/11/2014 13:08 Elektrochemie#2
Abgesehen davon dass sleep() in ms und nicht s ist und die variable zahl nicht definiert ist:

Code:
void countdown(unsigned int zahl)
{
	for(unsigned int i = zahl; i > 0; i--)
	{
		printf("Es dauert noch %d Sekunden\n", i);
		sleep(1000);
	}

	printf("Fertig\n!");
}
Würde mich hüten die Funktion aus der Funktion nochmals aufzurufen.
09/11/2014 14:17 snow#3
Das ist C, kein Objective-C. Da Objective-C direkt auf C aufbaut, ist das allerdings nicht so schlimm und der Objective-C Part kommt garantiert noch in deinem Buch vor. :)

Wichtig wäre, dass du verstehst, dass du dort eine Funktion rekursiv aufrufst und dass du dann unbedingt eine Abbruchbedingung hast.

Rückgabetypen können alle Datentypen, wie z.B. int, double, NSString oder auch selbst erstellte Klassen sein, aber eben auch void, das, wie von dir bereits bemerkt, nichts zurückgibt.

Quote:
PS: gehört Obj-C in dieses Forum?
Ja
09/12/2014 17:16 Evese#4
Hast recht snow. Hab mal mit meinen Kenntnissen einen Code in Objective-C geschrieben und den Code oben umgeändert.


lg
09/12/2014 17:34 .StarSplash#5
Code:
#import <Foundation/Foundation.h>
#import <stdlib.h>

 int main()
{
    int x;
    for (x = 10; x >= 2; x--) {
        sleep(1);
        NSLog(@"%d Sekunden",x);
        }
       
    for (x = 1; x >= 1; x--) {
        sleep(1);
        NSLog(@"%d Sekunde",x);
    
        if (x == 1) {
            NSLog(@"Bumm!");
        }
    }
}
Du wartest immer noch Millisekunden ab, 1000 MS sind eine Sekunde, entsprechend wartet sleep(1000) eine Sekunde, das ist wohl eher, was du haben möchtest.

Dann solltest du vielleicht mal erklären, was du mit deinen For-Schleifen erreichen möchtest, funktionieren tut das nämlich nicht sinnvoll.

PS: Ordentliche Klammersetzung und sinnvolle Einrückung sind das A und O in jeder Programmiersprache.
09/12/2014 18:08 info.student#6
Alternativ kannst du auch usleep() benutzen. Da kannst du dann soweit ich weiß die Zeit in Sekunden angeben. Weitere Informationen kanns du dir unter "man 3 usleep" ansehen. Einfach mal in die Konsolo tippen :)
09/14/2014 15:14 Evese#7
Also mit der ersten for Funktion soll er die restlichen Sekunden angeben also 10 - 2. und mit der zweiten for Funktion soll er wenn die letzte Sekunde halt als Sekunde ausgeben und nicht Sekunden.

Quote:
Du wartest immer noch Millisekunden ab, 1000 MS sind eine Sekunde, entsprechend wartet sleep(1000) eine Sekunde, das ist wohl eher, was du haben möchtest.

Dann solltest du vielleicht mal erklären, was du mit deinen For-Schleifen erreichen möchtest, funktionieren tut das nämlich nicht sinnvoll.

PS: Ordentliche Klammersetzung und sinnvolle Einrückung sind das A und O in jeder Programmiersprache.
Sag mir lieber wie ich es besser machen könnte anstatt mich anzufahren, ich bin ja noch am lernen also geh nicht davon aus dass ich das alles perfekt schreiben kann. Immer die Subjektivität beachten...

g
09/14/2014 17:27 YatoDev#8
Quote:
Originally Posted by Evese View Post
Also mit der ersten for Funktion soll er die restlichen Sekunden angeben also 10 - 2. und mit der zweiten for Funktion soll er wenn die letzte Sekunde halt als Sekunde ausgeben und nicht Sekunden.



Sag mir lieber wie ich es besser machen könnte anstatt mich anzufahren, ich bin ja noch am lernen also geh nicht davon aus dass ich das alles perfekt schreiben kann. Immer die Subjektivität beachten...
Man kann unnötige schleifen in schleifen vermeiden. man schreibt meistens einfach sekunde(n)

die { } klammern setze ich immer so wie bei Elektrochemie's post. ist aber egal wie man es macht.

int x würde ich in der for schleife deklarieren und als byte. es steht immerhin fest das der wert zwischen 0 und 10 ist.

sleep() sollte wahrscheinlich ms verlangen. 1 sek = 1000 ms.
09/15/2014 10:17 ƬheGame#9
Quote:
Originally Posted by Evese View Post
Also mit der ersten for Funktion soll er die restlichen Sekunden angeben also 10 - 2. und mit der zweiten for Funktion soll er wenn die letzte Sekunde halt als Sekunde ausgeben und nicht Sekunden.



Sag mir lieber wie ich es besser machen könnte anstatt mich anzufahren, ich bin ja noch am lernen also geh nicht davon aus dass ich das alles perfekt schreiben kann. Immer die Subjektivität beachten...

g
Er fährt dich nicht an, er fragt lediglich was du denkst das deine For-schleife macht weil sie wird nichts machen. x=1 solange x <= 1 mach schleife und zähle 1 runter. Was denkst du wie oft die for-schleife ausgeführt wird? Er kann dir gar nicht sagen wie du es richtig machen müsstest weil er nicht weis was du mit der schleife machen möchtest (bin mir ziemlich sicher, dass du nicht das machen willst, dass du da programmiert hast.
09/15/2014 21:03 YatoDev#10
Quote:
Originally Posted by ƬheGame View Post
....
er weis genau was er machen will. les nochmal seinen source. die frage was die for schleife bringt war sinnlos da es im quelltext steht
09/15/2014 21:40 ƬheGame#11
Quote:
Originally Posted by »FlutterShy™ View Post
er weis genau was er machen will. les nochmal seinen source. die frage was die for schleife bringt war sinnlos da es im quelltext steht
Die For schleife wird in keinem möglichen Szenario auch nur 1 mal ausgeführt so wie es da steht ^^ X = 1 solange X <= 1 (was es nicht ist das er x eine eins zugewiesen hat) mache forschleife und zähle x eins runter.
09/15/2014 21:46 .StarSplash#12
Wieso?
x ist doch ein mal >= 1, dann wird sein Code ausgeführt und anschließend x dekrementiert, womit die Bedienung nicht mehr erfüllt ist.

PS: @TE: Ich habe dich doch nicht angefahren, ich wollte dich bloß dazu bewegen, dass du dir noch einmal vor Augen führst, was deine Schleifen machen. Ich hatte eigentlich erwartet, dass du dann auf den Irrsinn deiner Schleife stößt, denn für eine Operation, die nur ein einziges mal ausgeführt wird, brauchst du sie nicht.

Zähle einfach mittels einer For-Schleife von 10 bis 2 runter, und den restlichen Code führst du direkt aus.

Also so:

Code:
#import <Foundation/Foundation.h>
#import <stdlib.h>

 int main()
{
    for (int x = 10; x >= 2; x--) {
        sleep(1000);
        NSLog(@"%d Sekunden",x);
    }
    
    sleep(1000);
    NSLog(@"1 Sekunde");
    sleep(1000);
    NSLog(@"Bumm!");
}
So zählst du von 10 bis 2, dann wartest du eine Sekunde, gibst 1 aus, wartest erneut eine Sekunde und gibst Bumm! aus. So kannst du dir eine Schleife und die (unsinnige) If-Abfrage sparen. Und weil du dein x jetzt nur noch ein mal brauchst, kannst du es direkt in die Schleife ziehen und sparst noch mal eine Zeile Code :)
09/15/2014 21:56 ƬheGame#13
Quote:
Originally Posted by .StarSplash View Post
Wieso?
x ist doch ein mal >= 1, dann wird sein Code ausgeführt und anschließend x dekrementiert, womit die Bedienung nicht mehr erfüllt ist.

PS: @TE: Ich habe dich doch nicht angefahren, ich wollte dich bloß dazu bewegen, dass du dir noch einmal vor Augen führst, was deine Schleifen machen. Ich hatte eigentlich erwartet, dass du dann auf den Irrsinn deiner Schleife stößt, denn für eine Operation, die nur ein einziges mal ausgeführt wird, brauchst du sie nicht.

Zähle einfach mittels einer For-Schleife von 10 bis 2 runter, und den restlichen Code führst du direkt aus.

Also so:

Code:
#import <Foundation/Foundation.h>
#import <stdlib.h>

 int main()
{
    int x;
    for (x = 10; x >= 2; x--) {
        sleep(1000);
        NSLog(@"%d Sekunden",x);
    }
    
    sleep(1000);
    NSLog(@"1 Sekunde");
    sleep(1000);
    NSLog(@"Bumm!");
}
So zählst du von 10 bis 2, dann wartest du eine Sekunde, gibst 1 aus, wartest erneut eine Sekunde und gibst Bumm! aus. So kannst du dir eine Schleife und die (unsinnige) If-Abfrage sparen.
Wieso habe ich ein < gelesen wenn da ein > steht?
09/15/2014 21:57 .StarSplash#14
Weil du ganz offensichtlich <>-blind bist :awesome:
09/16/2014 18:50 Evese#15
Okay danke jedenfalls für die Hilfe :)