'

Программирование на языке Си

Понравилась презентация – покажи это...





Слайд 0

Программирование на языке Си © К.Ю. Поляков, 2007-2008 Введение Переменные Ввод и вывод Ветвления Сложные условия Циклы Циклы с условием Оператор выбора Отладка программ Графика Графики функций Процедуры Анимация Функции Случайные числа


Слайд 1

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


Слайд 2

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


Слайд 3

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


Слайд 4

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


Слайд 5

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


Слайд 6

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


Слайд 7

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


Слайд 8

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


Слайд 9

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


Слайд 10

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


Слайд 11

12 Управление клавишами


Слайд 12

13 Где ошибки? 2 x ЛКМ эта ошибка обнаружена здесь!


Слайд 13

14 Наиболее «популярные» ошибки


Слайд 14

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


Слайд 15

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


Слайд 16

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


Слайд 17

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


Слайд 18

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


Слайд 19

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


Слайд 20

21 Объявление переменных Объявить переменную = определить ее имя, тип, начальное значение, и выделить ей место в памяти. 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 вещественные переменные x, y и z x = 4,56 · целая и дробная части отделяются точкой символьные переменные c, c2 и m c2 = 'A'


Слайд 21

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


Слайд 22

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


Слайд 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; } Какие операторы неправильные? имя переменной должно быть слева от знака = целая и дробная часть отделяются точкой при записи вещественного значения в целую переменную дробная часть будет отброшена


Слайд 24

25 Особенность деления в Си main() { int a = 7; float x; x = a / 4; x = 4 / a; x = float(a) / 4; x = 1.*a / 4; } 1 0 1.75 1.75


Слайд 25

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;


Слайд 26

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; } 5 7 28 5 3 4 4 ? ?


Слайд 27

28 Порядок выполнения операций вычисление выражений в скобках умножение, деление, % слева направо сложение и вычитание слева направо 2 3 5 4 1 7 8 6 9 z = (5*a*c+3*(c-d))/a*(b-c)/ b; 2 6 3 4 7 5 1 12 8 11 10 9 x =(a*a+5*c*c-d*(a+b))/((c+d)*(d-2*a));


Слайд 28

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


Слайд 29

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


Слайд 30

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


Слайд 31

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); &a %d%d &a, &b убрать пробел %d%d


Слайд 32

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


Слайд 33

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


Слайд 34

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


Слайд 35

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


Слайд 36

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


Слайд 37

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


Слайд 38

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


Слайд 39

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


Слайд 40

41 Вариант 1. Блок-схема полная форма ветвления блок «решение»


Слайд 41

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; полная форма условного оператора


Слайд 42

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


Слайд 43

44 Что неправильно? 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 ) a = b; c = 2*a; else b = a; } } { a = b;


Слайд 44

45 Вариант 2. Блок-схема неполная форма ветвления


Слайд 45

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


Слайд 46

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


Слайд 47

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


Слайд 48

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


Слайд 49

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


Слайд 50

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


Слайд 51

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


Слайд 52

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


Слайд 53

54 Вариант 2. Программа main() { int x; printf("Введите возраст\n"); scanf("%d", &x); if ( x >= 25 && x <= 40 ) printf("Подходит"); else printf("Не подходит"); } сложное условие


Слайд 54

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


Слайд 55

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


Слайд 56

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 < 6 && x > 10 x > 6 && x < 10 x > 6 && x > 10 x < 6 || x < 10 x < 6 || x > 10 x > 6 || x < 10 x > 6 || x > 10 Сложные условия 1 1 0 (-?, 6) ? (6, 10) (10, ?) (-?, 10) (-?, 6) ? (10,?) (-?, ?) (6, ?) x < 6 x > 10 x < 10 x > 6 1 1


Слайд 57

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


Слайд 58

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


Слайд 59

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


Слайд 60

61 Алгоритм начало i, i2, i3 конец нет да i <= 8? i = 1; i = i + 1; i2 = i * i; i3 = i2 * i; задать начальное значение переменной цикла проверить, все ли сделали вычисляем квадрат и куб вывод результата перейти к следующему i


Слайд 61

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


Слайд 62

63 Программа main() { int i, i2, i3; for (i=1; i<=8; i++) { i2 = i*i; i3 = i2*i; printf("%4d %4d %4d\n", i, i2, i3); } } for (i=1; i<=8; i++) { i2 = i*i; i3 = i2*i; printf("%4d %4d %4d\n", i, i2, i3); } переменная цикла начальное значение конечное значение изменение на каждом шаге: i=i+1 ровные столбики цикл работает, пока это условие верно цикл начало цикла конец цикла заголовок цикла for (i=1; i<=8; i++) i2 = i*i; i3 = i2*i; printf("%4d %4d %4d\n", i, i2, i3); тело цикла


Слайд 63

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


Слайд 64

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


Слайд 65

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


Слайд 66

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


Слайд 67

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


Слайд 68

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


Слайд 69

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


Слайд 70

71 Цикл с неизвестным числом шагов Пример: Отпилить полено от бревна. Сколько раз надо сделать движения пилой? Задача: Ввести целое число (<2000000) и определить число цифр в нем. Идея решения: Отсекаем последовательно последнюю цифру, увеличиваем счетчик. Проблема: Неизвестно, сколько шагов надо сделать. Решение: Надо остановиться, когда n = 0, т.е. надо делать «пока n != 0».


Слайд 71

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


Слайд 72

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;


Слайд 73

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


Слайд 74

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


Слайд 75

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


Слайд 76

77 Замена for на while и наоборот for( i=1; i<=10; i++) { // тело цикла } i = 1; while ( i <= 10 ) { // тело цикла i ++; } for ( i=a; i>=b; i--) { // тело цикла } i = a; while ( i >= b ) { // тело цикла i --; }


Слайд 77

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


Слайд 78

79 Последовательности Примеры: 1, 2, 3, 4, 5, … 1, 2, 4, 7, 11, 16, … 1, 2, 4, 8, 16, 32, … an = n a1 = 1, an+1 = an+1 a1 = 1, an+1 = an + n an = 2n-1 a1 = 1, an+1 = 2an b1 = 1, bn+1 = bn+1 c1 = 2, cn+1 = 2cn


Слайд 79

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


Слайд 80

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; новый элемент изменение


Слайд 81

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


Слайд 82

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


Слайд 83

84 Цикл с постусловием Задача: Ввести целое положительное число (<2000000) и определить число цифр в нем. Проблема: Как не дать ввести отрицательное число или ноль? Решение: Если вводится неверное число, вернуться назад к вводу данных (цикл!). Особенность: Один раз тело цикла надо сделать в любом случае ? проверку условия цикла надо делать в конце цикла (цикл с постусловием). Цикл с постусловием – это цикл, в котором проверка условия выполняется в конце цикла.


Слайд 84

85 Цикл с постусловием: алгоритм начало конец нет да n <= 0? тело цикла условие блок «типовой процесс» ввод n основной алгоритм


Слайд 85

86 Программа main() { int n; do { printf("Введите положительное число\n"); scanf("%d", &n); } while ( n <= 0 ); ... // основной алгоритм } условие Особенности: тело цикла всегда выполняется хотя бы один раз после слова while («пока…» ) ставится условие продолжения цикла


Слайд 86

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


Слайд 87

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


Слайд 88

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


Слайд 89

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


Слайд 90

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


Слайд 91

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; break; break; выйти из switch


Слайд 92

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


Слайд 93

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


Слайд 94

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


Слайд 95

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


Слайд 96

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


Слайд 97

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<10; i++) { ... } ... }


Слайд 98

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


Слайд 99

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


Слайд 100

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


Слайд 101

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


Слайд 102

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


Слайд 103

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


Слайд 104

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


Слайд 105

106 Цвета


Слайд 106

107 Полная палитра цветов цвет = R + G + B Red красный 0..255 Blue синий 0..255 Green зеленый 0..255 R = 218 G = 164 B = 32 R = 135 G = 206 B = 250 256·256·256 = 16 777 216 (True Color)


Слайд 107

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


Слайд 108

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


Слайд 109

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


Слайд 110

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


Слайд 111

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."); Sharik's house


Слайд 112

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


Слайд 113

114 Штриховка (x1, y1) (x2, y2) 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); x дробная часть x отбрасывается x результат – дробное число


Слайд 114

115 Штриховка (программа) (x1, y1) (x2, y2) h #include <graphics.h> #include <conio.h> 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);


Слайд 115

COLOR(c, c, c) 116 Как менять цвет? (x1, y1) (x2, y2) hc = 255 / N; c = 0; for ( i=1; i<=N+1; i++ ) { setfillstyle ( 1, COLOR(c,c,c) ); floodfill( ???, ???, 15 ); c += hc; } цвет границы Шаг изменения c: серый: R = G = B Цвет: Изменение c: 0, ..., 255 N


Слайд 116

117 Как менять цвет? setfillstyle( 1, COLOR(c,c,c) ); floodfill ( ???, ???, 15 ); hc = 255 / N; c = 0; x = x1 + h; for ( i=1; i <= N+1; i++ ) { setfillstyle(1,COLOR(c,c,c)); floodfill ( x-1, y1+1, 15 ); x += h; c += hc; } c = 0; COLOR(c,c,c) c += hc; правая граница полосы (x1, y1) (x2, y2) (x-1, y1+1)


Слайд 117

118 Штриховка (x1, y1) (x2, y2) (x3, y2) a h (x3+a, y1) 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 <= N; i ++, x += h ) line(x, y1, x-a, y2); x x-a i ++, x += h после каждого шага выполняются две команды


Слайд 118

119 Штриховка (x1, y1) (x2, y2) hx hy y x 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 <= N; i++) { line( x1, y, x, y ); x += hx; y += hy; }


Слайд 119

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


Слайд 120

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


Слайд 121

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


Слайд 122

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


Слайд 123

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


Слайд 124

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? h – шаг изменения x w – длина оси ОХ в пикселях координаты точки на экране оси координат


Слайд 125

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


Слайд 126

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


Слайд 127

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


Слайд 128

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


Слайд 129

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


Слайд 130

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


Слайд 131

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


Слайд 132

133 Программа #include <conio.h> #include <graphics.h> 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) 100 60 фактические параметры вызовы процедуры void Tr( int x, int y, int c) { ... } формальные параметры процедура


Слайд 133

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


Слайд 134

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


Слайд 135

136 Как поменять местами? 2 3 1 Задача: поменять местами содержимое двух чашек. Задача: поменять местами содержимое двух ячеек памяти. 4 6 ? 4 6 4 x y c c = x; x = y; y = c; x = y; y = x; 3 2 1


Слайд 136

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


Слайд 137

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


Слайд 138

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


Слайд 139

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


Слайд 140

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


Слайд 141

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


Слайд 142

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


Слайд 143

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


Слайд 144

145 Полная программа #include <conio.h> #include <graphics.h> 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(); } процедура начальные координаты синий фон


Слайд 145

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 мс пока не вышли из синего квадрата


Слайд 146

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


Слайд 147

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


Слайд 148

149 Программа void Draw (int x, int y, int color) { ... } 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)); } }


Слайд 149

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


Слайд 150

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


Слайд 151

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


Слайд 152

153 Константы и переменные #include <math.h> // математические функции 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 ) { ... }


Слайд 153

154 Основной цикл circle ( x0, y0, rSun ); setfillstyle(1, COLOR(255,255,0)); floodfill(x0, y0, COLOR(255,255,255)); a = 0; // начальный угол ha = M_PI/180; // шаг 1o за 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; новые координаты поворот на ha ждем 20 мс выход по Esc


Слайд 154

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


Слайд 155

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


Слайд 156

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


Слайд 157

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


Слайд 158

159 Функции Особенности: в начале заголовка ставится тип результата формальные параметры описываются так же, как и для процедур можно использовать параметры-переменные функции обычно располагаются до основной программы


Слайд 159

160 Функции Особенности: можно объявлять и использовать локальные переменные локальные переменные


Слайд 160

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 ) { ... } фактические параметры вызов функции формальные параметры


Слайд 161

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


Слайд 162

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


Слайд 163

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 составное


Слайд 164

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


Слайд 165

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


Слайд 166

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


Слайд 167

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


Слайд 168

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


Слайд 169

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


Слайд 170

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


Слайд 171

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


Слайд 172

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


Слайд 173

174 Целые числа в заданном интервале Целые числа в интервале [0,N-1]: Примеры: Целые числа в интервале [a,b]: int random(int N) { return rand()% N; } 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]


Слайд 174

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]


Слайд 175

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


Слайд 176

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


Слайд 177

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)); } if ( kbhit() ) if ( 27 == getch() ) break; случайные координаты случайный цвет выход по Esc бесконечный цикл???


Слайд 178

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


Слайд 179

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


×

HTML:





Ссылка: