PDA

View Full Version : مشکل در اجرای برنامه اعداد استرلینگ نوع دوم



happyfeat
یک شنبه 02 خرداد 1389, 10:57 صبح
با سلام
دوستان این برنامه بعد از کامپایل شدن فایل exe آن به صورت stop working در آمده و برنامه هنگ شده و اجرا نمی شود
لطفا در این زمینه من را راهنمایی نمایید
کد را در زیر قرار دادم

// To be run with arguments n i k. "./stirling.x n k"


#include <iostream>
using namespace std;

unsigned long long int mnozenie = 0;

unsigned long long int stirling(unsigned long long int n, unsigned long long
int k)
{


unsigned long long int a[n][k];
for (int i=0; i<=n; i++){ //clearing the table with zeros
for (int j=0; j<=k; j++){
a[i][j]=0;
};
};

for (int i=0; i<=n; i++){
for (int j=0; j<=k; j++){
if (i<j) a[i][j]=0;
else if (i==j) a[i][j]=1;
else if (j==1) a[i][j]=1;
else if (j==0) a[i][j]=0;
else if ((j<i)&&((!(j==1))&&(!(j==0)))) a[i][j]= (j * a[i-1][j]) + a[i-1][j-1];
cout<<"i: "<<i<<", j: "<<j<<", a[i][j]: "<<a[i][j]<<endl;
};
};


for (int i=0; i<=n; i++){
for (int j=0; j<=i; j++){

cout<<"i: "<<i<<", j: "<<j<<", a[i][j]: "<<a[i][j]<<endl;
};
};



return a[n][k];

}

int main(int argc, char *argv[])
{

unsigned long long int a,b;
int n,k;
n = atoi(argv[1]);
k = atoi(argv[2]);
if ( n < k ) { cout << "N must be grater than k!" << endl; }
cout<<"n: "<<n<<endl<<"k: "<<k<<endl<<"Stirling num: "<<stirling(n,k)<<endl;

return 0;
}

sh4mid
یک شنبه 02 خرداد 1389, 17:30 عصر
سلام
خوب از بالا شروع می کنیم



unsigned long long int mnozenie = 0;
خوب ما اصلا همچنین نوعی نداریم یعنی داریم ولی Standard نیست تو GCC تعریف شده



unsigned long long int a[n][k];
آرایه رو نمی تونی این جوری تعریف کنی یادت باشه که n,k در هنگام اجرا مقداردهی می شوند
اما اینجوری میشه


char (*pchar)[10] = new char[dim][10];
اینجا باید از new یا malloc استفاده کنی



PULL* a=new PULL[n];
for(int i=0;i<n;i++)
a[i]=new ULL[k];

که PULL اینجوری تعریف شده


typedef unsigned long long ULL;
typedef ULL* PULL;

فایده اش اینه که اولا نمی خواهد هر دفعه اون اسم به اون طولانی رو بنویسی
ثانیا فرض کن خواستی با compiler کار کنی که اون داده رو پشتیبانی نمی کرد به جای اونکه بشینی تک تک جملات رو درست کنی یه خط کد بالا رو درست می کنی(وقتی حجم کدت از یه حد معینی گذشت می فهمی :لبخند:)



for (int i=0; i<=n; i++){ //clearing the table with zeros
for (int j=0; j<=k; j++){
a[i][j]=0;
};
};

فرض کن آرایه رو هم ساختیم باید یادت باشه Index آرایه از 0 شروع میشه یعنی الان تو کد بالا تو آخرین دور حلقه دوم (هر دفعه) و کل دور آخر حلقه اول آرایه به جایی اشاره می کنه که نباید اشاره کنه یعنی

,a[n][j],a[i][k] تعریف نشده است انتهایی ترین عضو این Matrix میشه

a[n-1][k-1]این اشتباه رو توی مابقی حلقه ها هم داری
راستی آخر حلقه ها ; نمی خواهد
در مورد منطق برنامه ات خودت امتحانش کن
http://upload.wikimedia.org/math/1/b/7/1b77dc86a2f562b8fac7a2e404f1d8aa.png
http://upload.wikimedia.org/math/c/d/c/cdcaf85c9294a1ba28080b708049b09d.png
اینم تقریبا تصحیح شده کد شما



#include<cstdlib>
#include<cstdio>
#include <iostream>
using namespace std;

typedef unsigned long long ULL;
typedef ULL* PULL;

#define DEBUG


ULL mnozenie = 0;

ULL stirling(ULL n, ULL k)
{

try
{
PULL* a=new PULL[n];
for(int i=0;i<n;i++)
a[i]=new ULL[k];

for (int i=0; i<n; i++)
for (int j=0; j<k; j++)
a[i][j]=0;

for (int i=0; i<n; i++)
for (int j=0; j<k; j++)
{
if (i<j) a[i][j]=0;
else if (i==j) a[i][j]=1;
else if (j==1) a[i][j]=1;
else if (j==0) a[i][j]=0;
else if ((j<i)&&((!(j==1))&&(!(j==0)))) a[i][j]= (j * a[i-1][j]) + a[i-1][j-1];
}
#ifdef DEBUG
for (int i=0; i<n; i++)
{
for (int j=0; j<k; j++)
cout<<a[i][j]<<',';
cout<<endl;
}
#endif

ULL retval=a[n-1][k-1];

for(int i=0;i<n;i++)
delete [] a[i];

delete [] a;

return retval;
}
catch(...)
{
cerr<<"Error";
exit(EXIT_FAILURE);
}

}



int main(int argc, char *argv[])
{
int n,k;
cin>>n>>k;
if ( n < k )
cout << "N must be grater than k!" << endl;

cout<<"n: "<<n<<endl<<"k: "<<k<<endl<<"Stirling num: "<<stirling(n,k)<<endl;
system("PAUSE");
return 0;
}