Outros detalhezinhos...

Outros detalhezinhos...

by Rebeca Bayeh -
Number of replies: 3
Devemos considerar também que o usuário sempre digitará números com 50 ou menos dígitos?

Além disso, que os operadores serão sempre +, -, *, / ou %?

E caso os números comecem com zeros à esquerda (ex: 00001 + 35), devemos eliminá-los na hora de imprimir no arquivo de saída?
In reply to Rebeca Bayeh

Re: Outros detalhezinhos...

by Francisco Reverbel -
"Devemos considerar também que o usuário sempre digitará números com 50 ou menos dígitos?"

Sim.

"Além disso, que os operadores serão sempre +, -, *, / ou %?"

Sim.

"E caso os números comecem com zeros à esquerda (ex: 00001 + 35), devemos eliminá-los na hora de imprimir no arquivo de saída?"

Os zeros à esquerda não devem aparecer no arquivo de saída, mas a eliminação desses zeros deve ser feita antes da impressão. Elimine os zeros à esquerda quando você converter a sequência de dígitos em "inteiro grande". Assim, mesmo que o "inteiro grande" 7 tenha aparecido na entrada como "007", ele tem comprimento (número de dígitos) 1 e deve ocupar só duas posições do vetor de ints: a primeira com as informações de sinal e número de dígitos (que deve ser 1 e não 3) e a segunda com o primeiro (e único) dígito do "inteiro grande".
In reply to Francisco Reverbel

Re: Outros detalhezinhos...

by Kaonan Micadei -
No caso do usuário digitar um número com mais de 50 dígitos, que tipo de aviso deve retornar? Overflow mesmo? A leitura deve prosseguir?
In reply to Kaonan Micadei

Re: Outros detalhezinhos...

by Francisco Reverbel -
Como nossa hipótese é que o usuário não digitará números com mais de 50 dígitos, o comportamento do programa no caso (que não precisa ser tratado neste EP) da entrada conter algum número com mais de 50 dígitos fica inteiramente a seu critério. Claro que o mais fácil é deixar o programa explodir, possivelmente com um segmentation fault.

Uma decisão mais razoável é apresentar uma mensagem de erro (algo como "Entrada inválida: número com mais de 50 dígitos") e encerrar a execução do programa. Outra possibilidade é apresentar a mensagem de erro, descartar o restante da linha na qual apareceu o número comprido demais e continuar a execução do programa, tratando a próxima linha da entrada.

Para fazer qualquer uma dessas coisas razoáveis (que não são obrigatórias neste EP) você não pode usar fscanf(entrada, "%s" , ...) para ler as strings contendo os números digitados, pois alguma dessas strings pode ter comprimento maior que o vetor no qual você pediu que o fscanf a colocasse... (Taí um jeito de tomar segmentation fault!) Tem que ler caractere a caractere mesmo, como o enunciado sugere, ou então usar uma função como fgets para ler a linha toda até um comprimento máximo especificado.