ویوسافت

ویوسافت

شما در ویوسافت میتوانید از پروژه ها ، کد سورس ها و آموزش های رایگان استفاده کنید



پروژه ارایه سه بعدی به زبان اسمبلی همراه با توضیح


نویسنده : علی خازنی
دسته بندی : پروژه
1395/11/06

ارایه سع بعدی

 

 

 

 

 

 

 

 

 

 

برای این که بتوانیم ساختار یک آرایه ­ی سه بعدی را در یک آرایه­ ی تک بعدی پیاده کنیم، بایستی کاری کنیم تا بَعد از وارد کردن بعدها توسط کاربر، بتوان مقدار متناظر آن بعدها را شناسایی کنیم. برای این کار فرض می­کنیم آرایه­ی سه بعدی ما، صفحاتی از ماتریس­ها است. به عنوان مثال یک آرایه­ی (۳, ۳, ۳) عنصری می­تواند به این شکل باشد.

 که در آن m تعداد سطرها، n تعداد ستون­ها، i سطر جاری، j ستون جاری و p شماره­ی صفحه­ی جاری است

نحوه­ی کار با برنامه

بعد از اجرای برنامه، صفحه­ای باز می­شود که با پیغامی مقدار اولیه ای بین ۰ تا ۲۰ را به عنوان محدوده صفحات و ردیف و ستون از کاربر می گیرد سپس پیغامی برای کمک به کاربر ظاهر می شود که با جواب دادن به پیغام منویی چاپ می شود.

_ همانطور که در منوی برنامه نیز آمده است، برای ایجاد یک آرایه­ی جدید حرف n را وارد کنید.

_ بعد از ذخیره­ی مقادیر، برای نمایش مقادیر بُعدها، حرف v را وارد کنید.

_ برای دیدن مشخصات برنامه نویس برنامه نیز حرف a را وارد کنید.

_ در این صفحه برای خروج از برنامه، حرف q را وارد کنید.

بعد از وارد کردن حرف n و اندازه­ی بعدها، بدون پاک شدن صفحه خطی شامل این کارامتر “_” چاپ می شود.

تابع­ها و ماکروهای برنامه

برنامه از تابع main شروع می­شود. در دو سطر اول پیغامهایی با استفاده از توابع تعریف شده چاپ می شوند وسپس داده ها با استفاده از cin_num  ازسطر۳ تا ۱۰ اولی این برنامه از کاربر گرفته می شود.

سپس منویی در سطر ۱۱برای کمک به کاربر با وارد کردن علامت سوال?  چاپ می شود سپس داده ای که کاربر وارد کرده مورد بررسی قرار می گیرد

از سطر ۱۲ تا ۱۶  lable1 بررسی می شود که آیا داده ی وارد شده q است در این صورت برنامه به closing پرش کرده و خاتمه می یابد در غیر این صورت  lable2 از خط ۱۷ تا ۲۲ بررسی می شود که اگر داده ی وارد شده v باشد داده ای  که قبلا توسط کاربر با n وارد شده را نمایش دهد .

در ادامه خطوط در lable3 بررسی می شود که آیا کاربر n را وارد کرده است اگر بله پس با استفاده از newpoint نقطه ای از کاربر گرفته می شود

و در ادامه خطوط درlable4 بررسی می شود که آیا کاربر ? را وارد کرده است اگر بله پیغامهایی با استفاده از ماکروهایی که قبلا نوشته شده چاپ می شود

و در ادامه خطوط درlable5 بررسی می شود که آیا کاربر a را وارد کرده است اگر بله پیغامهایی با استفاده از ماکروهایی که قبلا نوشته شده چاپ می شود

در غیر این صورت در lable6 اگر کاربر هیچ گونه از کارکترهای تعیین شده را وارد نکند به lable1 باز می گردد یعنی  loop می شود.

ماکروی cout_str

این ماکرو با توجه به مقدار آرگومانش، با استفاده از سرویس ۹ از وقفه­ی ۲۱H، اقدام به چاپ رشته­ای خاص می­کند.

ماکروی cout_char

این ماکرو با استفاده از سرویس ۲ از وقفه­ی ۲۱H، کاراکتری که به آرگومانش نسبت داده شده را چاپ می­کند.

ماکروی mulling

به خاطر زیاد بودن عمل ضرب و جلوگیری از زیاد شدن طول تابع اصلی و راحتی کار در توابع دیگر که به عمل ضرب نیاز دارند این ماکرو نوشته شد.

تابع cin_char

این تابع ابتدا کاراکتر – را به کمک ماکروی cout_char چاپ کرده، و سپس با استفاده از سرویس ۷ از وقفه­ی ۲۱H کاراکتری را از کاربر می­گیرد. اگر این کاراکتر، کاراکتر Back Space باشد، به ابتدا رفته و کاراکتر وارد شده و کاراکتر – را پاک کرده و تابع دوباره کار خودش را آغاز می­کند. اگر کاراکتر وارد شده Enter باشد، به آخر تابع می­رود. حال اگر طول کاراکترهای وارده بیش از یکی باشد، آن کاراکتر چاپ نشده و دوباره از کاربر گرفته خواهد شد تا زمانی که یکی از کلیدهای Back Space یا Enter وارد شوند. در غیر اینصورت اگر تعداد کاراکترها یک نباشد، کاراکتر وارد شده چاپ و دوباره از کاربر کاراکتر گرفته خواهد شد.

تابع cin_num

وظیفه­ی این تابع گرفتن یک عدد مثبت تا ۲۵۵ است. به همین دلیل کاراکترهای واردی توسط کاربر نمی­تواند بیش از سه رقم باشد. این تعداد توسط متغیر ctr1 کنترل می­شوند. متغیر val برای ذخیره­ی موقت عدد که بعد از انجام محاسبات به دست می­آید، به کار برده شده است. مقدار این متغیر در آخر تابع، در ثبات ax ذخیره می­شود.

عملکرد این تابع هم تقریباً شبیه تابع cin_char است. با این تفاوت که این تابع فقط عدد از کاربر می­گیرد. این کار با مقایسه­ی کد اسکی کاراکتر وارد شده صورت می­گیرد؛ به این صورت که اگر کد اسکی کاراکتر وارد شده کمتر از کاراکتر ۰ بوده یا بزرگ­تر از کاراکتر ۹ باشد، دوباره به بالا پرش کرده و به گرفتن کاراکترها می­پردازد. در صورتی که این کاراکتر در محدوده­ی مورد نظر باشد، بر کاراکتر ۰ منها می­شود تا رقم به دست آمده با val جمع شود. قبل از این مرحله مقدار val در ۱۰ ضرب می­شود تا بتواند ارزش مکانی خود را حفظ کند. در صورتی که کاراکتر وارد شده Back Space باشد هم این مرحله به صورت برعکس شکل گرفته و مقدار val بر ۱۰ تقسیم شده و یک واحد از ctr1 کم می­شود.

تابع cout_num

این تابع مقداری را که در ثبات cx ذخیره شده است چاپ می­کند. برای این کار ابتدا توسط یک حلقه، رقم­های عدد به وسیله­ی تقسیم بر ۱۰ از عدد جدا شده و در آرایه­ی cint ذخیره می­شوند.

در حلقه­ی دوم، این مقادیر، از انتهای آرایه به ابتدای آن، جدا شده و بعد از جمع شدن با کاراکتر ۰ -برای به دست آوردن کد اسکی معادل آن عدد-، در خروجی به وسیله­ی ماکروی cout_char چاپ می­شوند.

تابع cur_idx

کلاً وظیفه­ی این تابع محاسبه­ی فرمول  و قرار دادن نتیجه در ثبات bx است. این فرمول همان طور که قبلاً گفته شد، برای به دست آوردن اندیس خانه­ای در آرایه که مقدار نقطه­ی (p, i, j) در آن ذخیره می­شود، به کار رفته است. از آنجایی که تعداد اعمال ضرب در این فرمول زیاد است، به همین دلیل برای راحتی کار، ماکرویی با نام mulling برای ضرب یک مقدار در val استفاده شده است.

تابع newpoint

این تابع مقادیر p (شماره­ی صفحه­ی جاری)، i (سطر جاری) و j (ستون جاری) را از کاربر می­گیرد و همچنین مقدار مربوط به این نقطه را نیز گرفته و در ثبات cl ذخیره می­کند. بعد از گرفتن این نقاط، در دستورات بعدی به بررسی این موضوع می­پردازد که آیا نقاط وارد شده از حداکثر اندازه­ی آنها که از کاربر گرفته شده، بیشتر هستند یا نه و در صورتی که این موضوع پیش بیاید، پیغام >Error را چاپ خواهد کرد.

در صورتی که اعداد وارد شده در محدوده­ی مجاز بودند، اندیس خانه­ای در آرایه که مقدار باید در آن ذخیره شود را به کمک تابع cur_idx   محاسبه کرده و مقدار ثبات cl را به آن انتقال می­دهد.

تابع viewvalue

عملکرد این تابع تقریباً شبیه تابع newpoint می­باشد. در این تابع بعد از گرفتن مختصات نقطه، بررسی صحت آنها و محاسبه­ی اندیس مربوط به آن خانه در آرایه، مقدار خانه به ثبات cl انتقال یافته و در ادامه این مقدار به کمک تابع  cout_num بر روی خروجی چاپ می­شود.

دانلود پروژه :دانلود

رمز : wavesoft.ir

 برداشتن مطلب با نام منبع مجاز هست در غیر این صورت دزدی محصوب می شود


علی خازنی

مهندس تکلونوژی نرم افزارهستم 25 سال دارم و مدیر ارشد گروه نرم افزاری ویوسافت رو برعهده دارم این سایت رو برای برنامه نویسان و دانشجویان رشته نرم افزار و کامپیوتر و کلیه علاقه مندان این رشته طراحی کردم بتوانم کمک کوچکی برای این عزیزان کرده باشم .

ارسال دیدگاه






کد امنیتی را وارد کنید