Mudar numeração de numeros para letras

1. Mudar numeração de numeros para letras

jtc-carr
jtc-carr

(usa Outra)

Enviado em 16/09/2019 - 15:15h

Boas,
Como faço para imprimir uma determinada sequência ordenada de letras, tenho salas ordenadas por números de 1 a 23 e quero ordenar por letras A a U

para números é um simples
for(i=0;i<=Maximo;i++);
o i vai ficando 1, 2, 3, 4, 5, ....

Mas e para letras?
fazendo char []="ABCDEF";
fico com A, B, C, D, E, F, ... lixo , já tentei de varias formas, mas não consigo, tenho mesmo de colocar as letras todas e se o Maximo subir ??

Se alguém poder dar umas luzes..


  


2. Re: Mudar numeração de numeros para letras

berghetti
berghetti

(usa Debian)

Enviado em 16/09/2019 - 16:44h

int main(void){
int i = 0x41;
for(; i <= 0x5A; i++)
printf("%c ", i);
}


se entendi, é isso.


3. Re: Mudar numeração de numeros para letras

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/09/2019 - 23:13h

for(int i=0; i<23; i++)
putchar('A'+i);
putchar('\n');



... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


4. Re: Mudar numeração de numeros para letras

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 17/09/2019 - 09:16h

Por amor à concisão:

#include <stdio.h>
int main(void)
{
for(int i=65; i<91; printf("%c\n",i++));
}



5. Re: Mudar numeração de numeros para letras

Paulo
paulo1205

(usa Ubuntu)

Enviado em 19/09/2019 - 22:38h

DeuRuimDotCom escreveu:

Por amor à concisão:
#include <stdio.h>
int main(void)
{
for(int i=65; i<91; printf("%c\n",i++));
}


Um problema com o código acima é que ele assume ASCII. Possivelmente mais de 99,999% das máquinas que rodam alguma versão de C usam ASCII ou alguma extensão cujos primeiros 128 caracteres sejam compatíveis com ASCII, mas é teoricamente possível que o programa em C execute em uma máquina com algum outro conjunto de caracteres não compatível (EBCDIC, PETSCII e outras coisas possivelmente ainda mais exóticas aos nossos olhos).

Desse modo, seria mais seguro escrever o programa mais ou menos da seguinte forma, sem perder muito da concisão que você deseja.

#include <stdio.h>
int main(void){
for(int i='A'; i<'Z'; i++) printf("%c\n",i);
}


Entretanto, dá para ser mais exótico nesses supostos 0,001%. O EBCDIC, por exemplo, só ocupa com caracteres alfabéticos não acentuados posições representáveis como BCD, e mesmo assim apenas aquelas em que o dígito das unidades (quatro bits menos significativos) vai de 1 a 9, podendo existir um intervalo de sete ou oito de caracteres não-alfabéticos ou indefinidos entre duas letras consecutivas. Para uma máquina assim, o código acima teria de ser um pouco mais elaborado.

#include <stdio.h>
#include <ctype.h>

int main(void){
for(int i='A'; i<'Z'; ++i)
if(isalpha(i))
printf("%c\n",i);
}


Mas dá para ser ainda um pouco mais generalista, lembrando que nada no padrão do C exige que caracteres representando letras ocupem posições consecutivas na tabela de símbolos, segundo a mesma ordem em que aparecem no alfabeto. Então a forma mais geral do programa, que ajuda até no caso do EBCDIC, é parecida com algo que o próprio autor da pergunta original sugeriu.

#include <stdio.h>

const char alfabeto[]={
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
};

int main(void){
for(char *p=alfabeto; p<alfabeto+sizeof alfabeto; ++p)
printf("%c\n", *p);
}



... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


6. Re: Mudar numeração de numeros para letras

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 20/09/2019 - 10:06h

Sempre bom conhecer as exceções, mas essas ainda vigoram? Quero dizer, corre-se o risco de topar com elas em algum trabalho nos dias de hoje? (Pergunto a título de curiosidade apenas.)
[Edição:] Outra questão que aventei, agora não apenas a título de curiosidade: como ficam, por ex., funções de conversão de tipo diante dessas exceções?

E já que tocou no assunto da generalidade, outra coisa que vislumbrei aqui é que me parece haver implementações que não aceitam reduzir escopo de variável em bloco que não seja o construtivo de uma função, de modo que a declaração da variável incremental, em relação a essas, deveria ter sido feita no início da main e não no corpo do loop-for.


7. Re: Mudar numeração de numeros para letras

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/09/2019 - 14:33h

DeuRuimDotCom escreveu:

Sempre bom conhecer as exceções, mas essas ainda vigoram? Quero dizer, corre-se o risco de topar com elas em algum trabalho nos dias de hoje? (Pergunto a título de curiosidade apenas.)


Mainframes da IBM e produtos relacionados ainda usam EBCDIC nativamente. Eu não consegui descobrir se o XL C/C++ para z/OS, que é o compilador C e C++ oferecido pela IBM
para seus mainframes atuais, usa EBCDIC nativamente ou se é apenas capaz de interagir com ele por meio de camadas de conversão, até porque é difícil encontrar referências ao XL C/C++ que não incluam menções ao subsistema do z/OS de compatibilidade com UNIX. Um dos sites da IBM que menciona o produto (https://www-01.ibm.com/common/ssi/cgi-bin/ssialias?infotype=AN&subtype=CA&htmlfid=897/ENUS21...) diz o seguinte.

The z/OS XL C/C++ V2.3.1 compiler supports English messages and EBCDIC and ASCII execution character sets, and generates AMODE 64 code, making it ideal for z/OS UNIX users porting applications from distributed platforms.


Na outra ponta do espectro, como eu mesmo mencionei PETSCII, existem comunidades de entusiastas que procuram manter vivos seus computadores antigos, inclusive produzindo novo software e novo hardware para eles ou a partir deles, bem como emuladores desses computadores. Eu costumo assistir a alguns canais no YouTube de retro computing, e boa parte do material que se produz é sobre Commodore 64, que é uma máquina que usa PETSCII. Eu não sei o quanto essa comunidade usa C — não apenas porque usar C não seria considerado retro por alguns de seus membros, embora a linguagem em si seja mais antiga do que seus computadores, mas também porque processadores antigos, tais como o 6502 do C64, Apple II e Atari, ou mesmo o Z80 do CP/M, TRS-80 e MSX, não oferecem recursos muito amigáveis para conversão de programas em C — mas produtos como o cc65 (https://cc65.github.io/) estão disponíveis para criar código para essas máquinas, e existem desenvolvedores que usam compiladores como esse.

[Edição:] Outra questão que aventei, agora não apenas a título de curiosidade: como ficam, por ex., funções de conversão de tipo diante dessas exceções?


Quais funções de conversão de tipos? strtol() e semelhantes?

E já que tocou no assunto da generalidade, outra coisa que vislumbrei aqui é que me parece haver implementações que não aceitam reduzir escopo de variável em bloco que não seja o construtivo de uma função, de modo que a declaração da variável incremental, em relação a essas, deveria ter sido feita no início da main e não no corpo do loop-for.


Isso é questão de versão do padrão do C. O C89/C90 e implementações anteriores a esse padrão de fato só aceitam declarações de variáveis no início de um bloco (não necessariamente apenas o bloco da função, mas os de condicionais e laços de repetição também), mas os mais novos permitem declarações dentro dos parênteses do for e intercalados com comandos dentro do bloco. Nesse caso, portanto, não é exatamente uma questão de conformidade entre plataformas distintas, mas entre versões de padrões suportados.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


8. Re: Mudar numeração de numeros para letras

José
DeuRuimDotCom

(usa Linux Mint)

Enviado em 21/09/2019 - 19:28h

paulo1205 escreveu:
Mainframes da IBM e produtos relacionados ainda usam EBCDIC nativamente. Eu não consegui descobrir se o XL C/C++ para z/OS, que é o compilador C e C++ oferecido pela IBM
para seus mainframes atuais, usa EBCDIC nativamente ou se é apenas capaz de interagir com ele por meio de camadas de conversão, até porque é difícil encontrar referências ao XL C/C++ que não incluam menções ao subsistema do z/OS de compatibilidade com UNIX. Um dos sites da IBM que menciona o produto (https://www-01.ibm.com/common/ssi/cgi-bin/ssialias?infotype=AN&subtype=CA&htmlfid=897/ENUS21...) diz o seguinte.

The z/OS XL C/C++ V2.3.1 compiler supports English messages and EBCDIC and ASCII execution character sets, and generates AMODE 64 code, making it ideal for z/OS UNIX users porting applications from distributed platforms.


Na outra ponta do espectro, como eu mesmo mencionei PETSCII, existem comunidades de entusiastas que procuram manter vivos seus computadores antigos, inclusive produzindo novo software e novo hardware para eles ou a partir deles, bem como emuladores desses computadores. Eu costumo assistir a alguns canais no YouTube de retro computing, e boa parte do material que se produz é sobre Commodore 64, que é uma máquina que usa PETSCII. Eu não sei o quanto essa comunidade usa C — não apenas porque usar C não seria considerado retro por alguns de seus membros, embora a linguagem em si seja mais antiga do que seus computadores, mas também porque processadores antigos, tais como o 6502 do C64, Apple II e Atari, ou mesmo o Z80 do CP/M, TRS-80 e MSX, não oferecem recursos muito amigáveis para conversão de programas em C — mas produtos como o cc65 (https://cc65.github.io/) estão disponíveis para criar código para essas máquinas, e existem desenvolvedores que usam compiladores como esse.

Nossa, é todo um universo mesmo. Sempre quando leio ou ouço Atari me vem à cabeça o filme Blade Runner rsrs, mas nunca tive a felicidade de ter algo dela diante de mim, nem o antigo video game...

paulo1205 escreveu:
Isso é questão de versão do padrão do C. O C89/C90 e implementações anteriores a esse padrão de fato só aceitam declarações de variáveis no início de um bloco (não necessariamente apenas o bloco da função, mas os de condicionais e laços de repetição também), mas os mais novos permitem declarações dentro dos parênteses do for e intercalados com comandos dentro do bloco. Nesse caso, portanto, não é exatamente uma questão de conformidade entre plataformas distintas, mas entre versões de padrões suportados.

Sim, sim. É que ainda hoje parece que se usam ferramentas, descontinuadas é verdade, nesses padrões antigos, como o Dev-C++ ou o Turbo C.

paulo1205 escreveu:
Quais funções de conversão de tipos? strtol() e semelhantes?

Pequei por metonímia, em meu questionamento. É o seguinte: Quando comecei a aprender C, lembro que fiz vários exercícios que demandavam escritura de código de conversão de strings "numéricas" para tipos numéricos e sempre solucionava-os com uso da tabela ASCII. Daí me veio à mente, quando o senhor aludiu a essas plataformas não-ASCII, que muitas dessas funções de conversão de bibliotecas conhecidas - strtol(), inclusive - poderiam nelas falhar, caso se baseassem em ASCII. Pensando rapidamente aqui, não saberia dizer como implementar conversões de tipo sem recurso a essas tabelas de representação de caracteres alfanuméricos, pelo menos no contexto da linguagem C. Mas reconheço que pode ser mera ignorância minha.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts