PDA

View Full Version : تابع عملگر بعلاوه



alirah84
یک شنبه 05 آذر 1391, 11:42 صبح
دوستان من یه سوال دارم در مورد برنامه زیر،توی Main مگه ما نباید temp رو مساوی a+b قرار بدیم؟چون ما توی تابع اپراتور temp رو ایجاد کردیم و a و b ها رو باهم جمع کردیم و در خروجی برگردوندیم،پس نباید توی main هم temp رو بجای c مساوی a+b قرار بدیم؟

CVector CVector::operator+ (CVector vector)
{
CVector temp;
temp.x = x + vector.x;
temp.y = y + vector.y;
return temp;
}
int main ()
{
CVector a (3,1);
CVector b (1,2);
CVector c,d;
c = a + b;
a.showCVector();
cout << "+";
b.showCVector();
cout << "=";
c.showCVector();

shahmohammadi
یک شنبه 05 آذر 1391, 13:19 عصر
سلام.
نه، چون حوضه ي تعريف تمپ در داخل تابع هست نه در مين. تمپ مي ره به خروجي، و هر متغيري كه در خروجي اونو بخاد (مثله c) مقدارشو مي گيره.

مسعود اقدسی فام
یک شنبه 05 آذر 1391, 13:29 عصر
فرض کنیم یه جای برنامه شما از یه تابع ریاضی مثل sqrt استفاده می‌کنی و می‌نویسی (y = sqrt(x.

شما خبر داری که داخل این تابع اسم متغیری که به عنوان جذر عدد برگشت داده شده y بوده که y نوشتی؟ مثلا (c = sqrt(x می‌نوشتید جواب نمی‌داد؟

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

alirah84
یک شنبه 05 آذر 1391, 14:56 عصر
ممنون بابت جوابها
یه سوال دیگه هم هست در مورد تابع عملگر تقسیم.هرچی سعی میکنم تا از این مسئله یه چی ازش سر در بیارم متوجه نمیشم،دوستان اگه میشه داخل تابع تقسیم رو ریز به ریز برام توضیح بدید که چی داخلش اتفاقی میفته.
این برنامه رو استادمون سر کلاس نوشته،اصلا درسته ؟


class reshte
{
char s[10];

public:
void input();
int operator / (char);
};
void reshte ::input()
{
cin.get(s,10);
}
int reshte:: operator / (char ch)
{
int t=0;
while (*s)
{
if (*s==ch)
{
t++;
s++;
}
}

}
int main()
{
char c;
int t;
reshte s1;
s1.input();
cin>>c;
t=s1/c;
cout<<t;
}

مسعود اقدسی فام
یک شنبه 05 آذر 1391, 15:37 عصر
فکر کنم خط آخر تابع رو جا انداخنی و البته ++s بیرون if هستش.




int reshte:: operator / (char ch)
{
int t=0;
while (*s)
{
if (*s==ch)
{
t++;
}
s++;
}
return t;

}





این عملگر تعداد تکرار یه کاراکتر داخل رشته رو محاسبه می‌کنه. دقت کنی از اول عبارت رشته‌ای شروع می‌کنه و یکی یکی پیش می‌ره جلو و هر وقت برابر اون کاراکتر بود به t یکی اضافه می‌کنه.
البته این تابع یه اشکال بزرگ داره و اون اینکه s نمی‌تونه زیاد و کم بشه. چون اول کلاس به صورت یه آدرس ثابت آرایه‌ی کاراکتری تعریف شده. باید کدی به این شکل نوشته بشه:




int reshte:: operator / (char ch)
{
int t=0;
char *temp = s;
while (*temp)
{
if (*temp==ch)
{
t++;
}
temp++;
}
return t;

}




این temp رو می‌شه کم و زیاد کرد. ولی s رو نمی‌شه تغییر داد. هر کامپایلری که من دیدم اینطور بوده. درستش هم همینه که نشه عوضش کرد. چون اگه عوض بشه آدرس شروع آرایه ممکنه از دست بره و بحث تخصیص و آزاد سازی حافظه توسط خود برنامه مختل شه.

alirah84
یک شنبه 05 آذر 1391, 17:44 عصر
وقتی مثلا میگیم
;[int p[10
،منظور اینه که 10 تا متغیر داریم که میتونیم یه مقداری به به هرکودومشون نسبت بدیم:

p[0]=2
p[1]=5
p[2]=4
و تا آخر به همین ترتیب
ولی موقعی که مثلا میگیم :
[char s[10
چرا یه متغیر درست میشه که داخلش 10 تا کاراکتره؟مگه نباید 10 تا متغیر داشته باشیم که داخل هرکدومش رو به یک کاراکتر نسبت بدیم؟

مسعود اقدسی فام
یک شنبه 05 آذر 1391, 17:58 عصر
وقتی مثلا میگیم
;[int p[10
،منظور اینه که 10 تا متغیر داریم که میتونیم یه مقداری به به هرکودومشون نسبت بدیم:

p[0]=2
p[1]=5
p[2]=4
و تا آخر به همین ترتیب
ولی موقعی که مثلا میگیم :
[char s[10
چرا یه متغیر درست میشه که داخلش 10 تا کاراکتره؟مگه نباید 10 تا متغیر داشته باشیم که داخل هرکدومش رو به یک کاراکتر نسبت بدیم؟

یه متغیر نیست. اینم یه آرایه از ده تا کاراکتر می‌شه. منم نوشتم آرایه‌ای از کاراکترها. فقط چون مفهوم رشته با ترکیبی از کاراکترها معنی داره معمولا به همچین آرایه‌ای رشته می‌گن. رشته‌های مختوم به کاراکتر 0\ یا Null یا تهی رو خوندید؟ همین مباحث هستن. شما اینجا هم می‌تونی بنویسی مثلا 's[2]='a. هیچ مشکلی نداره. بحث اشاره‌گر هم که یه بحث جداست. اینکه به صورت s* نشون می‌دیم و غیره.

به نکته شماره دو از این پیوند هم توجه کنید:

www.algorithmha.ir (http://www.algorithmha.ir/post-%D9%86%DA%A9%D8%A7%D8%AA-%D9%85%D9%87%D9%85-%D8%AF%D8%B1-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3.aspx)

alirah84
یک شنبه 05 آذر 1391, 19:16 عصر
من کلا توابع عملگر رو تو ++c درست و حسابی متوجه نشدم ،میشه خط 33 همین برنامه بالایی رو هم توضیح بدید.
ممنون

مسعود اقدسی فام
یک شنبه 05 آذر 1391, 19:55 عصر
من کلا توابع عملگر رو تو ++c درست و حسابی متوجه نشدم ،میشه خط 33 همین برنامه بالایی رو هم توضیح بدید.
ممنون

شما داخل کلاس reshte عملگر / رو سربارگذاری کردی. داخل بدنه‌ی تابع هم نوشتید که تعداد تکرار کاراکتر رو مشخص کنه. پس وقتی ob / c می‌نویسید که ob یه شی از نوع reshte و c یه کاراکتر هستش، اون تابع فراخوانی می‌شه و تعداد رو می‌شمره و به عنوان نتیجه برمی‌گردونه. اون خط همین کار رو می‌کنه.

alirah84
دوشنبه 06 آذر 1391, 00:07 صبح
وقتی ورودی رو با فاصله وارد میکنی،جوابی بهت نمیده.مشکل چیه؟

ما نه برامون مهمه اسم پارامتر‌های ارسالی به تابع اونجا چی تعریف شده و نه مهمه اسم مقدار بازگشتی چی هست. چون ممکنه اصلا داخل و بدنه‌ی تابع در دسترس نباشه که بتونیم ببینیم این اسامی رو. ما فقط با نوع داده‌ها سر و کار داریم.
توی برنامه دومی که برامون مهمه خروجی t باشه ،چون توی main هم t رو برابر s1/c قرار دادیم.ولی توی برنامه اول توی تابع temp نوشتیم ،بعد توی مین، o3 نوشتیم

مسعود اقدسی فام
دوشنبه 06 آذر 1391, 00:28 صبح
وقتی ورودی رو با فاصله وارد میکنی،جوابی بهت نمیده.مشکل چیه؟

توی برنامه دومی که برامون مهمه خروجی t باشه ،چون توی main هم t رو برابر s1/c قرار دادیم.ولی توی برنامه اول توی تابع temp نوشتیم ،بعد توی مین، o3 نوشتیم




int main()
{
char c;
int masoud;
reshte s1;
s1.input();
cin>>c;
masoud=s1/c;
cout<<t;
}






شما این تیکه از کد رو عوض کن و اجرا کن. اگه مشکلی در مورد اینکه اون بالا t بود و اینجا masoud هستش پیش اومد هر چی دوس داری بهم بگو.

ببنیند. وقتی داخل یه تابع هستید مهمه که بدونید متغیر خروجی کدومه و چی رو باید return کنید. ولی وقتی اون سمت استفاده می‌شه اصلا و ابدا مهم نیست داخل تابع اسمش چی بوده. من یه مثال sqrt زدم. متوجه نمی‌شم مشکلتون چیه. اگه هم اسم باشن اشکالی نداره. اینکه مثلا داخل تابع هم t باشه و بیرون هم t باشه. اما الزامی نیست. اصلا و ابدا اهمیتی نداره.

شما گاهی سوالاتی می‌پرسید که خیلی ساده‌تر از بحث سربارگذاری عملگر هستن. حس می‌کنم دارید جهشی این بحث رو می‌خونید.

در مورد این هم که با فاصله جواب نمی‌ده نمونه ورودی که با فاصله ارسال کردید رو بذارید تا توضیح بدم ممکنه چه مشکلی داشته باشه.

alirah84
دوشنبه 06 آذر 1391, 01:06 صبح
اون موقع که تست کردم نمیدونم کامپایلر چش بود بهم جواب نمیداد وقتی فاصله میزدم بین حرفها،ولی الان که تست کردم درست بود.
بازم ممنون