2016-09-20 20 views
-1

我正在制定一個程序,該程序根據2個輸入半徑rmajor和rminor確定圓環面的類型,圓環體的體積,表面面積和製作成本/繪畫的成本。 唯一複雜的部分是我不能使用邏輯運算符或比較語句。我可以確定與圓環面相關的表面積,體積和成本,但我無法確定製造代碼(如打印報告所示)。相應的製造代碼如下:如何在C中打印2個字符而不使用邏輯操作符?

  1. RI:環圓環(rmajor> rminor)
  2. Hn的:喇叭圓環(rmajor = rminor)
  3. SP:主軸圓環。 (rmajor < rminor)

我該如何正確地將相應的製造代碼打印到每種類型的環面?

這是我的當前代碼:

#include<stdio.h> 
#include<math.h> 
//GLOABAL DECLARATIONS 

#define COST 75.25 
#define PAINT 13.65 

int main() 
{ 
    //LOCAL DECLARATIONS 

    int rmajor; 
    int rminor; 
    int factor1; 
    int factor2; 
    int factor3; 
    char char1; 
    char char2; 
    double area; 
    double volume; 
    double cost; 
    double paint; 

    //EXECUTABLES 

    printf("Please input major radius (meters): "); 
    scanf("%d" , &rmajor); 
    printf("Please input minor radius (meters): "); 
    scanf("%d", &rminor); 
    printf("\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n"); 

    volume = (M_PI * pow(rminor,2)) * (2*M_PI*rmajor); 
    area = (4 * pow(M_PI,2) * rmajor * rminor); 

    factor1 = rmajor/rminor; 
    factor2 = rminor/rmajor; 

    factor1 = (factor1 + 2) % (factor1 + 1); 
    factor2 = (factor2 + 2) % (factor2 + 1); 
    factor3 = (factor1 * rmajor) + (factor2 * rminor); 
    factor3 = factor3/(factor1 + factor2); 

    char1 = (factor1 * ('R' - 'A')) + (factor2 * ('H' - 'A')) + (factor3 * ('S' - 'A')); 
    char2 = (factor1 * ('i' - 'A')) + (factor2 * ('n' - 'A')) + (factor3 * ('p' - 'A')); 
    //printf("\nchar1: %c\n", char1); 
    //printf("char2: %c\n", char2); 

    cost = COST * volume; 
    paint = PAINT * area; 

    printf("Manufacturing Code: %c%c\n ", 'A' + char1, 'A' + char2); 
    printf("Surface Area  : %13.2f\n", area); 
    printf("Volume   : %13.2f\n", volume); 
    printf("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"); 
    printf("Cost of building torus ($): %12.2f\n", cost); 
    printf("Cost of painting torus ($): %12.2f\n", paint); 
    printf("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"); 

    return(0); 
} 

這裏是我的一些示例輸出:

Please input major radius (meters): 10 
Please input minor radius (meters): 5 

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 
Manufacturing Code: ? 
Surface Area  :  1973.92 
Volume   :  4934.80 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
Cost of building torus ($): 371343.87 
Cost of painting torus ($):  26944.02 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
52 lpvinslogin01.itap.purdue.edu ~/CS159/labs/lab03 % a.out 
Please input major radius (meters): 7 
Please input minor radius (meters): 7 

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 
Manufacturing Code: ▒▒ 
Surface Area  :  1934.44 
Volume   :  6770.55 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 
Cost of building torus ($): 509483.78 
Cost of painting torus ($):  26405.14 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 

輸出1被認爲是一個環圓環(RI)和輸出2應該是一個喇叭狀圓環(Hn)。任何幫助表示讚賞,謝謝!

+1

您的代碼使用了很多「魔術」數字和變量,但沒有明確的目的。你應該考慮構建一個更容易遵循的更簡單的例子。我不知道從哪裏開始,當確定這條線意味着什麼時:'char1 =(factor1 *(82-65))+(factor2 *(72-65))+(factor3 *(83-65)); –

+0

爲什麼你需要三個因素來比較兩個數字? – dasblinkenlight

+0

難道你不能分解並使用'if'語句而不是用ASCII字符來玩數學遊戲嗎? – infixed

回答

3

你的代碼計算factor1factor2錯誤:他們留1當值相等,而char1char2計算內乘法暗示的factor1只有一個,factor2factor3必須1,而其餘的必須爲零。

您可以通過(factor3+1)%2乘以factor1factor2解決這個問題:

factor1 = rmajor/rminor; 
factor2 = rminor/rmajor; 

factor1 = (factor1 + 2) % (factor1 + 1); 
factor2 = (factor2 + 2) % (factor2 + 1); 
factor3 = (factor1 * factor2); // rmajor == rminor 
factor1 *= (factor3+1) % 2; // rmajor > rminor 
factor2 *= (factor3+1) % 2; // rmajor < rminor 

char1 = (factor1 * 'R') + (factor2 * 'S') + (factor3 * 'H'); 
char2 = (factor1 * 'i') + (factor2 * 'p') + (factor3 * 'n'); 

printf("Manufacturing Code: %c%c\n ", char1, char2); 

注意,從計算中分解出來'A'可以讓你在一個更簡單的forumla到達。

Demo

+0

謝謝你指出我的邏輯錯誤! 6-8行我在找什麼。非常感謝! –

1

你可以轉換factor1factor2成一個單一的指數取值範圍爲0〜2如下:

int mfindex = 2 * factor1 + factor2 - 1; 

然後,它僅僅是一個使用索引查找製造商代碼問題。

static const char mfcode[3][2] = { "Sp", "Ri", "Hn" }; 

    printf("Manufacturing Code: %.2s\n ", mfcode[mfindex]);