PDA

View Full Version : سوال: خروجیم درست کار نمیکنه



bmvgod
سه شنبه 25 شهریور 1393, 16:16 عصر
باسلام
برنامه ای به صورت چند تابع نوشتم کلاً به شرح زیر:
1.Enter Data
2. Sort
3. Search
4. Min
5. Max
6. Exit
که با انتخاب هر گزینه کار خاص خودشو انجام بده، ولی درست کار نمیکنه الل خصوص از گزینه 2 به بعد،کدم به صورت زیر:

#include<iostream.h>
#include<conio.h>




int Print_Data(int arr[],int n);
void Bubble_Sort(int arr[],int n);
int Input_Data(int arr[],int n);
int Search_data(int arr[],int n);
int Min_data(int arr[],int n);
int Max_data(int arr[],int n);
void print_menu(int num);
int main()
{
static int arr[100]={0};
int num,n;
char anss;
print_menu(num);
cout<<"Plesse Selact a number: ";
cin>>num;
switch(num)
{
case 1:
Input_Data(arr,n); //break;
case 2:
Bubble_Sort(arr,n); //break;
case 3:
Search_data(arr,n); break;
case 4:
Min_data(arr,n); break;
case 5:
Max_data(arr,n); break;
}
getch();
return 0;
}
int Input_Data(int arr[],int n)
{
char anss;
int i,num;
cout<<"Enter n: ";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"Enter number "<<(i+1)<<" : ";
cin>>arr[i];
}
cout<<"Will do you back to Menu? (y/n) ";
cin>>anss;
if(anss=='y' || anss=='Y')
{
clrscr();
print_menu(num);
cout<<"Plesse Selact a number: ";
cin>>num;


}
return 0;
}
void Bubble_Sort(int arr[],int n)
{
int x,num;
char anss;
for(x=n-1;x>=0;x--)
for(int j=0;j<=x;j++)
{
if(arr[j]>arr[j+1])
{
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
cout<<"Sort Seccsefull."<<endl;
cout<<"Will do you back to Menu? (y/n) ";
cin>>anss;
if(anss=='y' || anss=='Y')
{
clrscr();
print_menu(num);
cout<<"Plesse Selact a number: ";
cin>>num;


}
}
int Print_Data(int arr[],int n)
{
int r;
for(r=0;r<n;r++)
cout<<arr[r]<<" ";
return 0;
}
int Search_data(int arr[],int n)
{
int s,mid,start,end;
start=0;
end=n-1;

cout<<"Enter a number for search: ";
cin>>s;
while(start<=end)
{
mid=(start+end)/2;
if(arr[mid]==s)
{
cout<<"Found at "<<mid;
break;
}
if(arr[mid]<s)
end=mid-1;
else if(arr[mid]>s)
start=mid+1;
}
if(start>end)
cout<<"No found!";
return 0;
}
int Min_data(int arr[],int n)
{
int min;
min=arr[0];
cout<<"Min number is: "<<min;
return 0;
}
int Max_data(int arr[],int n)
{
int max;
max=arr[n-1];
cout<<"Min number is: "<<max;
return 0;
}
void print_menu(int num)
{
cout<<"1.Enter data."<<endl;
cout<<"2.Sort."<<endl;
cout<<"3.Search."<<endl;
cout<<"4.Min."<<endl;
cout<<"5.Max."<<endl;
cout<<"6.Exit."<<endl;
}


میشه راهنماییم کنبد که مشکل کجاست؟
فایل Exe به پیوست میزارم
با تشکر از شما دوستان

مسعود اقدسی فام
سه شنبه 25 شهریور 1393, 18:37 عصر
break های سطرهای 25 و 27 رو از حالت کامنت در بیارید. اون کامنتا باعث می‌شن دستورات داخل case قاطی بشن با هم. یعنی به ازای یک هر سه تا تابع اجرا می‌شن و به ازای ۲ دو تا تابع مرتب‌سازی و جستجو اجرا می‌شن که درست نیست.

n به همه‌ی توابع ارسال می‌شه بدون ایینکه مقدار دهی شده باشه. مقداردهی شدن اون داخل InputData باعث نمي‌شه داخل تابع اصلی هم مقدارش عوض بشه. مگه اینکه به صورت مرجع معرفی کنید:


int Input_Data(int arr[],int &n);

bmvgod
جمعه 28 شهریور 1393, 19:36 عصر
سلام
ممنون از راهنماییتون آدرس دهی تابع Input رو درست کردم ولی کامندارو که برمیدارم بازم درست کار نمیکنه نمیدونم چکار باید بکنم؟
اینم بگم که از کامپایلر Borland ++C استفاده میکنم.

ممنون از راهنمای هاتون

مسعود اقدسی فام
جمعه 28 شهریور 1393, 21:33 عصر
سلام
ممنون از راهنماییتون آدرس دهی تابع Input رو درست کردم ولی کامندارو که برمیدارم بازم درست کار نمیکنه نمیدونم چکار باید بکنم؟
اینم بگم که از کامپایلر Borland ++C استفاده میکنم.

ممنون از راهنمای هاتون

توصیه‌ی اکیدی که اینجور مواقع وجود داره اینه که کدها رو ردیابی کنید. حتی اگه ردیابی کد با استفاده از محیط برنامه‌نویسی رو بلد نیستید به صورت دستی خط به خط توی ذهن خودتون اجرا کنید. شاید حتی اینطوری هم مشکل کار مشخص بشه.

مثلا اینجا اگه کاربر اول یک رو فشار بده ازش عدد n داخل تابع درخواست می‌شه و بعد n تا عدد می‌گیره و می‌پرسه که خارج می‌شی یا نه. خب اگه اینجا n‌ جواب بدم یا y جواب بدم چه فرفی می‌کنه؟ اگه n‌ بزنم مستقیم از تابع خارج می‌شه (که با توجه به سوال n باید خارج نشدن باشه و نه خارج شدن) و اگه y رو بزنم منو رو چاپ می‌کنه و یه گزینه از منو رو می‌پرسه و دوباره خارج می‌شه. پس تحت هر شرایطی از تابع خارج می‌شیم و اون سوالی که پرسیده می‌شه مفهومش مشخص نیست. حالا گیرم که این تیکه رو اصلاح کردید و اگه n وارد شد از تابع خارج نشه. خب خارج نشه و چیکار بکنه؟ دوباره برگرده اول تابع؟ چطور برگرده؟ اگه y بزنه خب بعد اینکه num رو مجدد از کاربر گرفت، باهاش چیکار می‌کنه وقتی که قراره از تابع خارج بشه؟ وقتی که y رو می‌زنه و از تابع خارج می‌شه و به تابع main برمی‌گرده هیچ اتفاق خاصی اونجا هم نمی‌افته و برنامه به خط آخر می‌رسه و تموم می‌شه.
خیلی سوالای دیگه هم هستن که می‌شه پرسید. این سوالا رو بپرسید و اگه اشکالی ازشون در اومد حلشون کنید و برید سراغ سوال بعدی. تازه این اشکالاتی که اینجا مثال زدم از نظر کدزنی هستن. خیلی مسائل دیگه از بابت بهینه کد نوشتن و دقت در مفهوم عملکرد و غیره وجود داره که فعلا مجالی برای صحبت نیست.
همیشه هم مد نظر داشته باشید که کامپیوتر هوش نداره! یعنی تصور نکنید چون شما متوجه چیزی می‌شید کامپیوتر هم حتما می‌شه. همه چیز باید کاملا شفاف و گام به گام طرح‌ریزی و کدزنی بشه.

esmail jamshidi
سه شنبه 22 مهر 1393, 18:29 عصر
کی این برنامه رو نوشته پر از اشتباهه مثلا using namespace std; نداره

shahmohammadi
سه شنبه 22 مهر 1393, 18:56 عصر
کی این برنامه رو نوشته پر از اشتباهه مثلا using namespace std; نداره

اشتباه نیست. از کدوم کامپایلر استفاده می‎کنید؟ خیلی از برنامه های سی ++ هستند که این سطر از کد رو ندارند. و درست کار می‎کنند.

مسعود اقدسی فام
سه شنبه 22 مهر 1393, 21:36 عصر
کی این برنامه رو نوشته پر از اشتباهه مثلا using namespace std; نداره

خط using namespace std حتی زمانی هم که با کامپایلرهای روز و فضای نام std سر و کار دارید لازم و اجباری نیست. چه برسه کامپایلرها و استانداردهای قدیمی مثل چیزی که ایشون استفاده کرده. اتفاقا تا جایی که می‌دونم ++Borland C نوشتن این خط اشتباهه!

bmvgod
یک شنبه 11 آبان 1393, 12:07 عصر
باسلام
منم با نظر آقا مسعود موافقم، چون من با کامپایلر Borland ++C ورژن 5.2 که قدیمی هم هست کار کردم نیازی به این خط کد نیست، که اگه هم بنویسم جواب نخواهد داد، بع من برنامه رو خط به خط تریس کردم ولی متوجه نمیشم که مشکل کار از کجاست؟ بعد من همواره y رو میزنم ولی باز مشکل داره و عمداً n را ننوشتم چون در زمانی که شرط درست برنامه کار نمیکنه.

باتشکر از شما دوستان