2016-12-23 5 views
0

У меня есть структура с 4 элементами внутри.Сравнение всех элементов структуры по определенным правилам

typedef struct 
    { 
    char colour; 
    char shape; 
    char nr; 
    char p; 
    }CARDS; 

Эта структура имеет много элементов внутри и я хочу, чтобы сравнить их 3 на 3 .. поэтому сравните, например, карты [1], карты [2], карты [3]. Если 3/4 элементов между 3-мя картами равны, тогда у нас есть SET так set = 1. Если элементы не равны, мы снова имеем set = 1.

Конечно, я мог бы просто написать много Если

If (cards[1].colour=cards[2].colour=cards[3].colour) 
    counter = counter +1; 
If (cards[1].shape=cards[2].shape=cards[3].shape) 
    counter=counter+1; 
If (cards[1].nr=cards[2].nr=cards[3].nr) 
    counter=counter+1; 
If (cards[1].p=cards[2].p=cards[3].p) 
    counter=counter+1; 

, а затем сделать, если заявление на прилавок

If (counter==3||counter==0) 
    set=1; 

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

+3

@ e0k также OP делает, если (а = Ь = c) 'так что здесь происходит много. –

+3

Вы, вероятно, также имеете в виду 'if', а не' If' - пожалуйста, напишите фактический код, а не приблизительное приближение. –

+0

Примеры представляются псевдокодами какого-либо типа – e0k

ответ

3

Прежде всего, вы используете =, когда вы должны использовать ==, скомпилируйте с предупреждениями, чтобы увидеть это. Вы также пытаетесь сравнить три вещи одновременно. Вы не можете сделать if (a == b == c), но вместо этого должны делать if (a == b && a == c) или аналогичные.

== Истинный результат равен 1, и вы можете использовать это здесь, просто добавив его:

int count = 
    (cards[1].colour == cards[2].colour && cards[1].colour == cards[3].colour) 
    + (cards[1].shape == cards[2].shape && cards[1].shape == cards[3].shape) 
    + (cards[1].nr == cards[2].nr && cards[1].nr == cards[3].nr) 
    + (cards[1].p == cards[2].p && cards[1].p == cards[3].p); 

int set = count == 3 || count == 0; 
+0

Он должен быть int set = count> = 3 || count == 0; – bunty

+0

@ bunty, который имел бы смысл быть для карточной игры, но это не то, что ОП описывает в «коде» или на английском языке выше –

+0

. Очевидно, что «если 3/4 элементов между 3-мя картами равны, то» означает, что если 3 или 4 элемента (цвет, форма nr, p) равны, тогда у нас есть SET, поэтому set = 1. Условие «count == 3» станет ложным, если все 4 элемента равны. – bunty

0

Вы могли бы сделать вашу структуру данных, более склонны к такого рода сравнения, например,

typedef enum { 
    COLOUR, 
    SHAPE, 
    NR, 
    P, 
    NUM_ATTRS 
} ATTRS; 

typedef struct { 
    char attrs[NUM_ATTRS]; 
} CARD; 

Это позволяет использовать простые циклы для проверки нескольких атрибутов нескольких карт, а не жестко закодированной явной логики.

0

Существует серьезная ошибка в состоянии, должно быть больше: Если 3/4 элементов между 3 карты

if (counter >= 3 || counter==0) 
    set=1;