Uma forma bastante popular de entrada de dados é a leitura indefinida de valores, tendo como critério de parada dessas entradas a ocorrência de valores zero. Esse tipo de entrada pode ser encontrado na questão Temperatura Lunar [OBI 2002].
A entrada pode ser simplificada como:
- A entrada é composta de vários conjuntos de teste.
- A primeira linha de um conjunto de teste contém dois números inteiros positivos N (0 ≤ N ≤ 10000) e M (1 ≤ M ≤ N), que indicam respectivamente […].
- As N linhas seguintes contêm […].
- O final da entrada é indicado quando N = M = 0.
O código para essa entrada pode ser facilmente escrito como a seguir.
int main() {
int n, m;
scanf("%d %d", &n, &m);
while (n > 0) {
//Faz o que é necessário
scanf("%d %d", &n, &m);
}
return 0;
}
Embora a condição seja interromper a leitura de entradas quando forem fornecidos os valores zero, veja que na condição do while eu utilizei n > 0 e não n != 0. Isso porque o enunciado indicou que somente valores positivos serão informados e escrever o símbolo de maior exige apenas um caractere, enquanto o símbolo de diferente requer dois caracteres (sem contar que a pressa pode fazer você escrever =! e perder mais um tempo para encontrar esse erro).
Veja também que, embora o enunciado diga que a condição de parada seja serem fornecidos dois valores zero, eu não utilizei n > 0 && m > 0. Como foi dito no enunciado que M será maior ou igual a 1 (1 ≤ M), então quando m for zero é porque é para parar (e tanto fazia testar o zero na variável n ou m).
Com isso, o código pode ser simplificado para:
int main() {
int n, m;
while (scanf("%d %d", &n, &m) == 2 && n > 0) {
// Faz o que é necessário
}
return 0;
}
Basicamente eu removi as linhas 4 e 9 e fiz o scanf dentro do while a partir da instrução scanf(“%d %d”, &n, &m) == 2. O valor de retorno da função scanf é o número de elementos lidos com sucesso e por isso o teste de igualdade feito. também utilizei o operador lógico de conjunção (&&) para manter a condição que já tinha anteriormente.
Foi uma pequena dica, mas ela também ajuda a ter um maior domínio da função scanf.