PDA

View Full Version : سوال: در موردسری1+(1/2)+(1/3)+(1/x)



behroz1992
دوشنبه 18 مرداد 1389, 13:47 عصر
سلام به همه دوستان عزیز من میخواستم این سری رو انجام بدم ولی فقط آخرین رو +1 میکنه مشکل از کجاست ممنون


1+(1/2)+(1/x)

#include<iostream.h>
#include<conio.h>
int main()
{
float x,i,y;
cin>>x;
for(i=2;i<=x;i++)
{
y=1+(1/i);
}
cout<<y;
getch();
return 0;
}

tdkhakpur
دوشنبه 18 مرداد 1389, 13:58 عصر
int main()
{
float x,i,y=0; /// اینجا
cin>>x;
for(i=2;i<=x;i++)
{
y+=1+(1/i); // اینجا
}
cout<<y;
getch();
return 0;
}

behroz1992
دوشنبه 18 مرداد 1389, 14:29 عصر
ممنون دوست عزیز

مشکل اصلی اینجا هست که من وقتی با ماشین حساب ویندوز حساب میکنم عدد 4 رو میشه ::
2.0833333333333...
ولی وقتی با برنامه میزنم میشه::4.08333
به نظر شما مشکل از چی هست؟

tdkhakpur
دوشنبه 18 مرداد 1389, 14:45 عصر
به نظر شما مشکل از چی هست؟
مشکلی ندارد فقط بازه موردنظر برای cout این مقداری هست که میبینید میتوانید به شکل زیر هم استفاده کنید.

printf("%4.8f",y);
در فوق دو رقم برای قشمت صحصح و 8 رقم برای اعشار قید میشود.

Salar Ashgi
دوشنبه 18 مرداد 1389, 15:27 عصر
مشکل از اینجاست که دوست عزیز tdkhakpur (http://www.barnamenevis.org/forum/member.php?u=99732) در کدشون عدد 1 موجود در سری رو هر بار لحاظ کردن ،
در صورتیکه تو سری یه بار اومده ؛

کد مورد نظر :



#include <iostream>
#include <conio>
int main(){
int n;
double sum=1;
cout<<"Enter n :\n";
cin>>n;
for(int i=2;i<=n;i++)
sum+=(1.0/i);
cout<<"Sum : "<<sum<<endl;
getch();
}

در ضمن دوست عزیز behroz1992 (http://www.barnamenevis.org/forum/member.php?u=116933) ، اشکال کد شما در اینجاست که متغیری که قراره مجموع سری تو خودش
نگه داره رو مقدار دهی اولیه نکردین ؛ فراموش نکنین متغیرهای نگه دارنده مجموع و حاصلضرب همیشه
باید ابتدا مقدار دهی بشن و گرنه یه مقدار پیش فرض نامعلوم از حافظه داخل متغیر ذخیره میشه و این مقدار با مجموع یا حالا هر عملیاتی که روی متغیر انجام میدین ، ترکیب و ادغام میشه و این باعث میشه نتیجه
غلط بدست بیاد .

موفق باشید ./

behroz1992
دوشنبه 18 مرداد 1389, 15:50 عصر
واقعا ممنونم مدیر عزیز:قلب:
فقط یه سوالی من این یه قسمت رو متوجه نشدم

sum+=(1.0/i);
sum+= رو متوجه شدم چی هست ولی این یه قسمت رو 1.0/i رو نه !؟
الان مقدار اولیه sum =1 هست برای همین 1+(1.0/i) نکردید؟
ببخشید دیگه من تازه کارم

tdkhakpur
دوشنبه 18 مرداد 1389, 16:05 عصر
sum+= رو متوجه شدم چی هست ولی این یه قسمت رو 1.0/i رو نه !؟

خب سری شما در هر مرحله محاسبه اش متفاوت هست به همین دلیل i برای اعمال این تغییرات در محاسبه قرار داده میشود .

1/2+1/3+1/3+1/4+...

artificial_intelligence
دوشنبه 18 مرداد 1389, 16:17 عصر
ممنون دوست عزیز

مشکل اصلی اینجا هست که من وقتی با ماشین حساب ویندوز حساب میکنم عدد 4 رو میشه ::
2.0833333333333...
ولی وقتی با برنامه میزنم میشه::4.08333
به نظر شما مشکل از چی هست؟
پاسخ:


مشکل از اینجاست که دوست عزیز tdkhakpur (http://www.barnamenevis.org/forum/member.php?u=99732) در کدشون عدد 1 موجود در سری رو هر بار لحاظ کردن ،
در صورتیکه تو سری یه بار اومده ؛

کد مورد نظر :



#include <iostream>
#include <conio>
int main(){
int n;
double sum=1; // مقدار یک
cout<<"Enter n :\n";
cin>>n;
for(int i=2;i<=n;i++)
sum+=(1.0/i);
cout<<"Sum : "<<sum<<endl;
getch();
}

در ضمن دوست عزیز behroz1992 (http://www.barnamenevis.org/forum/member.php?u=116933) ، اشکال کد شما در اینجاست که متغیری که قراره مجموع سری تو خودش
نگه داره رو مقدار دهی اولیه نکردین ؛ فراموش نکنین متغیرهای نگه دارنده مجموع و حاصلضرب همیشه
باید ابتدا مقدار دهی بشن و گرنه یه مقدار پیش فرض نامعلوم از حافظه داخل متغیر ذخیره میشه و این مقدار با مجموع یا حالا هر عملیاتی که روی متغیر انجام میدین ، ترکیب و ادغام میشه و این باعث میشه نتیجه
غلط بدست بیاد .

موفق باشید ./



واقعا ممنونم مدیر عزیز:قلب:
فقط یه سوالی من این یه قسمت رو متوجه نشدم

sum+=(1.0/i);
sum+= رو متوجه شدم چی هست ولی این یه قسمت رو 1.0/i رو نه !؟
الان مقدار اولیه sum =1 هست برای همین 1+(1.0/i) نکردید؟
ببخشید دیگه من تازه کارم

قسمت قرمز شده ، قبلا مقدار یک گرفته.

behroz1992
دوشنبه 18 مرداد 1389, 18:03 عصر
ممنونم دوستان عزیز
من این 1.0 اینو میگم چی هست؟

#include <iostream>
#include <conio>
int main(){
int n;
double sum=1;
cout<<"Enter n :\n";
cin>>n;
for(int i=2;i<=n;i++)
sum+=(1.0/i);
cout<<"Sum : "<<sum<<endl;
getch();
}

tdkhakpur
دوشنبه 18 مرداد 1389, 18:58 عصر
من این 1.0 اینو میگم چی هست؟

1.0 همان عدد 1 هست با این تفاوت که باعث میشه عدد حاصل از تقسیم اعشار باشه نه صحیح


(1.0/i) == حاصل عدد اعشار;

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


sum += (double)1/i;

Salar Ashgi
دوشنبه 18 مرداد 1389, 20:08 عصر
دوست عزیز behroz1992 (http://www.barnamenevis.org/forum/member.php?u=116933) ، همانطور که tdkhakpur (http://www.barnamenevis.org/forum/member.php?u=99732) عزیز بیان کردن ؛ چون به هنگام تقسیم عدد صحیح بر
صحیح همیشه قسمت اعشار حذف میشه ، ولی چون ما میخوایم نتیجه بشکل اعشاری باشه ، باید اینکارو
خودمون انجام بدیم :
روش اول) عملگر دات که همون ممیزه ، بنابراین وقتی مینویسم 1.0 بجای 1 ، کامپایلر اینو بعنوان یه عدد
اعشاری تفسیر میکنه و نتیجه میشه اعشاری .

روش دوم) Type Casting نام داره ؛ اگه بخوایم خودمون تبدیل نوع دستی رو انجام بدیم ، نوع مقصد رو داخل
پارانتز مینویسم ، مثل : (double) !

روشهای دیگه ای هم هست ، ولی این دوتا معمول ترین هستن .

اگه باز سوالی بود ، حتما بپرسین .

موفق و پیروز باشید ./

behroz1992
دوشنبه 18 مرداد 1389, 23:56 عصر
واقعا ممنونم
ممنون از مدیر عزیز و همچنین دوست عزیزtdkhakpur (http://www.barnamenevis.org/forum/member.php?u=99732):قلب: