Executando verificação de segurança...
3

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;
}
Carregando publicação patrocinada...
2

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 para setlocale(LC_CTYPE, "Portuguese") e use pontos como separador de valores decimais na entrada. A diferença deste para o anterior é que usar a macro LC_CTYPE indica a setlocale para alterar apenas as funções que lidam com caracteres, ao invés de LC_ALL que altera todas as propriedades de localidade possíveis (incluindo LC_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.

1

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;

}

1

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)