IO実現計算機機能

9222 ワード

この実例では、IOが計算機の機能を実現する具体的なコードを共有します。参考にしてください。具体的な内容は以下の通りです。

コード:

//
//  ViewController.m
//  Fraction_Calculator
//
//  Created by    on 2021/4/26.
//

#import "ViewController.h"
#import "Calculator.h"
@interface ViewController ()
@property(nonatomic,strong)IBOutlet UILabel *display;
-(void)processDigit:(int) digit;
-(void)processOp:(char)theOp;
-(void)storeFracPart;
//   
-(IBAction)clickDigit:(UIButton*)sender;
//      
-(IBAction) clickPlus;
-(IBAction) clickMinus;
-(IBAction) clickMultiply;
-(IBAction) clickDivde;
//Misc 
-(IBAction) clickOver;
-(IBAction) clickEquals;
-(IBAction) clickClear;
@end
@implementation ViewController
{
    char op;
    int currentNumber;
    BOOL firstOperand,isNumerator;
    Calculator *myCalculator;
    NSMutableString *displayString;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.display.text=@"";
    firstOperand = YES;
    isNumerator = YES;
    displayString = [NSMutableString stringWithCapacity: 40];
    myCalculator = [[Calculator alloc] init];
}
-(void) processDigit:(int) digit{
    currentNumber = currentNumber * 10 + digit;
    [displayString appendString:[NSString stringWithFormat:@"%i",digit]];
    self.display.text = displayString;
}
-(IBAction)clickDigit:(UIButton *)sender{
    int digit = (int)sender.tag;
    [self processDigit:digit];
}
-(void)processOp:(char)theOp{
    NSString * opStr;
    op = theOp;
    switch (theOp) {
        case '+':
            opStr = @" + ";
            break;
        case '-':
            opStr = @" - ";
            break;
        case '*':
            opStr = @" *";
            break;
        case '/':
            opStr = @" / ";
            break;
    }
    [self storeFracPart];
    firstOperand = NO;
    isNumerator = YES;
    [displayString appendString:opStr];
    self.display.text = displayString;
}
-(void) storeFracPart{
    if(firstOperand){
        if(isNumerator){
            myCalculator.operand1.numerator = currentNumber;
            myCalculator.operand1.denominator = 1; //   3 * 4/5 =
        }
        else {
            myCalculator.operand1.denominator = currentNumber;
        }
    }
    else if (isNumerator) {
        myCalculator.operand2.numerator = currentNumber;
        myCalculator.operand2.denominator = 1;
    }else{
        myCalculator.operand1.denominator = currentNumber;
        firstOperand = YES;
    }
    currentNumber = 0;
}
-(IBAction)clickOver{
    [self storeFracPart];
    isNumerator = NO;
    [displayString appendString:@"/"];
    self.display.text = displayString;
}
//     
-(IBAction)clickPlus{
    [self processOp:'+'];
}
- (void)clickMinus{
    [self processOp:'-'];
}
- (void)clickMultiply{
    [self processOp:'*'];
}
- (void)clickDivde{
    [self processOp:'/'];
}
//Misc  
- (void)clickEquals{
    if(firstOperand==NO){
        [self storeFracPart];
        [myCalculator performOperation:op];
        [displayString appendString:@" = "];
        [displayString appendString:[myCalculator.accumulator convertToString]];
        self.display.text = displayString;
        currentNumber = 0;
        isNumerator = YES;
        firstOperand = YES;
        [displayString setString:@""];
    }
}
- (void)clickClear{
    isNumerator = YES;
    firstOperand = YES;
    currentNumber = 0;
    [myCalculator clear];
    [displayString setString:@""];
    self.display.text = displayString;
}
@end

//
//  Calculator.h
//  Fraction_Calculator
//
//  Created by    on 2021/5/9.
//

#import <Foundation/Foundation.h>
#import "Fraction.h"
NS_ASSUME_NONNULL_BEGIN
@interface Calculator : NSObject
@property(nonatomic,strong)Fraction *operand1,*operand2,*accumulator;
-(Fraction *)performOperation:(char)op;
-(void)clear;
@end
NS_ASSUME_NONNULL_END

//
//  Calculator.m
//  Fraction_Calculator
//
//  Created by    on 2021/5/9.
//

#import "Calculator.h"
@implementation Calculator
- (instancetype)init
{
    self = [super init];
    if (self) {
        _operand1 = [[Fraction alloc] init];
        _operand2 = [[Fraction alloc] init];
        _accumulator = [[Fraction alloc] init];
    }
    return self;
}
- (void)clear{
    _accumulator.numerator = 0;
    _accumulator.denominator = 0;
}
- (Fraction *)performOperation:(char)op{
    Fraction *result;
    switch (op) {
        case '+':
            result = [_operand1 add:_operand2];
            break;
        case '-':
            result = [_operand1 subtract:_operand2];
            break;
        case '*':
            result = [_operand1 multiply:_operand2];
            break;
        case '/':
            result = [_operand1 divide:_operand2];
            break;
    }
    _accumulator.numerator = result.numerator;
    _accumulator.denominator = result.denominator;
    return _accumulator;
}
@end

//
//  Fraction.h
//  Fraction_Calculator
//
//  Created by    on 2021/5/9.
//

#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Fraction : NSObject
@property int numerator,denominator;
-(void) print;
-(void) setTo:(int) n over:(int) d;
-(Fraction *) add:(Fraction *)f;
-(Fraction *) subtract:(Fraction *)f;
-(Fraction *) multiply:(Fraction *)f;
-(Fraction *) divide:(Fraction *)f;
-(void)reduce;
-(double)convertToNum;
-(NSString*)convertToString;
@end
NS_ASSUME_NONNULL_END

//
//  Fraction.m
//  Fraction_Calculator
//
//  Created by    on 2021/5/9.
//

#import "Fraction.h"

@implementation Fraction
- (void)setTo:(int)n over:(int)d{
    self.numerator = n;
    _denominator = d;
}
- (void)print{
    NSLog(@"%i/%i",_numerator,_denominator);
}
- (double)convertToNum{
    if(_denominator!=0)
        return (double) _numerator / _denominator;
    else
        return NAN;
}
- (NSString *)convertToString{
    if(_numerator==_denominator)
        if(_numerator==0)
            return @"0";
        else
            return @"1";
    else if (_denominator==1)
        return [NSString stringWithFormat:@"%i",_numerator];
    else
        return [NSString stringWithFormat:@"%i/%i",_numerator,_denominator];
}
//             
- (Fraction *)add:(Fraction *)f{
    //       
    Fraction *result = [[Fraction alloc] init];
    result.numerator = _numerator *f.denominator + _denominator * f.numerator;
    result.denominator = _denominator*f.denominator;
    [result reduce];
    return result;
}
- (Fraction *)subtract:(Fraction *)f{
    Fraction *result = [[Fraction alloc] init];
    result.numerator = _numerator*f.denominator - _denominator*f.numerator;
    result.denominator = _denominator*f.denominator;
    [result reduce];
    return result;
}
- (Fraction *)multiply:(Fraction *)f{
    Fraction *result = [[Fraction alloc] init];
    result.numerator = _numerator*f.numerator;
    result.denominator = _denominator *f.denominator;
    [result reduce];
    return result;
}
- (Fraction *)divide:(Fraction *)f{
    Fraction *result = [[Fraction alloc] init];
    result.numerator = _numerator*f.denominator;
    result.denominator = _denominator *f.numerator;
    [result reduce];
    return result;
}
- (void)reduce{
    int u = _numerator;
    int v = _denominator;
    int temp;
    if(u==0)
        return;
    else if (u<0)
        u = -u;
    while(v!=0){
        temp = u%v;
        u=v;
        v=temp;
    }
    _numerator/=u;
    _denominator/=u;
}
@end
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。