Курс Основы программирования. Лекция 5. Функции

Содержание

Слайд 2

Что такое подпрограмма? Процедуры и функции в Pascal. procedure ReadArray; begin

Что такое подпрограмма?

Процедуры и функции в Pascal.
procedure ReadArray;
begin
end;
function Abs(x:single): single;
begin
end;

Функции в

Си.
void read_array () {
}
float abs(float f) {
}
Слайд 3

Зачем нужны подпрограммы?

Зачем нужны подпрограммы?

Слайд 4

Зачем нужны подпрограммы? Писать меньше кода - Повторяющийся код реализовать один

Зачем нужны подпрограммы?

Писать меньше кода - Повторяющийся код реализовать один раз,

а вызывать многократно (sin(), printf() …)
Сделать код проще для редактирования - Разделить длинный код на части (произвольно)
Упростить код - Разбить сложный алгоритм на части
Повысить уровень абстракции – уйти от низкоуровневых операций на уровень предметной области
Создавать библиотеки для повторного использования – стандартная библиотека Си состоит из функций
Писать большие программы (до десятков и сотен тысяч строк кода)
Слайд 5

Знакомство с функциями в Си

Знакомство с функциями в Си

Слайд 6

Простейшие функции #include void a() { printf("Hello! It is a()!\n"); }

Простейшие функции

#include
void a() {
printf("Hello! It is a()!\n");
}
void main() {
printf("Hello! It

is main()!\n");
a();
}
Слайд 7

Простейшие функции (2)

Простейшие функции (2)

Слайд 8

Простейшие функции (3) #include // это - ОБЪЯВЛЕНИЕ функции a() void

Простейшие функции (3)

#include
// это - ОБЪЯВЛЕНИЕ функции a()
void a();
// это

- ОПРЕДЕЛЕНИЕ функции main()
void main() {
// это ВЫЗОВ функции printf()
printf("Hello! It is main()!\n");
// это ВЫЗОВ функции a()
a();
}
// это - ОПРЕДЕЛЕНИЕ функции a()
void a() {
// это ВЫЗОВ функции printf()
printf("Hello! It is a()!\n");
}
Слайд 9

Функция может возвращать результат #include // это - ОПРЕДЕЛЕНИЕ функции main()

Функция может возвращать результат

#include
// это - ОПРЕДЕЛЕНИЕ функции main() возвращающей

значение типа int
int main() {
// это ВЫЗОВ функции printf()
printf("Hello! It is main()!\n");
// из main() возвращаем 0 – говорим ОС что у нас всё OK
return 0;
}

http://www.c-cpp.ru/books/znacheniya-vozvrashchaemye-funkciey-main
Когда используется оператор return в main(), программа возвращает код завершения вызывавшему процессу (операционной системе). Возвращаемое значение должно быть целого типа. Большинство операционных систем, трактуют 0 как нормальное завершение программы. Остальные значения воспринимаются как ошибки.

Слайд 10

Функция может получать аргументы (1) #include // это - ОБЪЯВЛЕНИЕ функции

Функция может получать аргументы (1)

#include
// это - ОБЪЯВЛЕНИЕ функции ndfl(),

получающей один аргумент типа float,
// и возвращающей результат типа float
float ndfl(float s);
int main() {
// это ВЫЗОВ функции printf() с одним аргументом "s = "
printf("s = ");
// переменные
// s - начисленная зарплата
// nalog - НДФЛ
float s;
float nalog;
// это ВЫЗОВ функции scanf_s() с двумя аргументами –
// 1: "%f"
// 2: &s
scanf_s("%f", &s);
Слайд 11

Функция может получать аргументы (2) // это ВЫЗОВ функции ndfl() с

Функция может получать аргументы (2)

// это ВЫЗОВ функции ndfl() с одним

аргументом s
// Значение, возвращенное из функции ndfl() заносится
// (присваивается) в переменную nalog
nalog = ndfl(s);
// это ВЫЗОВ функции printf() с тремя аргументами
// 1: "s = %.2f, nalog = %.2f"
// 2: s
// 3: nalog
printf("s = %.2f, nalog = %.2f", s, nalog);
// из main() возвращаем 0 – говорим ОС что у нас всё OK
return 0;
}
// это - ОПРЕДЕЛЕНИЕ функции ndfl(), получающей один аргумент типа float,
// и возвращающей результат типа float
float ndfl(float s) {
// возвращается результат, составляющий 13% от s
return s * 0.13;
}
Слайд 12

“Факториал” – что это такое Факториал натурального числа n определяется как

“Факториал” – что это такое

Факториал натурального числа n определяется как произведение

всех натуральных чисел от 1 до n включительно:
Факториал активно используется в различных разделах математики: комбинаторике, математическом анализе, теории чисел, функциональном анализе и др.
Факториал является чрезвычайно быстро растущей функцией.

Факториал -https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B0%D0%BB
Перестановка -
https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0

Слайд 13

Функция может иметь свои (локальные) переменные (1) #include // это -

Функция может иметь свои (локальные) переменные (1)

#include
// это - ОБЪЯВЛЕНИЕ

функции fuct(), получающей один аргумент типа int,
// и возвращающей результат типа long
long fuct(int n);
int main() {
// локальная (в main()) переменная num, тип int
int num;
printf("num = ");
scanf_s("%d", &num);
// локальная (в main()) переменная f, тип long
long f = fuct(num);
printf("num = %d, num! = %ld", num, f);
return 0;
}
Слайд 14

Функция может иметь свои (локальные) переменные (2) // это - ОПРЕДЕЛЕНИЕ

Функция может иметь свои (локальные) переменные (2)

// это - ОПРЕДЕЛЕНИЕ функции

fuct(), получающей один аргумент типа int,
// и возвращающей результат типа long
long fuct(int n) {
// локальная (в fuct()) переменная res, тип long
long res = 1;
// локальная (в fuct()) переменная i, тип int
int i = 1;
do {
res = res * i;
i = i + 1;
} while (i <= n);
return res;
}
Слайд 15

Можно использовать глобальные переменные (1) #include // Глобальная переменная - количество

Можно использовать глобальные переменные (1)

#include
// Глобальная переменная - количество звезд
int

numStars = 4;
// глобальная переменная - символ звездочки
char starSymbol = '*';
// это - ОБЪЯВЛЕНИЕ функции printStars(), не имеющей аргументов,
// и не возвращающей результата
void printStars();
// это - ОПРЕДЕЛЕНИЕ функции incStars(), не имеющей аргументов,
// и не возвращающей результата
void incStars() {
numStars++;
}
// это - ОПРЕДЕЛЕНИЕ функции decStars(), не имеющей аргументов,
// и не возвращающей результата
void decStars() {
numStars--;
}
Слайд 16

Можно использовать глобальные переменные (2) // это - ОПРЕДЕЛЕНИЕ функции main(),

Можно использовать глобальные переменные (2)

// это - ОПРЕДЕЛЕНИЕ функции main(), не

имеющей аргументов,
// и возвращающей результат типа int
int main() {
printStars();
incStars();
incStars();
printStars();
starSymbol = '.’;
printStars();
return 0;
}
// это - ОПРЕДЕЛЕНИЕ функции printStars(), не имеющей аргументов,
// и не возвращающей результата
void printStars() {
int i = 1;
do {
printf("%c", starSymbol);
i++;
} while (i <= numStars);
printf("\n");
}
Слайд 17

НЕЛЬЗЯ вкладывать функции друг в друга #include void a(); void main()

НЕЛЬЗЯ вкладывать функции друг в друга

#include
void a();
void main() {
printf("Hello! It

is main()!\n");
void a() {
printf("Hello! It is a()!\n");
}
a();
}
Слайд 18

Слайд 19

Используем функции в графике

Используем функции в графике

Слайд 20

Нарисуем ромб // Рисуем ромб MoveToEx(hdc, 80, 0, NULL); LineTo(hdc, 50,

Нарисуем ромб

// Рисуем ромб
MoveToEx(hdc, 80, 0, NULL);
LineTo(hdc, 50, 50);
LineTo(hdc, 80, 100);
LineTo(hdc,

110, 50);
LineTo(hdc, 80, 0);
Слайд 21

Ромб // Рисуем ромб MoveToEx(hdc, 80, 0, NULL); LineTo(hdc, 50, 50);

Ромб

// Рисуем ромб
MoveToEx(hdc, 80, 0, NULL);
LineTo(hdc, 50, 50);
LineTo(hdc, 80, 100);
LineTo(hdc, 110,

50);
LineTo(hdc, 80, 0);
Слайд 22

Ромб HPEN hPen; hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0)); SelectObject(hdc,

Ромб

HPEN hPen;
hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
SelectObject(hdc, hPen);
// Рисуем ромб
MoveToEx(hdc,

80, 0, NULL);
LineTo(hdc, 50, 50);
LineTo(hdc, 80, 100);
LineTo(hdc, 110, 50);
LineTo(hdc, 80, 0);
Слайд 23

Относительные координаты int x = 50; int y = 0; MoveToEx(hdc,

Относительные координаты

int x = 50;
int y = 0;
MoveToEx(hdc, x + 30,

y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);
Слайд 24

Относительные координаты int x = 50; int y = 0; MoveToEx(hdc,

Относительные координаты

int x = 50;
int y = 0;
MoveToEx(hdc, x + 30,

y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);
Слайд 25

Относительные координаты int x = 100; int y = 100; MoveToEx(hdc,

Относительные координаты

int x = 100;
int y = 100;
MoveToEx(hdc, x + 30,

y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);

int x = 150;
int y = 20;
MoveToEx(hdc, x + 30, y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);

Слайд 26

Относительные координаты int x = 100; int y = 100; MoveToEx(hdc,

Относительные координаты

int x = 100;
int y = 100;
MoveToEx(hdc, x + 30,

y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);

int x = 150;
int y = 20;
MoveToEx(hdc, x + 30, y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);

Слайд 27

Относительные координаты

Относительные координаты

Слайд 28

Отдельная функция для отрисовки ромба с заданным положением void Romb(HDC hdc,

Отдельная функция для отрисовки ромба с заданным положением

void Romb(HDC hdc, int

x, int y) {
MoveToEx(hdc, x + 30, y, NULL);
LineTo(hdc, x, y + 50);
LineTo(hdc, x + 30, y + 100);
LineTo(hdc, x + 60, y + 50);
LineTo(hdc, x + 30, y);
}

HDC hdc = BeginPaint(hWnd, &ps);
HPEN hPen;
hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
SelectObject(hdc, hPen);
Romb(hdc, 50, 0);

Слайд 29

Рисуем при помощи нашей функции несколько ромбов в ряд … HDC

Рисуем при помощи нашей функции несколько ромбов в ряд


HDC hdc =

BeginPaint(hWnd, &ps);
Romb(hdc, 10, 50);
Romb(hdc, 100, 50);
Romb(hdc, 190, 50);
Romb(hdc, 280, 50);

Слайд 30

Рисуем при помощи нашей функции несколько ромбов – используем цикл …

Рисуем при помощи нашей функции несколько ромбов – используем цикл


HPEN hPen;
hPen

= CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
SelectObject(hdc, hPen);
int x = 10;
int y = 50;
do {
Romb(hdc, x, y);
x += 90;
} while (x <= 280);

Слайд 31

Создаем функцию, вызывающую нашу функцию case WM_PAINT: { PAINTSTRUCT ps; HDC

Создаем функцию, вызывающую нашу функцию

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC

hdc = BeginPaint(hWnd, &ps);
// TODO: Добавьте сюда любой код прорисовки, использующий HDC...
drawRombLine(hdc);
EndPaint(hWnd, &ps);
}
break;

void drawRombLine(HDC hdc) {
HPEN hPen;
hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
SelectObject(hdc, hPen);
int x = 10;
int y = 50;
do {
Romb(hdc, x, y);
x += 90;
} while (x <= 280);
}

Слайд 32

Слайд 33

Лабораторная работа №8 Упаковываем в функции ранее написанный код

Лабораторная работа №8

Упаковываем в функции ранее написанный код

Слайд 34

Задача 1. Переделать задачу из ЛР1 Оформить информацию о себе в

Задача 1. Переделать задачу из ЛР1

Оформить информацию о себе в виде

функции aboutMe.
Из main() вызвать эту функцию.
Нарисовать блок-схему
Слайд 35

Задача 2. Переделать задачу из ЛР4 Код отрисовки дома перенести в

Задача 2. Переделать задачу из ЛР4

Код отрисовки дома перенести в функцию

drawHome()
Из функции WndProc организовать вызов drawHome() при необходимости обновления изображения – обработка события WM_PAINT:
Слайд 36

Задача 3. Переделать задачу из ЛР5 Код отрисовки автомобиля перенести в

Задача 3. Переделать задачу из ЛР5

Код отрисовки автомобиля перенести в функцию

drawCar()
Из функции WndProc организовать вызов drawCar() при необходимости обновления изображения – обработка события WM_PAINT:
Слайд 37

Задача 4*. Переделать задачу из ЛР7 Код отрисовки автомобиля перенести в

Задача 4*. Переделать задачу из ЛР7

Код отрисовки автомобиля перенести в функцию

drawTree()
Из функции WndProc организовать вызов drawTree() при необходимости обновления изображения – обработка события WM_PAINT:
Слайд 38

Домашнее задание по ЛР8 Доделать задачи 1-3. Все задания по отрисовке

Домашнее задание по ЛР8

Доделать задачи 1-3.
Все задания по отрисовке рисунков из

лабораторных работ 4, 5, 7 ранее сделанные вами, нужно оформить в виде функций. Для каждого изображения (мост, дом, машина, снеговик и т.п.) нужно создать отдельную функцию. Из имени функции должно быть понятно, что именно эта функция отрисовывает. Созданные функции вызываются из функции WndProc при необходимости обновления изображения – при обработке события WM_PAINT, как реализовано в задачах этой лабораторной работы.
Обязательно! Принести получившийся код на занятие. Его будем использовать и переделывать на следующих лабораторных работах.
Слайд 39

Слайд 40

Лабораторная работа №9 функций для рисования объектов по координатам

Лабораторная работа №9

функций для рисования объектов по координатам

Слайд 41

Автомобиль деда Мороза - логотип

Автомобиль деда Мороза - логотип

Слайд 42

Вынесли код в отдельную функцию void StClausAuto(HDC hdc) { // верхний

Вынесли код в отдельную функцию

void StClausAuto(HDC hdc) {
// верхний треугольник
MoveToEx(hdc, 20,

0, NULL);
LineTo(hdc, 30, 20);
LineTo(hdc, 10, 20);
LineTo(hdc, 20, 0);
// средний треугольник
MoveToEx(hdc, 20, 10, NULL);
LineTo(hdc, 30, 40);
LineTo(hdc, 10, 40);
LineTo(hdc, 20, 10);
// нижний треугольник
MoveToEx(hdc, 20, 30, NULL);
LineTo(hdc, 40, 80);
LineTo(hdc, 0, 80);
LineTo(hdc, 20, 30);
}

Слайд 43

Относительные координаты

Относительные координаты

Слайд 44

Задача 1 Елочка (Логотип авто Деда Мороза) в виде функции с

Задача 1 Елочка (Логотип авто Деда Мороза) в виде функции с

параметрами x, y

Сделать функцию
void StClausAuto(HDC hdc, int x, int y) { … }
и используя её нарисовать из елочек узоры по следующим схемам

Слайд 45

Относительные координаты

Относительные координаты

Слайд 46

Задача 1.1: 5 логотипов по углам и в центре

Задача 1.1: 5 логотипов по углам и в центре

Слайд 47

Задача 1.2: 8 логотипов в горизонтальную линию Решение

Задача 1.2: 8 логотипов в горизонтальную линию Решение

Слайд 48

Задача 1.3 - РЕШЕНИЕ: 4 логотипа в вертикальную линию

Задача 1.3 - РЕШЕНИЕ: 4 логотипа в вертикальную линию

Слайд 49

Задача 1.4: 4 логотипа в диагональную линию

Задача 1.4: 4 логотипа в диагональную линию

Слайд 50

Слайд 51

Грузовой автомобиль - расчеты

Грузовой автомобиль - расчеты

Слайд 52

Задача 2.1 Создать функцию drawTruck для рисования грузового автомобиля Сделать функцию

Задача 2.1 Создать функцию drawTruck для рисования грузового автомобиля

Сделать функцию drawTruck(HDC

hdc, int x, int y) { … }
и используя ее нарисовать несколько грузовиков
Слайд 53

Задача 2.2: 5 автомобилей по углам и в центре Сделать функцию

Задача 2.2: 5 автомобилей по углам и в центре

Сделать функцию drawTrucks1(HDC

hdc) которая рисует грузовики по следующей схеме:
Слайд 54

Задача 2.3 – 2.5– Создать 3 рисунка из грузовиков Сделать функции

Задача 2.3 – 2.5– Создать 3 рисунка из грузовиков

Сделать функции
drawTrucks2(HDC

hdc)
drawTrucks3(HDC hdc)
drawTrucks4(HDC hdc)
которые создают рисунки из грузовиков по следующим схемам:
Слайд 55

Слайд 56

Задача 3*. Снежная баба в виде функции с параметрами x, y

Задача 3*. Снежная баба в виде функции с параметрами x, y

Сделать

функцию
void SnowWoman(HDC hdc, int x, int y) { … }
и используя её нарисовать узоры по следующим схемам
Слайд 57

Задача 3.1* – Создать картинку по образцу

Задача 3.1* – Создать картинку по образцу

Слайд 58

Задача 3.2* – Создать функцию SnowWoman

Задача 3.2* – Создать функцию SnowWoman

Слайд 59

Задача 3.3* – 3.6* – Создать 4 рисунков из снежных баб

Задача 3.3* – 3.6* – Создать 4 рисунков из снежных баб

Рекомендуется

для отрисовки каждого из рисунков создать отдельную функцию. Рекомендованные имена:
drawSnowWomen1(HDC hdc)
drawSnowWomen2(HDC hdc)
drawSnowWomen3(HDC hdc)
drawSnowWomen4(HDC hdc)
Слайд 60

Домашнее задание ЛР9 Доделать рисунки из Задач 1 и 2, которые

Домашнее задание ЛР9

Доделать рисунки из Задач 1 и 2, которые не

успели сделать на занятии в классе.
Создать в виде отдельной функции логотип любого автомобиля. Созданная функция должна иметь вид Logo(HDC hdc, int x, int y) . При этом сделать логотип такого размера, чтобы он вмещался по высоте окна не меньше 4 раз, по ширине не меньше 6 раз
Используя эту функцию создать узоры из логотипов по следующим 4 схемам:
Для последнего узора нарисовать блок-схему алгоритма.
Слайд 61

ЛР9 – оформление Для сдачи работы нужно иметь: 1) код программы

ЛР9 – оформление

Для сдачи работы нужно иметь:
1) код программы (с собой)
2)

Расчет картинки – на бумаге (на отдельном листе или в тетради) или в файле с видимыми признаками расчетов
4) Блоксхема для одного из рисунков, где используется циклический алгоритм
Срок выполнения – до следующей встречи на лабораторной работе
Если болел/не мог – это становится «долгом»
Слайд 62

Слайд 63

ИТОГО по лекции 5 Узнали как объявляются и определяются функции Узнали

ИТОГО по лекции 5

Узнали как объявляются и определяются функции
Узнали как вернуть

значение из функции
Узнали как передать значение в функцию
Узнали как создать функцию для отрисовки изображений
Узнали как создать функцию для отрисовки изображений по координатам