2016-03-02 8 views
0

Как сравнить одно целое число с массивом из десяти целых чисел, чтобы определить, содержится ли единственное целое в массиве с использованием языка C? Мои извинения, если оригинальный вопрос был неясен, а салфетка равна любому числу внутри массива, я хочу вывести PORTD = 0b10000000. Спасибо!Сравните одно целое с массивом целых чисел в C?

short a[10]={10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; //Array of accepted passwords. 
short array[10]; 
int i; 
for(i=0; i<10; i++){ 
    array[i]=a[i]; 
} 

srand(clock()); 

while(1){ 
int swipe=rand() % 20; /* Simulated code read from card swipe, in this 
         * instance we used a random number between 
         * 1 and 20.*/ 
for(i=0; i<10; i++){  
    if(swipe == array[i]) { 
     PORTD=0b10000000; 
    } else { 
     PORTD=0b00001000; 
    } //If swiped code evaluates as one of the approved codes then set PORTD RD7 as high. 
} 

char Master=PORTDbits.RD7; 

Это, кажется, решило это ... спасибо за вашу помощь!

for(i=0; i<10; i++){  
if(swipe == array[i]) { 
    PORTD=0b10000000; 
    break; 
} else { 
    PORTD=0b00001000; 
    } 
} 
+0

Кстати, вы вызвали 'srand()'? – ryyker

+0

Я назвал srand, но, похоже, не имел большого значения, поскольку в настоящее время я получаю разные случайные переменные каждый раз, когда код проходит, поэтому я его вынул. Спасибо – NewMC

+0

Как вы вызываете 'rand()' в цикле, вы должны сначала вызвать 'srand()' до [[посеять псевдослучайные значения] (http://stackoverflow.com/a/16569330/645128) _ , – ryyker

ответ

0

В дополнение к @ kaylum отвечают ...

Потому что вы звоните rand() в цикле, вам нужно вызвать srand() первый перед входом в цикл,

srand(clock());//for example 
while(1){ 
    LATD=0x00; 
    int swipe=rand() % 20; 
    ... 

Если вы этого не сделаете, цифры случайные, которые вы получите, будут иметь одинаковую последовательность значений при каждом выполнении.

Кроме того, если i не инициализируется перед тем, как использовать для сравнения, это == 10. Он должен быть сброшен перед использованием в качестве индекса массива ...

Кроме того, в вашем коде, оказывается вам хотите проверить последнее случайное число против 10 принятых паролей. Если это правильно, вы должны сравнить все 10 из них:

int main(void) 
{ 
    srand(clock());//for example 
    j = 0; 
    while(1) 
    { 
     int swipe=rand() % 20; 
     PORTD=0b00000000; 
     for(i=0;i<10;i++) 
     { 
      j++; 
      if(swipe == array[i]) 
      { 
       PORTD=0b10000000; 
       break; 
      } 

     } 
     //to show ratio of legal to illegal passcodes... 
     printf("times through: %d Value of PORTD %d\n", j, PORTD); 
    } 
} 
+0

ok, сделаю, спасибо. – NewMC

+0

Это проверяет прокрутку массива [i] десять раз, но в то время как салфетка = 18, она все равно выглядит как ложная. Извините, я знаю, что есть что-то довольно простое, я не подключаюсь, но просто не испытываю этого. – NewMC

+0

@NewMC - Это правда. Я предполагаю, что, поскольку вы указали, что это был симулированный код, считываемый с карты swipe_, который вы хотите протестировать как на законных, так и на незаконных вариантах доступа к паролю. У вас есть массив из 10 _legal_ passcodes. Если у вас есть генератор _pseudo random_, который создает от 0 до 20, следует только ожидать, что 1/2 момента, когда значение будет незаконным. Пожалуйста, объясните (в своем первоначальном сообщении выше), что именно вы хотите. – ryyker

0

if(swipe == a[i]). Это вызывает неопределенное поведение, так как i - это 10, а 10 - индекс за пределами границ. Допустимые индексы от 0 до 9.

+0

Справа. Я подозреваю, в этом случае, что 'swipe' выделяется хранилищем только за концом массива, поэтому сравнение всегда возвращает true - оно эффективно сравнивает' swipe' с самим собой. Конечно, как вы говорите, поведение не определено. – davmac

+0

Ой, я думал, что правильно написал это утверждение раньше и получал одинаковые выходные значения, но когда я говорю i = 0; г <9; i ++ в моем цикле for я, кажется, получаю правильные значения сейчас. Спасибо!! – NewMC

+0

@NewMC Это неправильное решение. Оставь эту петлю как есть. В противном случае он оставит один элемент «массива» унифицированным. И результат по-прежнему будет неопределенным поведением, поскольку 'array [9]' будет неинсталлироваться. Вместо этого измените проверку на 'if (swipe == a [9])'. Или какой-либо индекс, который вы собираетесь сравнить. – kaylum

1

Вы должны проверить свою ценность салфетки против всех десяти значений в массиве принимаемых паролей.

например. как показано ниже

for(i=0; i<10; i++) 
    if(swipe == array[i]) { 
    set a true flag (and maybe exit the for loop) 
    } 
Depending on the flag, set the output 
+0

Когда я это делаю, он оценивается как ложный, хотя я вижу, что салфетки являются одним из значений в массиве. PORTD = 0b10000000 - это результат, который я хочу видеть, это установка одного вывода микроконтроллера на высокий (5 В). – NewMC

0

Вы пытаетесь имитировать случайные карты чтения действия & получить как Pass/Fail в различных случаях. При значениях перехода от 1 до 20 и паролях только в диапазоне 10, 19 вы хотите увидеть, не работают ли некоторые экземпляры. Это верно?

Если это так, учитывая, что ваша функция rand() возвращает только целое число, задайте точку останова и зонд для значения салфетки. Кажется, он всегда имеет такую ​​же ценность. Сделать функцию rand() лучше для более широкого статистического распределения. Существует много источников генерации случайных целых чисел, таких как метод линейного конгруэнтного взаимодействия и т. Д.

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

+0

@ Seshu - Да, на данный момент более 50% времени он не выполнит оператор if и передаст else, но то, что мне нужно, это передать утверждение if, как только оно станет истинным. – NewMC