• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:if プログラムソース)

プログラムソースで地方別送料を表示したい

このQ&Aのポイント
  • プログラムソースを使って、入力した地方ごとの送料を表示したいですがうまくいきません。
  • プログラムソースを修正して、入力した地方ごとの送料を表示させたいです。
  • プログラムソースの修正方法を教えていただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

分量が多くなったので、分けて書きます。 以下、連想配列を使った、全地域・全サイズ対応版です。 また、この変数%areaを県単位で書き下せば、 地域名ではなく県名から料金を計算させるようなことも可能です。 ---ここから--- #地域名から地帯番号への変換 my(%area) = ( "愛知" => 0, #県内は仮に第0地帯とする "関東" => 1, #第1地帯 "信越" => 1, "近畿" => 1, "東海" => 1, "北陸" => 1, "東北" => 2, #第2地帯 "中国" => 2, "四国" => 2, "九州" => 3, #第3地帯 "北海道" => 5, #第5地帯 "沖縄" => 6, ); #地帯番号から、サイズ・料金対応表への変換 my(%postage) = ( 0 => { 60=> 600, 80=> 800, 100=>1000, 120=>1200, 140=>1400, 160=>1600, 170=>1700 }, 1 => { 60=> 700, 80=> 900, 100=>1100, 120=>1300, 140=>1500, 160=>1700, 170=>1900 }, 2 => { 60=> 800, 80=>1000, 100=>1200, 120=>1400, 140=>1600, 160=>1800, 170=>2000 }, 3 => { 60=> 900, 80=>1100, 100=>1300, 120=>1500, 140=>1700, 160=>1900, 170=>2100 }, 5 => { 60=>1100, 80=>1300, 100=>1500, 120=>1700, 140=>1900, 160=>2100, 170=>2300 }, 6 => { 60=>1200, 80=>1400, 100=>1600, 120=>1800, 140=>2000, 160=>2200, 170=>2400 }, ); print"愛知県から小包の地方を入力してください。\n"; chomp($areaname=<>); my $areano = $area{$areaname}; if (!defined($areano)) { print "地域名「$areaname」は正しくありません\n"; exit; } print"小包のサイズを入力してください。\n"; chomp($size=<>); my $price = $postage{$areano}->{$size}; if (!defined($price)) { print "サイズ「$size」は正しくありません\n"; exit; } $price =~ s/(\d)(\d{3})$/$1,$2/; print "$areaname 地方は第 $areano 地帯です。\n$size サイズは $price 円になります\n"; ---ここまで---

mai5891
質問者

お礼

回答ありがとうございます。 参考にさせて頂きます。

その他の回答 (1)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

> if ( $1=="関東,信越,近畿,東海,北陸") { この時点で変数$1への代入設定されていないです。 おそらく$tの間違いでしょうか。 また、「==」は数値比較の演算子ですので、文字列としてのチェックはできません。文字列比較演算子は 「eq」です。 ですが、「if ( $1 eq "関東,信越,近畿,東海,北陸") {」にしたとしても、それでもダメです。 これは「変数$1」が文字列「関東,信越,近畿,東海,北陸」に等しいかどうか、という意味になりますので、『「関東」か「信越」か「近畿」か…のどれか』というチェックにはなりません。 根本的に判定方法が誤りです。 正規表現を使えば、 > if ($t =~ /^(関東|信越|近畿|東海|北陸)$/) { で判定できます。 > if ( $1 == 60 ){ こちらでも変数$1への代入設定されていないです。 この数字からすると、はおそらく「サイズ」から「料金」を出したいのだと思いますが、 > print"小包のサイズを入力してください。\n"; > chomp($s=<>); といった感じのコードが抜け落ちているのでしょうか。 あと、質問者さんのコードは、第1地帯(関東,信越,近畿,東海,北陸)限定の判定ルーチンになってます。 地域によって料金表示を変えるためには、サイズ別・地域別の料金表をまとめたデータが必要になります。これをif文で、書くと ---ここから--- print"愛知県から小包の地方を入力してください。\n"; chomp($t=<>); print"小包のサイズを入力してください。\n"; chomp($s=<>); if ($t =~ /^(関東|信越|近畿|東海|北陸)$/) { print"$t地方だと\n"; if ( $s == 60 ){ print"$sは700円になります。\n"; } elsif ( $s==80) { print"$sは900円になります。\n"; } elsif ( $s==100 ) { #略 } } elsif ( $t =~ /^(東北|中国|四国)$/ ) { print"$t地方だと\n"; if ( $s == 60 ){ print"$sは800円になります。\n"; } elsif ( $s==80) { print"$sは1,000円になります。\n"; } elsif ( $s==100 ) { #略 } } elsif ( $t eq "九州") { #略 } elsif ( $t eq "北海道") { #略 } elsif ( $t eq "沖縄" ) { #略 } ---ここまで--- といった形になります。 第3地帯以降のチェックルーチンは省略しましたが、これを全部ifで書くと量がかなり多くなってしまいます。 こういうのはifで書くよりは、連想配列を使った方が簡潔になります。

mai5891
質問者

お礼

回答ありがとうございます。 参考にさせて頂きます。

専門家に質問してみよう