2014-11-05 6 views
4

У меня есть две переменные A и B, и я хочу написать код, в котором, если один из двух переменных равноКак написать мультипликатор, если условия

151 or 156 or 720 

, а другой не равен одному из них цифр, то третья переменная C = 0 равна единице.

Так, например

1) if A = 151 and B = 700 then C = 1 
2) if A = 151 and B = 720 then C = 0 
3) if A = 140 and B = 700 then C = 0 

Это код

int A = 0 
cin >> A; 
int B = 0 
cin >> B; 
int C=0; 
int DECKlist[3] = {151,156,720} 
for(int d=0; d<3;d++){ 
     if(A== DECKlist[d]){ 
      for(int w=0; w<3;w++){ 
       if(B==DECKlist[w]) C=0; 
       else C=1; 
      } 
     } 
     if(B== DECKlist[d]){ 
      for(int w=0; w<3;w++){ 
       if(A==DECKlist[w]) C=0; 
       else C=1; 
      } 
     } 
} 

ли это? Есть и другие способы сделать это?

+1

'if (A == DECKlist [0] && B == DECKlist [1]) {// значение C подходит} else {// Другое значение}'; – ha9u63ar

ответ

5

Это является исключительным OR, XOR. Там нет логического XOR в C++, но вы можете использовать побитовое исключающее для вашего случая и использовать тот факт, что результат логического оператора является bool, который будет отображать 0 или 1:

#include <iostream> 

int main() 
{ 
    int A, B, C; 

    std::cin >> A; 
    std::cin >> B; 

    A = (A == 151 || A == 156 || A == 720); 
    B = (B == 151 || B == 156 || B == 720); 

    C = A^B; 

    std::cout << C << std::endl; 
} 

I Здесь мы использовали простое выражение, чтобы проверить, является ли число одним из трех поставленных чисел. Для более крупных наборов чисел, которые нужно проверить, вы можете использовать, ну, std::set.

+1

@Yakk: Никогда не видел этого. В этом случае он работает (и даже яснее, чем '^'), но это не относится к более общим случаям правды. Не существует ортогональности между 'A && B',' A || B' и 'A! = B' (используется как XOR), когда A и B являются целыми числами, где любое значение, кроме' 0', является истинным значением. –

2

Вы можете использовать стандартные алгоритмы. Например, вы можете использовать стандартные algoritnm std::binary_search вместе с побитовым оператором XOR, поскольку массив DECKlist сортируются

#include <algorithm> 
#include <iterator> 

//... 

int DECKlist[] = { 151, 156, 720 }; 

//... 

if (std::binary_search(std::begin(DECKlist), std::end(DECKlist), A)^
    std::binary_search(std::begin(DECKlist), std::end(DECKlist), B)) 
{ 
    C = 1; 
} 

В этом случае вы можете добавить новые значения в массиве и подход будет работать как обычно правильно. Это не зависит от «магических чисел» и их quntity. :)

+0

, конечно, он должен быть 'B' во втором' binary_search() '; кроме того, нет логического XOR, посмотрите комментарий в ответе М.Оема –

+0

@ Инго Леонхардт Спасибо. Это была опечатка как результат копирования и вставки первого выражения. :) –

+0

'! =' Является логическим xor, а не побитовым '^'? Не уверен, что яснее. – Yakk

1

Как насчет

int c=0; 
for(int i=0; i<3; i++){ 
    if(A == DECKlist[i]) c++; 
    if(B == DECKlist[i]) c++; 
} 
c = c%2; 

В основном, подсчитывают количество совпадений, то сделать это ноль, если это было 2.

0

Первое, что я хотел бы сделать, это скрыть код поиска. Вот немного C++, который будет линейно искать массив (или любой другой контейнер), если имеется заданное значение. Он использует два C++ 11 функций: std::begin и std::end и auto типизированных переменных:

#include <algorithm> 
#include <utility> 
#include <iterator> 

template<class Array, class T> 
bool find_in(Array const& arr, T const& t) { 
    using std::begin; using std::end; 
    const auto b = begin(arr); 
    const auto e = end(arr); 
    const auto it = std::find(b, e, t); // search the range for t 
    return !(e != it); 
} 

find_in передается массив и значение, и возвращает истину, если это значение в массиве.

Затем мы используем ту же преамбулу. Я избегаю using namespace std;, потому что это плохая привычка - просто назовите вещи с помощью std:: или импортируйте отдельные символы в пределах области функций.

#include <iostream> 

int main() { 
    int A = 0 
    std::cin >> A; 
    int B = 0 
    std::cin >> B; 
    int C=0; 
    int DECKlist[3] = {151,156,720}; 
    bool A_in_list = find_in(DECKlist, A); 
    bool B_in_list = find_in(DECKlist, B); 
    if (A_in_list != B_in_list) 
    C = 1; 
    std::cout << C << "\n"; 
} 

код поиск, потому что я положил его в вспомогательной функции, действительно чист в «основной» логике программы.

Как мы хотим знать, когда кто-либо находится в списке, но не в другом, мы просто сравниваем результаты, используя !=.

Смежные вопросы