עבור לתוכן

עזרה במימוש פונקציה

Featured Replies

פורסם

היי חברים, יש לי תרגיל להגשה.

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

סעיף א' :

כתבו פונקציה בעלת המפרט (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

בסעיף זה אין להשתמש באופרטור [] על מנת לגשת לתווים במחרוזת.

תודה רבה חברים!!

פורסם

נראה לי שכוונת המשורר היתה שימוש בפוינטרים

אתה מגדיר שני פוינטרים ומציב אותם לתחילת המחרוזות str1 str2 (נגיד נקרא להם pstr1 pstr2)

אתה מתחיל לרוץ על str1 באמצעות קידום pstr1 ב 1

בכל איטרציה אתה משווה את התוים שמוצבעים ע"י שני הפוינטרים (שים לב שאתה לא צריך להשוות את הפוינטירם עצמם אלא את הערכים בכתובות המוצבעות)

אם נמצא שוויון אז

אתה מתחיל לרוץ על str2 באמצעות קידום pstr2 ב 1

בכל איטרציה אתה בודק האם התו שמוצבע ע"י pstr2 שווה לתו שמוצבע ע"י pstr1 פלוס skip כפול מספר האיטרציה

אם גמרת לרוץ על str2 וכל התוים היו שווים - יש לך מופע אחד שמצאת

עכשיו תחזור ללולאה החיצונית ותקדם את pstr1 ב-1 (אל תשכח להחזיר את pstr2 להתחלת המחרוזת)

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

זה בטח נראה מבלבל אז אני מציע שתעשה ריצה יבשה על הדוגמאות.

עריכה: ראיתי שכבר ענו לך בשירשור אחר לגבי עבודה עם פוינטרים

אני מבין שהחלטת לשים פה את כל שיעורי הבית שלך.... כמו בפירסומת - כולם עובדים בשבילך :)

לא משנה. תיהנה.

פורסם
  • מחבר

תודה רבה על העזרה. אילו בהחלט שעורי בית שאני יושב עליהם שעות! ולא מצליח! :kopfpatsch:

בכל מקרה זו התכנית שתרגמתי אותה מהתחביר המילולי שלך, לשפת C.

זהו דגל שהגדרתי למקרה שהתווים לא זהים - not

אלה אורכי המחרוזות בהתאמה - len1,len2

mone - זהו המשתנה שסופר את מספר המופעים של המחרוזת השניה בראשונה עם מספר הדילוגים הנדרש.

#include <stdio.h>
#include <string.h>
#define SIZE 80




int 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)

הבעיה היא שזה ממש לא יוצא זהה.

תודה רבה על העזרה! :)

פורסם

טוב, עשית פה את הטעות הנוראית שכולם עושים, אחת הטעויות שגורמת להמון בעיות וממש קשה לאתר אותה.

רואה את השורה הזאת?

*(str1+i)=(*(str2))

חסר לך עוד סימן =. אתה עושה בטעות השמה במקום השוואה.

פורסם

אני מאמין שהקומפילר יתפוס את הבאג הזה עם non-L-value assignment .

זאת אחת הדרכים להמנע מהבאג הזה אם משווים constant למשתנה כדאי לשים את המשתנה בצד ימין

פורסם

כמו כן, שים לב ש str1+skip*j יכול לחרוג מאורך המחרוזת...

הייתי גם ממליץ לתת שמות משתנים בעלי משמעות (למשל not...)

פורסם

אני מאמין שהקומפילר יתפוס את הבאג הזה עם non-L-value assignment .

כיוון שזה קוד חוקי, מקסימום הוא ייתן אזהרה.

פורסם
  • מחבר

תודה רבה על העזרה!!

בשעה טובה התרגיל נפתר!! :)

פורסם

לא שמתי לב ל* הוא כנראה יתן רק אזהרה (במקרה הטוב).

ארכיון

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

דיונים חדשים