مجموعه آموزش ها و ترفند های پایتونی(4): برنامه اعداد فیثاغورسی در پایتون


نوشتن برنامه‌ی کاربردی با پایتون

برای آشنایی بیشتر با اعداد فیثاغورسی، ابتدا با یک برنامه‌ی ساده شروع می‌کنیم:

برنامه‌ای بنویسید که سه عدد صحیح از کاربر بگیرد، و اگر امکان ساخت یک مثلث قائم‌الزاویه با اضلاع داده شده، وجود داشته باشد، در خروجی "Yes" و در غیر این صورت "No" را چاپ کنید.

طبق روال اغلب برنامه‌ها‌، باید از کاربر ورودی بگیریم.

برای حل این سوال، در ادامه به رابطه‌ی اضلاع و وتر مثلث قائم‌الزاویه و مفهوم اعداد فیثاغورسی می‌پردازیم.

اعداد فیثاغورسی چیست؟

قضیه فیثاغورس می‌گوید که در مثلث راست‌گوشه (قائم‌الزاویه) همیشه مجموع مربع دو ضلع، برابر با مربع وتر استیعنی اگر a و b اضلاع دو ضلع مثلث راست‌گوشه و c وتر آن باشد، این رابطه برقرار است:

a2 + b2 = c2

بر همین اساس، اگر ما سه عدد داشته باشیم که رابطه‌ی بالا برای آن سه عدد برقرار باشد (یعنی مربع یکی از آنها برابر مجموع مربع دو عدد دیگر باشد) به این اعداد، سه‌تایی فیثاغورسی یا اعداد فیثاغورسی می‌گویند.

الگوریتم برنامه اعداد فیثاغورسی در پایتون:

  1. سه عدد a و b و c را از کاربر بگیر.
  2. اگر a2 = b2 + c2 یا b2 = a2 + c2 یا c2 = a2 + b2  باشد، پیام “Yes” را چاپ کن و به گام 4 برو.
  3. پیام “No” را چاپ کن.
  4. به اجرای الگوریتم پایان بده.

نوشتن کد برنامه اعداد فیثاغورسی در پایتون:

ابتدا با استفاده از دستور input ، سه ورودی عدد صحیح از کاربر دریافت می‌کنیم. به این صورت:

a = int(input(&quotplease Enter Number1: &quot))
b = int(input(&quotplease Enter Number2: &quot))
c = int(input(&quotplease Enter Number3: &quot))

سپس با استفاده از یک if، بررسی می‌کنیم که آیا مربع هر کدام از اعداد با مجموع مربع دو عدد دیگر برابر است یا نه. اگر شرط برقرار بود، پیام “Yes” و در غیر این‌صورت پیام “No” را چاپ می‌کنیم. به این صورت:

if a*a == b*b + c*c or b*b == c*c + a*a or c*c == a*a + b*b:
    print(&quotYes&quot)

else:
    print(&quotNo&quot)

ما می‌توانیم هر یک از شروط را  با دستور elif جداگانه بررسی کنیم. برای مثال:

if a*a == b*b + c*c: 
    print(&quotYes&quot)
elif b*b == c*c + a*a :
    print(&quotYes&quot)
elif c*c == a*a + b*b:
    print(&quotYes&quot)
else:
    print(&quotNo&quot)

اما این روش کد ما را شلوغ و ناخوانا می‌کند، لذا روش اول را انتخاب می‌کنیم. کد یکجای برنامه را در زیر ببینید:

a = int(input(&quotplease Enter Number1: &quot))
b = int(input(&quotplease Enter Number2: &quot))
c = int(input(&quotplease Enter Number3: &quot))

if a*a == b*b + c*c or b*b == c*c + a*a or c*c == a*a + b*b:
    print(&quotYes&quot)

else:
    print(&quotNo&quot)

گسترش دادن برنامه اعداد فیثاغورسی در پایتون:

برنامه‌ای بنویسید که اعداد فیثاغورسی کمتر از 100 را چاپ کند.

به دو فرمول زیر دقت کنید:

a2 + b2 = c2

(m2 - n2)2 + (2mn)2 = (m2 + n2)2

در فرمول دوم، عبارات داخل پرانتز معادل هر یک از حروف a و b و c در فرمول اول هستند، پس فقط با داشتن دو عدد خواهیم توانست بی‌نهایت اعداد فیثاغورسی بسازیم. برای مثال اگر m=3 و n=2 قرار دهیم، سه تایی 5 و 12 و 13 به دست می‌آید. اکنون از همین فرمول استفاده کرده و برنامه‌ی خواسته شده را می‌نویسیم.

الگوریتم اول برنامه اعداد فیثاغورسی در پایتون

  1. مقدار 0 را در c قرار بده.
  2. مقدار 2 را در m قرار بده.
  3. مقدار 100 را در limits قرار بده.
  4. در ازای مقادیر n از 1 تا m و افزایش یک واحد پس از اجرای حلقه، گام‌های 5 تا 9 را تکرار و اجرا کن.
  5. حاصل تفریق m به توان 2 از n به توان 2 را در a قرار بده.
  6. حاصل 2 * m * n را در b قرار بده.
  7. حاصل جمع m به توان 2 با n به توان 2 را در c قرار بده.
  8. اگر c بزرگتر از limits است، از حلقه خارج شو.
  9. مقادیر a و b و c را چاپ کن.
  10. یک واحد به m اضافه کن و در m قرار بده.
  11. اگر c کوچکتر از limits است، به گام 4 برگرد.
  12. به اجرای الگوریتم خاتمه بده.

نوشتن کد برنامه اعداد فیثاغورسی در پایتون:

ابتدا سه متغیر c و m و limits را تعریف کرده و مقداردهی می‌کنیم. به این صورت:

c, m , limits = 0, 2, 100

سپس یک حلقه‌ی تکرار while می‌نویسیم که تا هنگامی که c کوچکتر از limits است، اجرا می‌شود. در داخل حلقه نیز حلقه‌ی for می‌نویسیم که از 1 تا m تکرار می‌شود. در انتها، یک واحد به m اضافه می‌کنیم. به این صورت:

while c < limits:
    for n in range(1, m):
        pass

    m = m + 1

در حلقه‌ی for بالا، مقادیر a و b و c را از رابطه‌هایی که در فرمول بود، به دست می‌آوریم. به این صورت:

a = m * m - n * n
b = 2 * m * n
c = m * m + n * n

در ادامه با یک شرط بررسی می‌کنیم که اگر c بزرگتر از limits باشد، با استفاده از دستور break از حلقه خارج شویم. به این صورت:

if c > limits:
    break

در انتهای حلقه‌ی داخلی for ، مقادیر a و b و c را چاپ می‌کنیم.

print(a, b, c)

با استفاده از فرمولی که داشتیم، ما توانستیم برنامه‌ای بنویسیم که اعداد‌ فیثاغورسی کمتر از 100 را چاپ کند. کد یکجای برنامه را در زیر می‌بینید:

c, m , limits = 0, 2, 100

# Limiting c would limit
# all a, b and c
while c < limits :
    # Now loop on n from 1 to m-1
    for n in range(1, m) :
        a = m * m - n * n
        b = 2 * m * n
        c = m * m + n * n

        # if c is greater than
        # limit then break it
        if c > limits :
            break

        print(a, b, c)

    m = m+1

الگویتم دوم برنامه اعداد فیثاغورسی در پایتون

در الگوریتم اول تعداد زیادی از اعداد فیثاغورسی، محاسبه و چاپ نمی‌شوند. در ادامه الگوریتمی را بررسی می‌کنیم که تعداد بیشتری از سه‌تایی‌های فیثاغورسی را چاپ می‌کند.

  1. مقدار 100 را در limits قرار بده.
  2. در ازای مقادیر a از 1 تا limits و افزایش یک واحد پس از اجرا حلقه، گام‌های 3 تا 8 را تکرار و اجرا کن.
  3. یکی به a اضافه کن و در b قرار بده.
  4. یکی به b اضافه کن و در c قرار بده.
  5. تا وقتی c به توان 2 کوچکتر از حاصل جمع a به توان 2 با b به توان 2 است، یک واحد به c اضافه کن و در c قرار بده.
  6. اگر حاصل جمع a به توان 2 با b به توان 2 برابر با c به توان 2 است و c کوچکتر مساوی limits است، مقادیر a و b و c را چاپ کن.
  7. یکی به b اضافه کن و در b قرار بده.
  8. اگر c کوچکتر مساوی limits است، به گام 3 برگرد.
  9. به اجرای الگوریتم خاتمه بده.

نوشتن کد برنامه اعداد فیثاغورسی در پایتون:

نخست متغیر limits را تعریف کرده و مقدار 100 را به آن اختصاص می‌دهیم. این متغیر محدوده‌ی اعدادی که باید به دست بیاوریم را مشخص می‌کند.

limits = 100

سپس با یک حلقه‌ی تکرار for  ، که از یک تا limits را پیمایش می‌کند، کار را ادامه می‌دهیم. در حلقه ابتدا دو متغیر b و c را تعریف کرده و به صورت زیر مقداردهی می‌کنیم.

for a in range(1, limits):
    b = a+1
    c = b+1

در ادامه‌ی حلقه‌ی for، یک حلقه‌ی تکرار while می‌نویسیم که تا وقتی c کوچکتر مساوی limits است، تکرار و اجرا ‌شود. در حلقه‌ی while نیز یک حلقه‌ی while دیگر نوشته، که تا هنگامی که c*c کوچکتر از a*a + b*b است، یک واحد به c اضافه ‌کند. به این صورت:

while c<=limits:
    while c*c < a*a + b*b :
        c = c+1
    pass

به جای pass، در کد بالا با استفاده از یک if بررسی کرده اگر c کوچکتر مساوی limits و مربع c مساوی مجموع مربع a و b باشد، مقادیر a و b و c را چاپ می‌کنیم. در انتها نیز b را با یک جمع کرده و در خود b می‎‌ریزیم. به این صورت:

if c*c == a*a + b*b and c<=limits:
    print(a, b, c) 
    b = b+1

اکنون کار کدنویسی این برنامه به پایان می‌رسد. این کد به نسبت بهینه‌شده است و از سرعت اجرای خوبی برخوردار است. کد یکجای این الگوریتم را در زیر ببینید:

limits = 100

for a in range(1, limits):
    b = a+1
    c = b+1
    while c<=limits:
        while c*c < a*a + b*b :
            c = c+1
        if c*c == a*a + b*b and c<=limits:
            print(a, b, c)   

        b = b+1

جمع بندی:

اغلب مسایل از راه‌های متفاوت و بسیاری حل می‌شوند، اما این به برنامه‌نویس بر می‌گردد که کدام راه‌حل را انتخاب کند. برنامه‌نویس می‌تواند بعد از هر کدی که می‌نویسد، با جستجو در اینترنت، با روش‌های دیگر نوشتن همان کد آشنا شود. این‌گونه خلاقیت و قدرت تفکر او پرورش می‌یابد و به این طریق در مسایل دیگر، از قدرت تفکر و تجربه‌ی بالاتری برخوردار خواهد بود.

ما در این مقاله، سعی کردیم شما را با برنامه اعداد فیثاغورسی در پایتون آشنا کنیم. به طور قطع راه‌حل‌های دیگری نیز وجود دارد، که برخی بهینه‌شده و برخی دیگر نیستند.

خوب جلسه ی چهارم آموزش ها و ترفند های پایتونی تمشک به پایان رسید امیدواریم که تا اینجای کار از آموزش راضی بوده باشید...
راستی !
آموزش جنگو هم توی ویرگول تمشک قرار میگیره ، پس اگر دوست داشتید دنبالش کنید...
تا جلسه ی بعد خدانگهدار ????

دوره آموزشی های تصویری ما را هم در یوتیوب دنبال کنید و حتما پیشنهاد میکنم پیج اینستاگرام تمشک رو دنبال کنید ، برای دسترسی به بعضی از کدهای آموزش ها هم به گیتهاب تمشک سر بزنید.

اگر بازم از این آموزشها دوست داشتید یادتون نره دنبال کردن انتشارات ما رو ?.

© تمشک