פונקציות רקורסיביות בשפת C - עזרה בפתרון תרגיל! - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


Chaos

Recommended Posts

שלום לכולם.

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

כתוב תוכנית הקולטת שתי מחרוזות (הנח כי כל מחרוזת בגודל של עד 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));

}

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

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

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

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

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

בתודה מראש.

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

ארכיון

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

×
  • צור חדש...