ishiducaの日記 このページをアンテナに追加 RSSフィード

2009-10-17

[][]円の面積と円周を求める方法を考える・続き 20:12 円の面積と円周を求める方法を考える・続き - ishiducaの日記 を含むブックマーク はてなブックマーク - 円の面積と円周を求める方法を考える・続き - ishiducaの日記 円の面積と円周を求める方法を考える・続き - ishiducaの日記 のブックマークコメント

円の面積と円周を求める方法を考える - ishiducaの日記 - Hatena::Group::Perl

で、円の円周と面積を求める方法を3パターンためしてみました。

今日は、OO(Object Oriented)な方法に挑戦

circle4_pl

#!/usr/bin/perl -l
use strict;
use warnings;

{ package Circle;
    sub new{
        my $class = shift;
        my %args  = @_;
        bless \%args, $class;
    }
    sub pai { 3.14; }
    sub radius{
        my $self = shift;
        $self->{radius} = shift if @_;
        $self->{radius};
    }
    sub ensyu{
        my $self = shift;
        2 * $self->pai * $self->radius;
    }
    sub menseki{
        my $self = shift;
        $self->pai * $self->radius ** 2;
    }
}

my $en = Circle->new(
    radius => 3,
);

print '半径 ', $en->radius();
print '円周 ', $en->ensyu;
print '面積 ', $en->menseki;
print '';

# 半径を変更する
$en->radius(5);
print '半径 ', $en->radius();
print '円周 ', $en->ensyu;
print '面積 ', $en->menseki;

exit 0;

結果

半径 3
円周 18.84
面積 28.26

半径 5
円周 31.4
面積 78.5

Perl5 のオブジェクト指向を理解する - モダンなPerl入門を書き写す形で書いてみました。

bless の仕組みをもう少し掘り下げる必要がありますが、書き惜しみしていると進んでいかないので、まとまりが悪いけども晒します。blessの仕組みは宿題に。

宿題と言えば、学習方法というか学習の進め方もずーっと宿題なんだよな。どうにかしないと。



ついでなので、Circleクラスを継承したSphereクラスも作ってみる

  • use base 'Class'; を使う

circle4_1_pl

#!/usr/bin/perl -l
use strict;
use warnings;

{ package Circle;
    sub new{
        my $class = shift;
        my %args  = @_;
        bless \%args, $class;
    }
    sub pai { 3.14; }
    sub radius{
        my $self = shift;
        $self->{radius} = shift if @_;
        $self->{radius};
    }
    sub ensyu{
        my $self = shift;
        2 * $self->pai * $self->radius;
    }
    sub menseki{
        my $self = shift;
        $self->pai * $self->radius ** 2;
    }
}
{ package Sphere;
    use base 'Circle';
    sub taiseki{
    	my $self = shift;
    	( 4 * $self->pai * $self->radius ** 3 ) / 3;
    }
}

my $en = Circle->new(
    radius => 3,
);

print '半径 ', $en->radius();
print '円周 ', $en->ensyu;
print '面積 ', $en->menseki;
print '';

# 半径を変更する
$en->radius(5);
print '半径 ', $en->radius();
print '円周 ', $en->ensyu;
print '面積 ', $en->menseki;
print '';

# 球体をつくる
my $kyu = Sphere->new( radius => $en->radius, );
print '体積 ', $kyu->taiseki;

exit 0;

継承するのに

use base 'Circle';

を使いましたが、

@Sphere::ISA = qw/ Circle /;

でもいいみたい

KaydenceKaydence2011/10/08 03:53This ifnromaiton is off the hizool!

cxfzaeqonbcxfzaeqonb2011/10/08 21:08KvhZiw <a href="http://zkkmrjdjuioc.com/">zkkmrjdjuioc</a>

aczsfmdfaeaczsfmdfae2011/10/10 19:34kes4VE , [url=http://ppigzaurtzno.com/]ppigzaurtzno[/url], [link=http://ybctrvfwcaxb.com/]ybctrvfwcaxb[/link], http://zpdyptcaumtm.com/

kphrzaszkphrzasz2011/10/11 02:23BrEHTy <a href="http://rzyvtegvebnv.com/">rzyvtegvebnv</a>

cclynrcclynr2011/10/13 02:12jypQVa , [url=http://rnmqkunrdvab.com/]rnmqkunrdvab[/url], [link=http://lfgptfbfgjrf.com/]lfgptfbfgjrf[/link], http://cfcrqdgekqxn.com/

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20091017