avk013.blogspot.com - другой мой блог "C# and etc"

суббота, 31 октября 2015 г.

решение задачи про разные скидки

Это, возможно некрасивое мое решение задачи...вариация...
задача взята с job.lightsoft.ru/tech/testYourself, и реализована без ООП.
Есть продукты A, B, C, D, E, F, G, H, I, J, K, L, M. Каждый продукт стоит определенную сумму.
Есть набор правил расчета итоговой суммы:
Если одновременно выбраны А и B, то их суммарная стоимость уменьшается на 10% (для каждой пары А и B)
Если одновременно выбраны D и E, то их суммарная стоимость уменьшается на 5% (для каждой пары D и E)
Если одновременно выбраны E,F,G, то их суммарная стоимость уменьшается на 5% (для каждой тройки E,F,G)
Если одновременно выбраны А и один из [K,L,M], то стоимость выбранного продукта уменьшается на 5%
Если пользователь выбрал одновременно 3 продукта, он получает скидку 5% от суммы заказа
Если пользователь выбрал одновременно 4 продукта, он получает скидку 10% от суммы заказа
Если пользователь выбрал одновременно 5 продуктов, он получает скидку 20% от суммы заказа
Описанные скидки 5,6,7 не суммируются, применяется только одна из них
Продукты A и C не участвуют в скидках 5,6,7
Каждый товар может участвовать только в одной скидке. Скидки применяются последовательно в порядке описанном выше.
Необходимо написать программу на PHP, которая, имея на входе набор продуктов (один продукт может встречаться несколько раз) рассчитывала суммарную их стоимость.
Программу необходимо написать максимально просто и максимально гибко. Учесть, что список продуктов практически не будет меняться, также как и типы скидок. В то время как правила скидок (какие типы скидок к каким продуктам) будут меняться регулярно.
Все параметры задаются в программе статически (пользовательский ввод обрабатывать не нужно). Оценивается подход к решению задачи. Тщательное тестирование решения проводить не требуется.
======== php
<?php 
$produkt_name_cena=array(
array('a','b','c','d','e','f','g','h','i','k','l','m'),
 array(1,1,1,1,1,1,1,1,1,1,1,1));
$skidka_a=array(array(10,'a','b'),array(5,'d','e'),array(5,'e','f','g'),
array(5,'a','k'),array(5,'a','l'),array(5,'a','m'));
$skidka_b=array( array(20,5,'a','c'), array(10,4,'a','c'), array(5,3,'a','c'));
$korzina=array(
 array('a','b','c','d','e','f','g','h','i','k','l','m'),
 array(1,1,2,1,1,4,1,1,1,0,1,1));
$skidka=array(
 //флаг скидкм
 array(0,0,0,0,0,0,0,0,0,0,0,0),
 //процент скидки
 array(0,0,0,0,0,0,0,0,0,0,0,0));
//счет процента общей скидки по скидке b
$procent=0;$nom_skidka_b='';$kol_tov_sk=0;
  for($j=0;$j<count($skidka_b)-1;$j++)  
 {  for($k=2;$k<count($skidka_b[0]);$k++)
 {$kol_tov=0;
    for($i=0;$i<count($korzina[0]);$i++) 
 if ($korzina[1][$i]!=0) 
  if ($skidka_b[$j][$k]!=$korzina[0][$i])
    {$kol_tov++;
      } }
  if($skidka_b[$j][1]<=$kol_tov)
  {$procent=$skidka_b[$j][0];
   $nom_skidka_b=$j;
   $kol_tov_sk=$skidka_b[$j][1];
   break;}}
// зная процент скидки устанавливаем его на товар 
for($i=count($korzina[0])-1;$i>=0;$i--)
 if(($korzina[1][$i]!=0)&&($kol_tov_sk>0)&&($kol_tov>0)&&(is_numeric($nom_skidka_b)))
{$skidka[0][$i]=1;$skidka[1][$i]=$procent;$kol_tov_sk--;}
//разбираемся с парной скидкой
for($j=0;$j<count($skidka_a);$j++)
{ $kol_tov=0; 
    for($k=1;$k<count($skidka_a[0]);$k++)
 for($i=0;$i<count($korzina[0]);$i++) 
 {//echo '='.$kol_tov.'+'.$skidka_a[$j][$k].'_'.$j.'_'.$k.'<BR>';
 if (($korzina[1][$i]!=0)&&($skidka[0][$i]==0))
 if ($skidka_a[$j][$k]==$korzina[0][$i])
{$kol_tov++; }
 //если количество товаров для строки сошлись
 //нужно застолбить им скидку
  if ($kol_tov==count($skidka_a[$j])-1)
{ /////
 for($k=1;$k<count($skidka_a[0]);$k++)
 for($i=0;$i<count($korzina[0]);$i++) 
 if (($korzina[1][$i]!=0)&&($skidka[0][$i]==0))
 if ($skidka_a[$j][$k]==$korzina[0][$i])
{$skidka[0][$i]=1;$skidka[1][$i]=$skidka_a[$j][0];}
 }}}
//вывести корзину на экран
for($i=0;$i<count($korzina[0]);$i++)
 if($korzina[1][$i]!=0)echo 'tovar: '.$korzina[0][$i].'_skidka='.$skidka[1][$i].'<BR>';?>
_________________
(С) Коваленко Александр

Комментариев нет:

Отправить комментарий