Table of Contents
ایدهٔ کلی برنامهٔ آزمون
در این پروژه میخواهیم یک «برنامهٔ آزمون ساده» بسازیم که:
- چند سؤال از کاربر میپرسد
- جواب کاربر را میگیرد
- بررسی میکند جواب درست است یا نه
- در پایان نمرهٔ کاربر را نمایش میدهد
این پروژه تمرین خوبی برای:
- متغیرها
- ورودی و خروجی (
input/print) - شرطها (
if) - حلقهها (
for) - لیستها و دیکشنریها
است.
در این فصل چند نسخهٔ ساده تا کمی پیشرفتهتر از یک برنامهٔ Quiz را قدم به قدم میسازیم.
نسخهٔ ۱: آزمون خیلی ساده با چند سؤال ثابت
در سادهترین نسخه، میتوانیم فقط چند سؤال را پشت سر هم بپرسیم و نمره را بشماریم.
ایده:
- یک متغیر مثل
scoreبرای نمره - پرسیدن سؤال با
input - مقایسهٔ جواب کاربر با جواب درست
- افزایش نمره اگر جواب درست بود
- چاپ نمرهٔ نهایی
score = 0 # نمرهٔ کاربر
print("به آزمون اطلاعات عمومی خوش آمدید!")
answer = input("1) پایتون چیست؟ (زبان / حیوان / هر دو): ")
if answer == "هر دو":
print("درست!")
score = score + 1
else:
print("نادرست!")
answer = input("2) کدام عدد از همه بزرگتر است؟ 10 ، 50 ، 3 : ")
if answer == "50":
print("درست!")
score = score + 1
else:
print("نادرست!")
print("آزمون تمام شد.")
print("نمرهٔ شما:", score, "از 2")نکتهها:
- این نسخه ساده است ولی تکرار کد زیادی دارد.
- اگر بخواهیم ۲۰ سؤال داشته باشیم، کپیپیست زیاد میشود.
در نسخههای بعدی این مشکل را بهتر حل میکنیم.
نسخهٔ ۲: استفاده از لیست برای ذخیرهٔ سؤالها
برای منظمتر شدن، میتوانیم سؤالها را داخل یک لیست قرار دهیم و روی آن حلقه بزنیم.
ایده:
- یک لیست از سؤالها
- یک لیست از جوابهای درست (در همان ترتیب)
- یک حلقهٔ
forروی اندیسها (یا روی خود سؤالها) - مقایسهٔ جواب کاربر با جواب درست
questions = [
"1) پایتون چیست؟ (زبان / حیوان / هر دو): ",
"2) کدام عدد بزرگتر است؟ 10 ، 50 ، 3 : ",
"3) حاصل 2 + 2 چند است؟ "
]
answers = [
"هر دو",
"50",
"4"
]
score = 0
print("به آزمون کوچک خوش آمدید!")
print("لطفاً به سؤالها پاسخ دهید.\n")
for i in range(len(questions)):
user_answer = input(questions[i])
if user_answer == answers[i]:
print("✔ جواب درست")
score += 1
else:
print("✖ جواب نادرست")
print("\nآزمون تمام شد.")
print("نمرهٔ نهایی شما:", score, "از", len(questions))مزیت این روش:
- اگر سؤال جدید اضافه کنیم، فقط کافی است به لیستها یک مورد جدید اضافه کنیم.
- حلقهٔ
forخودش به ترتیب همهٔ سؤالها را میپرسد.
نسخهٔ ۳: استفاده از دیکشنری یا لیست از دیکشنریها
روش قبلی با دو لیست جدا کمی خطرناک است؛ اگر ترتیبها قاطی شود، پاسخها بهم میریزند.
یک روش مرتبتر، استفاده از دیکشنری یا «لیست از دیکشنریها» است.
ایدهٔ «لیست از دیکشنریها»:
- هر سؤال یک دیکشنری است که مثلا این اطلاعات را دارد:
- متن سؤال
- جواب درست
- همهٔ سؤالها را در یک لیست قرار میدهیم.
- روی لیست حلقه میزنیم.
quiz = [
{"question": "1) پایتون چیست؟ (زبان / حیوان / هر دو): ",
"answer": "هر دو"},
{"question": "2) حاصل 3 * 5 چند است؟ ",
"answer": "15"},
{"question": "3) رنگ آسمان در روز (مثلاً): ",
"answer": "آبی"},
]
score = 0
print("آزمون شروع شد!\n")
for item in quiz:
user_answer = input(item["question"])
if user_answer == item["answer"]:
print("درست ✅")
score += 1
else:
print("غلط ❌")
print("\nآزمون تمام شد.")
print("نمرهٔ شما:", score, "از", len(quiz))این ساختار وقتی سؤالها پیچیدهتر میشوند (مثلاً چند گزینهای، زمانبندی، سختی سؤال و …) خیلی مفید است.
نسخهٔ ۴: اجازهٔ پاسخ حروف بزرگ/کوچک متفاوت
در نسخههای قبل، اگر جواب درست هر دو باشد، و کاربر بنویسد هر دو با فاصلهٔ اضافه یا حروف انگلیسی بزرگ/کوچک، ممکن است غلط حساب شود.
برای «منعطفتر شدن»، میتوانیم:
- دو طرف را تبدیل به حروف کوچک کنیم (
lower()) - یا فاصلههای اضافی ابتدا و انتها را حذف کنیم (
strip())
correct = "هر دو"
user_answer = input("پایتون چیست؟ (زبان / حیوان / هر دو): ")
# تمیز کردن ورودی کاربر
user_answer = user_answer.strip() # حذف فاصلههای اول و آخر
user_answer = user_answer.lower() # تبدیل به حروف کوچک
if user_answer == correct.lower():
print("جواب درست است.")
else:
print("جواب نادرست است.")این تکنیک را میتوانید داخل حلقهٔ اصلی آزمون هم استفاده کنید تا کاربر لازم نباشد دقیقاً همان شکل را تایپ کند.
نسخهٔ ۵: آزمون چندگزینهای (Multiple Choice)
در بسیاری از آزمونها، سؤالها چند گزینهای هستند.
میتوانیم ساختار سؤال را اینطور نگه داریم:
- متن سؤال
- لیست گزینهها
- حرف گزینهٔ درست (مثلاً
a،b،c،d)
quiz = [
{
"question": "1) خروجی 2 + 3 در پایتون چیست؟",
"options": ["a) 23", "b) 5", "c) 6"],
"answer": "b"
},
{
"question": "2) کدام یک نوع دادهٔ عدد صحیح در پایتون است؟",
"options": ["a) int", "b) str", "c) list"],
"answer": "a"
},
{
"question": "3) کدام دستور برای گرفتن ورودی از کاربر است؟",
"options": ["a) print", "b) input", "c) if"],
"answer": "b"
}
]
score = 0
print("آزمون چندگزینهای پایتون\n")
for item in quiz:
print(item["question"])
for opt in item["options"]:
print(opt)
user_answer = input("جواب شما (a/b/c): ")
# تمیز کردن جواب
user_answer = user_answer.strip().lower()
if user_answer == item["answer"]:
print("درست ✅\n")
score += 1
else:
print("غلط ❌\n")
print("آزمون تمام شد.")
print("نمرهٔ شما:", score, "از", len(quiz))میتوانید تعداد گزینهها را بیشتر کنید یا حروف دیگری برای گزینهها بگذارید.
نسخهٔ ۶: محاسبهٔ درصد و نمایش نتیجهٔ توصیفی
بهجای فقط گفتن «نمرهٔ شما ۲ از ۳ است»، میتوانیم درصد و یک پیام انگیزشی چاپ کنیم.
فرض کنیم نمرهٔ خام شما $score$ و تعداد سؤالها $n$ باشد.
درصد نمره به صورت زیر است:
$$
percent = \frac{score}{n} \times 100
$$
total_questions = len(quiz)
percent = (score / total_questions) * 100
print("\nنمرهٔ خام:", score, "از", total_questions)
print("درصد نمره: ", percent, "%")
if percent == 100:
print("عالی! همه را درست جواب دادید.")
elif percent >= 70:
print("خیلی خوب بود!")
elif percent >= 50:
print("بد نیست، ولی میتوانید بهتر شوید.")
else:
print("نیاز به تمرین بیشتری دارید.")این قسمت را میتوانید بعد از پایان هر نوع آزمونی (متنی یا چندگزینهای) اضافه کنید.
نسخهٔ ۷: تبدیل منطق آزمون به تابع
برای مرتب شدن کد، میتوانیم کد آزمون را در یک تابع قرار دهیم؛ مثلاً:
- تابعی به نام
run_quiz(quiz)که یک لیست سؤال میگیرد - نمره را حساب میکند
- در پایان نمره را برمیگرداند
def run_quiz(quiz):
score = 0
for item in quiz:
print(item["question"])
for opt in item["options"]:
print(opt)
user_answer = input("جواب شما: ").strip().lower()
if user_answer == item["answer"]:
print("درست ✅\n")
score += 1
else:
print("غلط ❌\n")
return score
# تعریف سوالها
quiz_questions = [
{
"question": "1) کدام نماد برای کامنت یکخطی در پایتون استفاده میشود؟",
"options": ["a) //", "b) #", "c) /* */"],
"answer": "b"
},
{
"question": "2) کدام تابع نوع داده را نشان میدهد؟",
"options": ["a) print()", "b) input()", "c) type()"],
"answer": "c"
}
]
print("برنامهٔ آزمون پایتون\n")
score = run_quiz(quiz_questions)
total = len(quiz_questions)
percent = (score / total) * 100
print("نمرهٔ شما:", score, "از", total)
print("درصد:", percent, "%")مزیت:
- اگر بعداً بخواهید چند آزمون مختلف بسازید (مثلاً «آزمون مقدماتی»، «آزمون پیشرفته»)، فقط کافی است لیست سؤالها را عوض کنید، نه منطق اصلی آزمون را.
امکانات اختیاری برای تمرین بیشتر
اگر دوست دارید برنامهٔ آزمون خود را کمی حرفهایتر کنید، میتوانید این ایدهها را تمرین کنید:
- تصحیح خودکار فاصله و حروف
- حتماً روی جوابها
strip()وlower()را اجرا کنید. - امکان پذیرش چند پاسخ درست (مثلاً «آبی» یا «آسمانی») را اضافه کنید.
- نمایش جواب درست بعد از پاسخ غلط
بعد از چاپ «غلط»، جواب درست را هم نمایش دهید:
print("جواب درست این بود:", item["answer"])- شمارش سؤالات درست و غلط بهطور جداگانه
مثلا دو متغیرcorrect_countوwrong_countداشته باشید. - تصادفیکردن ترتیب سؤالها
با استفاده ازrandom.shuffle()(در فصل کتابخانهها با آن آشنا میشوید) ترتیب سؤالها را عوض کنید تا آزمون هر بار شبیه هم نباشد. - دستهبندی سؤالها
مثلا سؤالها را به «آسان»، «متوسط»، «سخت» تقسیم کنید و فقط از یک دسته آزمون بگیرید. - ذخیرهٔ نتیجهٔ آزمون در فایل
در پایان آزمون، نام کاربر و نمرهاش را داخل یک فایل متنی ذخیره کنید (با مطالب فصل «کار با فایلها»).
این پروژه را میتوانید همزمان با جلو رفتن در فصلهای دیگر تکمیلتر کنید؛
هر بار که مفهوم جدیدی یاد میگیرید، فکر کنید چطور میشود آن را به برنامهٔ آزمون اضافه کرد.