توضیحات:
1. برنامه برای حل معادله یک چندجملهای
با حداکثر درجه 3 به روش نصف کردن نوشته شده.
2. برنامه ضرایب چندجملهای (a،
b،
c
و d)
و دو تا مقدار که توی قضیه بولتزانو صدق کنن (x1 و x2)
رو از ورودی میگیره.
3. برنامه توی هر مرحله x3
که مقدار حاصل از نصف کردن فاصله x1 و x2
هست رو حساب میکنه و با استفاده از قضیه بولتزانو مقدار x3 رو جایگزین x1
یا x2
میکنه.
4. برنامه وقتی متوقف میشه که یا فاصله
x1
و x2
کمتر از 0.0001 بشه یا اینکه مقدار تابع توی نقطه x3
کمتر از 0.00001 بشه.
5. آخرین مقدار x3
بهعنوان ریشه معادله توی خروجی چاپ میشه.
Program Root
Implicit None
Real :: a, b, c, d
Real :: x1, x2, x3
Real :: F1, F2, F3
Print*, "A Program
to calculate the root of a polinomial."
Print*, "This
program is presented by Mohammadsadegh Abbasian."
Print*
Print*, "Enter a, b,
c and d, coefficients of polinomial ax^3 + bx^2 + cx + d:"
Read*, a, b, c, d
Print*
Print*, "Enter x1
and x2, two points which satisfies Bolzano's theorem:"
Read*, x1, x2
F1 = a*x1**3 + b*x1**2 +
c*x1 + d
F2 = a*x2**3 + b*x2**2 +
c*x2 + d
If (F1*F2 > 0) Then
Print*
Print*, "Error! F1*F2 > 0: You have to enter x1 and x2, two points
which"
Print*, " satisfies Bolzano's theorem."
Else
Do
x3 = (x1+x2) / 2
F3 = a*x3**3 + b*x3**2 + c*x3 + d
If (F3*F1 < 0) Then
x2 = x3
Else
x1 = x3
End If
If (ABS (x1-x2) < 0.0001 .OR. ABS (F3) <
0.00001) Then
Print*
Print*, "Root =", x3
Exit
End
If
End Do
End If
End
سلام!
توی نظرات پرسیده شده که چهطور میشه دنباله
فیبوناچی رو حتی بدون استفاده از آرایه نوشت. همونطوری که قبلاً گفتم دنباله
فیبوناچی رو در اصل باید با تابع بازگشتی (Recursive Function) نوشت و در غیر
این صورت راحتترین راه استفاده از آرایه هست. اگر از آرایه هم استفاده نکنیم فقط
نوشتن برنامه رو سختتر کردیم. به هر حال من کدهای این برنامه رو براتون میذارم.
توضیحات:
1- در هر بار محاسبه حلقه دو جمله از دنباله حساب میشه،
جمله nام و جمله n+1ام. جمله nام توی متغیر U و جمله n+1ام توی متغیر V ذخیره میشه. به همین خاطره که
تعداد تکرار حلقه اگر n زوج باشه n/2 هست و اگر n فرد باشه (n-1)/2. برای تشخیص زوج بودن یا نبودن n از تابع Mod() یعنی تابع
باقیمانده استفاده کردیم. اگر باقیمانده تقسیم n بر 2 صفر شد عدد زوجه وگرنه عدد فرده.
2- به متغیر A مقدار 0 داده شده که
همون جمله صفرم دنباله هست و به متغیر B مقدار 1 داده شده که
جمله اول دنباله هست. با اولین ورود به حلقه، مقدار متغیر U برابر با A+B میشه که
برابره با 1 و جمله دوم دنباله هست. بعد متغیر
V برابر B+U میشه که برابر
1+1=2 هست و همون جمله سوم دنباله هست. برای
محاسبه جملات بعدی مقدار A و B باید تغییر
کنن. پس متغیر A مقدارش رو از متغیر U و متغیر B مقدارش رو از
متغیر V میگیره. دفعه بعدی که حلقه تکرار
میشه U=A+B=1+2=3 و V=B+U=2+3=5 که جملات چهارم و پنجم دنباله هستن. به همین ترتیب در هر تکرار
حلقه دو جمله متوالی محاسبه میشن.
3- برای چاپ جمله nام دنباله، اگر n زوج باشه U و اگر n فرد باشه V چاپ میشه.
Implicit None
Integer :: A, B, N, M, U, V, I
A = 0
B = 1
Print*, "Please Enter n:"
Read*, N
If (Mod(N,2) == 0) Then
M
= N/2
Else
M
= (N-1)/2
End If
Do I = 1,M
U
= A + B
V = B
+ U
A = U
B = V
End Do
If (Mod(N,2) == 0) Then
Print*,
"Un =", U
Else
Print*,
"Un =", V
End If
End
در ریاضی سری فیبوناچی (Fibonacci) دنبالهای از اعداد صحیح بهصورت زیر هست
و در واقع هر جملهش از رابطه بازگشتی زیر بهدست
میاد.
کدهای زیر برنامهایه که جمله nام سری فیبوناچی رو حساب میکنه (n از ورودی دریافت میشه). چون جملات این سری از رابطه بازگشتی بهدست میان، در واقع برای نوشتن این برنامه باید از یک رویه (تابع یا سابروتین) بازگشتی استفاده بشه. اما در این برنامه ساده، فقط از یک آرایه تکبعدی استفاده شده.
Program Fibonacci
Implicit None
Integer :: N, I
Integer, Dimension (0:1000) :: U
U(0) = 1; U(1) = 1
Print*, "Please Enter N:"
Read*, N
Do I = 2, N
U(I)
= U(I-2) + U(I-1)
End Do
Print*, U(N)
End
سلام!
سؤالی به این صورت توی نظرات مطرح شده:
سؤال: برنامهای بنویسید که
یک عدد صحیح را از ورودی دریافت کند و تعداد ارقام آن را چاپ نماید.
پاسخ: این سؤال دقیقاً سؤال
12 فصل دوم کتاب فرترن دکتر موسویندوشنی هست که من هر ترم این سؤال رو سر کلاس حل
تمرین برای بچهها حل میکردم. برای حل این سؤال هم روشهای مختلفی وجود داره که
همگی شبیه به هم هستن. توی کدهایی که براتون میذارم، روش حل به این صورته که اگر
عددی ورودی صفر باشه، در خروجی چاپ میشه که عدد ورودی صفر هست و اگر منفی باشه
اون رو با تابع قدرمطلق مثبت میکنه. بعد اگر عددی بزرگتر یا مساوی یک و کوچکتر
از 10 باشه تکرقمی تشخیص داده میشه، اگر بزرگتر یا مساوی 10 و کوچکتر از 100
باشه دورقمی تشخیص داده میشه و الی آخر.
Integer :: I, M, N, O
Print*, "Please Enter The Value:"
Read*, I
I = ABS (I)
M = 1
N = 10
O = 0
If (I == 0) Then
Print*,
"The Input Value is Zero."
Else
Do
O = O + 1
If (I .GE. M .AND. I .LT. N)
Then
Print*,
"Number of Digits =", O
Exit
End If
M = M * 10
N = N * 10
End Do
End If
End
سلام!
یکی از دوستان سؤالی پرسیده که جواب اون رو گذاشتم.
لطفاً از این به بعد اگر سؤال میپرسید و
پیگیر جواب اون هستید خودتون رو معرفی بفرمایید، بگید از کدوم دانشگاه هستید و ایمیلتون رو هم بذارید. ممنونم.
سؤال: برنامهای بنویسید که مقدار exp(x) را با مقدار تقریبی آن که برابر است با sigma{x^n/n!} مقایسه کرده و مقدار آنرا چاپ نماید. برنامه را طوری بنویسید که
در ورودی x و n را دریافت نماید.
پاسخ: بنده توضیح بدم که منظور ایشون از sigma{x^n/n!} در واقع بسط مکلورن تابع نمایی بهصورت
و منظور از خطا اختلاف نسبی مقدار سری با مقدار واقعی تابع هست.
ابتدا توضیحات رو بخونید و بعد کدها رو در ادامه
مطلب ببینید. ضمناً در ادامه مطلب کدهای یک الگوریتم دیگه هم آورده شده.
توضیحات:
1- سؤالی مشابه همین سؤالی که اینجا مطرح شده در فصل
دوم کتاب دکتر موسویندوشنی هست و بنده هم از همون الگوریتم برای حل این سؤال
استفاده کردم. چون برای حل این سؤال روشهای مختلفی میتونه مطرح بشه.
2- در حل این سؤال دقت کنید که بسط مکلورن به این
صورت حساب میشه. در اولین تکرار حلقه 1+x حساب میشه و در متغیر Sum ذخیره میشه و بعد ترم x^2/2 حساب میشه و در متغیر Term ذخیره میشه. در
دومین تکرار حلقه، حاصل (1+x) با حاصل (x^2/2) جمع میشه و در متغیر Sum ذخیره میشه و بعد ترم x^3/3! به صورت (x^2/2)*(x/3) محاسبه میشه و در متغیر Term ذخیره میشه. در سومین تکرار حلقه
حاصل {(1+x)+(x^2/2)+(x^3/3!)} حساب میشه و در متغیر Sum ذخیره میشه و ترم x^4/4! بهصورت (x^3/3!)*(x/4) حساب میشه و در متغیر Term ذخیره میشه و الی آخر. در واقع
در این الگوریتم هر ترم از رابطه بازگشتی زیر محاسبه میشه.
xi/i!=(xi-1)/(x-1)i×x/i