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

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

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

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

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

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

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

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

8 Что происходит дальше? main() { } main() { } first.cpp исходный файл first.o транслятор ЪБ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 main() { printf("Привет!"); } #include main() { printf("Привет!"); } include = включить файл stdio.h: описание стандартных функций ввода и вывода вызов стандартной функции printf = print format (форматный вывод) вызов стандартной функции printf = print format (форматный вывод) этот текст будет на экране

10 Как начать работу? здесь мы набираем программу сообщения об ошибках Открыть Новый Сохранить Закрыть

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

12 Управление клавишами Новый файл (Создать)Ctrl+N Открыть файлCtrl+O Сохранить файлCtrl+S Закрыть окно с программойCtrl-F4 Запуск программыF9 ОтменитьCtrl-Z Восстановить отмененноеShift-Ctrl-Z

13 Где ошибки? 2 x ЛКМ эта ошибка обнаружена здесь! Ошибка может быть в конце предыдущей строки! !

14 Наиболее «популярные» ошибки xxx.h: No such file or directory не найден заголовочный файл 'xxx.h' (неверно указано его имя, он удален или т.п.) 'xxx undeclared (first use this function) функция или переменная 'xxx' неизвестна missing terminating " characterне закрыты кавычки " expected ; нет точки с запятой в конце оператора в предыдущей строке expected }не закрыта фигурная скобка

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

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

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

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

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

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

21 Объявление переменных Объявить переменную = определить ее имя, тип, начальное значение, и выделить ей место в памяти. main() { int a; float b, c; int Tu104, Il86=23, Yak42; float x=4.56, y, z; char c, c2='A', m; } 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'

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

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

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

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

26 Сокращенная запись операций в Си полная записьсокращенная запись инкремент декремент 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;

27 Ручная прокрутка программы 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; } 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 ? ?

Порядок выполнения операций вычисление выражений в скобках умножение, деление, % слева направо сложение и вычитание слева направо 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. Ввод и вывод © К.Ю. Поляков,

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

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

32 Что неправильно? 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

33 Вывод чисел на экран 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 ); арифметическое выражение

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

35 Вывод вещественных чисел 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 цифры в дробной части мантиссы

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

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

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

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

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

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

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

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

44 Что неправильно? 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;

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

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

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

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

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

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

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

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

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

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

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

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

57 Истинно или ложно при 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 >

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

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

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

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

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

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

64 Цикл с уменьшением переменной Задача. Вывести на экран квадраты и кубы целых чисел от 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 --

65 Цикл с переменной 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; ) {... }

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

67 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

68 Сколько раз выполняется цикл? 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

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

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

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

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

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

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

75 Цикл с условием Особенности: условие пересчитывается каждый раз при входе в цикл если условие на входе в цикл ложно, цикл не выполняется ни разу если условие никогда не станет ложным, программа зацикливается 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;

76 Сколько раз выполняется цикл? 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 --; зацикливание

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

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

79 Последовательности Примеры: 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

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

81 Алгоритм начало 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 ; новый элемент изменение Перестановка? ?

82 Программа #include 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; чтобы не было округления при делении

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

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

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

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

87 Сколько раз выполняется цикл? 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 ); зацикливание

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

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

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

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

92 Программа 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

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

94 Оператор выбора Особенности: после switch может быть имя переменной или арифметическое выражение целого типа ( int ) или символьного типа ( 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; }

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

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

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

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

99 Отключение части кода (комментарии) 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 ) {... } */ комментарий до конца строки // закомментированны й блок /* … */

100 Точки останова это точка останова ЛКМ или Ctrl+F5 F8 – запустить и выполнить до следующей точки останова F7 – выполнить одну строку Shift+F7 – войти в процедуру (функцию) Ctrl-F7 – выполнять дальше Ctrl-Alt-F2 – остановить программу F8 – запустить и выполнить до следующей точки останова F7 – выполнить одну строку Shift+F7 – войти в процедуру (функцию) Ctrl-F7 – выполнять дальше Ctrl-Alt-F2 – остановить программу

101 Просмотр значений переменных навести мышь на имя переменной ПКМ

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

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

104 Принцип сэндвича рисование в графическом режиме открыть окно для графики закрыть окно для графики

105 #include main() { initwindow ( 400, 300 );... // рисуем на экране getch(); closegraph(); } #include main() { initwindow ( 400, 300 );... // рисуем на экране getch(); closegraph(); } initwindow ( 400, 300 ); closegraph(); Структура графической программы открыть окно для графики закрыть окно чтобы посмотреть результат библиотека для работы с графикой ширина высота

106 Цвета Код Название 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

107 Полная палитра цветов цвет = R + G + B Red красный Blue синий Green зеленый R = 218 G = 164 B = 32 R = 135 G = 206 B = 250 Сколько разных цветов? ? 256·256·256 = (True Color)

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

109 Точки, отрезки и ломаные (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); цвет

110 Прямоугольники (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 - сплошная)

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

112 Пример (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

113 Задания «4»: Лягушка «5»: Корона

114 Штриховка (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);... rectangle(x1, y1, x2, y2); h = (x2 – x1) / (N + 1.); for (x = x1+h; x < x2; x += h) line(x, y1, x, y2); rectangle(x1, y1, x2, y2); h = (x2 – x1) / (N + 1.); for (x = x1+h; x < x2; x += h) line(x, y1, x, y2); x x дробная часть x отбрасывается x x float x, h; ! результат – дробное число

115 Штриховка (программа) (x 1, y 1 ) (x 2, y 2 ) h #include main() { int N = 10, x1 = 100, x2 = 300, y1 = 100, y2 = 200; float h, x; initwindow(800,600); rectangle (x1, y1, x2, y2); getch(); closegraph(); } #include main() { int N = 10, x1 = 100, x2 = 300, y1 = 100, y2 = 200; float h, x; initwindow(800,600); rectangle (x1, y1, x2, y2); getch(); closegraph(); } прямоугольник штриховка N h = (x2 – x1) / (N + 1.); for (x = x1+h; x < x2; x += h) line(x, y1, x, y2);

COLOR(c, c, c) 116 Как менять цвет? (x1, y1)(x1, y1) (x2, y2)(x2, y2) hc = 255 / N; c = 0; for ( i=1; i

117 Как менять цвет? setfillstyle( 1, COLOR(c,c,c) ); floodfill ( ???, ???, 15 ); setfillstyle( 1, COLOR(c,c,c) ); floodfill ( ???, ???, 15 ); hc = 255 / N; c = 0; x = x1 + h; for ( i=1; i

118 Штриховка (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

119 Штриховка (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

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

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

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

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

124 Преобразование координат (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

125 Программа 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

126 Как соединить точки? Алгоритм: Если первая точка перейти в точку (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);... } начальное значение

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

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

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

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

131 Процедуры Порядок разработки: выделить одинаковое или похожее (три фигуры) найти в них общее (размеры, форма, угол поворота) и отличия (координаты, цвет) отличия записать в виде неизвестных переменных, они будут параметрами процедуры (x, y) (x+100, y) (x, y-60) void Tr( int x, int y, int c ) {... } имя процедуры тело координаты цвет void – «пустой» (некоторые действия) параметры

132 Процедуры (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); } тело процедуры формальные параметры «Формальные параметры» могут изменяться, заранее неизвестны (обозначаются именами, как переменные).

133 Программа #include main() { initwindow (400, 300); Tr (100, 100, COLOR(0,0,255)); Tr (200, 100, COLOR(0,255,0)); Tr (200, 160, COLOR(255,0,0)); getch(); closegraph(); } #include main() { initwindow (400, 300); Tr (100, 100, COLOR(0,0,255)); Tr (200, 100, COLOR(0,255,0)); Tr (200, 160, COLOR(255,0,0)); getch(); closegraph(); } (100,100) фактические параметры вызовы процедуры void Tr( int x, int y, int c) {... } формальные параметры процедура

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

135 Процедуры Особенности: для каждого формального параметра в заголовке процедуры указывают его тип внутри процедуры параметры используются так же, как и переменные в процедуре можно объявлять дополнительные локальные переменные, остальные процедуры не имеют к ним доступа 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;

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

137 Параметры-переменные Задача: составить процедуру, которая меняет местами значения двух переменных. Особенности: надо, чтобы изменения, сделанные в процедуре, стали известны вызывающей программе. 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

138 Параметры-переменные Применение: таким образом процедура (и функция) может возвращать несколько значений Запрещенные варианты вызова 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; } & параметры могут изменяться &

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

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

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

142 Как «поймать» нажатие клавиши? 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 )

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

144 Процедура (рисование и стирание) 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 залитый прямоугольник

145 Полная программа #include void Draw ( int x, int y, int color ) {... } main() { int x, y; initwindow (500, 500); setfillstyle(1, COLOR(0,0,255)); bar (0, 0, 399, 399); x = 0; y = 240; /* анимация */ closegraph(); } процедура начальные координаты синий фон

146 Цикл анимации while ( x + 20 < 400 ) { if ( kbhit() ) if ( getch() == 27 ) break; Draw ( x, y, COLOR(255,255,0) ); delay ( 20 ); Draw ( x, y, COLOR(0,0,255) ); x ++; } выход по клавише Esc ждем 20 мс пока не вышли из синего квадрата

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(); switch ( code ) { case 75: x --; break; case 77: x ++; break; case 72: y --; break; case 80: y ++; } если было нажатие на клавишу, … получить код клавиши выход по Esc перемещение

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

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

151 Вращение (для 8-11 класса) Задача: изобразить модель вращения Земли вокруг Солнца. Проблема: движение по окружности, как изменять координаты? Решение: использовать в качестве независимой переменной (менять в цикле) угол поворота α (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 int r = 10; setcolor ( color ); circle ( x, y, r ); } void Draw( int x, int y, int color ) { const int r = 10; setcolor ( color ); circle ( x, y, r ); } цвет: желтый – рисуем, черный – стираем установили цвет линий радиус Земли (x,y)(x,y) r постоянная

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

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

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

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

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

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

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

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

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

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

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

164 Логические функции Задача: составить функцию, которая определяет, верно ли, что заданное число – простое. Особенности: ответ – логическое значение: «да» (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 составное

165 Функция: простое число или нет int Prime ( int N ) { int count = 0, i; for (i = 2; i*i

166 Логические функции #include main() { int N; printf ( "Введите целое число\n" ); scanf ( "%d", &N ); if ( Prime( N ) ) printf ("%d - простое число", N); else printf ("%d - составное число", N); } #include main() { int N; printf ( "Введите целое число\n" ); scanf ( "%d", &N ); if ( Prime( N ) ) printf ("%d - простое число", N); else printf ("%d - составное число", N); } int Prime ( int N ) {... } функция Prime( N )

167 Задания «4»: Составить функцию, которая определяет, верно ли, что сумма его цифр – четное число. Пример: Введите число: 136 Сумма цифр четная. «5»: Составить функцию, которая определяет, верно ли, что в заданном числе все цифры стоят по возрастанию. Пример: Введите число: 258 Верно. Введите число: 528 Неверно. Введите число: 245 Сумма цифр нечетная.

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

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

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

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

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

173 Генератор случайных чисел в Си RAND_MAX – максимальное случайное целое число (обычно RAND_MAX = 32767) rand() – случайное целое число в интервале [0,RAND_MAX] srand(N) – установить начальное значение последовательности случайных чисел N: #include // случайные числа int x, y; x = rand(); // первое число [0,RAND_MAX] y = rand(); // уже другое число int x, y; x = rand(); // первое число [0,RAND_MAX] y = rand(); // уже другое число srand ( 345 ); // начнем с 345

174 Целые числа в заданном интервале Целые числа в интервале [0,N-1] : Примеры: Целые числа в интервале [a,b] : int random(int N) { return rand()% N; } int random(int N) { return rand()% N; } x = random ( 100 ); // интервал [0,99] x = random ( z ); // интервал [0,z-1] x = random ( 100 ); // интервал [0,99] x = random ( z ); // интервал [0,z-1] x = random ( z ) + a; // интервал [a,z-1+a] x = random (b – a + 1) + a; // интервал [a,b] x = random ( z ) + a; // интервал [a,z-1+a] x = random (b – a + 1) + a; // интервал [a,b]

175 Генератор случайных чисел в Си Вещественные числа в интервале [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] = [0,32767]

176 Случайные числа Задача: заполнить прямоугольник 400 на 300 пикселей равномерно точками случайного цвета Как получить случайные координаты точки? x = random ( 400 ); y = random ( 300 ); Как добиться равномерности? обеспечивается автоматически при использовании функции random Как получить случайный цвет? R = random( 256 ); G = random ( 256 ); B = random( 256 ); COLOR(R,G,B)

177 Программа #include main() { int x, y, R, G, B; initwindow ( 500, 500 ); // цикл до нажатия на Esc closegraph(); } #include main() { int x, y, R, G, B; initwindow ( 500, 500 ); // цикл до нажатия на Esc closegraph(); } int random(int N) { return rand() % N; } int random(int N) { return rand() % N; } функция для получения случайного числа от 0 до N-1

178 Основной цикл while ( 1 ) { x = random(400); y = random(300); R = random(256); G = random(256); B = random(256); putpixel ( x, y, COLOR(R,G,B)); } while ( 1 ) { x = random(400); y = random(300); R = random(256); G = random(256); B = random(256); putpixel ( x, y, COLOR(R,G,B)); } if ( kbhit() ) if ( 27 == getch() ) break; if ( kbhit() ) if ( 27 == getch() ) break; случайные координаты случайный цвет выход по Esc бесконечный цикл???

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

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