Comunidad de diseño web y desarrollo en internet online

..::Lógica de programación, ejercicio::..

Citar            
MensajeEscrito el 29 Ago 2011 04:32 pm
Hola, soy nuevo en el foro, me estoy iniciando en la programación, tengo un problema con un ejercicio de lógica de programación, es el siguiente:

Calcular el sueldo semanal de un trabajador de jornada diurna en base a su sueldo por hora y las horas que trabajó a la semana, considerando el artículo 66 de la Ley federal del trabajo que dice: "podrá también prolongarse la jornada de trabajo por circunstancias extraordinarias, sin exceder nunca de tres horas diarias ni de tres veces en una semana", las primeras 8 horas se pagarán doble y las demás el triple.

Este es el ejercicio, en lo que se me dificulta, es como sumar el total que gano en una semana más las horas extras, a continuación muestro el codigó que logre generar, pero creo que no esta bien del todo, creo que puede reducirse más y generar un mejor codigó, ¿como puedo lograr que el codigó tenga mayor funcionalidad con la menor cantidad de líneas?...

Código PHP :

<?php

$sueldoPorHora = 50;
   
   for($horaDia = 1; $horaDia <= 40; $horaDia++){
      $horasTrabajadas++ ."<br>";
      
      if($horasTrabajadas == 8){
         echo "En un d&Iacute;a se gana ".($sueldoPorHora * $horaDia). " pesos<br>";
      }else{
         if($horasTrabajadas == 16){
            echo "En dos d&Iacute;as se gana ".($sueldoPorHora * $horaDia)." pesos<br>";
         }else{
            if($horasTrabajadas == 24){
               echo "En tres d&Iacute;as se gana ".($sueldoPorHora * $horaDia)." pesos<br>";
            }else{
               if($horasTrabajadas == 32){
                  echo "En cuatro d&Iacute;as se gana ".($sueldoPorHora * $horaDia)." pesos<br>";
               }else{
                  if($horasTrabajadas == 40){
                     echo "En cinco d&Iacute;as se gana ".($sueldoPorHora * $horaDia)." pesos<br><br>";
                     echo "En una semana se gana ".($sueldoPorHora * $horaDia)." pesos<br><br>";
                  }
               }
            }
         }
      }
   }
   
   echo "Horas Extras Acumuladas<br><br>";
   
   for($horaExtra = 1; $horaExtra <= 9; $horaExtra ++){
      if($horaExtra == 3){
         echo "En el d&iacute;a 1 horas acumuladas son ".(($sueldoPorHora * $horaExtra) * 2)." pesos<br>";
      }else{
         if($horaExtra == 6){
            echo "En el d&iacute;a 2 horas acumuladas son ".(($sueldoPorHora * $horaExtra) * 2)." pesos<br>";
         }else{
            if($horaExtra == 8){
               echo "En el d&iacute;a 3 horas acumuladas son ".((($sueldoPorHora * $horaExtra) * 2) + ($sueldoPorHora * 3))." pesos<br>";
            }
         }
      }
   }

?>


Coloque una variable llamada $sueldoPorHora con un valor de 50, como ejemplo, dos for, el primero para horas que trabaja en una semana, suponiendo que la jornada laboral del trabajador por dia son 8 horas y 5 días a la semana, de Lunes a Viernes, el segundo for para las horas extras que trabajo.

Gracias por la atención, espero me puedan ayudar con mi problema.

:)

Por Edgar87

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Ago 2011 02:07 am
bueno, hay una constante y una variable.
la constante es que sabes cuantas horas trabaja a la semana, o sea, sabes que trabaja 8 horas al dia durante cinco dias a la semana y que por hora gana 50 pesos:
$sueldoSemanal = (8*5)*50;
$sueldoSemanal = (8 horas X 5 dias)*50 pesos;
$sueldoSemanal = 40 horas X 50 pesos;
$sueldoSemanal = 2000 pesos a la semana, buen salario...

Esa es la parte facil de tu problema, la parte dificil es la variable,. Sabemos que el trabajador no puede laborar mas de 3 horas extra al dia, y no mas de tres dias a la semana... Asi que tenemos otra constante implicita, 3 horas, por tres dias dan nueve horas a la semana, excelente.

Pedimos la cantidad de dias que trabajo horas extra:
$cantidadDiasTE = <input de cantidad de dias>
if ($cantidadDiasTE >= 3){
hacemos un ciclo para pedir la cantidad de horas por dia que trabajo tiempo extra
for ($dia; $dia>=3;$dia){
$horasDia[] = <input de horas extra trabajadas> //Esto es un array pero lo puedes hacer de cualquier otra forma que te guste
}
sumamos las horas extra de los dias suponiendo que trabajo los tres dias permitidos y lo multiplicamos por la paga de cada hora
$horasExtraLaboradas = ($horasDia[0]+$horasDia[1]+$horasDia[2])*50;
$horasExtraLaboradas = (2 horas el dia 1 + 3 horas el dia 2 + 3 horas el dia 3) X 50;
$horasExtraLaboradas = 8 X 50;
$horasExtraLaboradas = 400;

Ahora para terminar, sumamos todo:
$sueldoFinal = $horasExtraLaboradas + $sueldoSemanal;
$sueldoFinal = 400 + 2000;
$sueldoFinal = 2400...

Esto es a groso modo como se resuelve tu problema, como veras no ocupas tantos if, ademas lo que te hace falta para resolver tu problema es leer con atencion lo que se te pide, y por cierto no creo que nadie te ayude mas alla de esto, y esta explicacion es generica, asi que tendras que indagar un poco en google sobre como capturar datos con php, los arrays y como sumarlos y como trabajar con cliclos...

Suerte!

Por holler

65 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 30 Ago 2011 02:11 am
ah y me falto esta parte de tu problema: las primeras 8 horas se pagarán doble y las demás el triple.

Entonces ya no es 8 x 50, es:
$sumarHoras = $horasDia[0]+$horasDia[1]+$horasDia[2];
if ($sumarHoras <=8){
$horasExtraLaboradas = $sumarHoras * 100;
} elseif ($sumarHoras >8){
$horasExtraLaboradas = $sumarHoras * 150;
}
Y ahora si para terminar, sumamos todo:
$sueldoFinal = $horasExtraLaboradas + $sueldoSemanal;
$sueldoFinal = 800 + 2000;
$sueldoFinal = 2400...

Por holler

65 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 31 Ago 2011 01:22 am
una cosa enves de tantos "ifs" en programacion existe el famoso SWITCH

Código PHP :

switch($horasTrabajadas)
{
   case 8:echo "En un d&Iacute;a se gana ".($sueldoPorHora * $horaDia). " pesos<br>"; break;
   case 16: echo "En dos d&Iacute;as se gana ".($sueldoPorHora * $horaDia)." pesos<br>"; break;
   case 24: echo "En tres d&Iacute;as se gana ".($sueldoPorHora * $horaDia)." pesos<br>"; break;
   case 32:echo "En cuatro d&Iacute;as se gana ".($sueldoPorHora * $horaDia)." pesos<br>"; break;
   case 40:echo "En cinco d&Iacute;as se gana ".($sueldoPorHora * $horaDia)." pesos<br><br>"; 
                     echo "En una semana se gana ".($sueldoPorHora * $horaDia)." pesos<br><br>"; break;
   default:echo "ALgo no esta bien";
}

mm interesante el problema jeje haber mm si saco tiempo pa resolverlo de forma elegante

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 31 Ago 2011 09:56 pm
Gracias por la ayuda, ya se me ocurrio una forma de hacerlo, y seria algo como esto:

Código PHP :

    <?php
    $horastrabajadas = array(8, 8, 8, 9, 8); //horas semana, 5 días
    $sueldoporhora = 50;
    $sueldosemana = 0;
    $ley = 0;
     
    if (max($horastrabajadas) <= 11) { //sin exceder nunca de tres horas diarias
        foreach ($horastrabajadas as $ht) {
            if ($ht == 8) {
                $sueldosemana += $ht * $sueldoporhora * 2;
        //las primeras 8 horas se pagarán doble
            } else if ($ht > 8) {
                $extras = $ht - 8;
                $sueldosemana += 8 * $sueldoporhora * 2;
                $sueldosemana += $extras * $sueldoporhora * 3;
                $ley++;
        //las demás el triple.
            }
        }
        if ($ley <= 3) { //ni de tres veces en una semana
            echo 'Sueldo semana: ' . $sueldosemana;
        } else {
            echo 'No cumple con la ley federal';
        }
    } else {
        echo 'No cumple con la ley federal';
    }
?>


Gracias por las sugerencias, tambien ya estoy buscando lo que me comentaron, capturar datos con php, ahora me dejaron que todos los ejercicios de logica que tenia, que los hiciera con clases, busque en google clases en php, y me aparece mucho esto, algo llamado POO (programación orientada a objetos), pérdon por mis lagunas mentales, tendre que esforzarme más para comprender que es esto.

Muchas gracias.

^^

Por Edgar87

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Sep 2011 04:17 am
Venga que no tenia ganas de trabajar y me puse con lo tuyo, es algo asi, lo puedes mejorar mucho todavia, pero funciona lo basico:

Código PHP :

<?


// horas extra maximas al dia 3
// dias maximos permitidos con horas extra 3
// las 8 primeras horas extra se pagan al doble del salario ordinario y el resto al triple
// total de horas extra permitidas a la semana 9
if (isset($_POST['Calcular'])){
   $n = 0; #dia
   $diasTE=0; #conteo de dias con tiempo extra trabajado 
   $totalTE = 0; #conteo de tiempo extra trabajado
   foreach( $_POST['hora'] as $key => $value){
      $n++;
      if ($value <= 8){ #si horas capturadas menor o igual a ocho entra
         $SalarioOrdinario = 8 * 50;
         $salarioTotal += $SalarioOrdinario; #se suma la cantidad al salario total
      } elseif ($value > 8 && $value <= 11 && $totalTE <= 8 && $diasTE <=2){         
         $horasExtras = $value - 8; #se separan la jornada normal de 8 horas del tiempo extra
         echo $horasExtras;
         $SalarioOrdinario = 8 * 50; #se pagan las ocho primeras horas normales
         $SalarioTE = $horasExtras * 100; #se paga el resto al doble
         $salarioTotal += $SalarioOrdinario + $SalarioTE;  #se suma la cantidad al salario total
         $totalTE += $horasExtras; #se suman las horas extra al total de tiempo extra trabajado
         $diasTE++; #se incrementa en 1 los dias extra laborados
      } elseif ($value > 8 && $value <= 11 && $totalTE == 9 && $diasTE <=2){
         $horasExtras = $value - 8; #se separan la jornada normal de 8 horas del tiempo extra
         $SalarioOrdinario = 8 * 50; #se pagan las ocho primeras horas normales
         $SalarioTE = ($horasExtras * 100)+50; #se paga el resto al doble + 1 hora al triple
         $salarioTotal += $SalarioOrdinario+ $SalarioTE;  #se suma la cantidad al salario total
         $totalTE += $horasExtras; #se suman las horas extra al total de tiempo extra trabajado
         $diasTE++; #se incrementa en 1 los dias extra laborados
      } elseif ($value > 11 || $totalTE > 9 && $diasTE <=2){
         $SalarioOrdinario = 8 * 50;
         $salarioTotal += $SalarioOrdinario; #se suma la cantidad al salario total   
         $error1 = true;
         
      } elseif ($diasTE > 2){
         $SalarioOrdinario = 8 * 50;
         $salarioTotal += $SalarioOrdinario; #se suma la cantidad al salario total   
         $error2 = true;
      }
         
   }
   echo "Resumen:<br/>";
   echo "Dias Laborados: ".$n."<br />";
   echo "Dias Laborados con tiempo extra: ".$diasTE."<br />";
   echo "Tiempo extra total laborado: ".$totalTE."<br />";
   if ($error1) { echo "El trabajador ha laborado mas horas extra de las permitidas. Solo se pagara la jornada normal<br />"; }
   if ($error2) { echo "El trabajador ha laborado mas dias extra de los permitidos. Solo se pagara la jornada normal<br/>"; }
   echo "Salario total con horas extra: ".$salarioTotal;
}


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

<form method="post" action="calcularpago.php" autocomplete="off">
<table>
<tr>
<td>&nbsp;</td>
<? for ($dia=0; $dia<=5; $dia++) { ?>
<td><center>dia <? echo $dia ?></center></td>
<? } ?>
</tr>
<tr>
<td>Horas</td>
<? for ($dia=0; $dia<=5; $dia++) { ?>
<td><input name="hora[]" type="text" /></td>
<? } ?>
</tr>
</table>
<input type="submit" value="Calcular" name="Calcular" />
</form>

</body>
</html>

Por holler

65 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 11 Sep 2011 08:00 am
Muchas Gracias !!!

Por Edgar87

2 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.