Ir ao conteúdo
  • Cadastre-se

Caractere correspondente em maiúsculo/minúsculo. Linguagem C.


Washing7on

Posts recomendados

Pessoal,

Embora seja feriado (aliás, bom feriado a todos =D),

eu estava fazendo um exercício que a minha professora de C passou, é bem simples, mas em alguma parte do código a minha lógica provavelmente está errada, e eu não sei qual é essa parte.

O exercício é o seguinte: Usando macros, e sem usar a tabela ASCII, transformar um caractere lido em seu correspondente maiúsculo/minúsculo.

>

A professora pediu para fazer as quatro macros (eh_minuscula, eh_maiuscula, minuscula e maiuscula) e usá-las para resolver o problema.

>

Eu primeiro fiz um programa para saber a distância de 'A' até 'a', o que deu -32.

Partindo desse número (32) eu fiz as macros(maiuscula e minuscula) e as condições para executá-las.

>

>

Eu digito 'a' e vira 'A' ----- Transformação para maiúscula correta

Mas, se eu digito uma letra maiuscula, ele aparece um caractere que não tem nada a ver.

>

Se alguém conseguir me ajudar, eu agradeço muito... Segue meu código:


# include <conio.h>
# include <stdio.h>
# define eh_minuscula(a) (a>='a')&&(a<='z')?1:0
# define eh_maiuscula( (b>='A')&&(b<='Z')?1:0
# define minuscula(c) eh_minuscula(c)==0?(c+32):(c)
# define maiuscula(d) eh_maiuscula(d)==0?(d-32):(d)

main()
{

char x, y;
printf("Entre um caractere: ");
scanf("%c", &x);
if (eh_minuscula(x)==0){
y = minuscula(x);
}
if (eh_maiuscula(x)==0){
y = maiuscula(x);
}
printf("\n\n\n%c --->> %c", x, y);
getch();

}

Link para o comentário
Compartilhar em outros sites

Desculpa aí, fazer pra você. Mas acho que é assim que se resolve:


# include <stdio.h>
# define eh_minuscula(a) (a>='a')&&(a<='z')?1:0
# define eh_maiuscula( (b>='A')&&(b<='Z')?1:0
# define minuscula(c) (char)((int)(c) + 32)
# define maiuscula(d) (char)((int)(d) - 32)

main()
{

char x, y;
printf("Entre um caractere: ");
scanf("%c", &x);
if (eh_minuscula(x)){
y = maiuscula(x);
}
if (eh_maiuscula(x)){
y = minuscula(x);
}
printf("\n\n\n%c --->> %c", x, y);

}

Link para o comentário
Compartilhar em outros sites

Deadrools, boa noite

Funcionou perfeitamente,

Eu estou conhecendo a linguagem C agora e eu só não entendi muito bem como funciona as macros (maiuscula e minuscula) que você fez.

Você colocou:


# define minuscula(c) (char)((int)(c) + 32)
# define maiuscula(d) (char)((int)(d) - 32)

É uma conversão de char para int ?

Link para o comentário
Compartilhar em outros sites

Não foi isso que resolveu o problema do seu código mas, sim, é uma conversão de tipos, se chama type casting dê uma pesquisada, é importante em alguns casos.

Mas o problema do seu código é que você provavelmente não entendeu como funcionam as macros.

A macro na verdade não passa de um texto que será substituído no seu código fonte na hora da compilação.

Então olha essa macro que você fez, por exemplo:

# define eh_minuscula(a) (a>='a')&&(a<='z')?1:0

Tem uma ocorrência dela nessa parte do seu código:


if (eh_minuscula(x)==0){
y = minuscula(x);
}

O compilador faz isso com seu código na hora que ele vai compilar:


if ((x>='a')&&(x<='z')?1:0==0){
y = minuscula(x);
}

Dando uma analisada rápida esse if sempre vai encontrar true(1) e vai executar o código dentro dele, indenpendente da letra ser maiuscula ou não. A mesma coisa no if de baixo:


if ((x>='A')&&(x<='Z')?1:0==0){
y = maiuscula(x);

Essa condição sempre vai dar true, e o que vai acontecer...


if ((x>='A')&&(x<='Z')?1:0==0){
y = eh_maiuscula(x)==0?(d-32):(d);

Substituindo a macro eh_maiuscula:


if ((x>='A')&&(x<='Z')?1:0==0){
y = (x>='A')&&(x<='Z')?1:0==0?(d-32):(d);

Até desisti de tentar entender o que essa parte faz, mas provavelmente o resultado não vai ser o que você esperava

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...