# פתרונות המבחנים החדשים - יסודות התכנות בשפת פייתון
# קורס 20605 - האוניברסיטה הפתוחה
# מבחנים 4, 5, 6
# ============================================================================
# פתרונות מבחן 4
# ============================================================================
def is_spiral(matrix):
"""
שאלה 1 - בודק אם מטריצה היא ספירלית
"""
if not matrix or not matrix[0]:
return False
n = len(matrix)
# בדיקה שהמטריצה ריבועית
for row in matrix:
if len(row) != n:
return False
# יצירת מטריצה ספירלית לדוגמה לצורך השוואה
expected = [[0] * n for _ in range(n)]
# מילוי ספירלי
top, bottom, left, right = 0, n-1, 0, n-1
num = 1
while top <= bottom and left <= right:
# מימין לשמאל בשורה העליונה
for col in range(left, right + 1):
expected[top][col] = num
num += 1
top += 1
# מלמעלה למטה בעמודה הימנית
for row in range(top, bottom + 1):
expected[row][right] = num
num += 1
right -= 1
# משמאל לימין בשורה התחתונה
if top <= bottom:
for col in range(right, left - 1, -1):
expected[bottom][col] = num
num += 1
bottom -= 1
# מלמטה למעלה בעמודה השמאלית
if left <= right:
for row in range(bottom, top - 1, -1):
expected[row][left] = num
num += 1
left += 1
# השוואה עם המטריצה הנתונה
return matrix == expected
def count_digits(num, digit):
"""
שאלה 2א - ספירה רקורסיבית של ספרה במספר
"""
if num == 0:
return 1 if digit == 0 else 0
last_digit = num % 10
count = 1 if last_digit == digit else 0
if num < 10:
return count
return count + count_digits(num // 10, digit)
def has_ascending_digits(num):
"""
שאלה 2ב - בודק אם ספרות המספר בסדר עולה
"""
if num < 10:
return True
last_digit = num % 10
second_last = (num // 10) % 10
if second_last >= last_digit:
return False
if num < 100:
return True
return has_ascending_digits(num // 10)
def word_value(word):
"""
שאלה 3 - חישוב ערך מילה
"""
total = 0
for char in word:
if 'a' <= char <= 'z':
total += ord(char) - ord('a') + 1
elif 'A' <= char <= 'Z':
total += (ord(char) - ord('A') + 1) * 2
return total
class Game:
"""
שאלה 4 - מחלקת משחק
"""
def __init__(self, name, genre, rating):
self._name = name
self._genre = genre
if 1 <= rating <= 10:
self._rating = rating
else:
self._rating = 5
def __lt__(self, other):
return self._rating < other._rating
def get_name(self):
return self._name
def get_genre(self):
return self._genre
def get_rating(self):
return self._rating
class GameStore:
"""
שאלה 4 - מחלקת חנות משחקים
"""
def __init__(self):
self._games = []
def add_game(self, game):
# בדיקה אם כבר יש משחק עם אותו שם
for existing_game in self._games:
if existing_game.get_name() == game.get_name():
return
self._games.append(game)
def top_rated_games(self, n):
# מיון לפי דירוג בסדר יורד
sorted_games = sorted(self._games, key=lambda g: g.get_rating(), reverse=True)
return sorted_games[:n]
def games_by_genre(self, genre):
# סינון לפי סוג ומיון לפי שם
genre_games = [game for game in self._games if game.get_genre() == genre]
return sorted(genre_games, key=lambda g: g.get_name())
# ============================================================================
# פתרונות מבחן 5
# ============================================================================
def is_mountain_list(numbers):
"""
שאלה 1 - בודק אם רשימה היא רשימת הרים
"""
if len(numbers) < 3:
return False
# בדיקה שאין ערכים זהים סמוכים
for i in range(len(numbers) - 1):
if numbers[i] == numbers[i + 1]:
return False
# חיפוש פסגות
peaks = 0
for i in range(1, len(numbers) - 1):
if numbers[i] > numbers[i - 1] and numbers[i] > numbers[i + 1]:
peaks += 1
return peaks >= 1
def reverse_number(num):
"""
שאלה 2א - היפוך מספר באופן רקורסיבי
"""
if num < 10:
return num
last_digit = num % 10
remaining = num // 10
# חישוב מספר הספרות בחלק הנותר
temp = remaining
digits_count = 0
while temp > 0:
digits_count += 1
temp //= 10
return last_digit * (10 ** digits_count) + reverse_number(remaining)
def is_mirror_numbers(num1, num2):
"""
שאלה 2ב - בודק אם מספרים הם ראי זה של זה
"""
return reverse_number(num1) == num2
def matrix_sum_diagonals(matrix):
"""
שאלה 3 - סכום אלכסונים במטריצה ריבועית
"""
n = len(matrix)
main_diagonal_sum = 0
secondary_diagonal_sum = 0
for i in range(n):
main_diagonal_sum += matrix[i][i]
secondary_diagonal_sum += matrix[i][n - 1 - i]
difference = abs(main_diagonal_sum - secondary_diagonal_sum)
return (main_diagonal_sum, secondary_diagonal_sum, difference)
class Employee:
"""
שאלה 4 - מחלקת עובד
"""
def __init__(self, name, salary, years_experience):
self._name = name
self._salary = salary
self._years_experience = max(0, years_experience)
def __gt__(self, other):
return self._salary > other._salary
def get_name(self):
return self._name
def get_salary(self):
return self._salary
def get_years_experience(self):
return self._years_experience
class Department:
"""
שאלה 4 - מחלקת מחלקה
"""
def __init__(self, department_name):
self._department_name = department_name
self._employees = []
def add_employee(self, employee):
self._employees.append(employee)
def average_salary(self):
if not self._employees:
return 0
total_salary = sum(emp.get_salary() for emp in self._employees)
return total_salary / len(self._employees)
def experienced_employees(self, min_years):
experienced = [emp for emp in self._employees
if emp.get_years_experience() >= min_years]
return sorted(experienced, key=lambda emp: emp.get_salary(), reverse=True)
# ============================================================================
# פתרונות מבחן 6
# ============================================================================
def is_chess_matrix(matrix):
"""
שאלה 1 - בודק אם מטריצה היא מטריצת שח
"""
if not matrix or not matrix[0]:
return False
n = len(matrix)
# בדיקה שהמטריצה ריבועית ובגודל זוגי
if n % 2 != 0:
return False
for row in matrix:
if len(row) != n:
return False
# בדיקה שכל תא מכיל רק 0 או 1
for i in range(n):
for j in range(n):
if matrix[i][j] not in [0, 1]:
return False
# בדיקת תבנית לוח שחמט
for i in range(n):
for j in range(n):
expected_value = (i + j) % 2
if matrix[i][j] != expected_value:
return False
return True
def sum_of_digits(num):
"""
שאלה 2א - סכום ספרות באופן רקורסיבי
"""
if num < 10:
return num
return (num % 10) + sum_of_digits(num // 10)
def is_happy_number(num, seen=None):
"""
שאלה 2ב - בודק אם מספר הוא מספר שמח
"""
if seen is None:
seen = set()
if num == 1:
return True
if num in seen:
return False # נכנסנו ללולאה
seen.add(num)
# חישוב סכום ריבועי הספרות
sum_of_squares = 0
temp = num
while temp > 0:
digit = temp % 10
sum_of_squares += digit * digit
temp //= 10
return is_happy_number(sum_of_squares, seen)
def find_missing_number(numbers):
"""
שאלה 3 - מציאת המספר החסר ברשימה
"""
n = len(numbers) + 1 # גודל הרשימה המלאה
# שימוש בנוסחת סכום סדרה חשבונית
expected_sum = n * (n + 1) // 2
actual_sum = sum(numbers)
return expected_sum - actual_sum
class Author:
"""
שאלה 4 - מחלקת מחבר
"""
def __init__(self, name, birth_year):
self._name = name
self._birth_year = birth_year
def get_name(self):
return self._name
def get_birth_year(self):
return self._birth_year
class Book:
"""
שאלה 4 - מחלקת ספר
"""
def __init__(self, title, author, publication_year):
self._title = title
self._author = author
self._publication_year = publication_year
self._is_available = True
def borrow(self):
if self._is_available:
self._is_available = False
return True
return False
def get_title(self):
return self._title
def get_author(self):
return self._author
def get_publication_year(self):
return self._publication_year
def is_available(self):
return self._is_available
class Library:
"""
שאלה 4 - מחלקת ספרייה
"""
def __init__(self):
self._books = []
self._borrowed_books = []
def add_book(self, book):
self._books.append(book)
def books_by_decade(self, decade):
# סינון לפי עשור ומיון לפי שנת פרסום
decade_books = [book for book in self._books
if decade <= book.get_publication_year() < decade + 10]
return sorted(decade_books, key=lambda b: b.get_publication_year())
def author_statistics(self):
author_count = {}
for book in self._books:
author_name = book.get_author().get_name()
author_count[author_name] = author_count.get(author_name, 0) + 1
return author_count
# ============================================================================
# דוגמאות לשימוש