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

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


TheSlider

Recommended Posts

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

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

סעיף א' :

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

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

ארכיון

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

×
  • צור חדש...