עבור לתוכן

צריך עזרה עם כמה דברים בפסקל

Featured Replies

פורסם

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, ולא ממש מצליח לנסח את זה...מישהו יכול להביא אלגוריתם\פסאודו-קוד לזה?

תודה מראש.

פורסם

אתה לא יכול בפסקל להכניס ככה מחרוזת בתוך מחרוזת...

S.Str[index +I]:=S.Str[index + Count +I];

אתה צריך להשתמש בפונקציות ספריה.

פורסם
  • מחבר

וכי למה לא? אין פה שום שגיאות קומפילציה, משמע זה עובד...

ואיזה פונקציות ספריה, זה כל העניין, *אני* אמור לכתוב יחידת ספריה לזה.

פורסם

אתה לא יכול להחליף מחרוזת בצורה בה אתה עושה את זה,

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

פונקציות לטיפול במחרוזות:

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 החל מהמקום המצוין ע"י index

4. pos(str1,str2) = pos('S','ShagaLaga') = 1 = הפונקציה מחזירה את מיקומה הראשון של תת מחרוזת str1 במחרוזת str2 אם תת המחרוזת st1 לא מופיעה יוחזר הערך 0

5. ord(chr) = ord('a') = 97 = מחזיר את הקוד אסקי של התו

6. chr(Asci) = chr(97) = a = מחזיר את התו של המספר

פרוצדורות לטיפול במחרוזות:

1. Delete(Str1,Index,Count) = Delete('helloe,2,3) = ho הפרוצדורה מוחקת Count תווים מהמחרוזת str1 החל מהמקום המצויין ע"י index

2. Insert(Str1,Str2,Index) = Insert('comon',paris',4) = comparison = הפרוצדורה מכניסה את תת המחרוזת str1 למחרוזת str2 החלמהמקום המצויין על ידי index

3. str(Value,str) = הפרוצדורה ממיאה את Value (ערך מספרי ) למשתנה מחרוזת str1 דוגמא בהמשך

4.Val(Str1,Value,Int) = הפרוצדורה ממירה את המחרוזת str1 למשתנה מספרי Value במידה והמחרוזת הומרה הנשתנה int יכיל ערך 0 אחרת המשתשנה int יכיל את מיקום התו שהפריע להמרה דוגמא בהמשך

(לקוח מ SourceCode.co.il)

תשתמש בחלק מהן שתמצא לנכון.

פורסם
  • מחבר

אתה *עדיין* מתעקש להתעלם ממה שאני אומר. הפונקציות שהבאת? אני מכיר אותם. *אסור* לי להשתמש בהם, אני צריך לכתוב *אותם*,או יותר כמו תחליפים..

ומחרוזות=מערך של תווים. אני ועוד איך יכול.

פורסם

OK הבנתי אותך.

תנסה להשתמש במחרוזת ריקה חדשה תעבור איתה ואז תעביר את זה לתוך המחרוזת הישנה.

ושוב אני אומר לך, אתה לא יכול לשנות ככה את התוים.

פורסם
  • מחבר

בספר יסודות מדעי המחשב חלק 2, ע"מ 153 כתוב שמותר לי.

הרעיון של ה"מחיקה" פה הוא סתם להעתיק את ההמשך מעל למה שאתה רוצה למחוק ולעדכן אות אורך המחרוזת. אם יש לך הצעה יותר טובה, אשמח לשמוע.

פורסם

טוב אז,

דבר ראשון מה צריכה הפרוצדורה שלך לעשות בדיוק?

מה משמעות הפרמטרים הללו?

האם מותר להשתמש בפונ', פרו' ספריה אחרות? כלומר לא DELETE..?

פורסם
  • מחבר

אוקי, אז ככה.

הפרוצדורה אמורה למחוק קטע מחרוזת.ההגדרות הם ככה:

טיפוס המחרוזת:

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 המקורית.

פורסם

1) היכן השורה הזו אמורה להיות ממוקמת?

S.Len:=S.Len - Count;

2) תשנה את הלולאה שלך למשהו יותר קריאף כלומר, שתתחיל מINDEX עד LEN-COUNT(יתכן שצריך להוסיף 1 במקום כלשהו, לא ספרתי).

פורסם

אולי תיצור מחרוזת חדשה, ותעשה לולאה מ 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;

פורסם

לא חבל כל הזמן להוסיף אות אות עם +?אולי תנסה לנצל את המבנה של המחרוזת בפסקל(אני חושב שאורך המחרוזת נמצא באיבר ה- 0, וכל שאר האותיות מתחילות מהאיבר ב1). תשים ב- index+count-1 את אורך המחרוזת שאחרה זו שאתה מסיר, ופשוט תשרשר אותן(אל תשכח לשנות את אורך המחרוזת ה"מקורית" ל- index).

פורסם

זה נכון שבאיבר ה-0 נמצא אורך המחרוזת כ ASCII אבל לא הבנתי את ההמשך של מה שכתבת..

פורסם

תשנה את המחרוזת שלך ותיצור 2 מחרוזות חדשות מאותה מחרוזת על אותו שטח זיכרון - המחרוזת שלפני החלק שאתה מוריד, והמחרוזת שאחרי החלק שאתה מוריד. אחר כך תיקח את 2 המחרוזות שיצרת ותשרשר אותן אחת אחרי השניה.

פורסם

אפשר גם בכלל ללא לולאות ככה:

יש לנו את המחרוזת S.

var s1,s2:string;
s1:=copy(1,index);
s2:=copy(index+count,length(s));
s:=s1+s2;

אבל זה בעצם עושה את אותו הדבר.

ארכיון

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

דיונים חדשים