- ベストアンサー
最大値を出力するプログラム(@ARGV)
引数として1個以上の数字を受け取り,それらの中で一番大きな数字を出力するプログラムを作成したいのですが、数字は配列@ARGVに入っています。どのようなプログラムになるでしょうか? 例: jperl max.pl 20 1000 31 → 1000 自分が考えたのは 最初の数字を取り出して $max=shift(@ARGV); それが次の数字より小さいなら$maxにその次の数字を 代入していき、それを繰り返すのだと思うのですが if ($max<$ARGV[0]){ $max=$ARGV[0]; } その繰り返し方はwhileを使うと思うのですが どう使ってよいのかがわかりません。どうすればよいのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> それが次の数字より小さいなら$maxにその次の数字を > 代入していき、それを繰り返すのだと思うのですが その通りです。 > その繰り返し方はwhileを使うと思うのですが 繰り返しができる構文(whileなど)を使って 配列の全要素を調べればいいです。 以下にいくつか例を挙げておきます。 --------例1-------- $max = shift(@ARGV); while( ($temp=shift(@ARGV)) != undef ){ if ($max<$temp){ $max=$temp; } } print "$max\n"; --------例2-------- $max = shift(@ARGV); $i=0; while($i<=$#ARGV){ if ($max<@ARGV[$i]){ $max=@ARGV[$i]; } $i++; } print "$max\n"; --------例3-------- $max = shift(@ARGV); for($i=0; $i<=$#ARGV; $i++){ if ($max<@ARGV[$i]){ $max=@ARGV[$i]; } } print "$max\n"; --------例4-------- $max = shift(@ARGV); foreach $temp (@ARGV){ if ($max<$temp){ $max=$temp; } } print "$max\n";
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
#1さんの例4にすでありますが、配列の全要素を順になめていくのなら whileではなくforeach (for)を使うのが定石です。 $max = shhift; foreach my $item (@ARGV) { $max = $item if $item > $max; } のように書きます。この例の場合、$itemに順に配列の要素が セットされてループを繰り返します。 お使いなのがjperlということらしいので foreach のところは myを書けないかもしれませんが、そのときは myを抜いてください。 さらにいうと、List::Util というモジュールを使えば use List::Util qw(max) $max = max @ARGV; だけですみます。
お礼
whileではなくforeachが定石なのですね。 勉強になりました。 ありがとうございました。
お礼
さまざまな例を挙げてくださりありがとうございます。 いくつか方法があるのですね。 おかげで理解することができました。 本当に助かりました。