Jump to content
Gurzi

[Resolvido] Maisculas

Recommended Posts

Gurzi

#include <stdio.h>
#include <stdlib.h>

main()
{
char ch;

printf("Introduza um caracter");
scanf("%c",&ch);
ch =ch -'A' + 'a';
printf("%c",ch);
}

porque é que o resultado final me aparece simbolos mta marados  ? em vez de a letra em maiscula ?

Share this post


Link to post
Share on other sites
saramgsilva

#include <stdio.h>
#include <stdlib.h>

main()
{
char ch;

printf("Introduza um caracter");
scanf("%c",&ch);
ch =ch -'A' + 'a';
printf("%c",ch);
}

porque é que o resultado final me aparece simbolos mta marados  ? em vez de a letra em maiscula ?

existe numa biblioteca do C, uma funcao para passar as letras para maisculas...  isso pode dar mal, por estares a fazer mal as "contas..." vai a tabela de ASCII o numero de cada char...e ve o que andas a fazer... de mal  :dontgetit:

Share this post


Link to post
Share on other sites
Cavaleiro

Essa é uma das maneiras de fazeres, mas caso não consigas meter a funcionar dessa maneira tenta usar um if, como se sabe a diferença de caracteres entre o 'a' e 'A' é 32, julgo que não estou enganado mas nada melhor como verificares na ASCII table, e depois juntas ou retirar 32 para obteres ou maiuscula ou minuscula, consoante tu desejares.


Practice Makes Perfection.Personal Website: cavaleiro.orgPersonal Blog: cavaleiro.blogTechDev Blog: cavaleiro.techdev

Share this post


Link to post
Share on other sites
redhat

Ja' ontem tinha passado pelo topico, lembrei-me na altura de como se podia resolver!

A minha soluçao seria:

#include <stdio.h>

main()
{
        char ch;
        int aux;

        printf("Introduza um caracter: ");
        scanf(" %c", &ch);
        aux = (int)ch - 32;
        printf("%c\n",(char)aux);
}

Codigo qual gerou o resultado:

LappyG4:~/P@P/maiusculas jmf$ gcc maiusculas.c 
LappyG4:~/P@P/maiusculas jmf$ ./a.out 
Introduza um caracter: a
A

Espero ter ajudado!!

Um abraço


Software is like sex... it's better when it's free

in the old days

P@P "C" && "Linux" Moderator

Share this post


Link to post
Share on other sites
redhat

pois, tens razao, nem reparei (e' a mania de ler o primeiro post, e tentar tirar a duvida)

neste caso usei a capacidade de fazer cast as variaveis!! muito util no caso de alguns mallocs e afins!

falta o gurzi dizer se e' realmente isto que ele queria =)

outro abraço


Software is like sex... it's better when it's free

in the old days

P@P "C" && "Linux" Moderator

Share this post


Link to post
Share on other sites
theproject

Boas, em vez de fazeres essa conta esquesita com a diferenca entre os códigos ASCII , as boas prácticas de programacaop dizem-te k deves chamar uma função para fazer isso. Como a tofas disse essa funcao existe e depois de passar uma beka a ver se me lembrava kual era, finalmente consegui, é a funcao int toupper(int c);

Esta funcao existe pelo menos em ambientes Unix/Linux, nao te eskecas k tens de meter o #include <ctype.h>

No teu caso deves usá-la assim :

ch = (char)toupper( (int)ch );

Fika bem

Share this post


Link to post
Share on other sites
entering

Ja' ontem tinha passado pelo topico, lembrei-me na altura de como se podia resolver!

A minha soluçao seria:

#include <stdio.h>

main()
{
        char ch;
        int aux;

        printf("Introduza um caracter: ");
        scanf(" %c", &ch);
        aux = (int)ch - 32;
        printf("%c\n",(char)aux);
}

Codigo qual gerou o resultado:

LappyG4:~/P@P/maiusculas jmf$ gcc maiusculas.c 
LappyG4:~/P@P/maiusculas jmf$ ./a.out 
Introduza um caracter: a
A

Espero ter ajudado!!

Um abraço

eu disse que a solução passava por declarar a variavel como int!

Não necessariamente a soluçao ideal foi dada pelo theproject :)

Mas se nao quiserem usar essa função a soluçao do redhat serve embora possa ser melhorada aquela declaração da variavel inteira é um gasto de memoria desnecessario (tudo bem sao apenas 2 bytes, mas em programas grandes se por cada var que precissamos usasse duas era um bocado mau).

Se usas o gcc deves também sempre compilar com a flag -Wall

$ gcc -Wall redhat-maiscula.c

redhat-maiscula.c:4: warning: return type defaults to `int'

redhat-maiscula.c: In function `main':

redhat-maiscula.c:12: warning: control reaches end of non-void function

Possivel solução

#include <stdio.h>

int main (void) {

  char ch;

  printf("Introduza um caracter: ");

  scanf("%c", &ch);

  printf("%c\n",(int)ch - 32);

  return (0);

}

Apenas se usa uma var

Embora mais correcta ainda nao esta completamente correcta

Na minha opinião deve ser feita uma verificação ao input, ou seja se esta entre a-z (minusculo).

Embora nao seja obrigatorio.

Seria algo do genero:

#include <stdio.h>

#include <stdlib.h>

int main (void) {

  char ch;

  printf("Introduza um caracter: ");

  scanf("%c", &ch);

  if (((int)ch<97) || ((int)ch>122)) {

    fprintf (stderr,"Erro - Caracter invalido.\n");

    exit (EXIT_FAILURE);

  }

  printf("%c\n",(int)ch - 32);

  return (0);

}

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

×
×
  • Create New...

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.