IO実現計算機機能
この実例では、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
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。