#!/usr/bin/perl -w # [c] piotao, 20070103 # Program demonstrujacy dodawanie macierzy # Uruchomienie: # dodaj.pl N M # - N - wymiar poziomy macierzy # - M - wymiar pionowy macierzy # Program uruchomiony bez parametrow przyjmuje # N = 3, M = 3 # Wartosci macierzy nalezy podac dla kazdej komorki # Wcisniecie ENTER jest rownoznaczne z podaniem zera. # wlaczenie trybow scislego sprawdzania ostrzezen use strict; use warnings; # okreslenie domyslnych rozmiarow macierzy lub pobranie # ich z wiersza polecen jezeli zostaly podane my $N = shift @ARGV || 3; my $M = shift @ARGV || 3; # utworzenie pustych tablic dwuwymiarowych my @A = (); my @B = (); my @C = (); # wczytywanie macierzy A for( my $m = 0; $m < $M; $m++ ){ # dla wszystkich wierszy print "Podawanie danych do wiersza ".($m+1)." macierzy A\n" if -t *STDIN; # napisz jezeli masz otwarty terminal for( my $n = 0; $n < $N; $n++ ){ # dla wszystkich kolumn print "A[$m,$n] = " if -t *STDIN; chomp ($A[$m][$n] = ); # wczytaj liczbe ze standardowego wejscia # i obetnij z niej znak nowego wiersza (chomp) } } # wczytywanie macierzy B for( my $m = 0; $m < $M; $m++ ){ # dla wszystkich wierszy print "Podawanie danych do wiersza ".($m+1)." macierzy B\n" if -t *STDIN; for( my $n = 0; $n < $N; $n++ ){ # dla wszystkich kolumn print "B[$m,$n] = " if -t *STDIN; chomp ($B[$m][$n] = ); # wczytaj liczbe ze standardowego wejscia # i obetnij z niej znak nowego wiersza (chomp) } } # dodawanie macierzy jest proste for( my $m = 0; $m < $M; $m++ ){ for( my $n = 0; $n < $N; $n++ ){ $C[$m][$n] = $A[$m][$n] + $B[$m][$n]; } } # wypisywanie odbywa sie wierszami w postaci [A] + [B] = [C] # dlatego jest az takie skomplikowane, ale w sumie proste # gorna krawedz wszystkich macierzy print "\n+-"," "x$N,"-+ +-"," "x$N,"-+ +-"," "x$N,"-+\n"; # wypisywanie danych ze srodka for( my $m = 0; $m < $M; $m++ ){ print "| "; # lewy nawias # wypisanie wiersza A for(my $n=0;$n<$N;$n++){ printf "%3i ",$A[$m][$n]; } # wypisanie znakow pomiedzy macierzami A i B print $m==int($M/2) ? " | + | " : " | | "; # wypisanie wiersza B for(my $n=0;$n<$N;$n++){ printf "%3i ",$B[$m][$n]; } # wypisanie znakow pomiedzy macierzami B i C print $m==int($M/2) ? " | = | " : " | | "; # wypisanie wiersza C for(my $n=0;$n<$N;$n++){ printf "%3i ",$C[$m][$n]; } print " |\n"; } # dolna krawedz wszystkich macierzy print "+-"," "x$N,"-+ +-"," "x$N,"-+ +-"," "x$N,"-+\n"; __END__