2016-09-20 2 views
-1

Я работаю над программой, определяющей тип тора, объем этого тора, площадь поверхности и стоимость его изготовления/покраску на основе двух входных радиусов: rmajor и rminor. Единственная сложная часть - я не могу использовать логические операторы или операторы сравнения. Я могу определить площадь поверхности, объем и затраты, связанные с тором, но я не могу определить код производства (как показано в операциях печати). Соответствующие коды Производство заключаются в следующем:Как печатать 2 символа в C без использования логических операторов?

  1. Ri: кольцо тор (rmajor> rminor)
  2. Нп: рог тор (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

Ваш код вычисляет factor1 и factor2 неправильно: они остаются 1, когда значения равны, в то время как умножение в вычислении char1 и char2 предполагает, что именно один из factor1, factor2 и factor3 должны быть 1, а остальные должны равна нулю.

Вы можете решить эту проблему путем умножения factor1 и factor2 на (factor3+1)%2:

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

Вы можете конвертировать factor1 и factor2 в единый индекс в диапазоне от 0 до 2 следующим образом:

int mfindex = 2 * factor1 + factor2 - 1; 

Тогда это просто вопрос того, чтобы искать код для производства с использованием индекса.

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

    printf("Manufacturing Code: %.2s\n ", mfcode[mfindex]); 
Смежные вопросы