【问题标题】:How to turn a horizontal matrix vertical?如何将水平矩阵垂直?
【发布时间】:2019-02-18 08:39:24
【问题描述】:

我正在根据输入的字符将特定的十六进制转换为十进制,然后再转换为二进制。我正在尝试以输入字符的形状打印 1 和 0 的矩阵。当我打印第一个字符时,它会横向输出。我怎样才能把它垂直?

我尝试找到一种方法,在一行列上仅打印每个二进制的第一个数字,在第二行列上打印第二个数字,依此类推,但什么也没有。该代码需要使用包含所有十六进制的外部文件。从文件中提取时,A 的十六进制为十进制形式:126、17、17、17、126。然后我将它们转换为二进制整数:01111110、00010001、00010001、00010001 和 01111110。然后打印出来一个 5x7 矩阵。它应该产生一个垂直的 A,而是产生一个水平的 A。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "font5x7.h"

void DecToBin (int newBin[], char userMessage[], int k) {
int i = 0;
int j = 0;
int m = 0;

for (i = 0; i < 1; ++i) {
    while (m < 8) {
    newBin[j] = Font5x7[k] % 2;
    Font5x7[k] = Font5x7[k] / 2;
    ++j;
    ++m;
    }
}
}

int main (void) {

const int INPUT_STR_SIZE = 40;
char userMessage[INPUT_STR_SIZE];
int i = 0;
int j = 0;
int k = 0;

const int BIN_MAX = 8;
int binNum[BIN_MAX];

printf("Enter message:\n");
fgets(userMessage, INPUT_STR_SIZE, stdin);



//Iterate through DecToBin function for bin equivalents
for (i = 0; i < strlen(userMessage); ++i) {
    if (userMessage[i] == 'A') {
        for (k = 165; k < 170; ++k) {
            DecToBin(binNum, userMessage, k);
                for (j = 7; j >= 0; --j) {
                    printf("%d", binNum[j]);
                }
                    printf("\n");
        }
    }
}






return 0;

}

【问题讨论】:

    标签: c arrays loops matrix orientation


    【解决方案1】:

    如果我很好地理解水平 A 的像素来自 126、17、17、17、126 :

    01111110
    00010001
    00010001
    00010001
    01111110
    

    必须产生一个垂直的左转A(这里缺少0不存在):

    01110
    10001
    10001
    10001
    11111
    10001
    10001
    00000
    

    也就是说:(高位是数组中的索引,位秩越低)

    07 06 05 04 03 02 01 00
    17 16 15 14 13 12 11 10
    27 26 25 24 23 22 21 20
    ...
    n7 n6 n5 n4 n3 n2 n1 n0
    

    必须生产

    00 10 20 30 .. n0
    01 11 21 31 .. n1
    02 12 22 32 .. n2
    ...
    07 17 27 37 .. n7
    

    建议这样做:

    #include <stdio.h>
    #include <string.h>
    
    void turnLeft(const unsigned char * v, unsigned char r[8], size_t sz)
    {
      memset(r, 0, sizeof(r));
    
      size_t j = 0;
    
      for (unsigned m = 1; m != (1 << 8); m <<= 1) {
        for (size_t i = 0; (i != sz) && (i != 8); ++i) {
          if (v[i] & m)
            r[j] |= (1 << (7 - i));
        }
        j += 1;
      }
    }
    
    void pr(const unsigned char * v, size_t sz)
    {
      for (size_t i = 0; i != sz; ++i) {
        unsigned char c = v[i];
    
        for (unsigned m = (1 << 7); m != 0; m >>= 1)
          putchar('0' + ((c & m) != 0));
    
        putchar('\n');
      }
    }
    
    int main()
    {
      const unsigned char v[] = { 126, 17, 17, 17, 126 };
      unsigned char r[8];
    
      pr(v, sizeof(v));
      putchar('\n');
    
      turnLeft(v, r, sizeof(v));
      pr(r, 8);
    }
    

    编译和执行:

    vxl15036 /tmp % gcc -std=c99 -pedantic -Wextra a.c
    vxl15036 /tmp % ./a.out
    01111110
    00010001
    00010001
    00010001
    01111110
    
    01110000
    10001000
    10001000
    10001000
    11111000
    10001000
    10001000
    00000000
    

    【讨论】: