CS193P -iOS電卓に浮動小数点ボタンを追加します
-
29-10-2019 - |
質問
私は最近、iTunes Uのスタンフォード大学のiPhone開発に関するオンラインコースをフォローし始めました
私は今、最初の数回の講義のために宿題の割り当てをしようとしています。私は基本的な計算機を構築したウォークスルーを続けましたが、今では最初の課題を試していますが、それを解決することはできません。それは次のとおりです:
計算機はすでに浮動小数点番号で動作します(例:3/4 =を押すと、結果の値が0.75の値を適切に表示します)が、ユーザーが浮動小数点数を入力する方法はありません。これを改善します。合法的な浮動小数点数のみを入力することを許可します(例:「192.168.0.1」は、法的な浮動小数点数ではありません)。
まず第一に、フローティングポイントが次のようにカウントされるかどうかはわかりません digitPressed
また operationPressed
. 。私は呼ばれる新しい方法でも試しました floatingPointPressed
しかし、それは実際にはうまくいきませんでした。誰かがこれに関する指針を提供できますか?
私はそれをdigitpressedと見なしたとき、私はこのようなことを試しました:
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]];
}
しかし、私はここで重要な概念を見逃していると思います。
また、悲しいことに元に戻した別のソリューションを試しました。コードを提供することはできませんが、これはこれでした。 5
そして、フローティングポイントと 3
だから私は終わるでしょう 5.3
. 。その後、私は残りの入力に対して浮動ポイントを「無効」することができました。しかし、私はそれについて少し厳しすぎたと思います。 5.3.2
しかし、操作ボタンを押した後(+
, など)、それでもフローティングポイントボタンを押してはいけません。これに使用したブールをリセットする必要があると思いますか?
ここでは完全に書かれたソリューションを探しているわけではありませんが、誰かがこの問題に取り組む方法について基本的なアドバイスを提供してくれますか?実際にコードソリューションを提供することなく、私がすべきことと考えていることの段階的な概要のある種の段階的な概要。
前もって感謝します。
解決
あなたはどこを見るべきかのヒントが欲しいので、 nsnumberformatter 入力フィールドへ。
これは、ユーザーが自分で入力する各文字を手動でチェックするのではなく、入力を検証する適切な方法です。
編集私はあなたが仕事をしようとしている課題を読んだばかりです。ここでの私の答えは、それでもそれを行う正しい方法であり、課題があなたにやろうとしていることをするための最良の方法ではありません。
ビューに追加され、操作している数に追加されているため、数字を1つずつ読んでいるので、元の答えで正しい軌道に乗っているかもしれません。
- 追加された数字を受け入れ続けてください
- Aを追加します
decimalEntered
フラグ - 「いいえ」に初期化します - 小数が入力されている場合は、フラグをチェックしてください。ノーの場合は、それを受け入れて、フラグをイエスに設定します
- 小数が入力され、フラグがイエスの場合は、それを受け入れないでください。
- オペランドを押すときはいつでも、このフラグをnoに戻します。
もう少し学習すると、これを行う別の方法がフィールドにユーザーを入力させることであることがわかります。フォーマッタをフィールドに接続して、入力が有効な数字であることを検証しますが、文字列を数字に変えることもできます。また、オペランドが押されると、この数はオペランドが動作する数値の1つとして脇に置かれます。
他のヒント
わかった。私はこれを解決しました。頭を包むことができたら、かなり簡単でした。
-(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;
}
}
-(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;
}
}
また、スキャナーを使用してこの問題を解決することもできます。コードはよりシンプルで、ローカライズされていると思います。
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;
}
ねえ、私は機能する簡単な解決策を持っていると思います:)
- (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;
}
}
私は、そのビットで始めた後、小数を処理するための関数を追加することを示唆していることを見ました。操作が押された操作で10進数がリセットされます。そして、それを本当に完了するために、それはおそらくリーディング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;
}
}
nsrangeを使用する必要がないことがわかりました。私のコードは、小数点またはフローティング番号から始まる操作を行うことができます。
-(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;
}
}
上記のコードのいずれかをCS193p 2011 Calculatorで動作させることはできませんでした。これが私が最終的にそれを機能させた方法です。
-(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
これは簡単だと思います。
- (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;
}
}
これは私の最初のソリューションであり、Objective-Cスタイルに見えませんが、機能します...
- (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;
}
}