2012-10-14 40 views
1

我正在制作转换器应用程序,并且在意识到要输入大约200行代码以使其转换超过5个单位后,我应该有一个更好的转换计算。改进计算代码

我目前有什么是一个ifelse,找出我从车轮中选择的单位,蜇找出它应该回答什么,并计算一个浮点数。它看起来像这样ATM:

#import "MainViewController.h" 
@interface MainViewController() 

@end 

@implementation MainViewController; 

@synthesize _convertFrom, _convertTo, _convertRates; 
@synthesize inputText, picker, resultLabel; 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    { 
     [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
     _convertFrom = @[@"MTPA", @"MMcf/day", 
     @"Mill.Sm3/day", @"MMBTU", @"Boe/day"]; 

     _convertRates = @[ @1.0f, @2.0f, @3.0f, 
     @4.0f, @5.0f]; 

     _convertTo = @[@"MTPA", @"MMcf/day", 
     @"Mill.Sm3/day", @"MMBTU", @"Boe/day"]; 

    _convertRates = @[ @1.0f, @2.0f, @3.0f, 
    @4.0f, @5.0f]; 
} 
} 
- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
//dont forget to put something in here later 
} 


-(IBAction)textFieldReturn:(id)sender 
{ 
    [sender resignFirstResponder]; 
} 
-(IBAction)backgroundTouched:(id)sender 
{ 
    [inputText resignFirstResponder]; 
} 


#pragma mark - 
#pragma mark PickerView DataSource 

- (NSInteger)numberOfComponentsInPickerView: 
(UIPickerView *)pickerView 
{ 
    return 2; 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component 
{ 
    if (component == 0) { 
     return [_convertFrom count]; 
    } 
    return [_convertTo count]; 
} 


- (NSString *) pickerView: (UIPickerView *)pickerView 
      titleForRow:(NSInteger)row 
     forComponent:(NSInteger)component 
{ 
    if (component == 0) { 
     return [_convertFrom objectAtIndex:row]; 
    } 
    return [_convertTo objectAtIndex:row]; 
} 




#pragma mark - 
#pragma mark PickerView Delegate 
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row 
    inComponent:(NSInteger)component 
{ 
    float convertFrom = [[_convertRates objectAtIndex:[pickerView selectedRowInComponent:0]] floatValue]; 
    float convertTo = [[_convertRates objectAtIndex:[pickerView selectedRowInComponent:1]] floatValue]; 
    float input = [inputText.text floatValue]; 
float to = convertTo; 
float from = convertFrom; 
float convertValue = input; 

float MTPATilMTPAFloat    = convertValue * 1; 
float MTPATilMMScfdayFloat   = convertValue * 133.425; 
float MTPATilMillSm3dayFloat   = convertValue * 3.779735; 
float MTPATilMMBTUFloat    = convertValue * 4; 
float MTPATilboedayFloat    = convertValue * 5; 

float MMScfdayTilMTPAFloat   = convertValue * 0.5; 
float MMScfdayTilMMScfdayFloat  = convertValue * 1; 
float MMScfdayTilMillSm3dayFloat  = convertValue * 6; 
float MMScfdayTilMMBTUFloat   = convertValue * 7; 
float MMScfdayTilboedayFloat   = convertValue * 8; 

float MillSm3dayTilMTPAFloat = convertValue/1; 
float MillSm3dayTilMMScfdayFloat = convertValue/2; 
float MillSm3dayTilMillSm3dayFloat = convertValue/3; 
float MillSm3dayTilMMBTUFloat = convertValue/4; 
float MillSm3dayTilboedayFloat = convertValue/5; 

float MMBTUTilMTPAFloat = convertValue * 2; 
float MMBTUTilMMScfdayFloat = convertValue * 2; 
float MMBTUTilMillSm3dayFloat = convertValue * 2; 
float MMBTUTilMMBTUFloat = convertValue * 2; 
float MMBTUTilboeday = convertValue * 2; 

float boedayTilMTPAFloat = convertValue * 3; 
float boedayTilMMScfdayFloat = convertValue * 3; 
float boedayTilMillSm3dayFloat = convertValue * 3; 
float boedayTilMMBTUFloat = convertValue * 3; 
float boedayTilboeday = convertValue * 3; 





NSString *MTPATilMTPA = [[NSString alloc ] initWithFormat: 
         @" %f MTPA = %f MTPA", convertValue, MTPATilMTPAFloat]; 

NSString *MTPATilMMScfday = [[NSString alloc ] initWithFormat: 
          @" %f MTPA = %f MMScf/day", convertValue, MTPATilMMScfdayFloat]; 

NSString *MTPATilMillSm3day = [[NSString alloc] initWithFormat: 
           @" %f MTPA = %f Mill.SM3/day", convertValue, MTPATilMillSm3dayFloat]; 

NSString *MTPATilMMBTU = [[NSString alloc] initWithFormat: 
          @" %f MTPA = %f MMBTU", convertValue, MTPATilMMBTUFloat]; 

NSString *MTPATilboeday = [[NSString alloc] initWithFormat: 
         @" %f MTPA = %f Boe/day", convertValue, MTPATilboedayFloat]; 




NSString *MMScfdayTilMTPA = [[NSString alloc] initWithFormat: 
          @" %f MMScfday = %f MTPA", convertValue, MMScfdayTilMTPAFloat]; 

NSString *MMScfdayTilMMScfday = [[NSString alloc] initWithFormat: 
           @" %f MMScfday = %f MMScfday", convertValue, MMScfdayTilMMScfdayFloat]; 

NSString *MMScfdayTilMillSm3day = [[NSString alloc] initWithFormat: 
            @" %f MMScfday = %f MillSm3day", convertValue, MMScfdayTilMillSm3dayFloat]; 

NSString *MMScfdayTilMMBTU = [[NSString alloc] initWithFormat: 
           @" %f MMScfday = %f MMBTU", convertValue, MMScfdayTilMMBTUFloat]; 

NSString *MMScfdayTilboeday = [[NSString alloc] initWithFormat: 
          @" %f MMScfday = %f Boe/day", convertValue, MMScfdayTilboedayFloat]; 




NSString *MillSm3dayTilMTPA = [[NSString alloc] initWithFormat: 
           @" %f MillSm3day = %f MTPA", convertValue, MillSm3dayTilMTPAFloat]; 



if (from == 1) { 
    if (to == 1) { 
     resultLabel.text = MTPATilMTPA; 
    } 
    else if (to == 2) { 
     resultLabel.text = MTPATilMMScfday; 
    } 
    else if (to == 3) { 
     resultLabel.text = MTPATilMillSm3day; 
    } 
    else if (to == 4) { 
     resultLabel.text = MTPATilMMBTU; 
    } 
    else if (to == 5) { 
     resultLabel.text = MTPATilboeday; 
    } 
} 
else if (from == 2) { 
    if (to == 1) { 
     resultLabel.text = MMScfdayTilMTPA; 
    } 
    else if (to == 2) { 
     resultLabel.text = MMScfdayTilMMScfday; 
    } 
    else if (to == 3) { 
     resultLabel.text = MMScfdayTilMillSm3day; 
    } 
    else if (to == 4) { 
     resultLabel.text = MMScfdayTilMMBTU; 
    } 
    else if (to == 5) { 
     resultLabel.text = MMScfdayTilboeday; 
    } 
} 
} 

正如你所看到的,用的需要,如果我想更多的单位更多的代码,很多一个巨大的混乱。

当我意识到这一点,我试图通过使用commmon变量来计算它,我把所有东西都转换成了,然后再转换回输出单元。用长计算来思考它。我希望一切都被转换为第一个常见变量是米。所以1米= 1,1厘米= 0.01和1毫米= 0.001。所以,如果我想计算,我会用。

unitIwantToConvertToComparedTo1Meter = 0.5(1米) result = from * to * input * unitIwantToConvertToComparedTo1Meter。

其中,令人惊讶的是,工程。 这里所用:

#import "MainViewController.h" 
@interface MainViewController() 

@end 

@implementation MainViewController; 

@synthesize _convertFrom, _convertTo, _convertRates; 
@synthesize inputText, picker, resultLabel; 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    { 
     [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
     _convertFrom = @[@"Kubikk M", @"Kubikk CM", 
     @"Kubikk MM", @"MMBTU", @"Boe/day"]; 

     _convertRates = @[ @1.0f, @0.01f, @0.001f, 
     @4.0f, @5.0f]; 

    _convertTo = @[@"Kubikk M", @"Kubikk CM", 
    @"Kubikk MM", @"MMBTU", @"Boe/day"]; 

    _convertRates = @[ @1.0f, @0.01f, @0.001f, 
    @4.0f, @5.0f]; 
} 
} 
- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
//dont forget to put something in here later 
} 


    -(IBAction)textFieldReturn:(id)sender 
    { 
    [sender resignFirstResponder]; 
} 
-(IBAction)backgroundTouched:(id)sender 
{ 
    [inputText resignFirstResponder]; 
} 


#pragma mark - 
#pragma mark PickerView DataSource 

- (NSInteger)numberOfComponentsInPickerView: 
(UIPickerView *)pickerView 
{ 
    return 2; 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
if (component == 0) { 
    return [_convertFrom count]; 
} 
return [_convertTo count]; 
} 


- (NSString *) pickerView: (UIPickerView *)pickerView 
      titleForRow:(NSInteger)row 
     forComponent:(NSInteger)component 
{ 
    if (component == 0) { 
     return [_convertFrom objectAtIndex:row]; 
    } 
    return [_convertTo objectAtIndex:row]; 
} 




#pragma mark - 
#pragma mark PickerView Delegate 
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row 
    inComponent:(NSInteger)component 
{ 
    float convertFrom = [[_convertRates objectAtIndex:[pickerView selectedRowInComponent:0]] floatValue]; 
float convertTo = [[_convertRates objectAtIndex:[pickerView selectedRowInComponent:1]] floatValue]; 
float input = [inputText.text floatValue]; 
float to = convertTo; 
float from = convertFrom; 
float convertValue = input; 

float kubikkfot = 0.1; 

float result = from * convertValue * kubikkfot; 



NSString *resultString = [[NSString alloc ] initWithFormat: 
         @" %f MTPA = %f MTPA", convertValue, result]; 
resultLabel.text = resultString; 
} 

的问题,这是 1.我的大脑是有一个危机,试图找出如何 2.我想有一个自定义标签每一个答案,在那里说什么我从单位转换而来。我怎样才能实现这个?

那么,谁能给我一个更好的计算代码?

+0

这可能更好在http://codereview.stackexchange.com/ – Abizern

+0

这两个代码示例看起来是相同的,除了数组中的实际值。 – David

+0

大卫看起来更进一步:) Abizern K thx –

回答

2

Dude使用C数组创建一个nxn转换矩阵。然后只需要一个单元名称的数组。完成并完成。如果你不知道矩阵是什么,那么你有更多的理论学习。

它是这样的。 C为转换矩阵:

 inch  meter 
     +----------------- 
inch | 1  0.0254 
meter | 39.3701 1 

所以,如果x是英寸然后C[inch][meter] * x是以米为单位的长度相同。

C[i][j] * C[j][i] == 1。总是。

对于每个要测量的数量,您将拥有不同的转换矩阵。也就是说,你将有一个用于加热,一个用于时间,一个用于距离(上面的例子),一个用于能量,一个用于力量等等。祝你好运!

+0

谢谢,我明白如何做一个,但我怎么能实现它,并在我的项目中使用它? –