المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


سوالات المپیاد:دوره ی تابستان:دوره ی ۱۰:الگوریتم ها:سوال ۶

زبان کوچک

زبان برنامه‌نویسی که شرح داده می‌شود، برای کامپیوتری نوشته شده است که تعدادی خانه‌ی حافظه، با شماره‌های ۱، ۲، ۳، … دارد که هر خانه می‌تواند یک عدد صحیح نامنفی نگه دارد. هر برنامه به این زبان از یک سری بلوک‌های احتمالا تودرتو تشکیل شده است. شروع هر بلوک با کلمه‌ی Repeat و پایان آن با کلمه Forever مشخص می‌شود. دستورات قابل استفاده در این زبان عبارت‌اند از:

  • دستور $AddTo(i)$ که در آن $i$‌ یک عدد ثابت است و شماره یکی از خانه‌های حافظه را مشخص می‌کند. پس از اجرای این دستور به محتوای خانه $i$ حافظه یک واحد افزوده می‌شود.
  • دستور $Dec(i)$ که باز $i$‌یک عدد ثابت است و شماره یکی از خانه‌های حافظه را مشخص می‌کند. در صورتی که محتوای خانه شماره $i$‌ صفر باشد، اجرای این دستور منجر به پایان یافتن اجرای داخلی‌ترین بلوک دربرگیرنده‌ی این دستور می‌شود وگرنه پس از اجرای این دستور محتوای این خانه از حافظه یک واحد کاهش می‌یابد.

برنامه پس از رسیدن به انتهای هر بلوک اجرای آن بلوک را از سر می‌گیرد و بنابراین خارج شدن از یک بلوک تنها از طریق دستور $Dec$ ممکن می‌باشد. یک برنامه، شامل یک بلوک دربرگیرنده‌ی احتمالا چند بلوک و دستور است.

به عنوان مثال برنامه زیر عدد قرار گرفته در خانه ۱ حافظه را به خانه ۲ حافظه منتقل می‌کند.

$Repeat \\ \quad Repeat \\ \quad\quad Dec(2) \\ \quad Forever \\ \quad Repeat \\ \quad\quad Dec(1) \\ \quad\quad AddTo(2) \\ \quad Forever \\ \quad Dec(1) \\ Forever$

الف) برنامه‌ای بنویسید که اجرای آن باعث شود، خارج قسمت تقسیم عدد ذخیره شده در خانه‌ی ۱ حافظه بر عدد ذخیره شده در خانه‌ی ۲ حافظه در خانه‌ی ۳ ذخیره شود.

ب)برنامه‌ای بنویسید که پس از اتمام اجرای آن در صورتی که عدد ذخیره شده در خانه ۱ حافظه اول بود در خانه ۲ حافظه عدد صفر و اگر نه عدد ۱ ذخیره شده باشد.

توضیح: در هر جای برنامه که لازم می‌دانید، در مورد ایده‌ای که دارید، توضیح دهید!


ابزار صفحه