Dúvida EP1 e problema nos arquivos de entrada

Dúvida EP1 e problema nos arquivos de entrada

por Marlon Ribas Vismari -
Número de respostas: 7
Olá Professor / Monitor.
Os arquivos a seguir apresentam a seguinte mensagem: ¨ You don't have permission to access /~reverbel/mac122-IME-09/eps/ep1/entrada.txt on this server.¨

http://www.ime.usp.br/~reverbel/mac122-IME-09/eps/ep1/entrada.txt
http://www.ime.usp.br/~reverbel/mac122-IME-09/eps/ep1/saida.txt

Dúvidas em relação ao EP:
- A primeira função não ficou clara pra mim professor.

void zera(int num[]);
Coloca no vetor num o "inteiro grande" 0 (zero).

A impressão que tive ao ler isso é que precisaria colocar o número 0 em arial 36 no vetor (rsrs). Como colocar o número no vetor se não foi passado o argumento N?


- ¨int soma(int num1[], int num2[], int res[]);
Soma o "inteiro grande" armazenado no vetor num1 com o armazenado no vetor num2. Coloca o resultado (que é outro "inteiro grande") no vetor res. No caso de overflow (estouro da capacidade, ou seja, vai-um quando da soma dos dígitos mais significativos), a função deve devolver o valor 0 (zero). Caso contrário, a função deve devolver o valor 1 (um).
Esta função deve ser implementada por meio de uma chamada à função soma_mesmo_sinal ou à função
soma_sinais_opostos (vide abaixo), dependendo dos sinais dos dois números. ¨

Professor, não estou conseguindo achar a diferença dessas funções. Se já existem 2 funções que fazem a soma de todos casos possíveis, pq uma função int soma?

Obrigado
Marlon
Em resposta à Marlon Ribas Vismari

Re: Dúvida EP1 e problema nos arquivos de entrada

por Kaonan Micadei -
Marlon,

Quanto a função "zera()", os vetores tem tamanhos máximos, você só precisa colocar 0 em todos os campos do vetor.

Minha dúvida é se não seria mais prático guardar os dígitos dos números da direita pra esquerda (o contrário do que está no enunciado do ep)? Ficaria mais fácil de implementar as funções como a de soma.

Outra coisa, é permitido usar outras bibliotecas além da stdio.h e stdlib.h, como string.h?

Obrigado
Kaonan
Em resposta à Kaonan Micadei

Re: Dúvida EP1 e problema nos arquivos de entrada

por Francisco Reverbel -
Kaonan,

A função zera deve zerar apenas a primeira posição do vetor.

O principal motivo para guardar os dígitos dos números começando pelo menos significativo é que esse formato de armazenamento é o mais adequado no caso mais realista em que os vetores de dígitos são alocados dinâmicamente e não têm comprimento fixo. Note que neste EP todo "inteiro grande" usa um vetor de MAX_DIGITOS+1 ints, mesmo que ele tenha poucos dígitos. Note também que há um limite (MAX_DIGITOS) sobre o número de dígitos dos inteiros grandes. Essas restrições podem ser removidas fazendo alocação dinâmica dos vetores de dígitos (veremos em classe como se pode fazer isso -- é o nosso próximo assunto em MAC0122), de modo que cada vetor tenha exatamente o comprimento necessário para conter um certo "inteiro grande".

E por que nesse caso é melhor guardar os dígitos começando pelo menos significativo? Porque os dígitos dos números ficam "emparelhados" adequadamente. Isso facilita as coisas. Os algoritmos usuais para as operações de adição, subtração e multiplicação começam trabalhando com os dígitos menos significativos e depois vão avançando em direção aos dígitos mais significativos. Considere a soma de dois números num1 e num2. Suponha que os números têm o mesmo sinal, ou seja, a soma é uma soma mesmo (não é uma subtração). Você começa somando os dígitos menos significativos dos dois números, depois vai para os dígitos seguintes. Como os dígitos são guardados começando pelo menos significativo, fica fácil localizar os dígitos menos significativos! O dígito menos significativo está sempre na posição 1 do vetor! (A posição 0 tem o sinal e o número de dígitos.) Então você soma num1[1] com num2[1], depois soma num1[2] com num2[2] e com o vai-um da soma dos dígitos anteriores, etc. Se os dígitos estivessem guardados na ordem oposta, os você teria que somar num1[numero_de_digitos_de_num1]com num2[numero_de_digitos_de_num2] (repare que os índices seriam diferentes), depois somar com num1[numero_de_digitos_de_num1 - 1]num2[numero_de_digitos_de_num2 - 2] e com o vai-um da soma dos dígitos menos significativos, etc. Os índices diferentes aparecem porque os dígitos menos significativos não estão "emparelhados".

Quando os vetores de dígitos têm comprimento fixo (como é o caso no EP1), você poderia guardar os dígitos começando pelo mais significativo, e mesmo assim deixar os dígitos emparelhados encostando o número no final do vetor. O dígito menos significativo ficaria sempre na posição MAX_DIGITOS. O problema desse esquema é que ele deixa de funcionar se os vetores de dígitos não tiverem comprimento fixo. E esse caso (vetores de comprimentos variáveis) é o mais realista.

Pelo que eu já disse, deve estar claro que não é verdade que guardar os dígitos começando pelo mais significativo facilita a implementação da operação de soma.

Quanto ao uso de <string.h>, é permitido sim.
Em resposta à Francisco Reverbel

Re: Dúvida EP1 e problema nos arquivos de entrada

por Kaonan Micadei -
Obrigado professor, minha dúvida tinha saido de uma interpretação errada do enunciado.

Grato
Em resposta à Marlon Ribas Vismari

Re: Dúvida EP1 e problema nos arquivos de entrada

por Paulo Nascimento -
Olá Professor / Monitor,

Encontrei o mesmo problema do Marlon.

Os arquivos a seguir apresentam a seguinte mensagem: ¨ You don't have permission to access /~reverbel/mac122-IME-09/eps/ep1/entrada.txt on this server.¨

Outra coisa. Temos que fazer as operações somente nos casos que não causam Overflow? aí a calculadora fica muito limitada.

Não entendi para que serve a função int soma1.

Obrigado

Paulo Nascimento

Em resposta à Paulo Nascimento

Re: Dúvida EP1 e problema nos arquivos de entrada

por Francisco Reverbel -
Olá Paulo,

As permissões dos arquivos foram corrigidas.

No caso de uma soma ou subtração, você detetará que houve overflow só no final da operação, quando estiver somando ou subtraindo os últimos dígitos (os mais significativos). Então a operação já foi feita... Mas a informação de overflow (que é devolvida pela função) significa que o resultado da operação está incorreto, pois faltou espaço para o resultado correto.

O fato do overflow ser possível é uma limitação bem desagradável sim. No nosso próximo assunto em MAC0122, veremos como se poderia alocar dinâmicamente os vetores de dígitos, de modo que cada vetor de dígitos tenha sempre o espaço necessário e suficiente para conter um certo "inteiro grande". Dessa forma nunca poderia ocorrer overflow. Mas neste EP não vamos fazer isso.

A função soma1 é apenas uma função auxiliar. A idéia não é chamá-la do programa principal (a calculadora) e sim de outras funções aritméticas, como a função divide.

Em resposta à Marlon Ribas Vismari

Não temos permissão para ler os arquivos de exemplo

por Luciano Ramalho -
Prof. Reverbel, o problema reportado pelo Marlon ontem ainda continua nos impedindo de acessar os arquivos que exemplificam a entrada e a saída do programa.

O problema ocorre na página:

http://www.ime.usp.br/~reverbel/mac122-IME-09/eps/ep1/

Quando acionamos os links:
http://www.ime.usp.br/~reverbel/mac122-IME-09/eps/ep1/entrada.txt
http://www.ime.usp.br/~reverbel/mac122-IME-09/eps/ep1/saida.txt

obtemos apenas a mensagem de erro:

Forbidden

You don't have permission to access /~reverbel/mac122-IME-09/eps/ep1/saida.txt on this server.

(erro 403)


Grato,

Luciano

Em resposta à Marlon Ribas Vismari

Re: Dúvida EP1 e problema nos arquivos de entrada

por Francisco Reverbel -
Acertei as permissões dos arquivos-exemplo entrada.txt e saida.txt. Agora eles devem estar acessíveis.

A função

void zera(int num[]);

precisa apenas colocar zero em num[0]. Veja a especificação do formato de armazenamento de "inteiros grandes".

Quanto á existência das funções soma_mesmo_sinal, soma_sinais_opostos e soma, pense nas duas primeiras como funções auxiliares que você usará para implementar a função soma. A terceira (a função soma) é que é útil para um programa que precise somar dois números de sinais arbitrários. A idéia é que o programa principal, quando quiser somar dois números, simplesmente chame a função soma, sem precisar se preocupar com os sinais desses números. Internamente a função soma olha os sinais dos números e chama uma das duas funções auxiliares (soma_mesmo_sinal ou soma_sinais_opostos).

Se o EP estivesse pedindo para vocês implementarem uma biblioteca de funções, a função soma faria parte da interface pública da biblioteca. As funções subtrai, multiplica e divide também fariam parte dessa interface, que conteria todas as funções que ficariam disponíveis para os programas usuários da biblioteca. Já funções como soma_mesmo_sinal e soma_sinais_opostos seriam funções internas da biblioteca, que não fariam parte da interface e não seriam acessíveis aos programas usuários da biblioteca.