Скачать презентацию Язык программирования С Тема Типы данных операции и Скачать презентацию Язык программирования С Тема Типы данных операции и

Лекция-04-05.ppt

  • Количество слайдов: 22

Язык программирования С Тема «Типы данных, операции и выражения» (продолжение) Лекция 16. 09. 13 Язык программирования С Тема «Типы данных, операции и выражения» (продолжение) Лекция 16. 09. 13 г. 1

Обзор вопросов прошлой лекции ü ü ü ü ü Строковые константы Константы перечислимого типа Обзор вопросов прошлой лекции ü ü ü ü ü Строковые константы Константы перечислимого типа Объявления переменных Операции, виды операций Арифметические операции Операции отношения Логические операции Операции инкремента и декремента Поразрядные (битовые) операции Лекция 16. 09. 13 г. 2

Операция присваивания В языке С операция присваивания существенно отличается от аналогичной операции в других Операция присваивания В языке С операция присваивания существенно отличается от аналогичной операции в других языках: Присваивание a = b действительно является операцией (а не оператором), т. е. после завершения этой операции получается некоторое значение (в данном примере – значение переменной b), которое может быть использовано для последующих вычислений. Следовательно, присваивание может применяться внутри выражений, наряду с другими операциями. //Ex 008. c – иллюстрация операции присваивания #include #include int main() { int a = 12, b, c; printf("result = %d n", c=(b=a)-5); system("PAUSE"); return 0; } Лекция 16. 09. 13 г. 3

Операции, совмещенные с присваиванием Кроме обычного присваивания существует ещё 10 модификаций, в которых присваивание Операции, совмещенные с присваиванием Кроме обычного присваивания существует ещё 10 модификаций, в которых присваивание совмещается с какой-либо бинарной операцией, например, k += 2 эквивалентно k = k + 2, или ещё: x >>= 1 эквивалентно x = x >> 1 и т. д. Полный перечень бинарных операций, совмещаемых с присваиванием: + - * / % << >> & ^ | //Ex 009. c – подсчет количества единичных битов в двух байтах #include #include int main() { unsigned short x = 0 x 1234; int b; for (b=0; x!=0; x >>= 1) if (x & 01) b++; printf("the number of bits = %d n", b); system("PAUSE"); return 0; } Лекция 16. 09. 13 г. 4

Тернарная условная операция Во многих алгоритмах часто встречается конструкция вида: if (условие) x = Тернарная условная операция Во многих алгоритмах часто встречается конструкция вида: if (условие) x = <выраж 1>; else x = <выраж 2>; Иными словами, переменная x получает значение одного из двух выражений, в зависимости от истинности условия. В языке С для компактной записи такого фрагмента существует специальная тернарная условная операция: x = условие ? <выраж 1> : <выраж 2> //Ex 010. c – иллюстрация условной операции #include #include #define N 57 int main() { int i, x[N]; for (i=0; i

Приоритет и ассоциирование операций № Операции Ассоциирование Кол-во 1 () [] ->. → 4 Приоритет и ассоциирование операций № Операции Ассоциирование Кол-во 1 () [] ->. → 4 2 ! ~ ++ -- + - * & (тип) sizeof ← 12 3 * / % → 3 4 + - → 2 5 << >> → 2 6 < <= > >= → 4 7 == != → 2 8 & → 1 9 ^ → 1 10 | → 1 11 && → 1 12 || → 1 13 ? : ← 1 14 = += -= *= /= %= &= ^= |= <<= >>= ← 11 15 , → 1 Всего операций: 47 Лекция 16. 09. 13 г. 6

Приоритет и ассоциирование операций Операции, находящиеся в одной строке таблицы, принадлежат одной группе, т. Приоритет и ассоциирование операций Операции, находящиеся в одной строке таблицы, принадлежат одной группе, т. е. имеют одинаковый приоритет и одинаковый порядок выполнения (слева направо или наоборот). Все 47 операций распределены по 15 группам, группа 1 имеет наивысший приоритет, а группа 15 – наиболее низкий приоритет. 1 -я группа: () - вызов функции, [] – доступ к элементу массива, -> - обращение к элементу структуры через указатель, . - обращение к элементу структуры через имя структуры. 2 -я группа (унарные операции): + - - унарные «плюс» и «минус» , * «разыменование» указателя, т. е. обращение к объекту, на который он указывает, & - получение адреса объекта, (тип) – преобразование типа операнда к заданному типу, sizeof – определение размера объекта. … 15 -я группа: , - операция «запятая» - это бинарная операция, имеющая вид: выражение 1 , выражение 2. Действие операции заключается в последовательном вычислении выражений, а её результатом является значение второго выражения. Лекция 16. 09. 13 г. 7

Иллюстрация к операциям //Ex 011. c – иллюстрация операции «запятая» #include <stdio. h> #include Иллюстрация к операциям //Ex 011. c – иллюстрация операции «запятая» #include #include int main() { операция «запятая» int i, s, x[] = {1, 3, 5, 7, 9}; for(i = 0, s = 0; i < sizeof(x)/sizeof(x[0]); s+=x[i++]); printf("s = %dn", s); кол-во элем. массива system("PAUSE"); return 0; } Лекция 16. 09. 13 г. 8

Иллюстрация к приоритету операций Чему равно значение переменной y после вычисления выражения: y*=x+=--k<<++i 5 Иллюстрация к приоритету операций Чему равно значение переменной y после вычисления выражения: y*=x+=--k<<++i 5 4 2 3 1 //Ex 012. c – иллюстрация сложного выражения #include #include int main() { int x = 4, y = 6, k = 5, i = 1; y*=x+=--k<<++i; printf("y = %d, x = %d, k = %d, i = %dn", y, x, k, i); system("PAUSE"); return 0; } Лекция 16. 09. 13 г. 9

Преобразование (приведение) типов Приведение типа (type conversion) — преобразование значения одного типа в значение Преобразование (приведение) типов Приведение типа (type conversion) — преобразование значения одного типа в значение другого типа. Различают явное и неявное приведения типов. üпри явном приведении с помощью унарной операции (тип) указывается тип, к которому необходимо преобразовать значение выражения, расположенного справа от этой операции; üпри неявном приведении преобразование происходит автоматически, по правилам, установленным в языке программирования. //Ex 013. c – иллюстрация приведения типов int main() { int x = 32768, y = 65535; short sx = 32768, sy = 65535; char c 1 = 32768, c 2 = 65535; unsigned z = 0 xffff; float fz = 0 xffff; printf("%d %d %d %f %dn", x, (short)x, sx, (float)x, c 1); printf("%d %d %d %f %dn", y, (short)y, sy, (float)y, c 2); printf("%u %f %f %fn", z, (float)z, (double)z, fz); system("PAUSE"); return 0; } Лекция 16. 09. 13 г. 10

Преобразование (приведение) типов Корректными преобразования типов, не вызывающими искажения значений или потери точности, являются Преобразование (приведение) типов Корректными преобразования типов, не вызывающими искажения значений или потери точности, являются приведения более «узких» типов к более «широким» . Если же значение более «широкого» типа приводится к более «узкому» типу, возможно искажение значения или потеря точности, о чем выдает предупреждение (warning) компилятор. Явные преобразования типов всегда происходят по «инициативе» программиста, а инициатором неявных преобразований выступает компилятор в тех случаях, когда при выполнении операции ожидается один тип, а фактически требуется другой тип. Замечание. В некоторых случаях неявное преобразование бывает неосуществимым «по определению» . Например, в выражении 3. 0%2. 0 значения 3. 0 и 2. 0 не преобразуется автоматически к целому типу, т. к. операция % применима только к целочисленным значениям и поэтому компилятор выдаст сообщение об ошибке (error). Лекция 16. 09. 13 г. 11

Тема «Управляющие конструкции языка С» Лекция 16. 09. 13 г. 12 Тема «Управляющие конструкции языка С» Лекция 16. 09. 13 г. 12

Простые операторы и блоки ; Ø Если в конце любого выражения поставить символ (точка Простые операторы и блоки ; Ø Если в конце любого выражения поставить символ (точка с запятой), получим элементарную «строительную конструкцию» программы – простой оператор: z = foo(x+y); x += y; 4*5; … Ø Простые операторы в программе могут располагаться последовательно, друг за другом: temp = x+y; z = foo(temp); Ø Последовательность операторов любого вида можно заключить в фигурные скобки { и }. В этом случае получится составной оператор, или, иначе – блок, который синтаксически эквивалентен простому оператору и компилируется как самостоятельная конструкция. После закрывающей скобки точка с запятой не ставится. Ø Блок может быть пустым: {} Лекция 16. 09. 13 г. 13

Простые операторы и блоки Ø Внутри блока можно размещать объявления переменных: { int temp Простые операторы и блоки Ø Внутри блока можно размещать объявления переменных: { int temp = x+y; z = foo(temp); } Такие переменные будут локальными; они создаются при входе в блок и исчезают при выходе из блока. За пределами блокальные переменные невидимы. Локальные переменные размещаются в области памяти, которая называется стек. Ø Блоки могут быть вложенными, при этом глубина вложенности не ограничивается: { int temp = x+y; z = foo(temp); { float temp 2 = x∗y; z += bar(temp 2); } } Лекция 16. 09. 13 г. 14

Операторы простого выбора условие ≠ 0 оператор условие В простейшем варианте выбора требуется выбрать Операторы простого выбора условие ≠ 0 оператор условие В простейшем варианте выбора требуется выбрать для выполнения определенный оператор, если некоторое условие =0 истинно (т. е. его значение отлично от 0). Это записывается так: if (условие) оператор Например: if(x%2) y += x/2; Т. е. если x – нечетно, то y увеличивается, в противном случае ничего не делается. Если при выполнении условия нужно выполнить последовательность операторов, необходимо использовать блок =0 ≠ 0 оператор1 оператор2 В другом случае требуется выбрать для выполнения один из двух операторов, в зависимости от некоторого условия: if (условие) оператор1 else оператор2 Например: if (a>b) c=a; else c=b; Лекция 16. 09. 13 г. 15

Вложенные операторы выбора Если в качестве исполняемого оператора в операторе выбора используется другой оператор Вложенные операторы выбора Если в качестве исполняемого оператора в операторе выбора используется другой оператор выбора, возникает ситуация вложенности операторов выбора. Пример: найти: d = max(a, b, c) a>b =0 ≠ 0 a>c =0 b>c ≠ 0 d=a =0 ≠ 0 d=c d=b d=c Лекция 16. 09. 13 г. //Ex 014. c #include #include int main() { int a = 4, b = 15, c = 7, d; if (a>b) оператор1 if (a>c) d = a; else d = c; else оператор2 if (b>c) d = b; else d = c; printf("max = %dn", d); system("PAUSE"); return 0; } 16

Вложенные операторы выбора Модифицируем алгоритм: d=c a>b =0 ≠ 0 a>c ≠ 0 d=a Вложенные операторы выбора Модифицируем алгоритм: d=c a>b =0 ≠ 0 a>c ≠ 0 d=a =0 b>c ≠ 0 d=b … if (a>b) {if (a>c) d = a; } else if (b>c) d = b; =0 //Ex 015. c #include #include int main() { int a = 4, b = 15, c = 7, d = c; if (a>b) Неверно! if (a>c) d = a; else if (b>c) d = b; printf("max = %dn", d); system("PAUSE"); return 0; } Нужно так! … Лекция 16. 09. 13 г. 17

Множественный выбор Фрагмент алгоритма программы «Калькулятор» : c==‘+’ =0 c==‘-’ ≠ 0 r = Множественный выбор Фрагмент алгоритма программы «Калькулятор» : c==‘+’ =0 c==‘-’ ≠ 0 r = a-b r = a+b =0 c==‘*’ =0 c==‘/’ ≠ 0 r = a*b r = a/b =0 Ошибка! … if (c==‘+’) r = a + b; else if (c==‘-’) r = a - b; else if (c==‘*’) r = a * b; else if (c==‘/’) r = a / b; else printf(“error!n"); … Лекция 16. 09. 13 г. 18

Оператор множественного выбора switch Для алгоритмов с множественным выбором существует специальный оператор: =0 c==‘+’ Оператор множественного выбора switch Для алгоритмов с множественным выбором существует специальный оператор: =0 c==‘+’ c==‘-’ ≠ 0 r = a+b r = a-b =0 c==‘*’ =0 c==‘/’ ≠ 0 r = a*b r = a/b =0 Ошибка! … switch(c){ case '+': r = a + b; break; case '-': r = a - b; break; case '*': r = a * b; break; case '/': r = a / b; break; default: printf(“error!n"); } … Лекция 16. 09. 13 г. 19

Важное замечание! При отсутствии операторов break реализуется совсем другой алгоритм: … switch(c){ case '+': Важное замечание! При отсутствии операторов break реализуется совсем другой алгоритм: … switch(c){ case '+': r = a + b; case '-': r = a - b; case '*': r = a * b; case '/': r = a / b; default: printf(“error!n"); } … c==‘+’ ≠ 0 r = a+b =0 c==‘-’ ≠ 0 r = a-b =0 c==‘*’ =0 c==‘/’ ≠ 0 r = a*b r = a/b =0 Лекция 16. 09. 13 г. Ошибка! 20

Оператор множественного выбора switch Общий вид оператора switch: switch (выражение) { case констант-выраж 1: Оператор множественного выбора switch Общий вид оператора switch: switch (выражение) { case констант-выраж 1: операторы case констант-выраж 2: операторы … default: операторы } Действие оператора: вычисляется значение выражения, которое затем последовательно сравнивается со значениями константных выражений в блоках case. Если произошло совпадение значений, выполняются операторы соответствующего блока case. Как правило, последним оператором в каждом блоке case является оператор break ( «прервать» ) и поэтому по завершению выбранного case-блока вычислительный процесс выходит за пределы оператора switch. Если совпадения значений не произошло ни для одного из case-блоков, то выполняются операторы блока default (если он есть) или вычислительный процесс сразу выходит за пределы оператора switch. Лекция 16. 09. 13 г. 21

Иллюстрация оператора switch //Ex 017. c - статистика #include <stdio. h> #include <stdlib. h> Иллюстрация оператора switch //Ex 017. c - статистика #include #include int main() { int c, i, nwhite, nother, ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; i++) ndigit[i] = 0; while ((c = getchar()) != '$') { switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ndigit[c-'0']++; break; case ' ': case 'n': case 't': nwhite++; break; default: nother++; break; } } printf("digits ="); for (i = 0; i < 10; i++) printf(" %d", ndigit[i]); printf(", white space = %d, other = %dn", nwhite, nother); system("PAUSE"); return 0; } Лекция 16. 09. 13 г. 22