الگوریتمستان

برنامه‌نویسی، طراحی الگوریتم و حل مسئله‌های الگوریتمی

 
در صورت ناخوانا بودن نوشته‌ها، از مرورگر دیگری استفاده کنید.
آرایه‌ی ایستا و پویا در ++C - الگوریتمستان
الگوریتمستان
  »  

آرایه‌ی ایستا و پویا در ++C

        آشنایی با آرایه‌ی پویای یک بعدی و کاربردهای آن در زبان برنامه‌نویسی ++C
آنچه می‌خوانید ویراست جدید نوشته‌ای است که اولین بار با عنوان «آرایه ایستا و پویا در ++C» خرداد ماه ۱۳۸۵ از طریق وبگاه برنامه‌نویسی و طراحی الگوریتم (عنوان و طرح پیشین وبگاه الگوریتمستان) منتشر شده بود.

زبان ++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;

  

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

به اشتراک‌گذاری نوشته
اشتراک‌گذاری در LinkedIn     Cloob     اشتراک‌گذاری در Twitter     اشتراک‌گذاری در Facebook     ارسال با Telegram     Google Plus
امتیاز نوشته
  • 1
  • 2
  • 3
  • 4
  • 5

نام: *  

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

وبگاه:

متن پیام: *

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

 


• حامد
جمعه، ۲۰ فروردین ماه ۱۳۸۹، ساعت ۱۴:۱۰

با سلام

میخواستم همین روش را برای آرایه های دو بعدی توضیح دهید یعنی هر دو بعد متغیر باشند .

واینکه من میخواهم برنامه ای بنویسم ونتیجه محاسبات در یک آرایه ریخته شود.وتعداد محاسبات معلوم نیست یعنی طول  آرایه دائم تغییر میکند لطفآراهنمایی کنید  

جمعه، ۲۰ فروردین ماه ۱۳۸۹، ساعت ۱۶:۱۶
مسعود اقدسی‌فام

درباره آرایه پویای دو بعدی مطلب جداگانه ای نوشته شده.

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

البته در این زبان شما می تونید به اندیسهای بالاتر از تعریف آرایه هم داده بنویسید (آرایه ها و اشاره گر به حافظه رابطه نزدیکی با هم دارن). اما با توجه به اینکه اون محل حافظه برای آرایه رزرو نشده، ممکنه برنامه دیگه ای روی همون محل داده وارد کنه، و در نتیجه اطلاعات شما مخدوش بشه.


• حامد
جمعه، ۷ خرداد ماه ۱۳۸۹، ساعت ۰۰:۳۰

سلام . لطف می کنید مفهوم حافظه پوبا و ایستا رو در ساختمان داده ها بگید . و انواع ساختمان داده ها که با این روش ذخیره می شود


• narmin
چهارشنبه، ۱۲ خرداد ماه ۱۳۸۹، ساعت ۱۱:۲۰

سلام میخواستم برنامه ی زمانبندی RR(round robin) را با صفها در C  یا    C++بنویسم اما نمی دونم چطور؟ با آرایه ها زمان ورود و اجرا وکوانتوم رو بگیرم یا یک ساختمان تعریف کنم؟و چطوری فرایندها رو اجرا کنم؟ لطفا بهم کمک کنید خیلی واجبه .


• مریم
جمعه، ۳۰ اردیبهشت ماه ۱۳۹۰، ساعت ۲۲:۱۴

برنامه ای که یک مقداری رو بگیره و به 4 روش که در کتاب سیستم عامل اومده حافظه تخصیص بده به هر زبان دلخواه

خواهش می کنم کمک کنید

واسه یه بنده خدایی که خیلی به نمره ی این برنامه احتیاج داره.

مطمئنم دعاتون می کنه.

خدا خیرتون بده

منتظر جوابتون هستم


• سعيد
چهارشنبه، ۱۳ شهریور ماه ۱۳۹۲، ساعت ۱۸:۰۳

سلام من كد الگوريتم تخصيص حافظه بست فيت رو به زبان سي پلاس پلاس ميخوام تا بتونم شبيه سازي كنم خواهش ميكنم كمكم كنيد


• بهار
چهارشنبه، ۱ آبان ماه ۱۳۹۲، ساعت ۱۲:۰۴

سلام

.من بايد با ديوسي پلاس پلاس  يه الگوريتم پويا بنويسم كه بتونه با توجه به فايل ورودي  كه يه گرامري از زبان نظريه زبان ها و اتوماتا هست و يه جمله اي كه بهش ميدم در كمترن زمان ممكن برام مشخص كنه ايا جمله در اين گرامر صدق مي كند يا نه؟گرامر و جملات مهم نيست فقط الگوريتمش چه جوري بايد باشه؟خواهش مي كنم كمكم كنيد


• حسین
جمعه، ۲۲ آذر ماه ۱۳۹۲، ساعت ۱۱:۴۸

سلام می شه الگویتم گرامر رو که توی درس نظریه زبان هاست بزارین؟

ممنون!!


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

ممنون


• rezaiy
پنجشنبه، ۲۵ دی ماه ۱۳۹۳، ساعت ۲۳:۰۶

با سلام و تشکر فراوان

ببخشید یه سوال داشتم اگه امکانش هست جوابشو واسم ایمیل کنین

اگر در ++c  داده استاتیک رو در قسمت proptect کلاس تعریف کنیم چه اتفاقی مییوفته

روش تعریف این متغیر و مقدار دهیش چطوریه؟

و داده های استاتیک در کلاس به چند روش فراخوانی میشن؟

خیلی ممنون میشم اگه بشه زود جواب بدین امتحان دارم


• A
یکشنبه، ۲۲ آذر ماه ۱۳۹۴، ساعت ۱۷:۱۷

سلام...

ممنون از مطلب خوبتون...

آیا این امکان هم وجود داره که داخل یک استراکچر حافظه پویا تخصیص بدیم؟!

میشه کمی راهنمایی کنید؟!10

ممنون...


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

1313141414


• وحید
چهارشنبه، ۱۶ اسفند ماه ۱۳۹۶، ساعت ۱۴:۲۵

ممنون. واقعا خیلی به درد بخور و فوق العادو بود. 0606


• اسرا
شنبه، ۱۹ آبان ماه ۱۳۹۷، ساعت ۱۳:۰۱

05050505


الگوریتمستان در تلگرام

   

   

پیوند کوتاه: عمر نوشته:  ۳۴۹۱ روز
تعداد بازدید:  ۵۳۴۷۱ بازدید
تعداد امتیاز:  ۶۸ امتیاز
میانگین امتیاز:  ۴.۲۵  از  ۵.۰۰
»  نکته‌ای در مورد کلاس‌ها و مجموعه‌ها در ++C
        بررسی روش تعریف کلاس برای قابلیت استفاده از ظرف‌های مجموعه (set و unordered_set) در زبان برنامه‌نویسی ++C
»  sync_with_stdio در زبان ++C
        نکته‌ای در مورد کارایی عملیات ورودی و خروجی در زبان برنامه‌نویسی ++C و عملکرد تابع sync_with_stdio
»  نکته‌ای در محاسبه‌ی زمان اجرای کد
        در مورد تفاوت توابع clock و time در زبان برنامه‌نویسی ++C برای محاسبه‌ی زمان اجرای برنامه
»  هدر فایل bits/stdc++.h
        معرفی هدرفایل bits/stdc++.h برای کاهش زمان آماده شدن کد مسابقات برنامه‌نویسی
»  نکته‌ای از مسأله‌ی Graphical Editor
        استفاده از stringstream در حل سوالات مسابفات برنامه‌نویسی با زبان برنامه‌نویسی ++C
»  تابع popen
        روش اجرای برنامه‌ای دیگر داخل کد ++C و استفاده از خروجی آن
»  ظرف‌ها در ++C
        معرفی انواع ظرف‌ها (نگهدارنده‌ها - containers) در زبان برنامه‌نویسی ++C
»  نکته‌ای در استفاده از map
        نکته‌ای در مورد استفاده از ساختمان داده‌ی map با مثالی به زبان برنامه‌نویسی ++C
»  فایل سرآیند algorithm
        معرفی فایل سرآیند algorithm از کتابخانه قالب استاندارد زبان برنامه‌نویسی ++C به همراه نمونه کد
»  کلاس‌های حافظه در ++C
        آشنایی با کلاس‌های حافظه و کاربرد آنها در زبان ++C
»  حلقه‌های تکرار در ++C
        آشنایی با حلقه‌های تکرار در زبان برنامه‌نویسی ++C و دستورات کنترلی مورد استفاده در آن
»  نکات مهم در برنامه‌نویسی به زبان ++C
        پنج نکته‌ی آموزنده در مورد برنامه‌نویسی به زبان برنامه‌نویسی ++C
»  توابع دوست کلاس در ++C
        آشنایی با توابع دوست کلاس در زبان برنامه‌نویسی ++C و کاربرد آنها در سربارگذاری عملگرها
»  سربارگذاری عملگرها در ++C
        آشنایی با مفهوم سربارگذاری عملگرها در زبان ++C