Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 3 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,3 @@
# Контрольная работа 1 (2 вариант)

Темы: Git и GitHub, стандарты оформления кода, хорошие практики, тестирование.

## Этапы выполнения работы

- Сделать **fork** этого репозитория
- Добавить недостающие файлы для "хорошо оформленного" репозитория
- Исправить ошибки, из-за которых не проходит CI
- Найти и исправить баг(и), которые есть в `src/checksum.py` и `src/bin_search.py`
- Добавить исключения в соответствующих случаях (например, когда когда поиск)
- Исправить и/или дополнить тесты так, чтобы они покрывали найденные ошибки
- Для каждого бага должен быть отдельный **commit** с его исправлением, в его описании должно быть пояснение (можно на русском) решённой проблемы
- На основе [ISBN10](https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D0%B4%D1%83%D0%BD%D0%B0%D1%80%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BD%D0%B8%D0%B6%D0%BD%D1%8B%D0%B9_%D0%BD%D0%BE%D0%BC%D0%B5%D1%80) реализовать простую консольную утилиту
- Пользователь вводит в консоль номер ISBN $\to$ ему выводится "correct" или "incorrect" в зависимости от правильности номера
- Выход из утилиты происходит по вводу пользователем `-1`
- Ошибки не должны прерывать прерывать работу утилиты, но пользователь должен быть уведомлен о том, что он сделал что-то не так
- Реализация утилиты должна быть в модуле `src/checksum.py`
- Сделать **pull request** (один на обе задачи) с решением в main ветку этого репозитория
- **pull request** должен содержать описание проделанной работы, ваше ФИО и номер группы
- Если не получилось/забыли сделать адекватное описание исправленных ошибок в описании к **commit**, то нужно сделать это хотя бы в комментариях к **pull request**
**ФИО**: Кузьмищев Леонид Сергеевич
**Группа**: 25Б-42

6 changes: 4 additions & 2 deletions src/bin_search.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
def binSearch(xs: list[int], x: int):
def bin_search(xs: list[int], x: int):
if len(xs) == 0:
return -1
left, right = 0, len(xs) - 1
while left < right:
while left <= right:
mid = (left + right) // 2
if xs[mid] == x:
return mid
Expand Down
45 changes: 35 additions & 10 deletions src/checksum.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,39 @@
def modulo11Checksum(ISBNNumber: str):
def modulo11_checksum(isbn_number: str):
def correct_number(isbn_number):
digits = []
for i in isbn_number:
if i.isdigit():
digits.append(int(i))
elif i.upper() == "X" and len(digits) == 9:
digits.append(10)
elif i != "-":
return None
return digits if len(digits) == 10 else None

digits = [int(char) for char in ISBNNumber if char.isdigit()]

checkDigit = digits[-1]
digits = correct_number(isbn_number)
if digits is None:
return False
Comment on lines +14 to +15
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Рекомендация: при неверной длине строки (или других ошибках) лучше выбрасывать исключение, чтобы различать некорректный формат входных данных и просто невалидную контрольную сумму.
Тогда в вызывающем коде нужно будет добавить блок try-except.


total = 0
for i in range(len(digits) - 1):
weight = 10
digit = digits[i]
total += digit * weight
for i in range(9):
weight = 10 - i
total += digits[i] * (weight)

total += digits[-1]

return total % 11 == 0


checksum = total + checkDigit
return checksum % 11 == 0
print("Exit - -1")
print("To enter, enter any number")
string = input()
while True:
print("enter ISBN_number or came out")
if string == "-1":
print("you came out")
break
string = input()
if modulo11_checksum(string):
print("correct")
else:
print("incorrect")
Comment on lines +27 to +39
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Когда pytest импортирует этот файл для тестов, он зависнет, ожидая ввода данных.
Код, который относится к запуску нужно оборачивать в if __name__ == "__main__".

33 changes: 26 additions & 7 deletions test/test_bin_searh.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,32 @@
from src.bin_search import binSearch
from contextlib import nullcontext as does_not_raise

import pytest

def test_middle():
assert binSearch([1, 2, 3, 4, 5], 4) == 3
from src.bin_search import bin_search


def test_start():
assert binSearch([1, 2, 3, 4], 2) == 1
class TestBin:
@pytest.mark.parametrize(
"array, digit, expected_index, expectation",
[
([1, 2, 3, 4, 5], 3, 2, does_not_raise()),
([1, 2, 3, 4], 2, 1, does_not_raise()),
([1, 2, 3, 4], 3, 2, does_not_raise()),
([1], 1, 0, does_not_raise()),
([1, 2], 1, 0, does_not_raise()),
([1, 2], 2, 1, does_not_raise()),
],
)
def test_middle(self, array, digit, expected_index, expectation):
with expectation:
assert bin_search(array, digit) == expected_index

def test_start(self):
assert bin_search([1, 2, 3, 4], 2) == 1

def test_not_in_list():
assert binSearch([1, 2, 3, 4], 5) == -1
def test_empty_list(self):
assert bin_search([], 1) == -1

def test_incorrect_index(self):
assert bin_search([1, 2], 3) == -1
assert bin_search([1, 2, 3, 4], 5) == -1
9 changes: 6 additions & 3 deletions test/test_checksum.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
from src.checksum import modulo11Checksum
from src.checksum import modulo11_checksum


def test_good():
assert modulo11Checksum("2-266-11156-8")
assert modulo11_checksum("0-8044-2957-X")
assert modulo11_checksum("080442957X")


def test_bad():
assert not modulo11Checksum("2-266-11156-3")
assert not modulo11_checksum("2-266-11156-3")
assert not modulo11_checksum("2-266-11156-8")
assert not modulo11_checksum("2266111568")