Oi pessoal! Esse código entra em loop infinito e não consigo identificar o motivo.Alguém pode me ajudar?

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<locale.h>

main() {
	setlocale(LC_ALL, "Portuguese");
	float alt = 1, alu = 1, maior, soma = 0, menor, qt = 0;
	
	while (alt != 0) {
		printf("Digite a altura do aluno %.0f", alu);
		scanf("%f", &alt);
		
		if (alt != 0) {
			alu = alu + 1;
			
			if (alu == 2) {
				maior = alt;
				menor=alt;
			} else {}

			if (alt > maior) {
				maior = alt;
			} else {}
			
			if (alt < menor) {
				menor = alt;
			} else {}
			
			soma = soma + alt;
			
			if (alt > 1.70) {
				qt = qt + 1;
			} else {}
		} else {
			printf("\nLEITURA FINALIZADA");
		}
	}

	printf("\nMaior altura=%.2f\nMenor altura=%.2f\nMedia de altura=%.2f\nAlunos maiores que 1.7m=%.0f", maior, menor, soma / (alu - 1), qt);
	
	getchar();
	system("pause");
	printf("\n\n");
	
	return(0);
}

Testei aqui e não entrou em loop. Quais valores vc digitou? Reparou que o while só vai parar se altura for zero? Então se digitar qualquer outro valor, o loop continua. Ele entrou em loop mesmo digitando zero?

Outra coisa, else {} é desnecessário. Se não vai fazer nada no else, não tem porque colocá-lo.

fiz o código seguindo um curso do youtube.A intenção é justamente a leitura de valores ser interrompida quando a variável “alt” receber o valor zero.Quando testo ele entra em loop com qualquer valor além de zero e que for em float. Testei com valores inteiros e não de problema só que não posso alterar o tipo da variável justamente por ela exigir a altura das pessoas, q é em float. Sobre o else{} o cara do curso falou que serve pra tipo “encerrar” o if{, já q não vai ter nada nesses else{}. Tem como corrigir o negócio de o código entrar em loop qnd digito valores em float?

Testei aqui e não entra em loop. Digitei valores como 1.8 e 2, entre outros, e funciona normalmente. E quando digito zero (seja 0 ou 0.0), ele sai do while, como esperado.

Como eu entendi que vc ainda está aprendendo, existe a possibilidade de vc ter entendido errado - sem ofensa, isso é perfeitamente normal durante o aprendizado. Mas se isso foi realmente dito, então fuja desse curso. Um else vazio é inútil, não faz sentido nenhum essa justificativa.

Se vc tiver isso:

if (algo) {
    faz_algo();
} else {}

É exatamente o mesmo que isso:

if (algo) {
    faz_algo();
}

Só que a segunda opção não tem código desnecessário. O } já encerra o if, não precisa de mais nada pra encerrá-lo. Se não vai fazer nada no else, simplesmente não coloque-o no código.


Aproveitando, não tem porque usar nomes abreviados, prefira usar nomes mais claros. Pode parecer bobagem, mas nomes melhores ajudam muito.

E as quantidades podem muito bem ser int, já que não vai ter “2,4 alunos”. Já os valores da altura devem continuar float. Sugestão:

float maior, menor, soma = 0;
int aluno = 0, qtdMaiores170 = 0;
while (1) {
    printf("Digite a altura do aluno %d: ", aluno + 1);
    float altura;
    scanf("%f", &altura);
    if (altura == 0) {
        printf("\nLEITURA FINALIZADA");
        break; // sai do while
    }

    if (aluno == 0) {
        maior = menor = altura;
    }
    if (altura > maior) {
        maior = altura;
    }
    if (altura < menor) {
        menor = altura;
    }
    if (altura > 1.70) {
        qtdMaiores170++;
    }
    soma += altura;
    aluno++;
}

printf("\nMaior altura=%.2f\nMenor altura=%.2f\nMedia de altura=%.2f\nAlunos maiores que 1.7m=%d\n", maior, menor, soma / aluno, qtdMaiores170);

Veja aqui como ele não entra em loop e se encerra quando digita-se zero.