Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

thoga31

Tabela ASCII - programa completo

Recommended Posts

thoga31

Este programa permite:

  • Visualizar a Tabela ASCII em formato de Tabela;
  • Premir uma tecla e visualizar
    • A ordem;
    • O caracter correspondente;
    • Se é especial, função ou regular;

    [*]Converter uma ordem ASCII no seu caracter correspondente

    [*]Converter um texto com um máximo de 100 caracteres num conjunto de ordens dos caracteres.

Foi programado recorrendo única e exclusivamente ao paradigma estrutural. Ou seja, todo o programa corre com base em procedimentos, cuja navegação é auxiliada por variáveis locais de controlo.

program ASCII_1;
uses crt;
var oqf : char;  // O Que Fazer - voltar a mostrar menu ou sair?


procedure pausa;
(* Faz pausa ao programa, e só termina quando for premido "Enter" *)
var tecla : char;
begin
     repeat
           tecla := readkey;
     until (tecla = #13);
end;


procedure tabela;
(* Mostra tabela ASCII *)
var i : integer;
begin
     clrscr;
     writeln('TABELA de caracteres regulares (#32 .. #255)');
     for i:=32 to 255 do begin
         write(i:3,' ',char(i),' | ');
     end;
     write('Enter para voltar...');
     pausa;
end;


procedure conv_tecla;
(* Converte a tecla premida na ordem e caracter ASCII respectivo *)
(* Bom para detectar teclas especiais *)
var tecla : char;
    especial : char;
begin
     clrscr;
     writeln('Prima tecla. "Enter" para sair. "Enter" é de ordem #13.');
     writeln;
     repeat
           tecla := readkey;
           if (tecla = #0) then begin  // Tecla especial, com dupla ordem, cuja primeira é #0
              especial := readkey;
              writeln('ESPECIAL: #0 + #',ord(especial),' = ',char(especial));
           end else begin
               if (ord(tecla) < 32) then write('  FUNCAO: ')
               else write(' REGULAR: ');
               writeln('#',ord(tecla),' = ',char(tecla));
           end;
     until (tecla = #13);
end;


procedure conv_ord;
var n : byte; // de 0 a 255, só!
begin
     clrscr;
     writeln('ORDEM > CARACTER. "13" para sair.');
     writeln;
     repeat
           repeat
                 write('Ordem (32 .. 255): ');  // exclui ordens de caracteres de funcoes
                 readln(n);
           until (n in [32..255] + [13]);
           writeln('Caracter de ordem ',n,': ',char(n));
     until (n = 13);  // equivale ao "Enter" do conversor de teclas
end;


procedure conv_frases;
var frase : string[200];
    i : integer;
begin
     clrscr;
     writeln('CONVERSOR DE FRASES');
     write('Introduza frase (ate 200 caracteres): ');
     readln(frase);
     writeln;
     for i:=1 to length(frase) do  // Mostra ordens
         write(ord(frase[i]):3,' ');
     writeln;
     for i:=1 to length(frase) do begin  // Mostra respectivos caracteres por baixo
         write('  ',frase[i],' ');
     end;
     pausa;
end;


procedure conversor_menu(var i_oi : char {Indicador "Onde Ir?"});
(* Conversor ASCII - menu *)
begin
     clrscr;
     writeln('CONVERSOR');
     writeln('   1 - Tecla > Ordem + Caracter (eq. Caracter > Ordem)');
     writeln('   2 - Ordem > Caracter');
     writeln('   3 - Conversor de frases');
     writeln('   0 - Voltar');

     repeat (* Leitura da opção, de entre as "0", "1" "2" e "3" *)
           i_oi := readkey;
     until (char(i_oi) in ['0'..'3']);

     case char(i_oi) of  (* Selecção de acção consoante opção *)
          '1': conv_tecla;
          '2': conv_ord;
          '3': conv_frases;
     end;
     // Se é "0", simplesmente tem de sair do procedimento e regressar ao Menu
end;


procedure menu(var opt : char);
(*  Menu Principal *)
var oi : char; // Controlador "Onde Ir?", para o Conversor
begin
     clrscr;
     writeln('TABELA ASCII');
     writeln('   1 - Ver tabela');
     writeln('   2 - Conversor');
     writeln('   0 - Sair');
     writeln;
     write('Opcao: ');

     repeat (* Leitura da opção, de entre as "0", "1" e "2" *)
           opt := readkey;
     until (char(opt) in ['0'..'2']);

     case char(opt) of  (* Selecção de acção consoante opção *)
          '1': tabela;
          '2': begin
               repeat
                     conversor_menu(oi);
               until (char(oi) = '0');
               end;
     end;
     // Se é "0", simplesmente tem de sair do procedimento, indicando a "O Que Fazer" que deve terminar programa
end;


begin (* BLOCO PRINCIPAL *)
     repeat
           menu(oqf);  // Menu, retornando "O Que Fazer"
     until (char(oqf) = '0');  // Opção "0" indica término do programa
end.

Documento na Wiki

Cumprimentos ;)

NOTA: sem link para o Ideone pois ocorre um "Time Limite Exceed" sempre que se tenta correr com novo input.

Optimizado para Free Pascal. Para testar, compilem nos vossos PCs. :)


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Algo que faz sempre falta quando se programa em consola e se quer embelezar a coisa. Aliás, faz falta para muito mais!

;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
apocsantos

    Boa tarde,

    Não querendo ser critico, faltam os caracteres de controlo (1 a 32), que podiam ser impressos e também fazem jeito.

{"NUL\0", "SOH\0","ETX\0", "EOT\0", "ENQ\0","ACK\0","BEL\0","BS\0","TAB\0","TAB\0","LF\0","VT\0","FF\0","CR\0","SO\0","SI\0", "DLE\0","DC1\0","DC2\0","DC3\0","DC4\0","NAK\0","SYN\0","ETB\0","CAN\0","EM\0","SUB\0","ESC\0","FS\0","GS\0","RS\0","US\0","Spc\0"}

    Tenho isso feito em C, mas posso converter a pascal basta arranjar uns 10 minutos, para tirar a ferrugem de pascal e escrever a procedure para os 33 caracteres de controlo.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
nunopicado

Não querendo ser critico, faltam os caracteres de controlo (1 a 32), que podiam ser impressos e também fazem jeito.

    Tenho isso feito em C, mas posso converter a pascal basta arranjar uns 10 minutos, para tirar a ferrugem de pascal e escrever a procedure para os 33 caracteres de controlo.

É verdade, fazem muita falta (talvez mais até do que os restantes.

Mas... 33? Não são só 31 (1-31), ou estou-me a esquecer de algum?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

0..31. O #32 é o espaço :)

Pois, 32 (0..31). O #0 também é de controlo!  ;)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
pmg

O caracter 127 tambem e meio esquisito ;)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
nunopicado

O caracter 127 tambem e meio esquisito ;)

Tens razão, é o DEL. Não me lembrava desse! Afinal são mesmo 33!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
thoga31

Não querendo ser critico, faltam os caracteres de controlo (1 a 32), que podiam ser impressos e também fazem jeito.

Qual crítica qual quê! Críticas construtivas são sempre bem-vindas, ora essa! ;)

Eu só não meti esses no ciclo For porque são ícones esquisitos que aparecem e nada sugerem sobre a função que têm. Uma tabela só de caracteres especiais seria muito fixe, bem como incluir isso no Conversor, já que este dá o ícone estranho e não a função. :)


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Hieroglifos é sempre boa arte... ;):) :)

Mete um case dentro do for, com hipoteses previstas se o código estiver entre 0 e 31, mais o 127, e no else metes o que já tens. Nas hipoteses, metes o nome da função.

Assim já resolve!


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Então e se eu usar UTF8?  :cheesygrin:

Aí tens de arranjar um snippet de uma tabela UTF8...  ::D

Este é para ASCII!  :D


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
apocsantos

    Boa noite,

    Tens na system unit, funções para esse efeito. Esperimenta converter de UTF8 para ANSI por exemplo:

UTF8ToAnsi(caracter)

    Espero ter ajudado.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
nunopicado

Como utilizamos UTF8 em Pascal/Delphi? 🤔

Por exemplo o Lazarus usa UTF8 nativo se não me engano.

No Delphi é como disse o ApocSantos


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.