GammaCyber

כתיבת קוד — שיעור 4

מבוא לשפות תכנות: מ-Assembly ועד Python

כל 2 משימות הקוד שנשמרו מהשיעור מופיעות כאן, עם דרישות, דוגמאות וקוד פתיחה. אפשר לכתוב פתרון בעורך המקומי וללחוץ על „בדיקת AI” לקבלת ציון, רמזים והערות.

T1 · מתחיל 100 נק' ~10 דק' debug
תיקון באג — אינטרפרטר צובר (Accumulator VM)
מכונה זעירה מריצה תוכנית של שורות טקסט על אוגר צובר acc (מתחיל ב-0): "SET n" קובע acc=n · "ADD n" מוסיף · "SUB n" מחסיר · "MUL n" מכפיל · "NEG" הופך סימן. הפונקציה אמורה להחזיר את acc הסופי — אך יש בה באג: הפקודה SUB מתנהגת כמו ADD. מצא ותקן. החזר את הגרסה המתוקנת.
// הקוד השבור לתיקון
def run(program: list[str]) -> int: acc = 0 for line in program: parts = line.split() op = parts[0] if op == 'SET': acc = int(parts[1]) elif op == 'ADD': acc += int(parts[1]) elif op == 'SUB': acc += int(parts[1]) # באג כאן elif op == 'MUL': acc *= int(parts[1]) elif op == 'NEG': acc = -acc return acc
דוגמאות
run(['SET 10', 'SUB 4']) → 6
run(['SET 3', 'MUL 4', 'NEG']) → -12
פתרון-ייחוס תיקון באג — אינטרפרטר צובר (Accumulator VM) ›
def run(program: list[str]) -> int: acc = 0 for line in program: parts = line.split() op = parts[0] if op == 'SET': acc = int(parts[1]) elif op == 'ADD': acc += int(parts[1]) elif op == 'SUB': acc -= int(parts[1]) # התיקון: -= (היה +=) elif op == 'MUL': acc *= int(parts[1]) elif op == 'NEG': acc = -acc return acc
הפתרון נשמר מקומית אוטומטית.
T2 · בסיסי 200 נק' ~15 דק' algorithmic
מכונת-מחסנית — מחשבון RPN
לפני שכותבים מהדר — כותבים מכונה. ממש מחשבון בנוטציית פוסטפיקס (Reverse Polish). נתונה רשימת אסימונים tokens: כל אסימון הוא מספר שלם (ייתכן שלילי, כמחרוזת) או אחד מהאופרטורים + - * /. אופרטור מוציא שני ערכים מהמחסנית ודוחף את התוצאה. חילוק / הוא חילוק שלם עם קיטום לכיוון אפס (כמו ב-C): 7/2=3 וגם (−7)/2=−3. הקלט תקין ומסתיים בערך יחיד. החזר את התוצאה.
דוגמאות
eval_rpn(['2','3','+']) → 5
eval_rpn(['4','5','*','6','-']) → 14
eval_rpn(['-7','2','/']) → -3
פתרון-ייחוס מכונת-מחסנית — מחשבון RPN ›
def eval_rpn(tokens: list[str]) -> int: st = [] for t in tokens: if t in ('+', '-', '*', '/'): b = st.pop(); a = st.pop() if t == '+': st.append(a + b) elif t == '-': st.append(a - b) elif t == '*': st.append(a * b) else: # קיטום לכיוון אפס (כמו C) q = abs(a) // abs(b) st.append(q if (a < 0) == (b < 0) else -q) else: st.append(int(t)) return st[-1]
הפתרון נשמר מקומית אוטומטית.