Ir para conteúdo
Fórum Script Brasil
  • 0

Problema da faculdade


caputofa

Pergunta

Olá, sou novo aqui no forum, e trabalho como dba, faço faculdade de sistemas da informação. Uma das minhas aulas é estrutura de dados, e foi nos pedido um trabalho (na verdade um desafio, seria um extra...), que temos que fazer uma divisão de qualquer numero por qualquer numero > 0, sendo que só se pode utilizar variaveis int e o operador soma (+), eu fiz a parte da divisao, mas ele não esta pegando, obvio, as casas decimais, sei que o resultado final seria algo como n1(int),n2(int), sendo que os numeros decimais são guardados em outra variavel.

Não quero a resposta, pois preciso aprender, gostaria de alguma ajuda, pois estou totalmente perdido e não sei como fazer =\....

Meu codigo até agora:

INT MAIN()

{

int n1;

int n2;

int nc;

int r;

int cont;

r=0;

printf("Qual o primeiro numero?: ")

scanf("%i",n1);

printf("Qual o segundonumero?: ")

scanf("%i",n2);

nc=n2

FOR(cont=0;n2<=n1;cont++)

{

n2=n2+nc;

r=r+1;

}

}

printf("Resultado: %i",r);

return 0;

}

Link para o comentário
Compartilhar em outros sites

20 respostass a esta questão

Posts Recomendados

  • 0

Cara, pensando aqui, um jeito de você se obter os decimais é multiplicar o numero que vai ser difivido por potencias de 10!

Não sei se você já vai ter a precisão pre-determinada de quantas casa você tem que ter! se for esse o caso, acho que fica facil

Pra comecar, caso voce não conheça, o operador % chama "resto da divisao por". Então:

10%1 = 0 (o resto da divisão de 10 por 1 é zero)

10%8 = 2 (o resto da divisão de 10 por 8 é 2)

e assim vai...

Bom, fazendo um exemplinho, temos 1 / 8 = 0,125

Por exemplo, com 3 casas decimais, primeiro você divide o um numero pelo outro, normalmente.

1 / 8 = 0

1 % 8 = 1

Dai multiplica o resto da divisao por 10, e depois divide de novo pelo 8.

10/8 = 1

10%8 = 2

Dai pega, de novo, o resto da divisao, multiplica por 10 e divide de novo por 8!

20/8 = 2

20%8 = 4

Mais uma vez, o mesmo processo!

40/8 = 5

40%8 = 0

E pronto! o resultado de 10/8, 20/8 e 40/8 vai te dar os decimais..

Cara, isso, na verdade, não passa da multiplicação que a gente faz no papel, ensinada pra um computador!

Para pra pensar, e faz a divisão ai na mão de 1 por 8... o processo vai ser EXATAMENTE esse: divide o numero, pega o resto, multiplica por 10 (o famoso "abaixa o zero!"), divide de novo, pega o resto, multiplica por 10, divide de novo, e assim vai...

Voce pode ordenar seu programa a parar até que ele encontre um 0 no resto da divisão, no caso do numero ser exato.

No caso de dízimas periódias, acredito que você tem que fazer um tratamento um pouco mais complexo..

Bom, ainda faltam alguns detalhes que você vai demorar um pouco, mas deve conseguir fazer, como, por exemplo, como "re-montar" o numero depois, com as casas decimais e tudo mais... mas, enfim, a ideia ta ai!

Link para o comentário
Compartilhar em outros sites

  • 0

Felipe,

Não entendi muito bem, e outra, eu não "posso" usar divisão ou multiplicação, apenas soma e só soma, nem o mod(%), eu posso usar =\.....

eu postei o codigo no primeiro post que esta fazendo a divisão, mas apenas com o numero inteiro, falta pegar os decimais....se eu rodar no codigo um 8 e 2 por exemplo, me retorna 2 certinho, agora, 8 e 3, me retornara 2 tambem, uma vez que não esta sendo tratado os decimais....

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, ok, isso dificulta um pouco, mas a minha ideia acredito que ainda possa ser usada!

no meu "programa" que eu te passei, eu uso 3 coisas: /, % e *

o * é facil não usar, todas as vezes eu multipliquei por 10, então é só somar 10 vezes o mesmo numero!

o / fica facil também, voce mesmo já descobriu como fazer!

o nosso problema seria, então, replicar o operador %.

Mas acho que você não vai ter muito problema... no seu caso, após uma divisão simples, é só fazer um loop somando r-1 vezes o valor nc (esse menos ai pode usar, né???). depois, vai somando de 1 em 1 um contador até os numeros ficarem iguais, e pronto, nesse seu contador vai estar armazenado o resto da divisão!

tendo as operações por si só conhecidas, cria uma função pra cada uma delas, e é só aplicar a minha ideia!

entendeu?

ó, resumidão:

dividir, como eu disse, você já sabe, não?

então, pro nosso teste, temos, como eu disse, 1 / 8.

Com a sua divisão ele vai dar esse resultado como sendo 0 (se a sua divisao estiver certa!)

depois, você faz um loop pra ele armazenar numa variavel temporaria 0 vezes o numero 8, e vai somando, num contador, de 1 em 1, até voce chegar no 1, e dessa forma você vai ter o resto da divisão de 1 por 8, que é 1!

então a parte dos inteiros já está feita, e começamos a parte decimal.

Num loop, faça somar 10 vezes o resto da divisão (no nosso caso, seria 10 * 1, e teríamos 10)

dai, com a sua propria divisão, dividiremos 10 por 8, chegando ao resultado 1. Esse vai ser o primeiro decimal!!

Agora, para achar o resto da divisão: como eu disse acima, some r vezes (no caso, 1) o valor 8, e vá somando um contador até os numeros serem iguais, até voce chegar no 10! no caso, 8 + 2 = 10, então o contador vai ter o valor 2 (que é o resto da divisão de 10 por 8!!)

proximo decimal, é só repetir o processo! vou falar passo a passo, mais rapido:

pega o ultimo resto da divisao, que é 2, e multiplica por 10, no loop, tendo 20

divide 20 por 8 e temos o proximo decimal, que é 2!!

o proximo resto da divisao: soma r vezes (que é 2) o numero 8, chegando em 16. soma de 1 em 1 um contador, até 20, e temos 4, que é o resto da divisão

proximo decimal:

10* o resto da divisao, no loop, da 40

40 dividido por 8 da 5, que é o ultimo decimal!

faz r vezes (no caso, 5) 8 e vai somando de um em um num contador até chegar em 40. nesse caso, o contador vale zero, e pode parar o programa!

(como eu disse, isso tudo funcionará perfeitamente num caso com divisões exatas... sem considerar dizimas e numeros irracionas)

Editado por Felipe Amadio
Link para o comentário
Compartilhar em outros sites

  • 0

Felipe,

Desculpe minha falta de conhecimento logico, mas não consegui entender a parte:

" você faz um loop pra ele armazenar numa variavel temporaria 0 vezes o numero 8, e vai somando, num contador, de 1 em 1, até voce chegar no 1, e dessa forma você vai ter o resto da divisão de 1 por 8, que é 1!"....

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, então vou explicar melhor, desculpa ai se foi muito confuso!

O intúito aqui é realizar a operação %, certo?

Pois então, temos o Dividendo (número a ser dividido), o Divisor (numero que divide) e o Quociente (resultado) além do resto!

Dividendo e Divisor são dados. O Quociente você já achou uma forma de fazer. O problema então é achar o resto!

Vamos pegar o segundo caso ali que eu citei, aonde a divisão é 20 / 8.

20 / 8, como seu método deve chegar, dá 2!

Então, minha metodologia pra achar o resto da divisão, é a seguinte (supondo que o valor 2, que é o resultado da divisao, está armazenado na variavel "quociente", que "temp" é uma variavel temporaria, e nc é o numero que divide, no nosso caso, é o 8):

resto = 0;
temp = 0

for(i=0; i<quociente; i++)
temp = temp + nc;
Neste ponto, teremos em temp o numero (nc*quociente), que não é o nosso divisor! é ligeiramente menor! esse numero difere do nosso divisor pelo resto! (no nosso exemplo, de 20/8, nc vale 8, e quociente vale 2, então (nc * quociente) = 16! que é o que temos armazenado em temp) Dai, pra achar o resto:
for(i=0; temp!=dividendo; i++)
temp = temp + 1

Aqui, o que acontece: a cada loop, temp recebe um icremento de 1. Então, ao final de 4 loops, teremos que temp, que valia 16, agora vale 20, e nós sairemos do for!

E, na variável i, teremos armazenado exatamente o número 4, que é o resto da divisão de 20 por 8!!

Então, minha frase ficou bem confusa, mesmo...

" você faz um loop pra ele armazenar numa variavel temporária 0 vezes o numero 8, e vai somando, num contador, de 1 em 1, até voce chegar no 1, e dessa forma você vai ter o resto da divisão de 1 por 8, que é 1!"....

Deveria ser:

" você faz um loop pra ele armazenar numa variavel temporária "QUOCIENTE" vezes o numero 8(DIVISOR), e vai somando, num contador, de 1 em 1, até voce chegar no "DIVIDENDO", e dessa forma você vai ter o resto da divisão de 1 por 8, que é 1!"....

Link para o comentário
Compartilhar em outros sites

  • 0

A, agora entendi essa parte, a partir dai, continua seguindo seu post anterior né?

Uma duvida em relação a funcionamento, eu baxei aqui o DEV C++, mas ele não esta compilando nada... quando eu o executo aparece a menssagem: There doesen´t seem to be GNU Make file or in Dev C++ Bin Path e que nada sera compilado, falta baixar alguma coisa? o que esta dando errado?

Link para o comentário
Compartilhar em outros sites

  • 0

É como eu disse, uma vez que você já sabe fazer % e /, é só usar o primeiro post que eu falei!

é um passo pros inteiros, e mais um passo pra cada decimal, aonde o passo é:

dividendo / divisor = quociente (numero que vai ser "extraído" desse passo. É o numero que você vai aproveitar de cada passo)

resto da divisao do dividendo pelo divisor = resto

preparacao pro proximo passo -> novo dividendo = 10* resto

Com números:

passo 1

1/8 = 0

1%8 = 1

novo dividendo = 10*1 = 10

passo 2

10/8 = 1

10%8 = 2

novo dividendo = 10*2 = 20

passo 3

20/8 = 2

20%8 = 4

novo dividendo = 10*4 = 40

passo 4

40/8 = 5

40%8 = 0 (FIM DO PROGRAMA!)

E o resultado, tá em negrito: 0,125

Agora, com relação ao compilador, ptz... eu não manjo muito, não!

Sugiro, inclusive, que você faça outro post, porque perguntar nesse acho que não vai adiantar muito

Editado por Felipe Amadio
Link para o comentário
Compartilhar em outros sites

  • 0

como já disse, não manjo muito de compilador! Acho que você deve postar algum novo tópico pra solucionar isso...

O meu costuma funcionar direto, a partir da instalação...

pra você ter uma noção, eu instalei o code::Blocks, não consegui compilar, e nem tentei, desinstalei e instalei o Dev! dai consegui compilar de cara e mandei um abraço pro code::Blocks!

mas, enfim, certeza que tem gente ai que sabe...!

Vai em ferramentas -> opcoes de compilador.

Posta num tópico as configuracoes que tão ali, roda o compilador, e escreve no tópico exatamente o que diz o erro, logo logo aparece alguém que manja pra te ajudar!

Link para o comentário
Compartilhar em outros sites

  • 0

Felipe,

Olha meu codigo:

int main () {

int n1;

int n2;

int nc;

int r;

int cont;

cont=0;

r=0;

printf("Qual o primeiro numero: ");

scanf("%i",&n1);

printf("Qual o segundo numero: ");

scanf("%i",&n2);

nc=n2;

for(cont=0;n2<=n1;cont++)

{

n2=n2+nc;

}

printf("Resultado: %i,%i",cont);

getch();

return 0;

}

Compilador funcinou, porem assim, apenas com int, ele esta me trazendo o codigo com decimal, exemplo, se eu jogar 8 e 5, tenho como retorno: 1,5118880

Por que esta acontecendo isso?

Link para o comentário
Compartilhar em outros sites

  • 0

pra começar, você deve usar %d para inteiros, e não %i! não sei nem como isso rodou!

depois, na impressão, você ta imprimindo

printf("Resultado: %i,%i",cont);

você ta imprimendo antes da virgula o cont, e depois da virgula algo não definido! repare! você colocou dois %i e somente uma variavel!

logo, o proprio computador ta "escolhendo" qual variavel imprimir, e parece que no seu caso, ele imprimiu primeiro cont, que valia 1, depois a virgula, que ta ali expressa no seu printf, e depois um numero aleatorio, que deve ter sido o 5118880!!

Link para o comentário
Compartilhar em outros sites

  • 0

Felipe,

Antes de tudo, obrigado pela ajuda =D

Mas esta complicado hahaha

Eu cheguei neste codigo: (acho que ele esta infinito no looping)

#include <stdio.h>

#include <conio.h>

#include <iostream>

int main () {

int n1;

int n2;

int nc;

int r;

int cont;

int resto;

int temp;

int i;

int d1;

d1=0;

temp=0;

cont=0;

r=0;

printf("Qual o primeiro numero: ");

scanf("%i",&n1);

printf("Qual o segundo numero: ");

scanf("%i",&n2);

nc=n2;

for(cont=0;n2<=n1;cont++)

{

n2=n2+nc;

}

r=cont;

for(int a=0;a<r;a++)

{

temp=temp+nc ;

}

for(i=0;temp!=n1;i++)

{

temp=temp+1;

}

int c;

c=temp;

for(int b=0;b<=8;b++)

{

c=c+temp;

}

for(int d=0;nc<=c;d++)

{

d1=d1+d;

}

printf("Resultado: %i,",r);

getch();

return 0;

}

Link para o comentário
Compartilhar em outros sites

  • 0

vou responder no seu código, mais ou menos, ta?

só pra começar, de novo, você não substituiu os %i por %d! isso pode ser essencial! substitua! inteiros são lidos e escritos com %d, e não com %i !!

int resto; Po, legal, você criou a variavel "resto", mas... me parece que você não usou ela! use, vai ficar mais facil pra eu entender e também pra quem quer que vá corrigir isso!

int temp;

int i;

int d1;

d1=0;

temp=0;

cont=0;

r=0;

printf("Qual o primeiro numero: ");

scanf("%i",&n1);

printf("Qual o segundo numero: ");

scanf("%i",&n2);

nc=n2;

for(cont=0;n2<=n1;cont++)

{

n2=n2+nc;

}

r=cont; Aqui é onde achamos o resultado inteiro, certo? então sugiro, aqui, voce ter uma variável que chame "pte_int" e atribui o valor de r a ela

for(int a=0;a<r;a++) Declarar variaveis no codigo não é legal, apesar de funcionar! sugiro que declare esse a no inicio

{

temp=temp+nc ;

}

for(i=0;temp!=n1;i++)

{

temp=temp+1;

}

Bom, aqui temos um ponto em que fizemos a primeiro operacao "resto da divisao", e esse resto está armazenado na variável i !

Depois desse ponto, o que precisamos fazer é multiplicar este resto por 10, e continuar o processo, que não foi o que você fez! mas, veremos...

int c;

c=temp;

for(int b=0;b<=8;b++)

{

c=c+temp;

}

Ok, entendi, você só se confundiu! Aqui é a multiplicaçcao por 10, certo? de fato, ao final deste loop, c vai conter 10* o valor de temp. Agora 2 pontos:

primeiro: ta muito feio o jeito que você escreveu! coloca que c=0, dai de b=0 até b<10, e no loop, c = c + temp. E daí outro ponto, temp, aqui, vale n1! e não o resto da divisao! o resto da divisao, como eu disse, esta armazenado em i ! (você entendeu essa historia de calcular o resto da divisao? entenda bem, que fica mais facil!) Logo, aqui teria que ser feita a conta 10*(resto da divisao), e não é o que está acontecendo!

for(int d=0;nc<=c;d++)

{

d1=d1+d;

}

Bom, aqui o negocio ficou confuso!

1- de onde você tirou d1? pra que ele serve? o que ele armazena?

2- no loop você atualiza somente o valor de d1, e, indiretamente, o valor de d. Sua condição de parada envolve nc e c, de modo que evidentemente este loop é infinito!

printf("Resultado: %i,",r);

getch();

return 0;

}

Link para o comentário
Compartilhar em outros sites

  • 0

Felipe,

Consegui, pelo menos para a primeira variavel, porem, fiquei em duvida em relação a segunda, na seguinte questao? como eu pego o proximo? e existem numeros que possuem 3 casas decimais, outras que possuem 1 ou 2.

Segue codigo que funcionou para o primeiro decimal:

#include <stdio.h>

#include <conio.h>

#include <iostream>

int main () {

int n1;

int n2;

int nc;

int inteiro;

int cont;

int temp;

int a;

int aux;

int b;

int c;

int resto;

a=0;

temp=0;

cont=0;

inteiro=0;

printf("Qual o primeiro numero: ");

scanf("%d",&n1);

printf("Qual o segundo numero: ");

scanf("%d",&n2);

nc=n2;

for(cont=0;n2<=n1;cont++)

{

n2=n2+nc;

}

inteiro=cont;

for(a=0;a<inteiro;a++)

{

temp=temp+nc;

}

for(resto=0;temp!=n1;resto++)

{

temp=temp+1;

}

aux=0;

for(b=0;b<10;b++)

{

aux=aux+resto;

}

n2=nc;

for(c=0;n2<=aux;c++)

{

n2=n2+nc;

}

printf("Resultado: %d,%d",inteiro,c);

getch();

return 0;

}

Link para o comentário
Compartilhar em outros sites

  • 0

Vamos la, de novo!

O intuito, agora, é a criação de um loop pra ir realizando um decimal após o outro, até que o resto da divisão seja zero, e daí terminamos o numero!

for(cont=0;n2<=n1;cont++) Loop1: Esse primeiro for calcula a parte inteira

{

n2=n2+nc;

}

inteiro=cont;

for(a=0;a<inteiro;a++) Loop2: Esse for faz (dividendo * quociente), pra achar o resto da divisão, então aqui já deveria estar dentro do loop que irá calcular todos os decimais!

{

temp=temp+nc;

}

for(resto=0;temp!=n1;resto++) Loop3: Aqui nós encontramos o resto da divisao

{

temp=temp+1;

}

aux=0;

for(b=0;b<10;b++) Loop4: E aqui fazemos 10*resto, preparando para esse ser o proximo divisor.

{

aux=aux+resto;

}

Loop5: acha o valor do decimal em questao

n2=nc;

for(c=0;n2<=aux;c++)

{

n2=n2+nc;

}

printf("Resultado: %d,%d",inteiro,c);

getch();

return 0;

}

Bom, vamos lá:

Loop1: acha a parte inteira

LOOP GRANDE (está faltando): esse loop vai achar todos os decimais! nele voce coloca como condição pra ele parar quando o ultimo resto for zero! ou então pra ele parar depois de rodar 10 vezes, ou algo assim. Pois, no caso de uma dizima, ele não vai parar nunca, e isso não é desejado! então coloca algo tipo uma variavel de controle, ou um numero maximo de iteracoes

dentro do loop grande, teremos os loops 2, 3, 4 e 5!

Voce só precisa verificar e atualizar as variaveis pra ficar nesse loop de decimais sem problemas...

então, ficaria algo assim:

declaracoes de variavel + daclaracao de "cont_decimais"
aquisição dos dados do usuario
loop1
cont_decimais = 0;
while(resto!=0 || cont_decimais <10)
{
loop2
loop3
loop4
loop5
inteiro = c;
n1 = aux;
cont_decimais ++;
}
Acho que essas são as duas atualizações necessárias pro seu programa entrar nesse loop e rodar, tudo certo! tenta ai, mas agora deve dar certo! Então, na hora de imprimir o numero, sugiro que, logo apos achar a parte inteira, você de um
printf("%d,"inteiro);
A partir dai, coloca no final do loop um
printf("%d"c;

E, a medida que ele for achando os decimais, ele vai imprimindo, e imprimindo...

Editado por Felipe Amadio
Link para o comentário
Compartilhar em outros sites

  • 0

Felipe,

beleza, imaginei algo assim mesmo, mas a minha duvida, mais especificamente é a seguinte:

Para pegar o primeiro decimal, eu me baseei nos 2 numeros de entrada com toda aquela logica, mas o segundo decimal por exemplo, se basearia em qual? ou do jeito que esta o codigo, faltaria apenas adicionar o Loop Grande?

Link para o comentário
Compartilhar em outros sites

  • 0

Então, as atualizações que eu fiz ali são justamente pra dar conta!

essas são as contas que cada loop deve fazer, no caso de 1 / 8:

loop1: 1/8 = 0

loop2: 0*8 = 0

loop3: 1%8 = 1

loop4: 10*1 = 10

loop5: 10/8 = 1

loop2: 1*8 = 8 (esse 1, que muda sempre, é decimal achado anteriormente! no caso, é o seu c)

loop3: 10%8 = 2 (esse 10 é o resto da divisao anterior, multiplicado por 10! no seu programa, é o aux)

loop4: 10*2 = 20

loop5: 20/8 = 2

daí, por isso eu citei as seguinte atualizações:

inteiro = c;

n1 = aux;

tendeu?

Link para o comentário
Compartilhar em outros sites

  • 0

Felipe,

Entendi na teoria, na pratica, não consegui aplicar, sgeue codigo:

#include <stdio.h>

#include <conio.h>

#include <iostream>

int main () {

int n1;

int n2;

int nc;

int inteiro;

int cont;

int temp;

int a;

int aux;

int b;

int c;

int resto;

int cont_decimais;

cont_decimais=0;

a=0;

temp=0;

cont=0;

inteiro=0;

printf("Qual o primeiro numero: ");

scanf("%d",&n1);

printf("Qual o segundo numero: ");

scanf("%d",&n2);

nc=n2;

for(cont=0;n2<=n1;cont++)

{

n2=n2+nc;

}

inteiro=cont;

printf("Resultado: %d,",inteiro);

while(resto!=0 || cont_decimais<10)

{

for(a=0;a<inteiro;a++)

{

temp=temp+nc;

}

for(resto=0;temp!=n1;resto++)

{

temp=temp+1;

}

aux=0;

for(b=0;b<10;b++)

{

aux=aux+resto;

}

n2=nc;

for(c=0;n2<=aux;c++)

{

n2=n2+nc;

}

inteiro = c;

n1 = aux;

cont_decimais ++;

printf("%d",c);

}

getch();

return 0;

}

Ele me traz, como antes, corretamente só até o primeiro decimal, mas se eu jogar 1/8, ele traz 0,11 "-.-...

Link para o comentário
Compartilhar em outros sites

  • 0

Agora copiei o codigo e, pela primeira vez, rodei ele!

heheheheheh

A coisa é o seguinte, voce precisa zerar as variaveis cada vez que você termina de achar um decimal!

A variavel "aux" você ta zerando logo antes do loop que usa ela... a variavel temp, não!!!

o loop 2 e o 3 usam a variavel temp, então, ou no final do loop dos decimais, ou logo antes do loop 2, coloque um

temp = 0;

isso funciona!

(estranho é que ele não ta parando quando o resto vale 0! sempre quando chega na 10a casa decimal! mas enfim, isso não é realmente um problema! é só falar que o seu programa tem uma precisão pre-estabelecida!

voce pode até pedir pro usuario digitar a precisao que ele quer, antes de tudo... dai você manda o con_decimais ir até o cont_decimais_maximo, que é o valor que o usuario entrou!

Link para o comentário
Compartilhar em outros sites

  • 0

Rs...agora entendi, e funcionou perfetamente!!!

2 coisas Felipe:

1 - Muito obrigado, alem de me resolver o problema da facul, eu realmente aprendi, vlw pela paciencia, mas como mexo com banco um cast+substring+charindex teria resolvido de cara hahahaha

2 - Qualquer coisa que, e se precisar de banco, pode falar comigo >.<, se quiser, esta ai meu perfil no msdn http://social.technet.microsoft.com/profil...ofa/?type=forum

Estou todo dia por la! hahahah....

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...