sem03 (1114911)
Текст из файла
1Занятие №31.1 Литеральные значенияРассмотрим правила записи констант (литеральных значений) в языке Си.1.1.1 ЦелыеЦелые значения могут записываться в программе в десятичной, восьмеричной и шестнадцатеричной системе счисления. Восьмеричная константа начинается с символа 0(«ноль»), за которым идут цифры 0–7, например 0377.
Шестнадцатеричная константа начинается с символов 0x, затем идут цифры 0–9, a–f, A–F. Пример 0xFF. Десятичная константа начинается с цифр 1–9, далее идут цифры 0–9.Язык Си не позволяет записывать целые числа в двоичной системе. Обратите внимание,что ведущий ноль является признаком восьмеричного числа. Запись 09 неверна и вызоветошибку компиляции.Тип константы — это минимальный тип, который может содержать данное значение.
Дляконстант, заданных в десятичной форме, последовательно выбираются int, long, longlong (для C99). Для констант, заданных в восьмеричной или шестнадцатеричной форме,последовательно выбираются int, unsigned int, long, unsigned long, long long,unsigned long long (для C99).Тип константы можно задать явно указанием суффикса u или l. Эти суффиксы могутупотребляться совместно. Например, 10u — константа 10 типа unsigned int, 6uL —константа 6 типа unsigned long. 7ll — константа 7 типа long long.По правилам языка Си знак - перед числом не является частью записи числа, а являетсяунарной операцией, применённой к положительному числу.
Поэтому, если размер типа longlong равен 16 битам, запись -32768 неверна и даст результат 0! Для другого размера целых типов пример соответственно меняется.1.1.2 ВещественныеВещественная константа может содержать целую и дробную часть мантиссы и порядок.Вещественные числа могут записываться в десятичной или шестнадцатеричной (C99) системах счисления.Запись вещественного числа в десятичной системе счисления такая же, как в языке Паскаль и может состоять из целой части, дробной части и порядка числа.
Признаком вещественного числа является либо присутствие десятичной точки ., либо присутствие e или Eдля обозначения порядка. Примеры вещественных чисел приведены ниже:1.21..51e41e+61.e-7.7E12Вещественное число может записываться и в шестнадцатеричной системе счисления. Вэтом случае перед числом ставится префикс 0x, а знак порядка p или P обязателен. Целая идробная часть мантиссы записывается в шестнадцатеричной системе счисления, а порядок1— в десятичной системе счисления. Порядок показывает, на какую степень двойки должнабыть умножена мантисса.
Например, запись 0x1c.2fp5 задаёт вещественное число, равное0x2f) · 25 = 901.875. Другие примеры шестнадцатеричных вещественных чисел:(0x1c +0x1000x1p100x1.ddP-5По умолчанию вещественные константы имеют тип double. Для явного задания типаможно использовать суффикс l или L для указания типа long double. Суффикс f или Fдля указания типа float.
Например, 1.5L, 0x3.aap10f.Как и в случае целых чисел, знак «плюс» или «минус» перед вещественным числом является не частью числа, а унарной операцией, применённой к положительному константномузначению.1.1.3 ЛитерныеЛитерные константы мы уже рассматривали. Напомним, что литерные константы имеюттип int. В апострофах может быть записано несколько символов, в этом случае соответствующее целое значение зависит от компилятора.Изначально на большинстве архитектур для хранения литерных значений использовался тип char, чего было достаточно для хранения всех значений из диапазона кодов ASCII(0–127).
Затем стали использоваться 8-битные кодировки, и для хранения кодов символовиз диапазона (0–256) следует использовать тип unsigned char, чтобы избежать потенциальных ошибок, связанных с индексированием по коду символа.8-битные кодировки и сейчас широко используются, но также используются и 16-битныекодировки (Unicode, или UCS-16), и кодировки с переменной длиной символа (UTF-8). Дляпредставления литерных значений в расширенной кодировке используются «длинные» символьные литералы, например L’a’. Такие литералы имеют тип wchar_t, совпадающий снекоторым целым типом, диапазона значений которого достаточно для представления всехсимволов в расширенной кодировке, используемой на данной платформе или в данном языковом окружении.1.1.4 СтроковыеСтроковые литералы имеют тип char const * (константный указатель на тип char).Все строковые константы имеют в конце строки неявный символ с кодом ’\0’ — терминатор строки.
Строка не имеет явного поля длины, в отличие от языка Turbo Pascal. Сейчас мырассмотрим работу со строками подробнее.1.2 Простейшая работа со строкамиЯзык Си не поддерживает специального строкового типа. Строки хранятся в массивахтипа char, signed char или unsigned char. Большой набор функций работы со строками предоставляется стандартной библиотекой. В языке Си одной строкой является последовательность символов, завершающаяся специальным символом-терминатором с кодом 0.Таким образом,• строки не содержат длины строки явно и для вычисления длины её необходимо просматривать до первого символа с кодом 0,2• нет ограничений языка на длину строки,• в строке не может присутствовать символ с кодом 0.Переменная для хранения строки определяется как массивchar str[N];где N задаёт объем памяти, отводимый для строки.
Поскольку строка всегда хранит символтерминатор ’\0’, максимальное число значащих символов в такой строке на единицу меньше (N-1 символ). Неправильное выделение памяти под символьную строку — одна израспространённых и опасных ошибок программирования на Си!Строки можно инициализировать следующим образом:char str[20] = "a string";В этом примере будет задано значение 9 байт (8 значащих символов и один символтерминатор), остальные 11 байт будут либо обнулены, либо содержать произвольное значение.Символьные массивы можно определять без указания размера, если присутствует инициализация.
Например,unsigned char x[] = "xxx";В этом случае под массив x будет выделено 4 байта.Обратите внимание, что в Си нет «строк переменного размера», то есть строк, памятьпод которые автоматически расширяется, если строка становиться длиннее текущего буфера. При работе со строками необходимо внимательно следить за тем, чтобы строка копировалась в буфер достаточного размера!По аналогии с длинными символьными литералами есть и «длинные» символьные строки, которые записываются с префиксом L, например, L"string". Для хранения таких строкиспользуются массивы типа wchar_t.Для манипуляций со строками в языке Си используются стандартные библиотечныефункции.
Чтобы их можно было использовать, в начале программы нужно подключить заголовочный файл string.h.#include <string.h>Некоторые из этих функций мы рассмотрим ниже.Функция strcmp, прототип которой упрощённо записываетсяint strcmp(char s1[], char s2[]);сравнивает две строки s1 и s2. Если строка s1 лексикографически меньше строки s2, функция возвращает отрицательное значение. Если строка s1 лексикографически больше строкиs2, функция strcmp возвращает положительное значение.
Если две строки равны, функциявозвращает ноль. Проверка на равенство двух строк записывается несколько неожиданнымспособомif (!strcmp(s1, s2)) { /* строки равны */ }Обратите внимание, что строки нельзя сравнивать обычными операциями сравнения!=, == и т. д. Дело в том, что в этом случае будут сравниваться не значения строк, а адресаэтих строк. Компилятор в этом случае не даст никаких предупреждений.Функция strlen с прототипом3int strlen(char s[]);вычисляет количество значащих символов в строке, то есть число символов до символатерминатора. Например strlen("xx") даёт результат 2.Функция strcpy с прототипомchar *strcpy(char dst[], char src[]);копирует строку str в строку dst, включая символ-терминатор.
Забегая вперёд, функциявозвращает указатель на первый символ строки dst.Как и везде в языке Си, контроль переполнения массива полностью лежит на программисте. Существует вариант этой функции (strncmp), который позволяет ограничить максимальное количество копируемых символов.Функция strncpy имеет следующий прототип:char *strncpy(char dst[], char src[], size_t n);Здесь size_t — это тип, который используется в стандартной библиотеке языка Си дляразмеров объектов.
Это один из беззнаковых целых типов (обычно unsigned long).Функция strncpy работает следующим образом:• Если длина строки src меньше значения n, то в буфер dst копируется вся строка, аостаток буфера dst заполняется нулевыми байтами.• Если длина строки src больше или равна n, то в буфер dst копируеются первыеn символов строки. При этом в конец скопированной строки нулевой байттерминатор не добавляется!Как и strcpy, эта функция возвращает адрес первого символа строки dst.
Для копирования строки в другую строку удобнее использовать функцию snprintf.Функция strcat с прототипомchar *strcat(char dst[], char src[]);добавляет строку str в конец строки dst. Контроля количества скопированных символов непроизводится. Существует вариант этой функции (strncat), который позволяет ограничитьчисло добавляемых символов.Строку очистить можно с помощью функции strcpystrcpy(s, "");а можно проще:s[0] = 0;1.3 Ввод/вывод строкДля вывода строк предусмотрен специальный спецификатор формата %s который можноиспользовать в функциях семейства printf. Например,printf("His name is %s\n", name);Символ-терминатор на печать выводиться не будет.Считывать строки можно аналогичным спецификатором формата %s для функций семейства scanf. Например,4char buf[20];scanf("%s", buf);В этом случае сначала будут пропущены все пробельные символы, затем все символы допервого пробельного символа будут занесены в buf.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.