שאלות בפסקל..

chiki chiki

New member
שאלות בפסקל..

שלום.. נתנו לי עבודה לעשות ויש לי שאלה.. הרי השאלה: צור אלגוריתם (עם שגרה רקורסיבית) הקולט 2 מספרים חיוביים שלמים ומחזיר את הפרש מספר ספרותיהם.. נגיד 1872 23 פלט 2.. תודה למשיבים!
 

zagzagzag

New member
באיזה שלב נתקעת?

כאן לא יפתרו לך את שיעורי הבית, אבל כן יעזרו לך בדרך.
 

chiki chiki

New member
כי בעקרון פה..

כלל העצירה אמור להיות מונה כלשהו.. אבל אני לא יכול כי אני צריך לאפס את המונה בהתחלה לא?
 

zagzagzag

New member
נתקדם...

קודם כל, תנסה לחשוב איך אמורה להיראות פונקציה רקורסיבית שמחשבת את מספר הספרות של מספר כלשהו (רמז: div 10). אם לא הצלחת, תחזור לכאן אחר כך, תנסה לנתח מקרים שבהם ברורה התוצאה. למשל, מה קורה כאשר הקלט לתוכנית הוא 0,198 ? מה קורה כאשר הקלט הוא 0,0 ? אחרי שניתחת, הדרך לפיתרון תהיה קצרה יותר
 

chiki chiki

New member
אוקיי הצעה שלי לפתרון...

if num1 = num2 then hefresh=0 if num1 = 0 then hefresh=num2 else hefresh=hefresh(num1 div 10, num2)+1 ?? יכול להיות? משו שכחתי? תודה
 

chiki chiki

New member
לא בעצם זה לא טוב..

כי num1=num2 זאת לא פקודה טובה אני צריך את מספר הספרות אז איך לעזאזל אני אומר לו שאם מספר הספרות של זה שווה לזה אזי..? צריך מונה?!
 

zagzagzag

New member
כמעט נכון

שים לב שאתה צריך לבדוק רק שלושה מקרים: num1 = num2 = 0, ואז התשובה היא 0 num1 = 0 וגם num2 <> 0, ואז התשובה היא מספר הספרות של num2 num2 = 0 וגם num1 <> 0, ואז התשובה היא מספר הספרות של num1 בכל מקרה אחר (כלומר, שני המספרים שונים מאפס), לא משנה מהו האורך של המספרים, כי אתה מטפל באורכי מספר שונים כשאתה בודק את שלושת המקרים
 

chiki chiki

New member
נראה לי שעליתי על משו..

הנה התוכנית שכוללת 2 פרוצדורות .. אחת רקורסיבית ואחת מונה.. if counter(num) = counter(num2) then hefresh=0 if counter(num)=0 and counter(num2) <>0 then hefresh = counter(num2) אותו דבר עם מספר 2.. else hefresh = hefresh (num1 div 10,num2)+1 והפרוצדורה counter מקבלת מספר mone:=0 while num>0 do num=num div 10 mone:=mone +1; counter:=mone הגיוני?!? ואיפה אני שם את הקאונטר?! באיזה חלק בתוכנית? לפני או אחרי הפרוצדורה הראשית?
 

zagzagzag

New member
אין צורך ב-Counter

את מניית מספר הספרות אתה יכול לעשות בפונקציה hefresh. למשל, דוגמה למקרה שבו num1 = 0, num2 <> 0:
if (num1 = 0) and (num2 <> 0) then hefresh:= 1 + hefresh(0,num2 div 10)​
אם לא הבנת למה זה נכון, תנסה "להריץ" כמה דוגמאות בראש
 

chiki chiki

New member
נו אבל איך תראה הפונקציה?!

כל כלל עצירה אני אעשה גם כלל רקורסיבי? ונגיד ושני המספרים גדולים מ0... איך אני אדע מה ההפרש בינהם?
 

chiki chiki

New member
כי הרי תראה אפילו בכלל הראשון..

שהוא אם מספר1 שווה למספר2... הוא מתייחס רק לאם הם שווים נגיד 23 23 ... למרות שהם יכולים להיות גם 21 49 ולהיות שווים לפי התוכנית.. אז איך אני מונה כמה ספרות יש במספר?
 

zagzagzag

New member
המשך

יהיה לך כלל אחד שיטפל במקרה הטריוויאלי (num1 = num2 = 0), ועוד שני כללים "רקורסיביים" שדומים לכלל שאני ציינתי. אם שני המספרים גדולים מאפס, לא אמור לעניין אותך האורך שלהם, כי אתה מטפל במקרים שבהם האורך שונה לפני כן. כלומר, אם שני המספרים שונים מאפס, זה אמור להראות כך:
if (num1 <> 0) and (num2 <> 0) then hefresh:= 1 + hefresh (num1 div 10, num2 div 10)​
חבר את ה-if הזה עם הכלל למקרה הטריוויאלי, והכללים לשני המקרים האחרים, ופתרת את התרגיל
 

zagzagzag

New member
סליחה, טעות

ה-if הנ"ל צריך להראות כך:
if (num1 <> 0) and (num2 <> 0) then hefresh:= hefresh(num1 div 10, num2 div)​
הסיבה לכך היא שבשלב הזה אתה לא יודע אם המספרים באותו האורך או לא, אבל אתה כן יודע שהם שונים מאפס
 

chiki chiki

New member
מה שאתה אומר זה ככה

if (num1 = 0) and (num2 <> 0) then hefresh:= 1 + hefresh(0,num2 div 10) if num1<>0 and num2=0 then hefresh:=1+hefresh (num1div 10, num2) if num1=0 and num2=0 then hefresh:= 0 else hefresh:= 1 + hefresh (num1 div 10, num2 div 10) לדעתי אבל הם יתנגשו באמצע... כי נגיד יש 23 848 אז ה23 יגיע ל0 כאשר ל848 יהיה עוד ספרה... ואז הם יכנסו לעוד כלל רקורסיבי המתאים לסוגם... לא?
 

zagzagzag

New member
כן

וחשוב שתבין גם למה... (אל תעשה דברים רק כי אמרתי
) לאחר תיקון קטן, הקוד יראה כך:
if (num1 = 0) and (num2 = 0) then hefresh:= 0; else if (num2 = 0) then (* num1 <> *) hefresh:= 1+hefresh (num1 div 10, 0); else if (num1= 0) then (* num2 <> 0 *) hefresh:=1+hefresh (0, num2 div 10); else hefresh:= hefresh (num1 div 10, num2 div 10)​
השורה האחרונה אומרת - אם שני המספרים שונים מאפס, אנחנו עדיין לא יודעים אם מספר הספרות של המספרים שווה, או שלאחד המספרים יש מספר ספרות גדול יותר מהשני. לכן מקצצים ספרה אחת מהמספר, וממשיכים לבדוק.
 

chiki chiki

New member
אוקיי מובן אבל שאלה אחת..

else if (num2 = 0) then (* num1 <> *) hefresh:= 1+hefresh (num1 div 10, 0); זה לא אמור להיות and?!? במקום הthen?
 
למעלה