From 38fe17406333c6c01f5436c09e7c708ae6b8e59b Mon Sep 17 00:00:00 2001 From: Leonid Date: Fri, 7 Nov 2025 14:38:46 +0200 Subject: [PATCH 1/9] Correction of variable names and function names according to the style guide --- src/bin_search.py | 2 +- src/checksum.py | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/bin_search.py b/src/bin_search.py index 713abfc..d878d33 100644 --- a/src/bin_search.py +++ b/src/bin_search.py @@ -1,4 +1,4 @@ -def binSearch(xs: list[int], x: int): +def bin_search(xs: list[int], x: int): left, right = 0, len(xs) - 1 while left < right: mid = (left + right) // 2 diff --git a/src/checksum.py b/src/checksum.py index 74b4fb0..31bf086 100644 --- a/src/checksum.py +++ b/src/checksum.py @@ -1,8 +1,7 @@ -def modulo11Checksum(ISBNNumber: str): +def modulo11_checksum(isbn_number: str): + digits = [int(char) for char in isbn_number if char.isdigit()] - digits = [int(char) for char in ISBNNumber if char.isdigit()] - - checkDigit = digits[-1] + check_digit = digits[-1] total = 0 for i in range(len(digits) - 1): @@ -10,5 +9,5 @@ def modulo11Checksum(ISBNNumber: str): digit = digits[i] total += digit * weight - checksum = total + checkDigit + checksum = total + check_digit return checksum % 11 == 0 From e07dd28d548bc1a3828766a8c78c7d0a52d396ee Mon Sep 17 00:00:00 2001 From: Leonid Date: Fri, 7 Nov 2025 14:45:00 +0200 Subject: [PATCH 2/9] Fixing a bug in binary search --- src/bin_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin_search.py b/src/bin_search.py index d878d33..3249226 100644 --- a/src/bin_search.py +++ b/src/bin_search.py @@ -1,6 +1,6 @@ def bin_search(xs: list[int], x: int): left, right = 0, len(xs) - 1 - while left < right: + while left <= right: mid = (left + right) // 2 if xs[mid] == x: return mid From 28eb0c95bcec3d6bec0c486eac70224fac85d25b Mon Sep 17 00:00:00 2001 From: Leonid Date: Fri, 7 Nov 2025 15:23:06 +0200 Subject: [PATCH 3/9] Fixed a bug in binary search when passing an empty array. --- src/bin_search.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bin_search.py b/src/bin_search.py index 3249226..077be27 100644 --- a/src/bin_search.py +++ b/src/bin_search.py @@ -1,4 +1,6 @@ def bin_search(xs: list[int], x: int): + if len(xs) == 0: + return -1 left, right = 0, len(xs) - 1 while left <= right: mid = (left + right) // 2 From e54886533806016bf724bdad8e65fd84608d2dc8 Mon Sep 17 00:00:00 2001 From: Leonid Date: Fri, 7 Nov 2025 15:24:22 +0200 Subject: [PATCH 4/9] Correcting tests and adding new ones. --- test/test_bin_searh.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/test/test_bin_searh.py b/test/test_bin_searh.py index d18d85b..d9d092f 100644 --- a/test/test_bin_searh.py +++ b/test/test_bin_searh.py @@ -1,13 +1,33 @@ -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([5], 3) == -1 + assert bin_search([1, 2], 3) == -1 + assert bin_search([1, 2, 3, 4], 5) == -1 From 8ad721302bd96fc1260361c45f1ee9452ab9f44b Mon Sep 17 00:00:00 2001 From: Leonid Date: Fri, 7 Nov 2025 15:28:56 +0200 Subject: [PATCH 5/9] fixing the order of imports --- test/test_bin_searh.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_bin_searh.py b/test/test_bin_searh.py index d9d092f..83b3064 100644 --- a/test/test_bin_searh.py +++ b/test/test_bin_searh.py @@ -28,6 +28,5 @@ def test_empty_list(self): assert bin_search([], 1) == -1 def test_incorrect_index(self): - assert bin_search([5], 3) == -1 assert bin_search([1, 2], 3) == -1 assert bin_search([1, 2, 3, 4], 5) == -1 From 88828ced270ecaf9d4052ba83aeb9bc477666fba Mon Sep 17 00:00:00 2001 From: Leonid Date: Fri, 7 Nov 2025 16:05:16 +0200 Subject: [PATCH 6/9] bug fixes checksum --- src/checksum.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/checksum.py b/src/checksum.py index 31bf086..f07cc28 100644 --- a/src/checksum.py +++ b/src/checksum.py @@ -1,13 +1,24 @@ def modulo11_checksum(isbn_number: str): - digits = [int(char) for char in isbn_number if char.isdigit()] + 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 - check_digit = digits[-1] + digits = correct_number(isbn_number) + if digits is None: + return False 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) - checksum = total + check_digit - return checksum % 11 == 0 + total += digits[-1] + + return total % 11 == 0 From b002d3cd4004efebe7fa79d0bc7ab46c9bd6f141 Mon Sep 17 00:00:00 2001 From: Leonid Date: Fri, 7 Nov 2025 16:06:34 +0200 Subject: [PATCH 7/9] fixes test and add test --- test/test_checksum.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/test/test_checksum.py b/test/test_checksum.py index f64a64c..6e9fac0 100644 --- a/test/test_checksum.py +++ b/test/test_checksum.py @@ -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") From 674f828afbdc463d0f975bc83363c6a79df6929f Mon Sep 17 00:00:00 2001 From: Leonid Date: Fri, 7 Nov 2025 16:18:32 +0200 Subject: [PATCH 8/9] utility added --- src/checksum.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/checksum.py b/src/checksum.py index f07cc28..c639a39 100644 --- a/src/checksum.py +++ b/src/checksum.py @@ -22,3 +22,18 @@ def correct_number(isbn_number): total += digits[-1] return total % 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") From 542a252ee6e0bc8a3a97882debde86280f9c408c Mon Sep 17 00:00:00 2001 From: Leonid Date: Fri, 7 Nov 2025 16:19:48 +0200 Subject: [PATCH 9/9] add README --- README.md | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index e93444f..2d39b87 100644 --- a/README.md +++ b/README.md @@ -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 + \ No newline at end of file