Видео лекции

Тесты

Открытый банк

Занятия по выбору (Информатика)

Задачи по чтению файлов

Имеется текстовый файл с именем «teXt.txt»

А.

A1. считать из файла «число» и «строку»

A2. считать из файла «слово» и «число»

A3. считать из файла «строку» и «число»

Примечание. «Слово» состоит только из букв и/или цифр, «Строка» состоит из любого числа букв, цифр и пробелов или пуста. «Число» состоит только из цифр.

B.

Отсюда и ниже файл имеет следующую структуру: Первая строка содержит число строк с данными. Далее идёт указанное количество строк с данными имеющими структуру, описанную в задаче.

С.

Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. "Самоучитель по программированию на Free Pascal и Lazarus"

Материалы по ЕГЭ

Системы Счисления

Маски и шаблоны

Маски файлов

URL

Cетевые адреса (IP адреса) и маски подсетей

Не доделано

Маска подсети

Маска подсети. Вы уверены, что понимаете для чего она нужна? Автор: Evgeny Sergeev

Недавно мне довелось проводить собеседование с соискателями на должность инженера-программиста в нашу компанию. Обязательным условием приема на работу было - хорошее знание и понимания основ функционирования локальных вычислительных сетей (ЛВС). По итогам собеседования я поразился тому, что ребята, которые совсем недавно закончили ВУЗы города по техническим специальностям, плохо понимают, что такое маска подсети. В этом посте я проведу небольшую работу над их ошибками.

Практически все на вопрос: «Что такое маска подсети?», бодро выдавали общее определение, мол маска подсети - это битовая маска, которая в результате применения побитовой конъюнкции к IP-адресу позволяет определить адрес сети. И тут же терялись когда я задавал вопрос: «Почему адрес 192.168.111.64 не может быть адресом хоста при маске 255.255.255.192?».

Чтобы хоть немного прояснить этот вопрос, давайте разберемся - из каких частей состоит адресное пространство любой подсети:

 1. Адрес подсети;
    Это адрес который используется для организации маршрутизации между несколькими подсетями. При получении IP-адреса хоста маршрутизатор накладывает на него маску и определяет адрес подсети, затем по этому адресу определяется адрес шлюза на который нужно отправить пакет.
 2. Адреса хостов в подсети;
    Это набор IP-адресов, которые могут быть выданы хостам. Чтобы подсчитать количество адресов, нужно от общего количества адресов подсети отнять два адреса. При обмене пакетами между хостами в одной подсети маршрутизатор и шлюз не нужны.
 3. Широковещательный адрес (Broadcast).
    Это адрес который не присвоен ни одному хосту в подсети. Данный адрес используется для отправки широковещательных пакетов, которые предназначены каждому хосту подсети. 

Здесь нужно понимать, что широковещательный адрес необязательно должен иметь на конце цифру 255 (например, 192.168.111.255), а адрес сети 0 (например, 192.168.111.0). Это заблуждение связано с тем, что в большинстве примеров, которые приводятся в различных учебных материалах, выбирается самая простая маска подсети - 255.255.255.0 (речь идет о сетях класса «С» естественно), и в данном случае broadcast действительно будет имет на конце цифру 255, а адрес сети заканчиваться на 0. Но для других масок адрес подсети и broadcast могут принимать другие значения, например для ранее приведенного вопроса адрес подсети - 192.168.111.64, а широковещательный адрес - 192.168.111.127.

Конечно, в голове применять побитовые вычисления может не каждый, но для сетей класса «С» эта задача вполне выполнима. Если же эти вычисления ну никак не даются, то аналогичные результаты можно получить аналитическим путем. Например, 256-192 = 64 (здесь 192 - это последняя тетрада маски подсети) следовательно в каждой подсети всего 64 адреса из которых 62 адреса могут быть присвоены хостам, а 2 будут использоваться для широковещательных пакетов и адреса подсети. Отсюда IP-адреса 192.168.111.0, 192.168.111.64, 192.168.111.128, 192.168.111.192 будут адресами подсетей (в качестве адреса подсети всегда используется первый ip-адрес подсети). Очевидно, что раз максимальное количество IP-адресов в сетях класса «C» равно 256, то можно получить только 4 подсети.

Чтобы окончательно внести ясность в этот вопрос, привожу ответ, который я ожидал услышать от соискателей: при указанной маске адрес 192.168.111.64 - является адресом подсети и использоваться для адреса хоста не может.

Есть еще один вопрос, на который так же очень часто давали неверный ответ: «Какой размер у самой маленькой подсети?». Здесь многие называли цифру - 3. Так же некоторые считали, что в такой сети может быть 2 адреса. Правильный ответ - 4. Почему? Давайте разберемся.

У маски подсети существует два наиболее часто используемые формы записи:

 1. десятичный вид ( 255.255.255.192 );
    Данный вид записи наверное знаком каждому, поэтому никаких дополнительных пояснений не требует.
 2. двоичный вид( 11111111.11111111.11111111.11000000 ).
    Здесь я немного искажаю действительность, потому что на практике используют запись следующего вида: 192.168.111.0/26, где 192.168.111.0 - адрес подсети, а /26 - количество единиц в двоичном представлении маски. 

В двоичном виде маска подсети всегда(!) как правило представляет собой единицы идущие подряд слева направо. Т.е. масок вида 11111111.11111111.11111111.11001100 не бывает. При таком разбиении существует всего 8 возможных окончаний для масок в сетях класса «C» ( для упрощения дальнейшего изложения, я буду использовать только последнюю тетраду маски). Очевидно, что маска 11111111 определяет «пустую» подсеть, поэтому использовать ее бессмысленно, маска 11111110 определять подсеть из двух адресов, один из которых - адрес подсети, другой - широковещательный адрес. Создавать такую подсеть так же не имеет никакого смысла. Следующая возможная маска - 11111100 определяет сеть из 4-х адресов, два из которых используются под адрес сети и boradcast, а два могут быть адресами хоста. Обычно в такой подсети один адрес - это адрес шлюза (gateway), а другой адрес хоста.

При ответе на этот вопрос нужно было понимать особенности построения масок подсетей и сказать, что минимальная подсеть может иметь 4-е адреса.

Возможно, некоторые подумают, что программисту подобные детали знать совсем не обязательно, ведь как правило вопросы связанные с организацией сетей решают системные администраторы. Но на мой взгляд, подобная точка зрения не совсем верна, программист должен уметь выражать свои мысли на языке понятном системному администратору. А то знаете ли, глупо просить сетку из одного адреса для тестирования и возмущаться, когда вместо одного адреса выдается целых четыре. Если вы не согласны со мной, то смело выражайте свое мнение в комментариях!

Wildcard mask – шаблонная маска

Чаще всего используется при создании списков доступа. Шаблонная маска предназначена выполнять роль указателя, она указывает на IP адреса отдельно взятой подсети, которые необходимо обработать согласно правилу списка доступа. Самая распространенная шаблонная маска - это маска 0.0.0.255. Так, например, если у нас есть сеть 192.168.1.0 255.255.255.0 и нам необходимо создать список доступа, который будет запрещать весь входящий траффик из этой сети, шаблонная маска 0.0.0.255 подойдет как раз кстати. Но это всего лишь вершина айсберга. В сущности шаблонная маска представляет собой более сложный и очень мощный инструмент для выборки значений. Как применять шаблонные маски, мы разберемся далее. !

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

Возьмем, к примеру, шаблонную маску 0.0.240.255 и сеть 172.16.10.0/24. Чтобы понять как она работает, необходимо представить шаблонную маску в двоичном виде, также как и перевести в двоичную систему саму подсеть.

Двоичный вид шаблонной маски 0.0.240.255 будет представлять из себя:

00000000.00000000.11110000.11111111

Двоичный вид сети 172.16.10.0 будет выглядеть так:

10101100.00010000.00001010.00000000

Сопоставим шаблонную маску и сеть:

00000000.00000000.11110000.11111111 - WM

10101100.00010000.00001010.00000000 - IP

Значения IP адреса, которые находятся под значением 0 шаблонной маски находятся вне ее диапазона, поэтому закрасим их серым цветом (шалбонной маской они учитываться не будут):

00000000.00000000.11110000.11111111 - WM

10101100.00010000.00001010.00000000 - IP

Все значения IP адреса, находящиеся под значением 1 шаблонной маски находятся в ее диапазоне и будут учитываться. Обозначим их зеленым цветом:

00000000.00000000.11110000.11111111 - WM

10101100.00010000.00001010.00000000 - IP

Мы видим, что все значения четвертого октета IP сети находятся в диапазоне, который охватывает шаблонная маска. Если быть более точным, то в позиции четвертого октета IP сети может стоять любое число от 0 до 255, а это, как вы понимаете, представляет собой количество различных IP адресов, которые могут быть выданы сетевым устройствам.

Выясним теперь, какие же значения третьего октета будут находиться в диапазоне нашей шаблонной маски. Для этого начнем изменять значения, стоящие под значением 1 шаблонной маски в третьем октете. Обозначим изменения красным цветом:

00000000.00000000.11110000.11111111 - WM

10101100.00010000.00011010.00000000 - IP

Переведем получившийся IP адрес из двоичной в десятичную систему и получим следующее значение: 172.16.26.0. Заметим, что на месте четвертого октета в данный момент стоит 0, но как мы помним, в данной позиции может стоять любое число от 0 до 255. Отсюда мы можем сделать вывод, что у нас получилась подсеть 172.16.26.0 255.255.255.0, которую охватывает шаблонная маска 0.0.240.255.

Далее изменим еще одно значение:

00000000.00000000.11110000.11111111 - WM

10101100.00010000.00101010.00000000 - IP

Получим сеть 172.16.42.0/24.

Если будем накручивать числа дальше, то получим следующий двоичный код:

00000000.00000000.11110000.11111111 - WM

10101100.00010000.00111010.00000000 - IP

Переведем обратно в десятичную систему и получим сеть 172.16.58.0/24.

Таким образом можно продолжать пока не переберем все возможные сети с шаблонной маской 0.0.240.255.

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

Допустим у вас огромная компания, которая состоит из следующих подсетей:

  • 172.16.1.0/24
  • 172.16.2.0/24
  • 172.16.9.0/24
  • 172.16.10.0/24
  • 172.16.11.0/24
  • 172.16.25.0/24
  • 172.16.26.0/24
  • 172.16.27.0/24
  • 172.16.41.0/24
  • 172.16.42.0/24
  • 172.16.43.0

Предположим, босс дал задание, чтобы красным подсетям был закрыт доступ к сети Интернет. Вместо того, чтобы писать огромный список доступа, указывая каждую отдельную сеть, можно воспользоваться шаблонной маской 0.0.240.255 для сети 172.16.10.0, которая затронет исключительно красные сети. Все остальные сети будут вне ее диапазона и поэтому не будут подвергнуты правилу списка доступа. Если вы были внимательны, то могли заметить, что шаблонная маска 0.0.240.255 охватывает каждую 16-ю по счету сеть.

Логика

  • Владивосток — ВЛАДИВОСТОКСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ЭКОНОМИКИ И СЕРВИСА — математика
  • Владивосток — ВЛАДИВОСТОКСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ЭКОНОМИКИ И СЕРВИСА — полность
Тождества
Решения задач

Зачётная задача на Iй семестр (2010)

Имеется файл с данными. В файле столбиком выводятся четыре числа в различных системах счисления, а именно -

  1. в бинарной,
  2. восьмеричной,
  3. десятичной
  4. шестнадцатеричной.

Другие системы не используются.

Различные системы счисления используются в произвольном порядке и в произвольном наборе, т.е. может быть, например, два бинарных числа и ни одного восьмеричного.

Все числа рассматриваются как целые и положительные. Ни одно из них по величине не превосходит 64000. Числа кодируются специальным образом так:

  1. десятичные кодируются естественным образом (например: 123);
  2. бинарные кодируются как последовательность нулей и единиц, а в конце записи числа приписана буква «b» (например: 101b);
  3. восьмеричные кодируются аналогично, но в конце записи числа приписана буква «o» (например: 237o);
  4. шестнадцатеричные числа для записи используют дополнительные символы «a», «b», «c», «d», «e» и «f», а в конце записи числа приписана буква «h» (например: b2h).

Незначащих нулей, лишних пробелов - нет. Все буквы - строчные.

Напишите программу, которая наводит порядок - приводит все числа к десятичному виду и записывает в другой файл.

Дополнительная задача

Вывести столбиком все положительные целые числа, которые обладают следующими свойствами:

  1. Делятся на 8h
  2. Меньше, чем 100h

Зачётная задача на II-й семестр (2010)

В папке /home/courses/Teachers/Skvortsov/2010-2011/ имеется файл с данными data.txt. В нём хранится

Количество учащихся < 40

Список фамилий учащихся в формате

Фамилия оценка оценка оценка

Создать папку вида ZPV_903_Sidorov_AS. Перенести туда файл с данными data.txt и переименовать его в input.txt.

Написать программу, которая делает следующее. Сортирует учащихся по среднему балу с точностью до десятых долей. Учащихся с одинаковым средним баллом дополнительно сортирует по алфавиту. Выводит список данных в файл output.txt в формате

Фамилия (средняя оценка с точностью до десятых)

Упаковать папку с файлами input.txt, output.txt и *.pas (файл программы на Паскале) и отправить по адресу oca@nsunc.com

Про Unicode Utf-8 и Ucs

http://softwaremaniacs.org/blog/2006/07/28/unicode-and-bytes/

Wikipedia про Юникод

Для начала определим неясности с терминологией. Многие так или иначе сталкивались с понятиями Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4, и все они так обозначали юникод. Что же значит каждый из них?

- Unicode — Character Encoding Standart. Стандарт для цифрового представления символов использующихся во всех языках. Поддерживается и развивается Консорциумом юникода (unicode.org).

- UCS — Universal Character Set (Универсальный набор символов). Международный стандарт ISO/IEC 10646, который идентичен стандарту Unicode.

- UTF — Unicode (or UCS) Transformation Format. Способ представления символов Unicode в виде последовательности целых положительных чисел.

- UTF-8, UTF-16, UTF-32 — различные UTF-трансформации, которые оперируют числами, занимающими соответственно 8, 16 и 32 бита. В UTF-8 минимальный размер символа — один октет (байт), максимальный — шесть. В UTF-16 минимальный размер — два октета, максимальный — четыре. В UTF-32 любой символ представляется в виде четырех октетов.

- UCS-2, UCS-4 — способы кодирования по ISO/IEC 10646. Универсальный набор символов, закодированный двумя или четырьмя октетами (байтами) соответственно. UCS-2 полностью входит в UTF-16, но в UTF-16 есть составные символы (из четырех октетов), которые не входят в UCS-2. UCS-4 тождественна UTF-32.

Итог:

Unicode — набор символов, определенным образом упорядоченных: каждому символу поставлена в соответствие кодовая позиция.

Любая из кодировок UTF — это представление символов Unicode в виде последовательности чисел. Поэтому, говоря, например, о переводе проекта на юникод, в большинстве случаев мы подразумеваем поддержку какой-либо из трансформаций.

При необходимости за уточнениями можно обратиться к словарю терминов www.unicode.org/glossary и документации на сайте unicode.org.

I � Unicode

wikipedia Юникод

Юникод

Символы, представленные в Юникоде

Кириллица в Юникоде

wikipedia UTF-8

wikipedia UTF-16

wikipedia ASCII

wikipedia Переносимый_набор_символов

wikipedia Кодировки_кириллицы

UTF-8: Кодирование и декодирование Можно посмотреть и вокруг

note

хм.. почитал я тут всего, со многим и не согласен. Unicode - это в общем система символов, содержащая любые азбуки, и служебные символы, а вот кодировка - это способ представления юникода.

В вин32 (и не только =) принято юникодом считать символ в слово (2 байта), что не очень удобно для разных систем пересылки данных, интернета и т.д., где обычно концом сообщения является двоичный нуль. Сами представте, сколько у нас символов (в 2 байта) содержащих двоичный нуль (либо в младшем, либо в старшем байте). Конец такой юникодовской строки является тоже нуль, только в одно слово (два байта по нулю). Ввиду такой проблемы и были введены кодировки (они не содержат однобайтового нуля - он кодирует конец строки).

Вообще, честно говоря, все винды на платформе NT для отображения текста на окнах работают только с юникодом (с тем, который двух-байтовый, а не кодировки), такие символы еще называют WideChar (широкий, или двух-байтовый, в отличие от ANSI - однобайтовой). Кто просматривал секцию ресурсов, должно быть замечал, что там тоже все только в юникоде.

Поэтому, каждый раз, как вы вызываете ANSI версию API (для однобайтовых символов), например MessageBoxA, система тратит лишнее время на перекодирование этого сообщения в Unicode (2 byte), и только потом вызывает WideChar версию API (MessageBoxW). Подробно об этом можно прочитать в книге Джеффри Рихтера.

Теперь что касается UTF-8, и в общем говоря, тот самый вопрос, что меня сюда привел.

UTF-8 кодируется следующим образом: в этой кодировке один символ юникода занимает от 1 до 6 байт. если символ находиться в диапазоне от 0 до 80h (т.е. старший бит ведущего байта сброшен) - он 100% занимает 1 байт. Остальные символы кодируются по следующему алгоритму: первый байт назовем ведущим (выделен жирным).

1 : 0xxxxxxx 2 : 110xxxxx 10xxxxxx 3 : 1110xxxx 10xxxxxx 10xxxxxx 4 : 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 5 : 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 6 : 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Как видно, что ведущий байт не может начинаться с 10 или с 1111111, да и вообще, все, что не подходит под этот алгоритм, нарушает кодировку UTF-8.

К примеру: откроем обычный блокнот (notepad), и попробуем туда записать ОЁ (2 большие русские буквы о и ё). Сохраним файлик, и заного откроем его блокнотом… да, уже видем не наши ОЁ, а греческую букву ПСИ. Все потому, что блокнот каждый раз при открытии файла проверяет его на верность кодировки UTF-8 по выше приведенному алгоритму. Если все верно, он отображает нам уже переведенную последовательно символов в юникод (вызвав функцию MultiByteToWideChar с кодовой страницей CP_UTF8 (65001)). В действительности что такое ОЁ : CE A8 = 11001110 10101000

Теперь самое интересное : ввиду такого большого диапазона значений (кому не лень, можете пересчитать, сколько всего возможных символов можно получить в UTF-8) не все символы являются переводимыми в юникод (его диапазон всего лишь 65535 символов). Проделаем тоже самое с блокнотом, только теперь за место ОЁ запишем 4 байта :

фёёё

Вот так вот, переоткрыв файл мы ничего не увидим, но размер файла по прежнему 4 байта. Все верно, просто фёёё тоже подходит под алгоритм кодирования UTF-8, но он не имеет эквивалентного символа в юникоде. фёёё:

F4 B8 B8 B8 = 11110100 10111000 10111000 10111000

Руководство программиста Linux UTF-8(7)

НАИМЕНОВАНИЕ

     UTF-8 - ASCII-совместимая многобайтная кодировка Unicode

ОПИСАНИЕ

     Набор  символов  Unicode  покрывает 16-битное пространство
     кодов. Наиболее очевидная кодировка Unicode, известная как
     UCS-2,  содержит  последовательности 16-битных слов. Такие
     строки могут содержать комбинации символов (например  '\0'
     или  '/'),  которые  имеют  специальное  значение в именах
     файлов и других параметрах функций из библиотеки языка  C.
     Кроме  того,  большинство  утилит  UNIX  предназначены для
     обработки  ASCII-файлов,  и  не  могут  читать   16-битные
     символы  без  специальной  модификации.  По  этим причинам
     UCS-2 является неподходящей кодировкой  Unicode  в  именах
     файлов,  текстовых  файлах,  переменных  окружения и т. д.
     Стандарт  ISO  10646  Universal   Character   Set   (UCS),
     являющийся  надмножеством Unicode, покрывает уже 31-битное
     пространство кодов,  а  используемая  для  него  очевидная
     кодировка  UCS-4 (последовательность 32-битных слов) имеет
     те же проблемы.
     Кодировка Unicode и UCS под названием  UTF-8  лишена  этих
     недостатков    и    являются   наиболее   подходящей   для
     использования  набора  символов  Unicode  в  Unix-подобных
     операционных системах.

СВОЙСТВА

     Кодировка   UTF-8   обладает  следующими  привлекательными
     свойствами:
  • UCS-символы с кодами от 0x00000000 до 0x0000007f

(классические символы из набора US-ASCII ) кодируются

       как байты с кодами 0x00 до 0x7f (совместимость с кодовой
       таблицей  ASCII).   Это  означает,  что  файлы и строки,
       содержащие только 7-битные ASCII  символы,  будут  иметь
       одинаковое представление как в ASCII, так и в UTF-8.
  • Все UCS-символы с кодами > 0x7f кодируются как

многобайтовые последовательности, содержащие только

       байты  в  диапазоне от 0x80 до 0xfd, так что ASCII байты
       не окажутся частью другого символа и, как следствие,  не
       будет проблем с использованием '\0' or '/'.
  • Сохраняется лексикографический порядок сортировки строк

кодировки UCS-4.

  • При помощи UTF-8 могут быть закодированы все возможные

2^31 кодов UCS.

  • В кодировке UTF-8 никогда не используются байты с кодами

0xfe и 0xff.

  • Первый байт многобайтовой последовательности,

представляющей один не-ASCII UCS-символ, всегда

       находится в диапазоне от 0xc0 до 0xfd и указывает, какой
       длины  эта  последовательность.  Все последующие байты в
       многобайтовой последовательности находятся  в  диапазоне
       от    0x80    до    0xbf.    Это   обеспечивает   легкую
       ресинхронизацию,   устраняет   необходимость   учитывать
       состояние   входного  потока  (statelessness)  и  делает
       кодировку устойчивой к пропущенным байтам.
  • Символы UCS, закодированные в UTF-8, могут быть до шести

байт в длину, тогда как символы Unicode могут иметь

       длину лишь до  трех  байт.   Так  как  Linux  использует
       только  16-битное  подмножество  UCS  -- Unicode, то под
       Linux многобайтовые последовательности UTF-8 могут  быть
       одно-, двух- или трехбайтными.

КОДИРОВКА

     Нижеследующие  последовательности  байт  используются  для
     представления    символов.     Конкретная     используемая
     последовательность  зависит  от номера символа в кодировке
     UCS:
     0x00000000 - 0x0000007F:
         0xxxxxxx
     0x00000080 - 0x000007FF:
         110xxxxx 10xxxxxx
     0x00000800 - 0x0000FFFF:
         1110xxxx 10xxxxxx 10xxxxxx
     0x00010000 - 0x001FFFFF:
         11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
     0x00200000 - 0x03FFFFFF:
         111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
     0x04000000 - 0x7FFFFFFF:
         1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
     Позиции   битов,   обозначенные   как   xxx,   заполняются
     соответствующими   битами   из  кода  символа  в  бинарном
     представлении.  Используется   кратчайшая   из   возможных
     многобайтовых     последовательностей,    которые    могут
     представить код символа.

ПРИМЕРЫ

     Символ Unicode с кодом 0xa9 = 1010 1001  (знак  copyright)
     кодируется в UTF-8 как
            11000010 10101001 = 0xc2 0xa9
     а  символ  с  кодом 0x2260 = 0010 0010 0110 0000 (знак "не
     равно") кодируется так:

Linux 26 ноября 1995 2

UTF-8(7) Руководство программиста Linux UTF-8(7)

            11100010 10001001 10100000 = 0xe2 0x89 0xa0

БЕЗОПАСНОСТЬ

     Спецификация Unicode требует, чтобы при  записи  файлов  в
     UTF-8  использовалась  самая  короткая  из возможных форма
     записи; например, двухбайтная последовательность с  первым
     байтом   0xc0   не  соответствует  стандарту.   Был  также
     опубликован "UTF-8 Corrigendum" (поправка к стандарту),  в
     котором  программам запрещается принимать входные данные с
     не  самыми  короткими  формами  записи.   Это  сделано  из
     соображений  безопасности: если входные данные проверяются
     на предмет возможных нарушений безопасности, то  программа
     может  проверять  только  ASCII-версию последовательностей
     типа "/../", ";" или NUL, и при этом упустить из виду, что
     есть    множество   не   соответствующих   ASCII   методов
     представить такие последовательности.  См. также IETF  RFC
     2279.
     Однако, некоторые системы (использующие NUL для завершения
     строк) используют C0 80 для внутреннего представления  NUL
     (ASCII 00).

СТАНДАРТЫ

     ISO 10646, Unicode 1.1, XPG4, Plan 9.

АВТОР

     Markus Kuhn <mskuhn@cip.informatik.uni-erlangen.de>

СМОТРИ ТАКЖЕ

     unicode(7)

ПЕРЕВОД

     Перевел  с  английского  Алексей  Миллер <asm@asm.kiev.ua>
     2000
Это кодовая страница InterBase (в народе, она называется UTF-8), которая отображает двухбайтные и четырех байтные символы UNICODE (UCS-2 и UCS-4, соответственно) в последовательности символов размером от одного до шести байт. Основными пред назначениями этого извращения являются:
  • Предоставление транспорта для UNICODE текста на базе обычного ASCII текста.
  • Упаковка данных. Символы с кодом меньше 128 по-прежнему представляются в виде одного байта

Между UTF-8 и UCS-2 (UCS-4) существует взаимное и однозначное преобразование

UNICODE формат, с которым, как правило, мы имеем дело при программировании под Windows, представляет собой двухбайтные символы - UCS-2. Как видно из таблицы, для представления UNICODE символов с кодом от 0x0000 до 0xFFFF в формате UTF-8 достаточно от одного до трех байт.

InterBase также исходит из того, что в UTF-8 будут храниться UNICODE символы из диапазона [0x0000,0xFFFF]. Поэтому, при определении количества байт для хранения текстовых данных с кодовой страницей UNICODE_FSS, умножает число символов на 3 байта. Кроме того, все текущие версии InterBase, при работе с CHAR/VARCHAR данными, контролируют число байт в представлении данных, а не число символов. Поэтому, например, в колонку CHAR(3) с кодовой страницей UNICODE_FSS можно без проблем записать до девяти однобайтных символов.

Основным неудобством UTF-8 является невозможность определения количества символов в строке без её полного просмотра. Поэтому для внутренней работы текстовые данные в формате UTF-8 лучше всего перекодировать в кодовую страницу с символами фиксированного размера, например в тот же UCS-2.

Просто полезно

Признаки делимости

http://petruchek.info/blog/divisibility-11.html

Признаки делимости Признак делимости — это правило, позволяющее быстро определить, является ли число кратным заранее заданному числу, без необходимости выполнять деление. Рассмотрим несколько основных признаков деления:

Признак делимости на 2 Число делится на 2 тогда и только тогда, когда его последняя цифра делится на 2, то есть является чётной.

Признак делимости на 3 Число делится на 3 тогда и только тогда, когда сумма его цифр делится на 3.

Признак делимости на 4 Число делится на 4 тогда и только тогда, когда число из двух последних его цифр нули или делится на 4.

Признак делимости на 5 Число делится на 5 тогда и только тогда, когда последняя цифра делится на 5 (то есть равна 0 или 5).

Признак делимости на 6 Число делится на 6 тогда и только тогда, когда оно делится на 2 и на 3.

Признак делимости на 7 Число делится на 7 тогда и только тогда, когда результат вычитания удвоенной последней цифры из этого числа без последней цифры делится на 7 (например, 259 делится на 7, так как 25 — (2 · 9) = 7 делится на 7).

Признак делимости на 8 Число делится на 8 тогда и только тогда, когда три его последние цифры - нули или образуют число, которое делится на 8.

Признак делимости на 9 Число делится на 9 тогда и только тогда, когда сумма его цифр делится на 9.

Признак делимости на 10 Число делится на 10 тогда и только тогда, когда оно оканчивается на ноль.

Признак делимости на 11 Число делится на 11 тогда и только тогда, когда сумма цифр с чередующимися знаками делится на 11 (то есть 182919 делится на 11, так как 1 - 8 + 2 - 9 + 1 - 9 = -22 делится на 11) — следствие факта, что все числа вида 10n при делении на 11 дают в остатке (-1)n.

Признак делимости на 12 Число делится на 12 тогда и только тогда, когда оно делится на 3 и на 4.

Признак делимости на 13 Число делится на 13 тогда и только тогда, когда число его десятков, сложенное с учетверённым числом единиц, кратно 13 (например, 845 делится на 13, так как 84 + (4 · 5) = 104 делится на 13).

Признак делимости на 14 Число делится на 14 тогда и только тогда, когда оно делится на 2 и на 7.

Признак делимости на 15 Число делится на 15 тогда и только тогда, когда оно делится на 3 и на 5.

Признак делимости на 17 Число делится на 17 тогда и только тогда, когда число его десятков, сложенное с увеличенным в 12 раз числом единиц, кратно 17 (например, 29053&#8594;2905+36=2941&#8594;294+12=306&#8594;30+72=102&#8594;10+24=34. Поскольку 34 делится на 17, то и 29053 делится на 17). Признак не всегда удобен, но имеет определенное значение в математике. Есть способ немного попроще – Число делится на 17 тогда и только тогда, когда разность между числом его десятков и упятеренным числом единиц, кратно 17(например, 32952&#8594;3295-10=3285&#8594;328-25=303&#8594;30-15=15. поскольку 15 не делится на 17, то и 32952 не делится на 17)

Признак делимости на 19 Число делится на 19 тогда и только тогда, когда число его десятков, сложенное с удвоенным числом единиц, кратно 19 (например, 646 делится на 19, так как 64 + (6 · 2) = 76 делится на 19).

Признак делимости на 23 Число делится на 23 тогда и только тогда, когда число его сотен, сложенное с утроенным числом десятков, кратно 23 (например, 28842 делится на 23, так как 288 + (3 * 42) = 414 продолжаем 4 + (3 * 14) = 46 очевидно делится на 23).

Признак делимости на 25 Число делится на 25 тогда и только тогда, когда две его последние цифры делятся на 25 (то есть образуют 00, 25, 50 или 75)или число кратно 5.

Признак делимости на 99 Разобьем число на группы по 2 цифры справа налево (в самой левой группе может быть одна цифра) и найдем сумму этих групп, считая их двузначными числами. Эта сумма делится на 99 тогда и только тогда, когда само число делится на 99.

Признак делимости на 101 Разобьем число на группы по 2 цифры справа налево (в самой левой группе может быть одна цифра) и найдем сумму этих групп с переменными знаками, считая их двузначными числами. Эта сумма делится на 101 тогда и только тогда, когда само число делится на 101. Например, 590547 делится на 101, так как 59-05+47=101 делится на 101).

Признак делимости на 2n Число делится на n-ю степень двойки тогда и только тогда, когда число, образованное его последними n цифрами, делится на ту же степень.

Признак делимости на 5n Число делится на n-ю степень пятёрки тогда и только тогда, когда число, образованное его последними n цифрами, делится на ту же степень.

Признак делимости на 10n-1 Разобьем число на группы по n цифр справа налево (в самой левой группе может быть от 1 до n цифр) и найдем сумму этих групп, считая их n-значными числами. Эта сумма делится на 10n - 1 тогда и только тогда, когда само число делится на 10n - 1.

Признак делимости на 10n Число делится на n-ю степень десятки тогда и только тогда, когда n его последних цифр - нули.

Признак делимости на 10n+1 Разобьем число на группы по n цифр справа налево (в самой левой группе может быть от 1 до n цифр) и найдем сумму этих групп с переменными знаками, считая их n-числами. Эта сумма делится на 10n + 1 тогда и только тогда, когда само число делится на 10n + 1.

CC Attribution-Noncommercial 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0