# network.pl
# ネットワーク・メニュー
  
while(1)
{
print <<EOF ;
  
1.連番フォルダの作成    5.アンケート集計
2.任意フォルダの作成    6.小テスト
3.ファイル転送          7.ファイル名の変更
4.ファイル回収          8.ファイルの削除
EOF
  
  print "\n 実行番号:" ;
  $pt = <STDIN>;
  chomp $pt;
  
  if($pt == 1)
     {
      require "mysub/mk_fd_s.pl" ;
      &mk_fd_s
     }
  
  elsif($pt == 2)
     {
      require "mysub/mk_fd_r.pl" ;
      &mk_fd_r
     }
  
  elsif($pt == 3)
     {
      require "mysub/transfer.pl" ;
      &transfer
     }
  
  elsif($pt == 4)
     {
      require "mysub/collect.pl" ;
      &collect
     }
  
  elsif($pt == 5)
     {
      require "mysub/enquete.pl" ;
      &enquete
     }
  
  elsif($pt == 6)
     {
      require "mysub/examine.pl" ;
      &examine
     }
  
  elsif($pt == 7)
     {
      require "mysub/rename.pl" ;
      &rename
     }
  
  elsif($pt == 8)
     {
      require "mysub/delete.pl" ;
      &delete
     }
  
  else {print "\n 1〜8 の値を入力してください。"}
  
  print "\n\n 続けますか (1.はい  他.いいえ):" ;
  $nx = <STDIN> ;
  chomp $nx ;
  unless ($nx == 1) {last}
}
  

# call_a_mk_fd_s.pl
# サブルーチンのテスト(4)
  
require "mysub/mk_fd_s.pl" ;
&mk_fd_s ;
  
print " \n\n 何かキーを押してください。" ; <>
  

# mk_fd_s.pl
# 連番の形でフォルダを作るサブルーチン
  
sub mk_fd_s
  {
# 親フォルダの作成
   print "\n 親フォルダ名:" ;
   $main = <STDIN> ;
   chomp $main ;
   mkdir "$main", 0777 ;
  
# 子フォルダ名(番号)
   print "\n 開始-終了番号:" ;
   $num3 = <STDIN> ;
   chomp $num3 ;
   ($num1, $num2) = split /-/, $num3 ;
  
# 子フォルダの作成
   for $num ($num1..$num2)
      {mkdir "$main/$num", 0777}
   print "\n フォルダ作成完了!"
  }
  
1 ;
  

# call_a_mk_fd_r.pl
# サブルーチンのテスト(5)
  
require "mysub/mk_fd_r.pl" ;
&mk_fd_r ;
  
print " \n\n 何かキーを押してください。" ; <>
  

# mk_fd_r.pl
# 任意の名前のフォルダを作るサブルーチン
  
sub mk_fd_r
  {
# 親フォルダの作成
   print "\n 親フォルダ名:" ;
   $main = <STDIN> ;
   chomp $main ;
   mkdir "$main", 0777 ;
  
# 子フォルダの作成
   print "\n 入力終了は Enter Key \n" ;
   while(1)
       {
        print "\n 子フォルダ名:" ;
        $sub_fd = <STDIN> ;
        if ($sub_fd eq "\n") {last}
        chomp $sub_fd ;
        mkdir "$main/$sub_fd", 0777
       }
  
print "\n フォルダ作成終了!"
   }
  
1 ;
  

# call_a_transfer.pl
# サブルーチンのテスト(6)
  
require "mysub/transfer.pl" ;
&transfer ;
  
print " \n\n 何かキーを押してください。" ; <>
  

# transfer.pl
# 指定したフォルダ内にファイルを転送するサブルーチン
  
sub transfer
   {
  # 転送元ファイル名
    print "\n 転送元ファイル名:" ;
    $trans = <STDIN> ;
    chomp $trans ;
  
  # 転送先親フォルダ名
    print "\n 親フォルダ名:" ;
    $main = <STDIN> ;
    chomp $main ;
  
  # 子フォルダ名(番号)
    print "\n 開始-終了番号:" ;
    $num3 = <STDIN> ;
    chomp $num3 ;
    ($num1, $num2) = split /-/, $num3 ;
  
  # ファイル転送
    for $num ($num1..$num2)
       {  
        open F, "$trans.txt" ;
        $name = join "-", $trans, $num ;
        open T, ">$main/$num/$name.txt" ;
        print T <F>
       }
     print "\n ファイル転送完了!"
   }
  
1 ;
  

# call_a_collect.pl
# サブルーチンのテスト(7)
  
require "mysub/collect.pl" ;
&collect ;
  
print " \n\n 何かキーを押してください。" ; <>
  

# collect.pl
# 指定したフォルダ内からファイルを回収するサブルーチン
  
sub collect
   {
  # 出力先ファイル名の入力
    print "\n 出力先ファイル名:" ;
    $makeup = <STDIN> ;
    chomp $makeup ;
  
  # 回収元ファイル名の入力
    print "\n 回収元ファイル名:" ;
    $source = <STDIN> ;
    chomp $source ;
  
  # 回収元親フォルダ名の入力
    print "\n 親フォルダ名:" ;
    $main = <STDIN> ;
    chomp $main ;
  
  # 子フォルダ名(番号)
    print "\n 開始-終了番号:" ;
    $num3 = <STDIN> ;
    chomp $num3 ;
    ($num1, $num2) = split /-/, $num3 ;
  
  # 出力先ファイルのオープン
    open F, ">$makeup.txt" ;
  
  # ファイル転送
    for $num ($num1..$num2)
      {  
     # 回収元ファイルのオープン
       $name = join "-", $source, $num ;
       open T, "$main/$num/$name.txt" ;
  
     # オープンエラーチェック
       unless (open T, "$main/$num/$name.txt")
         {
          print "\n not open $name.txt \n" ;
          print F " not open $name.txt "
         }
  
     # 出力先ファイルへの書き込み
       print F <T> ;
       print F "\n\n"  
      }
    print "\n データ回収完了!"
  }
  
1 ;
  

# call_a_enquete.pl
# サブルーチンのテスト(8)
  
require "mysub/enquete.pl" ;
&enquete ;
  
print " \n 何かキーを押してください。" ; <>
  

# enquete.pl
# アンケートの集計(1問のみ)のサブルーチン
  
sub enquete
   {
  # 親フォルダ名の指定
    print "\n 親フォルダ名:" ;
    $main = <STDIN> ;
    chomp $main ;
  
# ファイル名の指定(**-num.txtの ** 部分)
    print "\n ファイル名:" ;
    $enq = <STDIN> ;
    chomp $enq ;
  
  # 子フォルダ名(番号)の入力
    print "\n 開始-終了番号:" ;
    $num3 = <STDIN> ;
    chomp $num3 ;
    ($num1, $num2) = split /-/, $num3 ;
  
  # データの回収
    for $num ($num1..$num2)
       {  
     # データの読み込み
        $name = join "-", $enq, $num ;
        open T, "$main/$num/$name.txt" ;
        while (<T>)
             {
           # 欠席者と回答者の振り分け
              if ($_ == 0) {push @nul, $num}
              push @data, $_
             }  
       }
  
  # アンケート結果の表示
    @data = sort{$b <=> $a} @data ;
    $total = @data ;
    $max = $data[0] ;
    print "\n 欠席者 ( @nul ) \n" ;
    $sum = $total - @nul ;
    print "\n 回答者数 $sum 名 \n" ;
  
    for $ix (1..$max)
       {
        $px = grep $_ == $ix, @data ;
        $per = 100 * $px / $sum ;
        $qx = sprintf "%.1f", $per ;
        unless ($px == 0)
           {print "\n $ix = $px 名 ($qx %) \n"}
        }    
  }
  
1 ;
  

# call_a_examine.pl
# サブルーチンのテスト(9)
  
require "mysub/examine.pl" ;
&examine ;
  
print " \n\n 何かキーを押してください。" ; <>
  

# examine.pl
# 小テストを自動採点するサブルーチン
  
sub examine
   {
  # 模範解答の名前
    print "\n 模範解答の名前:" ;
    $right = <STDIN> ;
    chomp $right ;
  
  # 模範解答の読み込み
    open R, "$right.txt" ;
    @ans = <R> ;
    map chomp, @ans ;
    $kx = @ans ;
    print "\n 模範解答 @ans \n" ;
  
  # 採点結果の名前
    print "\n 採点結果の名前:" ;
    $score = <STDIN> ;
    chomp $score ;
  
# 生徒の答案名
    print "\n 生徒の答案名:" ;
    $seito = <STDIN> ;
    chomp $seito ;
  
  # 親フォルダ名
    print "\n 親フォルダ名:" ;
    $main = <STDIN> ;
    chomp $main ;
  
  # 子フォルダ名(番号)
    print "\n 開始-終了番号:" ;
    $num3 = <STDIN> ;
    chomp $num3 ;
    ($num1, $num2) = split /-/, $num3 ;
  
  # 採点結果ファイルのオープン
    open F, ">$score.txt" ;
  
# 点数の設定と仮の最大値
    $pt = 2 ;
    $max1 = 0 ;
# 採点結果の書き込み
    for $num ($num1..$num2)
       {  
      # 生徒答案の読み込み
        $name = join "-", $seito, $num ;
        open T, "$main/$num/$name.txt" ;
        while (<T>)
             {
              ($a, $b) = split /:/ ;
              push @test, $b
             }
        map chomp, @test ;
  
      # 欠席者のチェック
        if ($test[0] eq "0000")
          {push @abs, $num ; $xx = 1}
  
      # 答案の採点
        else
          {
           for $i (1..$kx)
              {
               if ($test[$i] eq $ans[$i-1])
                 {$sum += $pt}
              }
          }
  
     # 合計点(平均点用)
        $total += $sum ;
  
      # 最高得点者の検出
        if ($sum > $max1)
          {
           $max1 = $sum ;
           undef @max ;
           @max = $num
          }
        elsif ($sum == $max1)
          {
           push @max, $num
          }
  
      # 個人成績の書き込み
        unless ($xx == 1)
          {
           shift @test ;
           $sum2 = sprintf "%2d", $sum ;
           print "\n $num 番 $sum2 点 ( @test )\n" ;        
           print F "\n $num 番 $sum2 点 ( @test )\n"
          }
        undef $sum ; undef @test ; undef $xx ;
       }
  
# 欠席者・平均点・最高得点者の書き込み
   $abx = @abs ;
   print "\n 欠席者   $abx 名 ( @abs ) \n" ;
   print F "\n 欠席者   $abx 名 ( @abs ) \n" ;
   $ave = $total/($num2 - $num1 + 1 - $abx) ;
   $ave2 = sprintf "%.1f", $ave ;
   $max2 = sprintf "%3d", $ave ;
   print "\n 平均点 $ave2 点 \n\n 最高点  $max1 点 ( @max ) " ;      print F "\n 平均点 $ave2 点 \n\n 最高点  $max1 点 ( @max ) "     }
  
1 ;
  

# call_a_rename.pl
# サブルーチンのテスト(10)
  
require "mysub/rename.pl" ;
&rename ;
  
print " \n 何かキーを押してください。" ; <>
  

# rename.pl
# ファイル名変更のサブルーチン
  
sub rename
   {
  # 親フォルダ名の指定
    print "\n 親フォルダ名:" ;
    $main = <STDIN> ;
    chomp $main ;
  
# 変更するファイル名
    print "\n 変更するファイル名:" ;
    $name1 = <STDIN> ;
    chomp $name1 ;
  
  # 変更後のファイル名
    print "\n 変更後のファイル名:" ;
    $name2 = <STDIN> ;
    chomp $name2 ;
  
  # 子フォルダ名(番号)
    print "\n 開始-終了番号:" ;
    $num3 = <STDIN> ;
    chomp $num3 ;
    ($num1, $num2) = split /-/, $num3 ;
  
  # ファイル名の変更
    for $num ($num1..$num2)
       {
        $nx2 = join "-", $name1, $num ;
        $nx = "$main/$num/$nx2.txt" ;
        $ny2 = join "-", $name2, $num ;
        $ny = "$main/$num/$ny2.txt" ;
        rename $nx, $ny ;
       }
  }
  
1 ;
  

# call_a_delete.pl
# サブルーチンのテスト(11)
  
require "mysub/delete.pl" ;
&delete ;
  
print " \n 何かキーを押してください。" ; <>
  

# delete.pl
# ファイルを削除するサブルーチン
  
sub delete
   {
# 親フォルダ名の指定
    print "\n 親フォルダ名:" ;
    $main = <STDIN> ;
    chomp $main ;
  
  # 削除するファイル
    print "\n 削除するファイル名:" ;
    $name = <STDIN> ;
    chomp $name ;
  
# 子フォルダ名(番号)
    print "\n 開始-終了番号:" ;
    $num3 = <STDIN> ;
    chomp $num3 ;
    ($num1, $num2) = split /-/, $num3 ;
  
# 削除の確認
    print "\n $name $num3 を削除します。\n" ;
    print "\n (はい:Enter / いいえ:n) " ;
    $conf = <STDIN> ;
    chomp $conf ;
    if ($conf eq "n") {exit}
  
# ファイルの削除
    for $num ($num1..$num2)
       {
        $nx1 = join "-", $name, $num ;
        $nx = "$nx1.txt" ;
        unlink "$main/$num/$nx" ;
       }
  }
  
1 ;