ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ Раздел 1. Базовые конструкции и типы данных языка Си Старший преподаватель Кафедры ВС, к.т.н. Поляков Артем Юрьевич.

Презентация:



Advertisements
Похожие презентации
Состав высокоуровневого языка программирования СИ Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ГОУ ВПО.
Advertisements

Данные в программах и алгоритмах Программы и их алгоритмы пишутся для обработки данных. Чтобы реализовать алгоритм, программам необходимо работать с данными.
Лекция 2 С => C++ => C# Большие и маленькие буквы различаются (main, Main, MAIN, mAin – разные имена) После каждого оператора ставится точка с запятой.
Элементы языка СИ Средства для написания простейших программ.
Лекция 4 Программирование на Паскале. Элементы языка Турбо Паскаль 7.0. Типы данных. Управляющие конструкции.
Язык программирования Pascal Выполнила: ученица 10А класса Елизавета Тельнова Г. Королев 2012 год.
Лекция 1 по дисциплине «Программные средства математических расчетов» тема: «Основы языка С++» гр. 8Е31 Мамонова Татьяна Егоровна
Глава 6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ Оператор присваивания Простой и составной операторы Условный оператор Оператор множественного выбора Оператор цикла с предусловием.
turbo.exe основной файл среды Любой язык обладает алфавитом, синтаксисом и семантикой. В алфавит входит набор символов, использующихся в языке с помощью.
©ρŧą Базовые конструкции языка.
Переменные и операторы УРОК 2. Переменные ПЕРЕМЕННАЯ – ?... контейнер для хранения данных. Переменная имеет имя – это….? последовательность букв, цифр.
Таблица умножения на 8. Разработан: Бычкуновой О.В. г.Красноярск год.
Идентификаторами в языке Си являются последовательности букв и цифр, начинающиеся с буквы, причем символ подчеркивания рассматривается компилятором как.
Разработка программного обеспечения для сигнальных процессоров TMS320C64xx в IDE Code Composer Studio Часть II. Язык программирования С. Основные понятия.
Объектно-ориентированный язык программирования. Переменная - эта поименованная ячейка памяти, хранящая какое-либо одно значение (одно число, один фрагмент.
Язык программирования Pascal. Программа это упорядоченный список команд, необходимых для решения некоторой задачи. Языком программирования называют систему.
Переменная l. Определение Переменная - именованное место в памяти, в котором можно хранить некоторое значение.
Представление информации в вычислительной технике Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ.
Матемтааки ЕТ СТ 2 класс Шипилова Наталия Викторовна учитель начальных классов, ВКК Шипилова Наталия Викторовна учитель начальных классов, ВКК.
Основы языка Pasсal.
Транксрипт:

ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ Раздел 1. Базовые конструкции и типы данных языка Си Старший преподаватель Кафедры ВС, к.т.н. Поляков Артем Юрьевич 1 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Рассматриваемые вопросы Синтаксис языка и способы его описания – Расширенная форма Бэкуса-Наура Состав языка программирования высокого уровня Си – Алфавит, лексемы, идентификаторы, служебные слова – Операторы описания, типы данных – Исполняемые операторы (базовые конструкции языка) операции языка Си оператор ветвления циклические операторы – Пепроцессорные директивы 2 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Синтаксис языка программирования Под синтаксисом языка программирования понимают правила построения корректных конструкций данного языка. Наиболее распространенными способами описания синтаксиса языков программирования являются: – форма Бэкуса-Наура (БНФ); – расширенная форма Бэкуса-Наура (РБНФ). В рамках данного курса для описания синтаксиса будет использоваться расширенная форма Бэкуса-Наура (РБНФ). 3 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Правила описания синтаксиса языка с использованием РБНФ 4 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Символы РБНФ Служебные слова языка, разделители и операции называются терминальными символ и записываются в кавычках. Из РБНФ они переносятся в программу без изменений. Например, "int" – имя целочисленного типа данных. Конструкции языка называются нетерминальными символами и записываются слитно русскими и латинскими буквами. Например, Идентификатор.

Правила описания синтаксиса с использованием РБНФ (2) 5 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Правила РБНФ Правило РБНФ имеет следующий вид: ИмяСимвола = выражение. где ИмяСимвола имя нетерминального символа, а выражение комбинация терминальных и нетерминальных символов и специальных знаков, удовлетворяющая требованиям РБНФ. Точка в конце специальный символ, указывающий на завершение правила.

Правила описания синтаксиса с использованием РБНФ (3) 6 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Выражения РБНФ A = B|C|D. обозначает, что символ A может принимать значения B, либо C, либо D. [A] определяет, что выражение A может повторяться 0 или 1 раз ("AB"["C"] допускает AB или ABC); {A} определяет, что выражение А может повторяться 0 или множество раз. Например, "AB"{"C"} допускает конструкции AB, ABC, ABCC и т.д. (А) используются для группировки выражений. Например A = ("B"|"C")("D"|"E") допускает наличие следующих конструкций: BD, BE, CD, CE.

Структура простейшей программы на языке Си 7 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include Препроцессорные директивы /* Программа вычисления корней квадратного */ // уравнения Комментарии int main() { Обязательная функция main float a = -4,b = 4,c = 3; float D, x1,x2; Операторы описания D = b*b - 4*a*c; if( D > 0 ){ x1 = (-b + sqrt(D))/(2*a); x2 = (-b - sqrt(D))/(2*a); printf("Корни: %f, %f\n",x1, x2); } else if( D == 0 ){ x1 = (-1)*b/(2*a); printf("Корень: %f\n",x1); }else{ printf("Корней нет\n"); } Исполняемые операторы return 0; } Завершение программы

Алфавит языка Си прописные и строчные буквы латинского алфавита (A... Z, a... z) цифры: специальные знаки: ", { } | [ ] ( ) + - / % \ ; '. : ? > < = _ & ! * # ~ ^ неотображаемые символы (пробел, табуляция, переход на новую строку) В комментариях, строках и символьных константах могут использоваться другие литеры (например, русские буквы). 8 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Лексемы языка Си Из символов алфавита составляются лексемы - минимальные единицы языка, имеющие самостоятельный смысл: константы; имена объектов; ключевые слова; знаки операций; разделители(скобки, точка, запятая, пробельные символы). 9 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Идентификаторы

Комментарии (документирование исходного кода) Комментарии могут располагаться в любом месте программы. В первоначальном стандарте С89 были только многострочные комментарии: 10 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» /* Текст многострочного комментария, Который завершается знаком */ В следующей версии стандарта (С99) были введены однострочные комментарии, используемые в языке С++: // Текст однострочного комментария Данный текст комментарием не является Комментарий = Однострочный | Многострочный. Многострочный = "/*" Текст {"\n" Текст}"*/". Однострочный = "//" Текст "\n". Текст = { ДопустимыеСимволы_Кроме_ПереводаСтроки }. Описание комментариев с использованием РБНФ:

Структура программы на Си Операторы описания 11 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include Подключение заголовочных файлов (препроцессорные директивы) /* Программа вычисления корней квадратного*/ // уравнения Комментарии int main() { Обязательная функция main float a = -4,b = 4,c = 3; float D, x1,x2; Операторы описания D = b*b - 4*a*c; if( D > 0 ){ x1 = (-b + sqrt(D))/(2*a); x2 = (-b - sqrt(D))/(2*a); printf("Корни: %f, %f\n",x1, x2); } else if( D == 0 ){ x1 = (-1)*b/(2*a); printf("Корень: %f\n",x1); }else{ printf("Корней нет\n"); } Исполняемые операторы return 0; } Завершение программы

Идентификаторы 12 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Идентификатором называется имя, сопоставленное объекту языка, (например: переменной, функции или служебным словам языка). Идентификатор представляет собой последовательность строчных, прописных букв латинского алфавита, цифр и знака подчеркивания. Причем идентификаторы должны начинаться либо с буквы, либо со знака подчеркивания. Строчные и прописные буквы рассматриваются компиляторами языка Си как несовпадающие. Примеры идентификаторов: int _test_id128 _128id

Идентификаторы (РБНФ) 13 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Идентификатор = ( Буква | "_" ){ Буква | Цифра | "_" } Буква = "A" | "B" |... | "Y" | "Z" | "a" | "b" |... | "y" | "z" Цифра = "0" | "1" |... | "9" Идентификатор представляет собой последовательность строчных, прописных букв латинского алфавита, цифр и знака подчеркивания. Причем идентификаторы должны начинаться либо с буквы, либо со знака подчеркивания. Эквивалентное определение идентификатора с помощью РБНФ:

Служебные слова 14 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» asm * doublegotostruct autoelseifswitch breakendinttypedef caseentry * longunion charenumregisterunsigned constexitreturnunix * continueexternshortvoid defaultfloatsizeofvolatile * doforstaticwhile * Зависит от компилятора; для некоторых компиляторов может не быть служебным словом. Служебные слова представляют собой идентификаторы, имеющие специальное значение для компилятора языка Си. Служебные слова нельзя использовать как имя переменной. Они применяются для использования определенных свойств языка.

Операторы описания Оператор описания позволяет определить данные, над которыми в программе выполняются действия. Определение оператора описания с помощью РБНФ: 15 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» ОператорОписания = Тип," ",Объект { "," Объект } ";". Объект = Идентификатор [ "=" Значение ]. Тип = ЦелыйТип | ВеществТип | СложнТип. ЦелыйТип = [ "unsigned"] ( "char" | "short" | "int" | "long" ). ВеществТип = "float" | [ "long" ] "double".

Операторы описания (2) 16 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Например: Примером описания строки 1 на естественном языке может служить предложение: "В памяти следует отвести область для хранения целого числа, для обращения к данной области будет использоваться имя i". 1int i; 2float j, k = 5; 3j=k*3; ОператорОписания = Тип," ",Объект ["," Объект]";". Объект = Идентификатор ["=" Значение]. Тип = ЦелыйТип | ВеществТип | СложнТип. ЦелыйТип = ["unsigned"]("char"|"short"|"int"|"long"). ВеществТип = "float"| ["long"]"double". Инициализация

Целочисленные типы данных 17 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» ИдентификаторРазмер, байтДиапазон значений char1[-128; 127] short2[-32768; 32767] int4[– ; ] long4 или 8[-2 63 ; ] (8 байт) ИдентификаторРазмер, байт Диапазон значений unsigned char1[0; 255] unsigned short2[0; 65535] unsigned int4[0; ] unsigned long4 или 8[0; ] (8 байт) Знаковые целые Беззнаковые целые

1int i; 2char c; 3short z = 10; 4long l; Целочисленные типы данных (примеры) 18 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Знаковые целые Беззнаковые целые 1unsigned int i; 2unsigned char c; 3unsigned short z = 10; 4unsigned long l; Инициализация

Вещественные типы данных 19 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» ИдентификаторРазмер, байтДиапазон значений float4 от ±3.4· до ±3.4·10 38 (~ 7 значащих цифр) double8 от ±1.7· до ±1.7· (~ 15 значащих цифр) long double12 от ±1.2· до ±1.2· (~ 30 значащих цифр)

Вещественные типы данных (примеры) 20 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» 1float f; 2double d = 1.5, d1 = ; 3long double ld, ld1, _ld12bytes;

Представление символьной информации в вычислительной технике 21 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Набор символов или кодировка (англ. character set) таблица, задающая кодировку конечного множества символов алфавита (обычно элементов текста: букв, цифр, знаков препинания). Каждому символу сопоставляется последовательность бит, которая формирует целочисленный код. Наиболее распространены кодировки трёх типов: совместимые с ASCII совместимые с EBCDIC основанные на Юникоде 16-битные В терминальных классах используется кодировка UTF-8, основанная на Юникоде и совместимая с ASCII

Символьный тип данных 22 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Символьный тип (char) простой тип данных, предназначенный для хранения одного символа в определённой кодировке. В языке Си: объем: 1 байт; является целочисленным (код символа – целое число). Для обозначения символьных констант используютс одинарные кавычки: 1char ch = 'a'; // ch содержит код символа 'a' 2 // то есть 97 (см. след слайд)

Таблица ASCII (шестнадцатеричные коды) 23 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» A.B.C.D.E.F 0.NULSOHSTXETXEOTENQACKBELBSTABLFVTFFCRSOSI 1.DLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS 2. !"#$ %&'()*+,./ : ; ? 5.PQRSTUVWXYZ[\]^_ 6.`abcdefghijklmno 7.pqrstuvwxyz{|}~DEL Американский стандартный код обмена информацией. Представления десятичных цифр, латинского и национального алфавитов, знаков препинания и управляющих символов. Приведена первая половина (без национального алфавита).

Таблица ASCII (цифры) 24 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» A.B.C.D.E.F 0.NULSOHSTXETXEOTENQACKBELBSTABLFVTFFCRSOSI 1.DLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS 2. !"#$ %&'()*+,./ : ; ? 5.PQRSTUVWXYZ[\]^_ 6.`abcdefghijklmno 7.pqrstuvwxyz{|}~DEL Символ Шестн. код Дес. код Коды цифр располагаются непрерывно друг за другом Если известно, что переменная С содержит код цифры, то получить числовое представление цифры можно отняв от значения С код 0-ля (тип char – целочисленный!): int i = C – '0'; // или i = C – 0x30; i = C – 48; Первый вариант наиболее предпочтителен, так как обладает большей информативностью Коды цифр располагаются непрерывно друг за другом Если известно, что переменная С содержит код цифры, то получить числовое представление цифры можно отняв от значения С код 0-ля (тип char – целочисленный!): int i = C – '0'; // или i = C – 0x30; i = C – 48; Первый вариант наиболее предпочтителен, так как обладает большей информативностью

Таблица ASCII (латинские буквы) 25 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» A.B.C.D.E.F 0.NULSOHSTXETXEOTENQACKBELBSTABLFVTFFCRSOSI 1.DLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS 2. !"#$ %&'()*+,./ : ; ? 5.PQRSTUVWXYZ[\]^_ 6.`abcdefghijklmno 7.pqrstuvwxyz{|}~DEL Коды заглавных букв латинского алфавита располагаются непрерывно Коды строчных – также непрерывно Для того чтобы проверить что символ является строчной буквой достаточно проверить принадлежность интервалу [97,122] или что тоже самое ['a','z']: if ( c>='a' && c='a' && c

Типизация данных Язык Си имеет статическую типизацию данных: Каждой переменной, параметру или функции приписывается определённый тип данных. Для любого выражения возможность его выполнения и тип полученного значения могут быть определены без исполнения программы. Основные отличия между типами данных: Внутреннее представление – различный объем; – разное внутреннее представление. Множество допустимых операций 26 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» 1int i, j=3, k=2; i = j/k; // i == 1 2float i, j=3, k=2; i = j/k; // i == 1.5 Операция сравнения!

Типизация данных (2) Преимущества использования типов данных: Надёжность Типы данных защищают от трёх видов ошибок: – Некорректное присваивание. Например, присваивание числовой переменной строкового значения. – Некорректная операция. – Некорректная передача параметров. Например, передача строки на вход функции синус. Документация Использование того или другого типа данных объясняет намерения программиста. Стандартизация. Программы не требуют значительных переработок при изменении инструментов разработки. 27 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

28 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include Подключение заголовочных файлов (препроцессорные директивы) /* Программа вычисления корней квадратного*/ // уравнения Комментарии int main() { Обязательная функция main float a = -4,b = 4,c = 3; float D, x1,x2; Операторы описания D = b*b - 4*a*c; if( D > 0 ){ x1 = (-b + sqrt(D))/(2*a); x2 = (-b - sqrt(D))/(2*a); printf("Корни: %f, %f\n",x1, x2); } else if( D == 0 ){ x1 = (-1)*b/(2*a); printf("Корень: %f\n",x1); }else{ printf("Корней нет\n"); } Исполняемые операторы return 0; } Завершение программы Структура программы на Си Исполняемые операторы

Исполняемые операторы Исполняемый оператор задает законченное действие, выполняемое над данными. 29 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» последовательное исполнение ДАНЕТ ветвлениецикл НЕТ ДА ВСЕ БАЗОВЫЕ КОНСТРУКЦИИ ИМЕЮТ ОДИН ВХОД И ОДИН ВЫХОД!

Операции в языке Си (по числу аргументов) 30 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Унарные (работают с одним аргументом): sizeof(var) – возвращает размер var в байтах; z++ – увеличивает значение z на единицу; -z – изменение знака z. Бинарные (требуют 2 аргумента): a - b – разность значений a и b (не унарная!) a > b – сравнение значений a и b, результат – истина, если условие выполняется и лож – в противном случае. Тренарные (требуют 3 аргумента): a > 0 ? 1 : 2 – если a > 0 то операция возвращает значение 1, в противном случае – 2. Последовательное исполнение

Операции в языке Си (по типу операций) 31 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Тип операции унарныебинарныетренарные Арифметические +, -+, -, *, /, % Логические !||, && Сравнение, >=, >,

Арифметические операции 32 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Класс Опер.ОписаниеПример Унарная - Изменение знака int k = -z; + Изменение знака (исп. редко) - Бинарная + Аналогичны математическим операциям z = a + b; -z = a – b; *z = a * b; / Деление (для целых – целая часть от деления) z = a / b; % остаток от деления (только целые) z = a % b; 1int i, j, k = 5, l = 2; 2i = k / l; // i == 2 3j = k % l; // j == 1, k = (i * l) + j Пример для операций деления: Последовательное исполнение

Логические операции 33 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Класс Опер.ОписаниеПример Унарная ! Логическое НЕ z = !a; Бинарная && Логическое И z = a && b; || Логическое ИЛИ z = a || b; ab!aa && ba || b В языке Си не предусмотрено булевого типа данных. Для хранения значений типа ИСТИНА и ЛОЖЬ используются целые типы: ИСТИНА ~ любому ненулевому значению, например 1, 10, -5; ЛОЖЬ ~ нулевому значению: 0. Последовательное исполнение

Операции сравнения 34 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Класс Опер.ОписаниеПример Бинарная < Меньше a < b > Больше a > b >= Больше или равно a >= b

Условная операция 35 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Единственная тренарная операция в языке Си. Реализует упрощенную запись конструкции ветвления. Например: 1i = (a>0) ? i + a : i – a; // i = i + |a| a > 0 i =i+a i=i-a ДАНЕТ Данная запись эквивалентна следующей конструкции ветвления: Читать следующим образом: Если а больше нуля, то увеличить значение i на значение а. В противном случае – уменьшить значение i на значение a. Последовательное исполнение

Битовые операции 36 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Класс Опер.ОписаниеПример Унарная ~ Поразрядное НЕ ~a; Бинарная & Поразрядное И a & b | Поразрядное ИЛИ a | b ^ Исключающее ИЛИ (XOR) a ^ b >> Сдвиг на указанное число (n) разрядов влево или вправо a >> n

Поразрядное НЕ 37 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Поразрядное НЕ (~) обеспечивает применение операции "логическое НЕ" к каждому разряду двоичного представления целого числа. Например: TYPE c = ~20; ~20 10 = ~( ) = ~( ) = = = TYPEДвоичная ССДес. СС unsigned char unsigned short a!a 10 01

Поразрядное И (&) 38 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Поразрядное И (&) обеспечивает применение операции "логическое И" к каждому разряду двоичного представления целого числа. Например: char c1 = 20, c2 = 15, c3 = c1 & c = = & 15 = = 4 10 & Последовательное исполнение

Поразрядное ИЛИ ( | ) 39 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Поразрядное ИЛИ ( | ) обеспечивает применение операции "логическое ИЛИ" к каждому разряду двоичного представления целого числа. Например: char c1 = 20, c2 = 15, c3 = c1 | c = = | 15 = = | Последовательное исполнение

Исключающее ИЛИ ( ^ ) 40 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Исключающее ИЛИ ( ^ ) обеспечивает применение операции "сложение по модулю 2" к каждому разряду двоичного представления целого числа. Например: char c1 = 20, c2 = 15, c3 = c1 ^ c = = ^ 15 = = ^ Сложение по модулю 2 – остаток от деления полученной суммы на 2 z = (x + y) % 2 xyx + yz Последовательное исполнение

Поразрядный сдвиг (>>, >3, c3 = c1 > 3 = = 2 10 >> =

Операции присваивания 42 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Класс Опер.ОписаниеПример Унарная ++ префиксный инкремент ++i; постфиксный инкремент i++; -- префиксный декремент --i; префиксный декремент i--; Бинарная = присваивание i = j; += присваивание вида: a = b; трактуется как a = a b; например: a += b; эквивал. a = a + b; i += j; -=i -= j; *=i *= j; /=i /= j; %=i %= j;... Последовательное исполнение

i Операции присваивания (инкремент и декремент) 43 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Префиксная запись предусматривает использование измененного значения, а постфиксная – исходного. Например: int i = 10, j, k; j = ++i; // i = 11, j = 11 k = i++; // i = 12, k = 11 1int i = 20; 2i++; 20 R1 1 R2 ADD Инкремент – увеличение на единицу, декремент – уменьшение. Последовательное исполнение

Операции присваивания (обмен значениями) 44 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» 1int i = 5, j = 10, tmp; 2tmp = i; 3i = j; 4j = tmp; i 56 j X tmp 5 6 Часто встречающаяся задача в программировании – обменять значения двух переменных. Для решения этой задачи можно использовать вспомогательную переменную: Последовательное исполнение 5

Операции присваивания (побочные эффекты) 45 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение Основной эффект операции вычисление значения Побочный эффект изменение объектов. Рассмотрим более конкретный пример: int i, j; i = 5 + (j = 2); Основной эффект j = 2 результат вычисления выражения слева. Он подставляется во внешнее выражение: i = 5 + (j = 2). Побочный эффект - изменение значения ячейки j.

Побочные эффекты неопределенное поведение 46 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение int x=0; // ТПВ 1 2x = x++; // ТПВ 2 3printf("x = %d\n", x); В стандарте Си между двумя точками последовательных вычислений (ТПВ) изменение значения переменной возможно не более одного раза. 1y = 4; // ТПВ 1 2x = y; // ТПВ 2 3printf("y=%d,x=%d\n",y,x); Пример 1: Пример 2: gcc 3.4.4: x = 0 gcc 4.4.5: x = 1

Побочные эффекты переносимость 47 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение 1int a = 1, b, c; 2b = (a++)+(++a); 3printf("a=%d,b=%d\n",a,b); 4a = 1; 5c = (a++)+(a++)+(++a); 6printf("a=%d,c=%d\n",a,c); Результат работы: КомпиляторMS Visual C 2008GCC Результаты a = 3, b = 4 a = 4, c = 6a = 4, c = 4

Побочные эффекты переносимость (2) 48 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение 1c = (a++)+(a++)+(++a); MS Visual C: Пусть a = a(a=a+1) (a=2) 2.c=a+a (c=4) 3.c=с+a (c=6) 4.a++ (a=a+1) (a=3) 5.a++ (a=a+1) (a=4) GCC: Пусть a = 1 1.c=a+a (c=2) 2.++a (a=a+1) (a=2) 3.c=c+a (c=4) 4.a++ (a=a+1) (a=3) 5.a++ (a=a+1) (a=4)

Последовательность выражений 49 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» 1int i,j,k; 2i = 5, j = 3, k = i + j; 3printf("1: i=%d,j=%d,k=%d\n",i,j,k); 4k = ++j, i+j; 5printf("2: i=%d, j=%d, k=%d\n",i,j,k); 6k = (++j, i+j); 7printf("3: i=%d, j=%d, k=%d\n",i,j,k); $./sequence 1: i = 5, j = 3, k = 8 2: i = 5, j = 4, k = 4 3: i = 5, j = 5, k = 10 Последовательное исполнение

Выражения 50 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение Выражения строятся из первичных выражений и знаков операций. Первичные выражения вычисляются в первую очередь, они имеют наивысший приоритет. К первичным выражениям относятся: идентификатор; лексическая константа; выражение в скобках; оператор sizeof.

Выражения (РБНФ) 51 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение Выражение = ( Операнд { БинарнОперация, Операнд }) | ( ЛевыйОперанд, Присваивание, Операнд ). Операнд = { ПрефикснОп } Переменная { ПостфикснОп } | ( { ПрефикснОп1 }( "(" Выражение ")" | Константа | sizeof(Тип) ) { ПостфикснОп1 } ). ЛевыйОперанд = Переменная. ПрефикснОп1, ПостфикснОп1 – префиксные/постфиксные операции, кроме ++ и – ПрефикснОп, ПостфикснОп – все префиксные/постфиксные операции БинарнОперация – все бинарные операции кроме группы присваивания.

Выражения (примеры) 52 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение Выражение = Операнд { БинарнОперация, Операнд } Операнд = { ПрефикснОп } Переменная { ПостфикснОп } | ( { ПрефикснОп1 }( "(" Выражение ")" | Константа | sizeof(Тип) ) { ПостфикснОп1 } ). Например: 1) y + 1 2) -(y + 1) 3) 1++ 4) (y + 1)++ 5) (y + 1)*(z-1)-k 6) i j 7) (k = a + b*c) 8) (a*=2,a++,a+z) 9) (a < b) && (a < c) ЛОГИЧЕСКОЕ ВЫРАЖЕНИЕ возвращает значение ИСТИНА (1) или ЛОЖЬ (0)

Выражения (примеры) 53 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение Выражение = ( ЛевыйОперанд, Присваивание, Операнд ). Операнд = { ПрефикснОп } Переменная { ПостфикснОп } | ( { ПрефикснОп1 }( "(" Выражение ")" | Константа | sizeof(Тип) ) { ПостфикснОп1 } ). ЛевыйОперанд = Переменная. Например: 1) x = y + 1; 2) x = -(y + 1); 3) 1 = x; 4) (y + 1) = 12; 5) x = (y + 1)*(z-1)-k; 6) x *= i j; 7) x += (a < b) && (a < c); 8) x += j -= (k = a + b*c); 9) x = (a*=2,a++,a+z);

Исполняемый оператор следования 54 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение Выражение, оканчивающееся точкой с запятой, является оператором, т.е. наименьшей элементарной частью программы. Оператор = Выражение ";" | { "{" { ОператорОписания } Оператор { Оператор } "}" }. Например: { x = 10; { y = x + 15 * x; z = 10; } x = 10; y = x + 15 * x; { int x = 10; y = x + 15 * x; } В начале блока операторов могут находиться операторы описания

Блок операторов 55 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение Несколько операторов может быть заключено в фигурные скобки. В этом случае они образуют блок операторов. C точки зрения синтаксиса блок рассматривается как один (составной) оператор. Группировка операторов необходима для того, чтобы указать компилятору: какие операторы принадлежат функции (например main ); какие операторы следует выполнять в случае выполнения ( if ) или невыполнения ( else ) некоторого условия в условном операторе. какие операторы формируют тело цикла (операторы for, while, do-while ).

Приоритеты и ассоциативность 56 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Группы по убыванию приоритета (сверху – наивысший) ОперацияАссоциативн. ++, -- Слева направо ++, --, +, -, !, ~, (тип), *, &, sizeof Справа налево *, /, % (бинарные) Слева направо +, - (бинарные) Слева направо > Слева направо, >= Слева направо == != Слева направо & ^ | && Слева направо || Слева направо ?: Справа налево =, +=, -=, *=, /=,... Справа налево, Слева направо Последовательное исполнение

Ассоциативность слева направо 57 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» ОперацияАссоциативность *, /, % (бинарные) Слева направо Например: i * j / k % s ~ ( (i * j) / k ) % s Последовательное исполнение ОперацияАссоциативность ++, -- Слева направо *, /, % (бинарные) Слева направо Например: ++i * j / ++k % s ~ ( ((++i) * j)/(++k) ) % s Ассоциативность внутри одной группы Ассоциативность и приоритеты

Ассоциативность справа налево 58 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение ОперацияАссоциативн. =, +=, -=, *=, /=,... Справа налево Например: 1int i = 5, j = 12, k; 2i += j -= k = 2; В данном примере строка 2 эквивалентна следующей программе: 1k = 2; 2j -= k; 3i += j;

Различные приоритеты и ассоциативность 59 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Последовательное исполнение 1int i= 5, j, k, z = 1; 2i += j = 5 + (k = 2) * (z < 5); ОперацияАссоциативн. *, /, % (бинарные) Слева направо +, - (бинарные) Слева направо, >= Слева направо =, +=, -=, *=, /=,... Справа налево ДействиеРезультатДействиеРезультат 1k = z < 515j = * 126i += 712

Оператор ветвления (условный оператор) 60 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» ДАНЕТ Выражение рассматривается как логическое: нулевое значение – ЛОЖЬ, иначе – ИСТИНА Оператор1 выполняется если Выражение ИСТИННО, иначе – Оператор2. УсловныйОператор = "if" "(" Выражение ")" Оператор1 [ else Оператор2 ]. Оператор ветвления

Настройка флага четности 61 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» if ((i % 2) == 0){ j = 1; printf("i–четное"); } else j = 0; УсловныйОператор = "if" "(" ЛогическоеВыражение ")" Оператор1 [ else Оператор2 ]. Оператор1 данном случае составной и содержит 2 простых оператора. Оператор2 – простой. i%2 j=1 j=0 ДАНЕТ i i Оператор ветвления

Вложение условных операторов 62 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» if ( i % 2 ){ j = 1; } else{ if( i % 3 ) j = 2; else j = 0; } i%2 j=1 ДАНЕТ j=0 i%3 j=2 НЕТ ДА if ( i % 2 ) j = 1; else if( i % 3 ) j = 2; else j = 0; Оператор ветвления

Оператор присваивания 63 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» 1if ( (D = b*b – 4*a*c) < 0 ){ 2 printf("Действительных корней нет\n"); 3}else if( D == 0 ){ 4 printf("Корень один: %f\n", -b/(2*a) ); 5}else{ 6 float x1 = (-b – sqrt(D) )/(2*a); 7 float x2 = (-b + sqrt(D) )/(2*a); 8 printf("Корней два: %f, %f\n", x1, x2); 9} Оператор ветвления

Циклические конструкции 64 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Условие Тело НЕТ ДА Условие Тело НЕТДА Цикл с предусловием ( while, for ) Цикл с постусловием ( do-while ) Циклические операторы

Цикл while 65 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Выраж Оператор НЕТ ДА Циклические операторы ОператорWhile = "while" "(" Выраж ")" Оператор. Выражение – условие продолжения цикла. Рассматривается как логическое: нулевое значение – ЛОЖЬ, иначе – ИСТИНА Оператор выполняется до тех пор, пока Выражение является ИСТИННЫМ.

Цикл while (сумма n входных значений) 66 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Циклические операторы ОператорWhile = "while" "(" Выражение ")" Оператор. i

Цикл while (бесконечный цикл) 67 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Циклические операторы 1while( 1 ){ 2 ТелоЦикла 3} Оператор while может быть использован для организации бесконечного цикла. Такая задача возникает при разработке, например серверных программ. Для организации бесконечного цикла достаточно в качестве Выражения указать ненулевую константу, например – 1. Структура бесконечного цикла на основе оператора while приведена ниже:

Цикл for 68 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Циклические операторы ОператорFor = "for" "(" [ Выр1 ] ";" [ Выр2 ] ";" [ Выр3 ] ")" Оператор. Выр1 выполняется ОДИН РАЗ до начала цикла Выр2 – условие продолжения цикла, рассматривается как логическое Выр3 выполняется ПОСЛЕ КАЖДОЙ итерации. Оператор выполняется до тех пор, пока Выр2 является ИСТИННЫМ. Выр2 Оператор НЕТ ДА Выр3 Выр1

Цикл for (сумма n входных значений) 69 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Циклические операторы i

Цикл for (особенности) 70 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Циклические операторы Любое управляющее выражение цикла for ( Выр1, Выр2, Выр3 ) может отсутствовать! Наличие ";" обязательно! В случае отсутствия Выр2 считается, что условие продолжения цикла всегда ИСТИННО! Пример бесконечного цикла на основе конструкции for : ОператорFor = "for" "(" [ Выр1 ] ";" [ Выр2 ] ";" [ Выр3 ] ")" Оператор. 1for( ; ; ){ 2 ТелоЦикла 3}

Цикл do-while 71 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Циклические операторы ОператорDoWhile = "do" Оператор "while" "(" Выраж ")" ";". Оператор выполняется КАК МИНИМУМ один раз Выраж – условие продолжения цикла, рассматривается как логическое Оператор выполняется до тех пор, пока Выраж является ИСТИННЫМ. Выраж Оператор НЕТДА

Цикл do-while 72 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Циклические операторы ОператорDoWhile = "do" Оператор "while" "(" Выраж ")" ";". 1int n, i, sum, a; 2scanf("%d",&n); 3if(n > 0){ 4 do{ 5 scanf("%d",&a); 6 sum += a; 7 i++; 8 }while(i

Вложенность циклов 73 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Циклические операторы 1int i, j; 2for(i=1;i

Структура простейшей программы на языке Си 74 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include Препроцессорные директивы /* Программа вычисления корней квадратного */ // уравнения Комментарии int main() { Обязательная функция main float a = -4,b = 4,c = 3; float D, x1,x2; Операторы описания D = b*b - 4*a*c; if( D > 0 ){ x1 = (-b + sqrt(D))/(2*a); x2 = (-b - sqrt(D))/(2*a); printf("Корни: %f, %f\n",x1, x2); } else if( D == 0 ){ x1 = (-1)*b/(2*a); printf("Корень: %f\n",x1); }else{ printf("Корней нет\n"); } Исполняемые операторы return 0; } Завершение программы

Этапы формирования исполняемого кода из исходного 75 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» prog1.o компиляция и компоновка … …… program (исполняемый (бинарный) файл) Редактирова ние связей (linking) prog1.cprog1.i препроцессорная обработка progN.oprogN.cprogN.i

… // Константа N #define N 15 int main() { int i = 15; #define Mac(x) (x*x) printf(i=%d\n, (i*i)); } … int main() { int i = 15; printf(i=%d\n, (i*i)); } Препроцессорные директивы (#define) 76 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» … // Константа N #define N 15 int main() { int i = N; #define Mac(x) (x*x) printf(i=%d\n, Mac(i)); } program.cprogram.i

#include file1.h int main() { #include file2.h printf(i=%d\n, i); } int i1; int main() { int i2; int i3; printf(i=%d\n, i); } Препроцессорные директивы (#include) 77 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include file1.h int main() { #include file2.h printf(i=%d\n, i); } program.c program.i int i1; file1.h int i2; int i3; file2.h

Структура простейшей программы на языке Си 78 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include Препроцессорные директивы /* Программа вычисления корней квадратного */ // уравнения Комментарии int main() { Обязательная функция main float a = -4,b = 4,c = 3; float D, x1,x2; Операторы описания D = b*b - 4*a*c; if( D > 0 ){ x1 = (-b + sqrt(D))/(2*a); x2 = (-b - sqrt(D))/(2*a); printf("Корни: %f, %f\n",x1, x2); } else if( D == 0 ){ x1 = (-1)*b/(2*a); printf("Корень: %f\n",x1); }else{ printf("Корней нет\n"); } Исполняемые операторы return 0; } Завершение программы

Этапы формирования исполняемого кода из исходного 79 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» prog1.o компиляция и компоновка … …… program (исполняемый (бинарный) файл) Редактирова ние связей (linking) prog1.cprog1.i препроцессорная обработка progN.oprogN.cprogN.i