Специализированный учебно-научный центр Новосибирского государственного университета (СУНЦ НГУ)
888.24K

Информатика_10_класс_Углубление_2_lite

1. Специализированный учебно-научный центр Новосибирского государственного университета (СУНЦ НГУ)

2.

ВВЕДЕНИЕ:
• Группа A - начинающие программисты.
Учитесь писать понятный, проверяемый и аккуратно организованный код одновременно на C++ и Python.
Основной результат - две работающие программы, а не просто полученный ответ. Обязательны обе
языковые реализации для каждой, но Вы сначала полностью завершаете одну программу, а затем
переносите алгоритм на другой язык.
• Группа B – более опытные.
Разрабатываете приложение для систем счисления, исследуюте свойства представлений чисел,
обрабатываете некорректный ввод и анализируют ограничения чисел с плавающей точкой. Здесь важнее
качество архитектуры и проверки, чем количество написанных строк.
Хорошая программа должна:
решать одну понятную задачу;
разбивать сложную работу на функции;
обрабатывать граничные случаи;
проверять входные данные;
иметь понятные имена переменных;
проходить не только примеры, но и специальные тесты, которые часто нужно готовить.

3.

Задание A1. «Создай свой переводчик чисел»:
Условие. Дано целое неотрицательное число N в десятичной системе счисления и основание системы
счисления b. Переведите число N в систему счисления с основанием b.
Входные данные. В одной строке записаны два целых числа: b и N, где 2≤b≤16, 0≤N≤106.
Выходные данные. Выведите запись числа N в системе счисления с основанием b. Для цифр со
значениями от 10 до 15 используйте строчные латинские буквы a, b, c, d, e, f.
Цель работы: научиться строить алгоритм, выделять повторяющиеся действия в функции, проверять
граничные случаи и писать две версии программы.
Например, из десятичной системы в другую:

4.

Обязательные требования к коду:
Алгоритм перевода должен быть написан самостоятельно, без готовых функций перевода числа в другую
систему.
• Вынесите перевод в отдельную функцию.
• Обработайте число 0 - это важный граничный случай.
• Не используйте глобальные переменные для передачи результата.
• Проверьте основание и диапазон числа, если это предусмотрено вашим способом ввода.
• Имена переменных должны объяснять их назначение.
Подсказка:
Представим, что N=45, а основание b=2.

5.

Пример программы на псевдокоде:
если число равно 0:
вернуть "0"
пока число больше 0:
остаток = число % основание
добавить символ остатка
число = число // основание
развернуть результат
вернуть результат
Правильный подход: программа состоит из компонентов:
1. Проверка входных данных: Допустимые основания и символы
2. Разбор исходной записи: Строка → целое значение
3. Формирование результата: Целое значение → строка в новой системе
4. Вывод результата: Число или сообщение NO
При разделении на функции проще проверить каждую часть отдельно:
• digit_value - правильно ли определяется значение символа;
• parse_number - правильно ли вычисляется число;
• format_number - правильно ли формируется новая запись;
• convert_number - правильно ли связываются этапы.

6.

Задание A2. «Число под прикрытием»:
Условие. Дано основание системы счисления b и строка S, содержащая запись целого неотрицательного
числа в этой системе счисления. Переведите число в десятичную систему счисления.
Входные данные. В одной строке записаны основание b и строка S. Основание удовлетворяет условию
2≤b≤16. Строка содержит цифры 0–9 и, при необходимости, строчные латинские буквы a–f.
Выходные данные. Выведите десятичное значение числа, если запись корректна. Если в записи есть
цифра, недопустимая для основания b, выведите NO.
Требования к программе:
Обрабатывайте цифры слева направо.
Используйте правило Vновое​=Vстарое⋅b+d, где d — значение очередной цифры.
Проверяйте, что значение каждой цифры меньше основания системы счисления.
Реализуйте перевод в отдельную функцию.
Примеры:
Подсказка: для перевода числа в
десятичную систему не требуется
деление. Нужно идти слева
направо и на каждом шаге
умножать
уже
накопленное
значение на основание, а затем
прибавлять новую цифру.
Например, 101101 в двоичной
системе:

7.

Задание В1. «Универсальный конвертер: недоверенный ввод»:
Условие. Разработайте программу, которая переводит целое неотрицательное число из одной системы счисления в
другую. Основания исходной и целевой систем счисления могут принимать любые целые значения от 2 до 36
включительно. Используйте алфавит цифр:0123456789abcdefghijklmnopqrstuvwxyz. Цифрам 0–9 соответствуют
значения от 0 до 9, буквам a–z — значения от 10 до 35. Буквы во входных данных могут быть как строчными, так и
прописными.
Входные данные. В одной строке записаны три значения: p, q, N, где:
p - основание исходной системы счисления;
q - основание целевой системы счисления;
N - строка, представляющая целое неотрицательное число в системе счисления с основанием p.
Основания должны удовлетворять условию 2≤p,q≤36.
Выходные данные. Выведите запись числа N в системе счисления с основанием q. Буквы в ответе должны быть
строчными. Если входные данные некорректны, выведите NO.
Примеры:

8.

Задание В1. «Универсальный конвертер: недоверенный ввод»:
Ограничения и требования к реализации:
1. Не использовать готовые функции преобразования целых чисел в произвольные системы счисления.
2. Разбить решение на функции: преобразование символа в значение, проверка входа, перевод в
десятичное значение, перевод в целевое основание.
3. Проверять каждую цифру, а не только допустимость символов.
4. Не смешивать проверку корректности входа с вычислением результата.
5. Обосновать корректность алгоритма и оценить сложность.
6. Обязательно проверить ноль, ведущие нули, буквы, недопустимые цифры и крайние основания.
7. Подготовьте тесты, в том числе для некорректного ввода.
Обратите внимание - в есть несколько уровней инженерного мышления:
Можно написать короткое решение, которое работает только на примерах из условия.
Можно написать корректный алгоритм перевода.
Можно построить систему функций, в которой проверка, вычисление и представление результата
разделены.
Можно добавить автоматические тесты и убедиться, что преобразование туда и обратно сохраняет
значение.
Будет оцениваться не только скорость решения, но и то, насколько хорошо Автор понимает, что
именно гарантирует корректность его программы.

9.

Задание B2. «Почему одни дроби заканчиваются, а другие бесконечны?»:
Условие. Разработайте программу, которая переводит положительное или отрицательное вещественное число из
системы счисления с основанием b1 в систему счисления с основанием b2. Основания обеих систем счисления
находятся в диапазоне от 2 до 16. Программа должна проверять корректность исходной записи и формировать
результат, содержащий не более k цифр после разделителя целой и дробной частей.
Входные данные. В одной строке записаны:
b1 — основание исходной системы счисления;
b2 — основание целевой системы счисления;
k — максимально допустимое количество цифр после разделителя;
S — строка с записью исходного числа.
Ограничения: 2≤b1​,b2​≤16, 1≤k≤20. Длина строки S не превышает 100 символов. Цифры от 10 до 15 обозначаются
буквами a–f; регистр букв не влияет на их значение.
Выходные данные. Выведите запись числа в системе счисления с основанием b2, используя не более k цифр после
разделителя. Если исходная запись некорректна, выведите NO.
При формировании результата не округляйте число автоматически: оставляйте первые k цифр дробной части, если
дробная часть не завершилась раньше.
Требования к программе:
Проверьте допустимость оснований и символов исходной записи.
Проверьте структуру числа: наличие не более одного разделителя, непустую целую часть и корректную дробную
часть.
Переведите целую часть и дробную часть, учитывая основание исходной системы.
Сформируйте запись в целевой системе, соблюдая ограничение на число дробных цифр.
Протестируйте случаи целого числа, нулевой дробной части, конечной и бесконечной дробной записи, а также
некорректного ввода.
Объясните, почему дробная часть в одной системе счисления может быть конечной, а в другой — бесконечной.
English     Русский Правила