עזרה בתרגיל בשפת c לסטודנט - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

עזרה בתרגיל בשפת c לסטודנט


רגל קרושה במשגל

Recommended Posts

שלום לכולם. קיבלתי תרגיל להגשה שקצת קשה לי ואני לא מצליח להבין כיצד אני מתחיל לכתוב את הפיתרון.

עד כה למדנו התניות ולולאות while ו for . וזה כל מה שמותר לי להשתמש בו על מנת לפתור את התרגיל.

להלן התרגיל :

1) סדרת פיבונצ'י מוגדרת באופן הבא: האיבר הראשון שווה 1. האיבר השני שווה גם הוא 1. כל איבר נוסף שווה לסכום שני האיברים שלפניו. כלומר, הסדרה מתחילה כך:

34 21 13 8 5 3 2 1 1

כתוב תוכנית הקולטת מספר index שלם חיובי מהמשתמש ומציגה את האיבר ה- index בסדרת פיבונצ'י.

דוגמה לריצת תכנית:

Please enter an index: 8

The Fibonacci number at index 8 is: 21

אשמח לכיוון בפיתרון . תודה רבה ויום נעים

קישור לתוכן
שתף באתרים אחרים

תגדיר שני משתנים - אחד שמחזיק את האיבר הנוכחי בסדרה, ואחת שמחזיק את האיבר הבא. כתוב לולאה שבכל איטרציה אתה מקדם את שני המשתנים - בהתחלה הראשון מכיל את המספר הראשון בסדרה והשני מכיל את המספר השני, באיטרציה הבאה המשתנה הראשון מכיל את האיבר השני בסדרה והמשתנה השני מכיל את האיבר השלישי, וכן הלאה.

קישור לתוכן
שתף באתרים אחרים

וואו זה ממש קשה לי. אני יושב על זה כבר שעות ולא מצליח. זה די חדש לי העניין. הנה מה שניסיתי לכתוב עד עכשיו:

void main()

{

int i, k, a=1, b=1 ,index;

cout<<"please enter an index\n";

cin>>index;

for ( i=1 ; i<=index ; i++)

a=b;

b=a+i;

אבל עקבתי אחרי התוכנית וזה לא עושה מה שצריך.

ניסיתי לקדם את b באמצעות i אבל גם זה לא מצליח טוב.

a ו b הם בהתחלה האיברים הראשון והשני)

קישור לתוכן
שתף באתרים אחרים

קודם כל, כמה דברים:

א. כשאתה כותב קוד בפורום, תשתמש בטג קוד (כפתור # ליד הכפתור של הציטוט).

ב. אל תשתמש ב-void main, תשתמש ב-int main ושים return 0 בסוף.

ג. כשאתה משתמש ב-for/while/if אתה צריך לעטוף את הפקודות בסוגריים מסולסלים {}, אחרת רק השורה הראשונה שאחרי ה-for תהיה חלק מהלולאה.

לגבי האלגוריתם שלך - שים לב שבסדרת פיבונאצ'י, המיקום של האיבר בסדרה לא אמור להיכנס לחישוב, אלא רק שני האיברים הקודמים בסדרה.

קישור לתוכן
שתף באתרים אחרים

נניח ש-a מכיל את האיבר הראשון, ו-b את האיבר השני. אז אתה רוצה שאחרי האיטרציה הראשונה, a יכיל את האיבר השני ו-b יכיל את האיבר השלישי, שהוא a+b.

כלומר, תיאורטית תרצה לעשות:

a = b;
b = (old a) + b

כמובן, את הערך הקודם של a תצטרך לשמור במשתנה זמני.

קישור לתוכן
שתף באתרים אחרים

תרגיל נוסף שאני שובר עליו את הראש :

---------

כתוב תוכנית המחשבת את sinx עבור x אותו יש לקלוט מהמשתמש, ע"י חישוב הטור הבא:

tohnit.th.jpg

יש לעצור כשמגיעים לאיבר הקטן בערכו המוחלט מ0.001

קישור לתוכן
שתף באתרים אחרים

התחלתי שנה א' ואת הקורס הזה לפני כ 3 שבועות , ולא היה לי רקע בתכנות לפני כן, לכן קצת קשה לי להבין איך אני מחשב את הטור הספציפי הזה.

למדתי איך לעשות חזקה ועצרת ע"י שימוש בלולאה כלשהי. אבל דברים כמו לולאה בתוך לולאה ממש מסבכים אותי.

אני לא יודע כיצד לגשת למשימה הזאת. ניסיתי להבין לפי הרמז בתגובתך אבל לא הצלחתי.

ברשותך אני אשים כאן את הקוד שכתבתי עד כה ( אנחנו משתמשים בvoid main ובספריה של c++ אבל מותר לנו להשתמש רק ב cin ו cout משפת c++ ולא שום דבר אחר. זאת שיטת הלימוד במוסד הזה.

#include <iostream>
using namespace std;

void main()
{

double i=0,power_of_x=1, azeret=1;
double x=1;

cout<<"please enter a value to be computed\n";
cin>>x;


do
{
i=i+1;
azeret= (azeret+2)*i;
power_of_x = power_of_x*x;


}
while (i<something);


}

קישור לתוכן
שתף באתרים אחרים

אז ככה, כמה הערות:

א. בחישוב של העצרת יש לך טעות - למה אתה מוסיף 2 לעצרת?

ב. שים לב שאתה צריך רק את החזקות האי-זוגיות של x, כלומר בכל איטרציה אתה צריך לכפול ב-x פעמיים (ואותו דבר לגבי העצרת).

ג. תנאי העצירה שלך לא אמור להיות תלוי ב-i, אלא באיבר הנוכחי.

אחרי שתתקן את הטעויות האלה יהיה אפשר להמשיך הלאה כדי לחשב את הסכום של הטור.

לגבי ה-void main וה-cin/cout - זו פשוט טעות. אני לא יודע באיזה מוסד אתה לומד, אבל זה אומר משהו רע מאוד עליו.

התקן של C אוסר על השימוש ב-void main, ומחייב שימוש ב-int main. זה לא אומר ש-void main לא יעבוד (כי יש קומפיילרים שתומכים בזה למרות שזה לא תקני), זה פשוט אומר שזה לא נכון, ויש קומפיילרים שבהם זה לא יעבוד.

חוץ מזה, iostream, יחד עם cin/cout, היא חבילה ופונקציות של הספרייה הסטנדרטית של ++C. אם אתה לומדים C, אתם צריכים לעבוד עם stdio.h ו-scanf/printf, מהסיבה הפשוטה ש-cin/cout לא קיימים בכלל בשפה הזו.

קישור לתוכן
שתף באתרים אחרים

כמו שאמרתי:

את power_of_x אתה צריך לכפול פעמיים ב-x בכל איטרציה (שים לב שלפני האיטרציה הראשונה תאתחל אותו ב-x ולא ב-1, כדי לקבל את כל החזקות האי-זוגיות, ולא הזוגיות).

את azeret אתה צריך לאתחל ב-1, ואז: באיטרציה הראשונה (כש-i=1) אתה צריך לכפול ב-2 וב-3, באיטרציה השנייה (כש-i=2) אתה צריך לכפול ב-4 וב-5, באיטרציה הבאה ב-6 וב-7, וכן הלאה. כלומר, תחשוב באיזה ביטוי (שתלוי ב-i) צריך לכפול את azeret.

קישור לתוכן
שתף באתרים אחרים

				power = x;
atzeret = 1;
value = 1;

for ( i=1 ; i<=10 ; i++)
{
atzeret = atzeret*2*i*(i-1);
power = power*x*x;

value = value+(power/atzeret);
}



cout<<value<<"\n";

}

הפלט שמתקבל הוא 1.#inf לא משנה מה אני קולט.

(אל תתיחס לתנאי הלולאה. הוא סתמי בינתיים)

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...