Judas Iscariot פורסם 2006 בדצמבר 28 Share פורסם 2006 בדצמבר 28 "שיעורי בית" בפסקל, התרגיל ייחשב כ7 נקודות מן המבחן: "מכונת המשקאות, כתוב תוכנית המדמה את פעולתה של מכונת משקאות. המכונה מכילה 7 משקות במחירים שונים: 1. נס קפה - 2.25 ש"ח 2. קפה שחור - 2.25 ש"ח 3. תה - 2.25 ש"ח 4. שוקו - 2.25 ש"ח 5. מרק - 2.25 ש"ח 6. קולה - 2.25 ש"ח 7. מיץ תפוזים - 2.25 ש"ח המכונה יודעת להחזיר עודף בהתאם לסכום שהוכנס למכונה ולמחיר המשקה. כתוב תוכנית המקבלת כקלט את מספר המשקה ואת הסכום שהוכנס למכונה ומחזירה עודף(אם יש) במספר מינימלי של מטבעות. (המטבעות שבשימוש: 10 ש"ח, 5 ש"ח, 1 ש"ח, 50 אגורות, 10 אגורות ו5 אגורות). כפלט יש להדפיס את מחיר המשקה, הסכום שהוכנס, העודף ופירוט מטבעות העודף." Now, פתרתי את התרגיל והרצתי כמה פעמים עם כמה קלטים והפלטים תמיד היו נכונים ומדויקים כך שיצאתי ידי חובה. הבעיה היא, שהפיתרון שלי נראה לי ארוך בצורה יוצאת דופן ומסורבל, האם תוכלו לעזור לי? אם הפיתרון ארוך מדי ומסורבל אזי הציעו לי דרכים לפיתרונו אחרת אמרו לי כל הכבוד (תיכנות משפיע עליי, גם אחרי כל משפט שכתבתי בהודעה הזאת לחצתי ctrl+s על מנת ש"לא לאבד שינויים בקובץ" ) הנה הקוד(תראו איזה יפה הוא! איזו הזחה! אילו הערות! פשוט תאווה לעיניים!): program targil3_vendingmachine;{input: num of drink, amount of cash entered}{output: change given to customer with the most minimal usege of coins}const{---Drinks---} n_caffe = 2.25; {the price of nese caffe} b_caffe = 2.25; {the price of black caffe} tea = 1.30; {the price of tea} coco = 2.50; {the price of coco} soup = 3.10; {the price of soup} coke = 3.30; {the price of coke} oj = 3.20; {the price of oj}{---Change Coins(s for shekels,a for agorot)---} ten_s = 10; five_s = 5; one_s = 1; fifty_a = 0.5; ten_a = 0.10; five_a = 0.05;var selected_drink: real; {saves the price of the selected drink} drink_num: integer; {the number of the drink from the list} entered_cash: real; {the amount of cash entered by the customer} change: real; {the amount of change given back to the customer} counter_ten_s: integer; {the amount of ten shekel coins given back to the customer} counter_five_s: integer; {the amount of five shekels coins given back to the customer} counter_one_s: integer; {the amount of one shekel coins given back to the customer} counter_fifty_a: integer;{the amount of fifty agorot coins given back to the customer} counter_ten_a: integer; {the amount of ten agorot coins given back to the customer} counter_five_a: integer; {the amount of five agorot coins given back to the customer}begin counter_ten_s:= 0; counter_five_s:= 0; counter_one_s:= 0; counter_fifty_a:= 0; counter_ten_a:= 0; counter_five_a:= 0; selected_drink := 0; writeln('Welcome to the Vending Machine:'); writeln('Here is our list of drinks:'); writeln('1. Nese Caffe :',n_caffe:6:2); writeln('2. Black Caffe :',b_caffe:6:2); writeln('3. Tea :',tea:6:2); writeln('4. Coco :',Coco:6:2); writeln('5. Soup :',soup:6:2); writeln('6. Coke :',coke:6:2); writeln('7. Orange Jusice :',oj:6:2); writeln; writeln('Please enter number of drink:'); readln(drink_num); case drink_num of 1: selected_drink := n_caffe; 2: selected_drink := b_caffe; 3: selected_drink := tea; 4: selected_drink := coco; 5: selected_drink := soup; 6: selected_drink := coke; 7: selected_drink := oj; end; writeln('The price is',selected_drink:6:2); writeln('Please enter cash'); readln(entered_cash); change := entered_cash - selected_drink; writeln('Your change is',change:6:2); while change > 0 do begin if change >= 10 then begin change := change - ten_s; counter_ten_s := counter_ten_s + 1; end else if (change < 10) and (change >= 5) then begin change := change - five_s; counter_five_s := counter_five_s + 1; end else if (change < 5) and (change >= 1) then begin change := change - one_s; counter_one_s := counter_one_s + 1; end else if (change < 1) and (change >= fifty_a) then begin change := change - fifty_a; counter_fifty_a := counter_fifty_a + 1; end else if (change < fifty_a) and (change >= ten_a) then begin change := change - ten_a; counter_ten_a := counter_ten_a + 1; end else if (change < ten_a) and (change >= five_a) then begin change := change - five_a; counter_five_a := counter_five_a + 1; end; end; writeln('Here is a discription of your change:'); writeln('number of 10 shekels:',counter_ten_s); writeln('number of 5 shekels:',counter_five_s); writeln('number of 1 shekel:',counter_one_s); writeln('number of 50 agorot:',counter_fifty_a); writeln('number of 10 agorot:',counter_ten_a); writeln('number of 5 agorot:',counter_five_a);end. קישור לתוכן שתף באתרים אחרים More sharing options...
ofsher פורסם 2006 בדצמבר 28 Share פורסם 2006 בדצמבר 28 נראה סבבה מזכיר נשכחות - לפני 10 שנים עשיתי בגרות במחשבים בפסקל ;D קישור לתוכן שתף באתרים אחרים More sharing options...
HEYDADO פורסם 2006 בדצמבר 28 Share פורסם 2006 בדצמבר 28 אני לא ממש שולט בפסקל (התחלתי ישר ב C...), ולכן אני לא ממש יכול לעזור לך. אבל יש לי כמה טיפים:קודם כל, תבדוק אם יש בפסקל פקודה בסגנון של switch-case בC ודומותיה. זה יכול לחסוך לך מלא שורות קוד. הכוונה לגלישה שקורת אם לא שמים break.דבר שני, שלא יהיה כפל קוד. דברים שכתובים יותר מפעם אחת, תכניס לפרוצדורות.בהקשר לטיפ האחרון, שים לב שגם קטעי קוד נפרדים - כמו הודעת פתיחה ותפריט ראשי - כדאי להכניס לפרוצדורות.... וגם אם לא, אז לפחות תעשה שורת הפרדה ותכתוב הערה מעל קטע הקוד, שנדע מה הוא עושה....דבר נוסף, אתה כותב תנאים מיותרים בבדיקות של העודף. אם בדקת אם העודף גדול או שווה ל10, ואז אתה עושה else if, אתה לא צריך לבדוק אם העודף קטן מ10. הוא תמיד יהיה קטן מ10, כי כבר בדקת את זה.עוד דבר, בקשר לקבועים של המספרים השלמים, הגדרת אותם, אז תשתמש בהם.. אחידות זה חשוב. (הכוונה לבדיקות המטבעות...)ולבסוף, אין לך בדיקות תקינות לקלט. זה אמנם קטנוני, אבל זה גם חשוב.. צריך תמיד לקחת בחשבון שהמשתמש שלנו הוא דביל גמור.....טוב, זה מה שאני רואה עכשיו (אני ממש עייף...)...בהצלחה..... קישור לתוכן שתף באתרים אחרים More sharing options...
nirt פורסם 2006 בדצמבר 28 Share פורסם 2006 בדצמבר 28 יהודה איש קריותאת כל ה-IF -ים שלך אתה צריך לעשות בלולאות במקום הלולאה הראשית.כי מבחינת יעילות הלולאה הגדולה עוברת על IF-ים מיותרים. קישור לתוכן שתף באתרים אחרים More sharing options...
Judas Iscariot פורסם 2006 בדצמבר 28 מחבר Share פורסם 2006 בדצמבר 28 יהודה איש קריותאת כל ה-IF -ים שלך אתה צריך לעשות בלולאות במקום הלולאה הראשית.כי מבחינת יעילות הלולאה הגדולה עוברת על IF-ים מיותרים.אתה יכול להרחיב? קישור לתוכן שתף באתרים אחרים More sharing options...
HEYDADO פורסם 2006 בדצמבר 28 Share פורסם 2006 בדצמבר 28 אני אסביר במקומו, אם יורשה לי.....במקום:לולאה if if if כדאי לכתוב:while odef > 10:while odef > 5:while odef > 1:וכו'.. ':' = קטע הקוד של הפחתה מהעודף וההוספה למונה... קישור לתוכן שתף באתרים אחרים More sharing options...
snaidis פורסם 2006 בדצמבר 28 Share פורסם 2006 בדצמבר 28 הערה כללית אליך:אני לא רואה אצלך בכלל חלוקה לפונקציות ופרוצדורות שזה משהו ממש חשוב לסדר וארגון התוכנית שלך, כשהתוכניות שלך יגדלו עם הזמן אתה תהיה חייב פשוט לעשות את זה כדי לא לחזור על קוד פעמיים ובכלל כדי להכליל דברים. קישור לתוכן שתף באתרים אחרים More sharing options...
nirt פורסם 2006 בדצמבר 28 Share פורסם 2006 בדצמבר 28 לדוגמה צריך להחזיר 2 ש"ח עודף.התוכנית שלך נכנסת ללולאה עוברת על כל ה-IF ונותנת עודף שקל.אח"כ מתחיל מעבר נוסף של הלולאה כי עדיין לא הוחזר כל העודף.אז היא עוברת שוב על כל ה-IF ונותנת עוד שקל עודף.חוץ מזה ששרשור IF-ים תמיד נראה רע.במקום כל IF תעשה while (change<10)and(change>=5)begin...endwhile (change<5)and(change>=1)begin...endוכן הלאה...ככה לא צריך IF כי אם העודף לא עומד בתנאי הלולאה אז הוא לא יכנס אליה וגם אם צריך לתת פעמיים את אותו מטבע אז זה נעשה פעם אחת וזהו.קאפיש ??? קישור לתוכן שתף באתרים אחרים More sharing options...
Judas Iscariot פורסם 2006 בדצמבר 28 מחבר Share פורסם 2006 בדצמבר 28 כן אני בעיקרון על ההתחלה חשבתי לעשות ככה, אבל משום מה חשבתי שזה יהיה יותר מסובך, אבל הפלא ופלא זה נראה לי הרבה יותר טוב עכשיו שאני חושב על זה.לזה התכוונתם נכון?:while change > 0 do begin while change >= ten_s do begin change := change - ten_s; counter_ten_s := counter_ten_s + 1; end; while (change < ten_s) and (change >= five_s) do begin change := change - five_s; counter_five_s := counter_five_s + 1; end; while (change < five_s) and (change >= one_s) do begin change := change - one_s; counter_one_s := counter_one_s + 1; end; while (change < one_s) and (change >= fifty_a) do begin change := change - fifty_a; counter_fifty_a := counter_fifty_a + 1; end; while (change < fifty_a) and (change >= ten_a) do begin change := change - ten_a; counter_ten_a := counter_ten_a + 1; end; while (change < ten_a) and (change >= five_a) do begin change := change - five_a; counter_five_a := counter_five_a + 1; end; end; קישור לתוכן שתף באתרים אחרים More sharing options...
nirt פורסם 2006 בדצמבר 28 Share פורסם 2006 בדצמבר 28 מצויין עכשיו תחשוב לאיזה פקודות שחוזרות על עצמן אתה בונה פרוצדורות. קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2006 בדצמבר 28 Share פורסם 2006 בדצמבר 28 אגב, אם כבר למדת להשתמש ב-div/mod, אז תוכל להשתמש בהם במקום בלולאות לחישוב המטבעות. קישור לתוכן שתף באתרים אחרים More sharing options...
Judas Iscariot פורסם 2006 בדצמבר 29 מחבר Share פורסם 2006 בדצמבר 29 ברור שכבר למדתי להשתמש בdiv ו-mod(אחד מן הדברים הראשונים שלמדנו).אבל שים לב שהמשתנים צריכים להיות מסוג Real, וdiv וmod פועלים רק על integer... קישור לתוכן שתף באתרים אחרים More sharing options...
iib פורסם 2006 בדצמבר 29 Share פורסם 2006 בדצמבר 29 עם מערך של ערכי המטבעות אפשר לקצר את כל הלולאות ללולאה אחת... קישור לתוכן שתף באתרים אחרים More sharing options...
bla7 פורסם 2006 בדצמבר 29 Share פורסם 2006 בדצמבר 29 ברור שכבר למדתי להשתמש בdiv ו-mod(אחד מן הדברים הראשונים שלמדנו). אבל שים לב שהמשתנים צריכים להיות מסוג Real, וdiv וmod פועלים רק על integer... אתה כופל אותם ב-100 ומעביר ל integer ופתרת את הבעיה (נדמה לי שאין מטבע של שברי אגורה ) קישור לתוכן שתף באתרים אחרים More sharing options...
Ghosthunter פורסם 2006 בדצמבר 29 Share פורסם 2006 בדצמבר 29 אין גם של אגורה... אתה יכול להכפיל ב- 10.עריכה: אה.. בעצם יש 5 אגורות... קישור לתוכן שתף באתרים אחרים More sharing options...
Recommended Posts
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.