การหารที่ผิดกฎหมายด้วยศูนย์: Perl

ฉันได้เขียนโค้ดเพื่อค้นหาดีเทอร์มิแนนต์ของเมทริกซ์ขนาด 10X10 รหัสนี้ให้ผลลัพธ์ที่ถูกต้องจนถึงเมทริกซ์ 9X9 แต่สำหรับเมทริกซ์ 10X10 ให้ข้อผิดพลาดดังต่อไปนี้

"การใช้ค่าที่ไม่กำหนดค่าเริ่มต้นในการคูณ ‹*> ที่บรรทัดที่ 23

หารผิดด้วยศูนย์ที่บรรทัด 21"

ฉันลองใช้เมทริกซ์ 11X11 ด้วย แต่มันให้คำตอบที่ผิด

เหตุใดรหัสนี้จึงให้ข้อผิดพลาดดังกล่าว ...

ต่อไปนี้เป็นรหัส:

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

my @x1=(
  [5, 6, 3, 2, 4, 9, 3, 5, 4, 2], 
  [12, 9, 8, 3, 3, 0, 6, 9, 3, 4],
  [8, 6, 5, 8, 9, 3, 9, 3, 9, 5],
  [6, 4, 3, 0, 6, 4, 8, 2, 22, 8],
  [8, 3, 2, 5, 2, 12, 7, 1, 6, 9],
  [5, 9, 3, 9, 5, 1, 3, 8, 4, 2],
  [3, 10, 4, 16, 4, 7, 2, 12, 9, 6],
  [2, 12, 9, 13, 8, 3, 1, 16, 0, 6],
  [3, 6, 8, 5, 12, 8, 4, 19, 8, 5],
  [2, 5, 6, 4, 9, 10, 3, 11, 7, 3]
);
# Matrix of nxn
for (my $i=0;$i le 9;$i++) {
  for (my $j=0;$j le 9;$j++) {

      if($j>$i) {
         my $ratio = $x1[$j][$i]/$x1[$i][$i];
          for(my $k = 0; $k le 9; $k++){

              $x1[$j][$k] -= $ratio * $x1[$i][$k];
          }
      } 

  }
}

my $det1 = 1; 
for(my $i = 0; $i le 9; $i++){
  $det1 *= $x1[$i][$i];
}
printf $det1," ";

person swapnil90    schedule 10.07.2015    source แหล่งที่มา
comment
เมทริกซ์คือ 10x10 แน่นอนว่าไม่มีรายการใดที่คุณพยายามเข้าถึง เปลี่ยนค่า @x1 ของคุณหากคุณต้องการทำงานกับเมทริกซ์ เช่น 11x11 แล้วทำไมถึงเป็น le 9 แต่ไม่ใช่ <=9   -  person varnie    schedule 10.07.2015
comment
คุณกำลังใช้ตัวดำเนินการเปรียบเทียบสตริง $i le 9 เป็นจริงสำหรับค่าทั้งหมดของ $i ตั้งแต่ 0 ถึง 89 ให้ใช้ $i <= 9 แทน   -  person r3mainer    schedule 10.07.2015
comment
ใช่ ฉันแทนที่ le ด้วย ‹= และมันใช้งานได้ ขอบคุณสำหรับข้อมูลนี้   -  person swapnil90    schedule 10.07.2015


คำตอบ (1)


le ไม่ได้ทำในสิ่งที่คุณคิด http://perldoc.perl.org/perlop.html

ไบนารี "le" คืนค่าเป็นจริงหากอาร์กิวเมนต์ด้านซ้ายเป็นสตริงน้อยกว่าหรือเท่ากับอาร์กิวเมนต์ที่ถูกต้อง

print 10 le 9,"\n";
print 10 <= 9,"\n";

เป็นการเปรียบเทียบแบบสตริง ไม่ใช่ การเปรียบเทียบที่เป็นตัวเลข

ดังนั้น "10" le "9" เป็นจริง เนื่องจาก ตามตัวอักษร 10 อยู่ก่อน 9

แต่วิธีนี้ใช้ได้ผลดีกับเมทริกซ์ที่เล็กกว่า เนื่องจาก 9 le 8 เป็นการเปรียบเทียบที่ถูกต้องและทำงานใน 'วิธีที่ถูกต้อง'

คุณควรใช้ <= แทน:

ไบนารี "‹=" คืนค่าเป็นจริงหากอาร์กิวเมนต์ทางซ้ายมีค่าน้อยกว่าหรือเท่ากับอาร์กิวเมนต์ทางขวา

คุณยังสามารถปรับขนาดอัตโนมัติได้โดยใช้ $#x1 สำหรับการเปรียบเทียบ ซึ่งเป็นค่าของดัชนีอาร์เรย์สุดท้าย ในตัวอย่างของคุณด้านบน $#x1 คือ 9 เนื่องจากอาร์เรย์ของคุณคือ 0-9

person Sobrique    schedule 10.07.2015
comment
ใช่ ตอนนี้มันทำงานได้ดีตามคำแนะนำของคุณ ขอบคุณ ! - person swapnil90; 10.07.2015
comment
โปรดดูสิ่งนี้เกี่ยวกับการรับคำตอบที่ช่วยแก้ปัญหาของคุณ: stackoverflow.com/help/someone-answers - person Sobrique; 10.07.2015