Основы программирования

Содержание

Слайд 2

Слайд 3

Одномерный массив в Си Повторение

Одномерный массив в Си Повторение

Слайд 4

Какие типы есть в Си?

Какие типы есть в Си?

Слайд 5

Оперативная память во время работы компьютера

Оперативная память во время работы компьютера

Слайд 6

Оперативная память доступная программе

Оперативная память доступная программе

Слайд 7

Размещение переменных в оперативной памяти * ОБЫЧНО адреса в памяти отображаются в 16СС

Размещение переменных в оперативной памяти

* ОБЫЧНО адреса в памяти отображаются в

16СС
Слайд 8

Массивы – пример 1 #include void main() { printf("main() start!\n"); int

Массивы – пример 1

#include
void main() {
printf("main() start!\n");
int a[4];
a[0] = 1;
a[1]

= 10;
a[2] = 100;
a[3] = 1000;
printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
int b[5] = {2, 20, 200, 2000, 20000};
printf("%d %d %d %d %d\n", b[0], b[1], b[2], b[3], b[4]);
printf("main() finish!\n");
}
Слайд 9

Массивы – пример 2 #include void main() { printf("main() start!\n"); int

Массивы – пример 2

#include
void main() {
printf("main() start!\n");
int a[4];
a[0] = 1;
a[1]

= 10;
a[2] = 100;
a[3] = 1000;
int i;
i = 0;
while (i < 4) {
printf("%d ", a[i]);
i++;
}
printf("\n");
int b[5] = {2, 20, 200, 2000, 20000};
i = 0;
while (i < 5) {
printf("%d ", b[i]);
i++;
}
printf("\n");
printf("main() finish!\n");
}
Слайд 10

Массивы&Структуры – размещение в памяти HBRUSH hBrush = CreateHatchBrush(HS_CROSS, RGB(128, 0,

Массивы&Структуры – размещение в памяти

HBRUSH hBrush = CreateHatchBrush(HS_CROSS, RGB(128, 0, 128));
SelectObject(hdc,

hBrush);
Ellipse(hdc, 0, 0 , 160, 120);
HBRUSH hBrush2 = CreateHatchBrush(HS_DIAGCROSS, RGB(128, 0, 128));
SelectObject(hdc, hBrush2);
POINT pt[5];
pt[0].x = 100;
pt[0].y = 50;
pt[1].x = 150;
pt[1].y = 100;
pt[2].x = 150;
pt[2].y = 150;
pt[3].x = 50;
pt[3].y = 150;
pt[4].x = 50;
pt[4].y = 100;
Polygon(hdc, pt, 5);
Слайд 11

Слайд 12

Одномерный массив в Си Некоторые операции

Одномерный массив в Си Некоторые операции

Слайд 13

Вывод элементов массива #include #define NUM_ELEMENTS 10 int arr[NUM_ELEMENTS]; void printAllElements()

Вывод элементов массива

#include
#define NUM_ELEMENTS 10
int arr[NUM_ELEMENTS];
void printAllElements() {
int i =

0;
while (i < NUM_ELEMENTS) {
printf("%d ", arr[i]);
i++;
}
printf("\n");
}
void main() {
printAllElements();
}
Слайд 14

Заполнение значениями i * 10 void fillIx10() { int i =

Заполнение значениями i * 10

void fillIx10() {
int i = 0;
while (i

< NUM_ELEMENTS) {
arr[i] = i * 10;
i++;
}
}
void main() {
fillIx10();
printAllElements();
}
Слайд 15

Заполнение значениями 0 void fillZero() { int i = 0; while

Заполнение значениями 0

void fillZero() {
int i = 0;
while (i < NUM_ELEMENTS)

{
arr[i] = 0;
i++;
}
}
void main() {
fillIx10();
printAllElements();
fillZero();
printAllElements();
}
Слайд 16

Заполнение случайными значениями void randFill0_9() { int i = 0; while

Заполнение случайными значениями

void randFill0_9() {
int i = 0;
while (i < NUM_ELEMENTS)

{
arr[i] = rand() % 10;
i++;
}
}
void main() {
randFill0_9();
printAllElements();
randFill0_9();
printAllElements();
randFill0_9();
printAllElements();
}
Слайд 17

Заполнение случайными значениями (FOR) void randFill0_9_for() { for (int i =

Заполнение случайными значениями (FOR)

void randFill0_9_for() {
for (int i = 0; i

< NUM_ELEMENTS; i++) {
arr[i] = rand() % 10;
}
}
void main() {
randFill0_9();
printAllElements();
randFill0_9_for();
printAllElements();
randFill0_9();
printAllElements();
}
Слайд 18

FOR

FOR

Слайд 19

Цикл с предусловием while while (Условие) { Действие; }

Цикл с предусловием while

while (Условие) {
Действие;
}

Слайд 20

Цикл for int j = i; // инициализация счетчика цикла while

Цикл for

int j = i; // инициализация счетчика цикла
while (j <=

5) { // условие продолжения цикла
printf(“%d “, j);
j++; // изменение счетчика цикла
}
Слайд 21

Цикл for (2) for (int j = i; j printf(“%d “, j); }

Цикл for (2)

for (int j = i; j <= 5; j++)

{
printf(“%d “, j);
}
Слайд 22

Цикл for – рисуем блок-схему! f = 1; for (i =

Цикл for – рисуем блок-схему!

f = 1;
for (i = 1; i

<= n; i++) {
f = f * i;
}
Слайд 23

Цикл for – рисуем блок-схему и трассируем! f = 1; for

Цикл for – рисуем блок-схему и трассируем!

f = 1;
for (i =

1; i <= n; i++) {
f = f * i;
}
f = 1;
i = 1;
while (i <= n) {
f = f * i;
i++;
}
Слайд 24

Какие варианты являются синтаксически некорректными? for (;;) {printf("Hi");} for (i=0;;) {printf("Hi");}

Какие варианты являются синтаксически некорректными?

for (;;) {printf("Hi");}
for (i=0;;) {printf("Hi");}
for (;ifor

(;;i++) {printf("Hi");}
for (i=0;;i++) {printf("Hi");}
for (;ifor (i=0;ifor (i=0,j=10;ifor (i=0,j=10;ifor (i = 0, j = 10, printf("Ups"); i < j; i++, j--, printf("Hi"));
for (;;);
Слайд 25

Слайд 26

Лабораторная работа №16 Простейшие операции с одномерным массивом

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

Простейшие операции с одномерным массивом

Слайд 27

Задача 1. Создать консольное меню Создать меню, при помощи которого можно

Задача 1. Создать консольное меню

Создать меню, при помощи которого можно выбирать

операции над массивом.

void main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int item;
do {
printf("\n");
printf("==============================\n");
printf("Выберите нужную вам операцию:\n");
printf("0: вывести весь массив\n");
printf("1: заполнить массив нулями\n");
printf("2: заполнить массив I x 10\n");
printf("3: заполнить массив случайными числами (от 0 до 9)\n");
printf("\n");
printf("-1: Выйти из программы\n");
printf("Выбранная операция >>>>>> ");
scanf_s("%d", &item);

Слайд 28

Задача 1. Создать консольное меню (2) Соберите все ранее разобранные в

Задача 1. Создать консольное меню (2)

Соберите все ранее разобранные в лекции

операции над массивом в единый код.
switch (item) {
case 0:
printAllElements();
break;
case 1:
fillZero();
break;
case 2:
fillIx10();
break;
case 3:
randFill0_9();
break;
}
} while (item != -1);
}
Слайд 29

Задача 2. Добавить операцию «найти минимум» В созданную программу добавить код,

Задача 2. Добавить операцию «найти минимум»

В созданную программу добавить код, который

позволяет выполнить операцию «Найти и вывести минимальный элемент»

void printMinElement() {
int min = arr[0];
int i = 1;
while (i < NUM_ELEMENTS) {
if (arr[i] < min) {
min = arr[i];
}
i++;
}
printf("min = %d", min);
}

Слайд 30

Задача 3. Добавить операцию «найти максимум» В созданную программу добавить код,

Задача 3. Добавить операцию «найти максимум»

В созданную программу добавить код, который

позволяет выполнить операцию «Найти и вывести максимальный элемент»
Слайд 31

Задача 4. Добавить операцию X10 В созданную программу добавить код, который

Задача 4. Добавить операцию X10

В созданную программу добавить код, который

позволяет выполнить операцию «Увеличить в 10 раз все элементы стоящие правее минимального»
Слайд 32

Задача 5. Добавить операцию X2 В созданную программу добавить код, который

Задача 5. Добавить операцию X2

В созданную программу добавить код, который

позволяет выполнить операцию «Увеличить в 2 раза все элементы стоящие левее максимального»
Слайд 33

Домашнее задание по ЛР16 Доделать задачи 1-5. Реализовать операцию «Все четные

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

Доделать задачи 1-5.
Реализовать операцию «Все четные элементы массива

умножить на -1»
Реализовать операцию «Все элементы массива имеющие значения меньше 4 заменить на 4»
Подсчитать и вывести сколько в массиве четных элементов.
* Реализовать операцию «Все элементы стоящие между максимальным и минимальным увеличить в 10 раз»
** Реализовать операцию «Все элементы между первым и последним четным увеличить в 100 раз»
ОТЧЕТ
На занятие нужно принести код.
И для одной из операций, реализованной через FOR, нужно принести блок-схему.
Слайд 34

ИТОГО по ЛР16 Познакомились с FOR Познакомились с несколькими операциями над массивами

ИТОГО по ЛР16

Познакомились с FOR
Познакомились с несколькими операциями над массивами

Слайд 35

Слайд 36

Слайд 37

Одномерный массив в Си Выборочное использование элементов

Одномерный массив в Си Выборочное использование элементов

Слайд 38

Массив грибов // Координаты грибов // количество грибов #define NUM_MUSHROOMS 12

Массив грибов

// Координаты грибов
// количество грибов
#define NUM_MUSHROOMS 12
// координата Х каждого

гриба
int MushroomX[NUM_MUSHROOMS] = { 200, 220, 240, 260, 300, 400, 420, 440,
460, 480, 500, 520 };
// координата Y каждого гриба
int MushroomY[NUM_MUSHROOMS] = { 400, 350, 300, 250, 300, 200, 100, 200,
100, 140, 120, 100 };
// виден ли гриб? (для каждого гриба!)
int MushroomVisible[NUM_MUSHROOMS] = { 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1 };

В игре нужно собрать все грибы. В массивах MushroomX и MushroomY хранятся координаты каждого гриба. В массиве MushroomVisible хранится признак – «виден» / «не виден».

Слайд 39

Массив грибов (2) void DrawMushroom(HDC hdc, int cx, int cy) {

Массив грибов (2)

void DrawMushroom(HDC hdc, int cx, int cy) {
const int

dx = -170, dy=-35;
// Гриб
// Шляпка гриба
HPEN hPenMushroom1 = CreatePen(PS_SOLID, 3, RGB(136, 0, 21));
SelectObject(hdc, hPenMushroom1);
Chord(hdc, 155 + dx + cx, 20 + dy + cy, 185 + dx + cx, 50 + dy + cy,
185 + dx + cx, 35 + dy + cy, 155 + dx + cx, 35 + dy + cy);
DeleteObject(hPenMushroom1);
// Ножка гриба
HPEN hPenMushroom2 = CreatePen(PS_SOLID, 3, RGB(127, 127, 127));
SelectObject(hdc, hPenMushroom2);
Rectangle(hdc, 165 + dx + cx, 35 + dy + cy, 175 +dx + cx, 50 + dy + cy);
DeleteObject(hPenMushroom2);
//Rectangle(hdc, cx - 20, cy - 20, cx + 20, cy + 20);
}

Функция для отрисовки одного гриба по координатам cx, cy

Слайд 40

Массив грибов (3) // Отрисовка всех видимых грибов void DrawMushrooms(HDC hdc)

Массив грибов (3)

// Отрисовка всех видимых грибов
void DrawMushrooms(HDC hdc) {
int i

= 0;
do {
// если i гриб виден (не съеден)
if (MushroomVisible[i]) {
// отрисовываем i гриб
DrawMushroom(hdc, MushroomX[i], MushroomY[i]);
}
++i;
} while (i < NUM_MUSHROOMS);
}

Отрисовка всех видимых грибов

Слайд 41

Массив грибов (4) case WM_PAINT: { PAINTSTRUCT ps; HDC hdc =

Массив грибов (4)

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Добавьте

сюда любой код прорисовки, использующий HDC...
DrawMushrooms(hdc);
DrawKnife(hdc, 140, 85);
DrawKnife(hdc, 180, 85);
DrawKnife(hdc, 180, 285);
DrawApples(hdc);
DrawHedgehog(hdc, HedgehogX, HedgehogY);
DrawFox(hdc, FoxX, FoxY);
EndPaint(hWnd, &ps);
}
break;

Вызов отрисовки грибов

Слайд 42

Массив грибов (5) // подсчитать количество видимых (не съеденных) грибов int

Массив грибов (5)

// подсчитать количество видимых (не съеденных) грибов
int CountVisibleMushrooms() {
//

счетчик видимых грибов
int count = 0;
int i = 0;
do {
// если i гриб видим - счетчик увеливаем на 1
if (MushroomVisible[i]) {
++count;
}
++i;
} while (i < NUM_MUSHROOMS);
// возвращаем количество видимых (не съеденных) грибов
return count;
}

Подсчет видимых (еще несъеденных) грибов

Слайд 43

Массив грибов (6) // пытаемся съесть гриб void TryToEatMushroom() { //

Массив грибов (6)

// пытаемся съесть гриб
void TryToEatMushroom() {
// пробегаем по всем

грибам
int i = 0;
do {
// если i гриб виден
if (MushroomVisible[i]) {
// если ежик может съесть i гриб
if (HedgehogX - 20 < MushroomX[i]
&& HedgehogX + 20 > MushroomX[i]
&& HedgehogY - 20 < MushroomY[i]
&& HedgehogY + 20 > MushroomY[i]) {
// i гриб делаем невидимым - его съели!!!
MushroomVisible[i] = 0;
}
}
// переходим к следующему грибу
++i;
} while (i < NUM_MUSHROOMS); // цикл завершаем после обхода
// всех NUM_MUSHROOMS грибов!!!
}

Попытка съесть гриб

Слайд 44

Массив грибов (7) // Сообщение "Клавишу нажали" case WM_KEYDOWN: switch (wParam)

Массив грибов (7)

// Сообщение "Клавишу нажали"
case WM_KEYDOWN:
switch (wParam)
{
case VK_UP:
HedgehogY -= 10;
InvalidateRect(hWnd,

NULL, TRUE);
break;
case VK_DOWN:
HedgehogY += 10;
InvalidateRect(hWnd, NULL, TRUE);
break;
}
TryToEatMushroom();
if (CountVisibleMushrooms() == 0) {
PostQuitMessage(0);
}
TryToEatApple();
break;

Попытка съесть гриб и проверка - все ли грибы съедены?

Слайд 45

Одномерный массив в Си «Массив переменной длины»

Одномерный массив в Си «Массив переменной длины»

Слайд 46

Как в Си сделать массив «переменной длины»? #include #include #define NUM_ELEMENTS

Как в Си сделать массив «переменной длины»?

#include
#include
#define NUM_ELEMENTS

10
int arr[NUM_ELEMENTS];
int n = 0;
void printElements() {
printf("< ");
int i = 0;
while (i < n) {
printf("%d ", arr[i]);
i++;
}
printf(">\n");
}

Создается массив длиной NUM_ELEMENTS элементов. И создается переменная n в которой хранится количество используемых элементов.
И! Все операции выполняются не для всех NUM_ELEMENTS, а только для первых n элементов массива!

Слайд 47

Какие новые операции появляются? void addRand0_10() { if (n arr[n++] =

Какие новые операции появляются?

void addRand0_10() {
if (n < NUM_ELEMENTS) {
arr[n++] =

rand() % 11;
}
}
void main() {
printElements();
addRand0_10();
printElements();
addRand0_10();
printElements();
addRand0_10();
printElements();
}

Если количество элементов может изменяться, то добавляются операции ДОБАВЛЕНИЯ и УДАЛЕНИЯ элементов.

Слайд 48

Какие новые операции появляются? (2) void deleteElement(int delIndex) { if (delIndex

Какие новые операции появляются? (2)

void deleteElement(int delIndex) {
if (delIndex >= 0

&& delIndex < n) {
for (int i = delIndex; i < n - 1; i++) {
arr[i] = arr[i + 1];
}
n--;
}
}
void main() {
printElements();
addRand0_10();
printElements();
addRand0_10();
printElements();
addRand0_10();
printElements();
deleteElement(1);
printElements();
deleteElement(1);
printElements();
}

Если количество элементов может изменяться, то добавляются операции ДОБАВЛЕНИЯ и УДАЛЕНИЯ элементов.

Слайд 49

Ввод массива с клавиатуры void keyboardInput() { int newN; printf("newN =

Ввод массива с клавиатуры

void keyboardInput() {
int newN;
printf("newN = ");
scanf_s("%d", &newN);
if (newN

>= 1 && newN <= NUM_ELEMENTS) {
n = newN;
printf("Введите %d целых чисел: ", n);
for (int i = 0; i < n; i++) {
scanf_s("%d", &arr[i]);
}
} else {
printf("newN имеет некорректное значение");
}
}
void main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
printElements();
keyboardInput();
printElements();
addRand0_10();
printElements();
}

Иногда нужно значения элементов массива ввести через клавиатуру.

Слайд 50

Сортировка массива (Метод Выбора) void selectionSort() { for (int j =

Сортировка массива (Метод Выбора)

void selectionSort() {
for (int j = 0; j

< n - 1; j++) {
int min = arr[j];
int iMin = j;
for (int i = j + 1; i < n; i++) {
if (arr[i] < min) {
min = arr[i];
iMin = i;
}
}
int tmp = arr[iMin];
arr[iMin] = arr[j];
arr[j] = tmp;
}
}

Часто в массиве хранят упорядоченную информацию. Чтобы элементы расставить по порядку их значений используют сортировку массива.

void main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
printElements();
keyboardInput();
printElements();
selectionSort();
printElements();
}

Слайд 51

Слайд 52

Лабораторная работа №17 «Массив переменной длины»

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

«Массив переменной длины»

Слайд 53

Задача 1. Создать консольное меню Создать меню, при помощи которого можно

Задача 1. Создать консольное меню

Создать меню, при помощи которого можно выбирать

операции над массивом переменной длины.

void main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int item = -1;
do {
printf("\n");
printf("==============================\n");
printf("Выберите нужную вам операцию:\n");
printf("0: вывести массив\n");
printf("1: ввести массив с клавиатуры\n");
printf("2: в конец вставить случайное число (от 0 до 10)\n");
printf("3: удалить заданный элемент\n");
printf("4: отсортировать массив\n");
printf("\n");
printf("-1: Выйти из программы\n");
printf("Выбранная операция >>>>>> ");
scanf_s("%d", &item);

Слайд 54

Задача 1. Создать консольное меню (2) Соберите все ранее разобранные в

Задача 1. Создать консольное меню (2)

Соберите все ранее разобранные в лекции

операции над массивом переменной длины в единый код.

switch (item) {
case 0:
printElements();
break;
case 1:
keyboardInput();
break;
case 2:
addRand0_10();
break;
case 3:
{
int index;
printf("Индекс элемента, который нужно удалить: ");
scanf_s("%d", &index);
deleteElement(index);
}
break;
case 4:
selectionSort();
break;
}
} while (item != -1);
}

Слайд 55

Задача 2. «Все нечетные увеличить в 10 раз» В созданную программу

Задача 2. «Все нечетные увеличить в 10 раз»

В созданную программу добавить

код, который позволяет выполнить операцию «Все элементы, имеющие нечетное значение, увеличить в 10 раз»
Слайд 56

Задача 3. «Все четные увеличить в 100 раз» В созданную программу

Задача 3. «Все четные увеличить в 100 раз»

В созданную программу добавить

код, который позволяет выполнить операцию «Все элементы, имеющие четное значение, увеличить в 100 раз»
Слайд 57

Задача 4*. «Удалить минимальный элемент» В созданную программу добавить код, который

Задача 4*. «Удалить минимальный элемент»

В созданную программу добавить код, который позволяет

выполнить операцию «Найти и удалить минимальный элемент»
Слайд 58

Домашнее задание по ЛР17 Доделать задачи 1-3. Реализовать операцию «Удалить из

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

Доделать задачи 1-3.
Реализовать операцию «Удалить из массива максимальный

элемент»
Реализовать операцию «Добавить в конец элемент равный минимальному»
* Реализовать операцию «Удалить из массива все элементы, значение которых меньше 4»
** Реализовать операцию «Вставить в отсортированный массив новый элемент, сохраняя упорядоченность элементов»
ОТЧЕТ
На занятие нужно принести код.
И для двух из операций, реализованных через FOR, нужно принести блок-схему.
Слайд 59

ИТОГО по ЛР17 Познакомились с FOR Познакомились с несколькими операциями над массивами

ИТОГО по ЛР17

Познакомились с FOR
Познакомились с несколькими операциями над массивами

Слайд 60