• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

Wie "holt" man Integer aus einem Array heraus und weist sie einem anderen Integer zu?

IceCake97

Gloster
Registriert
03.05.12
Beiträge
63
Hallo!
Ich habe folgendes Problem:
Ich möchte eine Mathe-App fürs iPhone programmieren, bei der man Aufgaben zu Addition, Subtraktion, Multiplikation und Division machen kann. Dabei bekommt man eine Aufgabe angezeigt (z.B. 5 + 11) und vier Buttons, bei denen auf einem das richtige Ergebnis steht und auf den anderen Dreien falsche Ergebnisse. Für Addition, Subtraktion und Multiplikation konnte ich ganz einfach einen Zufallsgenerator für die Aufgaben und die falschen Ergebnisse benutzen, doch nun bin ich bei der Division angelangt, bei der bei zufälligen Zahlen nur gerundete Ergebnisse rauskommen.
Hierfür habe ich mir überlegt, zwei Arrays zu erstellen und diese mit Werten zu befüllen, z.B.

NSArray zahlenArray1 = [[NSArray alloc]initWithObjects:@"10",@"8",@"4",nil];
NSArray zahlenArray2 = [[NSArray alloc]initWithObjects:@"5",@"2",@"2",nil];


Doch wie lese ich hieraus die Zahlen heraus?
Bisher habe ich es so versucht:

int position1 = 0;
int position2 = 0;

-(IBAction)pressButton:(id)sender
{
position1++;
position2++;
int a = [zahlenArray1 objectAtIndex:position1];
int b = [zahlenArray2 objectAtIndex:position2];
int c = a /b;
}


"a" ud "b" sind jeweils die beiden Aufgabenteile und "c" ist das Ergebnis.
Doch bei "int a" und "int b" zeigt er die Warnung an:
"Incompatible pointer to integer conversion initializing ´int´ with expression of type ´id´"

Wie muss ich es sonst machen?
Wäre nett, wenn ihr mir helfen könnt, denn die App ist nach diesem Schritt fertig :)

Freundliche Grüße,
IceCake
 
Zwei Dinge:

1. Du speicherst die Werte in den Arrays als Strings. Besser:

NSArray zahlenArray1 = [[NSArray alloc]initWithObjects:[NSNumber numberWithInt:2], ... ,nil];

2. Arrays können nur Objekte speichern, int ist ein primitiver Typ. So ist es richtig:

int a = [[zahlenArray1 objectAtIndex:position1] intValue];

So sollte es keine Meldung mehr geben.
 
Du speicherst in dem Array keine Zahlenwerte, sondern NSString-Objekte. Danach werden diese Objekte einer Integer-Zahl zugewiesen, was ebenso falsch ist.

Korrekter wäre (in modernem Objective-C):
Code:
NSArray zahlenArray1 = @[ @10, @8, @4 ];
NSArray zahlenArray2 = @[ @5, @2, @2 ];

Und später:
Code:
NSInteger a = [zahlenArray1[position1] integerValue];
NSInteger b = [zahlenArray2[position2] integerValue];

Das ganze Konzept sollte allerdings überdacht werden. Um das Problem mit den ganzzahligen Divisionen zu lösen, solltest Du das Endergebnis und den Divisor per Zufallszahl auslosen und daraus den Dividenden errechnen. Der Divisor darf natürlich nicht Null sein.
 
OK! Vielen Dank für die schnelle Antwort :D
Jetzt funktioniert es!!!!

Ein kleines Problem habe ich noch:
Wenn alle Aufgaben ausgerechnet sind und man bei der letzten das richtige Ergebnis herausgefunden hat kommt der "SIGABRT"-Fehler ("Thread1: Object received Signal:SIGABRT") und die App stürzt ab. Ich denke, das kommt daher, dass das Programm nun nicht mehr weiß, was es machen soll.
Deswegen möchte ich, wenn alle Aufgaben durchgerechnet sind "position1" und "position2" wieder auf 0 setzen, damit alle Aufgaben von vorne gestartet werden.
Kann ich dies einfach mit

if(position1 > [zahlenArray1 count])
{
position1 = 0;
}


machen?
Mfg :)
 
OK, anscheinend nicht...
Habs gerade probiert und der SIGABRT-Fehler kommt immernoch...:(
Was kann ich stattdessen dagegen tun?
 
Es liegt schon daran, aber man muss das richtig programmieren:

- Zum einen ist "position2" überflüssig und kann durch position1 ersetzt werden.
- Zum anderen muss es heißen

Code:
if(position1 >= [zahlenArray1 count])
     position1 = 0;

position1 sollte außerdem kein "int", sondern ein NSUInteger sein.

Dir ist klar, dass das Programm so immer nur die gleichen drei Divisionen anbietet und diese endlos wiederholt?
 
Ich werde natürlich mehr als nur Drei Zahlen in das Array machen

Das löst das Problem nicht wirklich. Wie oben schon gesagt, solltest Du überhaupt nicht so arbeiten, sondern Endergebnis und Divisor per Zufallszahl auslosen.

Leider kommt der SIGABRT-Fehler immer noch

Dann steht, der if-Befehl wahrscheinlich an der falschen Stelle.
 
Ich habe mehrere Positionen versucht, derFehler kommt immer noch!

Ist nicht böse gemeint, aber ich fürchte, Du verstehst nur einen Teil von dem, was Du programmierst ...

Wenn Du so nicht weiter kommst: Im Debugger solltest Du sehen können, was das Programm machen sollte, als es abgestürzt ist. Daraus sollte man folgern können, wo das Problem liegt.

Wie lose ich den Divisor dann korrekt per Zufallszahl aus?

Du wolltest "c = a / b" rechnen, wobei a und b Zufallszahlen sind und alles ganzzahlig bleiben soll.
Stattdessen rechnest Du einfach "a = b * c", wobei b und c Zufallszahlen sind. Dann gilt automatisch "c = a / b" und alle Zahlen sind ganzzahlig.
 
Sorry, dass ich so blöd nachfrage, aber wie rechne ich jetzt von diesem a = b * c zu c = a/b um?
 
Überhaupt nicht, weil das genau das gleiche ist. Das ist ja der Gag.
 
Er wird es tun. Er wird zufällig durch Null teilen. Ab in den Atombunker.

Und 1 : 5 = 0
 
@U_nix$_@:

Offenbar hast Du leider weder das Problem, noch dessen Lösung verstanden.
 
Hi,

Ich geh lediglich davon aus dass er im weiteren Entwicklungsverlauf auf rand() setzt und dabei im ersten Durchgang vergisst den Divisor vor der Zufallszahl Null zu schützen. Der zweite Kommentar diente der Veranschaulichung einer Problematik.
 
Also bei mir funktioniert alles genau so wie ich es wollte!!
Im übrigen habe ich verhindert, dass der divisor 0 wird!
ich habe z.B.

int b = rand() %10 + 1;

gemacht!