GammaCyber

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

הנדסה לאחור של קוד מומצא

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

T2 · בסיסי250 נק'~12 דק'debug
תיקון באג — טווח לולאה (inclusive)
הפונקציה אמורה לסכם את ריבועי המספרים בטווח [a, b] כולל שני הקצוות. אך היא שבורה: הלולאה אינה כוללת את b (range(a, b) עוצר לפני b), ולכן sum_squares(1, 3) מחזיר 5 במקום 14. מצא ותקן. החזר את הגרסה המתוקנת.
// הקוד השבור לתיקון
def sum_squares(a: int, b: int) -> int: tot = 0 for i in range(a, b): # באג כאן tot += i * i return tot
דוגמאות
sum_squares(1, 3) → 14
sum_squares(2, 2) → 4
פתרון-ייחוס תיקון באג — טווח לולאה (inclusive) ›
def sum_squares(a: int, b: int) -> int: tot = 0 for i in range(a, b + 1): # התיקון: b+1 כדי לכלול את b tot += i * i return tot
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני400 נק'~30 דק'algorithmic
אינטרפרטר לולאות מקוננות
ממש מפרש לשפה זעירה עם לולאות מקוננות. פקודות (שורה לכל אחת): "SET v n" (קבע v=n) · "ADD v n" · "MUL v n" · "OUT v" (הוסף את v לפלט) · "LOOP k" ... "END" (חזור על הבלוק k פעמים; קינון מותר). משתנה שלא אותחל שווה 0. החזר את רשימת ערכי ה-OUT לפי הסדר. שים לב: LOOP 0 מדלג על הבלוק כולו.
דוגמאות
run_loops(['SET r 1','LOOP 3','MUL r 2','END','OUT r']) → [8]
run_loops(['SET s 0','LOOP 2','LOOP 3','ADD s 1','END','END','OUT s']) → [6]
פתרון-ייחוס אינטרפרטר לולאות מקוננות ›
def run_loops(program: list[str]) -> list: out = []; V = {} def find_end(start): # END התואם ל-LOOP (מטפל בקינון) depth = 0; i = start while i < len(program): op = program[i].split()[0] if op == 'LOOP': depth += 1 elif op == 'END': if depth == 0: return i depth -= 1 i += 1 return i def exec_range(lo, hi): idx = lo while idx < hi: p = program[idx].split(); op = p[0] if op == 'SET': V[p[1]] = int(p[2]); idx += 1 elif op == 'ADD': V[p[1]] = V.get(p[1], 0) + int(p[2]); idx += 1 elif op == 'MUL': V[p[1]] = V.get(p[1], 0) * int(p[2]); idx += 1 elif op == 'OUT': out.append(V.get(p[1], 0)); idx += 1 elif op == 'LOOP': k = int(p[1]); body = idx + 1; end = find_end(body) for _ in range(k): exec_range(body, end) idx = end + 1 # דילוג נכון גם כש-k==0 else: idx += 1 exec_range(0, len(program)) return out
הפתרון נשמר מקומית אוטומטית.