بستن پنجره
فرادرس - مجموعه آموزش‌های ویدئویی  مهندسی کامپیوتر - طراحی الگوریتم - ساختمان داده
بستن پنجره     از آخرین نوشته‌ها

»    مسابقه‌ی برنامه‌نویسی آنلاین 20 Quera

»    دوره‌ی طراحی و تحلیل الگوریتم دانشگاه استنفورد

»    مسأله‌ی انتخابات

بستن پنجره
وبگاه
این صفحه
اشتراک‌گذاری در LinkedIn     Cloob     اشتراک‌گذاری در Twitter
اشتراک‌گذاری در Facebook     ارسال با Telegram     Google Plus
بستن پنجره
وبگاه     این صفحه
اشتراک‌گذاری در LinkedIn     Cloob     اشتراک‌گذاری در Twitter     اشتراک‌گذاری در Facebook     ارسال با Telegram     Google Plus
آرایه‌ی ایستا و پویا در ++C - الگوریتمستان
الگوریتمستان
5014.225.00
  »  

       

آشنایی با آرایه‌ی پویای یک بعدی و کاربردهای آن در زبان برنامه‌نویسی ++C

http://www.aachp.ir آنچه می‌خوانید ویراست جدید نوشته‌ای است که اولین بار با عنوان «آرایه ایستا و پویا در ++C» خرداد ماه 1385 از طریق وبگاه برنامه‌نویسی و طراحی الگوریتم (عنوان و طرح پیشین وبگاه الگوریتمستان) منتشر شده بود.


زبان ++C همانند اکثر زبان‌های برنامه‌نویسی دیگر، ساختاری به نام آرایه دارد که امکان تعریف مجموعه‌ای از متغیرهای هم‌نوع (اصطلاحا مجموعه عناصر همگن) را فراهم می‌کند. چنین ساختاری به صورت زیر تعریف می‌شود:

      

type name[number of elements];

      

    که در آن type یکی از انواع داده‌های استاندارد ++C، ساختمان و یا کلاس است. number of elements هم تعداد اعضا یا عناصر آرایه را مشخص می‌کند که باید عدد ثابتی باشد. مثلا عبارت زیر یک آرایه‌ی 10 عضوی از اعداد اعشاری به نام arr تعریف می‌کند:

      

float arr[10];

      

    توجه داشته باشید که شماره‌ی اندیس اعضای آرایه در ++C همیشه از صفر شروع می‌شود:

      

arr[0], arr[1], ..., arr[9]

      

    این نوع تعریف، آرایه‌هایی را ایجاد می‌کند که به آرایه‌های ایستا معروف هستند. این اسم‌گذاری از آنجا ناشی می‌شود که طول چنین آرایه‌هایی در حین تعریف مشخص می‌شود و مقدار ثابتی است. لازم به ذکر است که برای تعیین طول تابع (یا همان تعداد اعضای آن) حتما باید از یک عدد و یا داده‌ی ثابت (const) استفاده کنید. به عبارت دیگر، در این زبان نمی‌توان از یک متغیر برای تعیین طول آرایه استفاده کرد. پس عباراتی مانند دستورالعمل‌های زیر در زبان ++C کامپایل نشده و خطا تولید می‌کند:

      

int n;
cin >> n;
double arr[n];

  

    چرا که n یک متغیر است و نمی‌تواند برای تعیین طول آرایه به کار رود. البته این مسأله در برخی کامپایلرهای جدید وجود ندارد که قبل از برنامه‌نویسی باید بررسی شود.

    حال ببینیم این ویژگی چه مشکلاتی را ممکن است به وجود بیاورد.

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

      

float marks[1000];

  

    اما تعریف فوق دو ایراد دارد. اول این که اگر تعداد نمره‌ها بیشتر از هزار باشد، برنامه کار نمی‌کند؛ و دوم، اگر مثلا فقط سه نمره وارد شود، 997 عضو از عناصر آرایه بلااستفاده خواهند ماند، که حافظه اشغال کرده‌اند. رفع این دو ایراد راه ساده‌ای دارد: استفاده از آرایه‌ی پویا.

    آرایه‌ی پویا همانند آرایه‌ی ایستا، برای تعریف عناصر هم‌نوع به کار می‌رود. با این تفاوت که می‌توان در زمان تعریف، از متغیرها برای تعیین طول استفاده کرد. حالت کلی تعریف آرایه‌ی پویا با عبارت زیر مشخص می‌شود:

      

type *name;
name = new type[number of elements];

      

    به عنوان نمونه، عبارت بالا را باید نوشت:

      

int n;
double *arr;
cin >> n;
arr = new double[n];

      

    که باعث می‌شود یک آرایه‌ی پویا به نام arr و به طول n ایجاد شود.

    آرایه‌های پویا پس از تعریف، هیچ تفاوتی با آرایه‌ی ایستای معمولی ندارند و دسترسی به عناصر آنها با اندیس صورت می‌گیرد. اما حتما باید به خاطر داشت باشید که حافظه‌ی استفاده شده برای آرایه‌ی پویا را بعد از استفاده، با دستور delete آزاد کنید:

      

delete[] name;

      

    برای آرایه‌ی arr که در قبلا تعریف کرده‌ایم:

      

delete[] arr;

      

    همانطور که مشاهده می‌کنید، آرایه‌های پویا ارتباط نزدبکی با اشاره‌گرها و بحث تخصیص حافظه دارند. با این وجود، ایراداتی دارند که گاهی برنامه‌نویس را مجبور می‌کند از ساختارهای دیگر - مانند لیست پیوندی - استفاده کند.


این نوشته آخرین بار در تاریخ دوشنبه، ۴ مرداد ماه ۱۳۹۵ مورد بازنویسی نگارشی قرار گرفته است.
نوشته‌های مرتبط
        معرفی انواع ظرف‌ها (نگهدارنده‌ها - containers) در زبان برنامه‌نویسی ++C
        آشنایی با توابع دوست کلاس در زبان برنامه‌نویسی ++C و کاربرد آنها در سربارگذاری عملگرها
        معرفی فایل سرآیند algorithm از کتابخانه قالب استاندارد زبان برنامه‌نویسی ++C به همراه نمونه کد
        آشنایی با مفهوم سربارگذاری عملگرها در زبان ++C
        آشنایی با کلاس‌های حافظه و کاربرد آنها در زبان ++C
        معرفی متغیرهای مرجع در زبان برنامه‌نویسی ++C و آشنایی با مهمترین کاربردهای آنها
        آشنایی با حلقه‌های تکرار در زبان برنامه‌نویسی ++C و دستورات کنترلی مورد استفاده در آن
        آموزش استفاده از آرایه‌ی پویای دو بعدی در زبان ++C
        پنج نکته‌ی آموزنده در مورد برنامه‌نویسی به زبان برنامه‌نویسی ++C
        آشنایی با مفهوم و عملکرد اشاره‌گرها در زبان برنامه‌نویسی ++C و ارائه مثالهایی از کاربرد آن
پیوند کوتاه صفحه دسته‌بندی
امتیاز نوشته
  • 1
  • 2
  • 3
  • 4
  • 5
ارسال پیام

نام: *  

پست الکترونیک:

وبگاه:

متن پیام: *

right 01 02 03 04 05 06 07 08 09 10 11 12 13 14 left

 


» فاطمه

سه‌شنبه، ۲ آذر ماه ۱۳۹۵، ساعت ۱۲:۳۴
1313141414

» A

یکشنبه، ۲۲ آذر ماه ۱۳۹۴، ساعت ۱۷:۱۷
سلام...
ممنون از مطلب خوبتون...
آیا این امکان هم وجود داره که داخل یک استراکچر حافظه پویا تخصیص بدیم؟!
میشه کمی راهنمایی کنید؟!10
ممنون...

» rezaiy

پنجشنبه، ۲۵ دی ماه ۱۳۹۳، ساعت ۲۳:۰۶
با سلام و تشکر فراوان
ببخشید یه سوال داشتم اگه امکانش هست جوابشو واسم ایمیل کنین
اگر در ++c  داده استاتیک رو در قسمت proptect کلاس تعریف کنیم چه اتفاقی مییوفته
روش تعریف این متغیر و مقدار دهیش چطوریه؟
و داده های استاتیک در کلاس به چند روش فراخوانی میشن؟
خیلی ممنون میشم اگه بشه زود جواب بدین امتحان دارم

» Soroushp

چهارشنبه، ۳۰ بهمن ماه ۱۳۹۲، ساعت ۲۱:۱۶
ممنون

» حسین

جمعه، ۲۲ آذر ماه ۱۳۹۲، ساعت ۱۱:۴۸
سلام می شه الگویتم گرامر رو که توی درس نظریه زبان هاست بزارین؟
ممنون!!

» بهار

چهارشنبه، ۱ آبان ماه ۱۳۹۲، ساعت ۱۲:۰۴
سلام
.من بايد با ديوسي پلاس پلاس  يه الگوريتم پويا بنويسم كه بتونه با توجه به فايل ورودي  كه يه گرامري از زبان نظريه زبان ها و اتوماتا هست و يه جمله اي كه بهش ميدم در كمترن زمان ممكن برام مشخص كنه ايا جمله در اين گرامر صدق مي كند يا نه؟گرامر و جملات مهم نيست فقط الگوريتمش چه جوري بايد باشه؟خواهش مي كنم كمكم كنيد

» سعيد

چهارشنبه، ۱۳ شهریور ماه ۱۳۹۲، ساعت ۱۸:۰۳
سلام من كد الگوريتم تخصيص حافظه بست فيت رو به زبان سي پلاس پلاس ميخوام تا بتونم شبيه سازي كنم خواهش ميكنم كمكم كنيد

» مریم

جمعه، ۳۰ اردیبهشت ماه ۱۳۹۰، ساعت ۲۲:۱۴
برنامه ای که یک مقداری رو بگیره و به 4 روش که در کتاب سیستم عامل اومده حافظه تخصیص بده به هر زبان دلخواه
خواهش می کنم کمک کنید
واسه یه بنده خدایی که خیلی به نمره ی این برنامه احتیاج داره.
مطمئنم دعاتون می کنه.
خدا خیرتون بده
منتظر جوابتون هستم

» narmin

چهارشنبه، ۱۲ خرداد ماه ۱۳۸۹، ساعت ۱۱:۲۰
سلام میخواستم برنامه ی زمانبندی RR(round robin) را با صفها در C  یا    C++بنویسم اما نمی دونم چطور؟ با آرایه ها زمان ورود و اجرا وکوانتوم رو بگیرم یا یک ساختمان تعریف کنم؟و چطوری فرایندها رو اجرا کنم؟ لطفا بهم کمک کنید خیلی واجبه .

» حامد

جمعه، ۷ خرداد ماه ۱۳۸۹، ساعت ۰۰:۳۰
سلام . لطف می کنید مفهوم حافظه پوبا و ایستا رو در ساختمان داده ها بگید . و انواع ساختمان داده ها که با این روش ذخیره می شود

» حامد

جمعه، ۲۰ فروردین ماه ۱۳۸۹، ساعت ۱۴:۱۰
با سلام
میخواستم همین روش را برای آرایه های دو بعدی توضیح دهید یعنی هر دو بعد متغیر باشند .
واینکه من میخواهم برنامه ای بنویسم ونتیجه محاسبات در یک آرایه ریخته شود.وتعداد محاسبات معلوم نیست یعنی طول  آرایه دائم تغییر میکند لطفآراهنمایی کنید  


جمعه، ۲۰ فروردین ماه ۱۳۸۹، ساعت ۱۶:۱۶
مسعود:
درباره آرایه پویای دو بعدی مطلب جداگانه ای نوشته شده.
در صورتی که حد بالایی برای تعداد محاسبات وجود نداره، تنها راه حل ممکن استفاده از لیستهای پیوندی به جای آرایه هاست. نمی شه طول آرایه رو بعد از تعریف تغییر داد.
البته در این زبان شما می تونید به اندیسهای بالاتر از تعریف آرایه هم داده بنویسید (آرایه ها و اشاره گر به حافظه رابطه نزدیکی با هم دارن). اما با توجه به اینکه اون محل حافظه برای آرایه رزرو نشده، ممکنه برنامه دیگه ای روی همون محل داده وارد کنه، و در نتیجه اطلاعات شما مخدوش بشه.