ABA


"מדוע הקוד הבא ב C לא עובד בשלמותו?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #20331 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 20331
Wolf  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.11.04
45707 הודעות, 5 פידבק
   17:47   10.11.13   
אל הפורום  
  מדוע הקוד הבא ב C לא עובד בשלמותו?  
 
   ערכתי לאחרונה בתאריך 10.11.13 בשעה 18:03 בברכה, Wolf
 
אתם מתבקשים לקמפל ולהריץ - כדי לסיים את המשפט יש להקיש CTRL Z .

יש לכתוב תוכנית שמקבלת קלט של טקסט מהמשתמש , ותספור כמה פעמים הוקשה המילה yes בטקסט ותציג זאת למשתמש לאחר שהקיש CTRLZ .

שאני מקמפל ובודק ומקיש משפט כמו dsdsd sdsd yes dddfg yes
הוא אכן מראה לי שהמילה yes נכתב פעמיים .

אבל שאני רושם
mmmyeyesmmmyeyeyesmmmyesmm
הוא אומר שהמילה הוקשה פעמיים למרות שהיא הוקשה 3 פעמים

איפה הטעות?



#include <stdio.h>

int main()
{
int count=0 ; // counter for counting
char letter; // save the letter of each word

printf("Write the text.\n");

while ((letter=getchar())!=EOF) // while - untill eof
{
if (letter=='Y'||letter=='y') // Checks if the first letter in the word is y or Y with capslock
{
if ((letter=getchar())=='E'||letter=='e') // Checks if the first letter in the word is e or E with capslock
{
if ((letter=getchar())=='S'||letter=='s') // Checks if the first letter in the word is s or S with capslock
{
count++; // adding +1 to the count int
}
}
}
}
printf("The word yes has appeared %d times\n in the text", count);
return 0;
}


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  מכתב TheKid 10.11.13 20:08 1
     +1 TYSON  10.11.13 20:12 2
     מז''א זה לא פורום שיעורי בית?! Wolf  10.11.13 20:28 3
         אופייני לישראלי במקום להגיד תודה להיתפס על הערה צינית חסרת משמעות ואחרי זה לרשום TheKid 10.11.13 20:33 4
             אז זה אומר שההערה הצינית שלך הייתה לא במקום Wolf  10.11.13 20:36 5
                 +1 גם אני לא הבנתי למה הוא רשם את ההערה הלא קשורה הזאת Mirage  21.11.13 16:42 20
  למה לא לכתוב את הקוד בצורה הבאה: CaTz 10.11.13 21:23 6
  זה שאלה בהתאמת מחרוזות.. יש לך אלגוריתם KMP inno3D 10.11.13 21:32 7
     זה לא ב-RT, הוא כתב ב-RT. Consigliere  10.11.13 21:40 9
         אפשר כמובן לשנות את האלגוריתם.. inno3D 10.11.13 21:42 10
             תאכלס כן.. אבל אם הדרישה היא ב-RT Consigliere  10.11.13 21:48 11
                 לא ממש הבנתי איך הגעת ל N בריבוע.. inno3D 10.11.13 22:01 13
                     O זה תמיד worst case Consigliere  10.11.13 22:21 14
                         אני כבר לא חזק זמני ריצה אבל כנס............ inno3D 10.11.13 22:44 16
                             לא.. Consigliere  10.11.13 22:53 18
                                 ברגע שאתה אומר שמשהו הוא חצי ממשהו inno3D 10.11.13 23:07 19
  הבעיה שלך היא מחרוזות מקוננות ב-RT Consigliere  10.11.13 21:38 8
     האמת היא שאפשר להסתכל על זה במכונת מצבים Consigliere  10.11.13 21:58 12
  קראתי את ההמלצות ועשיתי קוד חדש - דעתכם ? Wolf  10.11.13 22:38 15
     לא הבנתי שהמילה שאתה צריך היא תמיד yes inno3D 10.11.13 22:48 17

       
TheKid לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 5.10.07
17978 הודעות, 1 פידבק
   20:08   10.11.13   
אל הפורום  
  1. מכתב  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 10.11.13 בשעה 20:19 בברכה, TheKid
 
הקוד שלך כתוב בצורה לא נכונה והוא נופל בYES השני..
מכיוון שאתה מחפש את הS כאשר רשום לך YEYES אז כאשר אתה מקבל את הY אתה בודק אותו מול הS ומכיוון שהם שונים אתה בעצם זורק אותו ולא מקבל אותו בפעם השנייה.

בלי קשר זה לא פורום שיעורי בית

קוד נכון היה נבנה כמו מכונת מצבים



while letter = getchar() != eof

if(letter == y) state = 1;
else state = 0;
if(state == 1) && (letter == e) state = 2;
else state = 0;
if(state == 2) && (letter == s) {counter++; state = 0;}
else state = 0;


משהו כזה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TYSON 
חבר מתאריך 17.9.08
8384 הודעות
   20:12   10.11.13   
אל הפורום  
  2. +1  
בתגובה להודעה מספר 1
 
   זה גם יפול אם תעשה
yyes

וכאלו
אם האות השניה\שלישית לא נכונה, אל תזרוק ותתחיל מהתחלה. תמשיך איתה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Wolf  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.11.04
45707 הודעות, 5 פידבק
   20:28   10.11.13   
אל הפורום  
  3. מז''א זה לא פורום שיעורי בית?!  
בתגובה להודעה מספר 1
 
   ערכתי לאחרונה בתאריך 10.11.13 בשעה 20:32 בברכה, Wolf
 
אני לא ביקשתי ממכם לכתוב לי את הקוד מ 0, אני כתבתי אותו לבד ושאלתי מה לא בסדר.
אל תשכח שזה פורום שמטרתו לעזור אחד לשני.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
TheKid לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 5.10.07
17978 הודעות, 1 פידבק
   20:33   10.11.13   
אל הפורום  
  4. אופייני לישראלי במקום להגיד תודה להיתפס על הערה צינית חסרת משמעות ואחרי זה לרשום  
בתגובה להודעה מספר 3
 
   "אל תשכח שזה פורום שמטרתו לעזור אחד לשני."
כאילו משהו חייב לו משהו


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Wolf  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.11.04
45707 הודעות, 5 פידבק
   20:36   10.11.13   
אל הפורום  
  5. אז זה אומר שההערה הצינית שלך הייתה לא במקום  
בתגובה להודעה מספר 4
 
   אתה לא חייב לי כלום.
אני מזכיר בשנית שאתה גולש במערכת פורומים - שמבוססת על שיתוף פעולה בין הגולשים. אני סה"כ ביקשתי עזרה - ההערה שלך לא הייתה במקום, לא ביקשתי מאף אחד שיענה לי על השאלה מ 0.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Mirage 
חבר מתאריך 18.12.11
5193 הודעות
   16:42   21.11.13   
אל הפורום  
  20. +1 גם אני לא הבנתי למה הוא רשם את ההערה הלא קשורה הזאת  
בתגובה להודעה מספר 5
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
CaTz
חבר מתאריך 2.10.04
14537 הודעות
   21:23   10.11.13   
אל הפורום  
  6. למה לא לכתוב את הקוד בצורה הבאה:  
בתגובה להודעה מספר 0
 
   נניח יש לך את הסטרינג str, שבוא אתה מחפש מופעים של מילה.
אז תעשה לולאה שמתקדמת כל פעם ב-1
ובכל איטרציה לעבור תו תו בשלישיה ( i, i+1, i+2) הנוכחית ולהשוות מול המילה yes. אם נמצא לעלות את המונה, אם לא להתקדם +1.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
inno3D
חבר מתאריך 21.4.02
4533 הודעות
   21:32   10.11.13   
אל הפורום  
  7. זה שאלה בהתאמת מחרוזות.. יש לך אלגוריתם KMP  
בתגובה להודעה מספר 0
 
   פיתחו אלגוריתם די יעיל למשימה הזאת
אם זה מעניין אותך

http://www.cprogramming.com/snippets/source-code/knuthmorrispratt-kmp-string-search-algorithm


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Consigliere 
חבר מתאריך 12.4.11
580 הודעות
   21:40   10.11.13   
אל הפורום  
  9. זה לא ב-RT, הוא כתב ב-RT.  
בתגובה להודעה מספר 7
 



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
inno3D
חבר מתאריך 21.4.02
4533 הודעות
   21:42   10.11.13   
אל הפורום  
  10. אפשר כמובן לשנות את האלגוריתם..  
בתגובה להודעה מספר 9
 
   אלגוריתמים לא מותאמים לכל המצבים

אבל זה הבסיס


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Consigliere 
חבר מתאריך 12.4.11
580 הודעות
   21:48   10.11.13   
אל הפורום  
  11. תאכלס כן.. אבל אם הדרישה היא ב-RT  
בתגובה להודעה מספר 10
 
אני בספק עם העיקרון של קמפ עובד, אתה לא ממש יכול לעבור עם רישות.

אני בכלל בספק אם אפשר לעבור עם משהו על RT שהוא פחות מ - O n^2



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
inno3D
חבר מתאריך 21.4.02
4533 הודעות
   22:01   10.11.13   
אל הפורום  
  13. לא ממש הבנתי איך הגעת ל N בריבוע..  
בתגובה להודעה מספר 11
 
   במיוחד שבד"כ ב pattern - במקרה שלנו yes, קצר משמעותית מהטקסט

יכול להיות שזה לא עובד אם אתה מכניס כל הזמן תווים ברצף
אבל לא הייתי אומר שזה לא יעבוד בטוח


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Consigliere 
חבר מתאריך 12.4.11
580 הודעות
   22:21   10.11.13   
אל הפורום  
  14. O זה תמיד worst case  
בתגובה להודעה מספר 13
 
ואם הטקסט הוא קצר אז מאוד אז ברור, זה תמיד נכון.

אבל תחשוב על טקסט בסדר גודל n/2 וטקסט n,

אתה אף פעם לא יודע מה האות הבאה, ואחד הדברים היפים כשאתה מכניס טקסט ב-RT זו העובדה שאתה תמיד יכול לעשות מניפולציות כדי להגיד ל-WORST CASE, בגלל זה זה שיט לא קטן.

אז תחשוב מה אתה עושה כשאתה רוצה לחפש מחרוזת בגודל n/2, אתה לא יכול לעשות אוטומט סופי כזה נכון?

אז אתה תמיד חייב לבדוק את האות הבאה.

נניח אתה מחפש את הרצף aa..a באורך n/2,
והטקסט שלך הוא

abaabaaabaaaabaaaab.... וכן הלאה,

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

לכן אני לא יכול לחשוב על אלגוריתם בנאלי שעושה את זה בפחות מ-O n^2

אולי עשו דברים מתוחכמים שהורידו את זה, אבל לא מאמין שלסדר גודל של n.



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
inno3D
חבר מתאריך 21.4.02
4533 הודעות
   22:44   10.11.13   
אל הפורום  
  16. אני כבר לא חזק זמני ריצה אבל כנס............  
בתגובה להודעה מספר 14
 
   האלגוריתם הזה על קלט סופי (קלט עם n תווים) רץ ביעילות O(n+m)
n אורך הטקסט, m אורך התבנית
ככה שזה בטוח יהיה בפונקציה של אורך הקלט
לכל אורך של טקסט סופי היעילות של KMP הוא אורך הטקסט

בנוסף, התבנית שלך בטוח סופית
זה שאתה אומר שהתבנית של באורך n/2
כבר אומר שהמחרוזת שלך סופית
אז מה שאתה אומר לא ממש מדויק..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Consigliere 
חבר מתאריך 12.4.11
580 הודעות
   22:53   10.11.13   
אל הפורום  
  18. לא..  
בתגובה להודעה מספר 16
 
n/2 סופי בדיוק כמו ש-n סופי.

אתה מציג אלגוריתם שרץ ב-O n+m, אני טוען שאני לא חושב שאפשר ב-RT לתכנן אלגוריתם שרץ בפחות מ-O nm (שבמקרה של הדוגמא שלי יוצא On^2).

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

ועבוד trie כמובן שאפשר לבדוק מחרוזת (לטקסט נתון) באורך המחרוזת.



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
inno3D
חבר מתאריך 21.4.02
4533 הודעות
   23:07   10.11.13   
אל הפורום  
  19. ברגע שאתה אומר שמשהו הוא חצי ממשהו  
בתגובה להודעה מספר 18
 
   בהקשר של קוד תוכנה, אז n הוא ידוע מראש..

בכל מקרה נראה ש WOLF פתר לעצמו תבעיה עם אחלה קוד
שנראה שעובד סבבה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Consigliere 
חבר מתאריך 12.4.11
580 הודעות
   21:38   10.11.13   
אל הפורום  
  8. הבעיה שלך היא מחרוזות מקוננות ב-RT  
בתגובה להודעה מספר 0
 
ראשית אני לא יודע למה בחרת לבצע את הבדיקה ב-RT, כלומר לא עדיף לקחת את המחרוזת לשמור אותה ואז לעבוד עליה? אולי זו הדרישה של התרגיל.

בכל אופן מכונת מצבים שהציעו פה ניתן ליישום פשוט, אבל זה סתם מסרבל.

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



#include <stdio.h>
int main()
{
int count=0 ; // counter for counting
char letter; // save the letter of each word
int indicator = 100;
printf("Write the text.\n");


while ((letter=getchar())!=EOF) // while - untill eof
{
switch(letter){

case 'Y':
indicator = 1;
break;
case 'y':
indicator = 1;
break;
case 'E':
if (indicator == 1){
indicator++;
}
else{
indicator = 100;
}
break;
case 'e':
if (indicator == 1){
indicator++;
}
else{
indicator = 100;
}
break;
case 'S'||'s':
if (indicator == 2){
indicator = 100;
count++;
break;
case 's':
if (indicator == 2){
indicator = 100;
count++;
break;
default:
indicator = 100;
}
}
}
}
printf("The word yes has appeared %d times\n in the text", count);
return 0;
}

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

אז ככה, קודם כל כשאתה בודק דברים ב-RT אתה לעולם לא יכול לקנן התניות, מהסיבה הפשוטה שאתה לא יודע מה הדבר הבא. נניח משתמש הקליד y, אם הוא מקליד שוב y, אתה כבר נמצא במקום אחר לגמרי בקוד, בתוך ה-if השני, ויכול להיות שדווקא עכשיו הוא ישלים את המילה yes.

אפשר לצאת מזה עם מכונת מצבים אבל אפשר לעשות את זה גם ע"י indicator פשוט, בגלל שאתה יודע מה המילה שאתה מחפש.

אתה צריך מילה בת 3 אותיות, הראשונה y, השנייה e והשלישית s.
לכן תבדוק עם case או if-else אם יותר נוח לך, מה האות שאתה מקבל, אם קיבלת y, תסמן את זה, נניח תגיד שהאינדיקטור הוא 1. כעת, תקבל את האות הבאה - אם היא למשל במקרה e, תרצה לדעת האם כבר קיבלת y מקודם, לך לאינדיקטור תראה אם הוא אחד, אם הוא אחד, יופי.. קיבלת y ואחרי e, תעבור לאות הבאה - אם לא ה-indicator לא היה לפני כן 1 כלומר ה-e הזה לא בדרך להשלים את המילה yes, אז תאפס אותו, תזרוק לו מספר רנדומלי. אם הצלחת להגיע לאות s, תבדוק האם לפני כן היה e ו-y ברצף, במקרה כזה ה-indicator יהיה 2, אם השלמת מילה תעלה את count, תאפס את האינדיקטור ותמשיך. עבור כל אות אחרת תתן מספר רנודמלי כלשהו לאינדיקטור, אני תמיד נתתי 100.

מקווה שזה עזר.



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Consigliere 
חבר מתאריך 12.4.11
580 הודעות
   21:58   10.11.13   
אל הפורום  
  12. האמת היא שאפשר להסתכל על זה במכונת מצבים  
בתגובה להודעה מספר 8
 
אבל לא יודע אני אף פעם לא אוהב לחשוב ככה.



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Wolf  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.11.04
45707 הודעות, 5 פידבק
   22:38   10.11.13   
אל הפורום  
  15. קראתי את ההמלצות ועשיתי קוד חדש - דעתכם ?  
בתגובה להודעה מספר 0
 
   http://pastebin.com/fDj46ZDV


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
inno3D
חבר מתאריך 21.4.02
4533 הודעות
   22:48   10.11.13   
אל הפורום  
  17. לא הבנתי שהמילה שאתה צריך היא תמיד yes  
בתגובה להודעה מספר 15
 
   ערכתי לאחרונה בתאריך 10.11.13 בשעה 22:52 בברכה, inno3D
 
אז עזוב את מה שנתתי..
אפשר לוותר עליו כי הוא כללי מידי


אבל הרצת את הקוד שלך?
אחרי כל תו אתה רוצה להכניס אנטר?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net