פורסם 2007 במרץ 518 שנים whats up guys?קיצר, אני צריך לכתוב יחידת ספריה בפסקל שתטפל במחרוזות.התחלתי, והכל נחמד, חוץ מכמה בעיות.אני אתחיל- procedure DeleteString(var S:StrRecordType;Index,Count:integer);var I:integer;begin if Index<=S.Len then if Index+Count>S.Len then writeln('too long') else begin for I:=0 to S.Len-(Index+Count) do S.Str[Index +I]:=S.Str[Index + Count +I]; end; S.Len:=S.Len - Count;end;מה לא בסדר פה? משום מה כל פעם שאני מנסה להפעיל את הפרוצדורה הנ"ל יוצאות תוצאות לא קשורות.עוד משהו, אני כרגע מנסה לפתח משהו כמו POS, ולא ממש מצליח לנסח את זה...מישהו יכול להביא אלגוריתם\פסאודו-קוד לזה?תודה מראש.
פורסם 2007 במרץ 518 שנים אתה לא יכול בפסקל להכניס ככה מחרוזת בתוך מחרוזת... S.Str[index +I]:=S.Str[index + Count +I];אתה צריך להשתמש בפונקציות ספריה.
פורסם 2007 במרץ 518 שנים מחבר וכי למה לא? אין פה שום שגיאות קומפילציה, משמע זה עובד...ואיזה פונקציות ספריה, זה כל העניין, *אני* אמור לכתוב יחידת ספריה לזה.
פורסם 2007 במרץ 518 שנים אתה לא יכול להחליף מחרוזת בצורה בה אתה עושה את זה,אתה לא יכול פשוט להכניס במקום תו, תו אחר, מחרוזת זה משהו קבוע.פונקציות לטיפול במחרוזות:1. length(Str) - Length('ShagaLaga') = 9 = מחזיר את מספר התווים של מחרוזת מסויימת2.conact(Str1,Str2) = Conact('Shaga,Laga') = ShagaLaga = מחבר שני מחרוזות או יותר3. copy(str1,index,count) = copy('ShagaLaga',2,2) = ha = מחזיר תת מחרוזת של המחרוזת המקורת Str1 באורך count החל מהמקום המצוין ע"י index4. pos(str1,str2) = pos('S','ShagaLaga') = 1 = הפונקציה מחזירה את מיקומה הראשון של תת מחרוזת str1 במחרוזת str2 אם תת המחרוזת st1 לא מופיעה יוחזר הערך 05. ord(chr) = ord('a') = 97 = מחזיר את הקוד אסקי של התו6. chr(Asci) = chr(97) = a = מחזיר את התו של המספרפרוצדורות לטיפול במחרוזות:1. Delete(Str1,Index,Count) = Delete('helloe,2,3) = ho הפרוצדורה מוחקת Count תווים מהמחרוזת str1 החל מהמקום המצויין ע"י index2. Insert(Str1,Str2,Index) = Insert('comon',paris',4) = comparison = הפרוצדורה מכניסה את תת המחרוזת str1 למחרוזת str2 החלמהמקום המצויין על ידי index3. str(Value,str) = הפרוצדורה ממיאה את Value (ערך מספרי ) למשתנה מחרוזת str1 דוגמא בהמשך4.Val(Str1,Value,Int) = הפרוצדורה ממירה את המחרוזת str1 למשתנה מספרי Value במידה והמחרוזת הומרה הנשתנה int יכיל ערך 0 אחרת המשתשנה int יכיל את מיקום התו שהפריע להמרה דוגמא בהמשך(לקוח מ SourceCode.co.il)תשתמש בחלק מהן שתמצא לנכון.
פורסם 2007 במרץ 518 שנים מחבר אתה *עדיין* מתעקש להתעלם ממה שאני אומר. הפונקציות שהבאת? אני מכיר אותם. *אסור* לי להשתמש בהם, אני צריך לכתוב *אותם*,או יותר כמו תחליפים..ומחרוזות=מערך של תווים. אני ועוד איך יכול.
פורסם 2007 במרץ 518 שנים OK הבנתי אותך.תנסה להשתמש במחרוזת ריקה חדשה תעבור איתה ואז תעביר את זה לתוך המחרוזת הישנה.ושוב אני אומר לך, אתה לא יכול לשנות ככה את התוים.
פורסם 2007 במרץ 518 שנים מחבר בספר יסודות מדעי המחשב חלק 2, ע"מ 153 כתוב שמותר לי. הרעיון של ה"מחיקה" פה הוא סתם להעתיק את ההמשך מעל למה שאתה רוצה למחוק ולעדכן אות אורך המחרוזת. אם יש לך הצעה יותר טובה, אשמח לשמוע.
פורסם 2007 במרץ 518 שנים טוב אז,דבר ראשון מה צריכה הפרוצדורה שלך לעשות בדיוק?מה משמעות הפרמטרים הללו?האם מותר להשתמש בפונ', פרו' ספריה אחרות? כלומר לא DELETE..?
פורסם 2007 במרץ 518 שנים מחבר אוקי, אז ככה.הפרוצדורה אמורה למחוק קטע מחרוזת.ההגדרות הם ככה:טיפוס המחרוזת:type StrArrayType= packed array[1..255] of char;type StrRecordType= packed record Len:0..255; Str:StrArrayType; end;[/codק[ הפרוצדורה מוגדרת[code]procedure DeleteString(var S:StrRecordType;Index,Count:integer);S היא המחרוזת שממנה אתה מוחק. הפרוצדורה אמורה למחוק COUNT תווים ממיקום INDEX, ולעדכן את אורך המחרוזות כנדרש.מותר שימוש בכל דבר אחד שהוא לא DELETE המקורית.
פורסם 2007 במרץ 518 שנים 1) היכן השורה הזו אמורה להיות ממוקמת?S.Len:=S.Len - Count;2) תשנה את הלולאה שלך למשהו יותר קריאף כלומר, שתתחיל מINDEX עד LEN-COUNT(יתכן שצריך להוסיף 1 במקום כלשהו, לא ספרתי).
פורסם 2007 במרץ 518 שנים אולי תיצור מחרוזת חדשה, ותעשה לולאה מ 1 עד INDEX ותשים את התוים בישנה.ואז עוד לולאה מ מ INDEX+1 עד INDEX+COUNT ושוב תכניס לתוך החדשה.ואז תאפס את הישנה ושים בתוך הישנה את החדשה.נקבל איזשהי מחרוזת S.משהו כמו:var snew:string;snew:='';For i:=1 to Index do snew:=snew+S[i];For i:=(Index+count) to (length(S)) do snew:=snew+S[i];S:=snew;
פורסם 2007 במרץ 518 שנים לא חבל כל הזמן להוסיף אות אות עם +?אולי תנסה לנצל את המבנה של המחרוזת בפסקל(אני חושב שאורך המחרוזת נמצא באיבר ה- 0, וכל שאר האותיות מתחילות מהאיבר ב1). תשים ב- index+count-1 את אורך המחרוזת שאחרה זו שאתה מסיר, ופשוט תשרשר אותן(אל תשכח לשנות את אורך המחרוזת ה"מקורית" ל- index).
פורסם 2007 במרץ 618 שנים זה נכון שבאיבר ה-0 נמצא אורך המחרוזת כ ASCII אבל לא הבנתי את ההמשך של מה שכתבת..
פורסם 2007 במרץ 618 שנים תשנה את המחרוזת שלך ותיצור 2 מחרוזות חדשות מאותה מחרוזת על אותו שטח זיכרון - המחרוזת שלפני החלק שאתה מוריד, והמחרוזת שאחרי החלק שאתה מוריד. אחר כך תיקח את 2 המחרוזות שיצרת ותשרשר אותן אחת אחרי השניה.
פורסם 2007 במרץ 618 שנים אפשר גם בכלל ללא לולאות ככה:יש לנו את המחרוזת S.var s1,s2:string;s1:=copy(1,index);s2:=copy(index+count,length(s));s:=s1+s2;אבל זה בעצם עושה את אותו הדבר.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.