Advertisement
EvenGuy

Олимпиада по Веб: Задание А

Feb 17th, 2018
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.06 KB | None | 0 0
  1. <?
  2.     /**
  3.     * Задание А
  4.     *
  5.     * Стандартный файл с входными данными - input.txt
  6.     * Стандартный файл с выходными данными - output.txt
  7.     *
  8.     * Другие имена файлов задаются в качестве параметров констуктора класса
  9.     */
  10.  
  11.     class Casino {
  12.         // Кол-во ставок и игр
  13.         private $cntStavki;
  14.         private $cntIgri;
  15.        
  16.         // Массивы ставок и игр
  17.         private $arStavki;
  18.         private $arIgri;
  19.        
  20.         // Результат игры
  21.         public $gameRes = 0;
  22.        
  23.         // Входные данные (массив строк из файла)
  24.         private $arFileData;
  25.        
  26.         /*
  27.          * Конструктор класса
  28.          * $inFName - имя входного файла
  29.          * $outFName - имя выходного файла
  30.          */
  31.         function __construct($inFName = 'input.txt', $outFName = 'output.txt') {
  32.             // Считывание входных данных
  33.             try { $this->loadDataFromFile($inFName); }
  34.             catch (Exception $e) {
  35.                 echo "При считывание файла $inFName возникла ошибка: ".$e->GetMessage();
  36.                 exit;
  37.             }
  38.            
  39.             // Обработка входных данных
  40.             try  { $this->procInData(); }
  41.             catch (Exception $e) {
  42.                 echo "При обработке входных данных возникла ошибка: ".$e->GetMessage();
  43.                 exit;
  44.             }
  45.            
  46.             // Вычисление результата
  47.             $this->calcRes();
  48.            
  49.             // Запись результата в файл
  50.             try { $this->saveResToFile($outFName); }
  51.             catch (Exception $e) {
  52.                 echo "При записи в файл $outFName возникла ошибка: ".$e->GetMessage();
  53.                 exit;
  54.             }
  55.         }
  56.        
  57.         /*
  58.          * Метод - чтение данных из файла
  59.          * Параметры: $FName - имя файла
  60.          *
  61.          * Считывает все строки файла в массив $arFileData
  62.          */
  63.         function loadDataFromFile($FName) {
  64.             // Проверка наличия имени файла
  65.             if ( strlen($FName) == 0 )
  66.                 throw new Exception('Не задано имя файла');
  67.            
  68.             // Проверка существования самого файла
  69.             if ( !file_exists($FName) )
  70.                 throw new Exception('Файл не существует');
  71.            
  72.             // Проверка размера файла
  73.             if ( !filesize($FName) )
  74.                 throw new Exception('Файл пуст');
  75.            
  76.             // Считывание данных всего файла в массив
  77.             $this->arFileData = file($FName);
  78.         }
  79.        
  80.         /*
  81.          * Метод - запись результата в файл
  82.          * Параметры: $FName - имя файла
  83.          *
  84.          * Записывает результат игры в файл
  85.          */
  86.         function saveResToFile($FName) {
  87.             // Проверка имени файла
  88.             if ( strlen($FName) == 0 )
  89.                 throw new Exception('Не задано имя файла');
  90.            
  91.             // Создание/перезапись файла
  92.             $fPtr = fopen($FName,'w');
  93.            
  94.             // Запись результата
  95.             fwrite($fPtr,$this->gameRes);
  96.            
  97.             // Закрытие файла
  98.             fclose($fPtr);
  99.         }
  100.        
  101.         /*
  102.          * Метод - обработка входных данных
  103.          *
  104.          * Обрабатывает массив $arFileData и разбивает данные по массивам
  105.          * ставок и игр, а так же записывает их количество.
  106.          */
  107.         function procInData() {
  108.             /*
  109.              * Проверка входных данных по формуле:
  110.              * Значение числа ставок * 2 = кол-во ставок + кол-во игр - 1 (значение числа игр)
  111.              *
  112.              * В коде проверяется, как: значение числа ставок * 2 = кол-во элементов массива - 2
  113.              */
  114.                        
  115.             if ( ( (int)$this->arFileData[0] * 2 ) != ( count($this->arFileData) - 2 ) )
  116.                 throw new Exception('Количество игр и/или ставок не соответствует заданному');
  117.            
  118.             // Считывание кол-ва ставок и копирование самих ставок в массив
  119.             $this->cntStavki = (int)$this->arFileData[0];
  120.             $this->arStavki = array();
  121.            
  122.             for($i = 1; $i <= $this->cntStavki; $i++) {
  123.                 sscanf($this->arFileData[$i], '%d %d %1s', $id, $price, $side);
  124.                 $this->arStavki[$id] = array(
  125.                         'PRICE' => $price,
  126.                         'SIDE' => $side,
  127.                     );
  128.             }
  129.            
  130.             // Считывание кол-ва игр и копирование самих игр в массив
  131.             $this->cntIgri = (int)$this->arFileData[$this->cntStavki+1];
  132.             $this->arIgri = array();
  133.            
  134.             for($i = 1; $i <= $this->cntIgri; $i++) {
  135.                 sscanf($this->arFileData[$i + $this->cntStavki + 1],
  136.                         '%d %f %f %f %1s', $id, $L, $R, $D, $side);
  137.                 $this->arIgri[$id] = array(
  138.                         'L' => $L,
  139.                         'R' => $R,
  140.                         'D' => $D,
  141.                         'SIDE' => $side,
  142.                     );
  143.             }
  144.         }
  145.        
  146.         /*
  147.          * Метод - подсчет результата выигрыша на основе массивов ставок и игр
  148.          *
  149.          * Результат записывается в $gameRes
  150.          */
  151.         function calcRes() {            
  152.             // Перебор ставок и сравнение их с результатами игр
  153.             foreach($this->arStavki as $id => $arVal) {
  154.                 // Делаем ставку
  155.                 $this->gameRes -= (int)$arVal['PRICE'];
  156.                
  157.                 // Проверяем ставку
  158.                 if ( $arVal['SIDE'] == $this->arIgri[$id]['SIDE'] )
  159.                     $this->gameRes += (int)$arVal['PRICE'] *
  160.                             (float)$this->arIgri[$id][$arVal['SIDE']];
  161.             }
  162.         }
  163.     }
  164.  
  165.     $oCasino = new Casino();
  166. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement