Boa noite a todos, estava fazendo um simples programa no Code Blocks para calcular o IMC (Índice de Massa Corporal) e até aí tudo bem, só que quis incrementar um pouco o programa usando a biblioteca locale.h para aceitar os acentos da língua portuguesa e não entendi o porque está dando erro.
Usando o setlocale (LC_ALL, ""), após digitar a altura o programa pula para os próximos 'printf's' e termina (como se o buffer estivesse cheio). Gostaria de saber o motivo.
Sem setlocale, tudo certo:
[Code=C]
#include
#include // para usar função POW
#include
#define LIMITE 30 //Limite do IMC - Se o IMC for maior que 30 é considerado obeso
int main(){
float altura, peso, imc;
printf("Digite sua altura: \n");
scanf("%f", &altura);
printf ("\nQual é seu peso? \n");
scanf("%f", &peso);
imc=peso/pow(altura,2);
printf("\nSeu IMC é: %2.2f \n\n" , imc);
if (imc<=LIMITE){
printf("\nVocê não é obeso. \n");
}
else printf("\nVocê precisa emagrecer!\n");
getchar();
return 0;
}
[/Code]
Com setlocale:
[Code=C]
#include
#include
#include
#define LIMITE 30 //Limite do IMC - Se o IMC for maior que 30 é considerado obeso
int main(){
setlocale(LC_ALL, "");
float altura, peso, imc;
printf("Digite sua altura: \n");
scanf("%f", &altura);
printf ("\nQual é seu peso? \n");
scanf("%f", &peso);
imc=peso/pow(altura,2);
printf("\nSeu IMC é: %2.2f \n\n" , imc);
if (imc<=LIMITE){
printf("\nVocê não é obeso. \n");
}
else printf ("\nVocê precisa emagrecer!\n");
getchar();
return 0;
}
[/Code]
- Home
- >
- Fórum
- >
- Profissional
- >
- Programação, Sc...
- >
- Linguagem C - Usar "setlo...
Também não consegui entender o porquê disso, mas consegui resolver o problema. Notei que se você colocar setlocale(LC_ALL,"C") ou qualquer outra letra ou palavra, o programa vai correr certo. Então pesquisei um pouco e encontrei este site http://linguagemc.com.br/localizacao-de-programas-com-locale-h/ e lá mostra outra maneira de deixar o programa com a acentuação em Português. O código abaxio já deve funcionar certinho:
[code=C]
#include
#include
#include
#define LIMITE 30 //Limite do IMC - Se o IMC for maior que 30 é considerado obeso
int main(){
setlocale(LC_ALL, "Portuguese");
float altura, peso, imc;
printf("Digite sua altura: \n");
scanf("%f", &altura);
printf ("\nQual é seu peso? \n");
scanf("%f", &peso);
imc=peso/pow(altura,2);
printf("\nSeu IMC é: %2.2f \n\n" , imc);
if (imc<=LIMITE){
printf("\nVocê não é obeso. \n");
}
else printf ("\nVocê precisa emagrecer!\n");
getchar();
return 0;
}
[/code]
Então MtTech, quando imprimo:
printf ("%s" ,setlocale(LC_ALL, ""), a saída é mesmo C e com LC_All, NULL ele mostra Portuguese.Brazil.1252 ( acho que é isso, não sei se é invertido...rs estou no celular e não conferi).
O que não entendi é o porque que ao colocar setlocale após iniciar a função main ele pula meus printf's como se o buffer já estivesse cheio, como se o scanf para ler o " peso " já pegasse algum dado fazendo com que o programa não deixe digitar o peso.
Fábio novato disse: Então MtTech, quando imprimo:
printf ("%s" ,setlocale(LC_ALL, ""), a saída é mesmo C e com LC_All, NULL ele mostra Portuguese.Brazil.1252 ( acho que é isso, não sei se é invertido...rs estou no celular e não conferi).
O que não entendi é o porque que ao colocar setlocale após iniciar a função main ele pula meus printf's como se o buffer já estivesse cheio, como se o scanf para ler o " peso " já pegasse algum dado fazendo com que o programa não deixe digitar o peso.
Mas você já experimentou como eu fiz colocar "Portuguese" é que eu rodei assim e deu na perfeição.
Parte ruim:
Já fiz com de todos os modos que até então tinha pesquisado mas não consegui e não deu certo.
Parte boa:
Esse problema abriu um novo campo de estudo, onde de agora em diante vou ler sobre Unicode, UTF-8 e sei que vai ser mais um passo para meu aprendizado.
Sobre meu programa, resolvi o problema da acentuação usando a tabela ASCII mesmo:
[code=C]#include
#include // biblioteca para usar função POW - potenciação
#define LIMITE 30 //Limite do IMC - Se o IMC for maior que 30 é considerado obeso
int main(){
float altura, peso, imc;
printf("Qual %c sua altura? \n", 130);
scanf("%f%*c", &altura);
printf ("\nQual %c seu peso? \n", 130);
scanf("%f%*c", &peso);
//Acentos em ASCII: letra 'E' agudo (é):130 letra 'E' com circumflexo(ê):136 letra 'A' com til (ã):198
imc=peso/pow(altura,2);
printf("\nSeu IMC %c:\n%2.2f \n" , 130, imc);
if (imc <= LIMITE){
printf("\nVoc%c n%co %c obeso. \n", 136, 198 , 130 );
}
else printf("\nVoc%c precisa emagrecer!\n" , 136);
getchar();
return 0;
}[/code]
Para quem quer saber mais sobre codificação de caracteres, sugiro que leia essa página. Muitos programadores que se dizem experientes talvez se surpreendam com o conteúdo da mesma.
Enfim, só me resta estudar e muito.
Tópico resolvido (ou quase...).
Abraço e obrigado, MtTech.