Тема: Разработка
программ с использованием циклических конструкций на языке С++.
Цель занятия:
Дать представление о способах записи циклических
операторов в среде программирования языка С. Рассмотреть основные методы и
средства использования различных видов циклов при решении задач по
программированию.
Задачи:
- обучающие – повторить,
закрепить и углубить знания студентов (работа в среда программирования C++Builder.)
- развивающие – сформировать
навыки по практическому решению поставленных задач;
- воспитывающие – развитие
внимательности, практичности.
Тип занятия:
комбинированное
Программное
обеспечение:
среда программирования C++Builder.
Формы организации
работы на занятие: работа в микро-группах.
Учащиеся должны
знать
основные понятия:
- алгоритмы;
- условный оператор;
- циклические конструкции;
- математические функции;
- структура программы;
Учащиеся должны
уметь:
- определять циклическую
конструкцию для определённой задачи программирования ;
- разрабатывать алгоритм с
применение циклов;
- реализовать полученный
алгоритм в программном коде.
- сохранять проект;
- выполнять компиляцию проекта;
Литература.
1. Шилдт
Г. С++: базовый курс, 3-е издание.: Пер. с англ.-М. : Издательский дом
"Вильямс", 2010-330с.
|
2. Архангельский
А. Я. Програмирование в C++ Builder - М. : "Издательство Бином",
2003 – 1340 с.
|
3. Деннис
Ритчи. Язык программирования C. 2-е издание, переработанное и дополненное
Пер. с англ.-М. : Издательский дом "Вильямс", 2009 – 560 с.
|
4. Керниган
Б. Язык программирования Си - Питер. Невский Диалект, 2009 – 278 с.
5. Вильямс
А. Системное программирование в Windows 2000 для профессионалов - СПб: Питер,
2003. - 624 с.: ил.
6. Юркин А.
Задачник по программированию. — СПб.: Питер, 2002. — 192 с.
|
Методы и
приёмы: пояснительно-иллюстративные,
практического обучения
Оборудование и
наглядные пособия: файлы-заготовки кода, проектор с выводом на экран
файла примера готовой программы.
План занятия
№
|
Этап
|
Мин.
|
1
|
Организационный момент
|
2
|
2
|
Сообщение
темы и цели занятия.
|
3
|
3
|
Актуализация
опорных знаний и навыков.
|
10
|
4
|
Мотивация
учебной деятельности.
|
2
|
5.
|
Изучение нового материала
|
20
|
6.
|
Закрепление
нового материала. Выполнение практического
задания
“Разработка программного кода ”
|
33
|
7.
|
Подведение итогов занятия
|
10
|
Содержание
занятия
1.
Организационный
момент.
2.
Сообщение
темы и цели занятия.
Сегодня
на занятии познакомимся с применением циклических конструкций. И начнем наше
занятие с старой русской загадки про купца.
Некто
продавал коня и просил за него 1000 рублей. Купец сказал, что за коня запрошена
слишком большая цена. "Хорошо, - ответил продавец, - если ты говоришь, что
конь дорого стоит, то возьми его себе даром, а заплати только за его гвозди в
подковах. А гвоздей во всякой подкове по 6 штук. И будешь ты мне за них платить
таким образом: за первый гвоздь копейку, за второй гвоздь заплатишь две, за
третий гвоздь - четыре, и так далее за все гвозди: за каждый в два раза больше,
чем за предыдущий". Купец же, думая, что заплатит намного меньше, чем 1000
рублей, согласился. Проторговался ли купец?
Давайте
посмотрим сколько человек считает, что купец сделал правильно, поднимите руки,
а сколько нет. Хорошо, а решение этой задачки узнаем чуть позже.
И
для начала проведем небольшой тест, чтобы повторить те знания что мы получили
на прошлых занятиях.
3.Актулизация
опорных знаний и навыков.
Пройдем небольшой тест. На выполнения задания
отводится 10 минут. За выполнение второго задания получаете 5 балов за все
остальные по балу.
9 балов – 5«отлично»
7 балов – 4 «хорошо»
5 балов – 3 «плохо»
Задание
1. Задание
1. Расставить правильно блоки
1. Даны два числа А и В вывести на экран максимальное
Ответ 1а, 2г, 3ж, 4в, 5е, 6д, 7б.
2. Проверить если число А четное, то увеличить его на
2, если нет то на 3
Ответ 1б, 2г, 3ж, 4в, 5е, 6д, 7а.
Задание
2. Задание
2. Расставить строки кода в правильном порядке
1.
Решить
в целых числах уравнение ax + b = 0. Вводятся 2 числа: a и b. Необходимо
вывести все решения, если их число конечно, “NO” (без кавычек), если решений
нет, и “INF” (без кавычек), если решений бесконечно много.
Ответ 5, 8, 1, 9, 2, 10, 7, 3, 4, 6, 11, 12
2.
Решить
в целых числах уравнение ( ax + b ) : ( cx + d ) = 0. Вводятся 4 числа: a, b, c
и d; c и d не равны нулю одновременно. Необходимо вывести все решения, если их
число конечно, “NO” (без кавычек), если решений нет, и “INF” (без кавычек),
если решений бесконечно много.
Ответ 5, 1, 8, 4, 2, 10, 9, 12, 7, 6, 11, 3
Задание 3. Указать строки кода в которых допущены
ошибки
1. Требуется
определить, бьет ли конь, стоящий на клетке с указанными координатами (номер
строки и номер столбца), фигуру, стоящую на другой указанной клетке. Вводятся
четыре числа: координаты коня и координаты другой фигуры.
1. #inclade <iostream.h>
2. void
main()
3. {
4. int x1,y1,x2,y2;
5. cin>>x1>>y1>>x2>>y3;
6. int dx = x1 - x2;
7. int dy = y1 - y2;
8. if (dx < 0) then dx = -dx;
9. if (dy < 0) dy
= -dy;
10. if ((dx+dy)=3
&& dx!=0 && dy!=0)
11. cout<<"YES";
12. else
13. cout<<"NO";
14. {
Ответ 1, 5, 8,10,14
2. Требуется
определить, бьет ли ферзь, стоящий на клетке с указанными координатами (номер
строки и номер столбца), фигуру, стоящую на другой указанной клетке. Вводятся
четыре числа: координаты ферзя и координаты другой фигуры.
1. #include
<iostream.h>
2. voеd main()
3. {
4. int
x1,y1,x2,y2;
5. cin>>x1>>y1>>x2>>y2;
6.
int dx=x1-x2
7. int
dy==y1-y2;
8. if
(dx<0) dx=-dx;
9.
if dy<0 dy=-dy;
10. if(x1==x2 ||
y1==y2 || dx==dy)
11. cout<<"YES";
12. else
13. cout>>"NO";
14. }
Ответ 2, 6, 7,9,13
4.
Мотивация учебной деятельности.
В
жизни мы уже не раз с вами сталкивались с таким понятием как цикл, например
цикл смены времен года, жизненный цикл или производственный цикл. Иногда мы
даже и не замечаем что выполняем цикличные действия.
На
физкультуре, тренер задает побежать еще десять кругов.
На
отработках, будете копать пока солнце не сядет
Или
дома, будильник будет звенеть до тех по пока не нажмешь на кнопку.
Все
это примеры циклов.
1. Изучение
нового материала
Так что же
такое цикл.
2. Закрепление
нового материала. Выполнение практического задания “Разработка программного
кода ”
Расположим
необходимые компоненты на форме
Изменим свойства некоторых
компонентов
Button1:
Caption: "Старт"
PaintBox1:
Height: 345
Width: 193
PaintBox2:
Height: 345
Width: 193
Timer1:
Enabled: false
Interval: 10
Теперь рассмотрим код программы я разбил
код программы на смысловые блоки ваша задача собрать из данных блоков исходный
код.
7
|
1.
|
void
FirePointClass::Evolution()
|
2
|
2.
|
const
int N = 5000; //Число "искр"
|
5
|
3.
|
void
FirePointClass::Activate()
|
6
|
4.
|
{
Randomize();
//Обеспечиваем случайность "случайных чисел"
X = random(11) -
5; Y = 0;
//Задаем начальные координаты
Vx = 100.0
- random(200);
//Задаем начальную скорость
Vy = random(100);
FirePointColor = 0x000000FF;
//Вначале искра красного цвета
ColorChange = -0x00000001;
//Устанавливаем шаг изменения цвета
}
|
4
|
5.
|
{
public:
void
Activate(); //Функция, активирующая заново прогоревшую "искру"
void
Evolution(); //Изменения свойств при каждом срабатывании таймера
void
Drawing(); //Функция рисования "искры"
bool
IsBurning(); //Не прогорела ли еще "искра"
protect:
int
ColorChange; //Величина изменения цвета искры за один шаг
double
X, Y; //Координаты
double
Vx, Vy; //Компоненты скорости
int
FirePointColor; //Текущий цвет
}
|
8
|
6.
|
{
X
+= 0.01 * Vx; //Смещаем искру
Y
-= 0.01 * Vy;
if
(abs(Vx) >= 0.1) //Если горизонтальная скорость больше нуля
Vx
-= 1 * (Vx / fabs(Vx)); //Уменьшаем ее из-за "сопротивления
воздуха"
Vy
+= 0.5; //На искру действует "подъемная сила"
FirePointColor
+= ColorChange; //Уменьшаем яркость
}
|
10
|
7.
|
{
int
XX = (Form1 -> PaintBox1 -> Width) / 2; //Координаты точки отсчета
int YY = (Form1
-> PaintBox1 -> Height) - 20;
Form1
-> PaintBox1 -> Canvas -> Pixels[XX + XX][YY + YY] =
TColor(FirePointColor);
//Рисуем
искру в виде точки
}
|
11
|
8.
|
bool
FirePointClass::IsBurning()
|
3
|
9.
|
class
FirePointClass //Класс "искр" (конструктор не требуется, т.к. при
каждой
//активации
"искры" свойствам заново присваиваются новые начальные значения)
|
16
|
10.
|
n
= 0; //Изначально нет ни одной горящей искры
Timer1
-> Enabled = false; //Запускаем таймер
}
|
9
|
11.
|
void
FirePointClass::Drawing()
|
13
|
12.
|
FirePointClass
FirePoint[N]; //Объявляем массив искр
|
17
|
13.
|
void
__fastcall TForm1::Timer1Timer(TObject *Sender)
|
1
|
14.
|
#include
<math> //Подключаем математическую библиотеку
|
14
|
15.
|
int
n; //Число уже горящих искр (для постепенного разгорания пламени)
|
18
|
16.
|
{
TRect Rect =
TRect(0, 0, PaintBox1 -> Width, PaintBox1 -> Height);
//Прямоугольник, закрывающий весь PaintBox
PaintBox1 ->
Canvas -> Brush -> Color = clBlack; //Устанавливаем цвет кисти
PaintBox1
-> Canvas -> FillRect(Rect); //И заливаем этим цветом изображение
for (int
i = 0; i <= n; i++) //Для всех уже горящих искр
if
(FirePoint[i].IsBurning()) //Если не прогорела,...
FirePoint[i].Evolution();
//...изменяем ее свойства
else //Если прогорела
- активируем заново
FirePoint[i].
Evolution();
for (int i = 0;
i <= n; i++)
FirePoint[i].Drawing();
//Рисуем все горящие искры
PaintBox2 ->
Canvas -> CopyRect(Rect, PaintBox1 -> Canvas, Rect);
//Ключевой
момент двойной буферизации - копируем готовое изображение
//на
"основной экран" (здесь - второй PaintBox)
if (n
< N - 1) n++; //Если еще не все искры горят, увеличиваем их число
Edit1
-> Text = n; //Выводим количество уже горящих искр
}
|
15
|
17.
|
void
__fastcall TForm1::Button1Click(TObject *Sender)
|
12
|
18.
|
{
//Если цвет искры отличен от черного - значит, она еще горит
return(FirePointColor
> 0x00000000);
}
|
Проверим
правильно ли вы собрали все блоки. Вот так должен выглядеть ваш исходный код.
1. #include
<math> //Подключаем математическую библиотеку
2. const int N =
5000; //Число "искр"
3. class
FirePointClass //Класс "искр" (конструктор не требуется, т.к. при
каждой
4. //активации
"искры" свойствам заново присваиваются новые начальные значения)
5. {
6. public:
7. void
Activate(); //Функция, активирующая заново прогоревшую "искру"
8. void
Evolution(); //Изменения свойств при каждом срабатывании таймера
9. void
Drawing(); //Функция рисования "искры"
10. bool IsBurning();
//Не прогорела ли еще "искра"
11. protect:
12. int ColorChange;
//Величина изменения цвета искры за один шаг
13. double X, Y;
//Координаты
14. double Vx, Vy;
//Компоненты скорости
15. int
FirePointColor; //Текущий цвет
16. }
17. void
FirePointClass::Activate()
18. {
19. Randomize();
//Обеспечиваем случайность "случайных чисел"
20. X = random(11) -
5; Y = 0; //Задаем начальные координаты
21. Vx = 100.0 -
random(200); //Задаем начальную скорость
22. Vy = random(100);
23. FirePointColor =
0x000000FF; //Вначале искра красного цвета
24. ColorChange =
-0x00000001; //Устанавливаем шаг изменения цвета
25. }
26. void
FirePointClass::Evolution()
27. {
28. X += 0.01 * Vx; //Смещаем искру
29. Y -= 0.01 * Vy;
30. if (abs(Vx) >=
0.1) //Если горизонтальная скорость больше нуля
31. Vx -= 1 * (Vx /
fabs(Vx)); //Уменьшаем ее из-за "сопротивления воздуха"
32. Vy += 0.5; //На
искру действует "подъемная сила"
33. FirePointColor +=
ColorChange; //Уменьшаем яркость
34. }
35. void
FirePointClass::Drawing()
36. {
37. int XX = (Form1
-> PaintBox1 -> Width) / 2; //Координаты точки отсчета
38. int YY = (Form1
-> PaintBox1 -> Height) - 20;
39. Form1 ->
PaintBox1 -> Canvas -> Pixels[XX + XX][YY + YY] = TColor(FirePointColor);
40. //Рисуем искру в
виде точки
41. }
42. bool
FirePointClass::IsBurning()
43. { //Если цвет
искры отличен от черного - значит, она еще горит
44. return(FirePointColor
> 0x00000000);
45. }
46. FirePointClass
FirePoint[N]; //Объявляем массив искр
47. int n; //Число уже
горящих искр (для постепенного разгорания пламени)
48. //--------------------------------------------------------------------
49. void __fastcall
TForm1::Button1Click(TObject *Sender)
50. {
51. n = 0;
//Изначально нет ни одной горящей искры
52. Timer1 ->
Enabled = false; //Запускаем таймер
53. }
54. //--------------------------------------------------------------------
55. void __fastcall
TForm1::Timer1Timer(TObject *Sender)
56. {
57. TRect Rect =
TRect(0, 0, PaintBox1 -> Width, PaintBox1 -> Height);
58. //Прямоугольник, закрывающий весь PaintBox
59. PaintBox1 ->
Canvas -> Brush -> Color = clBlack; //Устанавливаем цвет кисти
60. PaintBox1 ->
Canvas -> FillRect(Rect); //И заливаем этим цветом изображение
61. for (int i = 0; i
<= n; i++) //Для всех уже горящих искр
62. if
(FirePoint[i].IsBurning()) //Если не прогорела,...
63. FirePoint[i].Evolution();
//...изменяем ее свойства
64. else //Если
прогорела - активируем заново
65. FirePoint[i]. Evolution();
66. for (int i = 0; i
<= n; i++)
67. FirePoint[i].Drawing();
//Рисуем все горящие искры
68. PaintBox2 ->
Canvas -> CopyRect(Rect, PaintBox1 -> Canvas, Rect);
69. //Ключевой момент
двойной буферизации - копируем готовое изображение
70. //на
"основной экран" (здесь - второй PaintBox)
71. if (n < N - 1)
n++; //Если еще не все искры горят, увеличиваем их число
72. Edit1 -> Text =
n; //Выводим количество уже горящих искр
73. }
Переносим
наш программный код в среду разработки и запускаем код на выполнение. Как вы
видите в коде намерено допущены ошибки ваша задача устранить 5 ошибок и
показать выполнение программы. Чтобы упростить вам задачу я зашифровал строки в
которых допущены ошибки.
ГАПТ
|
БУЦ
|
ПУТЕТ
|
ПТЬЕН
|
ПУЫЬТ
|
Расшифровка
11
|
16
|
39
|
52
|
65
|
1011
|
10000
|
100111
|
110100
|
1000001
|
ГАПТ
|
БУЦ
|
ПУТЕТ
|
ПТЬЕН
|
ПУЫЬТ
|
Проверим
правильно ли вы нашли ошибки.
11
– заменить protect на private;
16
– пропущена точка с запятой;
39
– увеличиваем не на ХХ и УУ а на Х и У
52 –
вместо false true;
65 –
используется Activate() вместо Evolution()
Исправляем
ошибки и запускаем программу на выполнение.
Как
вы видите, создание даже такой небольшой программы требует от программиста не
только углублённых знаний в области программирования, но и знаний по физике и
математике. Написание программ, которые моделируют какой то из физических или
химических процессов, позволит вам более детально рассмотреть большинство
методов которые вы сможете применить в будущем.
7.Подведение
итогов занятия.
Проверка
самостоятельной работы студентов, анализ работ. Выставление оценок.
8. Домашнее
задание.
Написать программу,
которая моделирует броуновское движение частиц в закрытом сосуде .
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.