PDA

View Full Version : سوال: مشکل در جذر گرفتن در C



sitetheme
سه شنبه 21 مهر 1394, 11:44 صبح
درود بر دوستان برنامه نویس
من مبتدی هستم و برای تمرین شروع کردم به نوشتن یک محاسبه گر برای ریشه های یک معادله درجه دو حالا کدی که نوشتم این هست:


#include<stdio.h>
int main()
{
int a,b,c,delta,x1,x2,d;
printf("Please Enter a b c >\n");
scanf("%d %d %d",&a,&b,&c);
delta=b^2-4*a*c;
if(delta<0){
printf("There Is No root To Show!");
}
else{
d=sqrt(delta);
x1=-b+d/2*a;
x2=-b-d/2*a;
printf("The Roots are : X1=%d and X2=%d\n",x1,x2);
}
return 0;
}

اما متاسفانه موقع کامپایل به این دستور گیر میده : d=sqrt(delta);
مشکل کجاست؟ آیا کلا چیزی که نوشتم درست هست مشکل چیه؟
ممنون

ehsan_faal
سه شنبه 21 مهر 1394, 11:56 صبح
شما باید هدر math رو include کنید و در ضمن اون عملگری که برای به توان رسوندن استفاده کردید xor هستش نه توان.
برای توان رسوندن هم یا از pow استفاده کنید یا دو بار در خودش ضربش کنید.

sitetheme
سه شنبه 21 مهر 1394, 12:08 عصر
شما باید هدر math رو include کنید و در ضمن اون عملگری که برای به توان رسوندن استفاده کردید xor هستش نه توان.
برای توان رسوندن هم یا از pow استفاده کنید یا دو بار در خودش ضربش کنید.
ممنون از شما!
کتابخانه math رو فرخوانی کردم و مشکل حل شد اما حالا چند سوال و یک مشکل جدید!
اول اینکه چطور باید از pow استفاده کنیم؟ یعنی باید به این شکل تغییر کنه؟
delta=pow(b)-4*a*c;
حالا مشکل اصلی:
این کدی هست که در حال حاضر دارم:

#include<stdio.h>
#include<math.h>
int main()
{
int a,b,c,delta,x1,x2,d;
printf("Please Enter a b c >\n");
scanf("%d %d %d",&a,&b,&c);
delta=(b*b)-4*a*c;
if(delta<0){
printf("There Is No root To Show!");
}
else{
d=sqrt(delta);
x1=-b+d/2*a;
x2=-b-d/2*a;
printf("The Roots are : X1=%d and X2=%d\n",x1,x2);
}
}



متاسفانه بعد از اینکه پیام اول چاپ میشه و من مقادیر رو میدم باز پنجره بسته میشه! حدس زدم شاید برای این باشه که مجدد به مشکل اول رسیدم و اینه که سریعا محاسبه میکنه و نتیجه رو بسرعت نشون میده و بسته میشه اما یک متغیر دیگه هم بنام t معرفی کردم و بعد از تمامی اعمال در main برابر t=getchar(); قرار دادم اما فایده ای نداشت!

hamedBB
سه شنبه 21 مهر 1394, 14:18 عصر
فرم استفاده از تابع pow به صورت زیر است :

double pow (double base, double exponent);

که base همون پایه و exponent همون توان هست، مثال زیر نشون دهنده ی 2 به توان 5 هست.


double pow (2, 5);

درباره ی باز نگه داشتن کنسول هم می تونید از فرمان زیر استفاده کنید :




//remember to include iostream to use this function
std::cin.ignore();

این کد رو در پایان برنامه بذار. کارش اینه که در پایان برنامه منتظر فشرده شدن کلید Enter از سوی کاربر میمونه. فقط یادت باشه که این کد تحت کتابخانه ی iostream اجرا میشه که تو کد هم نوشتم.

sitetheme
سه شنبه 21 مهر 1394, 14:59 عصر
فرم استفاده از تابع pow به صورت زیر است :

double pow (double base, double exponent);

که base همون پایه و exponent همون توان هست، مثال زیر نشون دهنده ی 2 به توان 5 هست.


double pow (2, 5);

درباره ی باز نگه داشتن کنسول هم می تونید از فرمان زیر استفاده کنید :




//remember to include iostream to use this function
std::cin.ignore();

این کد رو در پایان برنامه بذار. کارش اینه که در پایان برنامه منتظر فشرده شدن کلید Enter از سوی کاربر میمونه. فقط یادت باشه که این کد تحت کتابخانه ی iostream اجرا میشه که تو کد هم نوشتم.

متاسفانه باز هم بعد از اینکه مقادیر a b c رو میدم بسته میشه:

#include<stdio.h>
#include<math.h>
#include<iostream>
int main()
{
int a,b,c,delta,x1,x2,d;
printf("Please Enter a b c >\n");
scanf("%d %d %d",&a,&b,&c);
delta=(b*b)-4*a*c;
if(delta<0){
printf("There Is No root To Show!");
}
else{
d=sqrt(delta);
x1=-b+d/2*a;
x2=-b-d/2*a;
printf("The Roots are : X1=%d and X2=%d\n",x1,x2);
}
std::cin.ignore();
}

الان یک مشکل بزرگ تر وجود داره!:لبخند::لبخند: :افسرده:
مشکل اینه که معمولا همه جا نوشته متغیر ها رو با double یا float تعریف کنیم ولی فعلا که با int تعریف کردم بهم ریشه ها رو اشتباهی میده! مثلا اگر اعداد 2 رو به a و 8 رو بهb و 4رو به c بدیم باید ریشه های 2 و -6 بده اما -4 و -12 میده! وقتی که int رو هم به double یا float تغیر میدم وضعیت بدتر میشه! فکر کنم روی float ریشه ها هردو 0 و روی double هر دو 8 میشن!

hamedBB
سه شنبه 21 مهر 1394, 15:09 عصر
درباره اینکه چرا هنوز بسته مبشه اون خط کدی که بهت گفتم رو هم به پایان if اضافه کن هم به پایان else اگر درست نشد بهم بگو.
درباره اینکه چرا جوابت غلطه دلیلش اینه که فرمولت غلطه، خط 15 و 16 برنامت رو به صورت زیر تغییر بده :



x1 = (-b+d)/(2*a);
x2 = (-b-d)/(2*a);


دلیلشم سادس، تقدم عملیات در صورتی که اولویت ها یکی باشه از چپ به راسته و چون تقسیم و ضرب اولویت یکی دارند مشکل پیش میاد تو این فرمول، یعنی اول تقسیم به 2 میشه بعد حاصل ضرب در 2 میشه. با پرانتزگذاری مشکل حل میشه.

sitetheme
سه شنبه 21 مهر 1394, 15:20 عصر
درباره اینکه چرا هنوز بسته مبشه اون خط کدی که بهت گفتم رو هم به پایان if اضافه کن هم به پایان else اگر درست نشد بهم بگو.
درباره اینکه چرا جوابت غلطه دلیلش اینه که فرمولت غلطه، خط 15 و 16 برنامت رو به صورت زیر تغییر بده :



x1 = (-b+d)/(2*a);
x2 = (-b-d)/(2*a);


دلیلشم سادس، تقدم عملیات در صورتی که اولویت ها یکی باشه از چپ به راسته و چون تقسیم و ضرب اولویت یکی دارند مشکل پیش میاد تو این فرمول، یعنی اول تقسیم به 2 میشه بعد حاصل ضرب در 2 میشه. با پرانتزگذاری مشکل حل میشه.
ممنون از شما! مشکل محاسبات حل شد!مشکل از ترتیب عملکرد ها بود؟ اما هنوز کدی که دادین برای بسته نشدن پنجره عمل نمیکنه! فعلا از scanf برای بسته نشدن استفاده میکنم

hamedBB
سه شنبه 21 مهر 1394, 15:24 عصر
عجیبه که کار نمی کنه. اگر scanf داره کار می کنه که هیچ اگه نه از :


cin.get();

دوبار پشت سر هم بذار در انتهای برنامت ببین جواب میده.