请收缩我的密码

时间:2013-12-14 00:25:42

标签: c

我写了这个愚蠢的代码块作为“c编程现代方法第二E”一书的程序练习的答案。由K.N.King,即ch7; ex4。

我无法用更少的代码做同样的事情,所以,你能吗?

它只是将字母电话号码转换为数字形式,我真的很想看到更好的编码...

谢谢..

#include <stdio.h>

void main()
{   
    char c;
    int phone_number;

    printf("Enter phone number: ");

    while((c = getchar()) != '\n') {
        if(c == 'A' || c == 'B' || c == 'C')
            printf("2");
        if(c == 'D' || c == 'E' || c == 'F')
            printf("3");
        if(c == 'G' || c == 'H' || c == 'I')
            printf("4");
        if(c == 'J' || c == 'K' || c == 'L')
            printf("5");
        if(c == 'M' || c == 'N' || c == 'O')
            printf("6");
        if(c == 'P' || c == 'R' || c == 'S')
            printf("7");
        if(c == 'T' || c == 'U' || c == 'V')
            printf("8");
        if(c == 'W' || c == 'X' || c == 'Y')
            printf("9");
        if(c == '0')
            printf("0");
        if(c == '1')
            printf("1");
        if(c == '2')
            printf("2");
        if(c == '3')
            printf("3");
        if(c == '4')
            printf("4");
        if(c == '5')
            printf("5");
        if(c == '6')
            printf("6");
        if(c == '7')
            printf("7");
        if(c == '8')
            printf("8");
        if(c == '9')
            printf("9");
        if(c == '-')
            printf("-");
    }
    printf("\n");
}

2 个答案:

答案 0 :(得分:2)

我们可以利用字符顺序的事实(不确定这是否是标准的,但无论如何它都发生在大多数表示中)

让我们创建一个表格,指定一个字母代表的数字。它看起来像

int keynum[26] = {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};

keynum[0]A映射到的数字,依此类推。如果我们有一个字符c,我们需要在keynum中获取正确的索引,我们会按c-'A'计算

然后我们的主循环将是:

while((c=getchar()) != '\n') {
    if (c>='0' && c<='9')
         putchar(c);
    else if (c >= 'A' && c <= 'Z')
         putchar('0' + keynum[c-'A'])
    /* else error? */
}

答案 1 :(得分:0)

2 + ((c-'A') / 3)(积分除)是您为A-Y打印的数字( if 'A'<=c && c<='O'!)