ראשית אני לא יודע למה בחרת לבצע את הבדיקה ב-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.
מקווה שזה עזר.