Программирование на языке Си © К.Ю. Поляков, 2007 1. Введение Введение 2. Переменные Переменные 3. Ввод и вывод Ввод и вывод 4. Ветвления Ветвления 5.

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



Advertisements
Похожие презентации
Программирование на языке Си © К.Ю. Поляков, ВведениеВведение 2.ПеременныеПеременные 3.Ввод и вывод 4.Ветвления 5.Сложные условия 6.Циклы 7.Циклы.
Advertisements

1 Программирование на языке Паскаль Тема 1. Введение.
1 Программирование на языке Паскаль Тема 1. Введение.
1 Программирование на языке Паскаль Тема 1. Введение Кулебякин В.В.
К. Поляков, Программирование на алгоритмическом языке Тема 1. Введение.
1 Программирование на языке Паскаль Тема 1. Введение.
1 Программирование на языке Паскаль Циклы. 2 Цикл – это многократное выполнение одинаковой последовательности действий. цикл с известным числом шагов.
Тема 1. Введение 1.
1 Программирование на языке Паскаль Ветвления. 2 Разветвляющиеся алгоритмы Задача. Ввести два целых числа и вывести на экран наибольшее из них. Идея решения:
Программирование на языке Паскаль Тема 1. Введение.
Лекция 8. Структура языка С/С++. Циклы с предусловием и постусловием. Реализация циклов с помощью операторов ветвления и передачи управления. Операторы.
1 Программирование на языке Паскаль © К.Ю. Поляков, ВведениеВведение 2.ВетвленияВетвления 3.Сложные условияСложные условия 4.ЦиклыЦиклы 5.Циклы.
Приложение 1 к решению Совета депутатов города Новосибирска от _____________ ______ Масштаб 1 : 5000.
Приложение 1 к решению Совета депутатов города Новосибирска от Масштаб 1 : 5000.
Лекция 7. Структура языка С/С++. Операторы ветвления: условный оператор if. Полное ветвление. Неполное ветвление. Оператор множественного выбора switch.
1 Программирование на языке Паскаль Тема 1. Введение © К.Ю. Поляков,
1 Программирование на языке Паскаль Тема 1. Введение.
1 Прикладное программирование Kafmi21. ru – учеба – заочнику – прикладное программирование.
К. Поляков, Программирование на алгоритмическом языке Тема 1. Введение.
1 Программирование на языке Паскаль Процедуры. 2 Подпрограммы Задача: Построить фигуру: Особенность: Три похожие фигуры. общее: размеры, угол поворота.
Транксрипт:

Программирование на языке Си © К.Ю. Поляков, Введение Введение 2. Переменные Переменные 3. Ввод и вывод Ввод и вывод 4. Ветвления Ветвления 5. Сложные условия Сложные условия 6. Циклы Циклы 7. Циклы с условием Циклы с условием 8. Оператор выбора Оператор выбора 9. Отладка программ Отладка программ 10. Графика Графика 11. Графики функций Графики функций 12. Процедуры Процедуры 13. Анимация Анимация 14. Случайные числа Случайные числа 15.Функции Функции

Программирование на языке Си Тема 1. Введение © К.Ю. Поляков, 2007

3 Алгоритм Свойства алгоритма дискретность: состоит из отдельных шагов (команд) понятность: должен включать только команды, известные исполнителю (входящие в СКИ) определенность: при одинаковых исходных данных всегда выдает один и тот же результат конечность: заканчивается за конечное число шагов массовость: может применяться многократно при различных исходных данных корректность: дает верное решение при любых допустимых исходных данных Алгоритм – это четко определенный план действий для исполнителя.

4 Программа Программа – это алгоритм, записанный на каком-либо языке программирования набор команд для компьютера Команда – это описание действий, которые должен выполнить компьютер. откуда взять исходные данные? что нужно с ними сделать? куда поместить результат?

5 Языки программирования Машинно-ориентированные (низкого уровня) - каждая команда соответствует одной команде процессора (ассемблер) Языки высокого уровня – приближены к естественному (английскому) языку, легче воспринимаются человеком, не зависят от конкретного компьютера для обучения: Бейсик, ЛОГО, Паскаль профессиональные: Си, Фортран, Паскаль для задач искусственного интеллекта: Пролог, ЛИСП для Интернета: JavaScript, Java, Perl, PHP, ASP

6 Язык Си – Б. Керниган, Д. Ритчи высокая скорость работы программ много возможностей стал основой многих современных языков (С++, С#, Javascript, Java, ActionScript, PHP) много шансов сделать ошибку, которая не обнаруживается автоматически

7 Простейшая программа void main() { } void main() { } главная (основная) программа всегда имеет имя main void = «пустой» основная программа не выдает никакого результата-числа void = «пустой» основная программа не выдает никакого результата-числа начало программы «тело» программы (основная часть) конец программы Что делает эта программа? ?

8 Что происходит дальше? void main() { } void main() { } first.cpp исходный файл first.obj транслятор ЪБzЦ2?|ё3БКа n/36ШпIC+И- ЦЗ_5Мy РЧб ЪБzЦ2?|ё3БКа n/36ШпIC+И- ЦЗ_5Мy РЧб объектный файл стандартные функции редактор связей (компоновка) MZPо:ЄPэ_еЗ"!_ `кn,ЦbЄ-Щр 1 G_БАC, _Ощях¤9 жФ MZPо:ЄPэ_еЗ"!_ `кn,ЦbЄ-Щр 1 G_БАC, _Ощях¤9 жФ first.exe исполняемый файл по исходному файлу можно восстановить остальные исполняемый файл можно запустить ! текст программы на Си или Си++

9 Вывод текста на экран #include void main() { printf("Привет!"); } #include void main() { printf("Привет!"); } include = включить файл stdio.h: описание стандартных функций ввода и вывода вызов стандартной функции printf = print format (форматный вывод) вызов стандартной функции printf = print format (форматный вывод) этот текст будет на экране

10 Как начать работу? здесь мы набираем программу здесь выводятся сообщения об ошибках верхнее меню кнопка закрытия окна координаты курсора (строка, столбец)

11 Оболочка Borland C Borland International (также Turbo Pascal, Delphi) IDE = Integrated Development Environment интегрированная среда разработки: текстовый редактор для создания и редактирования текстов программ транслятор для перевода текстов программ на Си и Си++ в команды процессора редактор связей для создания исполняемого файла (EXE-файла), подключаются стандартные функции отладчик для поиска ошибок в программах

12 Работа с файлами Сохранение файла: F2 ввести имя файла: не более 8 символов без пробелов только латинские буквы и цифры ввести имя файла: не более 8 символов без пробелов только латинские буквы и цифры Esc- отмена Enter- сохранить расширение.CPP добавляется автоматически !

13 Работа с файлами Загрузка файла: F3 выбор файла из списка если ввести имя несуществующего файла, он будет создан Esc- отмена Enter- открыть (или создать)

14 Запуск программы на выполнение Трансляция + компоновка: F9 Трансляция + компоновка + запуск: Ctrl-F9 число ошибок Errors (ошибки) Errors (ошибки) Press any key (нажмите любую клавишу) Warnigns (предупреждения) Warnigns (предупреждения) Success (успех) Success (успех)

15 Где ошибки? перемещение курсора эта ошибка обнаружена здесь! Ошибка может быть в конце предыдущей строки! ! Enter – перейти к редактированию

16 Наиболее популярные ошибки Unable to open include file 'xxx.h' не найден заголовочный файл 'xxx.h' (неверно указано его имя, он удален или т.п.) Function 'xxx' should have a prototype функция 'xxx' не объявлена (не подключен заголовочный файл или не объявлена своя функция, или неверное имя функции) Unterminated string or character constant не закрыты кавычки Statement missing ; нет точки с запятой в конце оператора в предыдущей строке Compound statement missing } не закрыта фигурная скобка Undefined symbol 'xxx' не объявлена переменная 'xxx'

17 Управление клавишами Справочная системаF1 Сохранить файлF2 Открыть файлF3 Закрыть окно с программойAlt-F3 Запуск программыCtrl-F9 Раскрыть на весь экранCtrl-Enter Показать рабочий экранAlt-F5 Выйти из оболочкиAlt-X

18 Работа с блоками текста Выделить блок мышью или Shift - Отменить выделение Ctrl-K + H Вырезать (в буфер обмена) Shift-Delete Копировать (в буфер обмена) Ctrl-Insert Вставить из буфера обмена Shift-Insert Удалить текущую строку Ctrl-Y Удалить выделенный блок Ctrl-Delete

19 Сервис #include void main() { clrscr(); /* очистка экрана */ printf("Привет!"); // вывод на экран getch(); /* ждать нажатия клавиши */ } #include void main() { clrscr(); /* очистка экрана */ printf("Привет!"); // вывод на экран getch(); /* ждать нажатия клавиши */ } файл conio.h: описание функций для работы с клавиатурой и монитором ждать нажатия на любую клавишу комментарий до конца строки комментарий между /* и */ очистка экрана clear screen очистка экрана clear screen очистка экрана перед началом работы задержка до нажатия на любую клавишу

20 Переход на новую строку #include void main() { clrscr(); printf("Привет,\n Вася!"); getch(); } #include void main() { clrscr(); printf("Привет,\n Вася!"); getch(); } Привет, Вася! на экране: последовательность \n код 10 переход на новую строку последовательность \n код 10 переход на новую строку

21 Задания "4": Вывести на экран текст "лесенкой" Вася пошел гулять "5": Вывести на экран рисунок из букв Ж ЖЖЖ ЖЖЖЖЖ ЖЖЖЖЖЖЖ HH HH ZZZZZ

Программирование на языке Си Тема 2. Переменные © К.Ю. Поляков, 2007

23 Что такое переменная? Переменная - это ячейка в памяти компьютера, которая имеет имя и хранит некоторое значение. Значение переменной может меняться во время выполнения программы. При записи в ячейку нового значения старое стирается. Типы переменных int – целое число в интервале [-32768…32767] (2 байта) float – вещественное число, floating point (4 байта) char – символ, character (1 байт)

24 Имена переменных Могут включать латинские буквы (A-Z, a-z) знак подчеркивания _ цифры 0-9 НЕ могут включать русские буквы пробелы скобки, знаки +, =, !, ? и др. Имя не может начинаться с цифры! ! Какие имена правильные? AXby R&B 4Wheel Вася PesBarbos TU154 [QuQu] _ABBA A+B

25 Объявление переменных Объявить переменную = определить ее имя, тип, начальное значение, и выделить ей место в памяти. void main() { int a; float b, c; int Tu104, Il86=23, Yak42; float x=4.56, y, z; char c, c2='A', m; } void main() { int a; float b, c; int Tu104, Il86=23, Yak42; float x=4.56, y, z; char c, c2='A', m; } Если начальное значение не задано, в этой ячейке находится "мусор"! ! целая переменная a вещественные переменные b и c целые переменные Tu104, Il86 и Yak42 Il86 = 23 целые переменные Tu104, Il86 и Yak42 Il86 = 23 вещественные переменные x, y и z x = 4,56 вещественные переменные x, y и z x = 4,56 · целая и дробная части отделяются точкой символьные переменные c, c2 и m c2 = 'A' символьные переменные c, c2 и m c2 = 'A'

26 Оператор присваивания Оператор – это команда языка программирования высокого уровня. Оператор присваивания служит для изменения значения переменной. Пример a = 5; x = a + 20; y = (a + x) * (x – a); a = 5; x = a + 20; y = (a + x) * (x – a); ? ? a ? ? x ? ? y *20

27 Оператор присваивания Общая структура: Арифметическое выражение может включать константы (постоянные) имена переменных знаки арифметических операций: + - * / % вызовы функций круглые скобки ( ) умножение деление остаток от деления имя переменной = выражение ; куда что Для чего служат круглые скобки? ?

28 void main() { int a, b; float x, y; a = 5; 10 = x; y = 7,8; b = 2.5; x = 2*(a + y); a = b + x; } void main() { int a, b; float x, y; a = 5; 10 = x; y = 7,8; b = 2.5; x = 2*(a + y); a = b + x; } Какие операторы неправильные? имя переменной должно быть слева от знака = целая и дробная часть отделяются точкой при записи вещественного значение в целую переменную дробная часть будет отброшена

29 Особенность деления в Си При делении целых чисел остаток отбрасывается! ! void main() { int a = 7; float x; x = a / 4; x = 4 / a; x = float(a) / 4; x = 1.*a / 4; } void main() { int a = 7; float x; x = a / 4; x = 4 / a; x = float(a) / 4; x = 1.*a / 4; }

30 Сокращенная запись операций в Си полная запись сокращенная запись инкремент декремент a = a + 1; a++; a = a + b;a += b; a = a - 1;a--; a = a – b;a -= b; a = a * b; a *= b; a = a / b;a /= b; a = a % b; a %= b;

31 Ручная прокрутка программы void main() { int a, b; a = 5; b = a + 2; a = (a + 2)*(b – 3); b = a / 5; a = a % b; a++; b = (a + 14) % 7; } void main() { int a, b; a = 5; b = a + 2; a = (a + 2)*(b – 3); b = a / 5; a = a % b; a++; b = (a + 14) % 7; } ab ? ?

32 Порядок выполнения операций вычисление выражений в скобках умножение, деление, % слева направо сложение и вычитание слева направо z = (5*a*c+3*(c-d))/a*(b-c)/ b; x =(a*a+5*c*c-d*(a+b))/((c+d)*(d-2*a));

Программирование на языке Си Тема 3. Ввод и вывод © К.Ю. Поляков, 2007

34 Сложение двух чисел Задача. Ввести два целых числа и вывести на экран их сумму. Простейшее решение: #include void main() { int a, b, c; printf("Введите два целых числа\n"); scanf ("%d%d", &a, &b); c = a + b; printf("%d", c); getch(); } #include void main() { int a, b, c; printf("Введите два целых числа\n"); scanf ("%d%d", &a, &b); c = a + b; printf("%d", c); getch(); } подсказка для ввода ввод двух чисел с клавиатуры вывод результата

35 Ввод чисел с клавиатуры scanf ("%d%d", &a, &b); формат ввода scanf – форматный ввод адреса ячеек, куда записать введенные числа Формат – символьная строка, которая показывает, какие числа вводятся (выводятся). %d – целое число %f – вещественное число %c – 1 символ %s – символьная строка a – значение переменной a &a – адрес переменной a ждать ввода с клавиатуры двух целых чисел (через пробел или Enter), первое из них записать в переменную a, второе – в b

36 Что неправильно? int a, b; scanf ("%d", a); scanf ("%d", &a, &b); scanf ("%d%d", &a); scanf ("%d %d", &a, &b); scanf ("%f%f", &a, &b); int a, b; scanf ("%d", a); scanf ("%d", &a, &b); scanf ("%d%d", &a); scanf ("%d %d", &a, &b); scanf ("%f%f", &a, &b); &a %d%d &a, &b убрать пробел %d%d

37 Вывод чисел на экран printf ("%d", c); здесь вывести целое число это число взять из ячейки c printf ("Результат: %d", c); printf ("%d+%d=%d", a, b, c ); формат вывода список значений a, b, c printf ("%d+%d=%d", a, b, a+b ); арифметическое выражение

38 Вывод целых чисел int x = 1234; printf ("%d", x); int x = 1234; printf ("%d", x); 1234 printf ("%9d", x); минимальное число позиций 1234 всего 9 позиций или " %i" или " %9i"

39 Вывод вещественных чисел float x = ; printf ("%f", x); float x = ; printf ("%f", x); printf ("%9.3f", x); минимальное число позиций, 6 цифр в дробной части всего 9 позиций, 3 цифры в дробной части printf ("%e", x); e+02 стандартный вид: 1,23456·10 2 printf ("%10.2e", x); 1.23e+02 всего 10 позиций, 2 цифры в дробной части мантиссы

40 Полное решение #include void main() { int a, b, c; clrscr(); printf("Введите два целых числа\n"); scanf("%d%d", &a, &b); c = a + b; printf("%d+%d=%d", a, b, c); getch(); } #include void main() { int a, b, c; clrscr(); printf("Введите два целых числа\n"); scanf("%d%d", &a, &b); c = a + b; printf("%d+%d=%d", a, b, c); getch(); } Протокол: Введите два целых числа =55 это выводит компьютер это вводит пользователь

41 Блок-схема линейного алгоритма начало конец c = a + b; ввод a, b вывод c блок "начало" блок "ввод" блок "процесс" блок "вывод" блок "конец"

42 Задания "4": Ввести три числа, найти их сумму и произведение. Пример: Введите три числа: =16 4*5*7=140 "5": Ввести три числа, найти их сумму, произведение и среднее арифметическое. Пример: Введите три числа: =16 4*5*7=140 (4+5+7)/3=5.33

Программирование на языке Си Тема 4. Ветвления © К.Ю. Поляков, 2007

44 Разветвляющиеся алгоритмы Задача. Ввести два целых числа и вывести на экран наибольшее из них. Идея решения: надо вывести на экран первое число, если оно больше второго, или второе, если оно больше первого. Особенность: действия исполнителя зависят от некоторых условий (если … иначе …). Алгоритмы, в которых последовательность шагов зависит от выполнения некоторых условий, называются разветвляющимися.

45 Вариант 1. Блок-схема начало max = a; ввод a,b вывод max a > b? max = b; конец да нет полная форма ветвления блок "решение" Если a = b? ?

46 Вариант 1. Программа void main() { int a, b, max; printf("Введите два целых числа\n"); scanf("%d%d", &a, &b ); if (a > b) { } else { } printf("Наибольшее число %d", max); } max = a ; max = b ; полная форма условного оператора

47 Условный оператор if ( условие ) { // что делать, если условие верно } else { // что делать, если условие неверно } if ( условие ) { // что делать, если условие верно } else { // что делать, если условие неверно } Особенности: вторая часть ( else …) может отсутствовать (неполная форма) если в блоке один оператор, можно убрать { }

48 Что неправильно? if a > b { a = b; } else b = a; if a > b { a = b; } else b = a; if ( a > b ) { a = b; else b = a; if ( a > b ) { a = b; else b = a; if ( a > b ) else b = a; if ( a > b ) else b = a; if ( a > b ) a = b; c = 2*a; else b = a; if ( a > b ) a = b; c = 2*a; else b = a; } () } { a = b;

49 Вариант 2. Блок-схема неполная форма ветвления начало max = a; ввод a,b вывод max max = b; конец да нет b > a?

50 Вариант 2. Программа void main() { int a, b, max; printf("Введите два целых числа\n"); scanf("%d%d", &a, &b ); max = a; if (b > a) printf("Наибольшее число %d", max); } max = b ; неполная форма условного оператора

51 void main() { int a, b, max; printf("Введите два целых числа\n"); scanf("%d%d", &a, &b ); max = b; if ( ??? ) ??? printf("Наибольшее число %d", max); } void main() { int a, b, max; printf("Введите два целых числа\n"); scanf("%d%d", &a, &b ); max = b; if ( ??? ) ??? printf("Наибольшее число %d", max); } Вариант 2Б. Программа max = a; a > b

52 Задания "4": Ввести три числа и найти наибольшее из них. Пример: Введите три числа: Наибольшее число 15 "5": Ввести пять чисел и найти наибольшее из них. Пример: Введите пять чисел: Наибольшее число 56

Программирование на языке Си Тема 5. Сложные условия © К.Ю. Поляков, 2007

54 Сложные условия Задача. Фирма набирает сотрудников от 25 до 40 лет включительно. Ввести возраст человека и определить, подходит ли он фирме (вывести ответ "подходит" или "не подходит"). Особенность: надо проверить, выполняются ли два условия одновременно. Можно ли решить известными методами? ?

55 Вариант 1. Алгоритм начало ввод x 'подходит' конец да нет x >= 25? да нет x < = 40? 'не подходит'

56 Вариант 1. Программа void main() { int x; printf("Введите возраст\n"); scanf("%d", &x); if (x >= 25) if (x

57 Вариант 2. Алгоритм начало ввод x 'подходит' да нет x >= 25 и x

58 Вариант 2. Программа void main() { int x; printf("Введите возраст\n"); scanf("%d", &x); if ( x >= 25 && x

59 Сложные условия Сложное условие – это условие, состоящее из нескольких простых условий (отношений), связанных с помощью логических операций: ! – НЕ (not, отрицание, инверсия) && – И (and, логическое умножение, конъюнкция, одновременное выполнение условий) || – ИЛИ (or, логическое сложение, дизъюнкция, выполнение хотя бы одного из условий) Простые условия (отношения) >= == != равно не равно

60 Сложные условия Порядок выполнения сложных условий: выражения в скобках ! (НЕ, отрицание), >= ==, != && (И) || (ИЛИ) Пример: if ( !(a > b) || c != d && b == a) {... }

61 Истинно или ложно при a = 2; b = 3; c = 4; !(a > b) a < b && b < c !(a >= b) || c == d a < c || b < c && b < a a > b || !(b < c) Для каких значений x истинны условия: x < 6 && x < 10 x 10 x > 6 && x < 10 x > 6 && x > 10 x < 6 || x < 10 x 10 x > 6 || x < 10 x > 6 || x > 10 Сложные условия (-, 6) (6, 10) (10, ) (-, 10) (-, 6) (10, ) (-, ) (6, ) x < 6x < 6 x > 10 x < 10 x > 6x >

62 Задания "4": Ввести номер месяца и вывести название времени года. Пример: Введите номер месяца: 4 весна "5": Ввести возраст человека (от 1 до 150 лет) и вывести его вместе с последующим словом "год", "года" или "лет". Пример: Введите возраст: Вам 24 года Вам 57 лет

Программирование на языке Си Тема 6. Циклы © К.Ю. Поляков, 2007

64 Циклы Цикл – это многократное выполнение одинаковой последовательности действий. цикл с известным числом шагов цикл с неизвестным числом шагов (цикл с условием) Задача. Вывести на экран квадраты и кубы целых чисел от 1 до 8 (от a до b ). Особенность: одинаковые действия выполняются 8 раз. Можно ли решить известными методами? ?

65 Алгоритм начало i, i2, i3 конец нет да i

66 Алгоритм (с блоком "цикл") начало i, i2, i3 конец i2 = i * i; i3 = i2 * i; i = 1,8 блок "цикл" тело цикла

67 Программа void main() { int i, i2, i3; for (i=1; i

68 Цикл с уменьшением переменной Задача. Вывести на экран квадраты и кубы целых чисел от 8 до 1 (в обратном порядке). Особенность: переменная цикла должна уменьшаться. Решение: for ( ) { i2 = i*i; i3 = i2*i; printf("%4d %4d %4d\n", i, i2, i3); } for ( ) { i2 = i*i; i3 = i2*i; printf("%4d %4d %4d\n", i, i2, i3); } i = 8; i >= 1; i --

69 Цикл с переменной for ( начальные значения ; условие продолжения цикла ; изменение на каждом шаге ) { // тело цикла } for ( начальные значения ; условие продолжения цикла ; изменение на каждом шаге ) { // тело цикла } Примеры: for (a = 2; a < b; a+=2) {... } for (a = 2, b = 4; a < b; a+=2) {... } for (a = 1; c < d; x++) {... } for (; c < d; x++) {... } for (; c < d; ) {... }

70 Цикл с переменной Особенности: условие проверяется в начале очередного шага цикла, если оно ложно цикл не выполняется; изменения (третья часть в заголовке) выполняются в конце очередного шага цикла; если условие никогда не станет ложным, цикл может продолжаться бесконечно (зацикливание) если в теле цикла один оператор, скобки {} можно не ставить: for(i=1; i

71 for (i=8; i>=1; i--) printf("Привет"); printf("i=%d", i); for (i=8; i>=1; i--) printf("Привет"); printf("i=%d", i); Цикл с переменной Особенности: после выполнения цикла во многих системах устанавливается первое значение переменной цикла, при котором нарушено условие: for (i=1; i

72 Сколько раз выполняется цикл? a = 1; for(i=1; i= 1; i--)a += b; a = 7a = 7 a = 7a = 7 a = 1; for(i=1; i >= 3; i--)a = a+1; a = 1; for(i=1; i >= 3; i--)a = a+1; a = 1a = 1 a = 1a = 1 a = 1; for(i=1; i

73 Задания "4": Ввести a и b и вывести квадраты и кубы чисел от a до b. Пример: Введите границы интервала: "5": Вывести квадраты и кубы 10 чисел следующей последовательности: 1, 2, 4, 7, 11, 16, … Пример:

Программирование на языке Си Тема 7. Циклы с условием © К.Ю. Поляков, 2007

75 Цикл с неизвестным числом шагов Пример: Отпилить полено от бревна. Сколько раз надо сделать движения пилой? Задача: Ввести целое число (

76 Алгоритм начало count конец нет да n != 0? count = 0 ; count = count + 1; n = n / 10; обнулить счетчик цифр ввод n выполнять "пока n != 0 "

77 Программа void main() { long n; int count; printf("Введите целое число\n"); scanf("%ld", &n); count = 0; while (n != 0) { count ++; n = n / 10; } printf("В числе %ld нашли %d цифр", n, count); } n1 = n; n1, выполнять "пока n != 0 " Что плохо? ? long – длинное целое число (± ) %ld – формат ввода и вывода длинных чисел long – длинное целое число (± ) %ld – формат ввода и вывода длинных чисел, n1;

78 Цикл с условием while ( условие ) { // тело цикла } while ( условие ) { // тело цикла } Особенности: можно использовать сложные условия: если в теле цикла только один оператор, скобки {} можно не писать: while ( a < b && b < c ) {... } while ( a < b ) a ++;

79 Цикл с условием Особенности: условие пересчитывается каждый раз при входе в цикл если условие на входе в цикл ложно, цикл не выполняется ни разу если условие никогда не станет ложным, программа зацикливается a = 4; b = 6; while ( a > b ) a = a– b; a = 4; b = 6; while ( a > b ) a = a– b; a = 4; b = 6; while ( a < b ) d = a + b; a = 4; b = 6; while ( a < b ) d = a + b;

80 Сколько раз выполняется цикл? a = 4; b = 6; while ( a < b ) a ++; a = 4; b = 6; while ( a < b ) a ++; 2 раза a = 6 2 раза a = 6 a = 4; b = 6; while ( a < b ) a += b; a = 4; b = 6; while ( a < b ) a += b; 1 раз a = 10 1 раз a = 10 a = 4; b = 6; while ( a > b ) a ++; a = 4; b = 6; while ( a > b ) a ++; 0 раз a = 4 0 раз a = 4 a = 4; b = 6; while ( a < b ) b = a - b; a = 4; b = 6; while ( a < b ) b = a - b; 1 раз b = -2 1 раз b = -2 a = 4; b = 6; while ( a < b ) a --; a = 4; b = 6; while ( a < b ) a --; зацикливание

81 Замена for на while и наоборот for( i=1; i= b ) { // тело цикла i --; } всегда В языке Си замена цикла for на while и наоборот возможна всегда! !

82 Задания "4": Ввести целое число и найти сумму его цифр. Пример: Введите целое число: 1234 Сумма цифр числа 1234 равна 10. "5": Ввести целое число и определить, верно ли, что в его записи есть две одинаковые цифры. Пример: Введите целое число: Введите целое число: Нет. Да.

83 Последовательности Примеры: 1, 2, 3, 4, 5, … 1, 2, 4, 7, 11, 16, … 1, 2, 4, 8, 16, 32, … an = nan = n an = nan = n a 1 = 1, a n+1 = a n +1 a 1 = 1, a n+1 = a n + n a n = 2 n-1 a 1 = 1, a n+1 = 2 a n b 1 = 1, b n+1 = b n +1 c 1 = 2, c n+1 = 2 c n

84 Последовательности Задача: найти сумму всех элементов последовательности, которые по модулю больше 0,001: Элемент последовательности (начиная с 2): n b12345 c z b = b+1; c = 2*c; z = -z;

85 Алгоритм начало S конец нет да |a| > 0.001? S = S + a; S = 0 ; b = 1; c = 2 ; z = -1; a = 1; начальные значения a = z*b/c; b = b + 1; c = 2*c; z = -z; первый элемент a = 1; S = 0 ; новый элемент изменение Перестановка? ?

86 Программа #include void main() { int b, c, z; float S, a; S = 0; z = -1; b = 1; c = 2; a = 1; while (fabs(a) > 0.001) { S += a; a = z * b / c; z = - z; b ++; c *= 2; } printf ("S = %10.3f", S); } переход к следующему слагаемому начальные значения увеличение суммы расчет элемента последовательности математические функции fabs – модуль вещественного числа Что плохо? ?, b; чтобы не было округления при делении

87 Задания "4": Найти сумму элементов последовательности с точностью 0,001: Ответ: S = "5": Найти сумму элементов последовательности с точностью 0,001: Ответ: S = 1.220

88 Цикл с постусловием Задача: Ввести целое положительное число (

89 Цикл с постусловием: алгоритм начало конец нет да n

90 Программа void main() { long n; do { printf("Введите положительное число\n"); scanf("%ld", &n); } while ( n

91 Сколько раз выполняется цикл? a = 4; b = 6; do { a ++; } while (a = b ); 2 раза b = 6 2 раза b = 6 a = 4; b = 6; do a += 2; while ( a >= b ); a = 4; b = 6; do a += 2; while ( a >= b ); зацикливание

92 Задания (с защитой от неверного ввода) "4": Ввести натуральное число и определить, верно ли, что сумма его цифр равна 10. Пример: Введите число >= 0: Введите число >= 0: Нужно положительное число. Нет Введите число >= 0: 1234 Да "5": Ввести натуральное число и определить, какие цифры встречаются несколько раз. Пример: Введите число >= 0: Повторяются: 2, 3 Нет повторов.

Программирование на языке Си Тема 8. Оператор выбора © К.Ю. Поляков, 2007

94 Оператор выбора Задача: Ввести номер месяца и вывести количество дней в этом месяце. Решение: Число дней по месяцам: 28 дней – 2 (февраль) 30 дней – 4 (апрель), 6 (июнь), 9 (сентябрь), 11 (ноябрь) 31 день – 1 (январь), 3 (март), 5 (май), 7 (июль), 8 (август), 10 (октябрь), 12 (декабрь) Особенность: Выбор не из двух, а из нескольких вариантов в зависимости от номера месяца. Можно ли решить известными методами? ?

95 Алгоритм начало конец оператор выбора ни один вариант не подошел ввод M да нет M = 1? D = 31; нет M = 2? D = 28; да нет M = 12? D = 31; да вывод D ошибка

96 Программа void main() { int M, D; printf("Введите номер месяца:\n"); scanf("%d", &M); switch ( M ) { case 2: D := 28; case 4: case 6: case 9: case 11: D := 30; case 1: case 3: case 5: case 7: case 8: case 10: case 12: D := 31; default: D := -1; } if (D > 0) printf("В этом месяце %d дней.", D); else printf("Неверный номер месяца"); } ни один вариант не подошел break; выйти из switch выйти из switch

97 Оператор выбора Задача: Ввести букву и вывести название животного на эту букву. Особенность: выбор по символьной величине. void main() { char c; printf("Введите первую букву названия животного:\n"); c = getch(); switch ( c ) { case 'а': printf("Антилопа"); break; case 'б': printf("Барсук"); break; case 'в': printf("Волк"); break; default: printf("Не знаю я таких!"); } Что будет, если везде убрать break ? ?

98 Оператор выбора Особенности: после switch может быть имя переменной или арифметическое выражение целого типа ( int, long ) или символьного типа ( char ) нельзя ставить два одинаковых значения: switch ( i+3 ) { case 1: a = b; break; case 2: a = c; } switch ( i+3 ) { case 1: a = b; break; case 2: a = c; } switch ( x ) { case 1: a = b; break; case 1: a = c; } switch ( x ) { case 1: a = b; break; case 1: a = c; }

99 Задания (с защитой от неверного ввода) "4": Ввести номер месяца и вывести количество дней в нем, а также число ошибок при вводе. Пример: Введите номер месяца: Введите номер месяца: -2 2 Введите номер месяца: В этом месяце 28 дней. 11 Вы вводили неверно 0 раз. В этом месяце 30 дней. Вы вводили неверно 1 раз. "5": Ввести номер месяца и номер дня, вывести число дней, оставшихся до Нового года. Пример: Введите номер месяца: 12 Введите день: 25 До Нового года осталось 6 дней.

Программирование на языке Си Тема 9. Отладка программ © К.Ю. Поляков, 2007

101 Отладка программ Отладка – поиск и исправление ошибок в программе. Англ. debugging, bug = моль, жучок Методы: трассировка – вывод сигнальных сообщений отключение части кода (в комментарии) пошаговое выполнение – выполнить одну строчку программы и остановиться точки останова – выполнение программы останавливается при достижении отмеченных строк (переход в пошаговый режим) просмотр и изменение значений переменных в пошаговом режиме

102 Трассировка printf("Введено X=%d\n", X); printf("В цикле: i=%d, X=%d\n", i, X); printf("После цикла: X=%d\n", X); void main() { int i, X; printf("Введите целое число:\n"); scanf("%d", &X); for(i=1; i

103 Отключение части кода (комментарии) void main() { int i, X; printf("Введите целое число:\n"); scanf("%d", &X); X *= X + 2; for(i=1; i 5 ) {... }... } // X *= X + 2; /* while ( X > 5 ) {... } */ /* while ( X > 5 ) {... } */ комментарий до конца строки // закомментированный блок /* … */

104 Пошаговое выполнение F8 – выполнить 1 строчку и остановиться выделенная строка будет выполнена при следующем нажатии F8 F7 – войти в процедуру или функцию Ctrl-F9 – непрерывное выполнение Ctrl-F2 – остановить выполнение программы

105 Точки останова F4 – выполнить непрерывно до той строчки, где стоит курсор (1 раз) Ctrl-F8 – установить/снять точку останова Ctrl-F9 – выполнить до следующей точки останова это точка останова (снять – Ctrl-F8)

106 Просмотр значений переменных Ctrl-F4 – открыть окно просмотра переменных здесь ввести имя переменной или выражение показать результат (= Enter) можно ввести новое значение для переменной изменить переменную

Программирование на языке Си Тема 10. Графика © К.Ю. Поляков, 2007

108 Система координат (0,0) (x,y)(x,y) X Y x y (639,479) (639,0) (0,479)

109 Принцип сэндвича рисование в графическом режиме включить графический режим выключить графический режим

110 #include void main() { int d = DETECT, m; initgraph(&d, &m, "c:\\borlandc\\bgi");... // рисуем на экране getch(); closegraph(); } #include void main() { int d = DETECT, m; initgraph(&d, &m, "c:\\borlandc\\bgi");... // рисуем на экране getch(); closegraph(); } initgraph(&d, &m, "c:\\borlandc\\bgi"); initgraph(&d, &m, "c:\\borlandc\\bgi"); closegraph(); Структура графической программы определить режим автоматически вспомогательные переменные d, m путь к файлу egavga.bgi включить графический режим выключить графический режим чтобы посмотреть результат библиотека для работы с графикой

111 Цвета Код Название 0 BLACK 1 BLUE 2 GREEN 3 CYAN 4 RED 5 MAGENTA 6 BROWN 7 LIGHTGRAY Код Название 8 DARKGRAY 9 LIGHTBLUE 10 LIGHTGREEN 11 LIGHTCYAN 12 LIGHTRED 13 LIGHTMAGENTA 14 YELLOW 15 WHITE

112 Управление цветом Цвет линий: set color = установить цвет setcolor ( цвет ); Цвет и стиль заливки: set fill style = установить стиль заливки setfillstyle ( стиль, цвет ); Цвет текста: setcolor ( цвет ); 0 – выключить 3..6 наклонные линии 1 – сплошная 7..8 сетка точечная 0 – выключить 3..6 наклонные линии 1 – сплошная 7..8 сетка точечная

113 Точки, отрезки и ломаные (x 1, y 1 ) (x 2, y 2 ) setcolor ( 10 ); line (x1, y1, x2, y2); setcolor ( 10 ); line (x1, y1, x2, y2); (x, y) putpixel (x, y, 9); (x 1, y 1 ) (x 2, y 2 ) (x 3, y 3 ) (x 4, y 4 ) (x 5, y 5 ) setcolor ( 12 ); moveto (x1, y1); lineto (x2, y2); lineto (x3, y3); lineto (x4, y4); lineto (x5, y5); setcolor ( 12 ); moveto (x1, y1); lineto (x2, y2); lineto (x3, y3); lineto (x4, y4); lineto (x5, y5); цвет (номер или название)

114 Прямоугольники (x 1, y 1 ) (x 2, y 2 ) setcolor ( 9 ); rectangle (x1, y1, x2, y2); setcolor ( 9 ); rectangle (x1, y1, x2, y2); (x 1, y 1 ) (x 2, y 2 ) setfillstyle ( 1, 12 ); bar (x1, y1, x2, y2); setfillstyle ( 1, 12 ); bar (x1, y1, x2, y2); (x 1, y 1 ) (x 2, y 2 ) setfillstyle ( 1, 12 ); bar (x1, y1, x2, y2); setcolor ( 9 ); rectangle (x1, y1, x2, y2); setfillstyle ( 1, 12 ); bar (x1, y1, x2, y2); setcolor ( 9 ); rectangle (x1, y1, x2, y2); цвет стиль (1 - сплошная) стиль (1 - сплошная)

115 Окружность, заливка, текст setcolor ( LIGHTRED ); circle ( x, y, R ); setcolor ( LIGHTRED ); circle ( x, y, R ); setfillstyle ( 1, LIGHTCYAN ); floodfill ( x, y, BLACK ); setfillstyle ( 1, LIGHTCYAN ); floodfill ( x, y, BLACK ); (x, y) R стиль (1 - сплошная) стиль (1 - сплошная) цвет границы цвет заливки (x, y) Вася setcolor ( 9 ); outtextxy ( x, y, "Вася" ); setcolor ( 9 ); outtextxy ( x, y, "Вася" );

116 Пример (200, 50) (100, 100) (300, 200) setfillstyle(1,9); bar(100,100,300,200); setcolor(13); rectangle(100,100,300,200); moveto(100,100); lineto(200, 50); lineto(300,100); setfillstyle(1,14); floodfill(200, 75, 13); setcolor(15); circle(200, 150,50); setfillstyle(1, 10); floodfill(200,150, 15); setcolor(12); outtextxy(100, 230, "Sharik's house."); setfillstyle(1,9); bar(100,100,300,200); setcolor(13); rectangle(100,100,300,200); moveto(100,100); lineto(200, 50); lineto(300,100); setfillstyle(1,14); floodfill(200, 75, 13); setcolor(15); circle(200, 150,50); setfillstyle(1, 10); floodfill(200,150, 15); setcolor(12); outtextxy(100, 230, "Sharik's house."); Sharik's house

117 Задания "4": "Лягушка" "5": "Корона"

118 Штриховка (x 1, y 1 ) (x 2, y 2 ) N линий (N=5) h rectangle (x1, y1, x2, y2); line( x1+h, y1, x1+h, y2); line( x1+2*h, y1, x1+2*h, y2); line( x1+3*h, y1, x1+3*h, y2);... h = (x2 – x1) / (N + 1.); rectangle (x1, y1, x2, y2); for (x = x1+h; x < x2; x += h) line(x, y1, x, y2); h = (x2 – x1) / (N + 1.); rectangle (x1, y1, x2, y2); for (x = x1+h; x < x2; x += h) line(x, y1, x, y2); x x дробная часть x отбрасывается x x float x, h; ! результат – с дробной частью

119 Как менять цвет? (x 1, y 1 ) (x 2, y 2 ) setfillstyle ( 1, c ); floodfill( ???, ???, 15 ); setfillstyle ( 1, c ); floodfill( ???, ???, 15 ); цвет заливки изменение c: 1, 2, 3,... x (x-1, y 1 +1) for (x = x1+h; x

120 Штриховка (x 1, y 1 ) (x 2, y 2 ) (x 3, y 2 ) a h (x 3 +a, y 1 ) line( x1+h, y1, x1+h-a, y2); line( x1+2*h, y1, x1+2*h-a, y2); line( x1+3*h, y1, x1+3*h-a, y2);... h = (x3 – x2) / (N + 1.); a = x2 – x1; x = x1 + h; for (i = 1; i

121 Штриховка (x 1, y 1 ) (x 2, y 2 ) hxhx hyhy y y x x y y line( x1, y1+hy, x1+hx, y1+hy) ; line( x1, y1+2*hy, x1+2*hx, y1+2*hy); line( x1, y1+3*hy, x1+3*hx, y1+3*hy);... hx = (x2 – x1) / (N + 1.); hy = (y2 – y1) / (N + 1.); x = x1 + hx; y = y1 + hy; for (i=1; i

122 Задания "4": Ввести с клавиатуры число линий и построить фигуру: "5": Ввести с клавиатуры число линий и построить фигуру:

123 Задания "4": Ввести с клавиатуры число линий штриховки и построить фигуру, залив все области разным цветом. "5": Ввести с клавиатуры число окружностей и построить фигуру, залив области разным цветом.

Программирование на языке Си Тема 11. Графики функций © К.Ю. Поляков,

125 Построение графиков функций Задача: построить график функции y = 3 sin(x ) на интервале от 0 до 2π. Анализ: максимальное значение y max = 3 при x = π/2 минимальное значение y min = -3 при x = 3 π/2 Проблема: функция задана в математической системе координат, строить надо на экране, указывая координаты в пикселях.

126 Преобразование координат (x,y)(x,y) X Y x y Математическая система координат Экранная система координат (пиксели) (xэ,yэ)(xэ,yэ) xэxэ yэyэ (0,0)(0,0) (0,0)(0,0) a b k – масштаб (длина изображения единичного отрезка на экране) x э = a + kx y э = b - ky x э = a + kx y э = b - ky

127 Программа const a = 50, b = 200, k = 50; const float xmin = 0, xmax =2*M_PI; float x, y, h = 0.01; int xe, ye, w; w = (xmax - xmin)*k; line(a-10, b, a+w, b); line(a, 0, a, 2*b); for (x = xmin; x < xmax; x += h) { y = 3*sin(x); xe = a + k*x; ye = b - k*y; putpixel (xe, ye, 12); } Что плохо? ? 2π2π 2π2π h – шаг изменения x w – длина оси ОХ в пикселях координаты точки на экране оси координат цикл построения графика обязательно #include обязательно #include

128 Как соединить точки? Алгоритм: Если первая точка перейти в точку (x э,y э ) иначе отрезок в точку (x э,y э ) Если первая точка перейти в точку (x э,y э ) иначе отрезок в точку (x э,y э ) Программа: выбор варианта действий переменная-флаг (только 1 или 0) int first;... first = 1; for (x = xmin; x < xmax; x += h) {... if ( first ) { moveto(xe, ye); first = 0; } else lineto(xe, ye);... } начальное значение

129 Задания "4": Построить график функции y = x 2 на интервале [-3,3]. "5": Построить график функции (эллипс)

Программирование на языке Си Тема 12. Процедуры © К.Ю. Поляков, 2007

131 Процедуры Задача: Построить фигуру: Особенность: Три похожие фигуры. общее: размеры, угол поворота отличия: координаты, цвет Можно ли решить известными методами? ? Сколько координат надо задать? ?

132 Процедуры Процедура – это вспомогательный алгоритм, который предназначен для выполнения некоторых действий. Применение: выполнение одинаковых действий в разных местах программы разбивка программы (или другой процедуры) на подзадачи для лучшего восприятия Подзадача 1Подзадача 2Подзадача Задача

133 Процедуры Порядок разработки: выделить одинаковые или похожие действия (три фигуры) найти в них общее (размеры, форма, угол поворота) и отличия (координаты, цвет) отличия записать в виде неизвестных переменных, они будут параметрами процедуры (x, y) (x+100, y) (x, y-60) void Tr( int x, int y, int c ) { moveto ( x, y ); lineto ( x, y-60 ); lineto ( x+100, y ); lineto ( x, y ); setfillstyle ( 1, c ); floodfill ( x+20, y-20, 15); } заголовок процедуры тело процедуры координаты цвет формальные параметры

134 Программа void main() {... Tr(100, 100, LIGHTBLUE); Tr(200, 100, LIGHTGREEN); Tr(200, 160, LIGHTRED);... } void main() {... Tr(100, 100, LIGHTBLUE); Tr(200, 100, LIGHTGREEN); Tr(200, 160, LIGHTRED);... } (100,100) фактические параметры вызовы процедуры void Tr( int x, int y, int c) {... } формальные параметры процедура

135 Процедуры Особенности: обычно процедуры расположены выше основной программы в заголовке процедуры перечисляются формальные параметры, они обозначаются именами, поскольку могут меняться при вызове процедуры в скобках указывают фактические параметры (числа или арифметические выражения) в том же порядке void Tr( int x, int y, int c ) Tr ( 200, 100, LIGHTGREEN ); x x y y c c

136 Процедуры Особенности: для каждого формального параметра в заголовке процедуры указывают его тип внутри процедуры параметры используются так же, как и переменные в процедуре можно объявлять дополнительные локальные переменные, остальные процедуры не имеют к ним доступа void A ( int x, float y, char z ) {... } void A ( int x, float y, char z ) { int a2, bbc = 345;... } void A ( int x, float y, char z ) { int a2, bbc = 345;... } локальные переменные int a2, bbc = 345;

137 Как поменять местами? Задача: поменять местами содержимое двух чашек. Задача: поменять местами содержимое двух ячеек памяти ? ? x y c c = x; x = y; y = c; c = x; x = y; y = c; x = y; y = x; x = y; y = x; Можно ли обойтись без c ? ?

138 Параметры-переменные Задача: составить процедуру, которая меняет местами значения двух переменных. Особенности: надо, чтобы изменения, сделанные в процедуре, стали известны вызывающей программе void main() { int x = 1, y = 2; Swap ( x, y ); printf ( "x = %d, y = %d", x, y ); } void Swap ( int a, int b ) { int c; c = a; a = b; b = c; } эта процедура работает с копиями параметров x = 1, y = 2

139 Параметры-переменные Применение: таким образом процедура (и функция) может возвращать несколько значений Запрещенные варианты вызова Swap ( 2, 3 ); // числа Swap ( x+z, y+2 ); // выражения void Swap ( int & a, int & b ) { int c; c = a; a = b; b = c; } void Swap ( int & a, int & b ) { int c; c = a; a = b; b = c; } & параметры могут изменяться &

140 Задания "4": Используя процедуры, построить фигуру. "5": Используя процедуры, построить фигуру. a aa 0,866a равносторонний треугольник

Программирование на языке Си Тема 13. Анимация © К.Ю. Поляков, 2007

142 Анимация Анимация (англ. animation) – оживление изображения на экране. Задача: внутри синего квадрата 400 на 400 пикселей слева направо двигается желтый квадрат 20 на 20 пикселей. Программа останавливается, если нажата клавиша Esc или квадрат дошел до границы синей области. Проблема: как изобразить перемещение объекта на экране? Привязка: состояние объекта задается координатами (x,y) Принцип анимации: 1. рисуем объект в точке (x,y) 2. задержка на несколько миллисекунд 3. стираем объект 4. изменяем координаты (x,y) 5. переходим к шагу 1

143 Как "поймать" нажатие клавиши? kbhit() – функция, определяет, было ли нажатие на (любую!) клавишу (0 – не было, не 0 – было). getch() – функция, которая определяет код нажатой клавиши: 27 = Esc, 13 = Enter, 32 = пробел, … if ( kbhit() ) printf("Нажата какая-то клавиша..."); else printf("Нет нажатия..."); if ( kbhit() ) printf("Нажата какая-то клавиша..."); else printf("Нет нажатия..."); if ( kbhit() ) { printf("Нажата какая-то клавиша..."); c = getch(); printf("Код клавиши %d", c); } int c; if ( kbhit() != 0 )

144 Как выйти из цикла? #include void main() {... while ( x + 20 < 400 ) { if ( kbhit() ) if ( getch() == 27 ) break;... } } если нажата клавиша... если нажата клавиша с кодом 27 (Esc), выйти из цикла для kbhit() и getch() пока не вышли за границу синего квадрата Как не допустить выход за границу поля? ? x + 20 < 400

145 Процедура (рисование и стирание) void Draw( int x, int y, int color ) { setfillstyle ( 1, color ); bar(x, y, x+20, y+20); } void Draw( int x, int y, int color ) { setfillstyle ( 1, color ); bar(x, y, x+20, y+20); } (x, y) (x+20, y+20) Идеи одна процедура рисует и стирает стереть = нарисовать цветом фона границу квадрата отключить (в основной программе) цвет: желтым рисуем, синим стираем сплошная заливка цветом color залитый прямоугольник

146 Полная программа void Draw ( int x, int y, int color ) {... } void main() { int d = DETECT, m; initgraph ( &d, &m, "c:\\borlandc\\bgi" ); int x, y; setfillstyle(1, 9); bar(0, 0, 399, 399); x = 0; y = 240; while ( x + 20 < 400 ) { if ( kbhit() ) if ( getch() == 27 ) break; Draw ( x, y, YELLOW ); delay ( 20 ); Draw ( x, y, 9 ); x ++; } closegraph(); } процедура начальные координаты выход по клавише Esc синий фон ждем 20 мс, нужно #include ждем 20 мс, нужно #include включить графический режим

147 "4": Два квадрата двигаются в противоположных направлениях: "5": Два квадрата двигаются в противоположных направлениях и отталкиваются от стенок синего квадрата: Задания

148 Управление клавишами Задача: жёлтый квадрат внутри синего квадрата управляется клавишами-стрелками. Коды клавиш: влево – 75 вверх – 72Esc – 27 вправо – 77 вниз – 80 Проблема: как изменять направление движения? Решение: if нажата клавиша { получить код клавиши - code if (code == 27) break; if (code == 75) x --; if (code == 77) x ++; if (code == 72) y --; if (code == 80) y ++; } if нажата клавиша { получить код клавиши - code if (code == 27) break; if (code == 75) x --; if (code == 77) x ++; if (code == 72) y --; if (code == 80) y ++; } ( kbhit() ) code = getch(); если было нажатие на клавишу, … получить ее код выход по Esc перемещение switch ( code ) { case 75: x --; break; case 77: x ++; break; case 72: y --; break; case 80: y ++; }

149 Программа void Draw (int x, int y, int color) {... } if ( kbhit() ) {... } Что плохо? ? процедура основной цикл обработка нажатия на клавишу void main() { int x, y, code;... while ( 1 ) { Draw(x, y, YELLOW); delay(20); Draw(x, y, 9); } } Как убрать мигание? ?

150 "4": Квадрат двигается при нажатии стрелок, однако не может выйти за границы синего квадрата: "5": Квадрат непрерывно двигается, при нажатии стрелок меняет направление и отталкивается от стенок синего квадрата: Задания

151 Вращение Задача: изобразить модель вращения Земли вокруг Солнца. Проблема: движение по окружности, как изменять координаты? Решение: использовать в качестве независимой переменной (менять в цикле) угол поворота α (x 0, y 0 ) α L (x, y) x = x 0 + L · cos(α) y = y 0 – L·sin(α) x = x 0 + L · cos(α) y = y 0 – L·sin(α)

152 Процедура void Draw( int x, int y, int color ) { const r = 10; setcolor ( color ); circle ( x, y, r ); } void Draw( int x, int y, int color ) { const r = 10; setcolor ( color ); circle ( x, y, r ); } цвет: желтый – рисуем, черный – стираем установили цвет линий радиус Земли (x,y)(x,y) r

153 Константы и переменные #include // математические функции void main() { const rSun = 60, // радиус Солнца L = 150, // радиус орбиты Земли x0 = 200, // координаты центра Солнца y0 = 200; int x, y, // координаты Земли code; // код нажатой клавиши float a, ha; // угол поворота, шаг int d = DETECT, m; initgraph ( &d, &m, "c:\\borlandc\\bgi" );... } #include // математические функции void main() { const rSun = 60, // радиус Солнца L = 150, // радиус орбиты Земли x0 = 200, // координаты центра Солнца y0 = 200; int x, y, // координаты Земли code; // код нажатой клавиши float a, ha; // угол поворота, шаг int d = DETECT, m; initgraph ( &d, &m, "c:\\borlandc\\bgi" );... } void Draw ( int x, int y, int color ) {... }

154 Основной цикл circle ( x0, y0, rSun ); setfillstyle(1, YELLOW); floodfill ( x0, y0, WHITE ); a = 0; // начальный угол ha = M_PI/180; // шаг 1 o за 100 мс while(1) { x = x0 + L*cos(a); y = y0 - L*sin(a); Draw ( x, y, LIGHTBLUE ); delay ( 20 ); Draw(x, y, 0); a = a + ha; } closegraph(); рисуем Солнце: белый контур, желтая заливка новые координаты поворот на ha ждем 20 мс if ( kbhit() ) if ( 27 == getch() ) break; выход по Esc #include // sin, cos, M_PI ! const M_PI= ;

155 "4": Изобразить модель Солнца с двумя планетами, которые вращаются в противоположные стороны: "5": Изобразить модель системы Солнце-Земля- Луна: Задания

Программирование на языке Си Тема 14. Случайные числа © К.Ю. Поляков, 2007

157 Случайные числа Случайные явления: везде… бросание монеты ("орел" или "решка") падение снега броуновское движение помехи при телефонной связи шум радиоэфира Случайные числа – это такая последовательность чисел, для которой невозможно предсказать следующее даже зная все предыдущие. Проблема: как получить на компьютере? Возможные решения: использовать внешний источник шумовых помех с помощью математических преобразований

158 Псевдослучайные числа Псевдослучайные числа – это такая последовательность чисел, которая обладает свойствами случайных чисел, но каждое следующее число вычисляется по заданной формуле. Примеры: 1. Случайные целые числа [0,m) (линейный конгруэнтный метод) 2. Случайные вещественные числа [0,1] Литература: Д. Кнут, Искусство программирования для ЭВМ, т.2. дробная часть числа a, c, m - целые числа простое число например, k = 5 остаток от деления

159 Распределение случайных чисел Модель: снежинки падают на отрезок [a,b] a b a b распределение равномерное неравномерное Сколько может быть разных распределений? ?

160 Распределение случайных чисел Особенности: распределение – это характеристика всей последовательности, а не одного числа равномерное распределение одно, компьютерные датчики (псевдо)случайных чисел дают равномерное распределение неравномерных – много любое неравномерное можно получить с помощью равномерного a b a b равномерное распределение

161 Генератор случайных чисел в Си Целые числа в интервале [0,N]: int x; x = random ( 100 ); // интервал [0,99] x = random ( z ); // интервал [0,z-1] Целые числа в интервале [a,b]: x = random ( z ) + a; // интервал [a,z-1+a] x = random (b – a + 1) + a; // интервал [a,b] Установить начальное значение последовательности: srand ( 345 ); // начнем с 345 Установить случайное начало последовательности: randomize ( ); #include // случайные числа

162 Генератор случайных чисел в Си Вещественные числа в интервале [0,1] float x; x = 1.*rand() / RAND_MAX; // интервал [0,1) Вещественные числа в интервале [0,z) x = 1.*z*rand()/RAND_MAX; Вещественные числа в интервале [a,z+a) x = 1.*z*rand()/RAND_MAX + a; Вещественные числа в интервале [a,b) x = 1.*(b-a)*rand()/RAND_MAX + a; [0,RAND_MAX-1] = [0,32767]

163 Случайные числа Задача: заполнить прямоугольник 400 на 300 пикселей равномерно точками случайного цвета Как получить случайные координаты точки? x = random ( 400 ); y = random ( 300 ); Как добиться равномерности? обеспечивается автоматически при использовании функции random Как получить случайный цвет? color = random ( 16 );

164 Программа #include void main() { int d = DETECT, m; int x, y, color; initgraph ( &d, &m, "C:\\BORLANDC\\BGI" ); closegraph(); } #include void main() { int d = DETECT, m; int x, y, color; initgraph ( &d, &m, "C:\\BORLANDC\\BGI" ); closegraph(); } while ( 1 ) { x = random(320)+160; y = random(240)+120; color = random(16); putpixel ( x, y, color ); if ( kbhit() ) if ( 27 == getch() ) break; } while ( 1 ) { x = random(320)+160; y = random(240)+120; color = random(16); putpixel ( x, y, color ); if ( kbhit() ) if ( 27 == getch() ) break; } случайные координаты случайный цвет выход по Esc

165 "4": Ввести с клавиатуры координаты углов прямоугольника и заполнить его точками случайного цвета. "5": Заполнить треугольник точками случайного цвета (равномерно или неравномерно). Подсказка: возьмите равнобедренный треугольник с углом 45 о. Задания (100,100) (300,200)

Программирование на языке Си Тема 15. Функции © К.Ю. Поляков, 2007

167 Функции Функция – это вспомогательный алгоритм (подпрограмма), результатом работы которого является некоторое значение. Примеры: вычисление модуля числа, расчет значений по сложным формулам ответ на вопрос (простое число или нет?) Зачем? для выполнения одинаковых расчетов в различных местах программы для создания общедоступных библиотек функций В чем отличие от процедур? ?

168 Функции Задача: составить функцию, которая вычисляет наибольшее из двух значений, и привести пример ее использования Функция: формальные параметры int Max ( int a, int b ) { if ( a > b ) return a ; else return b ; } return - вернуть результат функции

169 Функции Особенности: в начале заголовка ставится тип результата формальные параметры описываются так же, как и для процедур можно использовать параметры-переменные функции обычно располагаются до основной программы Max ( int a, int b ) int float qq ( ) int a, float x, char c int Vasya (int a, int b ) &&

170 Функции Особенности: можно объявлять и использовать локальные переменные float qq ( int a, int b) {... } float qq ( int a, int b) {... } float x, y; локальные переменные Локальные переменные недоступны в основной программе и других процедурах и функциях. !

171 Программа void main() { int a, b, с; printf ( "Введите два числа\n" ); scanf ( "%d%d", &a, &b ); c = Max ( a, b ); printf ( " Наибольшее число %d", c ); } int Max ( int a, int b ) {... } фактические параметры вызов функции формальные параметры

172 Логические функции Задача: составить функцию, которая определяет, верно ли, что заданное число – простое. Особенности: ответ – логическое значение: «да» (1) или «нет» ( 0 ) результат функции можно использовать как логическую величину в условиях ( if, while ) Алгоритм: считаем число делителей в интервале от 2 до N-1, если оно не равно нулю – число составное. Как улучшить? ? count = 0; for (i = 2; i < N; i ++) if ( N % i == 0 ) count ++; if ( count == 0 ) // число N простое} else // число N составное

173 Логические функции void main() { int N; printf ( "Введите целое число\n" ); scanf ( "%d", &N ); if ( Prime( N ) ) printf ("%d - простое число, N); else printf ("%d - простое число, N); } void main() { int N; printf ( "Введите целое число\n" ); scanf ( "%d", &N ); if ( Prime( N ) ) printf ("%d - простое число, N); else printf ("%d - простое число, N); } int Prime ( int N ) { int count = 0, i; for (i = 2; i*i

174 Задания "4": Составить функцию, которая определяет сумму всех чисел от 1 до N и привести пример ее использования. Пример: Введите число: 100 сумма чисел от 1 до 100 = 5050 "5": Составить функцию, которая определяет, сколько зерен попросил положить на N-ую клетку изобретатель шахмат (на 1-ую – 1 зерно, на 2-ую – 2 зерна, на 3-ю – 4 зерна, …) Подсказка: используйте тип long int. Пример: Введите номер клетки: 28 На 28-ой клетке зерен.

175 Задания (вариант 2 для 8-11 класса) "4": Составить функцию, которая определяет наибольший общий делитель двух натуральных и привести пример ее использования. Пример: Введите два числа: НОД(14,21)=7 "5": Составить функцию, которая вычисляет функцию синус как сумму ряда (с точностью 0.001) Пример: Введите угол в градусах: 45 sin(45) = x в радианах!

176 Конец фильма