Session7_Basic_of_CLanguage.ppt
- Количество слайдов: 34
Основы языка программирования
Алфавит При записи алгоритма решения задачи на языке программирования необходимо знать правила написания и использования элементарных информационных и языковых единиц Слова – лексемы, словосочетания – выражения, предложения – операторы Лексемы = символы Выражения = лексемы + символы Операторы = символы + выражения + лексемы Алфавит языка (символы) – это основные неделимые знаки, при помощи которых пишутся все тексты на языке Лексема – минимальная единица языка, имеющая самостоятельный смысл Выражение задаёт правило вычисления некоторого значения Оператор задаёт оконченное описание некоторого действия
Алфавит ЯП С/С++ Состоит из букв, цифр и специальных символов Буквы: прописные (А) и строчные (а) буквы латинского алфавита и знак подчёркивания (_) Десятичные цифры: арабские цифры (1, 2, 3, …) Специальные символы (, . ; () + -) Из символов алфавита формируются лексемы языка: ◦ ◦ ◦ Идентификаторы Ключевые (зарезервированные) слова Знаки операций Константы Разделители ((). , )
Индентификаторы Имя программного объекта (переменные, функции, типы данных) Правила формирования: ◦ Начинается с буквы ◦ Может состоять из цифр и букв ◦ Между двумя идентификаторами должен быть по крайней мере 1 пробел ◦ Максимальная длина идентификатора зависит от реализации (в т. ч. Может быть установлена программистом) Язык С/С++ регистрозависимый язык (var, Var) Недопустимо использование идентификаторов, совпадающих по написанию с ключевыми словами
Ключевые слова и знаки операций Это зарезервированные идентификаторы, которые имеют специальное значение для компилятора, образующие синтаксис языка auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef Union unsigned void volatile while Знаки операций – один или более символов, определяющие действие над операндами Унарные Бинарные тернарные
Константы Неизменяемые величины Константа Формат Примеры Целая Десятичный: Последовательность десятичных цифр, начинающаяся не с нуля, если это число не нуль 8, 0, 18881 Восьмеричный: Нуль, за которым следуют восьмеричные цифры Шестнадцатеричный: 0 x (0 X) , за которыми следуют шестнадцатеричные цифры Вещественная 01, 040, 03452 0 x 5, 0 x 1 B 4 Десятичный: [цифры] 5. 7, 8. 09, 0. 03, 9 Экспоненциальный: [цифры][. ][цифры]{E/e}[+/-][цифры] 0. 2 E 8, 5 e-5, 6 E 12 Символьная Один или два символа, заключенных в апострофы ‘A’, ‘ 7’, ’x 07’, ‘n’ Строковая Последовательность символов, заключённая в кавычки “Hello, Baby”, “n. Hello, World!n”
Управляющие (esc) последовательности Начинаются с обратной косой черты (обратного слэша) Используются для представления: ◦ Кодов, не имеющих графического представления ◦ Символов апострофа, обратной косой черты, знака вопроса и кавычки ◦ Любого символа с помощью его шестнадцатеричного или восьмеричного кода (x 20 - пробел, 100 – латинская P) ◦ a – звонок ◦ n – перевод каретки ◦ r – возврат каретки ◦ t – табуляция ◦ \ - обратный слэш ◦ ’ – одинарная кавычка ◦ ? – вопросительный знак Могут использоваться в строковых литералах
Типы данных Определяют: ◦ внутреннее представление данных в памяти компьютера и размер памяти; ◦ множество значений, которые могут принимать величины этого типа; ◦ операции и функции, которые можно применять к величинам этого типа. Выделяют: простые, составные и функциональные типы данных
Типы данных (простые) Язык программирования C: ◦ 4 базовых типа: char (символьный) – 1 byte int (целый) – 4 bytes float (вещественный) – 4 bytes double (вещ. двойной точности)– 8 bytes ◦ void Язык программирования С++ (плюс): bool (логический) – 1 byte wchar_t ()расширенный символьный) - 2 bytes
Спецификаторы типа Существует четыре спецификатора типа, уточняющих внутреннее представление и диапазон значений стандартных типов. ◦ Изменяющие размерность типа: short (короткий); long (длинный). ◦ Изменяющий диапазон значений: signed (со знаком); unsigned (без знака).
Типы данных Тип Диапазон значений Размер (байт) bool true и false 1 char – 128 … 127 1 signed char – 128 … 127 1 0 … 255 1 – 2 147 483 648 … 2 147 483 647 4 – 32 768 … 32 767 2 0 … 65 535 2 – 2 147 483 648 … 2 147 483 647 4 unsigned long int 0 … 4 294 967 295 4 float 3. 4 e– 38 … 3. 4 e+38 4 1. 7 e– 308 … 1. 7 e+308 8 3. 4 e– 4932 … 3. 4 e+4932 10 unsigned char int signed short int unsigned short int signed long int double long double
Структура С-программы Содержит 1 или более функцию Обязательно функция main() Глобальные объявления Возвр_тип main(список параметров) { Последовательность операторов (тело функции) } Возвр_тип f 1(список параметров) { (тело функции) } … Возвр_тип fn(список параметров) { (тело функции) }
Переменная Именованная область памяти, в которой хранятся данные определённого типа. ◦ Есть имя и значение. ◦ Имя служит для обращения к области памяти, в которой хранится значение. ◦ Значение может изменяться в ходе выполнения программы. ◦ Перед использованием должна быть описана. [класс памяти][const] тип имя [инициализатор] Класс памяти – определяет время жизни и область видимости программного объекта. По умолчанию определяется компилятором исходя из контекста определения (auto, static, register, extern) const – именованная костанта Тип Имя – идентификатор Инициализатор – значение (= и ()) int a=5; int a(5);
Переменная Область действия идентификатора – часть программы, в которой его можно использовать для доступа к связной с ним области памяти. Переменная может быть локальная и глобальная. Время жизни – может быть постоянным и временным. Область видимости – часть программы, в которой допустим обычный доступ к связной с идентификатором области памяти. Чаще всего область действия и видимости совпадают. Объявление переменной информирует компилятор о типе переменной и классе памяти. Определение - + выделение памяти в соответствии с типом переменной
Класс памяти определяет время жизни и область видимости программного объекта auto — автоматическая переменная. Память под нее выделяется в стеке и при необходимости инициализируется каждый раз при выполнении оператора, содержащего ее определение, и освобождается при выходе из блока, в котором она описана. Время ее жизни — локальное. extern — переменная определяется в другом месте программы. Используется для создания переменных, доступных во всех модулях программы, где они объявлены. Если переменная в том же операторе инициализируется, спецификатор extern игнорируется. static — статическая переменная. Время жизни — постоянное. Инициализируется один раз при первом выполнении оператора, содержащего определение переменной. В зависимости от расположения оператора описания статические переменные могут быть глобальными и локальными. Глобальные статические переменные видны только в том модуле, в котором они описаны. register — аналогично auto, но память выделяется по возможности в регистрах процессора.
Пример int a; //1 глобальная переменная a main() { int b; //2 локальная переменная b extern int x; //3 переменная х определена позже static int c; //4 локальная статическая переменная c a = 1; //5 присваивание глобальной переменной int a; //6 локальная переменная a a = 2; //7 присваивание локальной переменной : : a = 3; //8 присваивание глобальной переменной } int x = 4; //9 определение и инициализация x
Операции Выражения состоят из операндов, операций и скобок и используются для вычисления некоторого значения определенного типа. Каждый операнд является, в свою очередь, выражением или одним из его частных случаев — константой или переменной Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки. Если в одном выражении записано несколько операций одного приоритета, унарные операции, условная операция и операции присваивания выполняются справа налево, остальные — слева направо. Порядок вычисления подвыражений внутри выражений не определен. Результат вычисления выражения характеризуется значением и типом. В выражение могут входить операнды различных типов. Если операнды имеют одинаковый тип, то результат операции будет иметь тот же тип. Если операнды разного типа, перед вычислениями выполняются преобразования типов по правилам, обеспечивающим преобразование более коротких типов в более длинные для сохранения значимости и точности.
Унарные операции Операция Описание ++ увеличение на 1 – – уменьшение на 1 (пробелы между символами не допускаются) sizeof размер ~ поразрядное отрицание ! логическое отрицание – арифметическое отрицание (унарный минус) + унарный плюс & взятие адреса * разадресация new выделение памяти delete освобождение памяти (type) преобразование типа Пример
Бинарные операции Операция Описание * умножение / деление % остаток от деления + сложение – вычитание << сдвиг влево >> сдвиг вправо Пример
Бинарные операции (продолжение) Операция Описание < меньше <= меньше или равно > больше >= больше или равно == равно != не равно Пример
Бинарные операции (продолжение) Операция Описание & поразрядная конъюнкция (И) ^ поразрядное исключающее ИЛИ | поразрядная дизъюнкция (ИЛИ) && логическое И || логическое ИЛИ Пример
Бинарные операции (продолжение) Операция Описание = присваивание *= умножение с присваиванием /= деление с присваиванием %= остаток отделения с присваиванием += сложение с присваиванием –= вычитание с присваиванием <<= сдвиг влево с присваиванием >>= сдвиг вправо с присваиванием &= поразрядное И с присваиванием |= поразрядное ИЛИ с присваиванием ^= поразрядное исключающее ИЛИ с присваиванием , последовательное вычисление Пример
Тернарная операция ? : условная операция
Приоритеты операций Приоритет Знак операции Типы операции Порядок выполнения 2 () []. -> Выражение Слева направо 1 - ~ ! * & ++ -- sizeof приведение типов Унарные Справа налево 3 * / % Мультипликативные Слева направо 4 + - Аддитивные 5 << >> Сдвиг 6 < > <= >= Отношение 7 == != Отношение (равенство) 8 & Поразрядное И 9 ^ Поразрядное исключающее ИЛИ 10 | Поразрядное ИЛИ 11 && Логическое И 12 || Логическое ИЛИ 13 ? : Условная 14 = *= /= %= += -= &= |= >>= <<= ^= Простое и составное присваивание Справа налево 15 , Последовательное вычисление Слева направо
Стиль программирования Для того, чтобы «написать сложную и полезную программу, открытую для сопровождения, внесения изменений и выполнения доработок, необходимо следовать правилам, которые выработаны методом проб и ошибок поколениями специалистов в процессе реализации сложных проектов. Совокупность таких правил часто называют стилем программирования. » выделяют основные факторы, влияющие на стиль программирования: ◦ применение структурного или объектно-ориентированного подхода ◦ выделение алгоритмических конструкций в исходных текстах программ доступными изобразительными средствами (например, с помощью пробельных отступов, записи алгоритмов «лесенкой» ) ◦ использование комментариев. Системный подход к выбору идентификаторов
Венгерская нотация соглашение об именовании переменных, констант и прочих идентификаторов в коде программ. Чарльз Симони программист компании MS венгерского происхождения. Имена идентификаторов предваряются заранее оговорёнными префиксами, состоящими из одного или нескольких символов
Префиксы, задающие тип Префикс Сокращение от Смысл Пример s string строка s. Client. Name sz zero-terminated string строка, ограниченная нулевым символом sz. Client. Name n, i int целочисленная переменная n. Size, i. Size l long длинное целое l. Amount b boolean булева переменная b. Is. Empty a array массив a. Dimensions t, dt time, datetime время, дата и время t. Delivery, dt. Delivery p pointer указатель p. Box lp long pointer двойной (дальний) указатель lp. Box r reference ссылка r. Boxes h handle дескриптор h. Window m_ member переменная-член m_s. Address g_ global глобальная переменная g_n. Speed C class класс CString T type тип TObject I interface интерфейс IDispatch v void отсутствие типа v. Reserved
Префиксы, задающие смысл Префикс Сокращение от Смысл Пример i index Индекс int ix; Array[ix] = 10; d delta Разница между значениями int a, b; . . . dc = b - a; n number Количество size_t n. Found = 0;
Преимущества Если встроенного механизма типизации не хватает, венгерская нотация позволяет записывать подтип переменной — например, int c. Price может означать, что переменная имеет не просто целый тип, а валютный (currency). Именно такое применение префиксов было предложено Шимоньи[2]. Это может пригодиться: ◦ В низкоуровневом программировании (когда набор доступных типов настолько узок, что, например, целый тип не отличается от булевого). ◦ В языках с динамической типизацией, например PHP, где одна и та же переменная может хранить значения любого типа. ◦ В инженерных расчётах (для записи единиц измерения). Это позволяет избавиться от немалого количества ошибок простым подсчётом размерностей. ◦ В других местах, где переменные одного и того же типа предназначены для хранения разнородных данных — например, в коде защиты от хакеров префикс может указывать на «безопасные» и «небезопасные» данные (см. SQL-инъекция, XSS). Венгерская нотация удобна для написания больших программ в неполнофункциональных (по современным меркам) редакторах без автоматизированной навигации по тексту. Скорее всего, именно поэтому она стала стандартным стилем кода в Win. API. Удобно при именовании объектов, для которых тип очевиден — например, кнопку «OK» можно назвать btn. Ok. Две переменные разного типа, но объединённые логически, могут иметь имена, отличающиеся лишь префиксом. Например, поле ввода для поиска и кнопка «Поиск» могут именоваться как txt. Search и btn. Search.
Недостатки Некоторые программисты считают, что использование префиксов делает имена переменных менее понятными и, таким образом, ухудшает читаемость кода. Если известно имя переменной без префиксов, подчас трудно восстановить её префиксы. Система автодокументации, если она не понимает системы префиксов, отсортирует алфавитный список по префиксу, что может отрицательно сказаться на качестве документации. Впрочем, имена функций обычно префиксами не снабжают. Запись нескольких префиксов из-за частого использования заглавных букв и знаков подчёркивания может стать «пляской на кнопке Shift» . Средства навигации, которые включены в современные редакторы кода, и так позволяют видеть тип любой переменной и быстро переходить к точке, где она определена — то есть, использование префиксов может быть избыточным. При изменении типа потребуется изменять имя переменной (большинство программистских редакторов не могут делать это автоматически). Существуют и другие средства задания типа переменной в её имени: например, слова is, has и т. д. для булевского типа (Is. Logged. In), count для счётчика (Ref. Count), множественное число для массива (User. Ids)… В языках, в которых заглавные буквы не эквивалентны строчным, регистр букв также может кодировать что-либо.
Ввод-вывод (низкоуровневый) В языке нет встроенных средств ввода/вывода. Он осуществляется с помощью подпрограмм, типов и объектов, содержащихся в стандартных библиотеках ANSI С
Ввод-вывод #include
Ввод-вывод Спецификации формата (%) Тип Результат c char один символ i, d int десятичное число o int восьмеричное число x, X int шестнадцатиричное число строчные/заглавные буквы u int s char * f double/float e, E " научный формат -1. 23 e 002 g, G " e или f (что из них короче) % - символ % unsigned int Строка , завершающаяся " " формат -m. ddd. . .
Ввод-вывод Между % и форматной буквой мы можем поставить: - (знак минус) -- выровнять влево целое число -- ширина поля. m. d -- m - ширина поля, d - число точек после запятой или число символов в строке. printf("%-2. 3 fn", 17. 23478); 17. 235 printf("VAT=17. 5%%n"); VAT=17. 5%


