Logo

רד-בורד: ארכיון

ראשי > תיכנות > שאלה ב-C# שלא מצליח לפתור...

13/01/2008 19:15:34 gili2323
קלט:תווי סוגריים עגולים ובסיומה התוו כוכבית
פלט:תקין/לא תקין.

לדוגמא:
() (())-תקין
)()(-לא תקין

מישהו יודע ויכול לעזור לי?
13/01/2008 19:23:09 onion
אממ... אני לא רואה פה שום דבר מסובך.
פשוט תעשה מונה לכל אחד מהסוגרים ואז תשווה בינהם.

ואתה יכול גם לבנות אוטומט מחסנית אם משעמם לך :D
13/01/2008 19:30:03 gili2323
אחי לא הבנת את השאלה.
לפי מה שאמרת אז שתי הדוגמות שרשמתי היו צריכים לצאת עם פלט "תקין",כי הם שווים בשתי הדוגמאות
13/01/2008 19:40:27 onion
וואלה צודק...
כנראה בגלל זה קיבלתי 59 במבחן האחרון :|
13/01/2008 19:51:12 onion
בכל אופן, למדת מחסניות?
כי מה שחשבתי עליו עכשיו הוא להכניס למחסנית אך ורק סוגרים פותחים, ואחרי זה כל פעם שמגיע סוגר להוציא מהמחסנית סוגר פותח...

לא יודע אם זה נכון, מקסימום נחכה להלל D:[ההודעה נערכה על-ידי onion ב-13/01/2008 19:51:46]
13/01/2008 20:20:48 Dak
מקרה קלאסי לשימוש ב (ועכשיו תדמיין שאני אומר את זה כמו ההתחלה של הסימפסונס לפני תחילת המנגינה... כן כן, איפה שהם שרים "The Simmmmpsonnnnsss") -רקורסיה.
13/01/2008 21:07:00 devil kide
ציטוט:מקרה קלאסי לשימוש ב (ועכשיו תדמיין שאני אומר את זה כמו ההתחלה של הסימפסונס לפני תחילת המנגינה... כן כן, איפה שהם שרים "The Simmmmpsonnnnsss") -רקורסיה.
לא מחייב.
ניתן לחפש סוגר פתיחה")", ואז לחפש סוגר סגירה (" אחריו, לאחר שנמצאו שניהם מוחקים אותם. לאחר שעושים זאת שוב ושוב (אורך המחרוזת\2 . במקרה שזה אי-זוגי נוסיף אחד) בלולאה,אם נשאר עוד "(" או ")" נדפיס שגיאה,אחרת נדפיס "הצלחה".
13/01/2008 21:11:07 gili2323
לא למדתי עוד רקורסיה ולא מחסניות.

devil kide,אחי שאתה אומר לחפש סוגר פתיחה אתה מתכוון שכל פעם שיש סוגר פתיחה להוסיף אותו לתוך משתנה,וכל פעם שיש סוגר סגירה להוסיף אותו לצבור אותו למשתנה אחר?

אתה יכול לרשום לי את זה ב-C# כי לא כל כך הבנתי
13/01/2008 21:40:08 gili2323
יש פה מישהו שמבין ב-C#?
13/01/2008 21:45:35 T4uSBaZ
WTFFF ARE WITH YA

בעקרון מה שהבנתי הולך ככה.. פשוט סוגריים בתוך סוגריים .. ואולי כמה סוגריים בתוך סוגריים.. ואולי סוגריים בתוך סוגריים בתוך סוגריים. נניח כמו ביטוי מטמטי.

((())) - תקין
(()()) - תקין

הקיצר.. זה הולך ככה.. אתם מוודאים שאתם מתחילים מ ) ומסיימים עם ( .
בזמן הזה אתם גם כל הזמן מקדמים את ה OPEN אם נמצא ) או מחסירים אם נמצא ( .


בכל פעם נעשת בדיקה בלולאה
אם המונה קטן מ0 - ישנם "סגורות" ל"לא פתוחות" יעני סגרנו למשהו שלא פתחנו..

בסוף הלולאה:
אם המונה גדול מ0 - ישנם סוגריים לא סגורות
0 - תקין

אגב לא התייחסתי לכוכבית..

קוד:
int isit(char *string)
{
int open=0; //open brackets, must be atleast 1
for(int i=0;i<strlen(string);i++)
{
if(string==’)’) open--;
else if(string==’(’) open++;
if(open<0) return 0; //not valid
}
return (valid==0); //if valid==0, it returns 1. otherwise - it returns 0.
}


לא ממש בדקתי את זה.. אז תסתכלו[ההודעה נערכה על-ידי T4uSBaZ ב-13/01/2008 21:46:05]
13/01/2008 21:47:11 devil kide
אין לי מושג בC#.


פשוט מאוד:


ציטוט:אורך_מחרוזת=אורך_מחרוזת(מחרוזת)
מצביע_אורך_מחרוזת=אורך מחרוזת
למען מונה_לולאה=0 מונה לולאה<=אורך_מחרוזת\2 ף מונה_לולאה++

בתוך הלולאה אתה כותב קוד שיעשה את הפעולות הבאות:
אם מחרוזת[מונה_לולאה]==")"
אז:
משתנה=מונה_לולאה
כל עוד (מחרוזת[מצביע_אורך_מחרוזת]!="(")
מצביע_אורך_מחרוזת--
החלף_מיקום_מחרוזת(מחרוזת,מצביע_אורך_מחרוזת,""{תו ריק})
החלף_מיקום_מחרוזת(מחרוזת,מצביע_לולאה,""{תור רקי})

אם אורך_מחרוזת(מחרוזת)==0
אז הדפס"תקין"
אחרת הדפס "שגיאה".

תיישם את זה באיזה שפה שבא לך.
כמובן כמו שאמרו למעלה, עם רקורסיה זה אמור להיות יותר פשוט.
בהצלחה.
נשמח לראות כאן את הקוד שלך.
13/01/2008 21:53:09 gili2323
ח’ברה אם אין פה מישהו שמבין ב-C# זה לא כל כך עוזר לי....אף אחד פה לא משתמש ב-C#?
13/01/2008 22:00:31 onion
אני במחזור האחרון שלומד אצלנו C...

ןאגב, זה נראה כמו תרגיל קלאסי למחסניות ולא לרקורסיה...
14/01/2008 00:22:36 NexTos
קוד:
static void Main(string[] args)
{
string str;
str = Console.ReadLine();

while((str!="")&&(str[0]!=’)’)&&(str.Length>=2))
{
str = str.Remove(str.IndexOf(")"), 1);
str = str.Remove(0, 1);
}

if (str == "") Console.WriteLine("takin");
else Console.WriteLine("lo takin");
}


אין ספק שרקורסיה היה מקצר תעניין אבל לא נורא =]
אם אתה לא מבין משהו אתה מוזמן לשאול..
ולא התייחסתי לקטע של הכוכבית בסוף אני לא מבין למה זה טוב =\
14/01/2008 16:12:57 gili2323
NexTos אחי יש לך מסנגר או אייסיקיו יש לי כמה שאלות.
14/01/2008 16:17:04 gili2323
כי אחי לא למדנו עוד עם string אז יש דברים שאני לא יודע בפתרון שרשמת לי.

ואחי הכוכבית בסוף זה הזקיף...שכאילו שמתי ששמים את הכוכבית הזאת אז סיימנו להקליד את הסוגריים השונים ושהפלט יוצג.
14/01/2008 16:29:18 NexTos
שלחתי לך בפרטי תמסנג’ר..
והבנתי, הזקיף זה כי אתה אמור להכניס תו תו במקום את כל המחרוזת בפעם אחת..
בכל מקרה זה שטויות לשנות את זה..
אם אתה רוצה אני אעזור לך בכיף.
14/01/2008 19:28:56 Hypathia
בחור, על שני דברים אתה צריך להסגר:
1. האלגוריתם.
2. המימוש.

לא קראתי לעומק, אבל נתנו לך פה כמה רעיונות איך לעשות את זה תאורטית. יש עוד דרכים. תשתמש בראש.
אם אתה סגור על רעיון כלשהו, רק לא יודע איך לכתוב את זה בסישארפית, שאל פה. נענה לך. אני אענה. רק שאל שאלה ספציפית.
זהו.
בהצלחה.
28/02/2008 20:53:45 ogg
קוד:
static void Main(string[] args)
{
bool flag = true;
char a=’^’;
int mone=0;
while (a != ’*’)
{
a = char.Parse(Console.ReadLine());
switch (a)
{
case ’(’: mone++;
break;
case ’)’: mone--;
break;
}
if (mone < 0)
{
flag = false;
}
if (a == ’*’)
{
if ((flag == false) || (mone > 0))
{
Console.WriteLine("lo takin");
}
if ((flag == true) && (mone == 0))
{
Console.WriteLine("takin");
}
}
}
}
}
}


הנה התשובה שלי בC#
פשוט השתמשתי בדגל שיורד מתי שמונה הסוגריים נהיה שלילי ואז מבטיח שלא יהיו פשלות
ומצתער עם זה הגיע כצת באיחור פשוט זה היום הראשון שלי בפורום,
בטח יש דרך יותר קצרה לפתור את זה ברקורסיה או במחסניות, אך לצתערי לא למדנו את שניהן עדיין(לעזזל עם המורה שלנו) ובהנחה שאתה ברמה שלי זה הפיתרון המסורבל ביותר אך הפשוט ביותר



[ההודעה נערכה על-ידי ogg ב-28/02/2008 21:13:31][ההודעה נערכה על-ידי ogg ב-28/02/2008 21:15:25]
עמודים: 1