Как повернуть горизонтальную матрицу по вертикали? - PullRequest
0 голосов
/ 18 февраля 2019

Я конвертирую определенные шестнадцатеричные числа на основе введенного символа в десятичные, а затем в двоичные.Я пытаюсь напечатать матрицу из 1 и 0 в форме введенного символа.Когда я печатаю первый символ, он выводит вбок.Как я могу повернуть его по вертикали?

Я попытался найти способ напечатать только первую цифру каждого двоичного файла в одном ряду столбцов, вторую цифру во втором ряду столбцов и т. Д., Но получилосьни с чем.Код требует использования внешнего файла со всеми шестнадцатеричными числами.При извлечении из файла шестнадцатеричные числа для A имеют десятичную форму: 126, 17, 17, 17, 126. Затем я преобразую их в двоичное целое число: 01111110, 00010001, 00010001, 00010001 и 01111110. И распечатаю их вматрица 5х7.Он должен давать вертикальную букву А, но вместо этого - горизонтальную букву А.

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

}

1 Ответ

0 голосов
/ 18 февраля 2019

Если я хорошо понимаю горизонталь 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
...