Задача из «Арифметики» Магницкого. Некто продал лошадь за 156 рублей. Но покупатель, приобретая лошадь, раздумал ее покупать и возвратил продавцу, говоря:
- Нет мне расчета, покупать за эту цену лошадь, которая таких денег не стоит. Тогда продавец предложил другие условия:
- Если, по-твоему, цена лошади высока, то купи только ее подковные гвозди. Лошадь же тогда получишь в придачу бесплатно. Гвоздей в подкове шесть. За первый гвоздь дай мне всего ¼ копейки, за второй ½ копейки. За третий 1 копейку и т. д. Покупатель, соблазнившись низкой ценой и желая даром получить лошадь, принял условия продавца, рассчитывая, что за эти гвозди придется уплатить не более 10 рублей.
Проблемная ситуация:
верно ли, что за гвозди придется уплатить не более 10 рублей? S = 1/4+ 1/2 + 1 + 2 + 4 + ... =
=2-2 + 2-1 + 20+21+ 22 + ... +221
Работа в группах
Составить блок-схему и написать код программы, результат работы которой представлен в таблице:
i
1
2
3
4
S
1
5
14
30
1) Запишите математическую модель решения задачи
2) Какие действия повторяются?
3) Какая переменная является параметром цикла – счетчиком?
4) Какой тип данных нужно указать при описании счётчика?
5) Составьте блок-схему
Афиширование работы групп
Работа в парах
Определить значение переменной s после выполнения фрагмента программы:
int i, s=0;
for (i=0; i<10, i++)
s=s+1;
Ответ: s=10
int i, s=0;
for (i=0; i<10, i++)
s=s+i;
Ответ: s=45
int i, s=0;
for (i=0; i<10, i++)
if (i%2= = 0)
s=s+i;
Ответ: s=20
Использование оператора цикла в графике
В графике оператор цикла с параметром используется для рисования, для организации движения.
Используем графические примитивы:
MoveToEx(hdc, x, y, NULL) - устанавливает текущую позицию пера
LineTo(hdc, x, y) - рисует линию из текущей позиции в точку x, y
Rectangle(hdc, x1, y1,x2, y2); - рисует прямоугольник
Ellipse(hdc, x1, y1, x2, y2); - рисует овал
Запускаем Win32GUI project в приложении CodeBlocks, используем для включения графического режима команды:
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
В основную часть записываем:
case WM_PAINT:
{
hdc = BeginPaint(hwndDlg, &ps) ;
GetClientRect(hwndDlg, &rect);
{
for (int i=1;i<=100;i+=10)
{
if(MoveToEx(hdc, 90, 10, NULL)); // установить текущую позицию пера
Ellipse(hdc, i, 10,i+20, 30);
}
EndPaint (hwndDlg, &ps);
} } return TRUE;
И в итоге получаем:
Самостоятельно измени программу так, чтобы на экран выводились пять прямоугольников со стороной 50 точек