Ir ao conteúdo
  • Cadastre-se

Div e Mod com variavel real (imagem)


Posts recomendados

Olá pessoal, estou encucado com uma questao para obter o tamanho de um arquivo em MB e obter a taxa de transmissao kb/s, e informar ao usuário o tempo que levará para que o arquivo seja transferido no formato de X horas, Y minutos e Z segundos. Para obter o tempo que preciso mostrar, tenho que fazer a divisao comum entre o tamanho em KB e a taxa kb/s, e logo em seguida usar div e mod para fazer a amostragem Hora, Minuto, Segundo. Contudo o resultado da divisao normal só pode ser real, e os comandos div e mod só podem ser realizados com operandos inteiros, o que gera erro de incompatibilidade entre os operandos no div e mod, gostaria de saber se há alguma maneira de contornar isso. Obrigado! (Obs: estou usando o Turbo Pascal)

 

Sem título.png

Link para o comentário
Compartilhar em outros sites

Obrigado pela atenção Simon, eu ''contornei" o problema usando outro Div no lugar da divisao real e declarando tudo como integer, só que eu gostaria de trabalhar com uma situação onde o usuário possa digitar no mínimo a taxa de transmissao em real.

program mostraTempo;
uses crt;
const
     mb_kb= 1024;
     seg_hora= 3600;
     seg_min= 60;
var
     mb, kbps, segundos, horas, minutos: longint;
     seg_arquivo: real;
begin
     clrscr;
     write('Digite o tamanho do arquivo em Megabytes: ');
     readln(mb);
     write('Digite o valor da taxa de transmissao em kb/s: ');
     readln(kbps);
     seg_arquivo:= (mb*mb_kb)/kbps;
     segundos:= seg_arquivo mod seg_min;
     minutos:= seg_arquivo div seg_min mod seg_min;
     horas:= seg_arquivo div seg_hora mod seg_min;
     write('O arquivo de ',mb,'mb transmitido a ',kbps);
     write('kbps sera transferido em ',horas,' horas ');
     writeln(minutos,' minutos e ',segundos,' segundos.');
     readln;
end.

 

Link para o comentário
Compartilhar em outros sites

Ficou muito bom Simon! Como ainda sou iniciante e totalmente inexperiente, desconhecia o Round. A discrepancia usando 2 casas apos a virgula é praticamente irrisoria. Em breve, quando for mais experiente espero poder ajudar outros por aqui assim como você. Obrigado por tudo e até a próxima.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Agora, David Emanoell disse:

Ficou muito bom Simon! Como ainda sou iniciante e totalmente inexperiente, desconhecia o Round. A discrepancia usando 2 casas apos a virgula é praticamente irrisoria. Em breve, quando for mais experiente espero poder ajudar outros por aqui assim como você. Obrigado por tudo e até a próxima.

Eu respondi utilizando arredondamentos... eu estava até editando a postagem, rs.

 

Em fim, se fosse para valores aproximados, tinha imaginado arredondando os valores... daí ou onde tem seg_arquivo, coloca round(seg_arquivo) ou como você sugeriu utilizando um div e usa longint para seg_arquivo.

 

Mas tem diferença entre eles, pois com o div ele sempre arredonda pra baixa, já com round depende do valor da casa decimal... ou é com 5 ou 6 ele aproxima pra cima.. ex.: 100,48 = 100, e  100,62 = 101.

 

Depois que me atentei a sua "necessidade".

2 horas atrás, David Emanoell disse:

só que eu gostaria de trabalhar com uma situação onde o usuário possa digitar no mínimo a taxa de transmissao em real.

Então, acho que é possível... mais tarde vou parar com calma para analisar direito e vê se acho alguma alternativa..

 

Até mais
 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

UPDATE
Pelo visto, para ler valores em real, basta colocar as variáveis de entrada como real... (e usa round())

 

Obs.: O padrão é inglês, logo se separa por pontos. Ex.: 150.27

 

As variáveis ficam com algo do tipo:

var
  MB, KBps   :real; //MegaBytes e KiloBytes por segundos repectivamente informado pelo usuário
  seg_arquivo:real; //segundos para baixar o arquivo utilizando o KBps informado
  segundos,
  minutos,
  horas      :word; //tempo para baixar o arquivo formatado por segundo, horas e minutos

***

 

PS1: A conta está sendo feita errada.
 

4 horas atrás, David Emanoell disse:

segundos:= seg_arquivo mod seg_min;

minutos:= seg_arquivo div seg_min mod seg_min;

horas:= seg_arquivo div seg_hora mod seg_min;

A variável utilizada no mod está sendo usada indevidamente. Teoricamente seg_mim = "quantidade de segundos em um minuto", e isso não tem correlação com o cálculo lá no mod. Muito menos ainda ser a mesma para as 3 contas...

 

Obs.: mesmo que o valor necessário seja igual, você não pode usar uma variável de outro contexto. (não é porque eu preciso de um 60 em algum lugar, que vou utilizar um variável "qualquer" que tem um valor de 60).

 

***

 

PS2: acho precisa corrigir corrigir a nomenclatura das taxas, ou seja, "taxa de transferência" é medida em KB/s (o B é maiúsculo, e no caso o K também) e não kb/s.
b = bit

B = Byte


Kbps (ou kbps) é um coisa, KBps é outra.

 

Obs.: Uma sugestão de como pode ficar as variáveis já postei acima. E no caso precisaria corrigir os restante do código.

 

***

PS3: Seria bom ter um forma prática de comparar os resultados... por exemplo:

https://www.projetoderedes.com.br/calculadora/calculadora.php

 

Experimente alguns valores, especialmente com resultados com muitas horas...

 

***


No aguardo

Link para o comentário
Compartilhar em outros sites

Mais um vez obrigado @Simon Viegas, refiz os calculos do tempo e algora estão mais entendiveis e fiz as outras alteracoes sugeridas. Fiz varios exemplos e todos foram bem precisos comparando com o link que voce mandou, exceto os exemplos onde davam mais de um mes, ja que o site nao mostra precisamente, mas fiz os calculos manuais e tambem batiam.

Link para o comentário
Compartilhar em outros sites

Tranquilo, baseado no que o professor nos ensinou ate agora, nao esta sendo cobrado mais do que ja esta ai. Se houver mais algum ajuste que eu possa fazer dentro do que ele nos passou, tranquilo. Infelizmente tem muito repetente e ta atrasando a cadeira pra burro hahah.

 

program mostraTempo;
uses crt;
const
     MB_KB= 1024;
     Hora_seg= 3600;
     Min_seg= 60;
var
   segundos, horas, minutos: word;
   MB, KBps, seg_arquivo: real;
begin
     clrscr;
     write('Digite o tamanho do arquivo em Megabytes: ');
     readln(MB);
     write('Digite o valor da taxa de transmissao em KB/s: ');
     readln(KBps);
     seg_arquivo:= (MB*MB_KB)/KBps;
     horas:= round(seg_arquivo) div Hora_seg;
     minutos:= round(seg_arquivo) mod Hora_seg div Min_seg;
     segundos:= round(seg_arquivo) mod Min_seg;
     write('O arquivo de ',MB:0:2,'mb transmitido a ',KBps:0:2);
     write('kbps sera transferido em ',horas,' horas ');
     writeln(minutos,' minutos e ',segundos,' segundos.');
     readln;
end.

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Creio que basicamente faltou ajustar pequenos detalhes.. abaixo fiz algumas sugestões de correção e coloquei alguns comentários para tentar explicar mais ou menos do que se trata.

 

program mostraTempo;
uses crt;
const
  MB_KB    = 1024; //quantidade de KB em um MB
  Hora_seg = 3600; //quantidade de segundos em uma hora
  Min_seg  = 60;   //quantidade de segundos em um minuto
 
  Limite_seg  = 60;   //o que cabe em segundos (um minuto)
  Limite_min  = 60;   //o que cabe em minutos (uma hora)
  //Limite_hora = 24; //o que cabe em horas (um dia)
var
  segundos, horas, minutos: word;
  MB, KBps, seg_arquivo: real;
begin
clrscr;
write('Digite o tamanho do arquivo em Megabytes: ');
readln(MB);
write('Digite o valor da taxa de transmissao em KB/s: ');
readln(KBps);
seg_arquivo:=(MB*MB_KB)/KBps;
{horas   :=round(seg_arquivo) div Hora_seg mod Tama_hora; } //com limite de horas (se for usar dias por exemplo)
horas   :=round(seg_arquivo) div Hora_seg;                //o div converte de segundos para horas
minutos :=round(seg_arquivo) div Min_seg  mod Limite_min; //o div converte de segundos para minutos e o mod pega o "que cabe"
segundos:=round(seg_arquivo)              mod Limite_seg; //seg_arquivo já está em segundos. o mod pega o "que cabe"

writeln;
write  ('O arquivo de ',MB:0:2,'MB transmitido a ',KBps:0:2);
write  ('KBps sera transferido em ',horas,' hora(s) ');
writeln(minutos,' minuto(s) e ',segundos,' segundo(s).');
writeln;
writeln; //outro exemplo de formatação
write  ('O arquivo de ',MB:0:2,'MB transmitido a ',KBps:0:2);
writeln('KBps sera transferido em: ');
write  (horas,'h:',minutos,'m',segundos,'s');
readln;

end.

No aguardo

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Olá @Simon Viegas, perdão pela demora, estava viajando e não tive como responder. Enfim, no meio tempo recebi uma mensagem do professor para considerar os valores de entrada como integer e não posso usar comandos que ele não passou em sala de aula (como o round por exemplo). Logo ao invés da divisão real, usei o div mesmo para obter os segundos que o arquivo levaria para ser transferido. Contudo em alguns exemplos, tenho discrepâncias de 1 segundo, segue abaixo o código:

program tempoTransmissao;
uses crt;
const
     MB_KB= 1024;
     Hora_seg= 3600;
     Min_seg= 60;
var
   MB, KBps, KB, seg_arquivo, horas, minutos, segundos: integer;
begin
     clrscr;
     write('Digite o tamanho do arquivo em Megabytes: ');
     readln(MB);
     write('Digite o valor da taxa de transmissão em KB/s: ');
     readln(KBps);
     KB:= MB*MB_KB;
     seg_arquivo:= KB div KBps;
     horas:= seg_arquivo div Hora_seg;
     minutos:= seg_arquivo mod Hora_seg div Min_seg;
     segundos:= seg_arquivo mod Min_seg;
     write('O arquivo de ',MB,'MB transmitido a ',KBps);
     write('KBps será transferido em ',horas,' hora(s), ');
     writeln(minutos,' minuto(s) e ',segundos,' segundo(s).');
     readln;
end.

Gostaria de saber se você tem alguma sugestão. Obrigado mais uma vez!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @David Emanoell,

 

1) SOBRE TIPOS DADOS

2 horas atrás, David Emanoell disse:

Enfim, no meio tempo recebi uma mensagem do professor para considerar os valores de entrada como integer e não posso usar comandos que ele não passou em sala de aula (como o round por exemplo). Logo ao invés da divisão real, usei o div mesmo para obter os segundos que o arquivo levaria para ser transferido.

Pela citação, o professora requer entrada em integer, mas nada impede de usar cálculos com resultados em real... entretanto, creio que da forma que está calculando as horas, minutos e segundos, de qualquer forma  o resultado vai ser o mesmo (teria que analisar e fazer testes).

 

Resumido: acho que usando só integer não terá problemas.

 

2) CALCULO DO VALORES

O cálculo dos minutos está ligeiramente errado... pois você está invertendo a ordem das operações, ou seja, possivelmente está o mesmo resultado, mas seria por "sorte".

 

2 horas atrás, David Emanoell disse:

     horas:= seg_arquivo div Hora_seg;
     minutos:= seg_arquivo mod Hora_seg div Min_seg;
     segundos:= seg_arquivo mod Min_seg;

 

 


Na minha postagem anterior em tentei detalhar mais ou menos o fluxo... (se tiver bagunçado, copia e cola em outro local para ver mais organizado e analisar melhor)
 

Em 24/12/2015 às 09:29, Simon Viegas disse:

horas   :=round(seg_arquivo) div Hora_seg;                //o div converte de segundos para horas
minutos :=round(seg_arquivo) div Min_seg  mod Limite_min; //o div converte de segundos para minutos e o mod pega o "que cabe"
segundos:=round(seg_arquivo)              mod Limite_seg; //seg_arquivo já está em segundos. o mod pega o "que cabe"

 

 

Veja que existe um fluxo de "converter e depois pegar"... se ocorrem o mesmo tipo de operação, devemos seguir os mesmo passos, mesmo que "a ordem dos tratores não alterem o viaduto"... no mínimo é mais elegante, entende? (veja que deixei até um espaçamento horizontal para deixar alinhado as etapas)

 

***

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

Olá @Simon Viegas, fiz as correções propostas.

program mostraTempo;
uses crt;
const
     MB_KB= 1024;
     Hora_seg= 3600;
     Limite_min= 60;
     Limite_seg= 60;
var
   MB, KBps, KB, seg_arquivo, horas, minutos, segundos: integer;
begin
     clrscr;
     write('Digite o tamanho do arquivo em Megabytes: ');
     readln(MB);
     write('Digite o velocidade da taxa de transmissão em KB/s: ');
     readln(KBps);
     KB:= MB*MB_KB;
     seg_arquivo:= KB div KBps;
     horas:= seg_arquivo div Hora_seg;
     minutos:= seg_arquivo mod Hora_seg div Limite_min;
     segundos:= seg_arquivo mod Limite_seg;
     write('O arquivo de ',MB,'MB transmitido a ',KBps);
     write('KBps será transferido em ',horas,' horas ');
     writeln(minutos,' minutos e ',segundos,' segundos.');
     readln;
end.

Como dito anteriormente, não posso usar a função Round, além disso andei analisando o código-fonte daquele site da calculadora de tempo de download que você me forneceu posts atrás e vi que lá também é usado o Round. Creio que vai ficar tudo bem com essa versão final.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

1 hora atrás, David Emanoell disse:

Como dito anteriormente, não posso usar a função Round

 

Lá no item 2 estava me referindo a ordem do DIV e MOD (você inverteu)... o round() na ocasião da citação original seria apenas como requisito do uso do real. Não tem a ver com esse contexto....

 

Resumidamente seria algo do tipo,

1 horas   :=seg_arquivo div Hora_seg;                //o div converte de segundos para horas
2 minutos :=seg_arquivo div Min_seg mod Limite_min;  //o div converte de segundos para minutos e o mod pega o "que cabe"
3 segundos:=seg_arquivo mod Limite_seg;              //seg_arquivo já está em segundos. O mod pega o "que cabe"

Compare os códigos e depois analise linha a linha:
 

1 OK
2.1 você NÃO PODE usar um "parâmetro" da hora (Hora_seg) para minutos! (mesmo que seja mesmo valor)
2.2 a ordem do DIV e MOD está invertida (primeiro DIV, depois o MOD) (mesmo que apresentem mesmo resultado)
2.3 os parâmetros estão invertidos, veja, o MOD e DIV precisam de dois parâmetro cada, veja o exemplo:

minutos :=(seg_arquivo div Min_seg) mod Limite_min;

Perceba que fica algo como:
a Mod b
e
c Div d

Sendo que c=(a Mod b), entende? São duas contas! Só que escritas "juntas".

se fosse inverter a ordem, ou seja, fazer o mod antes, depois o div, seria como:

minutos :=(seg_arquivo div Limite_min) mod Min_seg;

Veja que os parâmetros vem juntos..

 

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...