2011-06-18 6 views
7

Niedawno rozpoczął po kursie online na iPhone rozwoju z Uniwersytetu Stanforda w iTunes U.CS193P - Dodanie przycisku pływający punkt do kalkulatora iOS

Staram się robić zadania domowe teraz przez kilka pierwszych wykładów. Poszedłem za przykładem, w którym zbudowałem podstawowy kalkulator, ale teraz próbuję wykonać pierwsze zadanie i nie mogę go rozwiązać. Jest to następująco:

kalkulatora już współpracuje z liczb zmiennoprzecinkowych (np po naciśnięciu 3/4 = będzie pokazywać prawidłowo otrzymaną wartość 0,75), ale nie ma sposobu dla użytkownika wejść liczba zmiennoprzecinkowa. Napraw to. Zezwalaj tylko na wpisywanie liczb zgodnych z numerem zmiennym (np. "192.168.0.1" nie jest prawnym numerem zmiennoprzecinkowym).

Po pierwsze, nie jestem pewien, czy zmienny liczy się jako digitPressed lub operationPressed. Próbowałem nawet z nową metodą o nazwie floatingPointPressed, ale to się nie udało. Czy ktoś mógłby na to wskazywać?

Kiedy zobaczyłem go jako digitPressed, próbowałem coś takiego:

if (hasFloatingPoint) { 
     NSRange range = [[display text] rangeOfString:@"."]; 
     if (range.location == NSNotFound) 
     { 
      [display setText:[[display text] stringByAppendingFormat:digit]]; 
      hasFloatingPoint = YES; 
     } 
    } 
    else { 
     [display setText:[[display text] stringByAppendingFormat:digit]]; 
    } 

Ale tęsknię kluczową koncepcję tutaj, myślę.

Próbowałem też innego rozwiązania, które mam, niestety, cofnięto już, więc nie mogę podać kodu, ale co się stało: Mogłem nacisnąć numer, powiedzmy 5, a następnie zmiennoprzecinkowe i 3, więc chciałbym kończy się na 5.3. Następnie udało mi się "wyłączyć" zmiennoprzecinkowe dla pozostałej części wejścia. Ale myślę, że byłem trochę zbyt surowy: nie mogłem, na przykład, wstawić 5.3.2, ale po naciśnięciu przycisku operacji (+, itp.), nadal nie pozwolił mi nacisnąć przycisk zmiennoprzecinkowy. Chyba powinienem zresetować bool użyłem do tego?

Nie szukam tutaj całkowicie wypisanego rozwiązania, ale czy ktoś może być tak uprzejmy, aby podać kilka podstawowych porad, jak rozwiązać ten problem? Jakiś krok po kroku przegląd tego, co powinienem zrobić i pomyśleć, bez faktycznego dostarczania rozwiązania kodu.

Z góry dziękuję.

Odpowiedz

2

Ponieważ chcesz wskazówkę gdzie szukać, spojrzeć na dołączenie NSNumberFormatter do pól wejściowych.

Jest to właściwy sposób sprawdzania poprawności danych wejściowych, a nie ręczne sprawdzanie każdego znaku wprowadzanego przez użytkownika.

edytuj Właśnie przeczytałem zadanie, które próbujesz wykonać. Myślę, że moja odpowiedź tutaj, choć nadal jest to właściwy sposób, nie jest to najlepszy sposób, aby zrobić to, co zadanie stara się zrobić.

Skoro czytasz cyfr jedna po drugiej, jak są one dodawane do widoku i dołączając je do numeru, który działają na was mogą być na dobrej drodze z oryginalnej odpowiedzi:

  • trzymać akceptując liczby są one dodawane
  • Dodaj decimalEntered flagę - zainicjować go do „nIE”
  • Jeśli dziesiętny jest podana, należy sprawdzić flagę, jeśli nie jest, zaakceptować go i ustawić flagę tAK
  • Jeśli dziesiętny jest wprowadzony, a flaga jest TAK, nie akceptuj i t.
  • Po każdym naciśnięciu operandu ustaw tę flagę z powrotem na NIE.

Gdy dowiesz się czegoś więcej, zobaczysz, że innym sposobem na to jest zezwolenie użytkownikowi na wpisanie pola. Podłącz do pola formatator, aby sprawdzić, czy dane wejście jest prawidłową liczbą, ale może również zamienić ciąg znaków w liczbę. A gdy zostanie naciśnięty operand, liczba ta zostanie pominięta jako jedna z liczb, na których operand będzie działał.

+0

Okies, dziękuję. Sprawdzę to. Może być nieco zaawansowany, odkąd dopiero zaczynam, ale na pewno popatrzę! Dzięki. – cabaret

+1

będziesz często używać formaterów. Poznanie ich teraz może wymagać trochę więcej pracy, ale jest to właściwy sposób robienia tego, co próbujesz zrobić. A jeśli masz napisany kod i to nie działa - wiesz, gdzie przyjść? – Abizern

+0

Dzięki. Przyjąłem tę odpowiedź, ponieważ pomogło mi to lepiej zrozumieć problem niż kod, który napisałem metodą prób i błędów. Zajrzę do formaterów, kiedy przyzwyczaję się do kodu, to trochę mylące atm. – cabaret

5

OK. Rozwiązałem to. Było dość proste, gdy udało mi się owinąć głowę wokół niego:

-(IBAction)digitPressed:(UIButton *)sender 
{ 
    NSString *digit = [[sender titleLabel] text]; 
    NSRange range = [[display text] rangeOfString:@"."]; 
    if (userIsInTheMiddleOfTypingANumber) 
    { 
     if (! ([digit isEqual:@"."] && (range.location != NSNotFound))) { 
      [display setText:[[display text] stringByAppendingFormat:digit]]; 
     } 
    } 
    else 
    { 
     if ([digit isEqual:@"."]) { 
      [display setText: @"0."]; 
     } 
     else { 
      [display setText: digit]; 
     } 

     userIsInTheMiddleOfTypingANumber = YES; 

    } 

} 
1

Twoje urządzenie może również wykorzystywać skanery do rozwiązania tego problemu. Kod jest prostszy i wydaje mi się, że jest również zlokalizowany.

if (userIsInTheMiddleOfTypingANumber) { 

    // Allow floating point numbers to be input. Malformed numbers are replaced by 0 

    NSScanner *scanner = [NSScanner scannerWithString:display.text]; 
    double d; 
    BOOL wellFormedDouble = [scanner scanDouble:&d]; 

    if (wellFormedDouble && [scanner isAtEnd]) { 
     brain.operand=d; 
    } 
    else { 
     brain.operand=0; 
    } 

    userIsInTheMiddleOfTypingANumber = NO; 
} 
1

Hej Myślę, że mam proste rozwiązanie, które działa :)

- (IBAction)digitPressed:(UIButton *)sender 
{ 
    NSString *digit = [[sender titleLabel] text]; 

    NSRange range = [[display text] rangeOfString:@"."]; 
    if (range.location != NSNotFound && [digit isEqual:@"."]) { 
     return; 
    } 

    if (userIsInTheMiddleOfTypingANumber) 
    { 
     [display setText:[[display text] stringByAppendingString:digit]]; 
    } 
    else 
    { 
     [display setText:[digit isEqual:@"."] ? @"0." : digit]; 
     userIsInTheMiddleOfTypingANumber = YES; 
    } 
} 
+0

Wielkie dzięki!Już to wymyśliłem, ale moje rozwiązanie jest rzeczywiście podobne do twojego. Zajęło mi trochę czasu, aby wypracować cały ten pomysł. Dzięki – cabaret

+0

Tak, teraz robię część 2 zadania teraz ... na pewno o wiele trudniej! – superlogical

+0

Próbuję to zrobić, ale jest to trudne :(Czy masz coś przeciwko tweetowaniu w przypadku, gdy mam pytanie? :) – cabaret

1

Wierzę, że to jest prostsze.

- (IBAction)digitPressed:(UIButton *)sender 
{ 
    NSString *digit =[[sender titleLabel] text]; 
    NSRange range =[[display text] rangeOfString:@"."]; 
    if (([digit isEqual:@"."])&&(range.location==NSNotFound)){midtype=YES;} 

    if (midtype){ 
    if (([digit isEqual:@"."])&&(range.location!=NSNotFound))  
     {[display setText:[display text]];} 
    else {[display setText:[[display text]stringByAppendingString:digit]];} 

    } 
    else {[display setText:digit]; 
    midtype =YES; 
} 

} 
1

widziałem, że sugeruje, aby dodać funkcję do obsługi po przecinku zacząłem się na tym kawałku, a zakończył się z tym. flaga dziesiętna jest resetowana podczas naciśnięcia przycisku. i naprawdę go dopełnić, powinien prawdopodobnie również uniemożliwić prowadzenie 0.

if (userIsInTheMiddleOfTypingANumber) { 
    if ([digit isEqual:@"."]) { 
    if (!userIsInTheMiddleOfTypingADecimal) { 
     [display setText:[[display text] stringByAppendingString:digit]]; 
     userIsInTheMiddleOfTypingADecimal = YES; 
    } 
    }else { 

    [display setText:[[display text] stringByAppendingString:digit]]; 
    } 
} 
else//new number 
{ 
    if ([digit isEqual:@"."]) { 
     if (!userIsInTheMiddleOfTypingADecimal) {// this is a superfluous check as if it's a new number it is also not a decimal. 

      [display setText:@"0."]; 
      userIsInTheMiddleOfTypingADecimal = YES; 
      userIsInTheMiddleOfTypingANumber = YES; 
     } 
    }else { 
    [display setText:digit]; 
    userIsInTheMiddleOfTypingANumber = YES; 
    } 
} 
1

Okazało się, że nie muszę używać NSRange. Mój kod może wykonywać operacje zaczynające się od liczby dziesiętnej lub liczby zmiennoprzecinkowej.

-(IBAction)digitPressed:(UIButton *)sender 
{ 
    NSString *digit = [[sender titleLabel] text]; 

    if(userIsInTheMiddleOfTypingANumber) 
    { 
     [display setText:[[display text] stringByAppendingFormat:digit]]; 
    } 
    else 
    { 
     if([digit isEqual:@"."]) //check for the decimal and append to the digits 
      [display setText:@"."]; 
     else 
      [display setText:digit]; 

     userIsInTheMiddleOfTypingANumber = YES; 
    } 
} 
+0

, ale kod musi obsługiwać tylko numery zmiennoprzecinkowe. Więc jeśli chcesz. dwa razy należy wpisać tylko raz. Dlatego powinieneś użyć NSRange. –

1

Nie mogłem uzyskać żadnego z powyższych kodów do pracy z kalkulatorem CS193P Fall 2011. Oto, w jaki sposób udało mi się go uruchomić.

-(IBAction)digitPressed:(UIButton *)sender 
{ // Begin ACTION 

    NSString *digit = sender.currentTitle; 

    if (self.userIsInTheMiddleOfEnteringNumber) 
    { 
     //Check to see if a decimal was entered 
     if ([digit isEqual:@"."]) 
     { 
      //Check to see if a decimal was entered before 
      if (self.decimalEntered) 
       { 
        [self Display]; 
       } 
       else 
        { 
         self.Display.text = [self.Display.text stringByAppendingString: digit]; 
         self.decimalEntered = YES; 
        } 
     } 
     else 
     { 
      self.Display.text = [self.Display.text stringByAppendingString: digit]; 
     } 
    } 
    else 
    { 
     if ([digit isEqual:@"."]) 
     { 
      //First Decimal Entered"; 
      self.Display.text = digit; 
      self.decimalEntered = YES; 
     } 
     else 
     { 
      //First Number Entered"; 
      self.Display.text = digit; 
     } 
     // This tells the Brain that the user is typing  
     self.userIsInTheMiddleOfEnteringNumber = YES; 
    } 

} // End ACTION 
1

To moje pierwsze rozwiązanie i nie wygląda objective-c stylu ale działa ...

- (IBAction)digitPressed:(UIButton *)sender 
{ 
    NSString *digit = [sender currentTitle]; 
    if ([digit isEqualToString:@"."]) { 
     self.numberOfDot ++; 
    } 
    if (self.userIsInTheMiddleOfEnteringANumber){ 
     if (self.numberOfDot < 2) { 
      self.display.text = [self.display.text stringByAppendingString:digit]; 
     } 
     else 
      if (![digit isEqualToString:@"."]) 
       self.display.text = [self.display.text stringByAppendingString:digit]; 
    } 
    else { 
     self.display.text = digit; 
     self.userIsInTheMiddleOfEnteringANumber = YES; 
    } 
} 
2
-(IBAction)floatingPoint:(UIButton *)sender { 

    NSString *digit = sender.currentTitle; 

    NSRange range = [self.display.text rangeOfString:@"."]; 

    if(range.location == NSNotFound){ 

     self.display.text = [self.display.text stringByAppendingString:digit]; 

     self.userIsInTheMiddleOfEnteringANumber = YES; 

    } 

} 
+0

Czy możesz podać małe wyjaśnienie? –

Powiązane problemy