【问题标题】:7-Segment display with printf and multidimensional array in CC语言中带有printf和多维数组的7段显示
【发布时间】:2015-10-14 23:07:18
【问题描述】:

所以我的问题在于我相信我的 process_digit 函数。我认为没有通过 1 和 0 的每次迭代正确索引的情况,因此当我输入诸如 4 之类的输入时,我得到不正确的输出。我不确定情况是否如此 陈述是倒退的或正在发生的事情,但基本上我认为它们是不正确的。

//input is 1 2 3 4 5 6 7 8 9 0
//output should be        _   _        _   _   _   _   _   _
//                     |  _|  _|  |_| |_  |_    | |_| |_| | |
//                     | |_   _|    |  _| |_|   | |_|   | |_|
//output is              _    _        _   _    _  _    _   _
//                     | _|   _|  |_|  |_  |_   |  |_|  |_| ||
//                     | |_   _|  |    _|  |_|  |  |_|  _|  |_|
//

#include <stdio.h>
#define MAX_DIGITS 10

void clear_digits_array(void);
void process_digit(int digit, int position);
void print_digits_array(void);
char digits[3][MAX_DIGITS*4];
const int array[MAX_DIGITS][7]={{1,1,1,0,1,1,1},{0,0,1,0,0,1,0},{1,0,1,1,1,0,1},{1,0,1,1,0,1,1},{0,1,1,1,0,1,0},{1,1,0,1,0,1,1},{1,1,0,1,1,1,1},{1,0,1,0,0,1,0},{1,1,1,1,1,1,1},{1,1,1,1,0,1,1},};


void clear_digits_array(void){
    int j=0,i=0;
    for(i=0;i<3;i++){
        for(j=0;j<MAX_DIGITS*4;j++){
            digits[i][j]='\0';
        }
    }
}

void process_digit(int digit, int position){
    int i=0;
    for(i=0;i<7;i++){
        if(array[digit][i]==1){
            switch(i){
                case 0: digits[0][1+position*4]='_';
                    break;
                case 1: digits[1][0+position*4]='|';
                    break;
                case 2: digits[1][2+position*4]='|';
                    break;
                case 3: digits[1][1+position*4]='_';
                    break;
                case 4: digits[2][0+position*4]='|';
                    break;
                case 5: digits[2][2+position*4]='|';
                    break;
                case 6: digits[2][1+position*4]='_';
                    break;
            }
        }
    }
}
void print_digits_array(void){
    int a=0,b=0;
    printf("                                                                                       ");
    for(a=0;a<3;a++){
        printf("                                                                                       ");
        for(b=0;b<MAX_DIGITS*4;b++)
            printf("%c",digits[a][b]);
        printf("                                                                                       ");
    }
    printf("                                                                                       ");
}
int main(void) {
    char character_number='\0';
    int a=0;
    
    clear_digits_array();
    printf("Enter a number:");
    while ((character_number=getchar())!='\n') {
        int number=MAX_DIGITS;
        switch(character_number){
            case '0': number=0;
                break;
            case '1': number=1;
                break;
            case '2': number=2;
                break;
            case '3': number=3;
                break;
            case '4': number=4;
                break;
            case '5': number=5;
                break;
            case '6': number=6;
                break;
            case '7': number=7;
                break;
            case '8': number=8;
                break;
            case '9': number=9;
                break;
            default: printf("%c ignored", character_number);
        }
        if(a==0){
            process_digit(number,a);
            a++;
        }
    }
    print_digits_array();
    return 0;
}

【问题讨论】:

    标签: c arrays multidimensional-array


    【解决方案1】:

    问题是如果线段不活动(而不是不打印任何内容),您必须实际打印空格(printf(" ");),否则 7 段显示会显示有点混乱。这是完成这项工作的丑陋代码:

    #include <stdio.h>
    #define MAX_DIGITS 10
    
    const int array[MAX_DIGITS][7]={{1,1,1,0,1,1,1},{0,0,1,0,0,1,0},{1,0,1,1,1,0,1},{1,0,1,1,0,1,1},{0,1,1,1,0,1,0},{1,1,0,1,0,1,1},{1,1,0,1,1,1,1},{1,0,1,0,0,1,0},{1,1,1,1,1,1,1},{1,1,1,1,0,1,1},};
    
    void print_number(int num)
    {
        //First line
        if (array[num][0]) printf(" _ ");
    
        printf("\n");
    
        //Second line
        if (array[num][1])
            printf("|");
        else
            printf(" ");
    
        if (array[num][3])
            printf("_");
        else
            printf(" ");
    
        if (array[num][2]) printf("|");
    
        printf("\n");
    
        //Third line
        if (array[num][4])
            printf("|");
        else
            printf(" ");
    
        if (array[num][6])
            printf("_");
        else
            printf(" ");
    
        if (array[num][5]) printf("|");
    
        printf("\n");
    }
    
    int main(void) {
        int a=0;
    
        printf("Enter a number:");
        scanf("%d", &a);
        if (a>=0 && a <= 9){
            print_number(a);
        }
        return 0;
    }
    

    编辑

    要使用您的代码完成此操作,您可以使用空格而不是空字符 (\0) 初始化 digits 数组,如下所示:

    void clear_digits_array(void){
        int j=0,i=0;
        for(i=0;i<3;i++){
            for(j=0;j<MAX_DIGITS*4;j++){
                digits[i][j]=' ';
            }
        }
    }
    

    然后您应该将换行符打印到单独的行中,如下所示:

    void print_digits_array(void){
        int a=0,b=0;
        for(a=0;a<3;a++){
            for(b=0;b<MAX_DIGITS*4;b++)
                printf("%c",digits[a][b]);
            printf("\n");
        }
    }
    

    应该这样做!

    【讨论】:

    • 好的,我编辑了上面的程序以显示我得到的确切输出。我不确定我将如何实现您的想法,因为每个标记都存储在一个 int 数组中,该数组在最后打印出来。
    • 一个简单的方法是使用空格而不是空字符 (\0) 来初始化 digits 数组。我将编辑我的答案,向您展示如何操作。
    【解决方案2】:

    所以这就是我的想法。 @Mescarra 你说我应该用空格而不是空字符清除数组是正确的。然而,这只解决了一半的问题。为了使它正常工作,当调用 print 函数时,需要两个 \n 。一个在行之间,一个在列之间,以在需要正确对齐字符的地方应用空格。这就是我最终能够正常工作的内容。如果有比分享更好的方法,很想知道!

    //
    //output should be        _   _        _   _   _   _   _   _
    //                     |  _|  _|  |_| |_  |_    | |_| |_| | |
    //                     | |_   _|    |  _| |_|   | |_|   | |_|
    
    #include <stdio.h>
    #define MAX_DIGITS 10
    
    void clear_digits_array(void);
    void process_digit(int digit, int position);
    void print_digits_array(void);
    char digits[3][MAX_DIGITS*4];
    const int array[MAX_DIGITS][7]={{1,1,1,0,1,1,1},{0,0,1,0,0,1,0},{1,0,1,1,1,0,1},{1,0,1,1,0,1,1},{0,1,1,1,0,1,0},{1,1,0,1,0,1,1},{1,1,0,1,1,1,1},{1,0,1,0,0,1,0},{1,1,1,1,1,1,1},{1,1,1,1,0,1,1},};
    
    
    
    void clear_digits_array(void){
        int j=0,i=0;
        for(i=0;i<3;i++){
            for(j=0;j<MAX_DIGITS*4;j++){
                digits[i][j]=' ';
            }
        }
    }
    
    void process_digit(int digit, int position){
        int i=0;
        for(i=0;i<7;i++){
            if(array[digit][i]==1){
                switch(i){
                    case 0: digits[0][1+position*4]='_';
                        break;
                    case 1: digits[1][0+position*4]='|';
                        break;
                    case 2: digits[1][2+position*4]='|';
                        break;
                    case 3: digits[1][1+position*4]='_';
                        break;
                    case 4: digits[2][0+position*4]='|';
                        break;
                    case 5: digits[2][2+position*4]='|';
                        break;
                    case 6: digits[2][1+position*4]='_';
                        break;
                }
            }
            
        }
    }
    void print_digits_array(void){
        int a=0,b=0;
        for(a=0;a<3;a++){
            for(b=0;b<MAX_DIGITS*4;b++)
                printf("%c",digits[a][b]);
            printf("\n");
        }
        printf("\n");
    }
    int main(void) {
        char character_number='\0';
        int a=0;
        
        clear_digits_array();
        printf("Enter a number:");
        while ((character_number=getchar())!='\n') {
            int number=MAX_DIGITS;
            switch(character_number){
                case '0': number=0;
                    break;
                case '1': number=1;
                    break;
                case '2': number=2;
                    break;
                case '3': number=3;
                    break;
                case '4': number=4;
                    break;
                case '5': number=5;
                    break;
                case '6': number=6;
                    break;
                case '7': number=7;
                    break;
                case '8': number=8;
                    break;
                case '9': number=9;
                    break;
                default: number=' ';
            }
            if(a<MAX_DIGITS){
                process_digit(number,a);
                a++;
            }
        }
        print_digits_array();
        return 0;
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-23
      • 2020-09-29
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 2016-04-23
      相关资源
      最近更新 更多