Tfe

Ongi etorri tfe-ren webgunera...

Old stuff/ecole_etude_fac_de_pau/licence_2/calculatrice/tk.pl

(Deskargatu)
#!/usr/bin/perl -w
use Tk;


my $top = MainWindow->new;



my $ans = "0"x32;
my @func = (undef,"conv","add","sous","mul","div");



sub clear()
{
    print "\e[2J";	# clear screen 
    print "\e[1,1H";	# position 1,1
}


sub menu()
{
$top->Button(
    -text=>'Convertir en Binaire',
    -command => sub { &conv },
    )->pack;

$top->Button(
    -text=>'Addition Binaire',
    -command => sub { &add },
    )->pack;

$top->Button(
    -text=>'Soustraction Binaire',
    -command => sub { &sous },
    )->pack;

$top->Button(
    -text=>'Multiplication Binaire',
    -command => sub { &mul },
    )->pack;

$top->Button(
    -text=>'Division Binaire',
    -command => sub { &div },
    )->pack;

$top->Button(
    -text=>'Exit',
    -command => sub { exit },
    )->pack;

$top->Label(
    -textvariable => \$ans,
    )->pack;

MainLoop;


}


sub programme($)
{
    my $prop = shift;
    $ans = &{$func[$prop]};
}



sub add()
{
&clear;
print "Addition avec $ans :  \n";
do
{
        print "Entrer un entier : ";
        $num = <STDIN>;
	chomp($num);	
        }
    until ($num =~ /^[0-9]+$/);
    return $num;
    
    
    $ans = $num;
    
    $top->update();
}



sub conv()
{
my $conv_win;
my @relief = qw/-relief sunken/;
my $num;

    &clear;
#    my  $num;
    my @arr;
    do
    {
    $conv_win = MainWindow->new;
    $conv_win->label('Entrer un nombre binaire : ');
    $conv_win->button(
        -text=>'Exit',
        -command => sub { last }
    );

    $num = $conv_win->Entry(@relief)->pack;    
    
    }
    until ($num =~ /^\-?[0-9]+(?:\.[0-9]+)?$/);
}
	
    
sub conv_real($)
{
    $num = shift;    
    undef($virgule);
    if ($num =~ /\.(\d+)$/) { $virgule = "0.".$1;  }
    else {$virgule = "0"; }
    
    
    $signe = $num > 0 ? 0 : 1;
    if ($signe) { $num*=-1; }
    my @bin;
    while ($num > 1)
    {
        push(@bin,($num%2));
        $num=int($num/2);
    }	

    push(@bin,$num);
    my $puissance = (scalar @bin)-1;



    @bin = reverse @bin;
    my @virg;
    for ($puissance .. 22)
    {
        $virgule = $virgule * 2;
        if ($virgule >= 1)  { $virgule -=1; @virg = ("1",@virg); }
        else { @virg=("0",@virg); }
    }

    @bin = (@bin,reverse @virg);
    shift(@bin);

    my $exp=127+$puissance;
    my $i="";
    
    while($exp > 1)
    {	
        $i=($exp % 2)."$i";
        $exp=int($exp/2);
    }
    $i=$exp."$i";
    $ans =$signe.$i.join("",@bin);
    print "Signe $signe\n";
    print "Expossant : $exp = $i ";
    print "Mantisse ".join("",@bin)."\n";
    return $ans;
    
    $top->update();
}
    





&clear();
&menu();