شما همین تازه به عنوان استاد ریاضیات استخدام شدهاید. هفتهی اول خوب پیش رفت، اما در هفتهی دوم یک جای کار میلنگد. مشکل این است که هر پاسخی که دانشجویانتان میدهند غلط است! خوشبختانه مهارتهای ریاضیتان به شما کمک کرده تا مشکل را پیدا کنید: پاسخهای دانشجویان درست هستند، اما همهشان در مبنای ۲ (دودویی) نوشته شدهاند! شگفتآور است که معلوم شده هر هفته دانشجویان از مبنای دیگری استفاده میکنند. برای اینکه بتوانید سریع پاسخهای دانشجویان را بررسی کنید، ابزاری میسازید که بین مبناها تبدیل انجام میدهد.
دنبالهای از رقمها در یک مبنا را، که نمایندهی یک عدد است، به دنبالهای از رقمها در مبنای دیگر تبدیل کنید، بهگونهای که نمایندهی همان عدد باشد.
تبدیل را خودتان پیادهسازی کنید. برای انجام تبدیل، از راه دیگری استفاده نکنید.
در نمایش مکانی، یک عدد در مبنای b را میتوان بهصورت ترکیب خطی توانهای b فهمید.
عدد ۴۲، در مبنای ۱۰، یعنی:
(4 × 10¹) + (2 × 10⁰)
عدد ۱۰۱۰۱۰، در مبنای ۲، یعنی:
(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)
عدد ۱۱۲۰، در مبنای ۳، یعنی:
(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)
بله. آن سه عدد بالا دقیقاً یکساناند. تبریک!
گاهی لازم است استثنایی ایجاد کنید. وقتی این کار را میکنید، همیشه باید یک پیام خطای معنادار بگنجانید تا مشخص شود منبع خطا چیست. این کار کد شما را خواناتر میکند و در اشکالزدایی کمک زیادی میکند. اگر میدانید منبع خطا نوع مشخصی دارد، میتوانید یکی از انواع خطای توکار را ایجاد کنید، اما باز هم باید پیامی معنادار همراه آن بگنجانید.
این تمرین خاص میخواهد که از دستور raise استفاده کنید تا برای پایههای ورودی و خروجی متفاوت، یک ValueError «پرتاب» کنید. آزمونها فقط وقتی قبول میشوند که هم exception را raise کنید و هم پیامی معنادار همراه آن بگنجانید.
برای پرتاب یک ValueError همراه با پیام، پیام را بهعنوان آرگومان به نوع exception بدهید:
# for input.
raise ValueError("input base must be >= 2")
# another example for input.
raise ValueError("all digits must satisfy 0 <= d < input base")
# or, for output.
raise ValueError("output base must be >= 2")