2012-11-27 70 views
2
if(gene1A[20] == 'T' || gene2A[20] == 'T') 
    outFile << "Person A is of 'Anemic' type." << endl; 
else if(gene1A[20] == 'T' && gene2A[20] == 'T') 
    outFile << "Person A if of 'Carrier' type." << endl; 
else 
    outFile << "Person A is of 'Normal' type." << endl; 

if(gene1B[20] == 'T' || gene2B[20] == 'T') 
    outFile << "Person B is of 'Anemic' type." << endl; 
else if(gene1B[20] == 'T' && gene2B[20] == 'T') 
    outFile << "Person B if of 'Carrier' type." << endl; 
else 
    outFile << "Person B is of 'Normal' type." << endl; 

if(gene1C[20] == 'T' || gene2C[20] == 'T') 
    outFile << "Person C is of 'Anemic' type." << endl; 
else if(gene1C[20] == 'T' && gene2C[20] == 'T') 
    outFile << "Person C if of 'Carrier' type." << endl; 
else 
    outFile << "Person C is of 'Normal' type." << endl; 

if(gene1D[20] == 'T' || gene2D[20] == 'T') 
    outFile << "Person D is of 'Anemic' type." << endl; 
else if(gene1A[20] == 'T' && gene2A[20] == 'T') 
    outFile << "Person D if of 'Carrier' type." << endl; 
else 
    outFile << "Person D is of 'Normal' type." << endl; 

是我現在的代碼。我需要做的是根據我設置的數組輸出「outFile」,如果Person是貧血,Carrier或正常人。每個數組長度爲444個字符,可以是A,C,T或O.如果T位於gene1 []和/或gene2 []的第20位,那麼該人就是貧血(如果只有一個數組)或一個載體(如果在兩個陣列中)。在C++的if語句中使用數組中的特定值

我現在擁有的東西會自動變成「正常」。我相信我的if語句沒有正確設置,但我需要的是引用數組中的第20個值,然後如果它=='T',輸出它們的「類型」。

注:我注意到在我的代碼中,我放了20個而不是19個。我做了那個修正,所以只是看看過去。

謝謝你們!

+1

它看起來對我來說,它應該工作... – BenjiWiebe

+0

爲什麼不只是修復代碼說19而不是放棄免責聲明?這需要花費相當長的時間。 –

+1

那麼,你應該在'else if(||)'之前執行'if(&&)'。 – irrelephant

回答

1

(這還不是很一個答案,但它是很難表達的意見,並將得到簡化可能導致你走向一個答案反正...)

功能分解是你的朋友:

const char* type(const char* gene1, const char* gene2) { 
    return gene1[19] != 'T' ? "Normal" : gene2[19] == 'T' ? "Anemic" : "Carrier"; 
} 
⋮ 
outFile << "Person A is of '" << type(gene1A, gene2A) << "' type." << endl; 
outFile << "Person B is of '" << type(gene1B, gene2B) << "' type." << endl; 
outFile << "Person C is of '" << type(gene1C, gene2C) << "' type." << endl; 
outFile << "Person D is of '" << type(gene1D, gene2D) << "' type." << endl; 

它也使得像你介紹的人D更難以引入的錯誤和更容易發現,當你這樣做。

編輯: @MarkB指出我的邏輯錯誤(我誤解了原來的邏輯)。不幸的是,我不知道如何解決它,因爲原來的邏輯的形式爲:

 if A or B then X 
else if A and B then Y 
else     Z 

由於(A或B)爲真時(A和B)爲真,第二句話永遠觸發器,這幾乎肯定不是你的意圖。如果你的意思是先有AND子句,那麼type()功能可以改寫這樣:

const char* type(const char* gene1, const char* gene2) { 
    bool t1 = gene1[19] == 'T'; 
    bool t2 = gene2[19] == 'T'; 
    return t1 && t2 ? "Anemic" : t1 || t2 ? "Carrier" : "Normal" ); 
} 

順便說一句,這個功能不會是一個「子功能」(知道是什麼意思)當前代碼,它只是一個在函數上面聲明的自由函數。 OTOH,如果你的編譯器支持C++ 11 lambda表達式,你可以在本地的事實聲明type()功能的功能問題:

auto type = [](const char* gene1, const char* gene2) -> const char * { 
    … 
}; 
+1

....是那種Marcelo的子功能嗎? 我剛剛完成我的CS 110課程,所以我的理解是有限的,但對我來說,這看起來像一個子函數,可能會使我的代碼小得多。只是試圖瞭解它是如何工作的 –

+0

這只是一個功能,簡短而親切。您不能在C或C++中使用「子功能」。當你多次發現自己在做同樣的事情時,你應該自己想一想「這應該是一個單獨的功能嗎?」 –

+1

不幸的是,當gene1 [19]!='T'和gene2 [19] =='T'時,這不會產生正確的結果:它會打印正常而不是貧血。 –