עבור לתוכן

פונקציות רקורסיביות בשפת C - עזרה בפתרון תרגיל!

Featured Replies

פורסם

שלום לכולם.

הנני צריך את עזרתכם בפתרון התרגיל הנ"ל:

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

דוגמה 1:

>>abcdef //קלט: מחרוזת ראשונה

>>gac //קלט: מחרוזת שניה

abcdefgac //פלט:מחרוזת השרשור

דוגמה 2:

>>abcdef //קלט: מחרוזת ראשונה

>> //(מחרוזת ריקה) קלט: מחרוזת שניה

abcdef //פלט:מחרוזת השרשור

כל עזרה תתקבל בברכה.

בתודה מראש.

פורסם

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

אם יש לך רשימה של "פונקציות סיפריה" אז תבדוק שם.

ועוד דבר, למה שזה יהיה רקורסיבי?

עושים שרשור פשוט ל2 מחרוזות לתוך מחרוזת שלישית.

אין פה שום קטע של רקורסיביות.

פורסם

יש את STRCAT שנמצאת בSTRING.H

אבל אני דיי בטוח שהתרגיל צריך להיפתר לא ע"י הפונ הנ"ל.

מה שאתה צריך לעשות זה ללכת לסוף המחרוזת הראשונה, ושם לשים את התו הראשון בשניה, אחר-כל לשים בזה שאחריו את התו השני וכו. בסוף שמים \0.(אם אתה רץ עד N,, כאשר N זה מספר התוים במחרוזת אז זה לא כולל את ה\0, אז או שתרוץ עד N+1 או שתשים ידנית).

פורסם

אני גם לא ממש הבנתי איך רקורסיה נכנסת לעניין הזה...

פורסם
  • מחבר

אני גם לא ממש הבנתי איך רקורסיה נכנסת לעניין הזה...

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

יש את STRCAT שנמצאת בSTRING.H

אבל אני דיי בטוח שהתרגיל צריך להיפתר לא ע"י הפונ הנ"ל.

מה שאתה צריך לעשות זה ללכת לסוף המחרוזת הראשונה, ושם לשים את התו הראשון בשניה, אחר-כל לשים בזה שאחריו את התו השני וכו. בסוף שמים \0.(אם אתה רץ עד N,, כאשר N זה מספר התוים במחרוזת אז זה לא כולל את ה\0, אז או שתרוץ עד N+1 או שתשים ידנית).

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

עריכה: עוד משהו, מה בעניין הדוגמה השנייה כאשר לא הוכנס תו ממש, אלא הוקש "אנטר"?

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

אם יש לך רשימה של "פונקציות סיפריה" אז תבדוק שם.

ועוד דבר, למה שזה יהיה רקורסיבי?

עושים שרשור פשוט ל2 מחרוזות לתוך מחרוזת שלישית.

אין פה שום קטע של רקורסיביות.

שוב, התרגיל כשלעצמו הוא קל...

פורסם

אתה מצרף אות מסויימת למחרוזת החדשה(סוף המחרוזת הראשונה שאתה צריך לשרשר אליה) אות אחת. אחר כך אתה שולח לפונ כל פעם מצביע לתחיל האות הבאה, כלומר: a+sizeof(char), או a+1, כאשר a זו המחרוזת שלך.

פורסם
  • מחבר

הבנתי, אך מה בדבר מחרוזת שנייה ריקה? זה עדיין יעבוד?

פורסם

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

ז"א, אם אין בה בכלל תווים, אז המחרוזת הראשונה תוחזר.

ואז התוכנה עדיין עובדת, כי מחרוזת+כלום=מחרוזת, לא?

פורסם

לא כל כך הבנתי מה שאתה רוצה... האם זה בסדר?

#include <stdio.h>

char *rec_cat(char *str1, char *str2)

{

static char str[256] = "";

static int i = 0;

if (*str1)

{

str = *str1;

i++;

rec_cat(str1+1,str2);

} else

if (*str2)

{

str = *str2;

i++;

rec_cat(str1,str2+1);

}

return str;

}

int main(void)

{

char str1[128], str2[128];

scanf("%s", str1);

scanf("%s", str2);

printf("%s\n", rec_cat(str1, str2));

}

יש פה קצת רמאות עם ה STATIC, אבל עדיין IT DOES THE JOB :)

פורסם

#include <stdio.h>

char *rec_cat(char *str1, char *str2, int back)

{

static char str[256];

static int i;

if ((back == 0) || (back == 1))

{

i = 0;

str[0] = 0;

back += 2;

}

if (*str1)

{

if (back == 3)

rec_cat(str1+1, str2, 3);

str = *str1;

i++;

if (back == 2)

rec_cat(str1+1, str2, 2);

} else

if (*str2)

{

if (back == 3)

rec_cat(str1, str2+1, 3);

str = *str2;

i++;

if (back == 2)

rec_cat(str1, str2+1, 2);

}

return str;

}

int main(void)

{

char str1[128], str2[128];

scanf("%s", str1);

scanf("%s", str2);

printf("%s\n", rec_cat(str1, str2, 0));

printf("%s\n", rec_cat(str1, str2, 1));

}

פורסם
  • מחבר

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

ישנם שתי בעיות:

- בהדפסה היא מדפיסה פעמיים, בתחילה את המחרווזת כסדרם, ובשורה הבאה את המחרוזות הפוך.

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

בתודה מראש.

פורסם

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

הבעיה היא של SCANF, לא של הפקודה...

פורסם


void rec_cat(char *str1, char *str2)
{

if (*str2)
{
str1[strlen(str1)] = *str2;
str1[strlen(str1)+1] = '\0';
rec_cat(str1,str2+1);
}
}

פורסם
  • מחבר

ראשית, תודה רבה.

עריכה: תוקן.

אגב, מה בעניין המחרוזת הריקה?

תודה מראש.

פורסם

מחרוזת שניה ריקה תעבוד מכיןן שכבר באות הראשונה זה \0.

ארכיון

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

דיונים חדשים