פורסם 2005 בינואר 2620 שנים שלום לכולם.הנני צריך את עזרתכם בפתרון התרגיל הנ"ל:כתוב תוכנית הקולטת שתי מחרוזות (הנח כי כל מחרוזת בגודל של עד 127 תווים) ,כל מחרוזת בשורה נפרדת, ומדפיסה את מחרוזת המשורשרת (המחרוזת השנייה משורשרת לסוף המחרוזת הראשונה).לשם כך, התוכנית תפעיל פונקציה רקורסיבית בשם rec_cat המקבלת שתי מחרוזות ומחזירה את מחרוזת השרשור.דוגמה 1:>>abcdef //קלט: מחרוזת ראשונה>>gac //קלט: מחרוזת שניהabcdefgac //פלט:מחרוזת השרשור דוגמה 2:>>abcdef //קלט: מחרוזת ראשונה>> //(מחרוזת ריקה) קלט: מחרוזת שניהabcdef //פלט:מחרוזת השרשור כל עזרה תתקבל בברכה.בתודה מראש.
פורסם 2005 בינואר 2720 שנים אני דיי בטוח שכמו בפסקל, גם בסי יש איזו פונקציה שמשרשרת מחרוזות.אם יש לך רשימה של "פונקציות סיפריה" אז תבדוק שם.ועוד דבר, למה שזה יהיה רקורסיבי?עושים שרשור פשוט ל2 מחרוזות לתוך מחרוזת שלישית.אין פה שום קטע של רקורסיביות.
פורסם 2005 בינואר 2720 שנים יש את STRCAT שנמצאת בSTRING.Hאבל אני דיי בטוח שהתרגיל צריך להיפתר לא ע"י הפונ הנ"ל.מה שאתה צריך לעשות זה ללכת לסוף המחרוזת הראשונה, ושם לשים את התו הראשון בשניה, אחר-כל לשים בזה שאחריו את התו השני וכו. בסוף שמים \0.(אם אתה רץ עד N,, כאשר N זה מספר התוים במחרוזת אז זה לא כולל את ה\0, אז או שתרוץ עד N+1 או שתשים ידנית).
פורסם 2005 בינואר 2820 שנים מחבר אני גם לא ממש הבנתי איך רקורסיה נכנסת לעניין הזה...אני לא כתבתי את התרגיל... התרגיל כשלעצמו הוא קל מאוד ללא שימוש בפוקציות רקורסיביות.יש את STRCAT שנמצאת בSTRING.Hאבל אני דיי בטוח שהתרגיל צריך להיפתר לא ע"י הפונ הנ"ל.מה שאתה צריך לעשות זה ללכת לסוף המחרוזת הראשונה, ושם לשים את התו הראשון בשניה, אחר-כל לשים בזה שאחריו את התו השני וכו. בסוף שמים \0.(אם אתה רץ עד N,, כאשר N זה מספר התוים במחרוזת אז זה לא כולל את ה\0, אז או שתרוץ עד N+1 או שתשים ידנית).רעיון נחמד מאוד, אך אולי אתה יכול להדגים לי את הביצוע שלו בפוקציה רקורסיבית?עריכה: עוד משהו, מה בעניין הדוגמה השנייה כאשר לא הוכנס תו ממש, אלא הוקש "אנטר"?אני דיי בטוח שכמו בפסקל, גם בסי יש איזו פונקציה שמשרשרת מחרוזות.אם יש לך רשימה של "פונקציות סיפריה" אז תבדוק שם.ועוד דבר, למה שזה יהיה רקורסיבי?עושים שרשור פשוט ל2 מחרוזות לתוך מחרוזת שלישית.אין פה שום קטע של רקורסיביות.שוב, התרגיל כשלעצמו הוא קל...
פורסם 2005 בינואר 2820 שנים אתה מצרף אות מסויימת למחרוזת החדשה(סוף המחרוזת הראשונה שאתה צריך לשרשר אליה) אות אחת. אחר כך אתה שולח לפונ כל פעם מצביע לתחיל האות הבאה, כלומר: a+sizeof(char), או a+1, כאשר a זו המחרוזת שלך.
פורסם 2005 בינואר 2920 שנים אם זה רקורסיבי אז התנאי עצירה צריך להיות שאין עוד תווים במחרוזת השניה.ז"א, אם אין בה בכלל תווים, אז המחרוזת הראשונה תוחזר.ואז התוכנה עדיין עובדת, כי מחרוזת+כלום=מחרוזת, לא?
פורסם 2005 בינואר 2920 שנים לא כל כך הבנתי מה שאתה רוצה... האם זה בסדר? #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
פורסם 2005 בינואר 2920 שנים #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));}
פורסם 2005 בינואר 2920 שנים מחבר קמפלתי והרצתי את התוכנית שלך, תודה רבה על העזרה.ישנם שתי בעיות:- בהדפסה היא מדפיסה פעמיים, בתחילה את המחרווזת כסדרם, ובשורה הבאה את המחרוזות הפוך.- אין אפשרות "ליצור" מחרוזת ריקה - הוא פשוט לא מקבל את האנטר וממשיך לדורוש להכנסת תוים.בתודה מראש.
פורסם 2005 בינואר 2920 שנים אתה מדבר על הקוד השני ? זה כי עשיתי פעמיים PRINTF פעם רגיל, פעם הפוך (תנסה להבין את הקוד לפני כן)....הבעיה היא של SCANF, לא של הפקודה...
פורסם 2005 בינואר 2920 שנים void rec_cat(char *str1, char *str2){ if (*str2) { str1[strlen(str1)] = *str2; str1[strlen(str1)+1] = '\0'; rec_cat(str1,str2+1); } }
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.