Линейная программа выполняет одну последовательность инструкций сверху вниз без выбора ветви и повторения. При отсутствии управляющих конструкций вся вычислительная модель видна непосредственно: исходные значения получают статические типы, выражения вычисляются в установленном порядке, а каждое присваивание образует новое наблюдаемое состояние программы.

Корректность такого решения определяется не только математической формулой. Требуется учитывать диапазон типа, вид литерала, продвижение операндов, целочисленное деление, переполнение, двоичное или десятичное представление дробного значения, смысл null, правила битовых операций и момент преобразования либо округления. Алгебраически эквивалентные записи могут давать разные машинные результаты.

Проверка линейного вычисления строится независимо от основной записи: обратным преобразованием, балансом, тождеством, альтернативной формулой, восстановлением упакованных полей или анализом остатка. На экспертном уровне исследуется граница самой вычислительной модели: что отвергает компилятор, что завершается исключением, что молча теряет данные и что остаётся допустимым, но численно неустойчивым.

Опора — Разделы 4–8: переменные и базовые типы; константы и именованные значения; операторы и выражения; числовая модель C#; преобразования типов, Math, округление и форматирование.

Все исходные данные задаются непосредственно в коде. Ветвления, циклы, массивы, собственные методы, собственные перечисления и консольный ввод не используются. Каждая рабочая программа оформляется полным шаблоном курса и компилируется с <Nullable>enable</Nullable>. Предметные значения, неизменные для всей программы, объявляются через const и именуются в PascalCase. Выражения с намеренной ошибкой компиляции или исключением времени выполнения исследуются только в отдельных копиях проекта. Округление выполняется только там, где этого требует математическая модель; спецификатор формата изменяет представление, но не хранимое значение.


База практических заданий

Уровень I. Базовый

Типы данных, литералы, последовательность инструкций, формула, порядок преобразований и способ проверки заданы условием. Требуется точно перенести готовую модель в код и проследить состояние после каждой существенной инструкции. Ученик не выбирает алгоритм: сложность уровня возрастает за счёт числа связанных величин, составных выражений и необходимости подтвердить результат независимо от основной формулы.

1. Паспорт значений и литералов: Объявить переменные строго следующими типами и литералами:

byte sampleCount = 240;
short offset = -1_200;
uint status = 0b_1010_0101U;
long population = 8_100_000_000L;
float ratio = 0.125F;
double tolerance = 1E-9;
decimal price = 61.49M;
char marker = '\u03A9';
string path = @"C:\data\input.txt";
bool isReady = true;
double? correction = null;

Дополнительно объявить var promoted = sampleCount + offset и var totalPrice = price * sampleCount. В комментарии указать статический тип каждой переменной, объяснить назначение суффиксов U, L, F, M, разделителя _, двоичного литерала, Unicode escape-последовательности и дословной строки. Вывести status через X8, ratio, tolerance и totalPrice через подходящие форматы G, E и N2. Объяснить, почему var выводит конкретный статический тип и не разрешает последующее присваивание значения несовместимого типа.

2. Трасса линейного состояния: Выполнить в указанном порядке:

int value = 7;
int first = value++;
int second = ++value;
value *= 3;
int remainder = value % 5;
bool relation = first < second && remainder != 0;
bool negated = !relation;
value--;

После этого открыть самостоятельный вложенный блок, объявить внутри int localCopy = value и вывести его только внутри блока. До запуска составить таблицу значений value, first, second, remainder, relation и negated после каждой инструкции, затем сверить её с выводом программы. Объяснить различие постфиксного и префиксного инкремента, действие декремента, эквивалентность value *= 3 присваиванию результата умножения, приоритет сравнения относительно && и недоступность localCopy после завершения вложенного блока.

3. Текст, null и безопасное значение по умолчанию: Представить один текст обычным и дословным литералами. Текст должен содержать путь C:\data\new, фразу "готово", табуляцию и перевод строки; подтвердить равенство строк оператором ==. Затем объявить:

string? sourceName = null;
double? additiveCorrection = null;
double? scale = 1.25;
double rawValue = 18.4;

До изменения sourceName получить bool wasMissing = sourceName is null и int? originalLength = sourceName?.Length. Через ??= закрепить имя "Источник не указан", аддитивную поправку 0.0 и масштаб 1.0, если соответствующее значение отсутствует. После этого получить bool hasName = sourceName is not null и вычислить (rawValue+additiveCorrection)scale(rawValue+additiveCorrection)\cdot scale. Вывести оба логических признака, исходную nullable-длину через ?? -1, окончательное имя и результат. Код должен компилироваться без nullable-предупреждений.

4. Взаимный перевод скорости: Даны скорость v1v_1 в километрах в час и скорость v2v_2 в метрах в секунду. Коэффициент 3.6 объявить как const double SpeedConversionFactor. Первую скорость перевести в метры в секунду, вторую — в километры в час, затем выполнить обратные преобразования и вывести абсолютные погрешности восстановления. Все скорости вывести с четырьмя знаками после запятой, погрешности — через E3.

5. Стоимость поездки: Даны длина маршрута dd километров, расход топлива cc литров на 100100 километров, цена литра pp и резерв rr, заданный долей от 0 до 1. Все денежные и объёмные величины хранить в decimal. Вычислить основной расход, резервный объём, общий объём и стоимость:

fuel=dc100,reserve=fuelr,total=fuel+reserve,cost=totalp.fuel=\frac{dc}{100}, \qquad reserve=fuel\cdot r, \qquad total=fuel+reserve, \qquad cost=total\cdot p.

Промежуточные значения не округлять. Объёмы вывести через F3, резерв — через P2, стоимость — через N2. Отдельно вывести стоимость без резерва и разность двух стоимостей.

6. Корень линейного уравнения: Даны вещественные коэффициенты a0a\neq0 и bb уравнения ax+b=0ax+b=0. Вычислить

x=bax=-\frac{b}{a}

и невязку

ε=ax+b.\varepsilon=ax+b.

Корень вывести через G17, невязку — через E6. Дополнительно вычислить масштабированную невязку

εr=εax+b\varepsilon_r= \frac{|\varepsilon|} {|ax|+|b|}

при заранее гарантированном ненулевом знаменателе. На этом уровне требуется только зафиксировать наблюдаемый результат; причины отклонения от математического нуля исследуются на Уровне III.

7. Концентрация смеси: Смешаны два раствора массами m1m_1, m2m_2 и концентрациями p1p_1, p2p_2, заданными долями от 0 до 1. Вычислить массу вещества в каждом растворе, общую массу вещества, массу смеси и концентрацию

p=m1p1+m2p2m1+m2.p=\frac{m_1p_1+m_2p_2}{m_1+m_2}.

Независимо восстановить массу вещества как (m1+m2)p(m_1+m_2)p и вывести разность с прямой суммой. Дополнительно получить bool-результаты 0p10\le p\le1 и min(p1,p2)pmax(p1,p2)\min(p_1,p_2)\le p\le\max(p_1,p_2) без ветвлений.

8. Средняя скорость на равных расстояниях: Два участка одинаковой длины ss пройдены со скоростями v1v_1 и v2v_2. Вычислить полное время, среднюю скорость через отношение полного расстояния ко времени и по эквивалентной формуле гармонического среднего:

t=sv1+sv2,v=2st,vh=2v1v2v1+v2.t=\frac{s}{v_1}+\frac{s}{v_2}, \qquad v=\frac{2s}{t}, \qquad v_h=\frac{2v_1v_2}{v_1+v_2}.

Вывести vvhv-v_h, среднее арифметическое скоростей и его отклонение от правильного результата. В комментарии объяснить, почему среднее арифметическое не соответствует равным расстояниям.

9. Треугольник по координатам: Даны координаты трёх вершин невырожденного треугольника AA, BB, CC. Вычислить длины сторон, периметр и площадь по формуле Гаусса:

S=xA(yByC)+xB(yCyA)+xC(yAyB)2.S= \frac{ \left| x_A(y_B-y_C)+x_B(y_C-y_A)+x_C(y_A-y_B) \right| }{2}.

Найти высоту из AA как hA=2S/BCh_A=2S/|BC|. Через вложенные вызовы Math.Min и Math.Max определить границы минимального прямоугольника со сторонами, параллельными осям, и его площадь. Проверить неравенства треугольника логическими выражениями. Все геометрические величины вывести через F4.

10. Вертикальный бросок: Ускорение свободного падения объявить как const double Gravity = 9.81. Для начальной скорости v0>0v_0>0 и момента t0t\ge0 вычислить

h(t)=v0tgt22,v(t)=v0gt,h(t)=v_0t-\frac{gt^2}{2}, \qquad v(t)=v_0-gt, tmax=v0g,hmax=v022g.t_{\max}=\frac{v_0}{g}, \qquad h_{\max}=\frac{v_0^2}{2g}.

Подставить tmaxt_{\max} в обе исходные формулы и вывести невязки относительно hmaxh_{\max} и нулевой скорости. Дополнительно получить логический признак того, что заданный момент находится не позже верхней точки.

11. Линейная интерполяция: Даны точки (x1,y1)(x_1,y_1) и (x2,y2)(x_2,y_2), где x1<x2x_1<x_2 и y1y2y_1\neq y_2, а также значение xx. Вычислить

t=xx1x2x1,y=y1+t(y2y1).t=\frac{x-x_1}{x_2-x_1}, \qquad y=y_1+t(y_2-y_1).

По найденному yy восстановить ty=(yy1)/(y2y1)t_y=(y-y_1)/(y_2-y_1) и вывести ttyt-t_y. Получить логические признаки 0t10\le t\le1, x1xx2x_1\le x\le x_2 и согласованности этих двух признаков. Ветвления не использовать.

12. Разбор и изменение регистра состояния: Значение uint packet = 0x0000_5A93U содержит измерение в разрядах 0–7, номер канала в разрядах 8–12, флаг Valid в разряде 13, Warning — в разряде 14, Alarm — в разряде 15. Разрядности, смещения и единичные флаги объявить именованными константами; маски полей вывести выражениями вида ((1U << width) - 1U) << shift. Извлечь измерение, канал и три флага. Затем установить Alarm, сбросить Warning и переключить Valid, не изменяя поля измерения и канала. Исходный и новый пакеты вывести через X8; повторным извлечением подтвердить сохранность двух числовых полей.

13. Схема Горнера: Даны коэффициенты aa, bb, cc, dd и вещественное xx. Вычислить кубический многочлен

P(x)=ax3+bx2+cx+dP(x)=ax^3+bx^2+cx+d

по прямой формуле с Math.Pow и по схеме Горнера

P(x)=((ax+b)x+c)x+d.P(x)=((ax+b)x+c)x+d.

Вывести оба результата через G17, абсолютную и относительную разности при ненулевом масштабе. В комментарии указать число умножений и сложений в каждой записи. Возможное расхождение последних разрядов только зафиксировать; численная устойчивость исследуется на Уровне III.


Уровень II. Продвинутый

Условие задаёт требуемый результат, допустимые входы и ограничения, но не готовую формулу, типы промежуточных значений и порядок вычислений. Требуется самостоятельно вывести линейную модель, выбрать представление данных, исключить переполнение там, где это следует из диапазона, и построить независимую проверку. В отличие от Уровня I ученик проектирует вычисление, однако задача всё ещё имеет один проход без ветвлений и повторов.

1. Проектирование типов измерительной записи: Требуется представить отдельными переменными следующие величины:

  • код коррекции в диапазоне [200,200][-200,200];
  • число кадров в диапазоне [0,4000000000][0,4\,000\,000\,000];
  • длительность в наносекундах до 101510^{15};
  • нормированный коэффициент от 0 до 1 с требуемой точностью порядка 10610^{-6};
  • денежную сумму до 101210^{12} с точностью до копейки;
  • необязательную температуру;
  • однобуквенный код единицы измерения;
  • путь к файлу.

Самостоятельно выбрать тип каждой переменной, записать корректные литералы и обосновать выбор диапазоном и смыслом, а не только минимальным размером. Затем вычислить общий объём данных как произведение числа кадров и размера кадра 1_500_000 байт так, чтобы промежуточное выражение не переполнялось. Вывести результат в байтах, килобайтах и гигабайтах без преждевременного целочисленного деления.

2. Разрядная структура числа: Дано шестизначное натуральное число. Только целочисленным делением и остатком выделить все цифры, построить число в обратном порядке, вычислить сумму цифр, знакочередующуюся сумму

d5d4+d3d2+d1d0d_5-d_4+d_3-d_2+d_1-d_0

и контрольное число

d5+3d4+5d3+7d2+11d1+13d0.d_5+3d_4+5d_3+7d_2+11d_1+13d_0.

Восстановить исходное число из выделенных цифр и вывести разность. Решение проверить на числе с внутренними нулями.

3. Разбор длительности: Дан неотрицательный интервал типа long в миллисекундах, способный превышать несколько лет. Самостоятельно разложить его на полные недели, дни внутри неполной недели, часы, минуты, секунды и миллисекунды. Затем собрать исходное значение обратно и вывести разность. Все коэффициенты единиц объявить именованными константами. Компоненты часов, минут и секунд вывести через D2, миллисекунды — через D3. DateTime и TimeSpan не использовать.

4. Минимальное число контейнеров: Даны положительные long n и long k, не превосходящие 101210^{12}: число объектов и вместимость контейнера. Без дробных типов, Math и ветвлений вычислить:

  • минимальное число контейнеров;
  • число занятых мест в последнем контейнере;
  • число свободных мест в нём;
  • общее число зарезервированных мест.

Формулы должны корректно работать при n<kn<k, n=kn=k и nn, кратном kk, а также не использовать потенциально переполняющееся выражение n+k1n+k-1. Независимая проверка должна подтверждать

containerskfree=n.containers\cdot k-free=n.

5. Евклидово деление угла: Дан целый угол α\alpha из диапазона [1015,1015][-10^{15},10^{15}]. Найти целые qq и rr, удовлетворяющие

α=360q+r,0r<360.\alpha=360q+r, \qquad 0\le r<360.

Решение должно быть единой линейной последовательностью без ветвления и корректно работать для отрицательных значений, полного оборота и нескольких оборотов. Объяснить отличие % в C# от математического неотрицательного остатка и доказать обе части постусловия.

6. Циклический сдвиг символа: Дана строчная латинская буква letter и целое смещение k[109,109]k\in[-10^9,10^9]. Без строковых методов и ветвлений получить букву, сдвинутую циклически по алфавиту, и нормализованное смещение из диапазона [0,26)[0,26). Использовать только арифметику, разность кодов char, остаток и явное приведение к char. Обратным сдвигом восстановить исходную букву.

7. Калибровка с необязательными параметрами: Даны double rawValue, double? additiveCorrection, double? scale, double? lowerBound, double? upperBound и string? sourceName. Отсутствующую поправку считать нулём, масштаб — единицей, нижнюю и верхнюю границы — отрицательной и положительной бесконечностью, имя — строкой "Источник не указан". Самостоятельно определить порядок применения ?., ?? и ??=, вычислить

corrected=(rawValue+additiveCorrection)scalecorrected=(rawValue+additiveCorrection)\cdot scale

и получить один bool, подтверждающий, что результат не является NaN, не является бесконечностью и принадлежит заданным границам. Код должен компилироваться без nullable-предупреждений; короткое замыкание допускается только внутри итогового логического выражения.

8. Сложная капитализация: Даны начальная сумма PP, номинальная годовая ставка rr, число начислений в год mm и срок tt лет. Самостоятельно вывести итоговую сумму, общий доход, эффективную годовую ставку и коэффициент роста:

A=P(1+rm)mt.A=P\left(1+\frac{r}{m}\right)^{mt}.

Степень вычислить через Math.Pow, осознанно выбрав типы и необходимые преобразования. Округлить только итоговые денежные значения. Отчёт сформировать через string.Format и CultureInfo.InvariantCulture: суммы — N2, ставки — P4. Объяснить, почему вызов Math.Pow не может входить в инициализатор const.

9. Радиусы вписанной и описанной окружностей: Даны координаты вершин невырожденного треугольника. Самостоятельно вычислить длины сторон, площадь, полупериметр, радиус вписанной окружности

r=Ssr=\frac{S}{s}

и радиус описанной окружности

R=abc4S.R=\frac{abc}{4S}.

Получить bool для неравенства Эйлера R2rR\ge2r. Для равностороннего контрольного примера вывести R2rR-2r и относительную невязку.

10. Корни квадратного уравнения и тождества Виета: Даны double a, b, c, причём a0a\neq0 и дискриминант D=b24acD=b^2-4ac положителен. Самостоятельно вычислить два вещественных корня, не используя ветвления. Проверить результат тремя способами:

ax12+bx1+c,ax22+bx2+c,ax_1^2+bx_1+c, \qquad ax_2^2+bx_2+c, x1+x2=ba,x1x2=ca.x_1+x_2=-\frac{b}{a}, \qquad x_1x_2=\frac{c}{a}.

Вывести невязки через E6. На этом уровне используется обычная формула корней; потеря точности при вычитании близких чисел исследуется на Уровне III.

11. Взвешенные статистики: Даны четыре наблюдения x1,,x4x_1,\ldots,x_4 и положительные веса w1,,w4w_1,\ldots,w_4. Самостоятельно вывести и вычислить взвешенное среднее

μ=wixiwi,\mu=\frac{\sum w_ix_i}{\sum w_i},

дисперсию

σ2=wi(xiμ)2wi\sigma^2= \frac{\sum w_i(x_i-\mu)^2}{\sum w_i}

и стандартное отклонение. Затем вычислить алгебраически эквивалентную форму

σ2=wixi2wiμ2\sigma^2= \frac{\sum w_ix_i^2}{\sum w_i}-\mu^2

и сравнить результаты. Циклы и массивы запрещены; все промежуточные суммы должны иметь смысловые имена.

12. Пропорциональное распределение целых единиц: Даны положительное число денежных единиц long totalCents и три положительных целых веса w1w_1, w2w_2, w3w_3. Первые две доли получить целочисленным делением пропорциональных произведений, третью определить как остаток от общей суммы:

a1=totalw1W,a2=totalw2W,a3=totala1a2.a_1=\left\lfloor\frac{total\cdot w_1}{W}\right\rfloor, \qquad a_2=\left\lfloor\frac{total\cdot w_2}{W}\right\rfloor, \qquad a_3=total-a_1-a_2.

Выбрать порядок преобразований, исключающий переполнение для заданного диапазона total1012total\le10^{12} и wi106w_i\le10^6. Проверить точное сохранение суммы и вывести отклонение каждой фактической доли от идеальной дробной. Объяснить, почему назначение всего остатка последнему участнику создаёт систематическую асимметрию, хотя баланс выполняется точно.

13. Упаковка телеметрии: В одном uint требуется хранить измерение 0–4095 в 12 разрядах, номер канала 0–31 в 5 разрядах, код режима 0–7 в 3 разрядах и четыре независимых флага в следующих 4 разрядах. Самостоятельно определить смещения, вывести маски из разрядностей, упаковать поля, установить один флаг, сбросить другой и переключить третий, затем извлечь все значения обратно. Готовые числовые маски задавать запрещено. Пакет вывести через X8, а совпадение каждого восстановленного поля с исходным объединить в один bool.


Уровень III. Экспертный

Задача задаёт не вычислительный результат, а вопрос о границе языковой или машинной модели. До каждого запуска требуется записать прогноз: будет ли код скомпилирован, какое значение получится, возникнет ли исключение и какое свойство может нарушиться. После запуска фиксируются фактические данные и объясняется механизм через статический тип выражения, порядок вычисления, диапазон, представление числа, преобразование или режим округления. Увеличение объёма кода не считается повышением уровня без такого анализа.

1. Границы статической модели: В отдельных копиях проекта исследовать пять фрагментов:

int count;
Console.WriteLine(count);
const double RootTwo = Math.Sqrt(2.0);
int whole = 1.5;
var value = 10;
value = 2.5;
string? text = null;
int length = text.Length;

До сборки для каждого фрагмента определить, ожидается ли ошибка или предупреждение и какое правило нарушено: определённое присваивание, константное выражение, неявное преобразование, неизменность выведенного статического типа или nullable-анализ. Затем построить минимальную корректную версию каждого фрагмента, не отключая диагностику и не применяя оператор подавления !. Отдельно объяснить различие ошибки компиляции, предупреждения и ошибки логики.

2. Переполнение и тип подвыражения: Задать int totalDays = 365_250 и int secondsPerDay = 86_400. Построить три варианта числа секунд: произведение двух int с последующим присваиванием в long; то же выражение внутри checked; корректное выражение, расширенное до long до первого опасного умножения. До запуска предсказать поведение каждого варианта. Средствами целочисленной арифметики найти максимальное число полных суток и полных лет по 365 суток, представимых в секундах типом int. Объяснить, почему тип переменной результата не изменяет тип уже вычисляемого подвыражения.

3. Продвижение, сужение и потеря разрядов: Для

byte a = 250;
byte b = 10;
byte bits = 0b_1000_0001;

исследовать статические типы выражений a + b, bits << 1 и ~bits; выполнить сужающие преобразования в unchecked и отдельные проверки в checked. Затем для отрицательного int сравнить value >> 1 со (uint)value >> 1, а для uint high = 0xF000_0001U проверить восстановление после high << 4 >> 4. Все промежуточные значения вывести в десятичной и шестнадцатеричной формах. Объяснить продвижение к int, знаковое заполнение, беззнаковый сдвиг и необратимость вытесненных разрядов.

4. Порядок вычисления и короткое замыкание: Выполнить исследование выражения

int x = 3;
int result = x++ + ++x * 2;

До запуска определить порядок чтений и изменений, итоговые result и x, разделяя приоритет операторов и порядок вычисления операндов. Затем сравнить:

int denominator = 0;
bool safe = denominator != 0 && 10 / denominator > 1;

с отдельным запуском, где && заменён на &. Аналогично сравнить true || (++x > 0) и true | (++x > 0). Зафиксировать, какие правые операнды не вычисляются, где появляется исключение и где изменяется состояние. Объяснить, почему побочный эффект внутри составного выражения усложняет доказательство корректности даже при полностью определённом порядке вычисления.

5. Точность, поглощение и численная устойчивость: Провести четыре эксперимента:

  1. сравнить 0.1 + 0.2 с 0.3;
  2. вычислить (1016+1)1016(10^{16}+1)-10^{16} в double;
  3. сравнить 199\frac19\cdot9 в float, double и decimal;
  4. для четырёх близких больших значений вычислить дисперсию двумя формулами из задачи II.11.

Значения float выводить через G9, double — через G17, decimal — через G29. До запуска предсказать, какие равенства могут нарушиться и какая формула дисперсии чувствительнее к вычитанию близких больших величин. После запуска объяснить результат через конечную точность, поглощение малого слагаемого и катастрофическую потерю значащих разрядов.

6. Особые значения и модель допуска: Через переменные со значением нуля получить в double положительную и отрицательную бесконечность и NaN. Проверить IsInfinity, IsNaN, сравнения NaN с самим собой и обычными числами и распространение NaN через арифметику. В отдельных запусках повторить деление на ноль для int и decimal без обработки исключения. Затем для пар величин разных масштабов реализовать комбинированную проверку

ababsTol+relTolmax(a,b)|a-b| \le absTol+relTol\max(|a|,|b|)

как линейное логическое выражение с предварительным исключением NaN и бесконечностей. Объяснить, почему одна абсолютная константа не подходит всем масштабам и почему проверка min <= x && x <= max не обнаруживает NaN.

7. Округление, денежная модель и форматирование: Для значений 12,512{,}5, 12,5-12{,}5, 12,212{,}2 и 12,2-12{,}2 сравнить Math.Floor, Math.Ceiling, Math.Truncate, явное приведение к int и Math.Round в режимах ToEven и AwayFromZero. До запуска предсказать направления преобразований.

Затем для decimal amount = 19.995M последовательно применить увеличение на 7.5%, уменьшение на 12% и увеличение на 4.25% двумя способами: с округлением до копеек после каждого этапа и с единственным округлением в конце. Повторить итог в double и в целых копейках типа long с явно заданной политикой усечения. Отдельно отформатировать неокруглённое значение через F2, N2 и C2 в InvariantCulture, ru-RU и en-US и доказать сравнением, что форматирование не изменило исходную переменную. Объяснить статистический смысл ToEven, накопление промежуточной ошибки и различие вычислительного значения, округлённого значения и текста.


Обязательные контрольные наборы

ЗадачаИсходные данные
I.1значения и литералы из условия
I.2начальное value = 7
I.3сначала все nullable-поправки и имя отсутствуют; затем additiveCorrection = -0.25, scale = 1.1, sourceName = "A-17"
I.4v1=90v_1=90, v2=12,5v_2=12{,}5
I.5d=437,5d=437{,}5, c=7,8c=7{,}8, p=61,49p=61{,}49, r=0,125r=0{,}125
I.6(a,b)=(10,3)(a,b)=(10,3); затем (1016,3)(10^{16},3)
I.7m1=350m_1=350, p1=0,125p_1=0{,}125, m2=650m_2=650, p2=0,04p_2=0{,}04
I.8s=120s=120, v1=60v_1=60, v2=90v_2=90
I.9A=(3,1)A=(-3,1), B=(5,2)B=(5,2), C=(1,8)C=(1,8)
I.10v0=27,5v_0=27{,}5, t=1,7t=1{,}7
I.11(x1,y1)=(2,5)(x_1,y_1)=(2,5), (x2,y2)=(10,29)(x_2,y_2)=(10,29), x=7x=7
I.12packet = 0x0000_5A93U
I.13a=1a=1, b=3b=-3, c=3c=3, d=1d=-1, x=1,0000001x=1{,}0000001
II.1размер кадра 1_500_000, число кадров 4_000_000_000
II.2407205
II.39_876_543_210L
II.4(n,k)=(7,10)(n,k)=(7,10), (16,16)(16,16), (96,16)(96,16), (100,16)(100,16)
II.5α{720,361,360,1,0,359,360,721}\alpha\in\{-720,-361,-360,-1,0,359,360,721\}
II.6letter = 'b', k=55k=-55
II.7rawValue = 18.4; сначала остальные значения null, затем additiveCorrection = -0.25, scale = 1.1, lowerBound = 0, upperBound = 100, sourceName = "A-17"
II.8P=125000P=125000, r=0,084r=0{,}084, m=12m=12, t=3t=3
II.9A=(0,0)A=(0,0), B=(2,0)B=(2,0), C=(1,3)C=(1,\sqrt3)
II.10(a,b,c)=(1,108,1)(a,b,c)=(1,-10^8,1); затем (1,3,2)(1,-3,2)
II.11xi=109+ix_i=10^9+i для i=1,,4i=1,\ldots,4; все веса равны 1
II.12totalCents = 100_003, (w1,w2,w3)=(3,5,7)(w_1,w_2,w_3)=(3,5,7)
II.13measurement = 2748, channel = 17, mode = 5, начальные флаги 0101
III.1пять фрагментов из условия
III.2totalDays = 365_250, secondsPerDay = 86_400
III.3значения из условия; дополнительно value = -16
III.4выражения из условия
III.5xi=1012+ix_i=10^{12}+i для i=1,,4i=1,\ldots,4; одинаковые веса
III.6пары (1,1+1012)(1,1+10^{-12}), (1012,1012+1)(10^{12},10^{12}+1) и значения NaN, PositiveInfinity
III.7amount = 19.995M; ставки 0.075, 0.12, 0.0425

Итог модуля

Ученик строит линейную программу как последовательность типизированных преобразований, выбирает представление данных по диапазону и смыслу, управляет литералами, константами, nullable- и битовыми операторами, контролирует тип и порядок вычисления подвыражений, выполняет преобразования и округление с явной политикой и отделяет числовое значение от его форматированного текста. Корректность подтверждается обратным преобразованием, балансом, тождеством или независимой формулой, а поведение на границах объясняется через правила компиляции, диапазон, машинное представление и точность.

Покрытие опоры и границы

  • Переменные, статическая типизация, литералы, var, nullable-значения, область наблюдаемого состояния: I.1–I.3, II.1, II.7, III.1.
  • Константы, магические числа и различие времени компиляции и выполнения: I.4, I.10, I.12, II.3, II.8, III.1.
  • Арифметические, логические, присваивающие, битовые и nullable-операторы; приоритет, порядок вычисления и короткое замыкание: I.2–I.3, I.7, I.11–I.12, II.2–II.7, II.13, III.3–III.4.
  • Целочисленная модель, деление и остаток, продвижение, переполнение, checked и unchecked: II.2–II.6, II.12–II.13, III.2–III.3.
  • float, double, decimal, NaN, бесконечности и допуски: I.5–I.11, II.7–II.11, III.5–III.7.
  • Явные и неявные преобразования, Math, округление и форматирование с культурой: I.4–I.13, II.6, II.8–II.11, III.3, III.5–III.7.
  • Область видимости, время жизни локальной переменной и обязательное присваивание до чтения: I.2, III.1.

За границей: консольный разбор строк, ветвления, циклы, массивы, собственные методы и перечисления; они вводятся в последующих разделах. Условный индексирующий доступ ?[] получает самостоятельную практику после введения массивов, поскольку до Раздела 15 отсутствует допустимый индексируемый ссылочный объект курса. Внутреннее устройство IEEE 754, произвольная точность, указатели, unsafe, nint, nuint, BigInteger, полная обработка Unicode и профессиональный численный анализ в модуль не входят.