onlineExam

オンラインテスト (2月2日、2月9日)

準備

テストに使うデータを以下のURLよりダウンロードして,プログラム作成用のディレクトリの下に新しいディレクトリを作って格納しておく.

http://richard.js.yamanashi.ac.jp/~toyoki/lectures/bwp/local_info/elecPower201312.zip

これらを読み込んで,表にしたり,平均値や合計を計算したりしてみよう.

サンプルプログラム

<?php
  $dir = "./elecPower/";

  $files = getDir($dir,".csv");
  sort($files);

  foreach($files as $f) {
    preg_match("/[0-9]+/",$f,$matches); //ファイル名から数字の部分を検索する → $matchesに検索された文字列が配列としてはいる
    $date = $matches[0];  // $matches[0]に年月が入っている.
    echo $date . "\n";    // テストのために出力してみる.
  }

  function getDir($dir_name,$extension) {

    $found_files = array(); //配列変数を用意する

    if(!is_dir($dir_name)) die("不正なディレクトリです.");
    $dir = opendir($dir_name);
    while($file = readdir($dir)) {
      if(preg_match("/".$extension . "$/",$file)) $found_files[] = $file;
    }
    return($found_files);
  }

(注)正規表現での文字列検索や置換はeregではなくpregを使うことが推奨されていますので,そちらを使いましょう.

http://www.php.net/manual/ja/refs.basic.text.php

テスト1(2月2日)

問題1

問題1の出力例

問題2

問題2の出力例

テスト2(2月9日)

問題3

問題2に対して次のような改良を加えなさい.

問題3の出力例

解答の提出 (16時20分まで)

解答はe-Learningのページヘ提出してください.

https://moodle.yamanashi.ac.jp/2014/course/view.php?id=1650

解答例

問題3の解答例を示します。

<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.01 traditional//en">
<!-- オンラインテスト1-3 (データの欠損に対応した例) -->
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
</head>
<body>
<?php
$dir = "./elecPower/";
//
$files = getDir($dir,".csv");
sort($files);


echo "<table border='2'><tr><th></th>";
//
for($i=1;$i<=24; $i++) {
  echo "<th>" . $i . "時</th>";
  $usageByHour[$i] = 0;  //
  $dataNum[$i] =0;     //
}
echo "<th>合計</th></tr>";

//
foreach($files as $f) {
  preg_match("/[0-9]+/",$f,$matches);
  $date = $matches[0];
  $FP = fopen($dir . $f,"r");

  $usage = array(); //

  echo "<tr><td>" . $date ."</td>";
  while(!feof($FP)) { // データを記録
    $line = trim(fgets($FP));
    if($line == "") continue;
    $item = explode(",",$line);
    $usage[$item[0]] = $item[2];
  }
  //
  $dailyUsage = 0;
  for($i=1;$i<=24;$i++) {
    echo "<td>";
    if(isset($usage[$i])) {
      echo $usage[$i];
      $dailyUsage += $usage[$i];
      $usageByHour[$i] += $usage[$i];
      $dataNum[$i]++;
    }
    echo "</td>";
  }
  echo "<td>" . $dailyUsage . "</td></tr>";
}
echo "<tr><td>平均</th>";
for($i=1; $i<=24; $i++) {
  $average = sprintf("%.2f", $usageByHour[$i]/$dataNum[$i]);
  echo "<td>" . $average ."</td>" ;
}
echo "</tr></table>";

function getDir($dir_name,$extension) {

  $found_files = array(); //

  if(!is_dir($dir_name)) die("不正なディレクトリです.");
  $dir = opendir($dir_name);
  while($file = readdir($dir)) {
    if(preg_match("/".$extension . "$/",$file)) $found_files[] = $file;
  }
  return($found_files);
}
?>
</body>
</html>

以下も同じプログラムからの引用です。(2月18日夕方までは、表示ソフトの問題で、一部文字が欠損して表示されていましたが、今はOKになりました。)

<!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.01 traditional//en">
<!-- オンラインテスト1-3 (データの欠損に対応した例) -->
<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
</head>
<body>
<?php
$dir = "./elecPower/";
// データファイルの検出
$files = getDir($dir,".csv");
sort($files);


echo "<table border='2'><tr><th></th>";
// 一行目の見出し
for($i=1;$i<=24; $i++) {
  echo "<th>" . $i . "時</th>";
  $usageByHour[$i] = 0;  // 時刻ごとの値の累積
  $dataNum[$i] =0;     // データが存在する日にちの数
}
echo "<th>合計</th></tr>";

// ファイルを1つずつ読み込んで処理
foreach($files as $f) {
  preg_match("/[0-9]+/",$f,$matches);
  $date = $matches[0];
  $FP = fopen($dir . $f,"r");

  $usage = array(); // 時刻ごとのデータを記憶する

  echo "<tr><td>" . $date ."</td>";
  while(!feof($FP)) { // データを記録
    $line = trim(fgets($FP));
    if($line == "") continue;
    $item = explode(",",$line);
    $usage[$item[0]] = $item[2];
  }
  // データセルの書き出しと記憶
  $dailyUsage = 0;
  for($i=1;$i<=24;$i++) {
    echo "<td>";
    if(isset($usage[$i])) {
      echo $usage[$i];
      $dailyUsage += $usage[$i];
      $usageByHour[$i] += $usage[$i];
      $dataNum[$i]++;
    }
    echo "</td>";
  }
  echo "<td>" . $dailyUsage . "</td></tr>";
}
echo "<tr><td>平均</th>";
for($i=1; $i<=24; $i++) {
  $average = sprintf("%.2f", $usageByHour[$i]/$dataNum[$i]);
  echo "<td>" . $average ."</td>" ;
}
echo "</tr></table>";

function getDir($dir_name,$extension) {

  $found_files = array(); //配列変数を用意する

  if(!is_dir($dir_name)) die("不正なディレクトリです.");
  $dir = opendir($dir_name);
  while($file = readdir($dir)) {
    if(preg_match("/".$extension . "$/",$file)) $found_files[] = $file;
  }
  return($found_files);
}
?>
</body>
</html>