2017-03-01 55 views
0

因此,这里有关字母组合的问题:计划,以找到与手机键盘

在手机键盘,很多数字都与他们有联系的信件。例如,字母A,B和C与数字2相关联。编写一个接受数字作为输入的程序,并打印与该数字关联的所有可能的字母组合。例如,如果输入是n = 23,则可能的字母组合是AD,AE,AF,BD,BE,BF,CD,CE和CF.

我不知道该如何解决这个问题,但这里是我的想法和附带的程序。我的想法是,由于只有7个唯一的数字,我会查看用户键入的每个数字,如果它是新的,请执行一种按位操作的形式来记录它。因此,如果用户再次重复该号码,则存在某种内存。

然后,我会写一个程序来计算1的数量,因此,用户输入不同的唯一编号。

这里是我卡住的地方。我似乎无法弄清楚如何“存储”不同的数字,因为在编写程序时,事先并不知道用户将输入多少个数字。我真的不知道如何生成所有的组合,但我认为嵌套for循环可以做到这一点。

无论如何,我认为我的想法太复杂,应该更简单,因为我在初学者编程课程。我还没有学习过阵列。因此,关于如何解决这个问题的任何想法都非常感谢。

#include <stdio.h> 

int main() { 
    int input, i, j, k = 0, count_1 = 0, count_2 = 0, integer, check, monitor = 0; 
    char alphabets; 
    printf("Enter number as input: "); 
    scanf("%d", &input); 
    if (input < 50 || input > 57) { 
     printf("Enter number as input: "); 
     scanf("%d", &input); 
    } 
    integer = input; 
    while (integer > 0) { 
     check = input % 10; 
     input = integer/10; 
     switch (check) { 
     case 2: monitor | (2 *  1); break; 
     case 3: monitor | (2 *  10); break; 
     case 4: monitor | (2 *  100); break; 
     case 5: monitor | (2 *  1000); break; 
     case 6: monitor | (2 * 10000); break; 
     case 7: monitor | (2 * 100000); break; 
     case 8: monitor | (2 * 1000000); break; 
     case 9: monitor | (2 * 10000000); break; 
     } 
    } 
    for(i = 0; i < 8; i++) { 
     if(i == 0) { 
     power = 1; 
     } 
     else { 
     for (j = 1; j <= i; j++) { 
      power *= 10; 
     } 
     } 
    } 
    while (k < 7) { 
+0

在你学习数组之前,将它看作一个练习似乎很残酷。您显示的代码不完整。您的代码需要处理43556(其中涵盖了HELLO以及其他可能性) - 也就是说,数字可以重复。 –

+0

请查看如何创建MCVE([MCVE])。 –

回答

1

A small book, a must have.

此代码工作所需:

#include <stdio.h> 
#include <string.h> 

void combinaisons(const char * input[], size_t index, size_t count, char * str) { 
    const char * group = input[index]; 
    for(size_t i = 0, len = strlen(group); i < len; ++i) { 
     str[index] = group[i]; 
     if(index+1 < count) { 
     combinaisons(input, index+1, count, str); 
     } 
     else { 
     printf("%s\n", str); 
     } 
    } 
    str[index] = '\0'; 
} 

int main() { 
    const char * groups[] = { 
     "ABC", /* 2 */ 
     "DEF", /* 3 */ 
     "GHI", /* 4 */ 
     "JKL", /* 5 */ 
     "MNO", /* 6 */ 
     "PQRS",/* 7 */ 
     "TUV", /* 8 */ 
     "WXYZ",/* 9 */ 
    }; 
    const char * input[100]; 
    size_t count = 0; 
    char c; 
    while((c = getchar()) > 20 && count < 100) { 
     if(c >= '2' || c <= '9') { 
     input[count++] = groups[c-'2']; 
     } 
    } 
    char str[100] = ""; 
    combinaisons(input, 0, count, str); 
    return 0; 
} 

执行跟踪:

246 
AGM 
AGN 
AGO 
AHM 
AHN 
AHO 
AIM 
AIN 
AIO 
BGM 
BGN 
BGO 
BHM 
BHN 
BHO 
BIM 
BIN 
BIO 
CGM 
CGN 
CGO 
CHM 
CHN 
CHO 
CIM 
CIN 
CIO 

几点说明:

groups是一个字符串数组(即const char *)。它可以通过char索引,例如'2'作为索引0和c-'2'。

input存储选定的组,其中'246',输入包含{"ABC","GHI","MNO"}

str是从索引0处选取input的字母构建的字符串:A,B或C,索引为1:G,H或I等等。

递归用于对来自input的不同组中的str的不同索引应用相同的处理。当所有来自输入的组都被使用时,递归在没有剩余组存在时终止。一条重要的指令是最后的combinaisonsstr[index] = '\0';,它通过删除最后添加的字符来截断字符串,因为递归回溯。我建议使用调试器一步一步执行此代码,并观察str是如何填充的。

c = getchar()从标准输入中读取单个字符,see documentation

条件> 20用于检测任何非可打印的字符,如CR结束while循环。

size_tcount类型,count在每次数从该指示input[count++]这意味着使用计数到索引输入数组stdin读取数据时递增然后增加它,它是一个后置递增。第一个索引是零。

+0

不知道是否倾销代码对他有帮助 – bolov

+0

数据常量使用和短递归函数的一个例子可能是问题和交流的起点.​​..... – Aubin

+1

如果OP尚未理解数组,他们可能没有覆盖递归,这可能有点高级 - 但它似乎工作。 –