использование логических выражений вместо if / else или аналогичных условий - PullRequest
1 голос
/ 10 апреля 2019

Мне нужно использовать логические выражения вместо таких терминов, как: c: b? А, переключи, еще ... если. и использование for / while-do / while как будто также не разрешено.

У меня вопрос при получении имени, исходя из его значения, мы решаем, что печатать. Например, если имя короче 6 букв, мы печатаем «игрок А отправлен», если сумма букв (в значениях ascii) больше 20, мы отправляем игрока Б и все в таком духе. Кроме того, если мы можем отправить более одного игрока, мы решим отправить крупнейшего лексикографического игрока (playerC

я пытался сделать что-то вроде этого

  bool sum = AsciiSum(name)>=20;
  bool len = NameLength(name)<6;
...

так что остальное должно быть

if(sum) 
  printf("%c\n" ,'playerA');
else if (len) 
  printf("%c\n" ,'playerB');
else 
  printf("%c\n" ,'no player was sent');

Но, как я уже сказал, я не могу использовать условия if и else или аналогичные. Буду благодарен за любую помощь в этой последней части.

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Один из способов сделать это - перенаправить ввод через пользовательскую функцию печати, которая возвращает логическое значение. То есть, вы можете просто использовать оператор AND (&&) для его вызова.

Пример кода:

bool printMessage(char* string)
{
    printf("%s", string);
    return true;
}

bool sum = AsciiSum(name)>=20 && printMessage("playerA");
bool len = NameLength(name)<6 && printMessage("playerB");
// ... etc

Почему это работает? Оператор AND позволяет проверять следующее условие, только если первое было истинным. Поскольку ваше условие состоит в том, что сумма должна быть истинной, чтобы напечатать сообщение, это способ вызова метода для печати без непосредственного использования каких-либо операторов if / else

Редактировать: еще лучший способ, предложенный Джонни Моппом , - это использовать stdio put (), которая возвращает целое число (это то, что логически является функциональным).

bool sum = AsciiSum(name)>=20 && puts("playerA");
bool len = NameLength(name)<6 && puts("playerB");

При этом вам даже не нужно создавать функцию printMessage, хотя вы должны оставаться с тем, с чем удобнее работать.

1 голос
/ 10 апреля 2019

Учитывая функцию вывода, которая всегда возвращает true:

bool print( const char* msg )
{
    puts( msg ) ;
    return true ;
}

Затем вы можете использовать оценку короткого замыкания следующим образом:

bool sum = AsciiSum(name)>=20;
bool len = NameLength(name)<6;

(sum && print("playerA")) || 
(len && print("playerB")) || 
print("no player was sent") ;

Тестирование всех комбинаций таким образом:

bool sum = false, len = false ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;

sum = false, len = true ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;

sum = true, len = false ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;

sum = true, len = true ;
(sum && print("playerA")) || (len && print("playerB")) || print("no player was sent") ;

правильно выводит:

no player was sent                                                                                                                                       
playerB                                                                                                                                                  
playerA                                                                                                                                                  
playerA  

Ваш компилятор может выдать диагностику относительно результата использования неиспользуемого выражения;это может быть подавлено фиктивным присваиванием:

bool dummy = (sum && print("playerA")) || 
             (len && print("playerB")) ||  
             print("no player was sent") ; 

или преобразованием целого выражения в void:

(void)((sum && print("playerA")) || 
       (len && print("playerB")) || 
       print("no player was sent")) ;

Единственное требование функции вывода - это то, что она возвращаетнулевое значение для короткого замыкания ||, с этой целью printf() будет работать, если сообщение не является пустой строкой, и избегать необходимости определять конкретную функцию вывода .:

(void)((sum && printf("playerA\n")) || 
       (len && printf("playerB\n")) || 
       printf("no player was sent\n")) ; 

puts() однако гарантирует только возврат неотрицательного значения в случае успеха, которое включает ноль, поэтому не должно использоваться.

...