פורסם 2006 בינואר 819 שנים הי לקולםברצוני לבנות תוכנית שבודקת האם מחרוזת א' כלולה במחרוזת ב', מחרוזת ב' כלולה במחרוזת ג' וכך הלאה עד מחרוזת N אחרונהנכון לאכשיו בניתי פונ' המחזירה TRUE אם מחרוזת STR1 נמצאת במחרוזת STR2bool is_inside(const char str1[MAX_STR_LEN], const char str2[MAX_STR_LEN]){ bool same; //Is chars is equal for(int second=0; str2[second]!=CLEAR_CELL; second ++) { same = true; for(int first=0; (str1[first]!=CLEAR_CELL) && (same!=false); first++) if (str1[first]!=str2[first+second]) same = false; return (same); } return (same);}(אשמח לראות את הדוגמה שלכם של הפונ' הנ''ל בצורה יותר יפה)מכאן אני צריך להריץ את הפונ' בלולאה, בתוך לולאה str1 מקבל את המחרוזת הראשונה, str2 מקבל את השניה, אח''כ מתבצעת בדיקת כלילות ע''י הפונ' is_inside באיטרציה השניה str1 מקבל את str2 ו-str2 אמור לקבל את המחרוזת הבאה מה-buffer (נראה לי שזה buffer), פה מתאוררת הבעיה, אם המחרוזת ב-buffer נגמרה אז CIN יבקש שוב מהמשתמש להכניס נתונים, אבל יש צורך שהמשתמש יכניס את את כל המחרוזות רק בהתחלה פעם אחת וזהו. PS: האם יש אפשרות לרשום את הקוד בהודאה מדורג?תודה מראש
פורסם 2006 בינואר 819 שנים טוב, לא ממש ברורה לי השאלה שלך... פשוט תקרא עד ש- cin.eof() יחזיר לך true, או שתקבע תנאי עצירה מסויים משלך (נניח שורה ריקה או שורה שמכילה רק נקודה).אבל לגבי מה ששאלת אם יש דרך יפה יותר, אז הנה:bool is_inside(const char* str1, const char* str2) { const char *p1, *p2; for ( ; *str2 != CLEAR_CELL ; ++str2) { // לעבור על המחרוזת השנייה for ( p1 = str1, p2 = str2 ; (*p1 != CLEAR_CELL) && (*p1 == *p2) ; ++p1, ++p2); // להשוות אות-אות בין המחרוזות if (*p1 == CLEAR_CELL) return true; // אם הסיבה שהפסקנו את הלולאה היא כי הגענו לסוף המחרוזת הראשונה, סבבה } return false; // אם לא מצאנו את המחרוזת הראשונה בשנייה, נחזיר שקר}
פורסם 2006 בינואר 819 שנים מחבר תודה על התגובה המהירה משומה לא הצלחתי עם cin.eof() אנסה שוב. האם הינך יכול לרשום את הפונ' בלי pointers, כי עדיין לא עברנו על הפוינטרים, ותמיד מעניין לדעת עוד שיטה לפתרון, במיוחד אם זהו פתרון יפה יותר תודה
פורסם 2006 בינואר 919 שנים זה אומנם קוד בC אבל אני חושב שזה יעזור לךbool is_inside (char str1[],char str2[]){ int i; for (i=0;str1[i]==str2[i]&&str2[i];i++) { } return(!(str2[i]));}הסבר:יוצאים מנקודת הנחה שהמחרוזת הרשונה יותר ארוכה והשניה צריכה להופיע בהואז משווים את שתי המחרוזות עד שאחד התנאים לא מתקיים או שהן כבר לא שוות או שהגענו לסוף המחרוזת השניהלאחר מכן מחזירים את השלילה של האיבר האחרון שניבדק במחרוזת השניה כי אם הגענו לסוף המחרוזת אז יש שם נאל כלומר 0 וזה בסי לפחות שווה לשקר אבל בישבילנו זה אמת כי בדקנו את כל המחרוזת ולא יצאנו באמצע
פורסם 2006 בינואר 919 שנים מחבר זה נראה רעיון יפה, אבל כנראה לא הסברתי את עצמי טוב, במקרא של str1 הוא AB ו-str2 הוא AABC אז המחרוזת הראשונה כלולה בשניה, ולפי הפונ' שהראתה זה לא מתקיים עוד רעיון שמצאתי ויכול להיות יעזור לך להבין למה התכוונתי [left]bool is_equal(const char str1[MAX_LENGTH], const char str2[MAX_LENGTH]){ bool same; //Is chars is equal for(int second=0; str2[second]!=CLEAR_CELL; second++) { same = true; for(int first=0; (str1[first]!=CLEAR_CELL) && (same!=false); first++) if (str1[first]!=str2[first+second]) same = false; if(same==true) return(same); } return (same);}[/left] עכשיו כאשר אני מנסה להריץ את החלק הזה של קוד while(!flag_stop) { if(!is_equal(str1, str2)) { same = false; break; } clear_string(str1); for(int i=0; str2[i]!=CLEAR_CELL; i++) //str1 <- str2 str1[i] = str2[i]; if(cin.peek()!=CLEAR_CELL) cin >> str2; else flag_stop=true; } בזמן שאני מפעיל את cin.peek() התוכנה עוצרת ומחקה שהמשתמש יזין עוד נתונים. כל פעם שאני מנסה לעבוד עם פונ' כמו זאת או כמו cin.eof() נוצרת את אותה הבעיה שאני צריך לקרוא cin לפני הבדיקה שה-buffer ריק, ואז הוא שוב מבקש מהמשתמש לקרוא נתונים
פורסם 2006 בינואר 919 שנים טוב, הנה הקוד שלי ללא מצביעים:bool is_inside(const char str1[], const char str2[]) { int i, j; for ( i = 0 ; str2[i] != CLEAR_CELL ; ++i) { for ( j=0 ; (p1[j] != CLEAR_CELL) && (p1[j] == p2[i+j]) ; ++j); if (p1[j] == CLEAR_CELL) return true; return false;}(אין הרבה הבדל, פשוט החלפתי כל מצביע באינדקס)ולגבי השאלה השנייה:char tmp_string[MAX_LENGTH];char str1[MAX_LENGTH];char str2[MAX_LENGTH];cin >> str2;bool done = false;while (!done) { // read another string, and replace strcpy(str1, str2); cin >> str2; if (cin.eof() || str2[0] == CLEAR_CELL) { done = true; } else { // ... here you can do whatever you want with str1 & str2. // if you don't want anymore input, set done to true } } אבל לא ממש ברור לי מה זה CLEAR_CELL.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.