PDA

View Full Version : ابهام در کد search که نوشتم



c_doost
جمعه 20 خرداد 1390, 15:36 عصر
void search(){ char ans[21];
cout<<"Enter name for search :"<<endl;
cin>>ans;
ifstream f1("dic.dat",ios::in);
int k=7;
while( f1.read((char *)&translation,sizeof(translate))){
int p;
p=strcmp(translation.enword,ans);
if(p==0){
cout<<translation.id<<"\n";
cout<<translation.enword<<"\n";
cout<<translation.faword<<"\n";
k=1;
}
}
if(k==7)
cout<<"NOT FOUND...."<<endl;
f1.close();
getch();
}

سلام به همه دوستان
من کد سرچ یک رکورد در فایل را از جایی گرفتم و الانم داره درست کار میکنه خواستم دوستان یه توضیح کلی در بارش بدند بخصوص از کاربرد k و اینکه چرا مقدار int k=7; داره

دوستان لطفا توضیحی بدند
با تشکر از همه

c_doost
دوشنبه 23 خرداد 1390, 17:28 عصر
دوستان عزیز خواهشا کمک کنید

با تشکر

rezaricky
دوشنبه 23 خرداد 1390, 20:30 عصر
اگه تمام برنامه رو بذاری بهتر میشه کمک کرد
ولی اونطوری که من فهمیدم اگه k=7 باشه یعنی شرط داخل حلقه ی while اجرا نشده
و مقداری که در ابتدا به k داده شده زیاد مهم نیست مثلا میتونسته بجای 7 هر مقدار دیگه ای بگیره
و توی شرط پایانی هم مقدار k رو بررسی میکنه که تغییر کرده یا نه و اگه تغییر کرده یعنی شرط داخل حلقه while اجرا شده و اگه همون مقدار اولی رو داشت یعنی شرط اجرا نشده

c_doost
دوشنبه 23 خرداد 1390, 22:12 عصر
اگه تمام برنامه رو بذاری بهتر میشه کمک کرد
ولی اونطوری که من فهمیدم اگه k=7 باشه یعنی شرط داخل حلقه ی while اجرا نشده
و مقداری که در ابتدا به k داده شده زیاد مهم نیست مثلا میتونسته بجای 7 هر مقدار دیگه ای بگیره
و توی شرط پایانی هم مقدار k رو بررسی میکنه که تغییر کرده یا نه و اگه تغییر کرده یعنی شرط داخل حلقه while اجرا شده و اگه همون مقدار اولی رو داشت یعنی شرط اجرا نشده
یعنی من میتونم جای قرار دادن 7 در k هر مقدار دیگری مثلا اگر پیدا شد 1 اگر پیدا نشد 0 قرار بدم و if را هم طبق همین بدست آرم ؟

rezaricky
دوشنبه 23 خرداد 1390, 23:22 عصر
یعنی من میتونم جای قرار دادن 7 در k هر مقدار دیگری مثلا اگر پیدا شد 1 اگر پیدا نشد 0 قرار بدم و if را هم طبق همین بدست آرم ؟
اره تا جاییکه که از کد میشه فهمید

quiet_programmer
سه شنبه 24 خرداد 1390, 13:56 عصر
با سلام

همنطور که جناب rezaricky (http://barnamenevis.org/member.php?145434-rezaricky) فرمودند این متغیر برای اینکه بعد از اتمام خواندن فایل شما بتونین تشخیص بدین که کلمه مورد نظر تو فایل پیدا شد یا نه. در صورتی که کلمه از فایل پیدا نشه هیچگاه دستوری که باعث انتساب عدد 1 به متغیر k میشه اتفاق نمیوفته و حلقه کار خودش رو با مقدار k برابر 7 به اتمام میرسونه. واسه خاطر همین بعد از اتمام حلقه برسی میکنه که آیا مقدار k برابر 7 هست. که اگه آره یعنی کلمه تو فایل پیدا نشده. در صورتی هم تو حلقه خواند از فابل و مقایسه کلمه در صورتی که کلمه پیدا بشه دستور k=1 اجرا میشه و مقدار k که 7 بود رو به مقدار یک تغییر میده و در نهایت حلقه کارش رو با k مساوی یک به اتمام میرسونه. در نتیجه k هم دیگه برابر 7 نیست و بدین معنی که کلمه تو فایل پیدا شده.

برای اینکه خوانایی برنامه رو بالا ببری میتونی به این شکل عمل کنی. کد خودته ولی با خوانایی بهتر.

void search()
{
char ans[21];
cout<<"Enter name for search :"<<endl;
cin>>ans;
ifstream f1("dic.dat",ios::in);
bool WordExist=false;
while( f1.read((char *)&translation,sizeof(translate)))
{
int p;
p=strcmp(translation.enword,ans);
if(p==0)
{
cout<<translation.id<<"\n";
cout<<translation.enword<<"\n";
cout<<translation.faword<<"\n";
WordExist=true;
}
}
if(WordExist==false)
cout<<"NOT FOUND...."<<endl;
f1.close();
getch();
}

c_doost
سه شنبه 24 خرداد 1390, 14:44 عصر
با سلام

همنطور که جناب rezaricky (http://barnamenevis.org/member.php?145434-rezaricky) فرمودند این متغیر برای اینکه بعد از اتمام خواندن فایل شما بتونین تشخیص بدین که کلمه مورد نظر تو فایل پیدا شد یا نه. در صورتی که کلمه از فایل پیدا نشه هیچگاه دستوری که باعث انتساب عدد 1 به متغیر k میشه اتفاق نمیوفته و حلقه کار خودش رو با مقدار k برابر 7 به اتمام میرسونه. واسه خاطر همین بعد از اتمام حلقه برسی میکنه که آیا مقدار k برابر 7 هست. که اگه آره یعنی کلمه تو فایل پیدا نشده. در صورتی هم تو حلقه خواند از فابل و مقایسه کلمه در صورتی که کلمه پیدا بشه دستور k=1 اجرا میشه و مقدار k که 7 بود رو به مقدار یک تغییر میده و در نهایت حلقه کارش رو با k مساوی یک به اتمام میرسونه. در نتیجه k هم دیگه برابر 7 نیست و بدین معنی که کلمه تو فایل پیدا شده.

برای اینکه خوانایی برنامه رو بالا ببری میتونی به این شکل عمل کنی. کد خودته ولی با خوانایی بهتر.

void search()
{
char ans[21];
cout<<"Enter name for search :"<<endl;
cin>>ans;
ifstream f1("dic.dat",ios::in);
bool WordExist=false;
while( f1.read((char *)&translation,sizeof(translate)))
{
int p;
p=strcmp(translation.enword,ans);
if(p==0)
{
cout<<translation.id<<"\n";
cout<<translation.enword<<"\n";
cout<<translation.faword<<"\n";
WordExist=true;
}
}
if(WordExist==false)
cout<<"NOT FOUND...."<<endl;
f1.close();
getch();
}

از نوع بول ایراد میگیره

undefined symbol ' bool'

quiet_programmer
سه شنبه 24 خرداد 1390, 18:41 عصر
با سلام. پس کامپایلری که شما دارین استفاده میکنید نوع داده بولین رو ساپورت نمیکنه. برای حل این مشکل این کا رو انجام بده.

توخط اول برنامه تعریفهای زیر رو اضافه کن

#define true 1
#define false 0

بعد نوع داده بول رو int در نظر بگیر.

c_doost
سه شنبه 24 خرداد 1390, 20:00 عصر
#define true 1
#define false 0


به این حالت در خط اول برنامه اضافه کردم


int WordExist=false; به این صورتم int تعریف کردم ولی چرا اینطوری تعریف شده ؟

quiet_programmer
سه شنبه 24 خرداد 1390, 20:43 عصر
با سلام.

همونطور که همه ما میدونیم در c و ++c مقدار صفر به عنوان flase مقدار غیر صفر به عنوان true می باشد. مثلا حلقه (1)while یعنی حلقه دائمی و حلقه (0)while یعنی اینکه حلقه هیچگاه اجرا نشه. ولی خوانایی کد پاینه و صفر یک میتونه برای کاربری که با زبانهای دیگه همچون vb و پاسکال و ... کار کرده قابل درک نباشه. از طرفی کامپایلر c که این نوع داده یعنی bool رو اصلا پشتیبانی نمیکنه و بعضی از کامپایلرهای ++c هم به این شکل.

برای حل این مشکل دوتا ثابت در نظر میگیریم به اسم true با مقدار 1 و دیگری به اسم false با مقدار صفر که انگار نوع داده بولی رو پیاده سازی کردیم.

بنابراین میتونیم تعریف زیر رو داشته باشم.
برای ایجا حلقه نامتناهی while(tue);l برای اینکه حلقه اصلا اجرا نشود while(false);l قابل اجرا است.