iagoac / mc202

Disciplina MC202 - Estruturas de Dados
GNU General Public License v3.0
17 stars 13 forks source link

função atoi() #80

Closed Lublanski closed 3 years ago

Lublanski commented 4 years ago

Professor, estou usando a função atoi para transformar a string em um int, mas parece que ele só aguenta 10 casas decimas, e tem testes com mais casas do que isso, ai a saida sai incorreta, posso printar como string mesmo?

passarellafelipe commented 4 years ago

Eu tive o mesmo problema #77 . Acredito que alguns números acabam sendo maiores do que cabe num int, portando usei a função atol(), que em vez de int, converte para long int.

Lublanski commented 4 years ago

Boa meu bom deu certo. Tmj

iagoac commented 4 years ago

@Lublanski @DarthFelpa um long long int armazed=na um número até 10²¹.
Notem que a maior entrada possível do lab é um número de tamanho 10²² e, portanto, não cabe nem mesmo em um long long int (que é a maior representação possível de um inteiro positivo em C).

Lublanski commented 4 years ago

professor, eu utilizei a função atol(), e conseguiu armazenar o número. O problema era que a função atoi(), descrita no lab, não funciona pq tem limite de um número com 10¹⁰. A função atol() funciona pq tem um limite maior, e nos testes mesmo uma entrada grande como 10²², o número k pede para tirar vários digitos, diminuindo esse número. Mas voltando ao lab, ficou muito confuso o jeito da saida, pq no próprio lab falou que temos que receber um inteiro e a saída deve ser um inteirto também, mas se um long long int não aguenta o número de casas, deveríamos printar como string, e se temos que printar como string, a saída não é um inteiro e sim uma string. Foi isso que ficou confuso, pelo menos para mim.

iagoac commented 4 years ago

Ambos são números que estão no domínio dos inteiros (um número que pode ser escrito sem seu componente fatorial).
A representação computacional deles é outra história

A minha solução inicial para este problema envolvia representar cada char da string de entrada em um inteiro de um único dígito e armazenar estes em uma pilha. A solução do problema viria facilmente sobre operações nesta pilha criada. Deste modo, somente a função atoi seria utilizada.

Lublanski commented 4 years ago

Entendi. É porque, quando fiz 102, tinha alguns labs que mesmo quando a saída era um número, mas este era uma string, o lab dizia que a saída era uma string. Quem printasse um int na saída passava no susy mas quando o professor corrigia ele descontava nota. Por isso a minha dúvida.

iagoac commented 4 years ago

A minha filosofia é um pouco diferente. Desde que vocês saibam processar corretamente a entrada e transformar em uma saída legível no formato pedido, eu realmente não me importo com o tipo de variável da saída (int, double, float, string, etc).
O importante é que todos aprendam as etapas necessárias para transformar o input dado no output desejado e as estruturas de dados utilizadas neste processo.

Lublanski commented 4 years ago

Entendi professor. Obrigado

enoque commented 4 years ago

Você pode obter o valor inteiro que o "char numérico" representa subtraindo o valor do char '0'. Por exemplo, se tu tem um char c = '5' ; e quer transformar esse valor para inteiro, basta atribuir int x = c - '0';

Acho que já tá meio tarde para falar isso, mas caso você não sabia, fica a dica ai tbm :)

enoque commented 4 years ago

Note que sabendo essa informação, fazer sua própria função "atoi(x)" se torna bem fácil (caso não ache isso, recomendo tentar para treinar um pouco).