2015-04-26 5 views
0

Рассмотрим замковое устройство доступа с 5 кнопками на нем, и 2-х номеров, относящихся к каждой кнопке:написание программы, которая печатает перестановкам

Пример:

Кнопка A: 1 2

Кнопка B: 3 4

Кнопка С: 5 6

Кнопка D: 7 8

Кнопка E: 9 0

Каждая кнопка имеет 2 возможных варианта; поэтому каждый 5-значный код доступа имеет 2^5 = 32 комбинации.

Например:

кода 1 3 5 7 9 будут введены, используя ту же схему кнопок в виде кода 2 4 6 8 0 (рисунок = ABCDE)

код 1 4 4 4 1 будет введенный с использованием той же схемы кнопок, что и код 1 3 3 3 2 (pattern = ABBBA)

После запроса пользователю кода доступа и проверки, находится ли он в пределах диапазона (0-99999), вычислить и распечатать на экране 32 разных кода.

Я был в состоянии написать эту программу, но это было сделано с использованием 32 операторы печати, показанной в моем коде:

#include <stdio.h> 
#define MAXNUM 5 
#define COMBO 32 

int main(){ 

    int input; 
    int num[MAXNUM]; 
    int numtemp[MAXNUM]; 
    int i; 

    printf("Please enter your 5 numbers within the range of [0~99999]:\n"); 
    scanf("%d", &input); 
    while(input > 99999 || input < 0){ 
     printf("The inputted number is not in the specified range[0~99999], Please enter a new number:\n"); 
     scanf("%d", &input); 
    }//end while 

    for(i = 4; i >= 0; --i){ 
     num[i] = input%10; 
     input /= 10; 
    }//set num array to each digit of inputted number 

    for(i = 0; i < MAXNUM; ++i){ 
     switch(num[i]){ 
      case 1: 
       numtemp[i] = 2; 
       break; 
      case 2: 
       numtemp[i] = 1; 
       break; 
      case 3: 
       numtemp[i] = 4; 
       break; 
      case 4: 
       numtemp[i] = 3; 
       break; 
      case 5: 
       numtemp[i] = 6; 
       break; 
      case 6: 
       numtemp[i] = 5; 
       break; 
      case 7: 
       numtemp[i] = 8; 
       break; 
      case 8: 
       numtemp[i] = 7; 
       break; 
      case 9: 
       numtemp[i] = 0; 
       break; 
      case 0: 
       numtemp[i] = 9; 
       break; 
     }//end switch 
    }//array numtemp now has all opposite values of array num 

    //32 print statements for the different combinations 
    printf("Here are your 32 combinations:\n"); 
    printf("%d%d%d%d%d\n", num[0], num[1], num[2], num[3], num[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], num[1], num[2], num[3], num[4]); 
    printf("%d%d%d%d%d\n", num[0], numtemp[1], num[2], num[3], num[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], num[2], num[3], num[4]); 
    printf("%d%d%d%d%d\n", num[0], num[1], numtemp[2], num[3], num[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], num[1], numtemp[2], num[3], num[4]); 
    printf("%d%d%d%d%d\n", num[0], numtemp[1], numtemp[2], num[3], num[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], numtemp[2], num[3], num[4]); 
    printf("%d%d%d%d%d\n", num[0], num[1], num[2], numtemp[3], num[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], num[1], num[2], numtemp[3], num[4]); 
    printf("%d%d%d%d%d\n", num[0], numtemp[1], num[2], numtemp[3], num[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], num[2], numtemp[3], num[4]); 
    printf("%d%d%d%d%d\n", num[0], num[1], numtemp[2], numtemp[3], num[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], num[1], numtemp[2], numtemp[3], num[4]); 
    printf("%d%d%d%d%d\n", num[0], numtemp[1], numtemp[2], numtemp[3], num[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], numtemp[2], numtemp[3], num[4]); 
    printf("%d%d%d%d%d\n", num[0], num[1], num[2], num[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], num[1], num[2], num[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", num[0], numtemp[1], num[2], num[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], num[2], num[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", num[0], num[1], numtemp[2], num[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], num[1], numtemp[2], num[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", num[0], numtemp[1], numtemp[2], num[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], numtemp[2], num[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", num[0], num[1], num[2], numtemp[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], num[1], num[2], numtemp[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", num[0], numtemp[1], num[2], numtemp[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], num[2], numtemp[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", num[0], num[1], numtemp[2], numtemp[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], num[1], numtemp[2], numtemp[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", num[0], numtemp[1], numtemp[2], numtemp[3], numtemp[4]); 
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], numtemp[2], numtemp[3], numtemp[4]); 
}//end of main 

numtemp содержал все противоположные значения num и распечатан 32 Комбинации таким образом. Я хотел бы знать, может ли кто-нибудь придумать более легкое решение. Это было лабораторное задание, за которое я получил полный кредит, но я хотел бы улучшить код, поэтому у него нет этих 32 заявлений печати. Любая помощь приветствуется!

+0

В C++ [очень легко получить перестановки] (http://en.cppreference.com/w/cpp/algorithm/next_permutation). –

+0

Нет, все в порядке. Они читают 1 5-значный номер, затем разбивают его на 5 1-значный номер. Но это не удается, если число не 5 цифр. Если пользователь вводит 43, тогда массив будет содержать {0, 0, 0, 4, 3}. –

+0

Он читает одно пятизначное число, а цикл for сразу же после разрыва чисел переводится в массив, который содержит каждый из этих 5 чисел. Код работает, я просто хочу знать лучший способ его улучшить. Это также предполагает, что пользователь вводит фактическое 5-значное число. –

ответ

0

Если вы хотите, чтобы отобразить все возможные коды, то вы можете просто использовать бинарное представление всех чисел от 0 до 32 (используйте std::bitset для этого), а затем отобразить каждый соответствующий бит, например, так:

#include <iostream> 
#include <bitset> 
#include <string> 

int main() 
{ 
    const std::string letter{"ABCDE"}; 
    for(std::size_t i = 0; i < 32; ++i) 
    { 
     for(std::size_t j = 0; j < 5; ++j) 
     { 
      std::cout << letter[j] << std::bitset<5>(i)[j] << " "; 
     } 
    std::cout << std::endl; 
    } 
} 

Если вы используете C, то замените std::string на const char* и напишите свою собственную процедуру преобразования битов.

+0

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

+0

@NicolasO вы можете реализовать бит-дисплей, используя оператор бит-сдвига '>>' и и-каждый извлеченный бит с '1'. Найдите «двоичное представление числа в C», и вы увидите, как это делается. Если ваш вопрос C-only, удалите тег C++. – vsoftco

+0

Извините за тег C++, это был только рекомендуемый тег.Я проверю двоичное представление чисел и посмотрю, куда я иду оттуда. Благодаря! –

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