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

Gurzi

[Resolvido] Maisculas

11 mensagens neste tópico

#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 ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#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:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Declara ch como int e converte depois para char no output. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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);

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora