פורסם 2010 במאי 1215 שנים היי חברים, יש לי תרגיל להגשה. יש לכם כיוון איך לעשות את זה?סעיף א' : כתבו פונקציה בעלת המפרט (prototype) הבא:int skip_strstr (char *str1, char *str2, int skip);הפונקציה תבדוק אם המחרוזת str2 מופיעה בדילוגים של skip במחרוזת str1 (ראו דוגמאות להלן). הפונקציה תחזיר את מספר הפעמים שבהם str2 הופיעה ב-str1 בדילוג skip . דוגמאות:1) המחרוזת abc מופיעה בדילוגי 2 במחרוזת cdbadbfca , פעם אחת2) המחרוזת abc מופיעה בדילוגי 1 במחרוזת abcdabc , פעמיים 3) המחרוזת abc מופיעה בדילוגי 2 במחרוזת aabbcc , פעמיים 4) המחרוזת abc לא מופיעה בדילוגי 2 במחרוזת abc (הפונקציה תחזיר 0)הערה: אם אחת המחרוזות (או שתיהן) באורך 0, אז יש להחזיר 0בסעיף זה אין להשתמש באופרטור [] על מנת לגשת לתווים במחרוזת. תודה רבה חברים!!
פורסם 2010 במאי 1215 שנים נראה לי שכוונת המשורר היתה שימוש בפוינטרים אתה מגדיר שני פוינטרים ומציב אותם לתחילת המחרוזות str1 str2 (נגיד נקרא להם pstr1 pstr2) אתה מתחיל לרוץ על str1 באמצעות קידום pstr1 ב 1 בכל איטרציה אתה משווה את התוים שמוצבעים ע"י שני הפוינטרים (שים לב שאתה לא צריך להשוות את הפוינטירם עצמם אלא את הערכים בכתובות המוצבעות) אם נמצא שוויון אז אתה מתחיל לרוץ על str2 באמצעות קידום pstr2 ב 1 בכל איטרציה אתה בודק האם התו שמוצבע ע"י pstr2 שווה לתו שמוצבע ע"י pstr1 פלוס skip כפול מספר האיטרציה אם גמרת לרוץ על str2 וכל התוים היו שווים - יש לך מופע אחד שמצאת עכשיו תחזור ללולאה החיצונית ותקדם את pstr1 ב-1 (אל תשכח להחזיר את pstr2 להתחלת המחרוזת) ואל תשכח בשתי הלולאות לבדוק שלא חרגת מאורך המחרוזת - טעות מאד נפוצה כשעובדים עם פוינטרים ... זה בטח נראה מבלבל אז אני מציע שתעשה ריצה יבשה על הדוגמאות. עריכה: ראיתי שכבר ענו לך בשירשור אחר לגבי עבודה עם פוינטרים אני מבין שהחלטת לשים פה את כל שיעורי הבית שלך.... כמו בפירסומת - כולם עובדים בשבילך לא משנה. תיהנה.
פורסם 2010 במאי 1215 שנים מחבר תודה רבה על העזרה. אילו בהחלט שעורי בית שאני יושב עליהם שעות! ולא מצליח! בכל מקרה זו התכנית שתרגמתי אותה מהתחביר המילולי שלך, לשפת C. זהו דגל שהגדרתי למקרה שהתווים לא זהים - not אלה אורכי המחרוזות בהתאמה - len1,len2 mone - זהו המשתנה שסופר את מספר המופעים של המחרוזת השניה בראשונה עם מספר הדילוגים הנדרש. #include <stdio.h>#include <string.h>#define SIZE 80int skip_strstr (char *str1, char *str2, int skip){ int i=0,j=0,len1,len2,not=1,mone=0; len1=strlen(str1); len2=strlen(str2); if (len1==0 || len2==0) return 0; for (i=0; i<len1; i++) { if (*(str1+i)=(*(str2))) { for (j=0; j<len2; j++) { if (*(str2+j)!=(*(str1+skip*j))) not=0; } } if (not==1) mone++; not=1; } return mone;}int main(){ char str1[SIZE],str2[SIZE]; int jump; printf("Please enter a string\n"); gets(str1); printf("Please enter a second string\n"); gets(str2); printf("Please enter a number to skip\n"); scanf("%d",&jump); printf ("This is the number %d\n",skip_strstr (str1,str2,jump)); printf("\n"); return 0;} התכנית מחזירה לי ערכים שגויים כל הזמן. אלה מספר דוגמאות שצרפו יחד עם שעורי הבית האלה כדי שנריץ ונראה שזה יוצא זהה דוגמאות: 1) המחרוזת abc מופיעה בדילוגי 2 במחרוזת cdbadbfca , פעם אחת 2) המחרוזת abc מופיעה בדילוגי 1 במחרוזת abcdabc , פעמיים 3) המחרוזת abc מופיעה בדילוגי 2 במחרוזת aabbcc , פעמיים 4) המחרוזת abc לא מופיעה בדילוגי 2 במחרוזת abc (הפונקציה תחזיר 0) הבעיה היא שזה ממש לא יוצא זהה. תודה רבה על העזרה!
פורסם 2010 במאי 1215 שנים טוב, עשית פה את הטעות הנוראית שכולם עושים, אחת הטעויות שגורמת להמון בעיות וממש קשה לאתר אותה.רואה את השורה הזאת?*(str1+i)=(*(str2))חסר לך עוד סימן =. אתה עושה בטעות השמה במקום השוואה.
פורסם 2010 במאי 1215 שנים אני מאמין שהקומפילר יתפוס את הבאג הזה עם non-L-value assignment . זאת אחת הדרכים להמנע מהבאג הזה אם משווים constant למשתנה כדאי לשים את המשתנה בצד ימין
פורסם 2010 במאי 1215 שנים כמו כן, שים לב ש str1+skip*j יכול לחרוג מאורך המחרוזת...הייתי גם ממליץ לתת שמות משתנים בעלי משמעות (למשל not...)
פורסם 2010 במאי 1215 שנים אני מאמין שהקומפילר יתפוס את הבאג הזה עם non-L-value assignment . כיוון שזה קוד חוקי, מקסימום הוא ייתן אזהרה.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.