PDA

View Full Version : سوال: کمک در آرایه ها ی داینامیک در C++‎



Bvk_programmer
جمعه 28 مهر 1391, 16:25 عصر
سلام دوستان من یک برنامه نوشتم که میخوام یک آرایه 100 عنصری رو تعریف کنه و مقادیر رو داخلش قرار

بده بعدش میخوام مثلا یک خانه به آخرین خانه آرایه اضافه کنم و مقدار بهش بدم و در آخر هم میخوام این امکان

رو داشته باشه که وسط آرایه یک خانه اضافه و بقیه خانه ها رو شیفت بدم به سمت راست .


ممنون میشم اگر کمکم کنید . فقط قسمت شیفت دادن و اضافه کردن رو مشکل دارم .


دقیقا همچین چیزی میخوام :


اول یک آرایه تعریف کنم :
http://baxcomputer.ir/up/uploads/13506490701.png


اینم کد این قسمت کد :
int n=5; int Array[n];


cout<<"Entered Number to Array :";
for(int i=0;i<n;i++)


cin>>Array[i];



دوم : یک خانه به آرایه اضافه کنم :
http://baxcomputer.ir/up/uploads/13506490702.png
که متاسفانه کدش رو نمیدونم ؟ ولی میدونم که باید آخرین خانه آرایه را پیدا کنی و بعد بهش یکی اضافه بشه .







سوم اینکه : وسط آرایه هر جایی خواستم یک خانه اضافه کنم و بقیه باید شیف برن به راست ولی کدش رو نمیدونم باز :
http://baxcomputer.ir/up/uploads/13506490703.png



ممنون میشم با توجه به توضیحات این کد رو در اختیار بنده قرار بدید

مسعود اقدسی فام
جمعه 28 مهر 1391, 16:53 عصر
این کدی که نوشتید به [Array[n هیچ خطایی نداد؟ یا امتحان نکردید هنوز؟ این روش تعریف روش تعریف ایستاست، نه پویا یا داینامیک. این پی.ند رو بخونید:


http://www.algorithmha.ir (http://www.algorithmha.ir/post-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D8%A7%DB%8C%D8%B3%D8%AA%D8%A7-%D9%88-%D9%BE%D9%88%DB%8C%D8%A7-%D8%AF%D8%B1-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3.aspx)


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

Bvk_programmer
جمعه 28 مهر 1391, 17:05 عصر
خب عزیز ضمن تشکر بابت راهنمایی ، اگه میشه کدش رو قرار بدید

مسعود اقدسی فام
جمعه 28 مهر 1391, 17:09 عصر
لینک رو خوندید؟

کد چی رو؟ وقتی با این آرایه‌ها اون کارا نمی‌شه، چه کدی؟ مگر اینکه آخر آرایه فضای اضافی تعریف کنید.

Bvk_programmer
جمعه 28 مهر 1391, 21:06 عصر
بیایم یک کاری بکنیم اصلا یک ارایه 100 تایی تعریف کنیم بعد 10تا خانه را پر کنیم بعد در آخر بیایم بگیم در خانه 11 بیا این عدد رو از ورودی بگیر و قرار بده و اما برای شیفت دادن در وسط آرایه این کد رو اگر میشه با ذکر مثال قرار بدید ممنون میشم

omidshaman
شنبه 29 مهر 1391, 13:18 عصر
بیایم یک کاری بکنیم اصلا یک ارایه 100 تایی تعریف کنیم بعد 10تا خانه را پر کنیم بعد در آخر بیایم بگیم در خانه 11 بیا این عدد رو از ورودی بگیر و قرار بده و اما برای شیفت دادن در وسط آرایه این کد رو اگر میشه با ذکر مثال قرار بدید ممنون میشم
1 زوش ساده: مثلا می خوای خانه 2وم ارایه رو بزاری 2
for(i=0;i<20;i++)
b[i]=a[i];

for(i=3;i<20;i++)
a[i]=b[i-1];
a[2]='2';

مسعود اقدسی فام
شنبه 29 مهر 1391, 13:33 عصر
بیایم یک کاری بکنیم اصلا یک ارایه 100 تایی تعریف کنیم بعد 10تا خانه را پر کنیم بعد در آخر بیایم بگیم در خانه 11 بیا این عدد رو از ورودی بگیر و قرار بده و اما برای شیفت دادن در وسط آرایه این کد رو اگر میشه با ذکر مثال قرار بدید ممنون میشم

صحیح است.




for( i = k ; i < n ; i++ )
{
a[i+1] = a[i];
}
a[k] = newNum;




کل اعداد اندیس k‌ به بعد رو یکی کشیدیم جلو. بعد اندیس k‌ رو مقدار دادیم.

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

omidshaman
شنبه 29 مهر 1391, 14:13 عصر
صحیح است.




for( i = k ; i < n ; i++ )
{
a[i+1] = a[i];
}
a[k] = newNum;




کل اعداد اندیس k‌ به بعد رو یکی کشیدیم جلو. بعد اندیس k‌ رو مقدار دادیم.

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


این کد شما اشتباست این جوری این اتفاق میفته که مثلا
می خواهیم اندیس 2به بعد رو یکی بدیم جلو و 2 رو بزاریم مثلا g
خوب با این کار شما داخل ارایه مثلا "ssblue"این اتفاق میفته
عضو 3وم میشه b بعد عضو 4ام بازم میشه b ,... یعنی ارایه تبدیل میشه به "ssbbbb" !! به همین دلیل هم من از 2 تا ارایه استفاده کردم!

مسعود اقدسی فام
شنبه 29 مهر 1391, 14:29 عصر
این کد شما اشتباست این جوری این اتفاق میفته که مثلا
می خواهیم اندیس 2به بعد رو یکی بدیم جلو و 2 رو بزاریم مثلا g
خوب با این کار شما داخل ارایه مثلا "ssblue"این اتفاق میفته
عضو 3وم میشه b بعد عضو 4ام بازم میشه b ,... یعنی ارایه تبدیل میشه به "ssbbbb" !! به همین دلیل هم من از 2 تا ارایه استفاده کردم!

اینم صحیح است. این روزا گیچ می زنم.




for( i= n ; i > k ; i-- )
{
a[i] = a[i-1];
}

a[k] = newValue;





الان درست شد. البته فرض کردم از صفر تا n-1 عناصر قدیم هستن.

mahak006
شنبه 29 مهر 1391, 21:11 عصر
این کدی که نوشتید به [Array[n هیچ خطایی نداد؟ یا امتحان نکردید هنوز؟ این روش تعریف روش تعریف ایستاست، نه پویا یا داینامیک. این پی.ند رو بخونید:


http://www.algorithmha.ir (http://www.algorithmha.ir/post-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D8%A7%DB%8C%D8%B3%D8%AA%D8%A7-%D9%88-%D9%BE%D9%88%DB%8C%D8%A7-%D8%AF%D8%B1-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3.aspx)


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



کد بالا ایراد نداره . چون مقدار n داخل خود کد ها مشخص شده و مقدار از کاربر گرفته نشده .


بیایم یک کاری بکنیم اصلا یک ارایه 100 تایی تعریف کنیم بعد 10تا خانه را پر کنیم بعد در آخر بیایم بگیم در خانه 11 بیا این عدد رو از ورودی بگیر و قرار بده و اما برای شیفت دادن در وسط آرایه این کد رو اگر میشه با ذکر مثال قرار بدید ممنون میشم

راه بعدی استفاده از آرایه های پویا به شکل زیر هست :


int *q;
q=new int [n];
\\تعریف آرایه اولیه به صورت پویا
int *h;
h=new int [++n];
\\آرایه با یک خانه بیش تر
\\اینجا هم بر اساس اینکه قراره خانه جدید بره آخر آرایه باشه یا وسط آرایه ، از آرایه اول با الگوریتم مخصوصش ، مقادیر رو کپی می کنی تو آرایه دوم
delete q;


اگه اشتباهی می بینید ، حتما بگید تا من هم چیزی از شما یاد بگیرم .

مسعود اقدسی فام
شنبه 29 مهر 1391, 23:23 عصر
کد بالا ایراد نداره . چون مقدار n داخل خود کد ها مشخص شده و مقدار از کاربر گرفته نشده .


اجرا کردید و دیدید مشکلی نداره؟ کدوم کامپایلر متغیر n رو که const‌ هم نیست به عنوان تعداد اعضای یه آرایه قبول می‌کنه؟ اگه هست بگید منم بدونم. چون من با اکثر کامپایلرایی که کار کردم همین بوده. یعنی علت جدا شدن استاتیک از داینامیک همینه دیگه. اگه شما بتونی یه متغیر رو به عنوان طول آرایه تعریف کنی دیگه روش پویا رو می‌خوام چیکار؟ لطفا کد رو تست کنید و نتیجه رو بگید.

omidshaman
شنبه 29 مهر 1391, 23:53 عصر
اجرا کردید و دیدید مشکلی نداره؟ کدوم کامپایلر متغیر n رو که const‌ هم نیست به عنوان تعداد اعضای یه آرایه قبول می‌کنه؟ اگه هست بگید منم بدونم. چون من با اکثر کامپایلرایی که کار کردم همین بوده. یعنی علت جدا شدن استاتیک از داینامیک همینه دیگه. اگه شما بتونی یه متغیر رو به عنوان طول آرایه تعریف کنی دیگه روش پویا رو می‌خوام چیکار؟ لطفا کد رو تست کنید و نتیجه رو بگید.
نه مشکلی نداره
کمپایلر :codeblock اخرین ورژن...

mahak006
یک شنبه 30 مهر 1391, 14:03 عصر
اجرا کردید و دیدید مشکلی نداره؟ کدوم کامپایلر متغیر n رو که const‌ هم نیست به عنوان تعداد اعضای یه آرایه قبول می‌کنه؟ اگه هست بگید منم بدونم. چون من با اکثر کامپایلرایی که کار کردم همین بوده. یعنی علت جدا شدن استاتیک از داینامیک همینه دیگه. اگه شما بتونی یه متغیر رو به عنوان طول آرایه تعریف کنی دیگه روش پویا رو می‌خوام چیکار؟ لطفا کد رو تست کنید و نتیجه رو بگید.


نه مشکلی نداره
کمپایلر :codeblock اخرین ورژن...

حق با شماست . من هم با code::blocks امتحان کرده بودم . الآن با ویژوال بیسیک زدم ، ارور داد .

mahak006
یک شنبه 30 مهر 1391, 14:21 عصر
بره آخر آرایه :


int *q;
q=new int [n];
...
int *k;
k=new int[++n];
for (int i=0;i<n-1;i++)
k[i]=q[i];
cin>>k[n-1];
delete q;

بره وسط آرایه :


int *q;
q=new int [n];
...
int *k;
k=new int[++n];
for (int i=0;i<mid;i++)
k[i]=q[i];
cin>>k[mid];
for (int i=mid+1;i<n-1;i++)
k[i]=q[i-1];
delete q;