Me ajudem, problema ao criar um programa simples em C
estou aprendendo C e estou tentando criar um programa simples, ele funciona desta forma:
O programa pergunta seu nome, sobrenome, idade e altura e depois o programa fica la, parado com as informações. É SIMPLES, mas começou a dá vários problemas.
Na altura eu coloco 1.33, 1.88. 2.44 e etc mas o programa apenas lê 1.00, já troquei a formatação e com base no que eu estudei %d significa valores inteiros, já %s é string, %f é float e %.2f significa um float com duas casa decimais. A IA (Gemini, ChatGPT) insiste em colocar %d na altura, ao meu ver, está claramente errado. Nem sei se eu escrevi corretamente as coisas, me irritei bastante tentando fazer isso mas vou deixar aqui os dois código, o meu código e o código das IA
Meu Código:
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
int main(){
setlocale(LC_ALL, "Portuguese");
system("chcp 65001");
char nome[50];
char sobrenome[50];
int idade;
float altura;
printf("Digite seu nome: ");
scanf("%s", nome);
printf("Digite seu sobrenome: ");
scanf("%s", sobrenome);
printf("Qual é a sua idade? ");
scanf("%d", &idade);
printf("Qual é a sua altura? ");
scanf("%f", &altura);
printf("\nNome: %s\nSobrenome: %s\nIdade: %.2f\nAltura: %.2f\n", nome, sobrenome, idade, altura);
while (1);
return 0;
}
Código das IA:
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
int main(){
setlocale(LC_ALL, "Portuguese");
system("chcp 65001");
char nome[50];
char sobrenome[50];
int idade;
float altura;
printf("Digite seu nome: ");
scanf("%s", nome);
printf("Digite seu sobrenome: ");
scanf("%s", sobrenome);
printf("Qual é a sua idade? ");
scanf("%d", &idade);
printf("Qual é a sua altura? ");
scanf("%f", &altura);
printf("\nNome: %s\nSobrenome: %s\nIdade: %.2f\nAltura: %.2f\n", nome, sobrenome, idade, altura);
return 0;
}
Percebi que está usando Windows, como uso um sistema Linux é difícil reproduzir um ambiente parecido, mas usando Wine, (uma camada de compatibilidade para executar programas Windows no Linux) e o MinGW para compilar o código para o executável PE (utilizado no Windows) consegui reproduzir o comportamento que você relata.
Dado a função:
setlocale(LC_ALL, "Portuguese");
O problema está na entrada "1.33", "1.88" e "2.44". Você definiu a localidade como "Portuguese", isso altera o comportamento de algumas funções e isso inclui o scanf
, como em português não usamos pontos para separar a parte decimal de sua parte inteira, mas sim vírgulas, o program espera que você entre com "1,33", "1,88" e "2,44". Usar ponto ao invés de vírgula com a localidade alterada vai levar a um comportamento que você não espera. As suas opções são:
- Use vírgula nas entradas de ponto flutuante;
- Remova função
setlocale
e use pontos como separador de valores decimais na entrada, o que te levará a problemas com caracteres acentuados (o CMD do Windows é uma merda e não usa Unicode por padrão); - Altere
setlocale
parasetlocale(LC_CTYPE, "Portuguese")
e use pontos como separador de valores decimais na entrada. A diferença deste para o anterior é que usar a macroLC_CTYPE
indica asetlocale
para alterar apenas as funções que lidam com caracteres, ao invés deLC_ALL
que altera todas as propriedades de localidade possíveis (incluindoLC_NUMERIC
que é o responsável pelo caractere separador de números decimais), o que resolve o problema de caracteres acentuados sem exigir que você use vírgulas como separador.
E uma dica extra, remova system("chcp 65001")
, a função system
é raramente recomendada, pois mesmo que esteja definida no padrão ISO C, o comando que você passa para ela é dependente do sistema operacional.
Cara a IA não é muita boa de interpretação, as pessoas insistem fala que pode substituir o trabalho de junior(dependendo até pode mas tem que saber ses comunicar bem), mas quando se entrega problemas misturados como computação gráfica com mátematica e tals por exemplo, começa a escrever tudo errado, mas relaxe seu código está bom (eu acho que só botaria um if pra não ser maior que 50 caracteres no nome e sobrenome, pode causar problemas se for maior)
Porque está printando idade como float? pega a idade com o %d Peguei seu código e fiz essa simples modificação, rodei e o resultado foi satisfatório.
#include <stdio.h> #include <locale.h> #include <stdlib.h>
int main(){ setlocale(LC_ALL, "Portuguese"); system("chcp 65001"); char nome[50]; char sobrenome[50]; int idade; float altura;
printf("Digite seu nome: ");
scanf("%s", nome);
printf("Digite seu sobrenome: ");
scanf("%s", sobrenome);
printf("Qual é a sua idade? ");
scanf("%d", &idade);
printf("Qual é a sua altura? ");
scanf("%f", &altura);
printf("\nNome: %s\nSobrenome: %s\nIdade: %d\nAltura: %.2f\n", nome, sobrenome, idade, altura);
return 0;
}