2015-10-14 61 views
3

所以我的問題在於我相信我的process_digit函數。我不認爲通過1和0的每次迭代正確索引的情況,所以當我輸入一個像4這樣的輸入時,我得到的輸出不正確。我不確定案件 陳述是倒退或發生了什麼,但基本上我認爲他們是不正確的。在C中使用printf和多維數組的7段顯示

//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; 
 
}

回答

0

所以這裏是我如何解決它。 @Mescarra你說我應該用空格而不是空字符來清除數組。但是,這隻解決了一半的問題。爲了正確工作,當打印函數被調用時,需要兩個\ 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; 
 
}

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; 
} 

編輯

要與您的代碼實現這一點,你可以只初始化digits陣列以空格代替空字符(\0)像這樣:

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"); 
    } 
} 

而且應該這樣做!

+0

好吧,我editted上面的程序,以顯示我得到確切的輸出。我不確定我將如何實現你的想法,因爲每個標記都存儲在一個int數組中,並在最後打印出來。 – Senglish

+0

一個簡單的方法是用空格而不是空字符('\ 0')初始化'digits'數組。我會編輯我的答案,告訴你如何。 – mescarra