Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Algorítmo turno de trabalho


Posts recomendados

Boa tarde,

 

Este algoritmo deve receber um determinado horário e definir se o turno de trabalho é manhã, tarde ou noite, conforme a informação a seguir:

 

Manhã - 6h às 14h

Tarde - 14h às 22h

Noite - 22h às 06h

 

O aluno apresentou o seguinte algoritmo e disse que quando digitados os horários, apresentam uma mensagem diferente do turno que deveria aparecer. Como proceder?

 

[OBS: Aprendendo muito com este fórum, desde já, obrigada!]

 

Program Turno_de_trabalho;

VAR
hora, turno, user: string;

Begin
  Write('Digite seu nome: ');
  readln(user);
  Write('Digite seu horário de trabalho: ');
  readln(hora);
	Writeln;
	 
	If (hora>='06h') or (hora<='13h59')then
		Begin
			turno:=('Manhã');
			Write(user, ' seu turno de trabalho é ', turno);
		end
	Else
		If (hora>='14h') or (hora<='21h59')then
		Begin
			turno:=('Tarde');
			Write(user, ' seu turno de trabalho é ', turno);
		end
	Else
		If (hora>='22h') or (hora<='05h59')then
		Begin
			turno:=('Noite');
			Write(user, ' seu turno de trabalho é ', turno);
		end;
	Readln;
End.

 

1.png

2.png

3.png

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

  • Membro VIP

Olá.

 

Tomemos como enunciado o seguinte trecho:

 

58 minutos atrás, Educador Prepara disse:

Este algoritmo deve receber um determinado horário e definir se o turno de trabalho é manhã, tarde ou noite, conforme a informação a seguir:

 

Manhã - 6h às 14h

Tarde - 14h às 22h

Noite - 22h às 06h

 

No código, foi utilizado a seguinte verificação:

 

58 minutos atrás, Educador Prepara disse:

If (hora>='06h') or (hora<='13h59')then

 

Inicialmente, o operador lógico está incorreto. Foi utilizado OR, mas deveria ser AND. Afinal, está verificando se a hora é "maior ou igual a hora início dessa faixa" E "menor ou igual a hora fim dessa faixa". Para está dentro da faixa, tem que ser uma coisa E outra ao mesmo tempo. Perceba que no caso, todas as horas são maiores que 6 ou menores que 13h59. Vide tabela verdade do OR (disjunção). Ex.: 5h é maior ou igual que 6h? não (false) OU 5 é menor ou igual a 13h59? sim (true), ou seja, entraria no if, pois FALSE OR TRUE = TRUE.

 

Ficaria algo como:

program Turno_de_trabalho;
var
  hora, turno, user :string;
begin
write('Digite seu nome: ');
readln(user);
write('Digite seu horário de trabalho: ');
readln(hora);
writeln;
if (hora >= '06h') and (hora <= '13h59') then
  begin
  turno:=('Manhã');
  write(user, ' seu turno de trabalho é ', turno);
  end
else
  if (hora >= '14h') and (hora <= '21h59') then
    begin
    turno:=('Tarde');
    write(user, ' seu turno de trabalho é ', turno);
    end
  else
    if (hora >= '22h') or (hora <= '05h59') then
      begin
      turno:=('Noite');
      write(user, ' seu turno de trabalho é ', turno);
      end;
readln;
end.

 

 

 

Outro ponto é em relação a definição das faixas. Seria algo como:

program Turno_de_trabalho;
var
  hora, turno, user :string;
begin
write('Digite seu nome: ');
readln(user);
write('Digite seu horário de trabalho: ');
readln(hora);
writeln;
if (hora >= '06h') and (hora < '14h') then
  begin
  turno:=('Manhã');
  write(user, ' seu turno de trabalho é ', turno);
  end
else
  if (hora >= '14h') and (hora < '22h') then
    begin
    turno:=('Tarde');
    write(user, ' seu turno de trabalho é ', turno);
    end
  else
    if (hora >= '22h') or (hora < '06h') then
      begin
      turno:=('Noite');
      write(user, ' seu turno de trabalho é ', turno);
      end;
readln;
end.

 

 

Outro ponto é que está efetuando comparando string. Aí teria que dar uma aprofundada em como funciona uma "comparação de strings". Veja, o Pascal não entende que o texto "06h" é referente a uma hora... ou que é um número... ou algo do tipo. Entender como hora seria apenas uma abstração do programador, ou seja, o contexto para o qual o algoritmo foi feito, sugere que esse texto significa um horário para nós humanos. O Pascal simplesmente entende "06h" como um conjunto de 3 char: um '0'+'6'+'h'. Entende?

 

Essa comparação de string, está funcionando como uma verificação de ordem alfabética. Tipo, se fosse palavras de um dicionário, quem iria aparecer antes? Para ficar mais claro:

 

Supondo que digitei a frase: "07h30" (sem as aspas). Aí chegou nesse if:

If (hora>='06h') and (hora<='13h59')then

Iria verificar, tipo, "07h" viria antes ou depois "06h" num dicionário?. No caso, vem depois ("0" está na mesma posição de "0", mas "7" vem depois  de "6"). Assim como "07h" viria antes de "13h59" ("0" vem antes "1", logo vem antes). Então, entraria no if.

 

Mas se digitar "7h30", iria acontecer o quê? vai entrar como noite.

 

Sugestão:

- Dê uma revisada no que disse acima. Qualquer dúvida em qualquer parte é só pergunta;

- Em vez de ler a hora como uma string, altere o código para ler a hora como um inteiro (integer) e poste o código aqui.

 

 

Obs.:  código que postei ainda não está completo. Experimente digitar uma hora maior que 24h ou qualquer outra string que corresponda a alguma hora real.

 

No aguardo.

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

@Educador Prepara      para comparar as horas , se são maior ou menor , é preciso que seja do tipo inteiro ,  pois com string não funciona , e para isso você precisa converter a string que foi pegada do teclado , para inteiro , separando as horas que está marcada com a letra  depois da hora ,  e os minutos que é o restante da string , usando o comando   val  ,  e na hora de digitar o horário coloque o  h  depois da hora e tudo junto assim  :

       15h41

então seu código poderia ser assim     :

Program Turno_de_trabalho;
uses crt;
VAR
hora, turno, user,horas,minutos : string;
j,w,tam,hor,min                 : integer;

Begin
  Write('Digite seu nome: ');
  readln(user);
  Write('Digite seu horário de trabalho: ');
  readln(hora);
  Writeln;
  tam:=length(hora);
  while hora[j+1]<>'h' do
  begin
    j:=j+1;  
    horas:=concat( horas , hora[j] );     //pega as horas da string
  end;
  j:=j+2;
  while j <= tam	do
  begin
    minutos:=concat( minutos , hora[j] ); //pega os minutos da string
    j:=j+1;  
  end;

  val(horas  ,hor,tam);  //converte string para inteiro
  val(minutos,min,tam);  //converte string para inteiro

  If      ( hor >=  6 ) and ( ( hor <= 13 ) and ( min <= 59 ) ) then turno:=('Manhã')
  Else If ( hor >= 14 ) and ( ( hor <= 21 ) and ( min <= 59 ) ) then turno:=('Tarde')
  Else If ( hor >= 22 ) or  ( ( hor <=  5 ) and ( min <= 59 ) ) then turno:=('Noite');
  Write(user, ' seu turno de trabalho é ', turno);
  Readln;
End.

 

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

  • Membro VIP

@devair1010, sobre:

 

9 horas atrás, devair1010 disse:

@Educador Prepara      para comparar as horas , se são maior ou menor , é preciso que seja do tipo inteiro

 

Não. Não precisa. Com string também funciona. Como citado, o Pascal vai efetuar as comparação como se fossem uma verificação de ordem alfabética.

 

17 horas atrás, Simon Viegas disse:

[...] o Pascal não entende que o texto "06h" é referente a uma hora... ou que é um número... ou algo do tipo. Entender como hora seria apenas uma abstração do programador, ou seja, o contexto para o qual o algoritmo foi feito, sugere que esse texto significa um horário para nós humanos. O Pascal simplesmente entende "06h" como um conjunto de 3 char: um '0'+'6'+'h'. Entende?

 

17 horas atrás, Simon Viegas disse:

Essa comparação de string, está funcionando como uma verificação de ordem alfabética. Tipo, se fosse palavras de um dicionário, quem iria aparecer antes? [...]

 

Pegue esse código e testa aí:

program Turno_de_trabalho;
var
  hora, turno, user :string;
begin
write('Digite seu nome: ');
readln(user);
write('Digite seu horário de trabalho: ');
readln(hora);
writeln;
if (hora >= '06h') and (hora < '14h') then
  begin
  turno:=('Manhã');
  write(user, ' seu turno de trabalho é ', turno);
  end
else
  if (hora >= '14h') and (hora < '22h') then
    begin
    turno:=('Tarde');
    write(user, ' seu turno de trabalho é ', turno);
    end
  else
    if (hora >= '22h') or (hora < '06h') then
      begin
      turno:=('Noite');
      write(user, ' seu turno de trabalho é ', turno);
      end;
readln;
end.

Funciona "normal". 15h é tarde. 08h é dia. 23h é noite. Etc.

 

 

Em relação ao seu código em si, ele está "muito avançado/complexo" em nível do contexto. Estamos num abordagem de "aprendizagem do básico". :)

 

 

 

@Educador Prepara, sobre:

 

16 horas atrás, Educador Prepara disse:

Entendi o que disse, mas como faria, caso o usuário digitasse um horário quebrado (ex: 16h30) [...]

 

Vai funcionar da mesmas forma. Toda a questão é entender a essência das coisas. De um modo prático, é simples. Simplesmente pegue o código e teste. Ex.:

 

tela1.PNG

 

Por quê funciona? como já citado, ele vai comparar letra por letra até conseguir ter certeza quem vem antes ou depois. Ex.
 

17 horas atrás, Simon Viegas disse:

if (hora >= '06h') and (hora < '14h') then
  begin
  turno:=('Manhã');
  write(user, ' seu turno de trabalho é ', turno);
  end
else
  if (hora >= '14h') and (hora < '22h') then
    begin
    turno:=('Tarde');
    write(user, ' seu turno de trabalho é ', turno);
    end
  else
    if (hora >= '22h') or (hora < '06h') then
      begin
      turno:=('Noite');
      write(user,

 

Se inseriu '16h30', no primeiro if primeiro ele compara '1' com '0'. Um é maior (vem depois na ordem alfabética). O computador já sabe que '16h30' é maior ou igual a '06h' . A primeira sentença resulta em true. Depois na outra parte compara '1' com '1'. É igual. Precisa comparar o próximo. Verifica que '6' não é menor que '4', logo resulta false. O if vai resultar false. Pula para o else. No outro if compara '1' com '1'. É igual. Compara '6' com '4'. É maior, logo '16h40' é maior ou igual a '14h' (true). Precisa verificar a outra sentença. '1' é menor que '2', logo já sabe que '16h30' é menor que '22h', também resulta true. Logo, entra nesse segundo if.

 

 

Então, para o programa funcionar corretamente não tem isso de "caso", na verdade o usuário DEVE digitar assim, pois o programa está justamente estruturado para comparar assim... por isso que comentei isso:

 

17 horas atrás, Simon Viegas disse:

Mas se digitar "7h30", iria acontecer o quê? vai entrar como noite.

 

Ou seja, eu já previ o que pode acontecer.. o if que foi definido pelo usuário só vai funcionar corretamente se inserir 07h30 (com o 0 antes). Entende? estou evidenciando que o programa pode ter problemas. "Sabe que '7h30' é manhã é uma abstração nossa... o Pascal não entende isso. Ele simplesmente vai comparar letra por letra e vai entra no if que resulta na mensagem do noite, ou seja, dando um resultado que não é o desejado.

 

Então, e aí? o que pode ser feito?


Daí o programador precisa definir, por exemplo, que vai ignorar, ou seja, vai pressupor que o usuário somente vai inserir horários como esperado (no formato com um 0 na frente com for menor que 10 e com um 'h' no meio). Ou pode criar alguma lógica para tratar o caso... como por exemplo verificar com e sem o 0. etc...

 

 

 

 

 

Sobre:

16 horas atrás, Educador Prepara disse:

[...] ou usasse a letra "h" no final dos números? Como ficaria a linha?

 

Nesse caso, não vai funcionar adequadamente. Então... a questão central é: como funciona a comparação de string no Pascal?

 

No caso, o Pascal compara letra por letra... é análogo a um processo de "ordenação". Como citado, seria como "colocar em ordem num dicionário". Pegue um dicionário ai... perceba que todas as paravas que estão sendo "explicadas" lá estão em ordem alfabética!!! No Pascal, uma string ser maior que outra é o mesmo dizer que "viria depois se estivesse em ordem alfabética no dicionário". Por exemplo:

 

Qual o resultado desse algoritmo?

program O_que_vem_antes;
begin
if ('sucesso' < 'trabalho') then
  writeln('O sucesso vem antes do trabalho')
else
  writeln('O trabalho vem antes do sucesso');
readln;
end.

 

É simples. O Pascal vai comparar letra por letra:

"A letra 's' é menor ou maior que 't''? é menor. Logo, a ordem já está definida (não precisa comparar o resto). O 'sucesso' vem antes de 'trabalho'. Pegue o dicionário e olhe ai!!! Isso corrobora com o famoso provérbio:

 

Citação

O único lugar onde o sucesso vem antes do trabalho é no dicionário.

 

Ou seja, alfabeticamente "sucesso" é 'menor' que 'trabalho'. No Pascal isso é uma questão de "paradigma"... ou seja, simplesmente o desenvolvedor do Pascal fez que "ao se comparar uma string, o computador vai comparar letra por letra e vai definindo quem vem antes ou depois no alfabeto". Simples assim.

 

 

Att,

 

adicionado 1 minuto depois

@Educador Prepara, faça isso:

 

18 horas atrás, Simon Viegas disse:

Em vez de ler a hora como uma string, altere o código para ler a hora como um inteiro (integer) e poste o código aqui.

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

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...