توضیح سورس برنامه

valii

New Member
سلام دوستان
منم مثل خیلی ها اول راه برنامه نویسی ام

کسی میتونه این برنامه جستجوی دودوی به زبان سی رو واسه من تشریح کنه ، یعنی خط به خط توضیح بده که چی به چیه ؟

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

int binarySearch(int arr[], int len, int pat)
{
int mid, low=0, high=len-1;
while(low<=high)
{
mid=(low+high)/2;
if(pat<arr[mid])
high=mid-1;
else if(pat>arr[mid])
low=mid+1;
else
return mid;
}
return -1;
}

//end
 

turtel

Member
توضیح

int binarySearch(int arr[], int len, int pat)
ما در این برنامه یک تابع binarySearch داریم که مقداری را بر می گرداند که از نوع int است اگر void بود مقداری را بر نمی گرداند .خوب ما پارامتر هایی را داریم :int arr[], int len, int pat که :int arr[] از نوع آرایه و بقیه از نوع متغییر هستند ///
int mid, low=0, high=len-1; در این کد ما مقدار می دهیم و سه متغییرhighو mid, low را برابر صفر قرار دادیم .که مقدار high را برابر پارامتر len قرار دادیم که اگر ما آرگومان را برای len دریافت کردیم -1 میکند .
while(low<=high) در اینجا یک حلقه تکرار است که low باید کوچکتر و مساوی high شود که ما مقدار high مساوی آرگومان دریافتی قرار دادیم .اگر این حلقه درست باشد شرط حلقه که درون بدنه است تکرار می شود.
شرط حلقه
mid=(low+high)/2;
if(pat<arr[mid])
high=mid-1;
else if(pat>arr[mid])
low=mid+1;
else
return mid;

اولین خط ما مقدار mid را از جمع low+ high تقسیم بر 2 می کند .
یک شرط if در حلقه است که می گوید pat کوچکتر است اندیس =mid در آرایه arr شود high برابر شود با midمنهای 1 و
اگر یک چیز دیگر با شرط کاربر شد else if(pat>arr[mid]) : pat کوچکتر است اندیس =mid در آرایه arr شود high برابر شود low مساوی mid +1 شود .اگر نشد( نه شرط if , else if ) مقدار mid را بر گرداند با دستور return
,
///return mid

و دستور آخر while به برگرداننده دستور return -1; می پردازد /////////
دیگه به این جامعی نیست >
 

valii

New Member
تشکر فراوان turtel عزیز ، خیلی عالی بود

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

راستی یه سری الگوریتم دیگه هم پیاده سازی شده دارم اگه کسی خواست بگه براش بذارم


اینم از برنامه نویسی الگوریتم کروسکال


#include<stdio.h>
#include<conio.h>

void sort (int X[][3])
{
int i,j,k,r;
float m;
for(j=0;j<10;j++)
for(i=0;i<8;i++)
if(X[2]>X[i+1][2])
{
for(k=i;k<8;k++)
for(r=0;r<3;r++)
{
if(k==7)
continue;
else
{
m=X[k][r];
X[k][r]=X[k+1][r];
X[k+1][r]=m;
}
}
}
}
void main()
{
int M[8][3]={{0,1,10},{0,2,5},{0,4,40},{1,2,15},{1,3,25},{2,3,30},{2,4,20},{3,4,5}};
int N[4][2]={{-1,-1},{-1,-1},{-1,-1},{-1,-1}};
int S[5]={0,1,2,3,4};
int i,j,sum=0,p,q;
printf("+++++++++++++++++\n");
printf("* is prototype *\n");
printf("+++++++++++++++++\n\n");
printf("first point start from node \'0\'\n\n");
printf("relating betwin node:\n");
for(i=0;i<8;i++)
{
for(j=0;j<3;j++)
printf(" %d",M[j]);
printf("\n");
}
sort(M);
printf("===================================\n");
printf("if you ready type \'y\'\n");
getch();
printf("===================================\n");
printf("\nsort by longest:\n");
for(i=0;i<8;i++)
{
for(j=0;j<3;j++)
printf(" %d",M[j]);
printf("\n");
}
for(i=0;i<4;i++)
{
p=M[0];
q=M[1];
if(S[p]!=S[q])
{
N[0]=p;
N[1]=q;
}
sum+=M[2];
for(j=0;j<8;j++)
if(S[j]==S[q])
S[j]=S[p];
}
printf("\n n: point of start line & m: end of line\n");
printf("\nn\tm\n");
printf("________________\n");
for(i=0;i<4;i++)
{
printf("%d\t%d",N[0],N[1]);
printf("\n");
}
printf("\nsumation of yals: %d",sum);
printf("\n\n");

}



با تشکر قبلی !
 

turtel

Member
الگوریتم کروسکال

سلام خوب
void sort (int X[][3])
{
ما یک تابع void داریم که مقداری را برنمی گرداند تابع ما یک پارامتر دارد int X[][3 در آرایه مثل t[2][3]
t[2] یعنی سطر و [3] یهنی ستون وخوب آرایه اول ما خالی است زیرا لازم نیست سطر به صورت صریح بیان شود .

int i,j,k,r;
float m; ما در اینجا متغییر هایی را تعریف می کنیم .
ما دو حلقه for :
for(j=0;j<10;j++)
for(i=0;i<8;i++)
استفاده کرده است که jاز صفر شروع و شرط حلقه این است که کوچکتر از 10 باشد و در آخر حلقه پیش رود و حلقه دوم هم به این صورت .
حلقه ای شرط گذاشتیم که اگر if(X[2]>X[i+1][2]) یعنی سطر های ما i و 2 ستون اگر بزرگتر از
در اینجا i+1 میکند برای سطر و 2 ستون شد
X[i+1][2

حلقه for اجرا شود :>> ************for(k=i;k<8;k++)
for(r=0;r<3;r++)*************



if(k==7)
continue;
else
{
m=X[k][r];
X[k][r]=X[k+1][r];
X[k+1][r]=m;
}
}
}
}
در اینجا اگر k ما برابر 7 شد continue; اجرا می شود یعنی این دستور باعث می شود هر دستوری بعد ازcontinue چشم پوشی کند ولی اگر نشد m=X[k][r];
X[k][r]=X[k+1][r];
X[k+1][r]=m
اجرا می شود که در اینجا حلقه for :for(k=i;k<8;k++)
for(r=0;r<3;r++)*************
مهم است چون else ما طبق حلقه بالا تکرار می شود .


void main()
{
int M[8][3]={{0,1,10},{0,2,5},{0,4,40},{1,2,15},{1,3,25},{2,3 ,30},{2,4,20},{3,4,5}};
int N[4][2]={{-1,-1},{-1,-1},{-1,-1},{-1,-1}};
int S[5]={0,1,2,3,4};
int i,j,sum=0,p,q;
printf("+++++++++++++++++\n");
printf("* is prototype *\n");
printf("+++++++++++++++++\n\n");
printf("first point start from node \'0\'\n\n");
printf("relating betwin node:\n");
for(i=0;i<8;i++)
{
for(j=0;j<3;j++)
printf(" %d",M[j]);
printf("\n");
}
حالا تابع اصلی اجرا می شود که ما یک آرایه
int M[8][3]={{0,1,10},{0,2,5},{0,4,40},{1,2,15},{1,3,25},{2,3 ,30},{2,4,20},{3,4,5}};
که از 8 سطر و 3 ستون و
int N[4][2]={{-1,-1},{-1,-1},{-1,-1},{-1,-1}};
آرایه n که از 4 سطر و 2 ستون ساخته می شود .
int S[5]={0,1,2,3,4};
و متغییر s که از 5 آرایه تشکیل شده است .
int i,j,sum=0,p,q; و در اینجا ما به متغییر i,j,sum آرگومان صفر می دهیم و دو متغییر p, q را از نوع int معرفی می کنیم .
printf("+++++++++++++++++\n");
printf("* is prototype *\n");
printf("+++++++++++++++++\n\n");
printf("first point start from node \'0\'\n\n");
printf("relating betwin node:\n");
for(i=0;i<8;i++)
{
for(j=0;j<3;j++) تا اینجا که معلوم است .
printf(" %d",M[j]); ما چاپ می کنیم یه مقدار اعشاری از آرایه که سط و ستون ما بر اساس for(i=0;i<8;i++)
for(j=0;j<3;j++) باشه
در اینجا تابع را فرا می خوانیم با آرگومان آرایه M sort(M);

printf("===================================\n");
printf("if you ready type \'y\'\n");
getch();
printf("===================================\n");
printf("\nsort by longest:\n");
for(i=0;i<8;i++)
{
for(j=0;j<3;j++)
printf(" %d",M[j]);
printf("\n");
} تا اینجا هم دیگه بحثی ندارد معلومه !!!

for(i=0;i<4;i++)
{
p=M[0];
q=M[1];
اگر حلقه ما بر معیار بالا شود آرایه های ما p=M[0];
q=M[1 شود و در این حلقه حلقه if قرار دارد و بر حلقه for حلقه شرط را گذاشته که :اگر
if(S[p]!=S[q])
{
N[0]=p;
N[1]=q;
}
sum+=M[2];
for(j=0;j<8;j++)
if(S[j]==S[q])
S[j]=S[p];
}
if(S[p]!=S[q]) اگر آرایه S با مقدار p برابر نشد با آریه S با مقدار q بدنه اجرا شود .
و در اخر printf("\n n: point of start line & m: end of line\n");
printf("\nn\tm\n");
printf("________________\n");
for(i=0;i<4;i++)
{
printf("%d\t%d",N[0],N[1]);
printf("\n");
}
printf("\nsumation of yals: %d",sum);
printf("\n\n");
}
این هم معلوم است دیگه فکر کنم توضیحی دیگر بر این عنوان نخواهد .بای
ممنون از مطالعلتم .

777.jpg



 
آخرین ویرایش توسط مدیر:

valii

New Member
بی نهایت ممنون
شما که اینقدر مهندسی . ما این الگوریتم دایجسترا رو داریم اما خروجی نداره
الان که داشتم نگاش میکردم گفتم شاید به خاطر اینکه main رو از نوع void تعریف کردن خروجی نداره
حالا شما هم یه زحمتی بکشید ببینیم چرا خروجی نداره ؟

#include<stdio.h>

int minimum(int M[4])
{
int i,m;
m=M[1];
for(i=1;i<5;i++)
if(M<m)
m=M;
return m;
}
void main()
{
int A[5][5]={{0,70,99,45,10},{99,0,25,99,99},{35,99,0,10,99},{99,40,35,0,99},{99,65,10,30,0}};
int L[4];
int I[4]={{0}};
int min,MinIndex,i,j,k;
printf("+++++++++++++++++\n");
printf("* is prototype *\n");
printf("+++++++++++++++++\n\n");
printf("first point start from node \'0\'\n\n");
printf("relating betwin node:\n");
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(A[j]>9)
printf("%d ",A[j]);
else
printf("%d ",A[j]);
}
printf("\n");
}
printf("\n Distance other point of \'0\'\n");
printf("===================================\n");


for(i=0;i<5;i++)
{
for(j=1;j<5;j++)
L[j-1]=A[j];

for(j=0;j<4;j++)
printf("%d, ",L[j]);

min=minimum(L);
printf("\n\min:*%d\*",min);
for(j=0;j<4;j++)
if(L[j]==min)
MinIndex=j;

for(j=0;j<4;j++)
if((L[MinIndex]+A[MinIndex][j])<L[j])
{
L[j]=(L[MinIndex]+A[MinIndex][j]);
I[j]=MinIndex;
}
L[MinIndex]=-1;
printf("\npath: \n");
printf("________________\n");

}
for(j=0;j<4;j++)
if(j==3)
printf("%d",I[j]);
else
printf("%d, ",I[j]);

}

ممنونم
 

valii

New Member
الگوریتم کروسکال
اگه توجه کرده باشین تو اجرای الگوریتم کروسکال نود هایی که با هم تشکیل حلقه میدن رو نباید انتخاب شه اما تو این برنامه اخرین دو نود که انتخاب میشه باعث میشه تشکیل حلقه بدن برای همین نباید انتخاب بشه و بره نود بعدی رو بررسی کنه ، تو تصویری که جناب turtel گذاشتن هم میبینید که اخرین دو نود چاپ شده 1- هستش (یعنی دو تا نود بودن که تشکیل حلقه میدادن به خاطر همین جاش 1- گذاشته )، من میخوام اینو چاپ نکنه و بره نود بعدی رو چاپ کنه ، هر کاریش میکنه نمیشه ، اگه کسی اینجا میتونه این مشکل رو رفع کنه دریغ نکنه ممنون میشم

باتشکر قبلی
 

valii

New Member
مهندسین برنامه نویس کسی نتونست راه حلی واسه این مشکل ما پیدا کنه ؟؟؟
 

جدیدترین ارسال ها

بالا