PDA

View Full Version : مبتدی: چرا خروجیه این برنامه اشتباهه؟



ehsan_faal
شنبه 28 تیر 1393, 00:50 صبح
سلام دوستان.
وقتی ورودی صفره،یه مقدار رندوم هم تو خروجی میاد.به خاطر چیه؟
البته بیشتر منظورم اینه که چه جوری میشه تابع رو تعریف کرد که وقتی قراره عدد صحیح برگردونه ،حالت دیگه ای هم داشته باشه.مثله همین تابه ضرب.

#include <iostream>using namespace std;
long int zarb(int);
long int fact(int);
int main()
{
int j;
cout << "adad:" << "\n";
cin >> j;
cout<<zarb(j)<<"\n";
system("pause");
}
long int fact(int y)
{
if (y == 1)
return 1;
else
return y*fact(y - 1);
}
long int zarb(int b){
if (b != 0)
return fact(b);
else
cout << "Wrong Data\n";
}

alireza es
شنبه 28 تیر 1393, 01:05 صبح
اینو امتحان کن

#include <iostream>
using namespace std;
void zarb(int);
long int fact(int);
int main()
{
int j;
cout << "adad:" << "\n";
cin >> j;
zarb(j);
system("pause");
}
long int fact(int y)
{
if (y == 1)
return 1;
else
return y*fact(y - 1);
}
void zarb(int b){
if (b != 0)
cout<<fact(b);
else
cout << "Wrong Data\n";
}

ehsan_faal
شنبه 28 تیر 1393, 01:08 صبح
یعنی وقتی void تعریف کنم دیگه نمیشه گفت(return fact(b؟

احسان!
شنبه 28 تیر 1393, 01:15 صبح
یعنی وقتی void تعریف کنم دیگه نمیشه گفت(return fact(b؟
نه.
void چیزی بر نمیگردونه.

میشد به جای void کردن تابع توی الس return 0 هم زد.

Delphi Coder
شنبه 28 تیر 1393, 04:11 صبح
وقتی ورودی صفره،یه مقدار رندوم هم تو خروجی میاد.به خاطر چیه؟به خاطر اینه که شما در صورتی که عدد صفر باشه هیچ مقداری return نکردید و فقط توی خروجی یه متن نوشتید بنابراین مقدار بازگشتی یه مقدار نامشخصی هست (احتمالا هر چیزی که eax داره یا یک جای بلااستفاده از استک که مقدار بازگشتی تابع هست که مقدارش هر دفعه تغییر میکنه.)

Coder#
شنبه 28 تیر 1393, 12:39 عصر
سلام. این یه نسخه دیگه از برنامه خودته.
در این دو تابع، اگر مقدار number کمتر از 3 بود، return دوم داخل هر تابع، مقدار number (که 0 یا 1 یا 2 هست) رو ارسال می کنن.
اگر شروط درست باشن، نوبت به return دوم داخل هر تابع نمیرسه، پس فرقی نمی کنه return دوم داخل هر تابع رو داخل شکم یک else قرار بدی یا ندی.

شروط رو بزرگتر یا مساوی 3 قرار دادم چون:
اگر 2 قرار می دادم، در مرحله آخر، 2 منهای 1 می شد که جواب 1 میومد، بنابراین مقدار تا به حال به دست اومده ضرب در 1 می شد که این بی فایده بود چون در اون صورت نه از مقدار کم می شد و نه به مقدار اضافه می شد.
اگر 1 قرار می دادم، در مرحله آخر، 1 منهای 1 می شد که جواب 0 میومد، بنابراین مقدار تا به حال به دست اومده ضرب در 0 می شد که یعنی مقدار نهایی ما 0 می شد.
اگر 0 قرار می دادم، مقدار نهایی 0 می شد.

این دو برنامه باهم فرقی ندارن:

#include <iostream>
#include <stdlib.h>
using namespace std;
int zarb (int number);
int fact (int number);
int main ()
{
int number;
cout << "Enter a number:" << "\n";
cin >> number;
cout << zarb(number) << "\n";
system("pause");
return 0;
}

/* 2nd step - 4th step ... */
int fact (int number)
{
if (number >= 3)
return number * fact(number - 1);
return number;
}

/* 1st step - 3rd step ... */
int zarb (int number)
{
if (number >= 3)
return fact(number);
return number;
}



#include <iostream>
#include <stdlib.h>
using namespace std;
int zarb (int number);
int fact (int number);
int main ()
{
int number;
cout << "Enter a number:" << "\n";
cin >> number;
cout << zarb(number) << "\n";
system("pause");
return 0;
}

/* 2nd step - 4th step ... */
int fact (int number)
{
if (number >= 3)
return number * fact(number - 1);
else
return number;
}

/* 1st step - 3rd step ... */
int zarb (int number)
{
if (number >= 3)
return fact(number);
else
return number;
}

alireza es
شنبه 28 تیر 1393, 19:41 عصر
سلام دوستان.
وقتی ورودی صفره،یه مقدار رندوم هم تو خروجی میاد.به خاطر چیه؟
البته بیشتر منظورم اینه که چه جوری میشه تابع رو تعریف کرد که وقتی قراره عدد صحیح برگردونه ،حالت دیگه ای هم داشته باشه.مثله همین تابه ضرب.

#include <iostream>using namespace std;
long int zarb(int);
long int fact(int);
int main()
{
int j;
cout << "adad:" << "\n";
cin >> j;
cout<<zarb(j)<<"\n";
system("pause");
}
long int fact(int y)
{
if (y == 1)
return 1;
else
return y*fact(y - 1);
}
long int zarb(int b){
if (b != 0)
return fact(b);
else
cout << "Wrong Data\n";
}

ببین تو یه متغیر int رو تعریف کن ،و بدون مقدار دهی اون رو cout کن اون وقت یه متغیر رندم چاپ میشه
تو برنامه تو اگه 0 رو وارد کنیم تابع zarb مقدار دهی نمیشه درحالی که قراره cout بشه C++‎‎‎‎‎‎ چی رو cout کنه؟پس یه عدد رندم رو نمایش میده
دلیلش هم برمیگرده به اصول کار کامپایلر C++‎‎‎‎‎‎ شاید تو یه کامپایلر دیگه این مشکل پیش نیاد(اگه پیش بیاد از نقاط ضعف کامپایلر نیست)
مثلا من تو دلفی امتحان کردم 0 رو نشون میداد.خیلی دوست دارم یکی امتحان کنه ببینه تو java,python,... و مخصوصا C#‎‎‎‎‎‎ چه اتفاقی میافته