2012-10-16 52 views
3

我回來了我的轉換器應用程序問題。 由於互聯網明確告訴我使用if-else的轉換是不好的,我試圖獲取矩陣的數據。這是我的嘗試;矩陣信息抽取

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; 


int matrix [5] [5] = { 
    {1,2,3,4,5}, 
    {2,4,6,8,10}, 
    {3,6,9,12,15}, 
    {4,8,12,16,20}, 
    {5,10,15,20,25}}; 




NSString *MTPA = [[NSString alloc ] initWithFormat: 
         @" %i %i ", matrix [[%f][%f], from, to]]; 

所以我想這個代碼做的,就是要把單位的價值目前在UIPickerWheel,至於什麼號碼從INT採取協調使用它,後來就放在一個浮動進行計算。這只是一個測試,看看它是否有效。 是不可能使用浮點數作爲矩陣的座標,或者我只是做錯了嗎?

+2

數組和矩陣有* integer *指數,我不明白你爲什麼使用* float *。 - 你上一個語句的語法是完全錯誤的。矩陣的一個元素用'matrix [from] [to]'(其中'from'和'to'是你的情況下0到4範圍內的整數)來訪問。 –

+0

正是我們想要的!你能解釋我們如何做到這一點? –

+0

'_convertRates'似乎已經是每個單元都有轉換因子的數組。爲什麼你需要矩陣呢? –

回答

3

使用矩陣進行單位換算是一種很好的方法。

選擇一個「基本單位」。例如,如果您要轉換長度單位,請選擇米作爲您的基本單位。

創建UnitDefinition結構保存單位和轉換系數的名義將該單位轉換爲基本單位:

typedef struct { 
    unsigned long long toFundamentalUnitNumerator; 
    unsigned long long toFundamentalUnitDenominator; 
    __unsafe_unretained NSString *unitName; 
} UnitDefinition; 

然後創建一個數組保存要支持單位:

static UnitDefinition unitDefinitions[] = { 
    { 1, 1000000, @"micron" }, 
    { 1, 1000, @"millimeter" }, 
    { 1, 100, @"centimeter" }, 
    { 1, 10, @"decimeter" }, 
    { 1, 1, @"meter" }, 
    { 10, 1, @"decameter" }, 
    { 100, 1, @"hectometer" }, 
    { 1000, 1, @"kilometer" }, 
    { 1000000, 1, @"megameter" }, 
    { 254, 10000, @"inch" }, 
    { 9144, 10000, @"yard" }, 
    { 160934, 100, @"mile" } 
}; 

您還需要一個恆定的單位陣列中的號碼:

#define kUnitDefinitionCount (sizeof unitDefinitions/sizeof *unitDefinitions) 

現在,您可以實現UIPickerViewDataSource協議是這樣的:

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

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
    return kUnitDefinitionCount; 
} 

,你可以實現UIPickerViewDelegate協議是這樣的:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    return unitDefinitions[row].unitName; 
} 

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
    [self updateResultView]; 
} 

,並可以實現updateResultView這樣的:

- (void)updateResultView { 
    UnitDefinition *fromUnit = &unitDefinitions[[unitsPicker_ selectedRowInComponent:0]]; 
    UnitDefinition *toUnit = &unitDefinitions[[unitsPicker_ selectedRowInComponent:1]]; 

    double input = inputField_.text.doubleValue; 
    double result = input 
     * fromUnit->toFundamentalUnitNumerator 
     * toUnit->toFundamentalUnitDenominator 
     /fromUnit->toFundamentalUnitDenominator 
     /toUnit->toFundamentalUnitNumerator; 
    resultLabel_.text = [NSString stringWithFormat:@"%.6g", result]; 
}