Процедурное программирование на С++ Операторы С++ Операции

Скачать презентацию Процедурное программирование на С++ Операторы С++  Операции Скачать презентацию Процедурное программирование на С++ Операторы С++ Операции

04. Процедурное программирование. Операторы.ppt

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

>Процедурное программирование на С++ Операторы С++ Процедурное программирование на С++ Операторы С++

>Операции и операторы  • Операторы, которые  организуют поток  вычислений, – это Операции и операторы • Операторы, которые организуют поток вычислений, – это «скелет» программы • Выражения, составленные из операндов и операций, – это все остальное 2

>Операторы С++  • ветвление (условный переход)  – if  – switch • Операторы С++ • ветвление (условный переход) – if – switch • безусловный переход – goto – return – break – continue – throw • циклы – for – while – do while • исключения – try catch 3

>Оператор последовательного выполнения выражение_1 ; выражение_2 ; . . . выражение_N ; ; int Оператор последовательного выполнения выражение_1 ; выражение_2 ; . . . выражение_N ; ; int a = 10; a++; a %= 3; Printf(“a == %d“, a); 4

>   Группировка операторов • Блок операторов – операторы в операторных скобках Группировка операторов • Блок операторов – операторы в операторных скобках – блок может рассматриваться как один оператор { операторы } { int i = 42; double d = 3. 14; d += i; } { f 1(); f 2(); printf(“Dixi”); } • curly brackets languages – C/C++/C#, Java – Perl, PHP – … 5

>Условный оператор  • соответствует предложению «если истинно некоторое  условие, выполнить одни операторы, Условный оператор • соответствует предложению «если истинно некоторое условие, выполнить одни операторы, если условие ложно – выполнить другие» if (условие) оператор1 { else оператор1 оператор2 } else { оператор3 оператор4 } здесь оператор – это выражение; 6

>Группировка операторов в C и Pascal С:    Pascal:   Группировка операторов в C и Pascal С: Pascal: 7

>Группировка операторов в С и Python C:    Python:   Группировка операторов в С и Python C: Python: 8

>Частая ошибка в программах на С/С++ int a; //. . . Scanf(%d, &a); if Частая ошибка в программах на С/С++ int a; //. . . Scanf(%d, &a); if ( a = 777 ) printf(“This is magic number!”); else printf(“Try again. . . : -(”); 9

>Вложенные операторы if if (условие 1)  if (условие 2) if (условие 3) Вложенные операторы if if (условие 1) if (условие 2) if (условие 3) оператор if (условие 1 && условие 2 && условие 3) оператор if (a >= 10 && a <=25) {. . . } 10

>Вложенные операторы if  •  начальная формулировка задачи – найти квадратный корень числа, Вложенные операторы if • начальная формулировка задачи – найти квадратный корень числа, если оно неотрицательное double a; Scanf(“%lf”, &a); . . . if (a >= 0) printf(“%lf”, sqrt(a)); else printf( “negative”); • изменение условий задачи – найти квадратный корень числа, если оно неотрицательное и его целая часть - нечетная if (a >= 0) if ((int)a % 2 != 0) printf(“%lf”, sqrt(a)); else printf( “negative”); 11

>Проверка на равенство нулю в операторе if if (a == 0)  printf( “Zero!n”); Проверка на равенство нулю в операторе if if (a == 0) printf( “Zero!n”); if (!a) printf( “Zero!n”); if (a != 0) printf( “Not Zero!n”); if (a) printf( “Not Zero!n”); 12

>Циклы  • цикл – повторение оператора или группы  операторов заданное количество раз Циклы • цикл – повторение оператора или группы операторов заданное количество раз (итераций) – тело цикла – условие повторения • счетчик цикла • с предусловием (while) • с постусловием (do while) • с параметром (for) 13

>Циклы с предусловием и постусловием • с предусловием while (условие)  тело_цикла;  • Циклы с предусловием и постусловием • с предусловием while (условие) тело_цикла; • с постусловием do тело_цикла while (условие); 14

>Цикл с предусловием // вывод на экран заданного // пользователем количества звздочек int count; Цикл с предусловием // вывод на экран заданного // пользователем количества звздочек int count; Scanf(“%d”, &count); while (count > 0) { printf( “*” ); count = count – 1; } 15

>Цикл с предусловием // вывод на экран заданного // пользователем количества  звздочек int Цикл с предусловием // вывод на экран заданного // пользователем количества звздочек int count; Scanf(“%d”, &count); while (count-- > 0) printf( “*” ); 16

>Цикл с постусловием // повторение пользовательского ввода char answer;  do { scanf( “How Цикл с постусловием // повторение пользовательского ввода char answer; do { scanf( “How many stars do you need? n” ); int count; scanf(“%d”, &count); while(count-- > 0) printf( “*” ); printf( “n. Repeat? (y or n)n” ); scand(“%c”, &answer); } while (answer == ‘y’ || answer == ‘Y’); 17

>Цикл с параметром for (выражение_1; выражение_2;  выражение_3)  тело цикла  for (инициализация_параметра; Цикл с параметром for (выражение_1; выражение_2; выражение_3) тело цикла for (инициализация_параметра; проверка_параметра; изменение_параметра) тело цикла 18

>Цикл с параметром // вывести таблицу соответствия десятичных // чисел шестнадцатеричным от 0 до Цикл с параметром // вывести таблицу соответствия десятичных // чисел шестнадцатеричным от 0 до 15 for (int i = 0; i < 15; ++i) printf(“%d = %); 19

>Последовательные циклы  • переменные цикла с одним и тем же именем for (int Последовательные циклы • переменные цикла с одним и тем же именем for (int i = 0; i < N; ++i) { . . . } for (int i = 0; i < M; ++i) { . . . } 20

>unsigned переменные в циклах int main() {  for (unsigned int i = 10; unsigned переменные в циклах int main() { for (unsigned int i = 10; i >= 0; i--) cout << "*"; return 0; } 21

>Найдите ошибки int i = 10; while(i >= 0) {  cout << “i Найдите ошибки int i = 10; while(i >= 0) { cout << “i = “ << ++i; } for(unsigned i; i < 3; ++i; ) for(unsigned i; i < 2; ++i) cout << i << “ “; do { int n = 5; cout << n << “ “; while(--n >= 0) 22

>Цикл с параметром  • любое из выражений в заголовке цикла for может быть Цикл с параметром • любое из выражений в заголовке цикла for может быть пропущено for (int i = 0, j = 100; i < 1000 && j > 0; ) i += (j –= rand()%4); int i = 0; for ( ; i < 1000; ) { cout << i++ << endl; } 23

>Бесконечные циклы  • иногда количество повторений цикла  заранее неизвестно или может Бесконечные циклы • иногда количество повторений цикла заранее неизвестно или может меняться по ходу выполнения цикла while (true) { // тело цикла . . . } 24

>Еще несколько бесконечных циклов while(1)  while (true); {  // тело цикла }; Еще несколько бесконечных циклов while(1) while (true); { // тело цикла }; while(1); do { do ; while(1); // тело цикла } while(1); for(; ; ); for(; ; ) { // тело цикла } 25

>Операторы передачи управления  • прерывание цикла  – break • продолжение цикла Операторы передачи управления • прерывание цикла – break • продолжение цикла – continue • безусловный переход – goto • возврат из функции – return 26

>Прерывание цикла  • оператор break прерывает выполнение инструкций  текущего цикла и передает Прерывание цикла • оператор break прерывает выполнение инструкций текущего цикла и передает управление на оператор, следующий за циклом while (1) { //. . . printf( “Repeat? (y or n)n”); char answer; scanf(“%c”, &answer); if (answer == ‘y’ || answer == ‘Y’) break; //. . . } 27

>Прерывание цикла bool exit = false;  while (!exit) {  bool result = Прерывание цикла bool exit = false; while (!exit) { bool result = false; result = long_operation_1(); if (exit || !result) break; result = long_operation_2(); if (exit || !result) break; . . . result = long_operation_N(); if (!result) break; } 28

>Продолжение цикла  • оператор continue передает управление на  первую инструкцию цикла (в Продолжение цикла • оператор continue передает управление на первую инструкцию цикла (в случае for – на инструкцию изменения счетчика цикла) int N; scanf(“%d”, &N); for (int i = 0; i < N; ++i) { if(i % 3) continue; printf(“%d ”, &i); } 29

>Оператор безусловного перехода • примерно соответствует предложению  «немедленно пойти в. . . » Оператор безусловного перехода • примерно соответствует предложению «немедленно пойти в. . . » goto метка; Эдсгер Дейкстра рекомендовал hell: . . . // какой-то оператор пользоваться пореже оператором goto . . . goto hell; 30

>Циклы с помощью goto int count; cin >> count;   Scanf(“%d”, &count); Циклы с помощью goto int count; cin >> count; Scanf(“%d”, &count); while(count-- > 0) loop_beg: cout << “*”; if (count-- <= 0) goto loop_end; Printf( “*” ); goto loop_beg; loop_end: cout << endl; 31

>Выход из нескольких вложенных циклов с помощью goto • пример – поиск нужного элемента Выход из нескольких вложенных циклов с помощью goto • пример – поиск нужного элемента в многомерном массиве for(int i = 0; i < N; ++i) for(int j = 0; j < M; ++j) for(int k = 0; k < P; ++k) for(int l = 0; l < S; ++l) { . . . if(found) goto after_cycles; } after_cycles: . . . 32

>Начальные сведения о функциях  • Важный элемент структурного  программирования – декомпозиция Начальные сведения о функциях • Важный элемент структурного программирования – декомпозиция программы • тип имя_фунции (тип 1 параметр1, . . . ) { // тело функции return возвращаемое_значение; } 33

>Начальные сведения о функциях int func 1(int a, int b) {  return a*a Начальные сведения о функциях int func 1(int a, int b) { return a*a + b*b; } double func 2() { double s = func 1(10, 5) * 3. 14; return s; } void func 3(int n) { for(int i = 0; i < n; ++i) printf( “*” ); } 34

>  Начальные сведения о  функциях double power(double x, int n) { Начальные сведения о функциях double power(double x, int n) { double result = x; if (n == 0) return 1; while(--n > 0) result *= x; return result; } int main() { double x; int n; printf(“%lf %d”, &x, &n); printf(“%fl”, power(x, n)); // возвращаемое значение используется power(x-1, n+1); // не используется return 0; } 35

>Задача  • Ввести с клавиатуры знак  препинания и вывести на экран его Задача • Ввести с клавиатуры знак препинания и вывести на экран его название 36

>Задача о выводе названия знака препинания char s; Scanf(“%c”, &s);  if (s == Задача о выводе названия знака препинания char s; Scanf(“%c”, &s); if (s == ‘. ’) printf( “Dot” ); else if (s == ‘, ’) printf( “Comma” ); else if (s == ‘’’) printf( “Single quote” ); else printf(“Not a punctuation symbol!”); 37

>Оператор выбора  •  примерно соответствует предложению «либо выражение равно А, и нужно Оператор выбора • примерно соответствует предложению «либо выражение равно А, и нужно сделать Б, либо выражение равно В, и нужно сделать Г, и т. д. , либо, если выражение ни с чем предыдущим не совпало, сделать что-то еще» switch (выражение) • выражение должно быть целого { типа! case константое_выражение_1: группа_операторов_1; break; • константные_выражения вычисляются case константное выражение_2: на этапе компиляции группа_операторов_2; break; . . . case константное_выражение_N: группа_операторов_N; break; default: группа_операторов_по_умолчанию; 38 }

>Оператор выбора char s; Scanf(“%c”, &s);  switch(s) {  case ‘. ’: Оператор выбора char s; Scanf(“%c”, &s); switch(s) { case ‘. ’: printf( “Dot” ); break; case ‘, ’: printf( “Comma” ); break; case ‘’’: printf( “Single quote” ); break; //. . . default: cout << “Not a punctuation symbol!”; } 39

>  Оператор выбора       char s; scanf(“%c”, &s); Оператор выбора char s; scanf(“%c”, &s); switch (s) if (s == ‘. ’ || { s == ‘, ’ || case ‘. ’: s == ‘: ’ || case ‘, ’: s == ‘; ’) case ‘: ’: printf (“Punctuation case ‘; ’: mark”); printf (“Punctuation mark”); else if (s == ‘ 1’ || break; s == ‘ 2’ || case ‘ 1’: case‘ 2’: case ‘ 3’: s == ‘ 3’ || case ‘ 4’: s == ‘ 4’) printf( “Digit”); printf (“Digit”); break; else if (s == ‘a’ || case ‘a’: s == ‘b’ || case ‘b’: s == ‘c’ || case ‘c’: s == ‘z’) case ‘z’: printf(“Letter”); printf( “Letter”); else break; printf( “Unknown symbol”); default: printf( “Unknown symbol”); 40 }

>Метка default в операторе выбора •  метка default может быть  • Метка default в операторе выбора • метка default может быть • метка default в расположена в любом операторе выбора месте оператора выбора может отсутствовать switch(n) switch(n) { { default: case 0: //. . . break; case 0: case 1: //. . . break; case 1: case 2: //. . . break; } } 41

>Еще одна интересная особенность оператора выбора char s; scanf(“%c”, &s);  switch(s) { Еще одна интересная особенность оператора выбора char s; scanf(“%c”, &s); switch(s) { case ‘. ’: printf( “Dot” ); break; case ‘, ’: printf (“Comma”); case ‘’’: printf(“Single quote”); break; //. . . default: printf( “Not a punctuation symbol!”); } 42

>Использование condition fall- through в операторе выбора switch(n) {  case 0:  // Использование condition fall- through в операторе выбора switch(n) { case 0: // операторы, которые нужно выполнить, // только в случае, если n == 0 case 1: // операторы, которые нужно выполнить, // в случае, если n == 0 || n == 1 default: // операторы, которые нужно выполнить // в любом случае } 43

>   Реальный пример condition   fall-through в операторе   выбора Реальный пример condition fall-through в операторе выбора – Duff’s device register short *to, *from; register short *to, *from; register int count; register int count; do { register int n = *to++ = *from++; (count + 7) / 8; } while(--count > 0); switch (count % 8) { case 0: do { *to++ = *from++; case 7: *to++ = *from++; case 6: *to++ = *from++; case 5: *to++ = *from++; case 4: *to++ = *from++; case 3: *to++ = *from++; case 2: *to++ = *from++; case 1: *to++ = *from++; • http: //en. wikipedia. org/wiki/Duffs_dev } while (--n > 0); ice } 44

>   Определение переменных в    операторе switch   Определение переменных в операторе switch • если в операторе switch инициализируются переменные, соответствующие операторы в предложении case должны образовывать блок switch (a) { { case 0: int b = 1; { int b; cout << a + b; int b = 1; break; cout << a + b; } break; case 1: break; cout << a – b; case 1: break; case 1: cout << a – b; break; default: break; cout << a * b; default: } default: cout << a * b; } 45

>Графическое представление алгоритмов  • ГОСТ 19. 701 -90 (ISO 5807 -85)  – Графическое представление алгоритмов • ГОСТ 19. 701 -90 (ISO 5807 -85) – http: //cert. obninsk. ru/gost/282. html • UML – диаграммы деятельности – диаграммы потоков данных –. . . 46

>Блок-схемы алгоритмов  • Начало/конец     Начало   Конец • Блок-схемы алгоритмов • Начало/конец Начало Конец • Процесс – вычисление n += 2; • Решение – условный оператор да нет n > 10 47

>  Блок-схемы алгоритмов  • Данные    i, j  – Блок-схемы алгоритмов • Данные i, j – ввод/вывод • с/на консоль • в/из файла • Предопределенный процесс – функция, процедура open(“C: \BOOT. INI”) • Соединитель a 48

>Пример блок-схемы  • Составить блок-схему программы,  выводящей на экран единичную  матрицу Пример блок-схемы • Составить блок-схему программы, выводящей на экран единичную матрицу размера Мx. N (M и N задаются пользователем) 49

>Оформление кода  •  International Obfuscated C Code Contest – http: //www. ioccc. Оформление кода • International Obfuscated C Code Contest – http: //www. ioccc. org/ Задачи соревнований: • To write the most Obscure/Obfuscated C program under the rules below • To show the importance of programming style, in an ironic way • To stress C compilers with unusual code • To illustrate some of the subtleties of the C language – http: //www. de. ioccc. org/2004/omoikane. c – http: //www. de. ioccc. org/2004/vik 1. c – http: //www. de. ioccc. org/2001/rosten. c 50

>  Оформление кода  • Obfuscated  Perl Contest,  1996 - 2000 Оформление кода • Obfuscated Perl Contest, 1996 - 2000 – http: //en. wikipedia. or g/wiki/Obfuscated_P erl_Contest 51

>   Оформление кода •  пробелы в выражениях •  отступы от Оформление кода • пробелы в выражениях • отступы от левого края для указания уровня вложенности • разумный размер табуляции (2 или 4 пробела) • замена табуляции пробелами int arr 4 D[N][M][L][T]; int main() { { int e = 0; int e=0; cin >> e; for(int i = 0; i < N; ++i) for(int i=0; i

>   Оформление кода   • Расстановка операторных скобок #define N 5 Оформление кода • Расстановка операторных скобок #define N 5 #define N 5 int main(int argc, char *argv[]) { { if(argc >= N) if(argc >= N) { { for(int i = 0; i < argc; ++i) { for(int i = 0; i < argc; ++i) printf “arg no. %d is %sn”, { i, argv[i]; printf “arg no. %d is %sn”, } i, argv[i]; } } else { } printf “Gimme %d more arrrgs!!n”, else N – argc; { } printf “Gimme %d more arrrgs!!n”, } N – argc; } } 53

>Онлайн-компиляторы  • Если у вас есть доступ в Интернет и ваша программа Онлайн-компиляторы • Если у вас есть доступ в Интернет и ваша программа достаточно проста (использует только стандартную библиотеку, не разбита на несколько файлов), то можно обойтись без установки компилятора для проверки её работы – http: //codepad. org/ – http: //onlinecompiler. net/ – http: //www. comeaucomputing. com/tryitout/ 54

>Ссылки  – Э. Дейкстра «Дисциплина  программирования»      55 Ссылки – Э. Дейкстра «Дисциплина программирования» 55

>Резюме  • Операторы задают порядок  вычисления выражений в программе • Минимально необходимый Резюме • Операторы задают порядок вычисления выражений в программе • Минимально необходимый набор операторов – ветвление и безусловный переход • Оператором goto лучше не злоупотреблять (желательно использовать только для выхода из глубоко вложенных циклов) 56