עבור לתוכן

מחרוזת בתוך מחרוזת בתוך מחרוזת... [C++]

Featured Replies

פורסם

הי לקולם

ברצוני לבנות תוכנית שבודקת האם מחרוזת א' כלולה במחרוזת ב', מחרוזת ב' כלולה במחרוזת ג' וכך הלאה עד מחרוזת N אחרונה

נכון לאכשיו בניתי פונ' המחזירה TRUE אם מחרוזת STR1 נמצאת במחרוזת STR2

bool 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: האם יש אפשרות לרשום את הקוד בהודאה מדורג?

תודה מראש

פורסם

טוב, לא ממש ברורה לי השאלה שלך... פשוט תקרא עד ש- 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; // אם לא מצאנו את המחרוזת הראשונה בשנייה, נחזיר שקר
}

פורסם
  • מחבר

תודה על התגובה המהירה

משומה לא הצלחתי עם cin.eof() אנסה שוב.

האם הינך יכול לרשום את הפונ' בלי pointers, כי עדיין לא עברנו על הפוינטרים, ותמיד מעניין לדעת עוד שיטה לפתרון, במיוחד אם זהו פתרון יפה יותר ;)

תודה

פורסם

זה אומנם קוד בC אבל אני חושב שזה יעזור לך

bool is_inside (char str1[],char str2[])
{
int i;
for (i=0;str1[i]==str2[i]&&str2[i];i++)
{
}
return(!(str2[i]));
}

הסבר:

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

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

לאחר מכן מחזירים את השלילה של האיבר האחרון שניבדק במחרוזת השניה

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

פורסם
  • מחבר

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

:(

פורסם

טוב, הנה הקוד שלי ללא מצביעים:


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.

ארכיון

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

דיונים חדשים