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

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

if プログラムソース

このプログラムソースでやりたいことは、 東海と入力すると 地方だと 東海は900円になります。 と表示させたいのですが、 うまく表示されません。 分かる方いましたら、教えてください。 教えて頂けると、助かります。 よろしくお願いします。 以下、プログラムソースです。 print"愛知県から小包の地方を入力してください。\n"; chomp($t=<>); if ( $1=="関東,信越,近畿,東海,北陸") { print"$t地方だと \n"; } elsif ( $1=="東北,中国,四国" ) { print"$t地方だと \n"; } elsif ( $1=="九州") { print"$t地方だと \n"; } elsif ( $1=="北海道") { print"$t地方だと \n"; } elsif ( $1=="沖縄" ) { print"$t地方だと \n"; } if ( $1 == 60 ){ print"$1は700円になります。\n"; } elsif ( $1==80) { print"$1は900円になります。\n"; } elsif ( $1==100 ) { print"$1は1,100円になります。\n"; } elsif ( $1==120 ) { print"$1は1,300円になります。\n"; } elsif ( $1== 140 ) { print"$1は1,500円になります。\n"; } elsif ( $1== 160 ) { print"$1は1,700円になります。\n"; }else { print"$1は1,900円になります。\n"; }

  • Perl
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • 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
質問者

お礼

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

関連するQ&A

  • perlをcgiに変換

    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"; このperlは動きますが、どのようにcgiを書き換えればいいのか分かりません。 my $price = $postage {$areano}->{$hash{'size'}}; とするとエラーになってしまいます。 分かる方いましたら、教えてください。 教えて頂けると、助かります。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • このプログラムなんですが

    #! /usr/bin/perl @data=<>; open (IN,"newtype.txt"); @file = <IN>; close (IN); foreach $address (@file) { ($pn,$ad) = split(/\t/,$address); $pnad{$pn}=$ad; } foreach $jusyo (@data) { chomp $jusyo; print $jusyo; print "\n"; print "$pnad{$jusyo}"; } foreach $line (@file) { @data = split(/t\/, $line); if($data[0] =~ "51105") { print "$data[0]"; print "$data[1]"; } elsif($data[0] =~ "651130") { print "$data[0]"; print "$data[1]"; } } exit; コンパイルするときには ./sample.pl data.txt をシェルにうって実行します。 このプログラムでは、はじめに自分で指定したファイル内に存在する郵便番号(通常は7桁だけなんですが、プログラムを見ていただければわかると思われますが、それ以外に5桁(たとえば12354XX,x12354x,xx12354など))と6桁(134567x,x134567など)がありまして、それを表示させたいんですが、上のプログラムでは、if文以下の5桁と6桁があった場合にそれを同時に表示させるプログラムができていないんです。 ハッシュをもちいてプログラムを作り直したいんですが、教えてください。 今日の夜8時までに出さなくてはいけないので、すぐに回答をいただけたらありがたいです。

  • 初心者です。perlを使用して辞書プログラムを実装する機能を作りたいのですが。

    perlを使用して辞書プログラムを実装する機能を作りたいのですが、メインプログラムを作ってからその先をどうすればいいのかわかりません。 print"1.新規作成 2.単語の登録 3.単語の検索 4.辞書一覧 5.単語の削除 6.終了:\n"; $type =<STDIN>; chomp($type); if ($type == 1) { new create; } elsif ($type == 2) { entry; } elsif ($type == 3) { search; } elsif ($type == 4) { list; } elsif ($type == 5) { deletion; } elsif ($type == 6) { exit(0); } この後はどのように作っていったらいいのでしょうか、教えて下さい。

    • ベストアンサー
    • Perl
  • おかしなif文だと思うのですが、どう思われますか?

    $a=10; $b=20; if($a>=$b){ print "\$aは\$bと等しいかおおきいですよ。\n"; } elsif($a>$b){ print "\$aは\$bより大きいです。\n"; } elsif($a<$b){ print "\$aは\$bより小さいです。\n"; } ある例題のif文なんですが、 $a>=$bで$a>$bは内包されているはずなので elsifの例として不適切ですよね。 どう思われますか?

    • ベストアンサー
    • CGI
  • 元号判定:Perl初心者です

    Perlにおいて、「元号を判定させる」ようにしたく、if-elsif文章を書いてみたのですが、上手くいきません。 (そもそも起動してくれないです・・・文章も合っているかわからないのですが。。) 年号を入力させて、 (meizi) X nenと表示させたいのです。 あと、明治以前の数字を入れたら、エラーと出すようにする。 被っている年号、例えば1912年と入れたら、meizi45nen/taisyou1nen ともしたいのですが、これらはどう入れたらいいのか分からなかったです。 どこを直せばいいのか、一部でもいいので、教えていただけると嬉しいです。 chomp($year = <stdin>); if($year<=1912 and $year>=1868){ $A=$year-1867 print("meizi $A nen \n"); } elsif($year<=1926 and $year>=1912){ $B=$year-1911 print("taisyou $B nen \n"); } elsif($year<=1989 and $year>=1926){ $C=$year-1925 print("syouwa $C nen \n"); } elsif($year>=1989){ $D=$year-1988 print("heisei $D nen \n"); }

    • ベストアンサー
    • Perl
  • if文を簡単に

    CGIを改造中です。 オプションメニューを設置しました。 ただ、検索などに利用したかったので、名前と値を別のものにしています。(犬=1,猫=2のように) データ入力画面の方はリストを入力したのですが、名前が50を超えるのでリスト表示画面や検索結果表示画面でif文を大量に書くのは面倒です。 (if($name eq1){print "犬\n";elsif~) どうにかしてこれを簡潔にすることは出来ないものでしょうか?

  • 配列 各項目を$n倍するプログラムソース

    配列 @in=(10,20,30,40) がある、各項目を $n 倍するプログラムを作っていますが、 $n 倍出来ません。 以下、プログラムです。 #!/usr/bin/perl @in=(10,20,30,40) ; print"@inを"; print"何倍しますか?:"; chomp($n=<>); foreach $ni_tall (@in) { $n *= $ni_tall; } $ave = $n * @in; print "結果: $ave\n"; print "結果: $ni_tall\n"; print "結果: $n\n"; print "結果: @in\n"; ___実行結果___ 10,20,30,40を何倍しますか?:7 結果:6720000 結果: 結果: 1680000 結果: 10 20 30 40 となってしまいます。 例えば、 :2 結果:20,40,60,80 としたいのですが、 分かりません。 分かる方いましたら、教えて頂けると助かります。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • if文で、上手く表示されない

    お世話になります。 PerlのBBSを改造中です。 きちんと勉強してはいませんが、なんとなく弄ることは出来るレベルです。 今、ifで、表示の変更をしているのですが、上手く行かなくて困っています。 お分かりになる方、 何らかの原因に心当たりのある方、 どうぞよろしくお願いします。 ★━━━━━━━━━━━━━━━━━━━━★ データを入れているdatファイル内、 $astrologyというのに、「*Leo*」というのが格納されています。 …で、 if(!$astrology){ print "入ってない\n";} else{ print "入ってる\n";} …と入れると、「*Leo*」というデータが入っているわけなので、 「入ってる」と、表示されます。 ですが、 if($astrology == "*Aries*") {print "おひつじ座 <br />$astrology \n";} elsif($astrology == "*Leo*") {print "しし座 <br />$astrology\n";} else{print "その他<br />$astrology\n";} ・・・と、書いてみると 「 おひつじ座 *Leo* 」 と表示されます。 「*Leo*」と表示されているので、呼び込めていない訳ではないと思うのですが…。 ★━━━━━━━━━━━━━━━━━━━━★ 何が原因かわからないので、ちょっとしたアドバイスでも構いません。 ご返答よろしくお願いします。

    • ベストアンサー
    • Perl
  • プログラム (BASIC) 教えてください

    コンピュータが 3桁の整数(100~999) n をランダムに生成。 「3桁の整数(100~999) n を当ててください」と表示。 解答者はキーボードで整数 x を入力。 x > n なら「もっと小さい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x < n なら「もっと大きい数です.再入力してください」と表示してゲームを継続( 3. に戻り,x を再入力)、 x = n となったら ループを抜ける。 「正解です」と表示して,ゲーム終了。 100 RANDOMIZE 110 PRINT "3桁の整数(100~999) n を当ててください" 120 LET n=100+INT (900*RND) 130 DO 140 INPUT x 150 IF x=n THEN EXIT DO 160 IF x>n THEN 170 PRINT "もっと小さい数です.再入力してください" 180 ELSEIF x<n THEN 190 PRINT "もっと大きい数です.再入力してください" 200 END IF 210 LOOP 220 PRINT "正解です" 230 END このプログラムをIF、END IFを一回のみ使うプログラムに変える方法を教えてください。

  • アカウントプログラムについて

    rubyでアカウントとパスワードを検証するプログラムを、ハッシュを使って作成しようと思っています。 そこで、if文を使って条件をわけようとしているのですが、うまくいきません。 自分なりに書いてはみたのですが間違っているようで、どこをどう直したらよいか教えていただきたいです! $KCODE = "e" hash_account = {} fo = open("accountData.txt", "r") i = 0 while(line = fo.gets) ary = line.split hash_account[ary[0]] = ary[1] i = i + 1 end fo.close print "*** ログインしてください。自分のアカウント名とパスワードを入力してください。 ***\n" print "アカウント:" account = gets.chop print "パスワード:" password = gets.chop if (hash_account[account] == password) print "ようこそ、", account,"さん。それではゲームを始めましょう。\n" elsif print "パスワードが間違っているようです。\n" else print account,"というアカウントはありません。\n" end ちなみに、accountData.txtには、アカウント名、パスワードの順に入っています。

    • ベストアンサー
    • Ruby