PDA

View Full Version : مبتدی: تغيير در برنامه نوشته شده



frznh.g
پنج شنبه 16 مهر 1394, 13:12 عصر
با سلام و خسته نباشيد
مي خواهم در برنامه زير كه تمام زيرمجموعه هاي يك مجموعه n عضوي را نمايش مي دهد تغييري ايجاد كنم
خروجي برنامه كه شامل زيرمجموعه ها هست در سطر جداگانه نمايش داده مي شود
مي خواهم هر سطر خروجي در يك خانه آرايه قرار گيرد
چون با دستورات سي بطور كامل آشنايي ندارم با تغييري ك خودم ميدهم برنامه خطا ميدهد


#include <iostream>
using namespace std;
void subset(char adder[],int n)
{
for(int i=0; i<n+1; i++)
adder[i]='0';
do
{
for(int i=1; i<n+1; i++)
{
if(adder[i]=='1')
cout<<i<<" "; (اين خروجي مي خواهم در آرايه قرار گيرد)
}
cout<<endl;
if(adder[n]=='0')
{
adder[n]='1';
}
else
{
int l=n;
while(adder[l]=='1')
{
adder[l]='0';
l--;
}
adder[l]='1';
}
}
while(adder[0]=='0');
}
int main(void)
{
int n;
char* adder;
cout<<"Enter the sumber of elemnets: ";
cin>>n;
adder=new char [n+1];
subset(adder,n);
cin.get();
return 0;
}


براي n=3‌خروجي:
3
2
2 3
1
1 3
1 2
1 2 3
ميخواهم هر سطر در يك خانه آرايه باشد كه بتوانم از عناصر آرايه استفاده كنم
مثلا خانه 4 آرايه شامل 1 3 باشد

ممنون

mohammad0773
جمعه 17 مهر 1394, 15:44 عصر
سلام.من منظورتونو نمیفهمم،شما میخواید یه آرایه داشته باشید که انتها نداشته باشه یا در ذخیره کردن مشکل دارید؟

frznh.g
جمعه 17 مهر 1394, 16:44 عصر
سلام.من منظورتونو نمیفهمم،شما میخواید یه آرایه داشته باشید که انتها نداشته باشه یا در ذخیره کردن مشکل دارید؟

سلام وقت بخير
در ذخيره كردن مشكل دارم. خروجي در آرايه ذخيره شود كه بتوانم بهش دسترسي داشته باشم براي كار ديگه.

در اين برنامه سطر

cout<<i<<" ";
را در خروجي نمايش ميدهد.
ولي من ميخواهم اين خروجي ها در يك آرايه قرار گيرند.
قرار دادنشون توي آرايه رو با دستور مناسب بلد نيستم.
آيا دستور

A[j]=i;
j++;
درست است؟؟
آرايه A را در جاي ديگر برنامه هم بايد معرفي كرد؟ (زيرا اينجوري خطا ميده)

hamedBB
دوشنبه 20 مهر 1394, 14:10 عصر
آيا دستور

A[j]=i;
j++;
درست است؟؟
آرايه A را در جاي ديگر برنامه هم بايد معرفي كرد؟ (زيرا اينجوري خطا ميده)


پاسخ این سوال بستگی به شرایط استفاده ی شما داره. در کدی که شما قرار دادید مقدار i در ایندکس شماره j از آرایه A قرار می گیره. حالا از اینجا به بعد شما فقط مقدار یک متغییر به اسم j را یک واحد اضافه کردید. این در صورتی می تونه به شما کمک کنه که در ادامه باز هم بخواهید از این متغیر به عنوان ایندکس خانه ی بعدی آرایه استفاده کنید. برای مثال کد زیر رو در نظر بگیرید :
[CODE]int a_repetetive_value =10;
int your_array[11];
for(int i = 0 ; i <= 10 ; i++)
{
your_array[i] = a_repetetive_value;
}


این برنامه مقدار 10 رو 11 بار در یک آرایه 11 خونه ای قرار میده. معمولا از این روش برای مقدار دهی اولیه یک آرایه استفاده می کنند. به شکل دیگری هم می توانید این کار رو انجام بدید که استفاده از اشاره گر است که خارج از بحث میشه.

حالا کدی که شما گذاشتید میتونه درست باشه مثلا در سناریو ای مثل این :


int your_array[10];
int some_random_number = 5;
int my_desired_index = 0;
your_array[my_desired_index] = some_random_number;
my_desired_index++;
some_random_number = 8;
your_array[my_desired_index] = some_random_number;


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

mohammad0773
چهارشنبه 22 مهر 1394, 16:07 عصر
سلام.
ببخشید که وقفه توی پاسخام پیش اومد،آخه این هفته سرم خیلی شلوغ بود.
من تونستم برنامه ای رو که میگید با چند تغییر در الگوریتم بسازم ولی نمیدونم چرا همیشه عنصر اول آرایه برابر 0 میشه.اگر دوستان فهمیدن بگن ولی اگر نگفتن شما میتونید در نمایش دادن عناصر با حلقه ،مبدأ رو یک بگیرید.
درضمن این الگوریتم خیلی پیچیده بود !
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
void subset(char adder[],int n)
{
char c[200],cc[20];
int size=pow(2,n),nums[size--],j=0;
for(int i=0; i<n+1; i++)
adder[i]='0';
do
{
for(int i=1; i<n+1; i++)
{
if(adder[i]=='1'){
itoa(i,cc,20);
// cout<<"cc is:"<<cc<<endl;
strncat(c,cc,1);
}
}
nums[j]=atoi(c);
j++;strcpy(c,"");
if(adder[n]=='0')
{
adder[n]='1';
}
else
{
int l=n;
while(adder[l]=='1')
{
adder[l]='0';
l--;
}
adder[l]='1';
}
}
while(adder[0]=='0');
cout<<nums[0];
}
int main(void)
{
int n;
char* adder;
cout<<"Enter the sumber of elemnets: ";
cin>>n;
adder=new char [n+1];
subset(adder,n);
cin.get();
return 0;
}