Problemas com restrições

Question:

14) Faça um algoritmo que receba o horário de entrada e saída (em horas e minutos) de um
funcionário de determinada empresa. Com base nestes horários, defina a quantidade de horas
trabalhadas. Partindo-se da quantidade de horas trabalhadas defina em qual perfil salarial o
funcionário se encontra:
Perfil A - R$ 30 hora —> Trabalha menos que 4 horas por dia;
Perfil B - R$ 70 hora —> Trabalha de 4 horas a 8 horas por dia;
Perfil C - R$ 90 hora —> Trabalha mais do que 8 horas por dia;
O algoritmo deverá apresentar ao usuário o nome do funcionário, a quantidade de horas
trabalhadas, o perfil do funcionário e seu salário diário.
Obs.: O funcionário pode entrar num dia e sair somente no outro. Além disso, a quantidade
máxima de horas que ele poderá trabalhar é de 36 horas.

Acima o exercício que tenho que fazer, mas quando tento criar algumas restrições não consigo, por exemplo, no caso de calcular quantas horas ele trabalhou eu não consigo fazer todos os casos, ou seja, de forma genérica possível, aí o valor das horas trabalhadas fica nulo, ou aparece a mensagem “NaN” enfim. Mandei a parte do código em que parei, fiquei com dúvida também sobre a restrição de entrar em um dia e sair no outro, mas é ruim quando você pensa nos ultimos dias do mês, por exemplo entrou dia 31 e saiu dia 01. Outro problema que estou tentando formular é como armazenar a informação toda e exibir na tela, primeiro pensei em criar um vetor, mas não lembro nada de vetores. E talvez não seja suficiente. Tem também a questão do perfil, porque ele diz no maximo 36 horas e os perfis a, b e c, mas não da uma frequencia, por exemplo uma media de 1 mes ou 1 semana, quer dizer. Que referencia usa para esse perfil, uma unica jornada de trabalho?

Repl link:
https://replit.com/@JoaoLuz3/perfildofuncionario#main.c

#include <stdio.h>

int main(void) {
  char nome[61];
  int hora_entrada, hora_saida, minutos_entrada, minutos_saida, dia_entrada, dia_saida, mes_entrada, horas_trabalhadas, valor;
  printf("Perfil A - R$ 30 hora --->\n Trabalha menos que 4 horas por dia; \nPerfil B - R$ 70 hora --->\n Trabalha de 4 horas a 8 horas por dia; \nPerfil C - R$ 90 hora --->\n Trabalha mais do que 8 horas por dia; \n");
  printf("Digite o nome do funcionário:\n");
  scanf("%s", nome);
  printf("Entre apenas com o valor da hora de entrada:\n");
  scanf("%i", &hora_entrada);
  printf("Entre apenas com o valor de minutos\n da entrada:\n");
  scanf("%i", &minutos_entrada);
  printf("Entre apenas com o valor de hora da saida:\n");
  scanf("%i", &hora_saida);
  printf("Entrar apenas com o dia de entrada:\n");
  scanf("%i", &dia_entrada);
  printf("Entrar apenas com o mes de entrada:\n");
  scanf("%i", &mes_entrada);
  printf("Entrar apenas com o dia de saida:\n");
  scanf("%i", &dia_saida);
  if(dia_entrada>30)

  if((dia_saida-dia_entrada)==1)
  {
    if(hora_entrada>=0 && hora_saida<=12)
    {
      horas_trabalhadas=hora_saida-hora_entrada;
    }
    if(hora_entrada>12 && hora_saida<23)
    {
      horas_trabalhadas=(24-hora_entrada)-(24-hora_saida);
    }
    if(hora_entrada>12 && 0<=hora_saida<=12)
    {
      horas_trabalhadas=(24-hora_entrada)+hora_saida;
    }
  }

  if(dia_saida-dia_entrada<1)
  {
    printf("O funcionário pode entrar num dia\n e sair somente no outro");
  }
  printf("\nO nome do funcionário é:\n%s", nome);
  printf("\nAs horas trabalhadas foram: %f\n", horas_trabalhadas);
  return 0;
}

Welcome to the forums, @JoaoLuz3!

You should not be posting your school/uni assignments to this forum. It’s not right to expect others to do the work for you and your tutor will not understand how to help you if you are submitting work from someone else. It is against our policy here.

Please feel free to post questions that will help you understand the building blocks of programs, but don’t post tasks again.


Bem-vindo aos fóruns, @JoaoLuz3!

Você não deve postar suas tarefas escolares/universitárias neste fórum. Não é certo esperar que outros façam o trabalho por você e seu tutor não entenderá como ajudá-lo se você estiver enviando o trabalho de outra pessoa. É contra nossa política aqui.

Sinta-se à vontade para postar perguntas que o ajudarão a entender os blocos de construção dos programas, mas não poste tarefas novamente

3 Likes

Olá @JoaoLuz3 , seja bem vindo a comunidade!

Como este é um exercício escolar, nós não podemos te dar a reposta, porém, podemos te guiar a solucionar seus problemas, vou comentar alguns pontos na qual você pode corrigir no seu código.

  1. Conforme você disse, o cálculo das horas trabalhadas não está correto:
    Você não está considerando todas as situações possíveis. Por exemplo, se o funcionário começa a trabalhar às 23:00 e terminasse esse trabalho às 01:00, o seu código vai calcular isso como -22 horas de trabalho, o que não está correto. Você precisa verificar se a hora de saída é maior ou igual a hora de entrada if(hora_saida >= hora_entrada), o que significa que a saída e a entrada ocorreram no mesmo dia. Caso contrário (else), assumimos que a entrada ocorreu no dia anterior.

  2. Você não está determinando o perfil salarial (A, B, C):
    O seu código não determina o perfil salarial do funcionário. Para fazer isso, é preciso calcular o total de minutos trabalhados, e assim, usamos isso para determinar o perfil. Se o total de minutos for menor que 240 (ou seja, 4 horas), então o perfil é A e o salário é calculado com base nisso. Se o total de minutos for menor ou igual a 480 (ou seja, 8 horas), então o perfil é B e o salário é calculado com base nisso. Caso contrário, o perfil é C e o salário é calculado com base nisso.

Dica: Converta tudo para minutos para facilitar os cálculos

int total_minutos = horas_trabalhadas * 60 + minutos_trabalhados;

  1. Impressão dos resultados:
    Conforme o exercício diz “O algoritmo deverá apresentar ao usuário o nome do funcionário, a quantidade de horas trabalhadas, o perfil do funcionário e seu salário diário.”

Ou seja, quando você for definir o perfil e calcular o salário, você já pode imprimir qual o perfil do funcionário e depois imprimir os outros 3 campos.


Hello @JoaoLuz3, welcome to the community!

Since this is a school exercise, we cannot give you the answer, but we can guide you to solve your problems. I’ll comment on some points that you can correct in your code.

  1. As you mentioned, the calculation of working hours is incorrect: You are not considering all possible situations. For example, if the employee starts working at 11:00 PM and finishes at 01:00 AM, your code will calculate it as -22 working hours, which is incorrect. You need to check if the departure time is greater than or equal to the entry time if (departure_time >= entry_time), which means that the departure and entry occurred on the same day. Otherwise (else), we assume that the entry occurred on the previous day.
  2. You are not determining the salary profile (A, B, C): Your code does not determine the employee’s salary profile. To do this, you need to calculate the total minutes worked and use that to determine the profile. If the total minutes are less than 240 (i.e., 4 hours), then the profile is A and the salary is calculated based on that. If the total minutes are less than or equal to 480 (i.e., 8 hours), then the profile is B and the salary is calculated based on that. Otherwise, the profile is C and the salary is calculated based on that.

Tip: Convert everything to minutes to facilitate the calculations

int total_minutes = working_hours * 60 + working_minutes;

  1. Printing the results: According to the exercise, “The algorithm should present to the user the employee’s name, the number of hours worked, the employee’s profile, and their daily salary.”

In other words, when you define the profile and calculate the salary, you can already print the employee’s profile and then print the other 3 fields.

4 Likes

Olá @Firepup650 e Olá @WindLother, obrigado pela ajuda de qualquer forma.

Ainda estou aprendendo sobre essas políticas de fóruns, também sigo um de matemática. Compreendo a ética por trás. Eu fiz a maioria dos exercícios propostos mas alguns simplesmente não tenho base para resolver, então estou procurando ajuda, pois o prazo é muito curto, além das outras disciplinas que curso junto a esta. Reitero novamente que o auxilio foi de grande ajuda, espero poder contribuir melhor para a comunidade em uma próxima oportunidade.

Att

João de Sousa Luz

1 Like