Perl入学式の練習問題をおさらいする (第1回と第2回分)
第1回の2部
[print命令を複数個使って, あなたのプロフィール(名前, 年齢, 大学etc...)を表示するスクリプトを書いてみよう]
print "私の名前は\@oisiusです\n"; print "年齢は39歳です\n"; print "大阪府に住んでます\n";
[2015からあなたの生年の西暦を引き算して, 満年齢を表示してみましょう]
print "私の年齢は、",2015-1976,"歳です\n";
第2回
[Hello, Worldという文字列を出力する(hello.pl)]
print "Hello World\n";
[自分の名前, 年齢, 身長などの情報をそれぞれname, age, heightといったスカラ変数に格納し,それらの値を出力する (profile.pl)]
my $name = "\@oisius"; my $age = 39; my $height=169; print "$name/","$age歳/","$heightセンチ\n";
[標準入力
print '1つ目の数字をどうぞ >'; chomp(my $num1=<STDIN>); print '2つ目の数字をどうぞ >'; chomp(my $num2=<STDIN>); print "$num1+$num2 -> ",$num1+$num2,"\n"; print "$num1-$num2 -> ",$num1-$num2,"\n"; print "$num1*$num2 -> ",$num1*$num2,"\n"; print "$num1/$num2 -> ",$num1/$num2,"\n";
@_papix_さんの回答下記。そっか。xとyでいいし、明示してあげるといいのか。
https://github.com/perl-entrance-org/workshop-2014-02/blob/master/question/calc.pl
[端末から文字列を一つ入力し, その文字列が$answerと一致したらOK, 外れたらNGと表示します(question_word.pl)]
print "type a word\n"; my $ans = "good"; chomp(my $str =<STDIN>); if($str eq $ans){ print "OK\n"; }else{ print "NG\n"; }
[端末から数字を一つ入力し, その数字が$answerと一致したらOK, $answerより大きければtoo big, 小さければtoo smallと表示します(question_num.pl)]
my $ans=99; chomp(my $num=<STDIN>); if ($num==$ans){ print "OK\n"; }elsif($num>$ans){ print "too big\n"; }elsif($num<$ans){ print "too small\n"; }
入力した値が, $answerから-5〜+5の範囲内(例えば, $answerが10なら, 5〜15)の場合, nearと表示するようにしてみましょう
my $ans=99; chomp(my $num=<STDIN>); if($num==$ans){ print "OK\n"; }elsif($num>$ans){ if($num-$ans<=5){ print "near\/"; } print "too big\/"; }elsif($num<$ans){ if($ans-$num<=5){ print "near\/"; } print "too small\n"; }
あえてifの中にifを書いたけど、よくない?
if($str==$ans){ print "正解\n"; }elsif($str>$ans && ($str - $ans) <=5){ print "near\/"; }elseif(str>$ans){ print "too big\n"; }elsif($str<$ans && ($ans - $str) <=5){ print "near\/"; }
[配列@arrayに
my @array; for my $i(0..2){ print "type a word->"; chomp($array[$i]=<STDIN>); } my @sort=sort @array; print "@sort\n";
[1から100までの数字について, 以下のようなルールに従って表示を行う(fizzbuzz.pl)]
(その数字が3で割り切れるならFizz,5で割り切れるならBuzz,3でも5でも割り切れるならFizzBuzz)
for my $i(1..100){ my $msg=""; if ($i % 3 == 0){ $msg.="Fizz"; } if ($i % 5 == 0){ $msg.="Buzz"; } if ($msg ne ""){ print "$i ==> $msg\n"; } }
@tomchaさんの回答下記。値があるかないかの聞き方なるほど。スマート!
https://github.com/perl-entrance-org/workshop-2015-02/blob/master/answer/osaka/tomcha/fizzbuzz.pl
if($outstr){ print "$outstr\n"; }else{ print "$i\n"; }
第2回の復習問題
https://github.com/perl-entrance-org/workshop-2015-02/blob/master/src/practice.md
[端末から文字を入力し, その文字を表示する(stdin.pl)]
print "type a word->"; chomp(my $str=<STDIN>); print "---> $str\n";
[1から100までの値を配列に格納し, その配列の全ての数値を足した結果を出力する(sum.pl)]
my $sum; for my $i(1..100){ $sum+=$i; } print "$sum\n";
[標準入力により数値を一つ読み込み, その数値を階乗した値を出力する(factorial.pl)]
print "正の数を入力して->"; chomp(my $num=<STDIN>); my $total=1; if ($num>0){ for my $i(reverse(1..$num)){ $total*=$i; } print "$total\n"; }else{ print "err\n"; }
配列を使う・・・↓
chomp(my $num=<STDIN>); my @array; my $total=1; $array[0]=$num; if ($num>1){ for my $i(1..$num-1){ $array[$i]=$num-$i; } for (@array){ $total *= $_; } print "total->$total\n"; }
0の階乗は1?
for文で1個目だけ違う処理の場合、for文の前に入れていいもの?
[標準入力により数値を一つ読み込み, その数値が偶数なら"even", 奇数なら"odd" という文字を出力する(even_or_odd.pl)]
print "数を入力して->"; chomp(my $num=<STDIN>); if ($num%2==0){ print "even\n"; }else{ print "odd\n"; }