یکی از جذابترین کارهایی که برنامهنویسان و به ویژه مدرسان شاغل در آموزشگاههای برنامهنویسی انجام میدهند، ساخت یک ماشین حساب در پایتون است. بهطور سنتی، مدرسان زبانهای برنامهنویسی روی ساخت ساعت آنالوگ و ماشین حساب تمرکز خاصی دارند و در بیشتر آموزشگاهها این دو برنامه به عنوان پروژه تمرینی به افراد آموزش داده میشود. البته مورد اول بیشتر در ارتباط با مبحثی است که پیرامون آموزش گرافیک کامپیوتری قرار دارد، اما مورد دوم که موضوع این مقاله است جنبه عمومی داشته و به عنوان یکی از تمرینهای جذاب، اما مهم مورد توجه است.
پیشنهاد مقاله: ترفندهای کاربردی زبان برنامهنویسی پایتون (بخش دوم)
چرا پروژه ساخت یک ماشین حساب در پایتون ارزش زیادی دارد؟
اولین سوالی که پس از خواندن عنوان این مقاله ممکن است به ذهنتان خطور کرده باشد این است که چرا ساخت ماشین حساب در زبان برنامهنویسی پایتون مهم است؟ در پاسخ باید بگوییم که پایتون یک زبان برنامهنویسی شیگرا است که یادگیری آن ساده است. بهطوری که آحاد جامعه در گروههای سنی مختلف میتوانند در مدت زمان کوتاهی برنامهنویسی پایتون را یاد بگیرند.
یکی از بهترین روشهای یادگیری زبانهای برنامهنویسی، انجام پروژه و استفاده از آن زبان به صورت عملی است. بهطور معمول، این تکنیک بیشتر در بوتکمپهای برنامهنویسی که دورههای هدفمندی را برگزار میکنند مورد توجه است. پس از یادگیری ترکیب نحوی و سایر مباحث اولیه یک زبان برنامه نویسی، ادامه مسیر یادگیری پروژهمحور است. تنها در این صورت است که قادر به افزایش سطح مهارتهای فردی خود هستید. در این پروژه ساخت ماشین حساب قصد داریم یک ماشین حساب اولیه طراحی کنیم که قادر به انجام چهار عمل اصلی ریاضی جمع، تفریق، ضرب و تقسیم است. با استفاده از این رویکرد، امکان یادگیری مبانی و اصول مقدماتی زبان برنامهنویسی پایتون تسهیل میشود. بنابراین، اگر تازه وارد به دنیای برنامهنویسی پایتون هستید، این پروژه به خوبی قادر به افزایش سطح مهارتهایتان است.
آموزش ساخت یک ماشین حساب در پایتون
گام اول، دریافت ورودی از کاربر
ماشین حساب زمانی کارکرد خوبی دارد که مخاطب فرمولهایی در اختیار ماشین حساب قرار دارد و ماشین حساب قادر به حل آنها باشد. در مرحله اول، باید یک فایل پایتون با پسوند py برای پروژه ساخت ماشین حساب پایتون ایجاد کنید. میتوانید از هر ویرایشگر یا محیط توسعه یکپارچه برای ساخت پروژه استفاده کنید. میتوان فایل پروژه را calculator.py نامگذاری کرد. در این پروه از ویرایشگر متن Nano استفاده شده است. بنابراین، پس از ساخت فایل پروژه، با دستور زیر میتوان فایل مربوطه را اجرا و کدنویسی را آغاز کرد:
nano calculator.py
در ادامه، قرار است کدهایی به این فایل اضافه شود که با اجرای آنها، پروژه ساخت ماشین حساب پایتون تکمیل میشوند. برای این برنامه خاص، دو عدد به عنوان ورودی از کاربر دریافت میشوند. بنابراین، لازم است برنامه به گونهای نوشته شود که عددهای مورد نظر کاربر از او دریافت شوند. برای انجام این کار، از تابع input() استفاده میکنیم. با کمک این تابع مقدارهای ورودی وارد شده مورد نظر کاربر دریافت میشوند:
میتوان از طریق تابع input()پیغامی به کاربر نمایش داد. پس از آن، ورودی مورد نظر کاربر باید به یک متغیر تخصیص داده شود. نکته مهم این است که هنگام دریافت ورودی، یک فضای خالی در پایان رشته اضافه شود تا یک فاصله میان ورودی کاربر و پیام نمایش داده شود تا ظاهر برنامه مطلوبتر شود. برای دریافت دو عدد به عنوان ورودی، باید از دستور زیر استفاده کنید:
number_1 = input(‘Enter your first number: ‘)
number_2 = input(‘Enter your second number: ‘)
اکنون میتوانید برنامه را اجرا کنید، اما قبل از اجرای برنامه، باید فایل برنامه را ذخیره کنید. همانگونه که اشاره کردیم در این مطلب از ویرایشگر nano استفاده شده است. کافی است کلیدهای CTRL و X و سپس Y و Enter را فشار دهید. برای اجرای فایل پروژه ساخت ماشین حساب با پایتون باید دستور زیر در محیط ترمینال یا شل سیستم عامل اجرا شود.
python calculator.py
با اجرای کد فوق، یک پیام در خروجی خط فرمان نمایش داده میشود که لازم است کاربر در آن دو عدد ورودی را از طریق صفحه کلید خود وارد کند:
Output
Enter your first number: 5
Enter your second number: 7
اگر برنامه فوق را به دفعات اجرا و اعداد یا کاراکترهای مختلفی را به عنوان ورودی وارد کنید، مجموعهای از کلمهها، نمادها، فضاهای خالی یا حتی کلید Enter را به عنوان ورودی در خروجی مشاهده میکنید. این یک مشکل برای ماشین حساب است، زیرا تابع ()input دادهها را به عنوان رشته دریافت میکند. به بیان ساده، این تابع اطلاعی در مورد اینکه ورودی مورد نظر از نوع عدد است در اختیار ندارد. بنابراین، برنامه باید به گونهای نوشته شود که تنها دادههای عددی از ورودی دریافت کند. این موضوع به دو دلیل باید مورد توجه قرار گیرد:
تا برنامه امکان اجرای محاسبات ریاضی را داشته باشد.
عمل اعتبارسنجی در مورد ورودی کاربر به عنوان یک رشته عددی به درستی انجام شود.
میتوان رشته دریافتی از تابع ()input را به نوع عدد صحیح (Integer) یا نوع ممیز شناور (Float) تبدیل کرد. در این آموزش نوع رشته به نوع عدد صحیح تبدیل میشود. برای تبدیل آن، قبل از تابع input()باید واژه Int استفاده شود. برای درک موضوع به دستور زیر دقت کنید:
number_1 = int(input(‘Enter your first number: ‘))
number_2 = int(input(‘Enter your second number: ‘))
اگر فایل برنامه اجرا و مقادیر عدد صحیح از صفحه کلید کاربر دریافت شوند، خطا اتفاق نمیافتد.
Output
Enter your first number: 23
Enter your second number: 674
اگر مقادیری غیر از دو عدد صحیح، مثلاً حروف مختلف یا نمادها، به عنوان ورودی دریافت شوند، در خروجی برنامه یک خطا مشابه کد زیر نمایش داده خواهد شد:
Output
Enter your first number: hamidreza taebi
Traceback (most recent call last):
File “testing.py”, line 1, in <module>
number_1 = int(input(‘Enter your first number: ‘))
ValueError: invalid literal for int() with base 10: hamidreza taebi ‘
تا این مرحله از آموزش ساخت ماشین دو متغیر در قالب نوعهای داده عدد صحیح از کاربر به عنوان ورودی دریافت شده است. همانگونه که قبلتر به آن اشاره شد، میتوان ورودیها را به اعداد ممیز شناور تبدیل کرد.
گام دوم، اضافه کردن عملگرها در ماشین حساب
اکنون باید نحوه اضافه کردن عملگرهای مربوط به چهار عمل اصلی ریاضی، یعنی عملهای جمع، تفریق، ضرب و تقسیم را بررسی کنیم. همزمان با نوشتن این برنامه، باید مطمئن شوید که تمام بخشهای آن به درستی کار میکنند. برای جمع دو عدد با این ماشین حساب، از علامت + استفاده میشود. با قرار دادن دو متغیر مربوط به اعداد ورودی به همراه یک علامت جمع، این عمل ریاضی درون تابع Print امکانپذیر میشود. برای درک بهتر نحوه جمع کردن دو عدد در این برنامه، به قطعه کد زیر توجه شود:
number_1 = int(input(‘Enter your first number: ‘))
number_2 = int(input(‘Enter your second number: ‘))
print(number_1 + number_2)
در قطعه کد فوق، عمل جمع دو عدد ورودی، درون تابع Print انجام شده است. میتوان برنامه را اجرا کرد تا عملکرد این بخش از پروژه بهطور واضح مشخص شود:
Output
Enter your first number: 8
Enter your second number: 3
11
خروجی فوق نشان میدهد که این بخش پروژه ساخت ماشین حساب با پایتون به درستی تکمیل شده است. اکنون، باید مواردی به برنامه اضافه شوند که با کمک آنها، کاربر در زمان اجرا از نحوه عملکرد برنامه مطلع شود. برای انجام این کار، میتوان از مکانیزم قالببندی رشتهها (String Formatters) استفاده کرد. همانطور که از نام این تکنیک مشخص است، با استفاده از فرمتکنندگان رشته، امکان قالببندی متن و ارائه بازخورد مناسب وجود دارد. اگر ضروری است کاربر اطلاعات خاصی در ارتباط با دو عدد ورودی و عملگر مربوطه دریافت کند، از قطعه کد زیر استفاده کنید:
number_1 = int(input(‘Enter your first number: ‘))
number_2 = int(input(‘Enter your second number: ‘))
print(‘{} + {} = ‘.format(number_1, number_2))
print(number_1 + number_2)
اکنون زمان اجرای کدها است. مشاهده خواهید کرد که یک خروجی اضافه نمایش داده میشود. این خروجی اضافه برای دریافت تاییده از کاربر است. به بیان دیگر، در این مرحله کاربر باید تایید کند که آیا عبارت ریاضی اجرا شده توسط برنامه را تایید میکند یا خیر.
Output
Enter your first number: 90
Enter your second number: 717
90 + 717 =
807
تا این بخش، میتوان سایر عملگرهای مورد نظر را به برنامه اضافه کرد. بدین ترتیب، برای اعمالی مانند تفریق، ضرب و تقسیم نیز از فرمتکنندگان یکسانی استفاده میشود. در ادامه کدهای مربوط به پیادهسازی سه عمل تفریق، ضرب و تقسیم آمده است:
number_1 = int(input(‘Enter your first number: ‘))
number_2 = int(input(‘Enter your second number: ‘))
# Addition
print(‘{} + {} = ‘.format(number_1, number_2))
print(number_1 + number_2)
# Subtraction
print(‘{} – {} = ‘.format(number_1, number_2))
print(number_1 – number_2)
# Multiplication
print(‘{} * {} = ‘.format(number_1, number_2))
print(number_1 * number_2)
# Division
print(‘{} / {} = ‘.format(number_1, number_2))
print(number_1 / number_2)
با نوشتن قطعه کد فوق، سایر اعمال اصلی ریاضی مثل تفریق، ضرب و تقسیم هم به برنامه اضافه شدند. در صورت اجرای مجدد، برنامه تمام عملگرهای فوق را با هم اجرا میکند. اگر نیاز باشد برنامه به اجرای تنها یک عمل واحد در هر لحظه محدود شود، این عمل با عبارتهای شرطی (Conditional Statements) ممکن است. با این توصیف در مرحله بعد باید نحوه اضافه کردن عملگرهای شرطی در این پروژه را بررسی کنیم.
گام سوم، اضافه کردن عبارتهای شرطی در پروژه ساخت ماشین حساب
هدف از نوشتن قطعه کد ماشین حساب با پایتون این است که کاربر با استفاده از آن امکان انتخاب عملگرهای مختلف را داشته باشد. برای انجام اینکار، باید اطلاعاتی به بخش ابتدایی این برنامه اضافه شود تا کاربر بتواند عملگر مورد نظر برای محاسبه را انتخاب کند. برای نوشتن یک رشته در خطوط مختلف، میتوان از سه نقل قول (Triple Quotes) استفاده کرد:
”’
Please type in the math operation you would like to complete:
+ for addition
– for subtraction
* for multiplication
/ for division
”’
این برنامه از هر یک از نمادهای چهار عمل اصلی ریاضی استفاده میکند تا با کمک آنها کاربر یکی از این عملگرها را انتخاب کند. در این صورت، اگر کاربر بخواهد عمل تقسیم اجرا شود، باید نماد «/» را تایپ کند. البته دقت کنید که میتوان برای این اعمال ریاضی، هر نمادی را به دلخواه انتخاب کرد. بهطور مثال، امکان استفاده از عدد 1 برای جمع یا حتی حرف b برای تفریق وجود دارد. با توجه به اینکه ورودیهای این برنامه از کاربران دریافت میشوند از تابع input() استفاده میکنیم. اکنون باید رشته فوق درون یک تابع Input() قرار داده شود و مقدار آن ورودی به یک متغیر اختصاص یابد. در این پروژه متغیر مذکور Operation نام دارد.
operation = input(”’
Please type in the math operation you would like to complete:
+ for addition
– for subtraction
* for multiplication
/ for division
”’)
number_1 = int(input(‘Enter your first number: ‘))
number_2 = int(input(‘Enter your second number: ‘))
print(‘{} + {} = ‘.format(number_1, number_2))
print(number_1 + number_2)
print(‘{} – {} = ‘.format(number_1, number_2))
print(number_1 – number_2)
print(‘{} * {} = ‘.format(number_1, number_2))
print(number_1 * number_2)
print(‘{} / {} = ‘.format(number_1, number_2))
print(number_1 / number_2)
در صورت اجرای برنامه و وارد کردن هر ورودی خاصی، هیچ اتفاقی نمیافتد. برای حل این مشکل، باید عبارتهای شرطی در برنامه وجود داشته باشند. با توجه به ساختار کلی برنامه، عبارت شرطی If در بخش مربوط به عمل جمع قرار میگیرد و برای باقی اعمال ریاضی، سه عبارت elseif یا elif استفاده میشوند. در صورتی که کاربر یک نماد به عنوان ورودی به برنامه وارد نکند، باید خطایی در خروجی برنامه نشان داده شود. بنابراین، در بخش پایانی دستور ifیک عبارت else قرار میگیرد تا از طریق آن پیام مناسبی در خروجی ظاهر شود. کدهای مربوطه در ادامه آمده است:
operation = input(”’
Please type in the math operation you would like to complete:
+ for addition
– for subtraction
* for multiplication
/ for division
”’)
number_1 = int(input(‘Enter your first number: ‘))
number_2 = int(input(‘Enter your second number: ‘))
if operation == ‘+’:
print(‘{} + {} = ‘.format(number_1, number_2))
print(number_1 + number_2)
elif operation == ‘-‘:
print(‘{} – {} = ‘.format(number_1, number_2))
print(number_1 – number_2)
elif operation == ‘*’:
print(‘{} * {} = ‘.format(number_1, number_2))
print(number_1 * number_2)
elif operation == ‘/’:
print(‘{} / {} = ‘.format(number_1, number_2))
print(number_1 / number_2)
else:
print(‘You have not typed a valid operator, please run the program again.’)
کاری که تا این بخش از مقاله انجام دادیم به این صورت است. ابتدا از کاربر درخواست کردیم یک نماد را وارد کند. بهطور مثال، هنگام اجرای برنامه، کاربر نماد «*» را برای انتخاب عمل ضرب وارد میکند. پس از آن، لازم است دو عدد، مثلاً 58 و 40 به عنوان ورودی از سمت کاربر به برنامه داده شوند. در این مرحله، عبارت و پاسخ در خروجی برنامه به شرح زیر نمایش داده میشود:
Output
Please type in the math operation you would like to complete:
+ for addition
– for subtraction
* for multiplication
/ for division
*
Please enter the first number: 58
Please enter the second number: 40
58 * 40 =
2320
با توجه به ساختار استفاده شده در این برنامه، اگر کاربر علامت درصد را در زمان ورود عملگر وارد کند، بازخوردی از برنامه دریافت نمیکند. این شرایط مادامی که کاربر یک عدد را وارد نکند، ادامه خواهد داشت. بنابراین، بهتر است از رویکردهای متفاوتی برای رسیدگی به شرایط مختلف در این برنامه استفاده شود.
مرحله چهارم، تعریف توابع
برای اینکه امکان اجرای برنامه به دفعات توسط کاربر وجود داشته باشد، باید چند تابع در برنامه تعریف شوند. ابتدا باید کدهای فعلی را در یک بلوک تابع قرار داد و نام این تابع را calculator() انتخاب کرد. برای اینکه از اجرای برنامه مطمئن شویم، فراخوانی تابع در بخش پایانی فایل ضروری است:
# Define our function
def calculate():
operation = input(”’
Please type in the math operation you would like to complete:
+ for addition
– for subtraction
* for multiplication
/ for division
”’)
number_1 = int(input(‘Please enter the first number: ‘))
number_2 = int(input(‘Please enter the second number: ‘))
if operation == ‘+’:
print(‘{} + {} = ‘.format(number_1, number_2))
print(number_1 + number_2)
elif operation == ‘-‘:
print(‘{} – {} = ‘.format(number_1, number_2))
print(number_1 – number_2)
elif operation == ‘*’:
print(‘{} * {} = ‘.format(number_1, number_2))
print(number_1 * number_2)
elif operation == ‘/’:
print(‘{} / {} = ‘.format(number_1, number_2))
print(number_1 / number_2)
else:
print(‘You have not typed a valid operator, please run the program again.’)
# Call calculate() outside of the function
calculate()
اکنون باید تابع دوم ساخته شود. درون این تابع عبارتهای شرطی مختلفی قرار میگیرند. این بلوک کد برای کاربر امکان درخواست جهت محاسبه مجدد با کمک ماشین حساب را فراهم میکند. اکنون باید تابعی بهنام again() تعریف و پس از def calculate() قرار داده شود. بلوک کد به صورت زیر است:
…
# Define again() function to ask user if they want to use the calculator again
def again():
# Take input from user
calc_again = input(”’
Do you want to calculate again?
Please type Y for YES or N for NO.
”’)
# If user types Y, run the calculate() function
if calc_again == ‘Y’:
calculate()
# If user types N, say good-bye to the user and end the program
elif calc_again == ‘N’:
print(‘See you later.’)
# If user types another key, run the function again
else:
again()
# Call calculate() outside of the function
calculate()
در حالی که عبارت elseکد فوق تا حدی دارای قابلیت مدیریت خطا است، اما میتوان حروف کوچک انگلیسی y و n را نیز به Y و N اضافه کرد. برای انجام این عمل، میتوان از تابع رشتهای str.upper() استفاده کرد:
…
def again():
calc_again = input(”’
Do you want to calculate again?
Please type Y for YES or N for NO.
”’)
# Accept ‘y’ or ‘Y’ by adding str.upper()
if calc_again.upper() == ‘Y’:
calculate()
# Accept ‘n’ or ‘N’ by adding str.upper()
elif calc_again.upper() == ‘N’:
print(‘See you later.’)
else:
again()
…
در این مرحله، باید تابع again() در پایان تابع function() اضافه شود تا از کاربر سوال شود که آیا میخواهد ادامه دهد یا خیر:
def calculate():
operation = input(”’
Please type in the math operation you would like to complete:
+ for addition
– for subtraction
* for multiplication
/ for division
”’)
number_1 = int(input(‘Please enter the first number: ‘))
number_2 = int(input(‘Please enter the second number: ‘))
if operation == ‘+’:
print(‘{} + {} = ‘.format(number_1, number_2))
print(number_1 + number_2)
elif operation == ‘-‘:
print(‘{} – {} = ‘.format(number_1, number_2))
print(number_1 – number_2)
elif operation == ‘*’:
print(‘{} * {} = ‘.format(number_1, number_2))
print(number_1 * number_2)
elif operation == ‘/’:
print(‘{} / {} = ‘.format(number_1, number_2))
print(number_1 / number_2)
else:
print(‘You have not typed a valid operator, please run the program again.’)
# Add again() function to calculate() function
again()
def again():
calc_again = input(”’
Do you want to calculate again?
Please type Y for YES or N for NO.
”’)
if calc_again.upper() == ‘Y’:
calculate()
elif calc_again.upper() == ‘N’:
print(‘See you later.’)
else:
again()
calculate()
اکنون با اجرای فایل این برنامه در محیط خط فرمان ویندوز، میتوان به تعداد دفعات دلخواه محاسبات لازم با این ماشین حساب را انجام داد.
گام پنجم : بهبود دادن کدهای پروژه
تا این مرحله از آموزش ساخت ماشین حساب برنامه بدون مشکل کار میکند. با این وجود، هنوز راههای مختلفی برای بهبود کدهای این پروژه وجود دارند. بهطور مثال، میتوان یک تابع خوشآمدگویی تعریف کرد تا در ابتدای برنامه به کاربر پیام خوشآمدگویی نشان دهد:
def welcome():
print(”’
Welcome to Calculator
”’)
…
# Don’t forget to call the function
welcome()
calculate(
علاوه بر تابع فوق، راههای دیگری نیز وجود دارند که از طریق آنها در برنامه، رسیدگی و مدیریت خطاها به شکل بهتری انجام شوند. در شرایط فعلی در صورت وارد کردن دو مقدار غیر از اعداد صحیح، این برنامه خطایی نشان میدهد و متوقف میشود.
علاوه بر این، در شرایطی که کاربر عملگر تقسیم را برای استفاده انتخاب و مقدار صفر را به عنوان عدد ورودی دوم در برنامه وارد کند، یک خطای تقسیم بر صفر از سوی برنامه دریافت میکند. برای حل این موارد، میتوان از دستورات Try…Except استفاده کرد. این پروژه محدود به چهار عمل اصلی ریاضی است، اما امکان اضافه کردن عملگرهای اضافه نیز وجود دارد:
…
operation = input(”’
Please type in the math operation you would like to complete:
+ for addition
– for subtraction
* for multiplication
/ for division
** for power
% for modulo
”’)
…
# Don’t forget to add more conditional statements to solve for power and modulo
علاوه بر این، بهتر است دستور حلقه این برنامه بازنویسی شود. برای مدیریت خطا، ویرایش و بهبود هر یک از برنامههای مختلف، از جمله پروژه ساخت ماشین حساب روشهای مختلفی وجود دارد.
منابع:
https://www.digitalocean.com/community/tutorials/how-to-make-a-calculator-program-in-python-3
https://medium.com/javarevisited/8-projects-you-can-buil-to-learn-python-in-2020-251dd5350d56
نویسنده: حمیدرضا تائبی