آیا میخواهید بدانید یک متن چقدر برای خواندن ساده یا دشوار است؟
در این مقاله، با یکی از تمرینهای جذاب دوره CS50 به نام Readability آشنا میشویم. هدف این مسئله، نوشتن برنامهای است که سطح خوانایی یک متن را با استفاده از فرمول Coleman‑Liau محاسبه کند. این مقاله کاملاً بدون کد و با زبانی ساده نوشته شده است تا مفاهیم پایه را درک کنید. برای مشاهده آموزش عملی و پیادهسازی گامبهگام، ویدیوی انتهای مقاله را تماشا کنید.
در دنیای امروز، ابزارهای مختلفی برای سنجش سادگی یا دشواری یک متن وجود دارند. یکی از معروفترین این ابزارها، شاخص خوانایی Coleman‑Liau است که در سال ۱۹۷۵ توسط مری کولمن و تی. ال. لیائو ابداع شد. این شاخص مشخص میکند که یک متن تقریباً برای دانشآموزان چه پایهای (مثلاً کلاس سوم دبستان یا سال دوم دبیرستان) قابل درک است.
در تمرین Readability از هفته دوم دوره CS50، شما باید برنامهای بنویسید که:
یک متن از کاربر دریافت کند (متن میتواند شامل فاصله و علائم نگارشی باشد).
تعداد حروف (Letters)، کلمات (Words) و جملات (Sentences) را بشمارد.
با استفاده از فرمول Coleman‑Liau، شاخص خوانایی را محاسبه کند.
نتیجه را به صورت "Grade X" (مثلاً Grade 2، Grade 8) یا در موارد خاص "Before Grade 1" یا "Grade 16+" چاپ کند.
فرمول اصلی به این شکل است:
index = 0.0588 * L - 0.296 * S - 15.8
L = میانگین تعداد حروف در ۱۰۰ کلمه
S = میانگین تعداد جملات در ۱۰۰ کلمه
برای محاسبه L و S، ابتدا باید بدانیم:
حروف: کاراکترهای A تا Z و a تا z.
کلمات: رشتههایی از کاراکترها که با فاصله از هم جدا شدهاند.
جملات: هرجا که به یکی از علائم . (نقطه)، ! (علامت تعجب) یا ? (علامت سوال) برسیم، یک جمله تمام میشود.
سپس:
L = (تعداد حروف ÷ تعداد کلمات) × 100 S = (تعداد جملات ÷ تعداد کلمات) × 100
عدد نهایی index را به نزدیکترین عدد صحیح گرد میکنیم (با استفاده از گردسازی معمولی). اگر این عدد کمتر از ۱ باشد، خروجی "Before Grade 1" چاپ میشود. اگر ۱۶ یا بیشتر باشد، خروجی "Grade 16+" خواهد بود. در غیر این صورت، "Grade X" که X همان عدد گردشده است نمایش داده میشود.
برای حل این مسئله، منطق زیر را دنبال میکنیم:
برنامه باید متنی را از کاربر بگیرد که ممکن است شامل فاصله و علائم نگارشی باشد. بنابراین روش دریافت باید بهگونهای باشد که کل خط را بخواند، نه فقط اولین کلمه را.
با پیمایش کاراکترهای متن، هر جا به یک حرف انگلیسی (بزرگ یا کوچک) برسیم، یک واحد به شمارنده حروف اضافه میکنیم. اعداد و علائم نگارشی نادیده گرفته میشوند.
شمارش کلمات کمی ظریفتر است. باید دقت کنیم که:
اگر متن خالی باشد یا فقط شامل فاصله باشد، تعداد کلمات صفر است.
اولین کلمه را باید جداگانه پیدا کنیم (اولین کاراکتر غیرفضایی).
هر جا بعد از یک یا چند فاصله، یک کاراکتر غیرفضایی بیاید، یعنی یک کلمه جدید شروع شده است.
با پیمایش متن، هر بار که به یکی از سه علامت .، ! یا ? برسیم، یک جمله شمارش میشود. این روش سادهای است و برای این تمرین کافی است.
پس از بهدست آوردن تعداد حروف، کلمات و جملات:
اگر تعداد کلمات صفر بود (متن خالی یا فقط فاصله)، مستقیماً "Before Grade 1" چاپ میکنیم.
در غیر این صورت، L و S را با فرمولهای بالا محاسبه کرده و در فرمول اصلی قرار میدهیم.
عدد حاصل را گرد میکنیم و طبق شرایط گفته شده خروجی مناسب را چاپ میکنیم.
تقسیم اعشاری: در محاسبه L و S، حتماً باید از تقسیم اعشاری استفاده کنید، وگرنه نتیجه نادرست خواهد بود.
گرد کردن: برای گرد کردن از تابع round استفاده کنید که عدد را به نزدیکترین عدد صحیح میبرد.
مدیریت متن خالی: اگر کاربر فقط Enter بزند یا متنی شامل فاصله وارد کند، باید برنامه بدون خطا به درستی پاسخ دهد.
فاصلههای اضافی: روش شمارش کلمات باید بتواند چندین فاصله پشتسرهم را مدیریت کند و کلمات را درست بشمارد.
علائم نگارشی: نقطههای مخفف (مثل Mr.) ممکن است باعث شمارش اشتباه جملات شوند، اما در این تمرین سادهسازی شده است.
برای اطمینان از درستی برنامه، میتوانید آن را با مثالهای زیر آزمایش کنید:
| متن ورودی | خروجی مورد انتظار |
|---|---|
One fish. Two fish. Red fish. Blue fish. |
Before Grade 1 |
Congratulations! Today is your day. You're off to Great Places! You're off and away! |
Grade 3 |
Harry Potter was a highly unusual boy in many ways. ... |
Grade 5 |
A large class of computational problems involve ... |
Grade 16+ |
(متنهای کامل را میتوانید در ویدیوی آموزشی ببینید.)
اگر میخواهید این مفاهیم را به صورت عملی و با پیادهسازی کامل در زبان C ببینید، ویدیوی زیر را تماشا کنید. در این ویدیو، بهراد قاسمی از مجموعه CS50x ارومیه تمام مراحل حل مسئله، نکات ریز و اشتباهات رایج را توضیح میدهد.
لینک ویدیو در آپارات:
https://www.aparat.com/v/eazl42f
در این ویدیو یاد میگیرید:
چگونه با scanf یک خط کامل را از کاربر بگیرید.
توابع جداگانه برای شمارش حروف، کلمات و جملات بنویسید.
فرمول Coleman‑Liau را پیادهسازی کنید.
برنامه را با مثالهای مختلف تست کنید.
مسئله Readability یک تمرین عالی برای آشنایی با کار با رشتهها، حلقهها، شرطها و توابع در زبان C است. با حل این مسئله، نهتنها با یک فرمول واقعی و کاربردی آشنا میشوید، بلکه مهارتهای برنامهنویسی خود را نیز تقویت میکنید.
اگر سوال یا ابهامی دارید، میتوانید در بخش نظرات ویدیو یا این مقاله مطرح کنید. همچنین میتوانید در دوره ی سی اس فیفتی ایکس ارومیه شرکت کنید!
نویسنده: بهراد قاسمی
مجموعه: CS50x ارومیه