חוסר יעילות(אני חושב), אנא עזרו לתוכניתן צע&#1 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

חוסר יעילות(אני חושב), אנא עזרו לתוכניתן צע&#1


Judas Iscariot

Recommended Posts

"שיעורי בית" בפסקל, התרגיל ייחשב כ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 על מנת ש"לא לאבד שינויים בקובץ" :x)

הנה הקוד(תראו איזה יפה הוא! איזו הזחה! אילו הערות! פשוט תאווה לעיניים!):


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.

קישור לתוכן
שתף באתרים אחרים

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

קודם כל, תבדוק אם יש בפסקל פקודה בסגנון של switch-case בC ודומותיה. זה יכול לחסוך לך מלא שורות קוד. הכוונה לגלישה שקורת אם לא שמים break.

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

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

דבר נוסף, אתה כותב תנאים מיותרים בבדיקות של העודף. אם בדקת אם העודף גדול או שווה ל10, ואז אתה עושה else if, אתה לא צריך לבדוק אם העודף קטן מ10. הוא תמיד יהיה קטן מ10, כי כבר בדקת את זה.

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

ולבסוף, אין לך בדיקות תקינות לקלט. זה אמנם קטנוני, אבל זה גם חשוב.. צריך תמיד לקחת בחשבון שהמשתמש שלנו הוא דביל גמור.....

טוב, זה מה שאני רואה עכשיו (אני ממש עייף...)...

בהצלחה.....

קישור לתוכן
שתף באתרים אחרים

הערה כללית אליך:

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

קישור לתוכן
שתף באתרים אחרים

לדוגמה צריך להחזיר 2 ש"ח עודף.

התוכנית שלך נכנסת ללולאה עוברת על כל ה-IF ונותנת עודף שקל.

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

אז היא עוברת שוב על כל ה-IF ונותנת עוד שקל עודף.

חוץ מזה ששרשור IF-ים תמיד נראה רע.

במקום כל IF תעשה while (change<10)and(change>=5)begin...end

while (change<5)and(change>=1)begin...end

וכן הלאה...

ככה לא צריך IF כי אם העודף לא עומד בתנאי הלולאה אז הוא לא יכנס אליה וגם אם צריך לתת פעמיים את אותו מטבע אז זה נעשה פעם אחת וזהו.

קאפיש ???

קישור לתוכן
שתף באתרים אחרים

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

לזה התכוונתם נכון?:


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;


קישור לתוכן
שתף באתרים אחרים

ברור שכבר למדתי להשתמש בdiv ו-mod(אחד מן הדברים הראשונים שלמדנו).

אבל שים לב שהמשתנים צריכים להיות מסוג Real, וdiv וmod פועלים רק על integer...

אתה כופל אותם ב-100 ומעביר ל integer ופתרת את הבעיה ;)

(נדמה לי שאין מטבע של שברי אגורה :) )

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...