هر بار که یک تمرین حلقهی for را حل میکنی، در حال ساختن عضلات ذهنت برای حل مسائل واقعی هستی. این سوالات نه فقط زنجیرهای از کدها، که داستانهایی کاربردیاند؛ هر داستان فرصتی است برای تجربهٔ دنیای واقعی از مدیریت فهرست خرید و برنامهریزی بودجه، تا شبیهسازی رشد جمعیت و توسعهٔ الگوریتمهای مرتبسازی. با هر مثال، شکاف بین تئوری و عمل پر میشود و توانایی تو در طراحی راهحلهای خلاقانه تقویت میگردد.
حل گامبهگام این سوالات، به تو اجازه میدهد تا با چالشهای متنوع روبهرو شوی: شمارش، جمعآوری داده، ساخت ساختارهای تودرتو، کار با دیکشنری و لیستهای دوبعدی، و حتی پردازش فایلهای CSV و رمزنگاری ساده. وقتی از اولین جدول ضرب تا تولید مثلث پاسکال را خودت پیاده کنی، میبینی چگونه هر حلقه for در زبان پایتون، پایهٔ قدرتمندی برای پروژههای بزرگتر میسازد.
مهمترین دستاورد این مسیر، رشد اعتماد به نفس توست؛ وقتی میتوانی مسئلهای را به قطعات کوچک تقسیم کرده و با حلقهها حلش کنی، مهارتهای برنامهنویسیات جهش میکند. همین امروز شروع کن، هر مثال را با دقت و کنجکاوی حل کن، و ببین چطور دنیای بینهایت پایتون زیر دستانت جان میگیرد!
تمرین های ()for i in range در پایتون
تمرین۱ :شمارش اعداد
علی کودک کنجکاوی است که به تازگی یادگیری اعداد را شروع کرده. او میخواهد از ۱ تا ۵ بشمرد و هر عدد را روی صفحه نمایش چاپ کند تا مهارت شمارش خود را تمرین کند. علی از شما میخواهد برنامهای بنویسید که اعداد ۱ تا ۵ را به ترتیب چاپ کند
for i in range(1, 6):
print(i)
حلقهی for با استفاده از range(1, 6) اعدادی از ۱ تا ۵ تولید میکند (عدد ۶ شامل نمیشود).در هر تکرار حلقه، متغیر i به ترتیب مقدارهای ۱، ۲، ۳، ۴ و ۵ را میگیرد.بدنهی حلقه (print(i)) عدد فعلی i را چاپ میکند.
تمرین ۲: شمارش اعداد از ۱ تا N
علی در حال یادگیری اعداد است. او میخواهد برنامهای داشته باشد که از ۱ شروع کند و اعداد را به ترتیب تا یک عدد مشخص N بشمارد و نمایش دهد. سناریو را اینطور در نظر بگیرید که معلم به علی یک عدد N میدهد و میگوید همه اعداد ۱ تا N را زیر هم بنویس. برنامهای بنویسید که عدد N را از ورودی بگیرد و اعداد 1 تا N را به ترتیب چاپ کند. مثلا اگر N=۱۰ باشد، خروجی باید اعداد ۱ تا ۱۰ را نمایش دهد.
n = int(input("عدد N را وارد کن: "))
for i in range(1, n + 1):
print(i)
برنامه عدد N را از کاربر میگیرد، سپس با حلقه for از عدد 1 تا N شمارش میکند و هر عدد را در یک خط چاپ میکند.تابع range(1, n + 1) اعداد از 1 تا N را تولید میکند (چون range انتهای باز دارد).
تمرین۳: مجموع اعداد فرد برای محاسبه پاداش کارکنان خاص
در شرکتی، فقط کارمندانی با ID فرد (۱، ۳، ۵ و …) مشمول پاداش هستن. مدیر میخواد مجموع همه عددهای فرد بین ۱ تا ۵۰ رو پیدا کند.
sum_odd = 0
for i in range(1, 51, 2): # از ۱ تا ۵۰ با گام ۲ (یعنی فقط عددهای فرد)
sum_odd += i
print("مجموع اعداد فرد بین ۱ تا ۵۰:", sum_odd)
با استفاده از range(1, 51, 2) فقط عددهای فرد بین ۱ تا ۵۰ را دریافت میکنیم.با استفاده از متغیر sum_odd، تمام این عددها را جمع میکنیم.جمع نهایی برابر است با ۶۲۵ که همان مجموع پاداشهایی است که علی باید محاسبه کند.
تمرین ۴: تکرار یک پیام مشخص
فرض کنید علی میخواهد یک جملهٔ روحیهبخش را چندین بار تکرار کند. او عبارتی مانند «موفق میشوی!» را دارد و میخواهد آن را مثلاً ۵ بار پشت سر هم چاپ کند تا به خودش انگیزه بدهد. برنامهای بنویسید که یک جمله و یک عدد دفعات را از ورودی بگیرد و آن جمله را دقیقا به همان تعداد دفعات به خروجی نمایش دهد (هر بار در خط جدید). برای مثال، اگر ورودی جمله “موفق میشوی!” و عدد ۵ باشد، خروجی باید پنج بار این جمله را چاپ کند.
sentence = input("یک جمله روحیهبخش وارد کن: ")
count = int(input("چند بار میخواهی تکرار شود؟ "))
for i in range(count):
print(sentence)
برنامه یک جمله و یک عدد از کاربر میگیرد.با استفاده از حلقه for، جمله را به تعداد عدد وارد شده چاپ میکند.هر بار جمله در یک خط جدید نمایش داده میشود.
تمرین ۵: شمارش معکوس پرتاب موشک
for i in range(10, 0, -1):
print(i)
print("راکت پرتاب شد \a")
حلقهی for i in range(10, 0, -1): مقدار i را از ۱۰ شروع میکند و تا ۱ پایین میآورد. در اینجا:10 مقدار شروع است.0 مقدار پایانی غیرشامل است (بنابراین 1 آخرین مقداری است که میگیریم).-1 گام حرکت است که باعث کاهش یک واحدی در هر تکرار میشود.در هر تکرار حلقه، مقدار فعلی i چاپ میشود. (هر print به طورپیشفرض بعدش خط جدید میآورد، پس هر عدد در خط خودش چاپ خواهد شد.)وقتی حلقه تمام شد (بعد از چاپ 1)، دستور بعد از حلقه print(“راکت پرتاب شد!”) اجرا میشود و پیام پایان شمارش را اعلام میکند.
تمرین ۶:لگوی ستارهای مثلثی
یک فروشگاه کادویی میخواهد طرح کاغذ کادوی خود را به صورت مثلثی از ستارهها طراحی کند. صاحب فروشگاه میگوید طرح باید مثلاً ۵ ردیف داشته باشد که ردیف اول ۱ ستاره، ردیف دوم ۲ ستاره و … ردیف پنجم ۵ ستاره داشته باشد. برنامهای بنویسید که یک عدد n (تعداد ردیفها) را بگیرد و الگوی مثلثی ستارهها را در خروجی چاپ کند. مثلا برای n=5 خروجی باید به صورت زیر باشد:
*
**
***
****
for i in range(1, 6):
print("*" * i)
حلقه for از ۱ تا ۵ اجرا میشود (شامل ۵).در هر تکرار، i تعداد ستارههایی است که باید در آن خط چاپ شوند.“*” ضربدر i یعنی:
بار اول ۱ ستاره،
بار دوم ۲ ستاره،
… تا بار پنجم ۵ ستاره.
تمرین ۶-۱:الگوی ستارهای معکوس
علی پس از ساختن مثلث ستارهای، تصمیم میگیرد آن را به صورت معکوس چاپ کند؛ یعنی در سطر اول N ستاره، سطر دوم N-1 ستاره، و به همین ترتیب تا سطر آخر ۱ ستاره. مثلاً برای N=۵.برنامهای بنویسید که چنین الگوی معکوس ستارهها را برای تعداد دادهشده N چاپ کند.
* * * * *
* * * *
* * *
* *
*
for i in range(5,0,-1):
print("*" * i)
حلقه for از 5 تا ۱ اجرا میشود (شامل ۵).در هر تکرار، i تعداد ستارههایی است که باید در آن خط چاپ شوند.“*” ضربدر i یعنی:
بار اول ۵ ستاره،
بار دوم ۴ ستاره،
… تا بار پنجم ۱ ستاره.
تمرین۷:الگوی اعداد پلهای
علی دوست دارد الگوی عددی زیبایی چاپ کند: در سطر اول تنها عدد ۱، در سطر دوم 1 2، در سطر سوم 1 2 3 و به همین ترتیب تا سطر N که شامل اعداد ۱ تا N باشد. برای مثال اگر N=5 باشد خروجی باید به صورت زیر باشد:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
N = 5
for i in range(1, N+1):
for j in range(1, i+1):
print(j, end=" ")
از یک حلقه تو در تو (nested loop) برای ساخت این الگو استفاده میشود. حلقه بیرونی i از ۱ تا N عمل میکند و نشاندهنده شماره سطر فعلی است. درون هر بار از این حلقه، یک حلقه داخلی j از ۱ تا i اجرا میشود و اعداد ۱ تا i را چاپ میکند. تابع print(j, end=” “) باعث میشود که اعداد در یک خط با فاصله چاپ شوند (بدون شکستن خط). پس از اتمام حلقه داخلی برای هر سطر، یک print() جداگانه فراخوانی شده تا خط بعدی آغاز شود. به این ترتیب: دور اول فقط j=1 چاپ میشود؛ دور دوم j=1,2؛ … و دور Nام 1 2 … N چاپ میشوند. نتیجه دقیقاً مطابق انتظار یک مثلث اعداد پلهای خواهد بود.
تمرین ۸: ترکیب دو الگوی ستارهای (لوزی)
مینا میخواهد یک الگوی چادرمانند از ستارهها چاپ کند؛ ابتدا یک مثلث ستارهای صعودی و سپس یک مثلث نزولی (به جز آخرین سطر مشترک) تا شکل یک لوزی یا الماس تشکیل شود. برای مثال اگر N=۵ باشد، خروجی باید به صورت زیر باشد:
*
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
*
برنامهای بنویسید که این الگو (لوزی توخالی بالاوپایین) را برای N مشخص تولید کند.
N = 5
# مثلث ستارهای صعودی
for i in range(1, N+1):
for j in range(1, i+1):
print("*", end=" ")
print()
# مثلث ستارهای نزولی (یکی کمتر از N برای عدم تکرار راس)
for i in range(N-1, 0, -1):
for j in range(1, i+1):
print("*", end=" ")
print()
بخش اول همان حلقه ساخت مثلث صعودی ستارهای است . بخش دوم از N-1 ستاره در سطر اول شروع میکند و به یک ستاره ختم میشود که یک مثلث نزولی را تشکیل میدهد. دقت کنید که ما N-1 را به عنوان آغاز حلقه نزولی انتخاب کردهایم تا سطر دارای N ستاره دوباره چاپ نشود و الگو در وسط تکراری نباشد. بنابراین رأس لوزی (۵ ستاره در مثال) فقط یکبار چاپ میشود. ترکیب این دو بخش ساختار لوزی مانندی از ستارهها ایجاد میکند. در خروجی مثال (N=5) مشاهده میکنیم ۵ سطر اول افزایشی و ۴ سطر بعدی کاهشی هستند که شکل نهایی را میسازند.
تمرین ۹:چاپ چارچوب مستطیل ستارهای (مستطیل توخالی)
علی میخواهد با ستارهها دور یک مستطیل را رسم کند. طول (عرض) و عرض (ارتفاع) مستطیل را دو مقدار width و height تعیین میکنند. فقط محیط مستطیل با ستارهها کشیده شود و داخل آن خالی باشد. به عنوان نمونه برای width = ۱۰ و height = ۴، خروجی باید اینگونه باشد:
(توجه: فاصلهها داخل مستطیل جهت خالیبودن نشان داده شده است.) برنامهای بنویسید که این مستطیل توخالی از ستارهها را با ابعاد دادهشده چاپ کند.
* * * * * * * * * *
* *
* *
* * * * * * * * * *
برنامهای بنویسید که این الگو (لوزی توخالی بالاوپایین) را برای N مشخص تولید کند.
width = 10
height = 4
for i in range(height):
for j in range(width):
if i == 0 or i == height-1 or j == 0 or j == width-1:
print("*", end=" ")
else:
print(" ", end=" ")
print()
برای ترسیم یک مستطیل توخالی، کافیست ستارهها را در کنارههای چهارگانه رسم کنیم: سطر اول و آخر همگی ستاره، ستون اول و آخر همگی ستاره. سایر مکانها (داخل مستطیل) فضای خالی چاپ میشود. حلقه بیرونی ارتفاع مستطیل (تعداد سطرها) را طی میکند و حلقه داخلی عرض مستطیل (تعداد ستونها) را. شرط if i == 0 or i == height-1 or j == 0 or j == width-1 مشخص میکند که آیا در لبه مستطیل هستیم یا خیر. i == 0 یعنی سطر اول؛ i == height-1 یعنی سطر آخر؛ j == 0 ستون اول؛ j == width-1 ستون آخر. هرگاه در یکی از این موقعیتها باشیم، یک * چاپ میکنیم، وگرنه یک فضای ” ” چاپ میکنیم. پس از اتمام هر سطر، یک print() بدون آرگومان برای رفتن به خط جدید فراخوانی میشود. برای نمونه ذکرشده (۴x۱۰)، حلقه i=0 سطر بالایی ۱۰ ستاره چاپ میکند. i=1 و i=2 حلقه داخلی تنها در j=0 و j=9 ستاره میگذارد و بقیه jها را فضای خالی، لذا دو سطر میانی با ستاره در کنارهها و فضای خالی درون تشکیل میشود. i=3 (height-1) دوباره شرط لبه افقی برقرار است و کل سطر ستاره چاپ میشود. به این صورت قاب مستطیل توخالی ساخته میشود.
تمرین ۱۰: شمارش معکوس
تصور کنید قرار است موشک فضایی پرتاب شود و علی مسئول شمارش معکوس است. برنامهای بنویسید که یک عدد مثبت (مثلاً ۱۰) را به عنوان شروع دریافت کرده و از آن عدد تا صفر را به صورت معکوس نمایش دهد. پس از رسیدن به صفر، مثلاً عبارت “پرتاب!” را چاپ کند. به عنوان نمونه، اگر ورودی ۵ باشد شمارش معکوس باید چنین باشد: ۵، ۴، ۳، ۲، ۱، ۰ و سپس “پرتاب!” در انتها.
n = int(input("عدد شروع شمارش معکوس را وارد کن: "))
for i in range(n, -1, -1):
print(i)
print("پرتاب!")
برنامه یک عدد مثبت از کاربر میگیرد و با استفاده از حلقه for از آن عدد تا صفر را به صورت معکوس چاپ میکند.تابع range(n, -1, -1) از n تا 0 را با گام منفی ۱ میسازد.در پایان، پیام “پرتاب!” نمایش داده میشود.
تمرین ۱۱: محاسبه فاکتوریل
علی در درس ریاضی با مفهوم فاکتوریل (!) آشنا شده است. او میخواهد تعداد آرایشهای مختلف اشیا را با فاکتوریل حساب کند. برنامهای بنویسید که یک عدد طبیعی n را گرفته و فاکتوریل آن (یعنی حاصلضرب ۱ تا n) را محاسبه کند. مثلا فاکتوریل ۵ برابر است با 120 که حاصلضرب 5×4×3×2×1 میباشد. اگر ورودی ۵ باشد، خروجی باید 120 را نمایش دهد.
n = int(input("یک عدد طبیعی وارد کن: "))
factorial = 1
for i in range(1, n + 1):
factorial *= i
print("فاکتوریل", n, "برابر است با:", factorial)
برنامه عددی از کاربر میگیرد و فاکتوریل آن را محاسبه میکند.
فاکتوریل یک عدد n یعنی حاصلضرب همه اعداد از ۱ تا n. مثلاً برای ۵:
5 × 4 × 3 × 2 × 1 = 120در خط اول، عدد ورودی را میگیریم و به عدد صحیح تبدیل میکنیم.
متغیر factorial را با مقدار ۱ مقداردهی اولیه میکنیم تا بتوانیم اعداد را در آن ضرب کنیم.
سپس با حلقه for، از عدد ۱ تا n میرویم و در هر دور، عدد جاری را در factorial ضرب میکنیم.
در پایان، مقدار نهایی factorial چاپ میشود که همان فاکتوریل عدد ورودی است.
تمرین ۱۲: جدول ضرب یک عدد
علی در حال تمرین جدول ضرب است. او میخواهد برنامهای داشته باشد که جدول ضرب یک عدد مشخص را تا ۱۰ مرتبه برایش چاپ کند. برنامه را طوری بنویسید که یک عدد (مثلاً ۷) را از ورودی بگیرد و حاصلضرب آن عدد در اعداد ۱ تا ۱۰ را به شکل منظم چاپ کند. برای نمونه اگر ورودی ۷ باشد، خروجی باید به صورت زیر باشد:
7 × 1 = 7
7 × 2 = 14
...
7 × 10 = 70
num = int(input("عددی برای جدول ضرب وارد کن: "))
for i in range(1, 11):
print(f"{num} × {i} = {num * i}")
برنامه عددی از کاربر میگیرد و با حلقه for از ۱ تا ۱۰، آن عدد را در هر مقدار ضرب میکند.از f-string برای چاپ منظم به صورت عدد × شمارنده = حاصلضرب استفاده شده است.نتیجه جدول ضرب تا ۱۰ نمایش داده میشود.
تمرین ۱۳:جدول ضرب کامل ۱ تا ۱۰
سارا میخواهد برای تمرین ریاضی جدولی تهیه کند که ضربهای اعداد ۱ تا ۱۰ را نشان دهد (جدول ضرب دهدهی کامل). به عبارت دیگر، سطر اول ضربهای ۱ در ۱ تا ۱۰، سطر دوم ضربهای ۲ در ۱ تا ۱۰ و … تا سطر دهم ضربهای ۱۰ در ۱ تا ۱۰ را نمایش دهد. برنامهای بنویسید که این جدول ضرب ۱۰×۱۰ را چاپ کند.
for i in range(1, 11):
print('multiplication table of:', i)
for j in range(1, 11):
print(i * j, end=" ")
print("\n")
از دو حلقه تو در تو استفاده شده است. حلقه بیرونی i از ۱ تا ۱۰ میرود و نقش عدد ردیف (ضربکننده) را دارد. در ابتدای هر دور حلقه بیرونی، عنوان سطر (مثلاً “multiplication table of: 1”) چاپ شده است تا مشخص شود نتایج مربوط به کدام عدد است. حلقه داخلی j نیز از ۱ تا ۱۰ میرود و برای هر i تمامی ضربهای i * j را محاسبه و در یک خط چاپ میکند. پس از پایان حلقه داخلی، دو خط خالی (“\n”) اضافه شده تا جداسازی بهتری بین خطوط جدول صورت گیرد. نتیجه برنامه نمایش کامل جدول ضرب ۱ تا ۱۰ خواهد بود، مثلاً برای i=2 خط مربوط به آن 2 4 6 8 10 12 14 16 18 20 است که حاصلضربهای ۲ در ۱ تا ۱۰ است.
تمرین ۱۴: جمع اعداد ۱ تا N
علی میخواهد بداند جمع کل شکلاتهایی که در N روز جمع کرده چقدر میشود؛ روز اول ۱ شکلات، روز دوم ۲ شکلات، … تا روز Nام N شکلات. برنامهای بنویسید که یک عدد N را بگیرد و مجموع اعداد ۱ تا N را محاسبه کرده و نمایش دهد. به طور مثال اگر کاربر 10 را وارد کند، برنامه باید خروجی 55 را نمایش دهد (چرا که 55 = 10+…+2+1).
n = int(input("تعداد روزها (N) را وارد کن: "))
total = 0
for i in range(1, n + 1):
total += i
print("مجموع شکلاتها:", total)
برنامه عدد N را از کاربر میگیرد و با یک حلقه for ، اعداد ۱ تا N را جمع میکند.متغیر total جمع نهایی را نگه میدارد. در پایان، جمع کل نمایش داده میشود.
تمرین ۱۵ :دریافت چند ورودی و محاسبه میانگین
total_numbers = 5
sum_values = 0
print(total_numbers, "عدد را وارد کنید:")
for i in range(total_numbers):
value = float(input())
sum_values += value
average = sum_values / total_numbers
print("میانگین مقادیر =", average)
برنامه عدد N را از کاربر میگیرد و با یک حلقه for ، اعداد ۱ تا N را جمع میکند.متغیر total جمع نهایی را نگه میدارد. در پایان، جمع کل نمایش داده میشود.
تمرین۱۶:دفترچه ستارهشماری
علی عاشق ستارهشناسی است و میخواهد هر شب ستارههایی که میشمارد را ثبت کند. او تصمیم گرفته به مدت N شب این کار را انجام دهد. هر شب تعداد ستارههای شمردهشده را وارد کرده و در پایان کل ستارههای شمردهشده را ببیند. برنامهای بنویسید که ابتدا تعداد شبها N را بگیرد، سپس برای هر شب تعداد ستارهشمردهشده آن شب را از کاربر دریافت کند، و در انتها مجموع تمامی این ستارهها را نمایش دهد. به طور مثال اگر کاربر اعلام کند ۴ شب ستارهشماری کرده و به ترتیب ۲۰، ۳۵، ۲۵ و ۴۰ ستاره در این شبها دیده، خروجی باید “مجموع ستارههای شمردهشده: 120” را گزارش کند.
n = int(input("تعداد شبهای ستارهشماری را وارد کن: "))
total_stars = 0
for i in range(1, n + 1):
stars = int(input(f"تعداد ستارههای شب {i}: "))
total_stars += stars
print("مجموع ستارههای شمردهشده:", total_stars)
تمرین 1۷:پیگیری آبنوشی هفتگی
علی میخواهد میزان آبی که هر روز از هفته مینوشد را ثبت کرده و در پایان، کل آب مصرفی هفته را حساب کند. برنامهای بنویسید که ۷ مرتبه (برای ۷ روز هفته) از کاربر میزان آب نوشیدهشده در آن روز (مثلاً بر حسب لیتر) را بپرسد و در پایان مجموع این مقادیر را نمایش ده. برای مثال اگر ورودیها به ترتیب 2.5, 3, 2, 2.5, 3, 3.5, 2 لیتر باشند، خروجی باید اعلام کند که مجموعاً 18.5 لیتر آب در هفته نوشیده شده است.
total_water = 0.0
for i in range(1, 8):
water = float(input(f"میزان آب نوشیدهشده در روز {i} (لیتر): "))
total_water += water
print("مجموع آب مصرفی در هفته:", total_water, "لیتر")
این برنامه به علی کمک میکند که میزان کل آب نوشیدهشده در طول هفته را محاسبه کند.متغیر total_water با مقدار ۰.۰ تعریف میشود تا جمع آب مصرفشده را نگه دارد.با استفاده از حلقه for، برنامه ۷ بار تکرار میشود (برای ۷ روز هفته).در هر دور، کاربر مقدار آب نوشیدهشده در آن روز را وارد میکند. چون این مقدار ممکن است اعشاری باشد، از float استفاده شده است.هر مقدار به total_water اضافه میشود.در پایان، مجموع کل آب مصرفی هفته به همراه واحد “لیتر” نمایش داده میشود.
تمرین 1۸: جمع اعداد زوج تا N
برنامهای بنویسید که یک عدد مثبت N را از ورودی گرفته و مجموع همه اعداد زوج از ۱ تا N را محاسبه و چاپ کند. برای مثال اگر N برابر ۱۰ باشد، اعداد زوج بین ۱ تا ۱۰ عبارتاند از ۲، ۴، ۶، ۸، ۱۰ که جمع آنها ۳۰ میشود. برنامه باید چنین نتیجهای را برای ورودی ۱۰ نمایش دهد.
n = int(input("یک عدد مثبت وارد کن: "))
total = 0
for i in range(2, n + 1, 2):
total += i
print("مجموع اعداد زوج تا", n, "برابر است با:", total)
برنامه عدد N را از کاربر میگیرد و با استفاده از حلقه for فقط اعداد زوج (با گام ۲) از ۲ تا N را جمع میکند.در پایان، مجموع اعداد زوج نمایش داده میشود.
تمرین ۱۹:دنباله فیبوناچی(شمارش جمعیت خرگوشها )
دنباله فیبوناچی: دنباله فیبوناچی دنبالهای معروف در ریاضی است که از 0 و 1 شروع میشود و از جملهٔ سوم به بعد هر جمله برابر جمع دو جمله قبلی خود است. این دنباله به صورت … , 0, 1, 1, 2, 3, 5, 8, 13 ادامه دارد. برنامهای بنویسید که یک عدد N بگیرد و نخستین N جملهٔ دنباله فیبوناچی را نمایش دهد. مثلا برای N=10 باید خروجی 0 1 1 2 3 5 8 13 21 34 را تولید کند.
n = int(input("تعداد جملات دنباله فیبوناچی را وارد کن: "))
a, b = 0, 1
for i in range(n):
print(a, end=" ")
a, b = b, a + b
این برنامه دنباله فیبوناچی را تا تعداد مشخصشده توسط کاربر تولید میکند.عدد n از کاربر گرفته میشود که تعیین میکند چند جمله از دنباله تولید شود.دو متغیر a و b را برابر با 0 و 1 میگذاریم (شروع دنباله).با استفاده از حلقه for به تعداد n بار تکرار میکنیم:در هر دور، مقدار فعلی a را چاپمیکنیم.سپس مقدار بعدی فیبوناچی را با a, b = b, a + b بهروزرسانی میکنیم.end=” ” باعث میشود اعداد در یک خط و با فاصله نمایش داده شوند.
تمرین ۲۰ :بزرگترین مقسومعلیه مشترک (GCD)
دو برادر تعداد سیبهایشان را با هم مقایسه میکنند: علی ۸ سیب و رضا ۱۲ سیب دارد. آنها میخواهند سیبها را در بشقابهایی تقسیم کنند طوری که هر بشقاب تعداد برابر سیب از هر کدامشان داشته باشد (و هیچ سیبی نصف نشود!). طبیعی است برای حداکثر کردن تعداد سیب در هر بشقاب باید بزرگترین شمار سیبی را یافت که هم ۸ و هم ۱۲ به آن تقسیم شوند (که در این مثال ۴ است، یعنی در هر بشقاب ۴ سیب از علی و ۴ سیب از رضا قرار میگیرد). این مقدار را بزرگترین مقسومعلیه مشترک یا GCD مینامند. برنامهای بنویسید که دو عدد مثبت را گرفته و GCD آنها را با استفاده از حلقه محاسبه کند.
a = 8
b = 12
gcd = 1
# یافتن مقسومعلیههای مشترک
for i in range(1, min(a, b)+1):
if a % i == 0 and b % i == 0:
gcd = i
print(f"ب.م.م ({a}, {b}) =", gcd)
این الگوریتم ساده، تمام اعداد ۱ تا کوچکترِ دو عدد (۸ و ۱۲ در مثال) را بررسی میکند و در صورت بخشپذیری هر دو عدد بر i، مقدار gcd را برابر i قرار میدهد. در پایان بزرگترین مقداری که این ویژگی را داشته در gcd باقی میماند. برای ۸ و ۱۲، مقسومعلیههای مشترک عبارتاند از ۱، ۲، ۴ و بزرگترینشان ۴ است که نتیجه نمایش داده میشود. (روشهای بهینهتری مثل الگوریتم اقلیدس برای GCD وجود دارد اما این روش ساده با حلقه هم برای اعداد نهچندان بزرگ به خوبی کار میکند.)
تمرین ۲۲:تشخیص عدد اول
علی یک عدد دارد و میخواهد بداند که آیا این عدد اول است یا نه. عدد اول به عددی بزرگتر از ۱ گفته میشود که فقط بر خودش و ۱ بخشپذیر باشد (مثلاً ۲، ۳، ۵، ۷، ۱۱ و … اول هستند). برنامهای بنویسید که یک عدد صحیح مثبت از ورودی گرفته و تعیین کند اول است یا نه و نتیجه را اعلام کند. مثلا ورودی ۱۷ باید خروجی «۱۷ یک عدد اول است.» داشته باشد و ورودی ۱۸ باید اعلام کند «۱۸ اول نیست».
num = int(input("یک عدد وارد کن: "))
if num <= 1:
print(num, "اول نیست.")
else:
is_prime = True
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
is_prime = False
break
if is_prime:
print(num, "یک عدد اول است.")
else:
print(num, "اول نیست.")
در این برنامه از یک حلقه while True بینهایت استفاده شده که تا یافتن شرط دلخواه ادامه مییابد. متغیر lcm را ابتدا برابر بزرگترِ دو عدد قرار میدهیم (چرا که مضرب مشترک نمیتواند از بزرگترین عدد کوچکتر باشد). سپس تا وقتی که lcm بر هر دو عدد بخشپذیر شود حلقه ادامه دارد و در هر دور ۱ واحد به lcm اضافه میشود. به محض رسیدن به یک مقدار که شرط بخشپذیری را داشته باشد، با break از حلقه خارج میشویم. این مقدار همان کوچکترین مضرب مشترک است. برای ۶ و ۸، حلقه از ۸ شروع میکند و مقادیر ۸، ۹،…، 24 را امتحان میکند تا به ۲۴ برسد که شرط lcm % 6 == 0 and lcm % 8 == 0 در موردش True میشود و خروج حاصل میگردد. خروجی برنامه ۲۴ را به عنوان K.M.M (که معادل LCM است) نمایش میدهد.
تمرین ۲۳: تشخیص عدد کامل (Perfect Number)
عدد کامل در ریاضیات به عددی گفته میشود که مجموع مقسومعلیههای مثبتی (غیر از خودش) برابر خود عدد باشد. مثلا ۶ یک عدد کامل است چون مقسومعلیههای مثبتش (به جز خودش) ۱، ۲ و ۳ هستند و $1+2+3=6$. عدد کامل بعدی ۲۸ است ($1+2+4+7+14=28$). برنامهای بنویسید که یک عدد را گرفته و تشخیص دهد آیا کامل است یا خیر.
num = 28 # عدد نمونه
sum_div = 0
for i in range(1, num):
if num % i == 0:
sum_div += i
if sum_div == num and num != 0:
print(num, "عدد کامل است.")
else:
print(num, "عدد کامل نیست.")
در این برنامه از یک حلقه while True بینهایت استفاده شده که تا یافتن شرط دلخواه ادامه مییابد. متغیر lcm را ابتدا برابر بزرگترِ دو عدد قرار میدهیم (چرا که مضرب مشترک نمیتواند از بزرگترین عدد کوچکتر باشد). سپس تا وقتی که lcm بر هر دو عدد بخشپذیر شود حلقه ادامه دارد و در هر دور ۱ واحد به lcm اضافه میشود. به محض رسیدن به یک مقدار که شرط بخشپذیری را داشته باشد، با break از حلقه خارج میشویم. این مقدار همان کوچکترین مضرب مشترک است. برای ۶ و ۸، حلقه از ۸ شروع میکند و مقادیر ۸، ۹،…، 24 را امتحان میکند تا به ۲۴ برسد که شرط lcm % 6 == 0 and lcm % 8 == 0 در موردش True میشود و خروج حاصل میگردد. خروجی برنامه ۲۴ را به عنوان K.M.M (که معادل LCM است) نمایش میدهد.
تمرین ۲۴:فهرست اعداد اول تا N
برنامهای بنویسید که یک عدد N را بگیرد و تمامی اعداد اول کوچکتر یا مساوی N را چاپ کند. برای مثال اگر N=30 باشد باید خروجی شامل اعداد 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 باشد.
n = int(input("یک عدد وارد کن: "))
for num in range(2, n + 1):
is_prime = True
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
is_prime = False
break
if is_prime:
print(num, end=", ")
در این برنامه، تمام اعداد ۱ تا num-1 پیمایش میشوند و هر عددی که مقسومعلیه num باشد به جمع sum_div افزوده میشود. پس از پایان حلقه، اگر مقدار این مجموع برابر خود num باشد، آنگاه num کامل است. توجه داریم که برای عدد ۰ این تعریف صدق نمیکند (بنابراین شرط num != 0 اضافه شده است). برای نمونه num=28: حلقه مقسومعلیههای ۲۸ (۱، ۲، ۴، ۷، ۱۴) را جمع میکند و نتیجه ۲۸ میشود، بنابراین خروجی اعلام میکند که ۲۸ کامل است. اما مثلا اگر num=10 باشد: مقسومعلیههایش ۱,۲,۵ و جمع آنها ۸ است که برابر ۱۰ نیست، پس برنامه تشخیص میدهد ۱۰ کامل نیست. عدد کامل پس از ۲۸ برابر ۴۹۶ است؛ اعداد کامل بسیار اندکاند.
تمرین ۲۵: جدول ضرب ساده
برادر کوچکتر علی در حال یادگیری جدول ضرب است. علی میخواهد با برنامهنویسی به برادرش کمک کند تا یک جدول ضرب مرتب برای اعداد ۱ تا ۵ داشته باشد و به راحتی بتواند پاسخهای صحیح را پیدا کند. برنامهای بنویسید که یک جدول ضرب ۵×۵ (از ۱ تا ۵) را با استفاده از حلقههای تودرتو چاپ کند. هر سطر جدول مربوط به یکی از اعداد ۱ تا ۵ و هر ستون نیز یکی از آنهاست.
n = 5
for i in range(1, n+1):
for j in range(1, n+1):
print(i * j, end=" ")
print() # انتقال به خط بعد پس از پایان هر سطر
- متغیر n مشخصکننده اندازه جدول است (در اینجا ۵).
- حلقهی بیرونی for i in range(1, n+1) برای هر عدد i از ۱ تا ۵ اجرا میشود و مسئول تولید سطرهای جدول است.
- درون آن، یک حلقهی داخلی for j in range(1, n+1) قرار دارد که برای هر i، اعداد j از ۱ تا ۵ را طی میکند و مسئول ستونهای هر سطر است.
- حاصلضرب i * j محاسبه شده و با استفاده از print(…, end=” “) چاپ میشود. پارامتر end=” ” باعث میشود که به انتهای خروجی چاپشده بهجای رفتن به خط بعد، دو فاصله اضافه شود؛ بنابراین اعداد یک سطر در همان خط پشت سر هم ظاهر میشوند.
- پس از اتمام حلقه داخلی (چاپ تمام ستونهای یک سطر)، دستور print() بدون آرگومان اجرا شده که فقط یک خط جدید ایجاد میکند تا چاپ سطر بعدی در خط جدید آغاز شود.
خروجی برنامه یک جدول ۵ ردیف در ۵ ستون است که در هر سطر آن یکی از جدولضربها آمده است. نمای خروجی مانند زیر خواهد بود:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
- هر عدد در سطر i و ستون j در واقع i*j است.
تمرین ۲۶: تولید مثلث پاسکال
مثلث پاسکال یک آرایش مثلثی از اعداد است که هر عدد داخل آن برابر مجموع دو عدد بالای خودش است. ردیف اول آن ۱ است، ردیف دوم 1 1، ردیف سوم 1 2 1، ردیف چهارم 1 3 3 1 و الی آخر. معلمان ریاضی گاهی از دانشآموزان میخواهند چند ردیف اول این مثلث را بنویسند. علی تصمیم دارد برنامهای بنویسد که برای تعداد ردیف دلخواه، مثلث پاسکال را تولید کند. برنامهای بنویسید که یک عدد rows بگیرد و مثلث پاسکال را تا آن تعداد ردیف چاپ کند.
rows = 5
triangle = []
for i in range(rows):
# شروع هر ردیف با 1 های اولیه
row = [1] * (i + 1)
for j in range(1, i):
row[j] = triangle[i-1][j-1] + triangle[i-1][j]
triangle.append(row)
print(row)
متغیر rows تعداد ردیفهایی که میخواهیم از مثلث پاسکال تولید کنیم را مشخص میکند (در این مثال ۵ ردیف).لیست triangle در ابتدا خالی است و قرار است به تدریج ردیفهای محاسبهشده را در خود نگه دارد.حلقهی بیرونی for i in range(rows): برای ساخت هر ردیف از ۰ تا rows-1 (که در مجموع rows بار اجرا میشود) عمل میکند. میتوان i را شماره ردیف فعلی (از ۰ شروع) در نظر گرفت.داخل این حلقه:
ابتدا row = [1] * (i + 1) یک لیست به طول i+1 میسازد که همه عناصر آن ۱ هستند. این کار را برای این میکنیم که میدانیم در مثلث پاسکال، اولین و آخرین عدد هر ردیف همیشه ۱ است. با این کار جایی برای بقیه اعداد ردیف نیز رزرو میشود که بعداً محاسبه میکنیم.
سپس یک حلقه داخلی for j in range(1, i): داریم. این حلقه اندیسهای میانی ردیف را پیمایش میکند (از ۱ تا i-1). برای مثال اگر در ردیف ۵ باشیم (i=4 چون از ۰ شروع کردیم)، j از 1 تا 3 میرود که عناصر میانی آن ردیف را محاسبه کنیم.داخل حلقه داخلی: مقدار هر عنصر میانی row[j] برابر است با جمع دو عنصر بالای آن در ردیف قبل. ردیف قبل در triangle[i-1] قرار دارد (چون ما هر ردیف ساختهشده را به triangle اضافه میکنیم). دو عنصر بالایی عبارتند از triangle[i-1][j-1] و triangle[i-1][j]. این دو را جمع کرده و در row[j] قرار میدهیم.پس از تکمیل حلقه داخلی (که مقادیر میانی را تعیین کرد)، ردیف فعلی کامل شده است.سپس triangle.append(row) این ردیف را به لیست مثلث اضافه میکند تا در محاسبه ردیفهای بعدی استفاده شود.و با print(row) ردیف ساختهشده را چاپ میکنیم.خروجی برنامه برای rows=5، پنج ردیف اول مثلث پاسکال خواهد بود، به صورت:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
هر خط نشاندهندهی یک لیست (ردیف) از اعداد پاسکال است.
(توجه: در عمل میتوان این اعداد را بدون کروشه و ویرگول هم نمایش داد، اما برای سادگی مستقیماً لیست را چاپ می کند.)
حلقه for برای رشته ها در پایتون
تمرین ۱:چاپ عمودی کاراکترهای یک رشته
برنامهای بنویسید که یک رشته را از ورودی دریافت کرده و هر کاراکتر آن رشته را در خط جدید چاپ کند.
text = input("یک رشته وارد کنید: ") # درافت رشته از کاربر
for ch in text:
print(ch)
تمرین۲: محاسبه طول رشته (بدون استفاده از تابع len)
برنامهای بنویسید که یک رشته (مثلاً نام شخص) را از ورودی دریافت کرده و تعداد کاراکترهای آن را محاسبه و چاپ کند. از تابع داخلی len() استفاده نکنید، بلکه خودتان با حلقه شمارش را انجام دهید.
text = input("یک رشته وارد کنید: ")
count = 0
for ch in text:
count += 1 # به ازای هر کاراکتر، شمارنده یک واحد افزایش مییابد
print("طول رشته:", count)
با دریافت رشته از کاربر، متغیر count را روی صفر تنظیم میکنیم. سپس با یک حلقه for روی تمام حروف رشته حرکت کرده و بهازای هر کاراکتر مقدار شمارنده را یکی افزایش میدهیم. در پایان مقدار count که نشاندهندهٔ تعداد کاراکترهای رشته است را چاپ میکنیم. به این ترتیب عملاً عملکرد تابع len را با یک حلقه شبیهسازی کردهایم.
تمرین ۳:شمارش تعداد وقوع یک حرف مشخص در رشته
text = input("یک رشته وارد کنید: ")
char = input("کاراکتری که میخواهید بشمارید را وارد کنید: ")
count = 0
for ch in text:
if ch == char:
count += 1
print(f"تعداد '{char}' در رشته برابر است با {count}")
این برنامه، هم از متن انگلیسی و هم متن فارسی پشتیبانی میکند و حروف صدادار را میشمارد.جملهای از کاربر گرفته میشود و با .lower() به حروف کوچک تبدیل میشود تا حروف بزرگ انگلیسی (مثل A) هم قابل شناسایی باشند.رشتهای به نام vowels تعریف شده که شامل تمام حروف صدادار انگلیسی (aeiou) و فارسی (ا، ی، و) است.با یک حلقه for روی کاراکترهای جمله حرکت میکنیم.اگر کاراکتر فعلی در لیست حروف صدادار باشد، شمارنده count را یکی افزایش میدهیم.در پایان، تعداد کل حروف صدادار را چاپ میکنیم.
تمرین ۴:تغییر حروف کوچک به بزرگ و بالعکس (Toggle Case)
کاربری یک متن وارد کرده که ترکیبی از حروف بزرگ و کوچک است. او میخواهد شکل متن را معکوس کند؛ به این صورت که تمام حروف بزرگ به کوچک و حروف کوچک به بزرگ تبدیل شوند تا متن او با حالت قبلی متفاوت به نظر برسد.
به عنوان مثال، اگر ورودی “Python123” باشد خروجی باید “pYTHON123” نمایش داده شود (اعداد و سایر کاراکترها بدون تغییر باقی بمانند).
text = input("یک رشته وارد کنید: ")
result = ""
for ch in text:
if ch.isupper():
result += ch.lower() # حروف بزرگ به کوچک
elif ch.islower():
result += ch.upper() # حروف کوچک به بزرگ
else:
result += ch # سایر کاراکترها بدون تغییر
print("رشته با حروف معکوس شده:", result)
پس از دریافت رشته از کاربر، یک متغیر result برای ساخت رشتهٔ جدید نتیجه تعریف کردهایم. سپس با یک حلقه روی کاراکترهای ورودی حرکت میکنیم. اگر کاراکتر جاری حرف بزرگ باشد (isupper)، نسخهٔ کوچک آن (lower) را به رشته نتیجه اضافه میکنیم. برعکس، اگر حرف کوچک باشد (islower)، نسخهٔ بزرگ آن (upper) به نتیجه افزوده میشود. سایر کاراکترها (مانند ارقام یا فاصله و …) بدون تغییر مستقیماً افزوده میشوند. در نهایت رشتهٔ حاصل که تمام حروفش معکوس شدهاند، چاپ میشود.
تمرین ۵:محاسبه مجموع ارقام موجود در رشته
نسترن یک رشته شامل اعداد و حروف (مثل یک کد ترکیبی) دارد و میخواهد مجموع ارزش عددی تمام رقمهای موجود در آن رشته را بیابد. به طور مثال اگر رشته “ab12cd3” باشد، مجموع ارقام آن برابر ۶ خواهد بود (۱+۲+۳).
برنامهای بنویسید که یک رشته را از ورودی دریافت کرده و مجموع همه ارقام موجود در رشته را محاسبه کند. سایر کاراکترهایی که رقم نیستند باید نادیده گرفته شوند. نتیجهٔ محاسبه (جمع ارقام) در خروجی نمایش داده شود.
text = input("رشته حاوی عدد و حرف وارد کنید: ")
total = 0
for ch in text:
if ch.isdigit():
total += int(ch) # تبدیل کاراکتر عددی به مقدار عدد و جمع کردن
print("مجموع ارقام موجود در رشته:", total)
برنامه از کاربر یک رشته میگیرد. سپس با یک حلقه for هر کاراکتر را بررسی میکند. اگر کاراکتر رقم باشد isdigit() = True، با استفاده از int(ch) به مقدار عددی متناظر تبدیل شده و به متغیر total افزوده میشود. کاراکترهایی که رقم نیستند، در شرط لحاظ نشده و مجموع را تغییر نمیدهند. در پایان، مقدار total که مجموع تمام ارقام رشته است چاپ میشود. (در مثال “ab12cd3”, ابتدا ۱ و ۲ و سپس ۳ به مجموع اضافه شده و نتیجه ۶ خواهد شد.)
تمرین ۶:تفکیک و شمارش حروف بزرگ و کوچک
برنامهای بنویسید که یک رشته (مثلاً رمز عبور) را از ورودی بگیرد و تعداد حروف بزرگ و حروف کوچک موجود در آن را جداگانه محاسبه کند. برای مثال اگر ورودی “HelloWorld” باشد، خروجی باید اعلام کند ۲ حرف بزرگ و 8 حرف کوچک وجود دارد.
text = input("یک رشته وارد کنید: ")
count_upper = 0
count_lower = 0
for ch in text:
if ch.isupper():
count_upper += 1
elif ch.islower():
count_lower += 1
# نمایش نتیجه
print("تعداد حروف بزرگ:", count_upper)
print("تعداد حروف کوچک:", count_lower)
برنامه از کاربر یک رشته میگیرد. دو متغیر شمارنده برای حروف بزرگ (count_upper) و حروف کوچک (count_lower) تعریف شده است. سپس با یک حلقه for بر روی کاراکترهای رشته پیمایش میکنیم. در هر دور، اگر کاراکتر جاری با متد isupper یک حرف بزرگ تشخیص داده شود، شمارنده حروف بزرگ یک واحد اضافه میشود؛ در غیر این صورت اگر با islower حرف کوچک باشد، شمارنده حروف کوچک افزایش مییابد. در پایان، تعداد نهایی هر دو نوع حرف چاپ میشود. (کاراکترهای غیرحرف نادیده گرفته میشوند چون هیچیک از شرایط بالا را برقرار نمیکنند.)
تمرین ۷:شمارش حروف، ارقام و علامتها در رشته
یک پیام شامل ترکیبی از حروف، ارقام و علامتهای ویژه (مانند #, @, % و …) دریافت شده است. امیر میخواهد بداند در این پیام چه تعداد حرف (الفبا)، چه تعداد رقم و چه تعداد کاراکتر غیر حرف و رقم وجود دارد تا نوع دادههای موجود در پیام را تحلیل کند.
برنامهای بنویسید که یک رشته را از ورودی دریافت کند و تعداد حروف الفبایی، تعداد رقمها و تعداد سایر نمادها (کاراکترهایی که نه حرف هستند و نه رقم) را در آن رشته محاسبه و گزارش کند. به عنوان مثال برای ورودی “P@#yn26at^&i5ve” باید خروجی اعلام کند که ۸ حرف، ۳ رقم و ۴ علامت ویژه موجود است.
text = input("یک رشته شامل حروف، ارقام و نمادها وارد کنید: ")
count_letters = 0
count_digits = 0
count_symbols = 0
for ch in text:
if ch.isalpha():
count_letters += 1
elif ch.isdigit():
count_digits += 1
else:
count_symbols += 1
print("تعداد حروف:", count_letters)
print("تعداد رقمها:", count_digits)
print("تعداد نمادهای دیگر:", count_symbols)
برنامه رشتهای را از ورودی میگیرد که ممکن است شامل حروف، ارقام و کاراکترهای خاص باشد. سه متغیر شمارنده برای حروف (count_letters)، رقمها (count_digits) و سایر نمادها (count_symbols) تعریف شده است. حلقهٔ for هر کاراکتر رشته را بررسی میکند.اگر با متد isalpha حرف بودن آن تأیید شود، شمارنده حروف افزایش مییابد؛ در غیر این صورت اگر isdigit بودنش True باشد، شمارنده رقمها افزایش مییابد. در غیر این دو حالت، کاراکتر جزو نمادهای خاص محسوب شده و شمارنده مربوط به نمادهای غیر حرف و غیر رقم افزایش مییابد. در پایان، تعداد هر دسته کاراکتر چاپ میشود که نشان میدهد چند کاراکتر از نوع حرف، چند تا رقم و چند تا جزو سایر نمادها بودهاند.
تمرین ۸:معکوس کردن رشته (برعکس نوشتن متن)
شخصی میخواهد کلمهای را وارونه کند. به طور مثال اگر نام “Ali” را وارد کند، میخواهد خروجی “ilA” را دریافت کند. این کار میتواند برای ساخت رمزهای معکوس یا بازی با کلمات جالب باشد.برنامهای بنویسید که یک رشته را از ورودی دریافت کرده و با استفاده از حلقه رشته را معکوس کند؛ یعنی کاراکترهای آن را از انتها به ابتدا بازسازی و چاپ کند. توجه کنید که نباید از قابلیتهای آمادهٔ پایتون نظیر برش [:: -1] یا متدهای کمکی استفاده شود، بلکه منحصراً با حلقه این عمل انجام شود.
text = input("یک رشته وارد کنید: ")
reversed_text = ""
for ch in text:
reversed_text = ch + reversed_text
print("رشته معکوس:", reversed_text)
ابتدا رشتهٔ ورودی از کاربر دریافت میشود. سپس یک متغیر رشتهای reversed_text تعریف کردهایم که در شروع خالی است. در هر دور از حلقه for، یک کاراکتر از رشته اصلی (ch) گرفته میشود و به ابتدای رشتهٔ نتیجه اضافه میشود. با این ترفند، ترتیب کاراکترها برعکس میشود. به عنوان مثال اگر ورودی “Ali” باشد: ابتدا “” خالی است، حرف ‘A’ اضافه شده و نتیجه “A” میشود؛ سپس حرف ‘l’ اضافه شده و نتیجه “lA” میشود؛ در پایان حرف ‘i’ اضافه شده و نتیجه “ilA” تشکیل میشود. در نهایت reversed_text که حاوی رشتهٔ معکوسشده است چاپ میگردد.
تمرین ۹:حذف همهی وقوعهای یک کاراکتر مشخص از رشته
سامی یک متن نوشته که در آن بیش از حد از حرف “و” استفاده کرده است. او تصمیم دارد با نوشتن یک برنامه، تمامی حرف “و” اضافی را از متن خود حذف کند.
برنامهای بنویسید که یک رشته و یک کاراکتر از ورودی بگیرد. سپس با استفاده از حلقه تمام وقوعهای آن کاراکتر در رشته را حذف کند. رشته جدید (که خالی از کاراکتر موردنظر است) را چاپ کنید. به عنوان مثال با ورودی “engineering” و کاراکتر ‘e’ باید نتیجه “nginring” حاصل شود (همهٔ ‘e’ها حذف شوند).
text = input("رشته را وارد کنید: ")
char = input("کدام کاراکتر حذف شود؟ ")
result = ""
for ch in text:
if ch != char:
result += ch
print("رشته پس از حذف کاراکتر:", result)
برنامه ابتدا یک رشته و سپس یک کاراکتر هدف را از ورودی میگیرد. سپس با یک حلقه for روی تکتک کاراکترهای رشته پیمایش میکنیم. هر کاراکتری که مساوی کاراکتر مورد حذف نباشد را به رشتهٔ نتیجه (result) اضافه میکنیم و اگر برابر باشد، آن را نادیده میگیریم (در نتیجه اضافه نمیشود). به این ترتیب رشتهٔ خروجی شامل تمام کاراکترهای اصلی به جز کاراکترهای حذفشونده خواهد بود. در پایان، رشتهٔ حاصل چاپ میشود. (مثلاً در مثال “engineering” با حذف ‘e’، رشتهٔ جدید شامل تمام حروف به جز ‘e’ها خواهد بود.)
تمرین ۱۰: حذف تمامی حروف صدادار از یک رشته
یک فیلتر متن برای شبکههای اجتماعی طراحی شده که یکی از کارهای آن، حذف حروف صدادار از پیامهای کاربران است تا متنها به صورت رمزآلودتری نمایش داده شوند. به عنوان نمونه کلمه “computer” بعد از حذف حروف صدادار به “cmptr” تبدیل میشود.
برنامهای بنویسید که یک رشته (کلمه یا جمله انگلیسی) را از ورودی بگیرد و با استفاده از حلقه همهٔ حروف صدادار انگلیسی (a, e, i, o, u و به همین ترتیب حروف بزرگ معادلشان) را از آن رشته حذف کند. خروجی برنامه رشته ورودی بدون این حروف باشد.
text = input("یک کلمه یا جمله انگلیسی وارد کنید: ")
vowels = "aeiouAEIOU"
result = ""
for ch in text:
if ch not in vowels:
result += ch
print("متن پس از حذف واکهها:", result)
رشتهٔ ورودی از کاربر گرفته میشود. یک متغیر vowels شامل تمامی حروف صدادار انگلیسی کوچک و بزرگ تعریف شده است. سپس با یک حلقه for هر کاراکتر متن بررسی میشود؛ اگر کاراکتر جاری در مجموعه حروف صدادار نبود (if ch not in vowels)، آن کاراکتر را به رشته نتیجه اضافه میکنیم. در غیر این صورت، یعنی اگرحروف صدادار باشد، آن را در نتیجه نادیده میگیریم. در پایان، رشتهٔ ذخیرهشده در result که فاقد حروف صدادار است بهعنوان خروجی چاپ میشود.
تمرین ۱۱:حذف کاراکتر واقع در یک موقعیت (index) مشخص
برنامهنویسی میخواهد عملی رشته به تابع backspace را شبیهسازی کند؛ یعنی کاراکتری از رشته را که در مکان مشخصی قرار دارد پاک کند. برای مثال اگر رشته “keyboard” داشته باشیم و بخواهیم کاراکتر واقع در index=3 را حذف کنیم (با در نظر گرفتن ایندکس از ۰)، نتیجه باید “keyoard” باشد (حرف با ایندکس ۳ که ‘b’ بوده حذف شده است).
برنامهای بنویسید که یک رشته و یک عدد ایندکس از ورودی دریافت کند و با استفاده از حلقه، کاراکتر متناظر با آن ایندکس را از رشته حذف کرده و رشته جدید را چاپ کند. در صورتی که ایندکس وارد شده خارج از محدودهٔ رشته باشد، برنامه میتواند پیام مناسبی نمایش دهد یا رشته را بدون تغییر چاپ کند.
text = input("رشته را وارد کنید: ")
idx_str = input("ایندکس کاراکتر مورد نظر برای حذف را وارد کنید: ")
idx = int(idx_str)
result = ""
for i in range(len(text)):
if i != idx:
result += text[i]
print("رشته پس از حذف کاراکتر ایندکس", idx, ":", result)
رشتهٔ ورودی از کاربر گرفته میشود. سپس ایندکس مورد نظر (به صورت رشته) دریافت و با int به عدد تبدیل میشود. با یک حلقه for روی محدودهٔ اندیسهای رشته (range(len(text))) حرکت میکنیم. اگر مقدار اندیس جاری (i) برابر با ایندکس انتخابشده برای حذف نباشد، کاراکتر متناظر با آن اندیس (text[i]) به رشته نتیجه افزوده میشود. در صورتی که i == idx باشد، آن کاراکتر را به نتیجه اضافه نکرده و عملاً حذف میکنیم. پس از پایان حلقه، در متغیر result رشتهٔ اصلی بدون کاراکتر واقع در ایندکس دادهشده ذخیره شده که در خروجی نمایش مییابد.
تمرین ۱۲:جایگزینی یک کاراکتر با کاراکتر دیگر در رشته
مدیر یک سایت میخواهد حرف “a” را در اسامی کاربران با “@” جایگزین کند تا امنیت ایمیلهایشان حفظ شود. مثلاً اگر نام کاربری “sara” است، به صورت “s@r@” نمایش داده شود.
برنامهای بنویسید که یک رشته و دو کاراکتر (نخست کاراکتری که باید جستجو شود و سپس کاراکتری که باید جایگزین گردد) را از ورودی دریافت کند. سپس با حلقه تمامی وقوعهای کاراکتر اول در رشته را به کاراکتر دوم تبدیل نماید و رشته حاصل را چاپ کند. برای مثال اگر ورودی “banana”, کاراکتر هدف ‘a’ و کاراکتر جایگزین ‘*’ باشد، خروجی باید “b*n*n*” حاصل شود.
text = input("رشته را وارد کنید: ")
old_char = input("کاراکتر مورد نظر برای جایگزینی: ")
new_char = input("کاراکتر جایگزین: ")
result = ""
for ch in text:
if ch == old_char:
result += new_char
else:
result += ch
print("رشته پس از جایگزینی:", result)
برنامه یک رشته و دو کاراکتر را از ورودی میگیرد (old_char کاراکتری است که میخواهیم عوض کنیم و new_char کاراکتری است که جایگزین قبلی میشود). سپس با یک حلقه for روی کاراکترهای رشته حرکت میکنیم.اگر کاراکتر جاری برابر کاراکتر هدف برای جایگزینی باشد، به جای آن کاراکتر جایگزین (new_char) را به نتیجه اضافه میکنیم؛ در غیر این صورت خود کاراکتر اصلی را اضافه میکنیم. نتیجه این میشود که تمام وقوعهای کاراکتر مشخصشده در رشته، در خروجی به کاراکتر جدید تبدیل شدهاند و باقی کاراکترها دستنخورده باقی میمانند.
تمرین ۱۲:شمارش تعداد کلمات یک جمله
sentence = input("یک جمله وارد کنید: ")
count_words = 0
in_word = False
for ch in sentence:
if ch != " " and not in_word:
# شروع یک کلمه جدید
count_words += 1
in_word = True
elif ch == " ":
# پایان کلمه جاری
in_word = False
# نمایش تعداد کلمات
print("تعداد کلمات جمله:", count_words)
برنامه یک رشته و دو کاراکتر را از ورودی میگیرد (old_char کاراکتری است که میخواهیم عوض کنیم و new_char کاراکتری است که جایگزین قبلی میشود). سپس با یک حلقه for روی کاراکترهای رشته حرکت میکنیم.اگر کاراکتر جاری برابر کاراکتر هدف برای جایگزینی باشد، به جای آن کاراکتر جایگزین (new_char) را به نتیجه اضافه میکنیم؛ در غیر این صورت خود کاراکتر اصلی را اضافه میکنیم. نتیجه این میشود که تمام وقوعهای کاراکتر مشخصشده در رشته، در خروجی به کاراکتر جدید تبدیل شدهاند و باقی کاراکترها دستنخورده باقی میمانند.
تمرین ۱۳: یافتن بلندترین کلمه در یک جمله
فرض کنید جملهای دارید و میخواهید بدانید طولانیترین کلمهٔ آن کدام است (از نظر تعداد حروف). این کار مثلاً در پردازش متن برای پیدا کردن مهمترین کلمه کاربرد دارد.
برنامهای بنویسید که یک جمله از ورودی دریافت کند و با استفاده از حلقه، بلندترین کلمه ی موجود در آن جمله را پیدا کرده و چاپ کند. اگر چند کلمه با حداکثر طول برابر وجود داشتند، کافیست یکی از آنها (اولین مورد) گزارش شود. برای سادگی فرض کنید کلمات با فاصله از هم جدا میشوند.
sentence = input("یک جمله وارد کنید: ")
max_length = 0
longest_word = ""
current_word = ""
for ch in sentence + " ": # یک فاصله اضافه برای پردازش کلمه آخر
if ch != " ":
current_word += ch
else:
# پایان یک کلمه
if len(current_word) > max_length:
max_length = len(current_word)
longest_word = current_word
current_word = "" # آماده شدن برای کلمه بعدی
print("بلندترین کلمه:", longest_word)
ابتدا جمله را از ورودی میخوانیم. یک متغیر current_word برای ساختن کلمهٔ جاری حرف به حرف بهکار میرود. با یک حلقه روی تمام کاراکترهای جمله حرکت میکنیم. هر کاراکتری که فاصله نباشد به انتهای current_word اضافه میشود، اما زمانی که به یک فاصله میرسیم یعنی یک کلمه به پایان رسیده است. در این لحظه طول کلمهٔ ساختهشده (current_word) را با بزرگترین طول ثبتشده (max_length) مقایسه میکنیم؛ اگر بلندتر بود، longest_word را به این کلمه جدید و max_length را به طول آن بهروزرسانی میکنیم. سپس current_word را خالی میکنیم تا برای دریافت کلمهٔ بعدی آماده شود. توجه کنید که برای سهولت در پردازش کلمهٔ آخر (که بعدش فاصلهای نیست)، ما یک فاصلهٔ اضافه به انتهای رشته در حلقه در نظر گرفتهایم تا منطق پایان کلمه برای آخرین کلمه نیز اجرا شود. در پایان، longest_word که طولانیترین کلمهٔ جمله است چاپ میشود.
تمرین ۱۴:بررسی یکتایی کاراکترهای رشته (آیا همه حروف منحصربهفردند؟)
یک بازی فکری طراحی شده که در آن بازیکن باید کلمهای وارد کند که همهٔ حروف آن متفاوت باشند. برای مثال کلمهٔ “portal” قابل قبول است (چون هیچ حرف تکراری ندارد) اما “apple” قابل قبول نیست (زیرا حرف p تکرار شده). لازم است برنامهای داشته باشیم که چنین شرطی را بررسی کند.
برنامهای بنویسید که یک رشته را از ورودی بگیرد و تعیین کند آیا تمام کاراکترهای آن رشته منحصربهفرد هستند یا خیر. اگر حتی یک کاراکتر تکراری باشد، باید گزارش شود که رشته یکتا نیست. در غیر این صورت اعلام کند که رشته یکتا است.
text = input("یک رشته وارد کنید: ")
seen = set() # مجموعه برای کاراکترهای دیدهشده
is_unique = True
for ch in text:
if ch in seen:
is_unique = False
break
seen.add(ch)
if is_unique:
print("تمام کاراکترهای رشته یکتا هستند (بدون تکرار).")
else:
print("در این رشته کاراکتر تکراری وجود دارد.")
این برنامه از یک مجموعه (set) برای نگهداری حروفی که تاکنون دیده شده استفاده میکند. رشته از کاربر گرفته میشود و سپس با یک حلقه for روی کاراکترهای آن پیمایش میکنیم. اگر کاراکتر جاری قبلاً در مجموعه seen وجود داشته باشد، به این معنی است که تکراری است؛ در این صورت متغیر فلگ is_unique را False کرده و با break از حلقه خارج میشویم (دیگر نیاز به ادامهٔ بررسی نیست). اگر کاراکتر تاکنون دیده نشده بود، آن را به مجموعه اضافه میکنیم و ادامه میدهیم. در پایان با توجه به مقدار is_unique خروجی مناسب را چاپ میکنیم. (اگر مجموعه هیچ کاراکتر تکراری نیافته باشد، is_unique True باقی میماند.)
تمرین ۱۵:palindorm
یک کلمه palindrome (پالیندروم) به واژهای گفته میشود که اگر حروف آن را برعکس کنیم خود کلمه به دست آید (مثل “level” در انگلیسی یا “باب” در فارسی). علی کلمهای دارد و میخواهد بداند آیا از دو سمت یکسان خوانده میشود یا نه. برنامهای بنویسید که یک رشته (کلمه) را از ورودی دریافت کرده و بررسی کند آیا پالیندروم است یا خیر. اگر هست پیام مناسبی چاپ کند و اگر نیست اعلام کند که کلمه از چپ و راست یکسان خوانده نمیشود. به عنوان مثال برای ورودی “radar” باید اعلام شود این کلمه پالیندروم است (چون «رادار» از هر دو سمت یکسان است). (حروف بزرگ/کوچک را نادیده بگیرید و فقط معیار شکل حروف باشد).
word = input("یک کلمه وارد کن: ").lower()
is_palindrome = True
for i in range(len(word) // 2):
if word[i] != word[-(i + 1)]:
is_palindrome = False
break
if is_palindrome:
print("این کلمه پالیندروم است.")
else:
print("این کلمه از چپ و راست یکسان خوانده نمیشود.")
این برنامه از کاربر میخواهد یک کلمه وارد کند. سپس تمام حروف آن را به حروف کوچک تبدیل میکند تا تفاوتی بین حروف بزرگ و کوچک وجود نداشته باشد. در مرحله بعد، برنامه بررسی میکند که آیا این کلمه از دو سمت (چپ به راست و راست به چپ) یکسان خوانده میشود یا نه.برای این کار، تنها نصف اول کلمه با نصف دوم آن (به صورت معکوس) مقایسه میشود. اگر همه حروف متناظر با هم برابر باشند، نتیجه میگیرد که کلمه پالیندروم است. در غیر این صورت، اعلام میکند که این کلمه پالیندروم نیست و از دو سمت یکسان خوانده نمیشود.مثلاً اگر کاربر کلمه “Radar” را وارد کند، چون از دو طرف یکسان خوانده میشود (با صرف نظر از بزرگی و کوچکی حروف)، برنامه پیام مثبت نمایش میدهد. اما اگر کلمهای مثل “Python” وارد شود، برنامه متوجه میشود که حروف متناظر برابر نیستند و پیام منفی چاپ میکند.
تمرین ۱۶:یافتن اولین کاراکتر تکراری در رشته
فرض کنید در یک رشته، میخواهیم اولین کاراکتری را پیدا کنیم که بیشتر از یک بار ظاهر شده است. مثلا در کلمه “اردک” هیچ حرفی تکراری نیست، اما در “برنامه” حرف “ر” دو بار آمده و اولین حرف تکراری محسوب میشود. این میتواند برای خطایابی یا تحلیل متن مفید باشد.
برنامهای بنویسید که یک رشته را از ورودی بگیرد و با استفاده از حلقه اولین کاراکتری را که تکرار شده (دوبار یا بیشتر ظاهر شده) پیدا کند و نمایش دهد. اگر هیچ کاراکتری تکراری نبود، پیغام مناسبی چاپ کند (مثلا اعلام کند کاراکتر تکراری وجود ندارد).
text = input("یک رشته وارد کنید: ")
seen = set()
first_repeat = None
for ch in text:
if ch in seen:
first_repeat = ch
break
seen.add(ch)
if first_repeat:
print("اولین کاراکتر تکراری:", first_repeat)
else:
print("هیچ کاراکتر تکراری یافت نشد.")
در این برنامه رشته ورودی را کاراکتر به کاراکتر پیمایش میکنیم؛ اگر کاراکتر جاری قبلاً در مجموعه وجود داشت، به این معنی است که تکراری است و چون به ترتیب جلو میرویم، این اولین تکراری خواهد بود. در این حالت آن را در متغیر first_repeat ذخیره کرده و با break از حلقه خارج میشویم. اگر کاراکتر در مجموعه نبود، آن را به مجموعه اضافه میکنیم و حلقه ادامه مییابد. پس از حلقه، اگر first_repeat مقداری داشته باشد (ناتهی باشد) آن کاراکتر تکراری را چاپ میکنیم. در غیر این صورت پیغام میدهیم که هیچ کاراکتر تکراری یافت نشد. (در مثال “برنامه”، حلقه ترتیباً حروف ‘ب’, ‘ر’, ‘ن’, ‘ا’ را میبیند، دوباره به ‘م’ و ‘ه’ میرسد و مشکلی نیست، ولی وقتی مجدداً ‘ر’ را ببیند، متوجه تکراری بودن شده و آن را گزارش میکند.)
تمرین ۱۷:شمارش فراوانی (تعداد) هر کاراکتر در یک رشته
مدیر یک سیستم لاگین میخواهد آماری از حروف استفادهشده در رمزهای عبور کاربران داشته باشد. برای این کار نیاز است تعداد تکرار هر کاراکتر در یک رشته (مثلاً رمز عبور) مشخص شود. به عنوان نمونه، در رشته “google.com”, توزیع کاراکترها به صورت زیر است:
{‘g’: 2, ‘o’: 3, ‘l’: 1, ‘e’: 1, ‘.’: 1, ‘c’: 1, ‘m’: 1}
که نشان میدهد مثلاً کاراکتر ‘o’ سه بار و کاراکترهای ‘l’, ‘e’, ‘c’, ‘m’, ‘.’ هر کدام یک بار آمدهاند.
برنامهای بنویسید که یک رشته را از ورودی دریافت کند و با استفاده از حلقه، فراوانی وقوع هر کاراکتر در آن رشته را محاسبه کرده و به شکل مناسبی نمایش دهد (مثلاً با چاپ یک دیکشنری پایتون که کلید آن کاراکتر و مقدار آن تعداد تکرار است).
text = input("یک رشته وارد کنید: ")
freq = {}
for ch in text:
if ch in freq:
freq[ch] += 1
else:
freq[ch] = 1
print("فراوانی کاراکترها:", freq)
برنامه رشته ورودی را دریافت میکند. یک دیکشنری freq برای نگهداری فراوانی کاراکترها در نظر گرفته شده که در ابتدا خالی است. با یک حلقه for روی کاراکترهای رشته حرکت میکنیم. در هر گام، اگر کاراکتر قبلاً بهعنوان کلید در دیکشنری وجود داشت، مقدار مربوط به آن را یک واحد افزایش میدهیم؛ در غیر این صورت (اولین باری است که این حرف را میبینیم)، یک ورودی جدید در دیکشنری ایجاد کرده و مقدار آن را ۱ قرار میدهیم. در انتها دیکشنری freq شامل همهٔ کاراکترهای رشته به همراه تعداد تکرار هر کدام است که چاپ میشود. (ساختار خروجی شبیه مثال بالا خواهد بود).
تمرین ۱۸:حذف کاراکترهای تکراری متوالی (فشردهسازی رشته)
یک سیستم فشردهسازی ساده میتواند کاراکترهای تکراری پشتسرهم را حذف کند تا رشته کوتاهتر شود. برای مثال رشته “aaabbbcdd” را در نظر بگیرید؛ اگر کاراکترهای تکراری متوالی را تنها یکبار بنویسیم، نتیجه “abcd” خواهد بود که کوتاهتر است.برنامهای بنویسید که یک رشته را از ورودی دریافت کند و با استفاده از حلقه، تمام کاراکترهای تکرارشوندهٔ متوالی آن را به یک کاراکتر واحد تقلیل دهد. به عبارتی دیگر، اگر چندین حرف یکسان پشت سر هم آمدهاند، در خروجی تنها یک مورد از آن حرف نمایش داده شود. خروجی رشتهٔ فشردهشده (از نظر تکرار متوالی) باشد.
text = input("یک رشته وارد کنید: ")
if not text:
print("") # اگر رشته خالی بود، خروجی خالی است
else:
compressed = text[0] # اولین کاراکتر را اضافه میکنیم
for i in range(1, len(text)):
if text[i] != text[i-1]:
compressed += text[i]
print("رشته پس از حذف تکرارهای متوالی:", compressed)
ابتدا رشته از کاربر گرفته میشود. اگر رشته خالی باشد، مستقیماً خروجی خالی چاپ میکنیم. در غیر این صورت، فرایند فشردهسازی را آغاز میکنیم: متغیر compressed را با اولین کاراکتر رشته مقداردهی میکنیم (چون همیشه اولین کاراکتر را نگه میداریم). سپس در یک حلقه از اندیس ۱ تا انتهای رشته پیمایش میکنیم. در هر گام اگر کاراکتر فعلی (text[i]) با کاراکتر قبلی (text[i-1]) متفاوت بود، به این معنی است که زنجیرهٔ تکرار شکسته شده و کاراکتر جدیدی ظاهر شده که باید به نتیجه اضافه شود. اگر کاراکتر فعلی با قبلی یکسان باشد، هیچ کاری نمیکنیم (آن را رد میکنیم تا از تکرار متوالی اجتناب کنیم). در پایان، رشته compressed که اکنون حروف تکراری متوالی را حذف کرده، بهعنوان خروجی چاپ میشود. (مثلاً برای “aaabbbcdd”، ابتدا compressed = “a”, سپس حلقه کاراکتر دوم و سوم که ‘a’ هستند را اضافه نمیکند، وقتی به ‘b’ میرسد چون متفاوت از قبلی است اضافه میکند، همینطور ‘c’ بعد از ‘b’ و ‘d’ بعد از ‘c’ اضافه میشوند و خروجی “abcd” به دست میآید.)
تمرین ۱۹:بررسی اینکه آیا دو رشته آناگرام هستند
دو کلمه مانند “listen” و “silent” را در نظر بگیرید. این دو کلمه از همان حروف تشکیل شدهاند (فقط ترتیبشان فرق دارد) و به چنین جفتکلماتی در زبان انگلیسی anagram گفته میشود. اکنون فرض کنید میخواهیم یک بازی کلمهای طراحی کنیم که در آن کاربر دو رشته وارد کند و برنامه تشخیص دهد آیا این دو شامل حروف یکسانی هستند یا خیر.
برنامهای بنویسید که دو رشته را از ورودی دریافت کرده و با استفاده از حلقه یا هر روش ممکن (بدون توابع آماده مرتبسازی)، تعیین کند آیا این دو رشته آناگرام یکدیگر هستند یا خیر. اگر بله، مثلاً چاپ کند “آناگرام هستند” در غیر این صورت “آناگرام نیستند”. (دو رشته زمانی آناگرام محسوب میشوند که حروف یکسان با تعداد یکسان داشته باشند، صرفنظر از ترتیب قرارگیری.)
s1 = input("رشته اول: ")
s2 = input("رشته دوم: ")
# اگر طول متفاوت باشد نیازی به ادامه نیست
if len(s1) != len(s2):
print("آناگرام نیستند.")
else:
# شمارش حروف رشته اول
freq = {}
for ch in s1:
freq[ch] = freq.get(ch, 0) + 1
# کاهش شمارش براساس حروف رشته دوم
is_anagram = True
for ch in s2:
if ch not in freq or freq[ch] == 0:
is_anagram = False
break
else:
freq[ch] -= 1
if is_anagram:
print("دو رشته آناگرام هستند.")
else:
print("آناگرام نیستند.")
ابتدا دو رشته از ورودی گرفته میشود. اگر طول دو رشته برابر نباشد، مستقیم اعلام میکنیم که آناگرام نیستند (زیرا تعداد حروف متفاوت است). در غیر این صورت، ابتدا با یک حلقه تمام حروف رشتهٔ اول (s1) را میشماریم و در دیکشنری freq ذخیره میکنیم (کلید کاراکتر و مقدار تعداد دفعات). سپس با یک حلقه روی حروف رشتهٔ دوم (s2) میگردیم و سعی میکنیم همان تعداد حروف را از دیکشنری کم کنیم: اگر کاراکتری در s2 وجود داشت که یا در دیکشنری نبود (در رشته اول نبود) یا تعداد دفعاتش تمام شده بود، یعنی رشته دوم حرفی دارد که در اولی نیست یا بیش از دفعات موجود در اولی تکرار شده است، پس آناگرام نیستند. اگر بدون مشکل تمام حروف s2 را تطبیق دادیم، نتیجه میگیریم که دو رشته آنگراماند، چون عملاً هر دو مجموعه حروف یکسانی داشتهاند. در پایان بر اساس فلگ is_anagram پیام مناسب چاپ میشود.
تمرین۲۰: جستجوی دستی زیررشته در یک رشته (یافتن اولین وقوع)
تصور کنید تابع پایتون find() وجود نداشت و میخواستیم خودمان بررسی کنیم که آیا یک رشته کوچک در یک رشته بزرگتر وجود دارد یا نه. مثلاً میخواهیم بدانیم آیا “ali” در “salam ali” ظاهر شده است و اگر بله اولین موقعیت شروع آن کجاست. این کار در پردازش متن و جستجو کاربرد فراوان دارد.برنامهای بنویسید که دو رشته از ورودی دریافت کند. رشتهٔ اصلی و رشتهٔ هدف (زیررشته). سپس با استفاده از حلقههای تو در تو (یا روش مناسب دیگر) بررسی کند که آیا رشتهٔ هدف در رشتهٔ اصلی وجود دارد یا خیر. اگر وجود داشت، ایندکس اولین وقوع آن را در رشتهٔ اصلی چاپ کند (ایندکس از ۰ محاسبه شود). در غیر این صورت عدد -1 را چاپ نماید تا نشان دهد پیدا نشده است.
text = input("رشته اصلی: ")
pattern = input("زیررشته مورد جستجو: ")
index = -1
for i in range(len(text) - len(pattern) + 1):
match = True
for j in range(len(pattern)):
if text[i+j] != pattern[j]:
match = False
break
if match:
index = i
break
print("ایندکس اولین وقوع:", index)
رشتهٔ اصلی (text) و زیررشتهٔ مورد نظر (pattern) از ورودی خوانده میشود. متغیر index برای نگهداری جواب در نظر گرفته شده و ابتدا -1 (به معنی “نیافتن”) مقداردهی شده است. سپس یک حلقه for با اندیس i روی همهٔ مکانهای ممکن آغاز زیررشته در رشته اصلی حرکت میکند (از ۰ تا طول text منهای طول pattern). برای هر موقعیت i، فرض میکنیم تطابق برقرار است (match = True) و با یک حلقه داخلی حروف pattern را یکبهیک با حروف متن اصلی تطبیق میدهیم. اگر در هر نقطهای کاراکترها متفاوت بودند، match = False شده و از حلقه داخلی خارج میشویم. اگر حلقه داخلی بدون شکست تمام شود (یعنی همه حروف pattern با بخشی از text تطابق داشتند)، آنگاه یک تطابق کامل یافتهایم و متغیر index را برابر i (محل شروع تطابق) قرار داده و با break از حلقهٔ بیرونی خارج میشویم چون اولین وقوع را پیدا کردهایم. در پایان، متغیر index را چاپ میکنیم که اگر زیررشته پیدا شده باشد حاوی ایندکس شروع آن است و اگر همچنان -1 باشد نشاندهنده عدم وجود الگو در متن است. (این شیوه در حقیقت شبیه الگوریتم جستجوی زیررشته به روش نیروی brute-force است).
تمرین ۲۱:چاپ رشته به صورت پلهای (افزودن تدریجی حروف)
یک بازی حدس کلمه تصمیم دارد برای راهنمایی کاربر، حروف کلمهٔ مورد نظر را بهتدریج فاش کند. در اولین مرحله فقط حرف اول کلمه نشان داده میشود، در مرحله بعد دو حرف اول، و همینطور تا مرحله آخر که کل کلمه نمایش داده میشود. برای نمونه اگر کلمه “PYTHON” باشد، مراحل نمایش میتواند اینگونه باشد:
P
PY
PYT
PYTH
PYTHO
PYTHON
برنامهای بنویسید که یک رشته را از ورودی دریافت کرده و آن را به شکل بالا در چند خط چاپ کند: سطر اول حاوی اولین حرف، سطر دوم حاوی دو حرف اول، …, سطر آخر حاوی کل رشته. برای این کار از حلقهها کمک بگیرید.
text = input("یک کلمه وارد کنید: ")
for i in range(1, len(text) + 1):
print(text[:i])
برنامه از کاربر یک رشته (مثلاً یک کلمه) میگیرد. سپس با یک حلقه for مقدار متغیر i را از ۱ تا طول رشته (len(text)) افزایش میدهد. در هر تکرار، از ابتدای رشته به اندازه i کاراکتر برمیداریم و چاپ میکنیم. این کار با استفاده از slice text[:i] انجام شده است که اولین i حرف رشته را برمیگرداند. بنابراین در دور اول i=1 فقط اولین حرف چاپ میشود، در دور دوم i=2 دو حرف اول، و همینطور ادامه پیدا میکند تا در دور آخر که i=len(text) است کل رشته چاپ شود. خروجی مطابق خواسته به صورت پلهای خواهد بود. (در صورت تمایل میتوانستیم همین کار را با یک حلقه تودرتو هم انجام دهیم اما استفاده از قابلیت برش رشته کد را سادهتر کرده است.)
تمرین ۲۲:حرف اول هر کلمه را بزرگ کردن (Title Case به صورت دستی)
در یک فرم آنلاین، کاربران نام و نامخانوادگی خود را وارد میکنند اما ممکن است همهٔ حروف را کوچک نوشته باشند. مدیر سیستم میخواهد مطمئن شود حرف اول هر کلمهٔ نام و نامخانوادگی بزرگ است (مثلاً “ali reza” به “Ali Reza” تبدیل شود) تا خروجی زیباتر به نظر برسد.
هدف: برنامهای بنویسید که یک جمله (مثلاً حاوی نام و نامخانوادگی یا هر عبارت چند کلمهای) را از ورودی دریافت کند و با استفاده از حلقه، کاری کند که حرف اول هر کلمه بزرگ و بقیه حروف آن کلمه کوچک باشند. سایر حروف کلمات اگر بزرگ بودند کوچک شوند. به طور خلاصه، رشته را به حالت Title Case (حرف اول کلمات بزرگ و مابقی کوچک) تبدیل کنید.
sentence = input("یک جمله وارد کنید: ")
result = ""
capitalize_next = True
for ch in sentence:
if ch == " ":
result += ch
capitalize_next = True
else:
if capitalize_next:
result += ch.upper()
capitalize_next = False
else:
result += ch.lower()
print("جمله به Title Case:", result)
جمله از ورودی خوانده میشود. متغیر بولین capitalize_next مشخص میکند که آیا کاراکتر بعدی باید به صورت بزرگ نوشته شود یا نه. ابتدا True است چون اولین حرف جمله باید بزرگ شود. سپس با یک حلقه بر روی هر کاراکتر جمله پیمایش میکنیم. اگر کاراکتر فاصله باشد آن را به نتیجه اضافه میکنیم و پرچم capitalize_next را True میکنیم تا نشان دهد اولین حرف کلمهٔ بعدی باید بزرگ شود. اگر کاراکتر فاصله نبود (یعنی بخشی از یک کلمه است)، آنگاه بررسی میکنیم: اگر capitalize_next True بود، یعنی این کاراکتر اولین حرف یک کلمه جدید است و باید به بزرگ تبدیل شود (upper())، سپس پرچم را False میکنیم زیرا بقیه حروف این کلمه نباید بزرگ شوند. اگر capitalize_next False بود، یعنی در وسط یا انتهای کلمه فعلی هستیم و این حرف را به صورت کوچک (lower()) اضافه میکنیم. در نهایت رشتهٔ ساختهشده در result چاپ میشود که حرف اول هر کلمه بزرگ و باقی حروف کوچک هستند. (مثلاً “ali reZA” تبدیل به “Ali Reza” میشود.)
تمرین۲۳:شمارش تعداد تکرار هر کلمه در جمله
در یک متن ممکن است برخی کلمات تکرار شوند. مثلاً در جملهٔ “کتاب خوب است چون کتاب به ما دانش میدهد”, کلمهٔ “کتاب” دو بار آمده است. تحلیلگران متن میخواهند آماری از فراوانی هر کلمه در متن داشته باشند.
هدف: برنامهای بنویسید که یک جمله را از ورودی دریافت کند و با استفاده از حلقه، تعداد تکرار هر کلمه را در آن جمله بشمارد و نتیجه را به شکل دیکشنری یا لیستی از کلمات و تعدادشان نمایش دهد. برای سادهتر شدن، میتوانید فرض کنید کلمات فقط با فاصله از هم جدا میشوند و علائم سجاوندی نداریم. مثلاً برای ورودی “this is a test this is only a test”, خروجی باید نشان دهد کلمهٔ “this” دو بار، “is” دو بار، “a” دو بار، “test” دو بار و “only” یک بار آمدهاند.
sentence = input("یک جمله وارد کنید: ")
words = sentence.split() # جدا کردن کلمات بر اساس فاصله
freq = {}
for w in words:
freq[w] = freq.get(w, 0) + 1
print("تعداد تکرار کلمات:", freq)
برنامه جملهای را از ورودی میگیرد. با استفاده از تابع کمکی split() کلمات جمله را بر اساس فاصله استخراج کرده و در لیست words قرار میدهیم. سپس یک دیکشنری freq ایجاد میکنیم و با یک حلقه for روی کلمات این لیست پیمایش میکنیم. برای هر کلمه w، اگر قبلاً در دیکشنری دیده شده باشد مقدار قبلی را یک واحد افزایش میدهیم و اگر اولین بار است مقدار اولیه ۱ را قرار میدهیم. این کار را با متد get برای اختصار انجام دادهایم (اگر کلید موجود نباشد پیشفرض ۰ برمیگرداند). در پایان دیکشنری freq شامل هر کلمه و تعداد دفعات تکرار آن در جمله است که چاپ میشود. (برای جمله مثال: خروجی شبیه {‘this’: 2, ‘is’: 2, ‘a’: 2, ‘test’: 2, ‘only’: 1} خواهد بود که نشان میدهد هر کلمه چند بار آمده است.)
حلقهfor برای لیست ها در پایتون
سوال ۱: دعوتنامهٔ تولد
فرض کنید میخواهید برای چند نفر از دوستانتان کارت دعوت تولد بفرستید. یک لیست شامل نام دوستان صمیمی خود (مثلاً ۵ نام مختلف) تهیه کنید و با استفاده از حلقهٔ for برای هر دوست یک پیام دعوت به شکل زیر چاپ کنید. به عنوان مثال اگر لیست دوستان شامل “علی” باشد، پیام باید شامل نام او نیز باشد.
friends = ["علی", "رضا", "مریم", "سارا", "شایان"]
for name in friends:
print(f"سلام {name}! به جشن تولد من دعوت هستی.")
در این برنامه، ابتدا یک لیست حاوی نام دوستان تعریف شده است. سپس با یک حلقهٔ for روی لیست تکرار میکنیم؛ متغیر name در هر دور حلقه یکی از اسامی دوستان را میگیرد. داخل حلقه، با دستور print یک پیام شامل نام آن دوست چاپ میشود (مثلاً «سلام علی! به جشن تولد من دعوت هستی.»). به این ترتیب برای هر اسم موجود در لیست یک پیام دعوت منحصربهفرد چاپ خواهد شد.
سوال ۲: شمارش سیبها در سبدها
فرض کنید ۵ سبد سیب دارید که هر کدام شامل تعداد معینی سیب است. تعداد سیبهای هر سبد را در یک لیست (مثلاً [5, 8, 3, 10, 7]) ذخیره کردهاید. برنامهای بنویسید که جمع کل سیبها را محاسبه کرده و در پایان تعداد کل سیبها را نمایش دهد.
baskets = [5, 8, 3, 10, 7]
total_apples = 0
for apples in baskets:
total_apples += apples
print(f"مجموع سیبها: {total_apples}")
در این برنامه لیست به نام baskets تعریف شده که هر عنصر آن تعداد سیبهای یک سبد را نشان میدهد. با مقداردهی اولیه متغیر total_apples به صفر، یک حلقهٔ for روی لیست اجرا میکنیم و در هر تکرار تعداد سیبهای آن سبد (apples) را به متغیر total_apples اضافه میکنیم. در پایان، مقدار total_apples که برابر مجموع تمام سیبها است چاپ میشود. (این همان حل مسئلهی جمع عناصر لیست با حلقهٔ for است، بدون استفاده از تابع آمادهی sum.)
سوال ۳: تقسیم آبنبات بین کودکان
فرض کنید ۱۵ آبنبات دارید و میخواهید آنها را به طور مساوی بین ۳ کودک تقسیم کنید. با استفاده از یک حلقهٔ for چاپ کنید که به هر کودک چند آبنبات میرسد. شمارهٔ کودک (از ۱ تا ۳) و تعداد آبنباتهای سهم او را در خروجی نمایش دهید.
total_candies = 15
children = 3
candies_per_child = total_candies // children # تقسیم مساوی
for child in range(1, children + 1):
print(f"کودک {child}: {candies_per_child} آبنبات")
ابتدا تعداد کل آبنباتها (total_candies) و تعداد کودکان (children) مشخص شده است. با استفاده از تقسیم صحیح (//) تعداد آبنبات مساوی برای هر کودک محاسبه و در candies_per_child ذخیره شده است. سپس حلقهای از ۱ تا تعداد کودکان اجرا کردهایم (range(1, children+1)) و در هر دور، شماره کودک و تعداد آبنباتهایش را چاپ میکنیم. خروجی برنامه نشان میدهد که هر کودک ۵ آبنبات میگیرد (زیرا ۱۵ آبنبات بین ۳ کودک مساوی تقسیم شده است).
سوال ۴: اعداد جادویی (اولین مضارب یک عدد)
برنامهای بنویسید که از کاربر یک عدد صحیح دریافت کند و سپس با حلقهٔ for پنج مضرب اول آن عدد را محاسبه کرده و نمایش دهد. به طور مثال اگر کاربر عدد ۳ را وارد کند، خروجی باید مانند زیر باشد:
اولین 5 مضرب عدد 3 عبارتاند از:
3, 6, 9, 12, 15
n = int(input("یک عدد وارد کنید: "))
print(f"اولین 5 مضرب عدد {n} عبارتاند از:")
for i in range(1, 6):
print(n * i, end=", ")
با دستور input یک عدد از کاربر گرفته و به نوع عدد صحیح (int) تبدیل میشود (مثلاً ۳). سپس پیغامی جهت اعلام مضارب چاپ میشود. با استفاده از حلقه for و تابع range(1, 6) پنج مقدار ۱ تا ۵ را تولید کرده و در هر تکرار مضرب مربوطه (حاصلضرب n در آن مقدار) را محاسبه میکنیم. خروجی برنامه پنج مضرب نخست عدد ورودی را نمایش میدهد. (در اینجا از تابع range استفاده شده که خودش یک دنباله از اعداد ۱ تا ۵ تولید میکند و هر بار در حلقه مقدار جدیدی میدهد.)
سوال ۵: گنجینههای سکه
تصور کنید ۴ صندوق گنج دارید که هر کدام حاوی تعدادی سکه طلا است. تعداد سکههای هر صندوق در قالب یک لیست داده شده است (برای مثال [50, 120, 90, 30]). برنامهای بنویسید که برای هر صندوق یک خط به صورت زیر چاپ کند:
صندوق شماره X حاوی Y سکه است.که در آن X شمارهٔ صندوق (از ۱ تا ۴) و Y تعداد سکههای داخل آن است.
treasure_chests = [50, 120, 90, 30]
for idx, coins in enumerate(treasure_chests, start=1):
print(f"صندوق شماره {idx}: {coins} سکه")
با دستور input یک عدد از کاربر گرفته و به نوع عدد صحیح (int) تبدیل میشود (مثلاً ۳). سپس پیغامی جهت اعلام مضارب چاپ میشود. با استفاده از حلقه for و تابع range(1, 6) پنج مقدار ۱ تا ۵ را تولید کرده و در هر تکرار مضرب مربوطه (حاصلضرب n در آن مقدار) را محاسبه میکنیم. خروجی برنامه پنج مضرب نخست عدد ورودی را نمایش میدهد. (در اینجا از تابع range استفاده شده که خودش یک دنباله از اعداد ۱ تا ۵ تولید میکند و هر بار در حلقه مقدار جدیدی میدهد.)
سوال ۶: بازی حدس عدد
فرض کنید یک عدد راز در بازی درنظر گرفته شده و کاربر چندین حدس خود را در قالب یک لیست وارد کرده است. به طور مثال عدد راز 7 است و لیست حدسیات کاربر برابر [3, 5, 7, 9, 11] میباشد. برنامهای بنویسید که روی لیست حدسها حرکت کند و برای هر عدد حدس، پیام مناسبی چاپ کند: اگر حدس درست بود، پیام “درست است!” و در غیر این صورت پیام “نادرست، دوباره امتحان کن.” نمایش داده شود.
secret_number = 7
guesses = [3, 5, 7, 9, 11]
for guess in guesses:
if guess == secret_number:
print(f"حدس {guess}: درست است!")
break # خاتمه دادن به حلقه پس از حدس صحیح (اختیاری)
else:
print(f"حدس {guess}: نادرست، دوباره امتحان کن.")
در این برنامه ابتدا عدد راز (secret_number) و لیست حدسهای کاربر (guesses) تعریف شدهاند. سپس با حلقهٔ for هر حدس را بررسی میکنیم. اگر مقدار حدس (guess) برابر با عدد راز باشد، یک پیام مبنی بر درست بودن حدس چاپ میشود. حتی میتوانیم با دستور break حلقه را متوقف کنیم تا پس از یافتن حدس صحیح، سایر حدسها بررسی نشوند. در صورتی که حدس اشتباه باشد، پیام تشویق به تلاش مجدد چاپ میشود. برای مثال در سناریوی دادهشده، خروجی برای حدسهای ۳ و ۵ پیام نادرست خواهد بود و برای حدس ۷ پیام درست ظاهر میشود.
سوال ۷: ردیاب مصرف آب (هفتگی)
یک هفته را در نظر بگیرید که مقدار آب نوشیدهشده در هر روز هفته در یک لیست ذخیره شده است (بر حسب لیتر). مثلا لیست مقدار آب مصرفی شما در ۷ روز میتواند این باشد: [2.5, 1.8, 2.0, 1.5, 2.2, 2.0, 2.1]. هدف شما این است که بررسی کنید هر روز به هدف ۲ لیتر آب رسیدهاید یا خیر. برنامهای بنویسید که برای هر روز از هفته، مقدار آب نوشیدهشده را چک کند و یکی از دو پیام زیر را چاپ کند:
- اگر مقدار آب آن روز حداقل ۲ لیتر بوده: “روز X: عالی بود، امروز به اندازه کافی آب خوردی!”
- اگر کمتر از ۲ لیتر بوده: “روز X: لطفاً فردا بیشتر آب بنوش.”
(X شمارهی روز هفته از ۱ تا ۷ است.)
پاسخ:
water_intake = [2.5, 1.8, 2.0, 1.5, 2.2, 2.0, 2.1] # مصرف آب هر روز
for day, liters in enumerate(water_intake, start=1):
if liters >= 2.0:
print(f"روز {day}: عالی بود، امروز به اندازه کافی آب خوردی!")
else:
print(f"روز {day}: لطفاً فردا بیشتر آب بنوش.")
ابتدا لیستی به نام water_intake تعریف شده که عنصرهای آن میزان آب مصرفی در هر روز هفته را نشان میدهد. با بهکارگیری enumerate(…, start=1) حلقه را طوری اجرا کردهایم که متغیر day شماره روز (۱ تا ۷) و liters میزان لیتر آب آن روز را به دست دهد. سپس درون حلقه یک ساختار if…else قرار دادهایم: اگر مقدار liters آن روز بیشتر یا مساوی ۲ بود، پیام موفقیت چاپ میشود؛ در غیر این صورت پیامی چاپ میشود که به مصرف آب بیشتر در روز بعد تأکید میکند. این برنامه برای هر روز یک خروجی مجزا مانند “روز 5: عالی بود…” یا “روز 4: لطفاً فردا بیشتر آب بنوش.” تولید خواهد کرد.
سوال ۸: بیشترین نمره کلاس
معلم یک کلاس نمرات دانشآموزان خود را به صورت یک لیست از اعداد ذخیره کرده است. مثلاً لیست نمرات میتواند [12, 19, 17, 14, 20, 18] (از ۲۰) باشد. برنامهای بنویسید که بالاترین نمره را در این لیست پیدا کرده و اعلام کند. خروجی باید مشخص کند بالاترین نمره چند است.
پاسخ:
scores = [12, 19, 17, 14, 20, 18]
max_score = scores[0] # فرض میکنیم اولین نمره بالاترین است
for score in scores:
if score > max_score:
max_score = score
print(f"بالاترین نمره کلاس: {max_score}")
در این کد ابتدا یک لیست نمرات دانشآموزان تعریف شده است. سپس متغیر max_score را برابر اولین نمره قرار دادهایم. با اجرای حلقهٔ for روی تمام نمرات، هر نمره با مقدار فعلی max_score مقایسه میشود و اگر بزرگتر بود، مقدار max_score به آن نمره بهروز رسانی میشود. بدین ترتیب در پایان حلقه، max_score بزرگترین مقدار لیست را در خود نگه میدارد. در انتها این مقدار چاپ میشود. (در اینجا برای یافتن بیشترین مقدار، از تابع داخلی max() استفاده نشده و منطق آن را با حلقه پیادهسازی کردهایم.)
سوال ۹: کمترین دمای هفته
فرض کنید فهرستی از دماهای ثبتشدهی هر روز هفته در اختیار داریم. مثلا لیست دمای هوا در ۷ روز میتواند [22, 18, 25, 20, 16, 19, 21] درجه سانتیگراد باشد. با نوشتن یک حلقهٔ for کوچکترین دمای موجود در این لیست را پیدا کنید و نمایش دهید. خروجی باید به صورت جملهای اعلام کند که کمترین دمای هفته چند درجه بوده است.
پاسخ:
temperatures = [22, 18, 25, 20, 16, 19, 21]
min_temp = temperatures[0]
for temp in temperatures:
if temp < min_temp:
min_temp = temp
print(f"کمترین دمای هفته: {min_temp} درجه است.")
در این برنامه از روشی مشابه سوال قبل استفاده کردهایم، با این تفاوت که اینبار بهدنبال کمینه مقدار هستیم. متغیر min_temp در ابتدا برابر اولین عنصر لیست temperatures قرار داده شده است. سپس با هر بار تکرار حلقه for، اگر دمای جاری (temp) کمتر از مقدار فعلی min_temp باشد، متغیر min_temp به آن مقدار جدید بهروز میشود. پس از پایان یافتن حلقه، متغیر min_temp حاوی کمترین دمای موجود در لیست خواهد بود. در نهایت این دما همراه با یک متن توضیحی چاپ میشود (مثلا “کمترین دمای هفته: 16 درجه است.”).
سوال ۱۰: میانگین هزینههای روزانه
فرض کنید لیستی از مخارج روزانه یک نفر در طول یک هفته در اختیار داریم، برای مثال [120000, 150000, 110000, 130000, 170000, 160000, 140000] تومان (هر مقدار نشاندهنده هزینهی یک روز). میخواهیم میانگین خرج روزانه این فرد در هفته را محاسبه کنیم. برنامهای بنویسید که با یک حلقهٔ for جمع هزینهها را به دست آورده و سپس میانگین را محاسبه و نمایش دهد. خروجی باید چیزی شبیه این باشد: “میانگین هزینهٔ روزانه این هفته X تومان بود.” که در آن X مقدار میانگین است.
expenses = [120000, 150000, 110000, 130000, 170000, 160000, 140000]
total = 0
for cost in expenses:
total += cost
average = total / len(expenses)
print(f"میانگین هزینهٔ روزانه این هفته: {average} تومان بود.")
لیست expenses شامل هزینههای هر روز است. با یک حلقه مجموع کل هزینهها در متغیر total انباشته میشود. سپس مقدار میانگین با تقسیم total بر تعداد روزها (len(expenses) که ۷ است) محاسبه میگردد. در خروجی از قالببندی استفاده شده است تا عدد میانگین به صورت یک عدد صحیح (بدون اعشار) نمایش داده شود. به عنوان مثال اگر هزینههای نمونهی بالا را در نظر بگیریم، مجموع برابر ۹۸۰۰۰۰ و میانگین برابر ۱۴۰۰۰۰ تومان خواهد شد و پیام مناسب چاپ میشود. (اینجا نیز از تابع آمادهی sum استفاده نشده و جمع با حلقه محاسبه شده است.)
سوال ۱۱: تعداد قبولیها
لیستی از نمرات یک امتحان (از ۲۰) داریم و میخواهیم بدانیم چند نفر در امتحان قبول شدهاند. حد نصاب قبولی را ۱۰ در نظر بگیرید. برای مثال اگر لیست نمرات [8, 14, 11, 3, 19, 17] باشد، برنامه باید تشخیص دهد که کدام نمرات ۱۰ یا بیشتر هستند و در نهایت تعداد کل نمرات قبولی را اعلام کند. برنامهای بنویسید که روی لیست نمرات عبور کند و تعداد قبولیها را بشمارد. خروجی میتواند چیزی شبیه این باشد: “تعداد دانشجویان قبول شده: 4 نفر”.
پاسخ:
grades = [8, 14, 11, 3, 19, 17]
pass_count = 0
for grade in grades:
if grade >= 10:
pass_count += 1
print(f"تعداد دانشجویان قبول شده: {pass_count} نفر")
سوال ۱۲: مجذورات اعداد یک لیست
یک لیست شامل چند عدد صحیح در اختیار دارید، مثلاً [2, 5, -3, 7, 0]. میخواهیم مربع (توان دوم) هر کدام از این اعداد را محاسبه کرده و در یک لیست جدید ذخیره کنیم. برنامهای که برای هر عدد لیست اصلی، مجذورش را محاسبه کرده و آنها را به ترتیب در یک لیست تازه قرار دهد. در پایان، لیست جدید را نمایش دهید. مثلا برای لیست نمونه، خروجی باید لیستی به شکل [4, 25, 9, 49, 0] باشد.
پاسخ:
numbers = [2, 5, -3, 7, 0]
squares = []
for num in numbers:
squares.append(num * num)
print(squares)
در این کد، لیست numbers اعداد اولیه را در خود دارد. یک لیست خالی به نام squares تعریف شده که قرار است نتایج در آن قرار گیرد. با اجرای حلقه for روی هر عدد num از لیست numbers، مقدار num * num (مجذور عدد) محاسبه شده و توسط متد append به انتهای لیست squares اضافه میشود. پس از پایان حلقه، لیست squares شامل مجذور تمام اعداد ورودی است و با دستور print نمایش داده میشود. به عنوان نمونه اگر numbers = [2, 5, -3, 7, 0] باشد، لیست خروجی squares = [4, 25, 9, 49, 0] خواهد بود.
سوال ۱۳: وضعیت سنی افراد (تشخیص بزرگسال)
یک لیست از سن افراد در یک جمع در اختیار داریم. برای مثال [17, 20, 15, 34, 13, 28] سن افراد یک جمع است. میخواهیم برای هر سن مشخص کنیم که آیا فرد بزرگسال (۱۸ سال به بالا) محسوب میشود یا خیر. برنامهای بنویسید که روی این لیست عبور کرده و برای هر سن یک پیام چاپ کند: اگر سن ۱۸ یا بیشتر بود پیام “سن X سال است – بزرگسال” و اگر کمتر بود پیام “سن X سال است – غیربزرگسال” را نمایش دهد. (X همان عدد سن است.)
پاسخ:
ages = [17, 20, 15, 34, 13, 28]
for age in ages:
if age >= 18:
print(f"سن {age} سال است - بزرگسال")
else:
print(f"سن {age} سال است - غیربزرگسال")
سوال ۱۴: ادغام لیستهای دانشآموزان
دو کلاس درس مجزا را در نظر بگیرید که لیست اسامی دانشآموزان هر کدام را داریم. مثلاً کلاس A شامل [“علی”, “رضا”, “مینا”] و کلاس B شامل [“بهار”, “نوید”, “رضوان”, “سارا”] است. قرار است این دو کلاس با هم ترکیب شوند و یک کلاس بزرگتر تشکیل دهند. برنامهای بنویسید که با استفاده از حلقهٔ for دو لیست اسامی را ادغام کرده و یک لیست نهایی شامل تمام دانشآموزان (هر اسم یکبار) تولید کند. در نهایت لیست ترکیبی را نمایش دهید.
پاسخ:
class_A = ["علی", "رضا", "مینا"]
class_B = ["بهار", "نوید", "رضوان", "سارا"]
combined_class = class_A[:] # کپی لیست A
for student in class_B:
combined_class.append(student)
print(combined_class)
سوال ۱۵: علاقهمندیهای مشترک
دو دوست را در نظر بگیرید که هر کدام یک لیست از فیلمهای مورد علاقه خود تهیه کردهاند. مثلاً لیست فیلمهای مورد علاقه دوست اول [“Inception”, “Interstellar”, “The Matrix”, “Joker”] و لیست دوست دوم [“The Godfather”, “Inception”, “Toy Story”, “Joker”, “Gladiator”] باشد. میخواهیم بفهمیم این دو نفر چه فیلمهایی را به طور مشترک دوست دارند. برنامهای بنویسید که دو لیست فیلم را گرفته و با استفاده از حلقهها فیلمهای مشترک بین دو دوست را پیدا کرده و در قالب یک لیست یا چند خط متن اعلام کند. برای مثال در لیستهای نمونه بالا، خروجی باید حاوی “Inception” و “Joker” باشد چون در هر دو لیست تکرار شدهاند.
پاسخ:
favorites_1 = ["Inception", "Interstellar", "The Matrix", "Joker"]
favorites_2 = ["The Godfather", "Inception", "Toy Story", "Joker", "Gladiator"]
common = []
for movie in favorites_1:
if movie in favorites_2:
common.append(movie)
print("فیلمهای مشترک:", common)
برای یافتن عناصر مشترک دو لیست، از یک حلقه for تو در تو استفاده نشده است، بلکه با بهرهگیری از عبارت شرطی Pythonic if movie in favorites_2 کار را ساده کردیم. حلقه روی هر فیلم movie از لیست اول (favorites_1) تکرار میشود و شرط movie in favorites_2 بررسی میکند آیا آن فیلم در لیست دوست دوم نیز وجود دارد یا خیر. در صورت وجود، آن فیلم به لیست common اضافه میشود. در پایان محتویات لیست common که شامل تمام فیلمهای مشترک است چاپ میگردد. برای دادههای نمونه، حلقه ابتدا “Inception” را مشترک مییابد، سپس “Joker” را. خروجی نهایی به شکل فیلمهای مشترک: [“Inception”, “Joker”] خواهد بود. (میتوانستیم از حلقههای تو در تو یا عملگرهای مجموعه نیز استفاده کنیم، اما روش فوق ساده و قابل فهم است.)
سوال ۱۶: جفتکردن نام و نمره
فرض کنید دو لیست مرتبط داریم: یکی لیست اسامی دانشآموزان یک کلاس و دیگری لیست نمرات همین دانشآموزان به ترتیبی که اندیسهایشان متناظر است. مثلا:
names = ["نگار", "شایان", "آرمان", "رعنا"]
scores = [18, 15, 20, 17]
این دو لیست نشان میدهند که نگار نمره ۱۸، شایان ۱۵ و … گرفته است. برنامهای بنویسید که این دو لیست را به هم جفت کند و خروجی را به شکل مناسبی نمایش دهد؛ مثلاً خطوطی مانند “نگار – 18”, “شایان – 15” و … برای هر دانشآموز چاپ شوند.
پاسخ:
names = ["نگار", "شایان", "آرمان", "رعنا"]
scores = [18, 15, 20, 17]
for i in range(len(names)):
print(f"{names[i]} - {scores[i]}")
سوال ۱۷: شمارش کلمات خاص در لیست
یک لیست از رشتهها (کلمات) داریم و میخواهیم بدانیم چند تا از این کلمات شرایط خاصی را دارند. شرایط به این صورت است: طول کلمه باید ۲ حرف یا بیشتر باشد و اولین و آخرین حرف آن کلمه یکسان باشد. به عنوان نمونه، اگر لیست کلمات [“بابا”, “درخت”, “داد”, “آب”, “توت”] باشد: کلمه “بابا” ۴ حرف دارد و حرف اول و آخر آن “ب” است (شرط را دارد)، “درخت” این شرایط را ندارد، “داد” ۳ حرف دارد و اولین و آخرین حرف “د” است (شرط را دارد)، “آب” ۲ حرف دارد اما اولین حرف “آ” و آخرین “ب” است (ندارد)، “توت” ۳ حرف دارد و حرف اول/آخر “ت” است (شرط را دارد). بنابراین از این لیست سه کلمهی اول و آخر و “داد” شرایط را دارند که تعدادشان ۳ میشود. برنامهای بنویسید که این کار را انجام دهد و تعداد کلمات واجد شرایط را بشمارد.
words = ["بابا", "درخت", "داد", "آب", "توت"]
count = 0
for w in words:
if len(w) >= 2 and w[0] == w[-1]:
count += 1
print(f"تعداد کلمات واجد شرایط: {count}")
کد بالا شرط دادهشده را مستقیماً در یک عبارت if پیاده کرده است. در هر دور از حلقه، رشته w بررسی میشود: ابتدا شرط len(w) >= 2 طول رشته را چک میکند (باید ۲ یا بیشتر باشد) و سپس شرط w[0] == w[-1] مقایسه میکند که اولین و آخرین کاراکتر رشته با هم برابرند یا نه. عملگر منطقی and تضمین میکند هر دو شرط صادق باشند. اگر چنین بود، شمارنده count افزایش مییابد. در پایان مقدار count که تعداد کلمات دارای این ویژگیها است چاپ میشود. برای لیست نمونه، برنامه ۳ را به عنوان خروجی اعلام میکند.
سوال ۱۸: حذف یک عنصر مشخص از لیست
برنامهای بنویسید که تمام وقوعهای یک مقدار مشخص را از داخل یک لیست حذف کند. به عنوان مثال، اگر لیست اولیه [5, 20, 15, 20, 25, 50, 20] باشد و کاربر بخواهد عدد ۲۰ را حذف کند، نتیجه نهایی باید لیست [5, 15, 25, 50] باشد که در آن هیچ ۲۰ای وجود ندارد. حل این مسئله را با استفاده از یک حلقهٔ for (و نه استفاده مستقیم از توابع آماده) انجام دهید.
numbers = [5, 20, 15, 20, 25, 50, 20]
value_to_remove = 20
result = []
for num in numbers:
if num != value_to_remove:
result.append(num)
print(result)
رویکرد این برنامه فیلتر کردن لیست اصلی است. ابتدا مقدار مورد نظر برای حذف (value_to_remove) مشخص شده (در اینجا ۲۰). سپس یک لیست خالی result ایجاد شده که قرار است عناصر بدون مقدار ۲۰ را در خود نگه دارد. حلقهٔ for روی هر عدد num از لیست اصلی اجرا میشود؛ اگر num برابر مقدار ممنوعه نباشد (if num != value_to_remove)، آن را به لیست نتیجه اضافه میکنیم. در غیر این صورت (اگر مساوی ۲۰ باشد) آن عنصر نادیده گرفته میشود و به result افزوده نمیشود. در پایان لیست result را چاپ میکنیم. برای دادهٔ نمونه، خروجی برنامه لیست [5, 15, 25, 50] خواهد بود.
سوال ۱۹: حذف موارد تکراری از لیست
یک لیست ممکن است شامل مقادیر تکراری باشد. مثلا در لیست numbers = [1, 2, 2, 3, 1, 4, 5, 4] برخی اعداد بیش از یکبار آمدهاند. هدف این است که تمام عناصر یکتا (بدون تکرار) را استخراج کنیم و عناصر تکراری را فقط یک بار در نتیجه نهایی داشته باشیم. برنامهای بنویسید که یک لیست جدید حاوی عناصر بدون تکرار از لیست اصلی تولید کند. ترتیب نسبی عناصر میتواند همان ترتیب اولین وقوع در لیست اصلی باشد. برای لیست نمونه، خروجی باید [1, 2, 3, 4, 5] باشد.
numbers = [1, 2, 2, 3, 1, 4, 5, 4]
unique_numbers = []
for n in numbers:
if n not in unique_numbers:
unique_numbers.append(n)
print(unique_numbers)
برای حذف موارد تکراری، از یک لیست کمکی unique_numbers استفاده کردهایم که در ابتدا خالی است. سپس با یک حلقه for روی numbers هر عدد را بررسی میکنیم. شرط if n not in unique_numbers تعیین میکند که آیا عدد فعلی قبلاً به لیست بدونتکرار اضافه شده است یا خیر. اگر اضافه نشده بود، آن را به unique_numbers الصاق میکنیم. اگر قبلاً وجود داشت، از افزودن مجدد آن صرفنظر میکنیم. این گونه هر عدد فقط یک بار وارد لیست نتیجه میشود. برای مثال دادهشده: عدد ۱ وارد میشود، سپس ۲، عدد ۲ دوباره تکرار شد که چون حاضر بود، اضافه نمیشود؛ ۳ اضافه میشود؛ ۱ دوباره آمد اضافه نمیشود؛ ۴ اضافه میشود؛ ۵ اضافه میشود؛ ۴ دوباره آمد اضافه نمیشود. نهایتاً unique_numbers = [1, 2, 3, 4, 5] چاپ میگردد.
سوال ۲۰: معکوس کردن لیست (چاپ وارونه)
فرض کنید یک لیست از مراحل انجام یک کار در ترتیب زمانی دارید، مثلاً steps = [“مرحله ۱”, “مرحله ۲”, “مرحله ۳”, “مرحله ۴”]. اکنون تصمیم گرفتهاید که این مراحل را به ترتیب معکوس انجام دهید. برنامهای بنویسید که ، لیست را به صورت معکوس چاپ کند؛ یعنی از آخرین عنصر لیست شروع کرده و به اولین عنصر برسد. برای لیست نمونه، باید خروجی به صورت مرحله ۴, مرحله ۳, مرحله ۲, مرحله ۱ باشد (هر کدام در یک خط مجزا).
steps = ["مرحله ۱", "مرحله ۲", "مرحله ۳", "مرحله ۴"]
for i in range(len(steps)-1, -1, -1):
print(steps[i])
برای پیمایش معکوس لیست از تابع range با سه آرگومان استفاده کردهایم. در range(len(steps)-1, -1, -1)، مقدار شروع len(steps)-1 اندیس آخرین عنصر لیست است (برای ۴ مرحله اندیسها ۰ تا ۳ هستند، پس شروع از ۳) و مقدار پایان -1 تعیین شده (چون range مقدار پایان را شامل نمیشود، این تنظیم باعث میشود تا اندیس ۰ نیز پردازش شود) و گام -1 به این معنی است که در هر تکرار یک واحد از اندیس کم میشود. حلقهٔ for با این تنظیمات اندیسهای ۳، ۲، ۱، ۰ را به ترتیب در اختیار میگذارد و در هر گام آن مرحلهی مربوطه با steps[i] چاپ میشود. به این ترتیب لیست از انتها به ابتدا خروجی داده میشود. (روش جایگزین: میتوانستیم از reversed(steps) یا slicing با steps[::-1] نیز استفاده کنیم، اما هدف تمرین حلقه بود.)
سوال ۲۱: دومین مقدار بزرگ (نایب قهرمان!)
یک مسابقه برنامهنویسی برگزار شده و امتیازات شرکتکنندگان در یک لیست ذخیره شده است. میخواهیم دومین امتیاز بالا (بعد از قهرمان مسابقه) را پیدا کنیم. به عنوان مثال اگر امتیازات [45, 82, 67, 82, 38, 77] باشد، بالاترین امتیاز ۸۲ است و دومین امتیاز بزرگ ۷۷ خواهد بود (توجه کنید که امتیاز ۸۲ تکرار شده اما دومین رتبه همچنان ۷۷ است چون ۸۲ رتبه اول است). برنامهای بنویسید که دومین مقدار بیشینه در یک لیست عددی را بیابد. (فرض کنید لیست حداقل دو مقدار متمایز دارد.)
scores = [45, 82, 67, 82, 38, 77]
max_score = scores[0]
for s in scores:
if s > max_score:
max_score = s
second_max = None
for s in scores:
if s != max_score: # امتیازات برابر با بیشترین را نادیده میگیریم
if second_max is None or s > second_max:
second_max = s
print(f"دومین امتیاز بزرگ: {second_max}")
ابتدا با یک حلقه تمام امتیازات را پیمایش کرده و بالاترین امتیاز (max_score) را پیدا میکنیم (مشابه سوال ۸). سپس متغیر second_max را تعریف میکنیم که قرار است دومین بیشترین امتیاز را نگه دارد. در حلقهٔ دوم، دوباره لیست را طی میکنیم اما این بار امتیازاتی را در نظر میگیریم که با max_score برابر نیستند (چون به دنبال رتبه دوم هستیم). اگر second_max هنوز مقداری نداشته باشد (None) یا امتیاز جاری s بزرگتر از مقدار فعلی second_max باشد، آنگاه second_max را به s بهروز میکنیم. با این روش در پایان حلقه دوم، بزرگترین امتیاز کمتر از max_score در second_max ذخیره میشود. در مثال بالا، max_score = 82 و سپس second_max = 77 به دست میآید. برنامه این مقدار را به عنوان “دومین امتیاز بزرگ” گزارش میکند.
سوال ۲۲: شمارش فراوانی عناصر در لیست
فرض کنید یک نظرسنجی انجام شده و هر نفر نام یک میوه محبوب خود را گفته است. پاسخها در قالب یک لیست جمعآوری شدهاند؛ برای مثال fruits = [“سیب”, “موز”, “سیب”, “انبه”, “موز”, “سیب”, “هلو”]. میخواهیم تعداد دفعات تکرار هر میوه در این لیست را بشماریم (چند نفر هر میوه را انتخاب کردهاند). برنامهای بنویسید که فراوانی هر عنصر لیست را محاسبه کرده و نتیجه را به صورت خروجی مثلاً در قالب میوه X تعداد Y بار اعلام کند. برای لیست نمونه، باید خروجی نشان دهد سیب ۳ بار، موز ۲ بار، انبه ۱ بار و هلو ۱ بار آمده است.
fruits = ["سیب", "موز", "سیب", "انبه", "موز", "سیب", "هلو"]
counts = {}
for f in fruits:
if f in counts:
counts[f] += 1
else:
counts[f] = 1
for fruit, count in counts.items():
print(f"{fruit}: {count} بار")
برای شمارش تکرار هر میوه از یک دیکشنری (counts) کمک گرفتهایم که کلید آن نام میوه و مقدارش تعداد دفعات مشاهدهشدن آن است. در حلقهٔ اول روی هر عنصر لیست fruits اگر میوهی فعلی قبلاً به دیکشنری اضافه شده باشد، شمارندهاش را یک واحد افزایش میدهیم؛ در غیر این صورت (اولین بار است که به آن میرسیم) یک مدخل جدید با مقدار ۱ میسازیم. بعد از تکمیل این حلقه، دیکشنری counts مثلاً به صورت {“سیب”: 3, “موز”: 2, “انبه”: 1, “هلو”: 1} خواهد بود. سپس با یک حلقه روی اقلام دیکشنری (for fruit, count in counts.items()) خروجی را برای هر میوه چاپ میکنیم. هر خط شامل نام میوه و تعداد تکرارش است (به همراه کلمه “بار”). به عنوان نمونه، خروجی شامل خطوطی مانند سیب: 3 بار و موز: 2 بار و … خواهد بود.
نکته: برای حل این مسئله میتوان از ساختارهای پیشرفتهتر مانند collections.Counter یا شمارش با list.count() هم استفاده کرد، ولی در اینجا هدف تمرین مفاهیم پایه با حلقه و دیکشنری بوده است.
سوال ۲۳: تبدیل لیست دوبُعدی به یکبُعدی ( لیست تو در تو)
فرض کنید یک لیست دوبعدی (لیستی که هر عنصرش خود یک لیست است) داریم که نشاندهنده گروههای مختلف دانشآموزان است. به عنوان مثال:
groups = [
["علی", "رضا", "سارا"],
["مریم", "پریسا"],
["شایان", "مهتاب", "امیر", "نگین"]
]
این ساختار یعنی ۳ گروه وجود دارد؛ گروه اول ۳ نفر، گروه دوم ۲ نفر و گروه سوم ۴ نفر دارند. اکنون میخواهیم یک لیست یکبعدی حاوی تمام دانشآموزان تهیه کنیم (یعنی تمام زیرلیستها را در یک لیست تخت ادغام کنیم). برنامهای با استفاده از حلقهٔ تو در تو بنویسید که این کار را انجام دهد و لیست نهایی همهٔ نامها را تولید و چاپ کند. برای دادهٔ نمونه، خروجی باید لیستی با ۹ نام (ترتیب اصلی حفظ شود) مانند [“علی”, “رضا”, “سارا”, “مریم”, “پریسا”, “شایان”, “مهتاب”, “امیر”, “نگین”] باشد.
groups = [
["علی", "رضا", "سارا"],
["مریم", "پریسا"],
["شایان", "مهتاب", "امیر", "نگین"]
]
all_students = []
for group in groups:
for name in group:
all_students.append(name)
print(all_students)
برای پیمایش یک لیست تو در تو، نیاز به دو حلقه داریم. حلقهٔ بیرونی for group in groups هر بار یکی از زیرلیستهای groups را به ما میدهد. حلقهٔ داخلی for name in group بر روی اعضای آن زیرلیست حرکت میکند. داخل حلقهٔ داخلی، با append هر name را به لیست نتیجه all_students اضافه میکنیم. به این ترتیب پس از اتمام همهٔ تکرارها، لیست all_students شامل تمام اعضای تمام گروهها خواهد بود. برای ساختار نمونه، ابتدا حلقه بیرونی گروه [“علی”, “رضا”, “سارا”] را میگیرد و داخلی سه اسم را اضافه میکند، سپس گروه دوم دو اسم را و در نهایت گروه سوم چهار اسم را اضافه میکند. لیست نهایی که چاپ میشود ترکیبی از همه ۹ اسم است.
سوال ۲۴: مجموع هر ردیف ماتریس
یک ماتریس (آرایهی دوبعدی) را به صورت لیست لیستها در نظر بگیرید. مثلا ماتریس ۳×۳ زیر را داریم:
matrix = [
[2, 5, 1],
[6, 3, 4],
[0, 8, 7]
]
این ماتریس ۳ ردیف و ۳ ستون دارد. میخواهیم مجموع عناصر هر ردیف را به دست آوریم. برنامهای با حلقهٔ تودرتو بنویسید که برای هر ردیف این ماتریس یک جمع محاسبه کرده و نتیجه را به صورت مناسبی نمایش دهد. مثلا خروجی برای مثال فوق میتواند به شکل زیر باشد:
مجموع اعداد ردیف 1 = 8
مجموع اعداد ردیف 2 = 13
مجموع اعداد ردیف 3 = 15
matrix = [
[2, 5, 1],
[6, 3, 4],
[0, 8, 7]
]
row_number = 1
for row in matrix:
row_sum = 0
for element in row:
row_sum += element
print(f"مجموع اعداد ردیف {row_number} = {row_sum}")
row_number += 1
حلقهٔ بیرونی for row in matrix هر بار یک لیست (نماینده یک ردیف از ماتریس) را در متغیر row قرار میدهد. برای هر row یک متغیر row_sum تعریف و صفر میشود. سپس حلقهٔ داخلی for element in row تمام عناصر آن ردیف را پیمایش کرده و تکتک به row_sum اضافه میکند. در پایان حلقه داخلی، مجموع اعداد آن ردیف در row_sum آماده است. سپس با استفاده از یک شمارنده (row_number) که نشاندهنده شماره ردیف است، نتیجه چاپ میشود و شمارنده را یک واحد افزایش میدهیم. برای ماتریس نمونه، خروجی همانطور که انتظار میرفت جمع هر سطر را به ترتیب ۸، ۱۳ و ۱۵ نشان میدهد.
سوال ۲۵: اعداد اول در لیست
لیستی از اعداد صحیح در اختیار داریم، برای مثال [3, 8, 5, 15, 13, 24, 7]. میخواهیم بدانیم کدام اعداد این لیست عدد اول هستند (عدد اول به عددی گفته میشود که بزرگتر از ۱ بوده و جز خودش و ۱، هیچ مقسومعلیه دیگری ندارد). برنامهای بنویسید که روی این لیست عبور کند و تمامی اعداد اول موجود را شناسایی کرده و چاپ کند. به عنوان خروجی میتوان اعداد اول را در یک لیست جدید نمایش داد یا هر کدام را در یک خط اعلام کرد. برای لیست نمونه، اعداد اول [3, 5, 13, 7] هستند.
پاسخ:
numbers = [3, 8, 5, 15, 13, 24, 7]
primes = []
for n in numbers:
if n > 1: # فقط اعداد بزرگتر از 1 میتوانند اول باشند
is_prime = True
for i in range(2, n):
if n % i == 0:
is_prime = False
break
if is_prime:
primes.append(n)
print("اعداد اول موجود:", primes)
این برنامه از دو حلقه تو در تو استفاده میکند. حلقه بیرونی روی هر عدد n از لیست حرکت میکند. ابتدا شرط n > 1 چک میکند که عدد بزرگتر از ۱ باشد (چون ۱ و اعداد غیرمثبت اول نیستند). سپس فرض میکنیم is_prime = True و با یک حلقه داخلی تمامی اعداد i از ۲ تا n-1 را بررسی میکنیم. اگر n بر هر یک از این اعداد بدون باقیمانده تقسیم شود (n % i == 0)، آنگاه n اول نیست (is_prime = False) و با دستور break از حلقه داخلی خارج میشویم تا بررسی بیشتر بیفایده انجام نشود. اگر حلقه داخلی بدون شکستن به پایان برسد، is_prime همچنان True باقی مانده و مشخص میشود که n بر هیچ عددی جز خودش و ۱ بخشپذیر نبوده، لذا یک عدد اول است و به لیست primes افزوده میشود. در پایان، محتویات لیست primes (که تمام اعداد اول یافتهشده را دارد) چاپ میشود. برای لیست نمونه، برنامه ۳، ۵، ۱۳ و ۷ را به عنوان اعداد اول شناسایی کرده و نمایش میدهد.
سوال ۲۶: بررسی مرتب بودن لیست
لیستی از اعداد به شما داده شده و میخواهید بررسی کنید که آیا این لیست به صورت صعودی مرتب شده است یا خیر. برای مثال، لیست [2, 5, 7, 10] مرتبشده (ascending) محسوب میشود ولی لیست [3, 1, 4] مرتب نیست. برنامهای بنویسید که با استفاده از یک حلقهٔ for دو به دو عناصر پشتسرهم لیست را مقایسه کند تا تعیین کند آیا کل لیست به ترتیب غیرکاهشی (هر عنصر <= عنصر بعدی) مرتب است یا نه. اگر مرتب بود پیامی مانند “لیست مرتب است.” و اگر نبود پیام “لیست مرتب نیست.” چاپ کند.
nums = [2, 5, 7, 10]
is_sorted = True
for i in range(len(nums) - 1):
if nums[i] > nums[i+1]:
is_sorted = False
break
if is_sorted:
print("لیست مرتب است.")
else:
print("لیست مرتب نیست.")
برای بررسی مرتب بودن، کافیست هر عنصر را با عنصر بعدیاش مقایسه کنیم. در کد بالا، حلقه for با range(len(nums) – 1) اجرا میشود تا اندیسهای ۰ تا ماقبل آخر را پوشش دهد. در هر تکرار اگر مشاهده شود عنصری (nums[i]) بزرگتر از عنصر بعدی خود (nums[i+1]) است، به این معنی است که ترتیب صعودی نقض شده؛ در این صورت متغیر is_sorted به False تغییر یافته و با break از حلقه خارج میشویم (چون پیدا شدن یک مورد خلاف ترتیب برای نتیجهگیری کافیست). اگر حلقه به انتها برسد بدون آنکه شرط نقض ترتیب رخ دهد، is_sorted همچنان True باقی میماند. در نهایت بر اساس True/False بودن این متغیر، پیام مناسب چاپ میشود. برای مثال اگر nums = [2,5,7,10] باشد پیام «لیست مرتب است.» و برای [3,1,4] پیام «لیست مرتب نیست.» را خواهیم دید.
سوال 27: چرخش صف (انتقال ابتدای لیست به انتها)
فرض کنید افراد در یک صف (لیست) ایستادهاند: مثلا queue = [“نفر1”, “نفر2”, “نفر3”, “نفر4”]. اکنون میخواهیم شبیهسازی کنیم که نفر جلوی صف از صف خارج شده و به انتهای صف اضافه میشود (مثلا در یک بازی نوبتی که نفر جلو بعد از انجام حرکت به آخر صف میرود تا دوباره منتظر نوبت شود). برنامهای بنویسید که یک بار این چرخش را با استفاده از عملیات روی لیست انجام دهد. نتیجه برای لیست نمونه باید [“نفر2”, “نفر3”, “نفر4”, “نفر1”] باشد.
پاسخ:
queue = ["نفر1", "نفر2", "نفر3", "نفر4"]
first = queue[0]
for i in range(len(queue)-1):
queue[i] = queue[i+1]
queue[-1] = first
print(queue)
برای چرخش صف، ابتدا عنصر اول لیست (جلوی صف) را در متغیر first ذخیره میکنیم. سپس با یک حلقه for از اندیس ۰ تا یکی مانده به آخر (len(queue)-2) هر عنصر لیست را با عنصر بعدیاش جایگزین میکنیم. به این ترتیب هر فرد به موقعیت قبلی نفر جلویی خود منتقل میشود. در پایان، جای خالی که در انتهای صف ایجاد شده را با مقدار متغیر first پر میکنیم (قرار دادن نفر اول اولیه به انتهای صف). به طور خلاصه، حلقه عناصر را شیفت میدهد و سپس نفر اول سابق را به آخر میچسباند. برای لیست نمونه، پس از اجرای حلقه ترتیب داخلی لیست به [“نفر2”, “نفر3”, “نفر4”, “نفر4”] میشود و سپس با جایگذاری first (که “نفر1” بود) به جای عنصر آخر، لیست نهایی [“نفر2”, “نفر3”, “نفر4”, “نفر1”] خواهد شد. (این فرآیند یک بار چرخش صف را شبیهسازی میکند.)
سوال 28: بررسی Palindrome بودن لیست
یک کلمه یا عددپالیندرم به ترتیبی گفته میشود که از چپ به راست و راست به چپ یکسان خوانده میشود؛ به عنوان مثال “Radar” یا عدد ۱۲۱ پالینڈروم هستند. حال فرض کنید یک لیست از کاراکترها یا ارقام داریم که یک رشته یا عدد را تشکیل میدهند، مثل chars = [‘ر’, ‘ا’, ‘د’, ‘ا’, ‘ر’]. برنامهای بنویسید که با استفاده از حلقه، تشخیص دهد آیا این لیست از هر دو طرف یکسان است یا خیر. اگر پالینڈروم بود پیام مناسبی (مثلا “لیست پالینڈروم است.”) و اگر نبود پیام دیگری (مثلا “لیست پالینڈروم نیست.”) چاپ شود.
پاسخ:
chars = ['ر', 'ا', 'د', 'ا', 'ر']
is_palindrome = True
for i in range(len(chars) // 2):
if chars[i] != chars[-i-1]:
is_palindrome = False
break
if is_palindrome:
print("لیست پالینڈروم است.")
else:
print("لیست پالینڈروم نیست.")
برای بررسی پالینڈروم بودن، کافیست لیست را از دو سمت به سمت مرکز بررسی کنیم. در کد بالا، از یک حلقه for تا نصف طول لیست استفاده شده است ( len(chars)//2 ) چون هر مقایسه دو عنصر را بررسی میکند. در هر تکرار، کاراکتر در موقعیت i از ابتدا با کاراکتر متناظر از انتهای لیست (chars[-i-1]) مقایسه میشود. اگر این دو با هم برابر نباشند، یعنی ترتیب لیست از دو طرف متفاوت است و در نتیجه پالینڈروم نیست؛ در این حالت متغیر بولین is_palindrome را False کرده و با break از حلقه خارج میشویم. اگر حلقه بدون یافتن اختلاف خاتمه یابد، is_palindrome همچنان True باقی میماند. در پایان با توجه به True/False بودن این متغیر، پیام مناسب چاپ میشود. برای لیست نمونه [‘ر’,’ا’,’د’,’ا’,’ر’] که از هر دو سو “رادار” خوانده میشود، خروجی خواهد گفت پالینڈروم است. در صورتی که حتی یکی از کاراکترهای روبهرو برابر نباشند (مثلا در لیست [‘1′,’2′,’3’])، حلقه آن را تشخیص داده و برنامه اعلام میکند پالینڈروم نیست.
تمرین 29: تولید مثلث پاسکال
مثلث پاسکال یک آرایش مثلثی از اعداد است که هر عدد داخل آن برابر مجموع دو عدد بالای خودش است. ردیف اول آن ۱ است، ردیف دوم 1 1، ردیف سوم 1 2 1، ردیف چهارم 1 3 3 1 و الی آخر. معلمان ریاضی گاهی از دانشآموزان میخواهند چند ردیف اول این مثلث را بنویسند. علی تصمیم دارد برنامهای بنویسد که برای تعداد ردیف دلخواه، مثلث پاسکال را تولید کند. برنامهای بنویسید که یک عدد rows بگیرد و مثلث پاسکال را تا آن تعداد ردیف چاپ کند.
rows = 5
triangle = []
for i in range(rows):
# شروع هر ردیف با 1 های اولیه
row = [1] * (i + 1)
for j in range(1, i):
row[j] = triangle[i-1][j-1] + triangle[i-1][j]
triangle.append(row)
print(row)
متغیر rows تعداد ردیفهایی که میخواهیم از مثلث پاسکال تولید کنیم را مشخص میکند (در این مثال ۵ ردیف).لیست triangle در ابتدا خالی است و قرار است به تدریج ردیفهای محاسبهشده را در خود نگه دارد.حلقهی بیرونی for i in range(rows): برای ساخت هر ردیف از ۰ تا rows-1 (که در مجموع rows بار اجرا میشود) عمل میکند. میتوان i را شماره ردیف فعلی (از ۰ شروع) در نظر گرفت.داخل این حلقه:
ابتدا row = [1] * (i + 1) یک لیست به طول i+1 میسازد که همه عناصر آن ۱ هستند. این کار را برای این میکنیم که میدانیم در مثلث پاسکال، اولین و آخرین عدد هر ردیف همیشه ۱ است. با این کار جایی برای بقیه اعداد ردیف نیز رزرو میشود که بعداً محاسبه میکنیم.
سپس یک حلقه داخلی for j in range(1, i): داریم. این حلقه اندیسهای میانی ردیف را پیمایش میکند (از ۱ تا i-1). برای مثال اگر در ردیف ۵ باشیم (i=4 چون از ۰ شروع کردیم)، j از 1 تا 3 میرود که عناصر میانی آن ردیف را محاسبه کنیم.داخل حلقه داخلی: مقدار هر عنصر میانی row[j] برابر است با جمع دو عنصر بالای آن در ردیف قبل. ردیف قبل در triangle[i-1] قرار دارد (چون ما هر ردیف ساختهشده را به triangle اضافه میکنیم). دو عنصر بالایی عبارتند از triangle[i-1][j-1] و triangle[i-1][j]. این دو را جمع کرده و در row[j] قرار میدهیم.پس از تکمیل حلقه داخلی (که مقادیر میانی را تعیین کرد)، ردیف فعلی کامل شده است.سپس triangle.append(row) این ردیف را به لیست مثلث اضافه میکند تا در محاسبه ردیفهای بعدی استفاده شود.و با print(row) ردیف ساختهشده را چاپ میکنیم.خروجی برنامه برای rows=5، پنج ردیف اول مثلث پاسکال خواهد بود، به صورت:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
هر خط نشاندهندهی یک لیست (ردیف) از اعداد پاسکال است.
(توجه: در عمل میتوان این اعداد را بدون کروشه و ویرگول هم نمایش داد، اما برای سادگی مستقیماً لیست را چاپ می کند.)







