LINUX.ORG.RU

Отрисовать таблицу ASCII

 ,


0

1

Есть код, который печатает таблицу с нарастанием символов по столбцам:

program PrintSym;
var
   i, j : integer;
   c    : char;
begin
   write('  |');
   for c:='0' to '9' do
       write(' .', c);
   for c:='A' to 'D' do
       write(' .', c);
   writeln;
   write('  |');
   for i:=1 to 14 do
      write('---');
   writeln;
   for i:=2 to 8 do
   begin
      write(i, '.|');
      for j:=0 to 13 do
     write('  ', chr(i*16+j));
      writeln
   end
end.

Результат:

  | .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D
  |------------------------------------------
2.|     !  "  #  $  %  &  '  (  )  *  +  ,  -
3.|  0  1  2  3  4  5  6  7  8  9  :  ;  <  =
4.|  @  A  B  C  D  E  F  G  H  I  J  K  L  M
5.|  P  Q  R  S  T  U  V  W  X  Y  Z  [  \  ]
6.|  `  a  b  c  d  e  f  g  h  i  j  k  l  m
7.|  p  q  r  s  t  u  v  w  x  y  z  {  |  }
8.|  �  �  �  �  �  �  �  �  �  �  �  �  �  �

Подскажите, как можно переписать код, чтобы таблица нарастала не по столбцам, а по строкам вниз? То есть сейчас " 1, 2, 3" в третьей строке, в первом, втором и третьем столбцах, а как сделать чтобы они были все в первом столбце, с нарастанием вниз? Без перевода каретки. Никак не подберу вместо chr(i*16+j));



Последнее исправление: ilyaGor (всего исправлений: 1)

Вместо chr(i * 16+j) очевидно chr(i+j * 16).

Только это не единственное изменение, которое необходимо сделать. Во-первых, почему до «D», а не до «F»?

Во-вторых, надо не до «8», а до «7».

В изменённой программе надо будет уже не до «D», а до 7, и не до 8, а до F.

unDEFER ★★★★★
()
Последнее исправление: unDEFER (всего исправлений: 1)
Ответ на: комментарий от unDEFER

Номера строк слева и заголовок сверху нет необходимости менять. до D потому что есть необходимость сделать таблицу из 8 строк по 14 символов

ilyaGor
() автор топика
Ответ на: комментарий от ilyaGor

Если 8 по 14, тогда заголовки у вас и в оригинале не правильные.

chr(i * 16+j) должно стать chr(16 + i*14 + j), а нумерацию i и j изменить от 0 до 7 и от 0 до 13 соответственно.

В перевёрнутом варианте chr(16 + i + j*8)

unDEFER ★★★★★
()
Ответ на: комментарий от unDEFER

Спасибо большое, работает. Подскажите, пожалуйста, как выровнить таблицу, результат выходит со смещением:

  | .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D
  |------------------------------------------
0.|    ▒     (  0  8  @  H  P  X  `  h  p  x
1.|      !  )  1  9  A  I  Q  Y  a  i  q  y
2.|    ▒  "  *  2  :  B  J  R  Z  b  j  r  z
3.|     #  +  3  ;  C  K  S  [  c  k  s  {
4.|      $  ,  4  <  D  L  T  \  d  l  t  |
5.|      %  -  5  =  E  M  U  ]  e  m  u  }
6.|      &  .  6  >  F  N  V  ^  f  n  v  ~
7.|      '  /  7  ?  G  O  W  _  g  o  w  
ilyaGor
() автор топика
Ответ на: комментарий от ilyaGor

Я без кода не вижу, но что-то вы там очевидно лишнее печатаете, похоже на управляющие символы (первые 16 символов ASCII).

unDEFER ★★★★★
()
Ответ на: комментарий от unDEFER

Весь код с учётом ваших правок.

program PrintSym;
var
   i, j	: integer;
   c	: char;
begin
   write('  |');
   for c:='0' to '9' do
       write(' .', c);
   for c:='A' to 'D' do
      write(' .', c);
   writeln;
   write('  |');
   for i:=1 to 14 do
      write('---');
   writeln;
   for i:=0 to 7 do
   begin
      write(i, '.|');
      for j:=0 to 13 do
          write('  ', chr(16 + i + j*8));
      writeln
   end
end.
ilyaGor
() автор топика
Ответ на: комментарий от ilyaGor

14 строк это не до 'D'

D это шестнадцатиричная цифра, и если не кратно 16 то всё вообще не так

firkax ★★★★★
()
Ответ на: комментарий от ilyaGor

Всё правильно. Просто печатных символов ASCII не хватает до 14x8 символов. Можно сделать 12x8. Тогда 13 и 16 соответственно заменить на 11 и 32.

unDEFER ★★★★★
()

А как из это таблицы понять код символа то? И если никак, то нафиг все эти 123… D?

AntonI ★★★★★
()

Паскаль… как давно я на нём не писал.

Ну какой же он лапочка :)

hobbit ★★★★★
()
Ответ на: комментарий от Shushundr

Да нифига! Это было бы так, если бы j проходило от 0 до 16, или если бы печатался символ с кодом i*16+j (но тогда бы терялась часть таблицы).

А так это не пойми чего.

AntonI ★★★★★
()
Ответ на: комментарий от tt

...:3...

Да, но нет ;-)
Попытка форматного вывода для UTF-8 ни к чему хорошему не приведёт ;-) Write считает обычно байты, а не codepoint-ы:

Write('v':3); // "__v" -- 2 пробела и символ
Write('г':3); // "_г"  -- 1 пробел и символ

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
uses
  {$ifdef unix}cwstring,{$endif}
  SysUtils;
type
  cp866String = type AnsiString(866);
var
  i, j: Integer;
  s: cp866String;
  t: UTF8String;
begin
  WriteLn('CP866 codetable');  
  Write('':4); for j:=0 to 15 do Write('.':2,IntToHex(j,1)); WriteLn;
  s:=' ';
  for i:=2 to 15 do begin
    Write(IntToHex(i,1),'.',' |');
    for j:=0 to 15 do begin
      t:=s; Inc(s[1]);
      Write('':2,t);
    end;
    WriteLn;
  end;
end.


CP866 codetable
     .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
1. |  ►  ◄  ↕  ‼  ¶  §  ▬  ↨  ↑  ↓  →  ←  ∟  ↔  ▲  ▼
2. |     !  "  #  $  %  &  '  (  )  *  +  ,  -  .  /
3. |  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?
4. |  @  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O
5. |  P  Q  R  S  T  U  V  W  X  Y  Z  [  \  ]  ^  _
6. |  `  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o
7. |  p  q  r  s  t  u  v  w  x  y  z  {  |  }  ~  ⌂
8. |  А  Б  В  Г  Д  Е  Ж  З  И  Й  К  Л  М  Н  О  П
9. |  Р  С  Т  У  Ф  Х  Ц  Ч  Ш  Щ  Ъ  Ы  Ь  Э  Ю  Я
A. |  а  б  в  г  д  е  ж  з  и  й  к  л  м  н  о  п
B. |  ░  ▒  ▓  │  ┤  ╡  ╢  ╖  ╕  ╣  ║  ╗  ╝  ╜  ╛  ┐
C. |  └  ┴  ┬  ├  ─  ┼  ╞  ╟  ╚  ╔  ╩  ╦  ╠  ═  ╬  ╧
D. |  ╨  ╤  ╥  ╙  ╘  ╒  ╓  ╫  ╪  ┘  ┌  █  ▄  ▌  ▐  ▀
E. |  р  с  т  у  ф  х  ц  ч  ш  щ  ъ  ы  ь  э  ю  я
F. |  Ё  ё  Є  є  Ї  ї  Ў  ў  °  ∙  ·  √  №  ¤  ■   

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{

    int sw = 0x9,
        sh = 0xE,
        offset = 0x2,
        start  = '!';

    setbuf(stdout,NULL);
    for (int h = 0x0,ch=start; h < sw+offset; h++,ch++)
    {
        switch(h)
        {
            case 0:  printf("   | "); break;
            case 1:  printf("   |-"); break;
            default: printf("%2X.| ",h-offset); break;
        }
    for (int w = 0x0; w < sh; w++)
    {
        switch(h)
        {
            case 0:  printf(".%X ",w); break;
            case 1:  printf("---");    break;
            default: printf(" %c ",(!w)?ch-offset:ch-offset+w*0x8+w); break;
        }
        usleep(50000);
    }
    putchar('\n');
    }
    return 0;
}

dron@gnu:~$ gcc papa.c && ./a.out 
   | .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D 
   |-------------------------------------------
 0.|  !  *  3  <  E  N  W  `  i  r  {  �  �  � 
 1.|  "  +  4  =  F  O  X  a  j  s  |  �  �  � 
 2.|  #  ,  5  >  G  P  Y  b  k  t  }  �  �  � 
 3.|  $  -  6  ?  H  Q  Z  c  l  u  ~  �  �  � 
 4.|  %  .  7  @  I  R  [  d  m  v    �  �  � 
 5.|  &  /  8  A  J  S  \  e  n  w  �  �  �  � 
 6.|  '  0  9  B  K  T  ]  f  o  x  �  �  �  � 
 7.|  (  1  :  C  L  U  ^  g  p  y  �  �  �  � 
 8.|  )  2  ;  D  M  V  _  h  q  z  �  �  �  � 
dron@gnu:~$ 

Хотя зачем в табличке индексы по краям не имеющие отношения к коду символа непонятно, но если плюсануть смещение индексам то получатся коды символов. Ну и мусор в конце ненужный, можно на DEL остановиться, ну пусть так чо.

LINUX-ORG-RU ★★★★★
()

Crt подключить уже советовали? А то «отрисовать таблицу» и печатные страдания...

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)

Хотел сказать что чувак сам делал своё ДЗ и возмутиться тем что ему тут подсказывают, но ЛОР походу сам не в состоянии сделать школолабораторную. Значит это не подсказка, это коллективные доп. занятия. Легитимно

perl5_guy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.