עבור לתוכן

סדרות מונוטוניות עולות

Featured Replies

פורסם

להגדיר בתכנית:

const int LEN1 = 6,
LEN2 = 4 ;
int pool[LEN1] ;

קראו נתונים לתוך המערך (כל נתון יופיע פעם אחת)

לכתוב את הפונקציה:

void print_series(int arr[]) ;

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

לדוגמה: אם המערך המועבר לפונקציה כולל את הערכים {5, 3, 2, 7}, (כלומר ערכו של LEN1 הוא ארבע) וערכו של LEN2 הוא 3, אזי הפלט יכלול את הסדרות: {5,5,5}, {5,5,7}, {5,7,7}, {3,3,3}, {3,3,5}, {3,3,7} ,{3,5,5}, {3,5,7} ועוד רבות אחרות. הפלט לא יכלול סדרה כגון: {5,3,5} שכן בה האיבר השני בסדרה קטן מהראשון.

יש לכם רעיון איך להתחיל את משימה הזו?

איזה שהו כיוון?

כנראה היא צריכה להיות עם רקורסיה.

התרגיל הוא לפתרון ב-C++ אבל זה לא כל כך חשוב, העיקר הוא האלגוריטם.

פורסם

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

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

פורסם
  • מחבר
וקוראת לעצמה כאשר האינדקס שהיא מעבירה הוא של המספר הנוכחי.

את זה לא כל כך הבנתי

פורסם

מן הסתם אתה צריך גם תנאי עצירה (stack overflow זה לא תנאי עצירה מוצלח במיוחד)

אם הסדרה אמורה להיות מונוטונית עולה והמערך ממויין בסדר עולה אז אתה אמור לעבור מהאינדקס שאתה מעביר לה עד סוף המערך

פורסם
  • מחבר

בקריאה רקורסיבית של הפונ', איזה ערך היא אמורה לקבל? :s05:

ניסיתי לפתור את התרגיל בלי רקורסיה, זה נראה לי ממש מסובך. :s07:

פורסם

מה שהפונקציה שאני התכוונתי אליה עושה זה "מדפיסה את כל הסדרות העולות מונוטונית של X איברים מתוך מערך מסודר A בגודל Y החל מהמקום ה- N שלו שמתחילות בסדרה S"

היא הולכת בערך ככה:

אם X גדול מ- 0

אז עם i מ- N עד Y

שרשר את A לסדרה S (נקרא לסדרה החדשה S*)

הרץ את הפונקציה שתדפיס את הסדרות של X-1 איברים מתוך המערך החל מהמקום ה- I שלו שמתחיל בסדרה S*.

אחרת - הדפס את S

פשוט, לא?

כל בעיה רקורסיבית אפשר לפתור בלי רקורסיה (ברמת המעבד הרי לא קיימות בכלל פונקציות)

פורסם
  • מחבר

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

אם שעורי הבית לא הצלחתי, עכשיו עוד מאט יש לי מיבחן ואודה למי שיוכל לכתוב פונ' לפי הרעיון שחשבתי:

פונ' שמריצה את השעון של רכב (אופנוע או משהו אחר) שסופר את המרחק שהרכב עבר. הפונ' מריצה את את המספר השמאלי עד המקסימום, כשהגיע למקסימום הבאה אחריו גודל באחד ואז שוב המספר השמאלי גודל שוב וכך הלאה, תנאי עצירה יהיה כשכל המספרים הגיעו למקסימום (99999). גודל השעון יהיה על פי החלתה של המשתמש, ז''א לא מוגדר מראש בתוכנה...

תודה מראש...

פורסם

כמעט.

כשאתה מקדם מספרה מסוימת, אתה מאפס את כל אלה שלפניה.

פורסם
  • מחבר

כן, אבל איני מצליח לבנות את הפונקציה :s05: :s07:

פורסם

רעשיון פשוט למימוש:

יש לך מערך, וכל פעם אתה מגדיל את המקום האחרון(או ראשון תלוי איך אתה מסתכל). המערך מאותחל ב- 0. אם אחד האיברים שווה ל- 10, אתה מגדיל את זה שאחריו(ברקורסיה כזו). יהייה חכם להגביל את גודל האיבר(אתה צריך לשמור רק 10 סוגי נתונים).

פתרון נחמד יותר יהייה פשוט לשמור במשתנה מספרי רגיל, וכל פעם להגדיל אותו. תיצור פונ שמדפיסה את המספר בפורמט של X ספרות. תדפיס X-Y אפסים(Y = מספר הספרות במספר הנוכחי), ולאחר מכן תדפיס תמספר.

פורסם
  • מחבר

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

תודה מראש

פורסם

קוד ב- C:


void add(char *num)
{
int i;
for(i=strlen(num)-1;i>=0;i--)
{
num[i]++;
if(num[i]>'9')
num[i]='0';
else
break;
}
}

אה... כן.... יש אנשים שלא יאהבו את הBREAK.

פורסם
  • מחבר

נראה פתרון נחמד, רק ש השורה הזאת לא מתקמפלת

num++;

פורסם

למה שהיא לא תתקמפל?

ואני באמת לא אוהב את ה-break.

אני נוהג להוסיף עוד משתנה bool שמשמש כתנאי עצירה.

פורסם

לא קראתי את כל הפוסט, אבל בלי casting יהיה יותר הגיוני לרשום

num[i++];

מטי.

ארכיון

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

דיונים חדשים