Разработка урока "Операторы цикла в языке программирования Си++"

1
Разработка уроков с применением личностно-деятельностного подхода
к обучению по теме
«Операторы цикла в языке программирования Си++»
(дисциплина «Основы алгоритмизации и программирования»)
Автор: Топина Софья Николаевна
Должность: преподаватель ГОУ СПО «Кировский авиационный техникум»
Предмет преподавания: Основы алгоритмизации и программирования
Данные об учреждении образования:
Название: Государственное образовательное учреждение среднего профессионального
образования «Кировский авиационный техникум»
Адрес: 610005, г. Киров, Октябрьский проспект, 97
2
Содержание
Аннотация ................................................................................................................................................. 3
Разработки уроков по теме «Операторы цикла в языке Си++» .......................................................... 5
Урок 1. Оператор цикла с параметром в языке Си++ ...................................................................... 5
Урок 2. Оператор цикла с предусловием в языке Си++ ................................................................. 12
Урок 3. Оператор цикла с постусловием в языке Си++ ................................................................. 17
3
Аннотация
Термин «личностно-деятельностный подход» появился в современной педагогике
сравнительно недавно. Под личностно-ориентированным подходом понимается учет в
обучении индивидуальных особенностей ученика, создание благоприятных условий для его
самореализации и личностного роста. Деятельностный подход предполагает, прежде всего,
обучение через деятельность. Личностно-деятельностный подход подразумевает управление
учебной деятельностью ученика в общем контексте его жизнедеятельности, его личных
особенностей в субъект-субъектном взаимодействии.
Для качественного усвоения нового материала студентами учебные занятия по
дисциплине «Основы алгоритмизации и программирования» составляются с учетом личностно-
деятельностного подхода к обучению, а это требует нового подхода к организации занятий.
При традиционном подходе изучение нового материала можно представить формулой
«теория-практика», т.е. студентам сразу предлагается готовый теоретический материал по
теме, который затем отрабатывается при решении задач.
Что касается деятельностного подхода, то изучение новой темы можно представить
формулой «практика-теория-практика». В этом случае преподаватель не дает с самого
начала готовых выводов по теме, а показывает, как новая информация применяется при
решении конкретных практических задач, сразу отвечая на вопрос студентов: «Для чего это
надо?». Только после этого обучающиеся совместно с преподавателем или самостоятельно
делают выводы по теме. Далее следует этап закрепления полученных знаний при решении
задач. На каждом уроке задания для закрепления новой информации предлагаются
разноуровневые, т.е. студенты, подключая самооценку, выбирают те задания для выполнения,
которые они считают наиболее значимыми для них.
Особенностью представления каждого урока является то, что его информация строго
структурирована. Для обозначения основных этапов урока изучения нового материала в тексте
разработки предлагаются следующие условные обозначения:
«НЗ» Начальное знание, т.е. неполная или противоречивая информация по теме.
«?» Проблема урока, т.е. вопрос, на который необходимо ответить после изучения
нового материала (этап целеполагания).
«►» - Решение проблемы урока, т.е. решение задач (составление программного кода) с
применением нового материала. На этом этапе преподаватель показывает особенности
применения новых конструкций.
«!» Выводы по теме.
«» - Задания для самостоятельного выполнения.
Записи конспектов студентами рекомендуется также вести структурировано с
обозначениями этапов изучения темы.
В данной работе предлагается разработка трех занятий по теме «Операторы цикла в
языке программирования Си++»:
1. Оператор цикла с параметром в языке Си++.
2. Оператор цикла с предусловием в языке Си++.
3. Оператор цикла с постусловием в языке Си++.
На каждое занятие предполагается 2 учебных часа.
Для обучения данной теме можно выделить следующие цели:
Дидактическая цель создание благоприятных условий для восприятия, осмысления и
первичного закрепления учебной информации по теме «Операторы цикла в языке
программирования Си++» через организацию занятий с учетом личностно-деятельностного
подхода.
Обучающая цель способствовать осознанному выбору и применению операторов цикла
при решении практических задач в различных ситуациях.
4
Развивающая цель формирование умений и навыков у студентов находить и исправлять
ошибки в программном коде, а также предвидеть результаты работы программы. Для
достижения этой цели в разработках занятий предлагаются упражнения следующих видов:
анализ готовой программы и определение результата ее работы;
анализ готовой программы, нахождение и коррекция ошибок;
самостоятельная деятельность по составлению программ.
Воспитательная цель создание условий для становления субъектности студентов. В
ходе уроков студенты анализируют образовательную ситуацию, ставят цели, контролируют
свою деятельность и оценивают ее результаты.
Так как в личностно-деятельностном подходе к обучению студент рассматривается как
субъект процесса обучения, то необходимо признавать его право выбора учебных заданий и
форм их выполнения. Для обучения данной теме в разработках занятий выбор проявляется в
следующих видах дифференциации:
студентам предлагается выполнение некоторых заданий в группах или
индивидуально, эти задания они выполняют, опираясь на помощь товарищей или
преподавателя;
задания можно выполнять либо в тетради, либо за компьютером (если занятие
проводится в компьютерном классе);
студентам предлагаются разноуровневые задачи, студенты выбирают задачи,
применив при этом самооценку.
Как известно, каждый студент по своей природе является субъектом и имеет свой
субъектный опыт, т.е. то, чему он научился как в учебной деятельности, так и в жизни. При
обучении теме «Операторы цикла в языке программирования Си++» субъектный опыт
учитывается при выборе формулировки задачи для объяснения материала разделе с
обозначением «►») обычно при объяснении новой темы я использую неформализованные
задачи, т.е. стараюсь подбирать формулировку, близкую к реальной жизни. Благодаря этому
студенты видят практическую значимость изучаемой темы. Кроме того, студенты вынуждены
постоянно актуализировать свои знания по основам алгоритмизации и программирования,
известные им из предыдущих уроков, при решении задач.
Все занятия строятся в форме диалога преподавателя и студентов, на уроке
преподаватель постоянно обращается к студентам, их знаниям и опыту деятельности.
Преподаватель показывает образец решения задачи, задавая студентам вопросы, которые
подталкивают их к правильному выводу. Т. е. при объяснении нового материала
преподавателем используется принцип проблемности.
Разработка темы «Операторы цикла в языке программирования Си++» может быть
полезна преподавателям дисциплины «Основы алгоритмизации и программирования», а также
школьным учителям информатики при подготовке к урокам или факультативам.
5
Разработки уроков по теме «Операторы цикла в языке Си++»
Урок 1. Оператор цикла с параметром в языке Си++
НЗ
Решение многих задач содержит повторяющиеся действия. Чтобы не записывать их
несколько раз, в языке Си++ предусмотрены операторы повторения. Применение данных
операторов позволяет эффективно использовать компьютер:
за счет сокращения длины программы (так как повторяющиеся действия - тело
цикла записывается один раз);
за счет сокращения времени на ее составление и отладку.
В Си++ существуют операторы, реализующие все типы циклов.
Для реализации цикла с параметром в языке Си++ применяется оператор for.
?
В чем особенности применения оператора цикла с параметром в языке Си++?
Задача 1: Составить программу, которая выводит на экран таблицу перевода из
долларов в рубли для значений от 15 $ до 30 $ с шагом в 3 $.
Предварительные рассуждения:
Как можно решить данную задачу без использования циклической конструкции?
15$=(15*kurs) руб.
18$=(18*kurs) руб.
21$=(21*kurs) руб.
Т. е., если не использовать конструкцию цикла, то в программном коде мы напишем 6
однотипных строк перевод 15, 18, 21, 24, 27 и 30 долларов в рубли. Но, применив
конструкцию цикла с параметром, мы можем заменить вычисление процесса перевода
долларов в рубли с помощью формулы.
Как будет выглядеть формула перевода долларов в рубли?
Перевод осуществляется по формуле: Рубли=Значение_доллара*Курс_доллара. Именно
эту формулу мы будем использовать при решении задачи.
Составим программный код для решения задачи с использованием конструкции цикла с
параметром.
Решение задачи:
1. Сколько переменных нужно для решения задачи?
Для решения задачи нам необходимо 3 переменных, пусть:
r рубли;
d значение доллара;
k курс доллара.
2. Что зависит от типов переменных? Какие типы необходимо выбрать для
обозначенных переменных?
Тип переменной определяет:
диапазон значений переменной;
количество ячеек памяти, отводимой под переменную;
возможные операции с переменной.
Значение доллара в нашей задаче всегда будет целым положительным числом, поэтому в
качестве типа переменной d лучше взять тип unsigned int.
Курс доллара меняется каждый день, поэтому для представления переменной k лучше
6
всего взять вещественный тип float, поэтому и переменная r будет также типа float.
Итак, с переменными определились, можно начинать писать программу.
В главной функции main() объявляем 3 переменные:
void main()
{
unsigned int d;
float r,k;
3. Каким образом целесообразнее вводить курс доллара?
Как уже было сказано выше, курс доллара изменяется каждый день, поэтому
целесообразнее всего вводить значение в переменную k с клавиатуры. Программный код при
этом будет выглядеть так:
cout<<"введи курс доллара =";
cin>>k;
4. Какую переменную нужно выбрать в качестве параметра цикла?
Наша задача – вывести таблицу перевода из долларов в рубли для значений от 15 $ до 30 $
с шагом в 3 $. Здесь мы точно знаем, что показатель доллара изменяется от своего начального
значения до конечного с определенным шагом. Именно поэтому в качестве параметра цикла
мы должны выбрать переменную d. Запись цикла с параметром для этой задачи будет
выглядеть следующим образом:
for (d=15; d<=30;d+=3)
Читается данная запись так: «для значений переменной d от 15 до 30 с шагом 3
выполнять…»
5. Что будет являться телом цикла?
Телом цикла называются команды, которые необходимо выполнить несколько раз. В
нашем случае для каждого значения доллара мы должны выполнить 2 команды:
перевести текущее количество доллары в рубли;
вывести на экран полученное значение.
Таким образом, в теле цикла у нас будет более одной команды, поэтому необходимо
заключить их в операторные скобки. Тело цикла будет иметь вид:
{ r=d*k;
cout<<d<<"$ = " <<r<<" rub"<<'\n';
}
Итак, наш цикл выглядит так:
for (d=15; d<=30;d+=3)
{ r=d*k;
cout<<d<<"$ = " <<r<<" руб"<<'\n';
}
Прочитать данную запись можно следующим образом: «для каждого значения доллара от
15 до 30 с шагом 3 происходит перевод текущего значения из долларов в рубли и вывод
полученной информации на экран».
Давайте посмотрим, как работает конструкция цикла for. Для того, чтобы проверить без
компьютера как работает тот или иной участок программного кода, необходимо построить
итерационную таблицу. Она позволяет пошагово просмотреть изменения значений
выбранных переменных. Для нашей задачи, если курс доллара будет равен 35 рублей,
итерационная таблица будет выглядеть так:
7
d
вывод
15 (Нач. значение)
15$=525 руб
15+3 (шаг)=18
18$=630 руб
18+3=21
21$= 735 руб
21+3=24
24$=840 руб
24+3=27
27$=945 руб
27+3=30
30$=1050 руб
6. Что произойдет, если в конце цикла for поставить « ;» ?
Если записать for (d=15; d<=30;d+=3);, то это будет значить следующее: «для значений
доллара от 15 до 30 с шагом 3 никаких действий производить не требуется».
7. Что произойдет если убрать операторные скобки, обрамляющие тело цикла?
Если запись будет следующей
for (d=15; d<=30;d+=3)
r=d*k;
cout<<d<<"$ = " <<r<<" руб"<<'\n';,
то в качестве тела цикла будет выполняться только команда r=d*k;, а команда вывода
информации на экран cout<<d<<"$ = "…; будет выполнена только один раз после выхода из
цикла.
Итак, программный код решаемой задачи будет следующим:
void main()
{
unsigned int d;
float r,k;
cout<<" введи курс доллара =";
cin>>k;
cout<<'\n';
for (d=15; d<=30;d+=3)
{
r=d*k;
cout<<d<<"$ = " <<r<<" руб"<<'\n';
}
getch();
}
Задача 2
Вывести на экран таблицу умножения в виде:
1*1=1
1*2=2
1*3=3
…….
2*1=2
2*2=4
2*3=6
…….
8
Предварительные рассуждения:
Если внимательно посмотреть на рисунок, то можно выделить 2 вида циклов внешний и
внутренний:
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
…….
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
Как вы думаете, какой множитель будет являться параметром внешнего цикла, а
какой – параметром внутреннего?
Первый множитель будет являться параметром внешнего цикла, а второй параметром
внутреннего. Таким образом, в программе будет 2 цикла: внешний и внутренний. Внешний
цикл будет перебирать все значения первого множителя от 1 до 10, а внутренний все
значения второго множителя.
Решение задачи:
1. Сколько переменных необходимо для решения этой задачи? Какого типа будут
эти переменные?
Для решения задачи необходимо 2 переменные:
mn1 первый множитель;
mn2 второй множитель.
Все переменные будут целого типа int.
Переменные mn1 и mn2 мы объявим при написании заголовков циклов.
2. Что будет являться телом внешнего цикла?
Телом внешнего цикла будет являться перебор значений второго множителя.
Программный код будет выглядеть так:
for (int mn1=1; mn1<=10;mn1++)
for (int mn2=1; mn2<11; mn2++)
Обратите внимание, что переменные mn1 и mn2 объявлены прямо в заголовках цикла.
Величина шага в обоих циклах равна единице, поэтому мы и написали mn1++.
Кроме того, обратите внимание, как обозначены конечные значения в циклах. Можно
использовать любой из этих вариантов, какой вам удобнее.
3. Что будет являться телом внутреннего цикла?
Телом внутреннего цикла будет являться вывод таблицы умножения:
for (int mn2=1; mn2<11; mn2++)
cout<<mn1<<’*’<<mn2<<’=’<<mn1*mn2<<’\n’;
Таким образом, мы получили сложную циклическую конструкцию, называемую
вложенными циклами:
for (int mn1=1; mn1<=10;mn1++)
for (int mn2=1; mn2<11; mn2++)
cout<<mn1<<’*’<<mn2<<’=’<<mn1*mn2<<’\n’;
9
Для того, чтобы посмотреть принцип работы данной конструкции, построим
итерационную таблицу:
mn1
mn2
результат
1
1
1*1=1
2
1*2=2
10
1*10=10
2
1
2*1=2
2
2*2=4
Обратите внимание, что значение переменной mn1 изменяется на величину шага только
после того, как выполнено тело цикла для всех значений параметра внутреннего цикла.
Итак, основная функция для задачи будет иметь вид:
void main()
{
for (int mn1=1; mn1<=10;mn1++)
for (int mn2=1; mn2<11; mn2++)
cout<<mn1<<’*’<<mn2<<’=’<<mn1*mn2<<’\n’;
getch();
}
!
Сделаем выводы по нашей теме. Вопрос к занятию был следующий: «В чем особенности
применения оператора цикла с параметром в языке Си++?»
1. Когда применяется цикл с параметром?
Цикл с параметром применяется ТОЛЬКО тогда, когда количество повторений известно
заранее, т.е. когда известно начальное значение параметра, его конечное значение и величина
шага, на которую изменяется значение этого параметра.
2. Как в общем виде выглядит данная конструкция?
Общий вид цикла с параметром:
for (тип_пар-ра пар-р=нач_значение; пар-р< =конечн_значение; шаг)
{
Тело цикла;
}
Если
Шаг=1, то пар-р++
Шаг>0, то пар-р+=шаг
Шаг<0, то пар-р-аг
3. Что такое вложенные циклы?
Если телом цикла является циклическая структура, то такие циклы называются
вложенными. Цикл, содержащий в себе другой цикл, называют внешним, а цикл,
содержащийся в теле другого цикла, называют внутренним.
I. Работа в парах или индивидуально (по выбору студентов):
Эти задания выполняют все студенты либо в парах, либо индивидуально. После
выполнения фронтально проверяются полученные результаты. Затем студенты переходят к
выполнению следующих заданий, если вопросов по этим нет, если же есть, то преподаватель
помогает справиться с затруднениями.
10
1. Найти ошибки в программном коде задачи, который выводит на экран таблицу
перевода из градусов по шкале Цельсия (C) в градусы по Фаренгейту (F) для значений от 10
0
С
до 1
0
С с шагом в 2 градуса. Перевод осуществляется по формуле: F=C*1.8+32:
void main()
{
clrscr();
float f, c;
for (c=10; c>=-1; c--)
f=c*1.8+32;
cout<<c<<C=<<f<< ‘_F’<<'\n';
getch();
}
2.Что будет выведено на экран в ходе выполнения фрагментов программы?
for (k=0;k<=4;k++)
cout<<k;
y=0;
for (x=0;x<=4;x++)
y=y+1;
cout<<y;
y=0;
for (x=0;x<=4;x++)
y=y+x;
cout<<y;
y=0;
for (x=0;x<=4;x++)
{y=y+x;
cout<<y<<’\n’;
}
3. Определить, сколько раз выполнится тело цикла и чему будет равно значение
переменной f в следующем фрагменте программы:
f=3;
for (i=2;i<=5;i++)
f=f+i*3;
II. Задания для индивидуального выполнения:
Здесь задания расположены по степени сложности. Студенты сами выбирают себе
задачи, преподаватель помогает их решить, если появляются трудности. В конце урока
каждый суммирует заработанные баллы для того, чтобы сравнить свой результат с
результатами других студентов.
1 балл:
1. Программа находит все факториалы от 1 до числа, введенного с клавиатуры.
Т.е., если было введено число 3, то на экран должно выводиться следующее:
1!=1
2!=2
3!=6
Проанализируйте программный код, приведенный ниже, и ответьте на вопросы:
11
За что отвечают переменные f, x, i, j?
Можно ли переменной х задать тип float, почему?
Для чего переменной f в 12 строке присваивается значение 1?
Что произойдет, если этого не сделать?
Что будет выведено на экран, если из 9 и 13 строк убрать фигурные скобки?
Сколько команд в теле первого цикла?
Сколько команд в теле второго цикла?
1. void main()
2. {
3. clrscr();
4. int f=1, x;
5. cout<<"vvedi x=";
6. cin>>x;
7. cout<<'\n';
8. for (int i=1;i<=x;i++)
9. {for (int j=1;j<=i;j++)
10. f=f*j;
11. cout<<i<<"!= " <<f<<'\n';
12. f=1;
13. }
14. getch();
15. }
2. Дополнить выпущенные фрагменты программного кода. Программа должна выводить
значение суммы факториалов: sum=1!+2!+…+х!. Кроме того, значение числа x должно
выбираться с помощью генератора случайных чисел.
#include <iostream.h>
#include <conio.h>
???
void main()
{
clrscr();
??? ;
int f=1, x, ???;
??? ;
for (int i=1; i<=x; i++)
{for (int j=1; j<=i; j++)
??? ;
??? ;
??? ;
}
cout<<"sum="<<sum;
getch();
}
2 балла:
3. Напишите программу поиска двузначных чисел, таких, что если к сумме цифр этого
числа прибавить квадрат этой суммы, то получится это число.
4. Напечатайте таблицу соответствия между весом в футах и весом в килограммах для
значений 1,2,…10 (1 фунт = 453 г.).
5. Напечатайте "столбиком" квадраты всех целых чисел от 10 до В. Значение В вводится с
клавиатуры.
6. Написать программу вычисления факториала числа.
12
7. Найдите первые 20 натуральных чисел, делящихся нацело на 13 и 17 и больших 500.
3 балла:
8. Старинная задача: Сколько можно купить быков, коров и телят, если плата за быка 10
рублей, за корову 5 рублей, за теленка полтинник (0.5 рубля), если на 100 рублей нужно
купить 100 голов скота.
9. Покупатель должен заплатить в кассу S рублей. У него имеются купюры по 1, 5, 10, 100,
500, 1000 и 10000 рублей. Сколько купюр разного достоинства отдаст покупатель, если он
начинает платить с самых крупных купюр?
Дополнительное задание:
Это задание можно давать в качестве домашнего или в качестве проверочной
работы по теме. За это задание можно ставить отметку в журнал.
I. Для чисел N и K фрагмент программы вычисления выражения 1
k
+2
k
+…+N
k
выглядит
следующим образом:
1. int sum=0, p=1;
2. for (int i=1;i<N+1; i++)
3. {
4. for (int j=1;j<K+1;j++)
5. p=p*i;
6. sum=sum+p;
7. p=1;
8. }
Для N=4, K=3 заполнить итерационную таблицу
i
j
sum
p
II. Ответить на вопросы, используя программный код из предыдущей задачи:
1. Почему в программе использовались конструкции цикла с параметром, а не с
условием?
2. За что отвечает первый цикл for?
3. Для чего в 7 строке программного кода переменной р присваивается значение,
равное 1?
4. За что отвечает переменная sum?
5. Для чего переменная sum обнулена в начале программы?
6. За что отвечает второй цикл?
Урок 2. Оператор цикла с предусловием в языке Си++
НЗ
В Си++ существуют операторы, реализующие конструкции циклов с условием:
1. цикл с предусловием (while);
2. цикл с постусловием (do while).
Цикл с предусловием является наиболее универсальным. Его можно применять для
решения любых задач, предусматривающих повторение действий.
?
В чем особенности применения циклов с предусловием в языке Си++?
Задача: Кощей Бессмертный решил зарыть клад. В первый день он зарыл его на глубину
0.6 метра. Эта глубина показалась ему недостаточной. На следующий день он перезакопал его
на глубину, большую предыдущей в 0.05 раза. Каждый день он перезакапывал свой клад,
увеличивая глубину на эту же величину от предыдущей. На какой день клад будет закопан на
глубину, превышающую 2 метра?
13
Предварительные рассуждения:
Можно ли решить данную задачу, используя конструкцию цикла с параметром?
В этой задаче количество повторяющихся действий заранее не известно и зависит только от
условия, т.е. пока глубина клада не будет более 2 метров, кощей Бессмертный будет
продолжать увеличивать глубину. Именно поэтому при решении данной задачи
воспользоваться циклом с параметром нельзя.
Решение задачи:
1. Какие переменные нужны для решения задачи?
Пусть переменная h отвечает за глубину, на которую закопан клад. Эта величина
будет принимать дробные значения, поэтому в качестве типа выбираем тип float.
Переменная d будет отвечать за количество дней.
2. Какие начальные значения будут принимать выбранные переменные?
Т.к. в первый день клад был закопан на глубину 0.6 метра, то начальное значение
переменной d должно быть равно 1, а значение переменной h 0.6.
Запомните: пока переменной не присвоено значение, она является неопределенной. В
нашем случае необходимо указывать начальные значения переменных для того, чтобы
установить точку отсчета для изменяемых значений.
Получаем программный код:
void main()
{
float h=0.6;
int d=1;
3. Каким должно быть условие для выполнения тела цикла?
В конструкции цикла с предусловием тело цикла выполняется только тогда, когда условие
истинно. Т.е. условие для нашей задачи будет таким: «пока глубина не более 2 метров», на
языке программирования это будет выглядеть так:
while (h<=2)
4. Что будет являться телом цикла?
Телом цикла будет являться 2 действия:
изменение глубины: новое значение глубины будет равно предыдущее значение плюс
шаг изменения;
увеличение количества дней.
Напоминаю: если тело цикла состоит более чем из одной команды, то необходимо ставить
операторные скобки.
Таким образом, мы получили следующую запись:
while (h<=2)
{
h=h+0.05*h;
d++;
}
Составим итерационную таблицу, чтобы посмотреть принцип работы данного оператора:
h
d
0.6 (начальное значение)
1 (начальное значение)
0.6<2, поэтому можно выполнять тело цикла:
h=0.6+0.05*0.6=0.63
d=1+1=2
0.63<2, снова выполняем тело цикла:
h=0.63+0.05*0.63=0.6615
d=2+1=3
14
0.6615<2, поэтому
h=0.6615+0.05*0.6615=0.694575
d=3+1=4
0.694575<2, поэтому
h=0.694575+0.05*0.694575=0.72930375
d=4+1=5
Заполните дальше таблицу самостоятельно.
Обратите внимание, что как только условие выполняться не
будет, т.е. как только значение переменной h превысит 2 метров, то
произойдет выход из цикла
5. Что произойдет, если в теле цикла не написать оператор h=h+0.05*h;?
В этом случае значение переменной h изменяться не будет, т.е. оно всегда будет равно 0.6
метра. Таким образом, данное значение всегда будет меньше 2 метров, поэтому тело цикла
будет выполняться бесконечно, т.е. произойдет зацикливание. Т.е., чтобы не произошло
зацикливания, необходимо в тело цикла поместить оператор, влияющий на изменение
условия.
6. Что произойдет, если в теле цикла не написать оператор d++;?
Значение переменной d изменяться не будет, т.е. оно останется равным 1.
7. Что необходимо вывести на экран в качестве ответа?
При решении задачи нам было необходимо определить, на какой день клад будет закопан
на глубину, превышающую 2 метров. Поэтому в качестве ответа мы должны вывести значение
переменной d:
cout <<”количество дней=”<<d;
Итак, получили следующий программный код главной функции для задачи:
void main()
{
float h=0.6;
int d=1;
while (h<=2)
{
h=h+0.05*h;
d++;
}
cout <<”количество дней=”<<d;
}
!
1. В чем отличие цикла с предусловием от цикла с параметром?
Цикл с предусловием в отличие от цикла с параметром используются только тогда, когда
количество повторений заранее неизвестно и зависит от какого-либо условия.
2. Можно ли цикл с параметром заменить на цикл с предусловием?
Цикл с параметром также можно заменить циклом с предусловием, хотя запись станет
более громоздкой и потребуется заботиться о присвоении параметру начального значения и о
его изменении перед каждым исполнением тела цикла (что происходит автоматически, если
используется цикл с параметром.)
15
На учебном алгоритмическом языке запись в этом случае будет выглядеть так:
………………………
<параметр> := <начальное значение>
пока <параметр> <= <конечное
значение>
Нц
<тело цикла>
<параметр>:= <параметр> + <шаг>
Кц
…………………………………………
Нарисуйте блок-схему для этого случая.
3. Как можно представить конструкцию цикла с предусловием в общем виде?
Оператор цикла while выполняет тело цикла до тех пор, пока проверочное условие остается
истинным.
Вид цикла с предусловием на языке Си++:
while (условие)
{тело цикла;}
4. Что необходимо для того, чтобы программа не зациклилась?
В теле цикла обязательно должны изменяться значения переменных, которые влияют на
значение логического выражения в условии, иначе произойдет «зацикливание».
5. Может ли произойти такая ситуация, что тело цикла в конструкции цикла с
предусловием не выполнится ни разу?
Да, такая ситуация возможна, если условие изначально не выполняется.
I. Работа в парах или индивидуально (по выбору студентов):
1. Сколько раз будет выполнена проверка условия? Определить значения переменных a, b,
s (составить итерационную таблицу).
void main()
{clrscr();
int a,b,s;
a=1; b=1;
while (a+b<8)
{
a++;
b+=2;
}
s=a+b;
cout<<"a="<<a<<" b="<<b<<" s="<<s;
getch();
}
2. Определите значения переменных a и b после выполнения операторов:
void main()
{clrscr();
int a=1,b=1;
while (a<=3) a++;
b++;
cout<<"a="<<a<<" b="<<b;
16
getch();
}
3. Определите значение переменной s после выполнения операторов:
void main()
{clrscr();
int s=0,i=0;
while (i<5) i++;
s=s+100/i;
cout<<"s="<<s;
getch();
}
4. Определите значение переменной s после выполнения операторов:
void main()
{clrscr();
int s=0,i=1;
while (i>1)
{
s=s+100/i;
i--;
}
cout<<"s="<<s;
getch();
}
5. Исправить ошибки в программном коде вычисления факториала f числа n:
void main()
{clrscr();
cout<<"vv N=";
cin>>N;
int k=1,f=0;
while (k<N)
f=f*k;
k++;
cout<<'\n'<<"f="<<f;
getch();
}
6. Найти и исправить ошибки в следующем фрагменте программы, определяющей для
заданного натурального числа n число, записанное цифрами числа n в обратном порядке
(например, из числа 1234 получить число 4321).
void main()
{clrscr();
int p,n,a=0,k=0;
cout<<"vv N=";
cin>>n;
p=n;
while (p>0)
{
a=a+p%10;
p=p/10;
}
cout<<"a="<<a;
17
getch();
}
II. Задачи для индивидуального выполнения:
1 балл:
1. Составить программу, которая выводит на экран таблицу перевода из долларов в рубли
для значений от 15 $ до 30 $ с шагом в 3 $. Использовать конструкцию цикла с предусловием.
2. Площадь пруда = 1000 м
2
. В данный момент времени площадь p=12 м2 покрыта
водорослями. Каждые сутки площадь, занятая водорослями, увеличивается на 0.25 от уже
занятой площади. Через сколько дней пруд будет полностью покрыт водорослями?
2 балла:
3. Найти минимальное число, большее 300, которое нацело делится на 19.
4. Определить количество цифр в числе и их сумму.
5. Поменять местами первую и последнюю цифры числа, введенного с клавиатуры.
6. Приписать по 1 в начало и в конец записи числа n (например, было 2345, станет 123451).
3 балла:
7. Составить программу, определяющую, является ли число палиндромом, т.е. таким,
десятичная запись которого читается одинаково справа налево и слева направо.
8. Выяснить, сколько раз в натуральном числе встречается его максимальная цифра.
9. Выяснить, является ли разность максимальной и минимальной цифр числа четной.
10. Вводится последовательность целых ненулевых чисел, признак окончания ввода ввод
числа 0. Выяснить, является ли последовательность возрастающей.
Урок 3. Оператор цикла с постусловием в языке Си++
НЗ
Цикл с предусловием является наиболее универсальным. Его можно применять для
решения любых задач, предусматривающих повторение действий, т.к. при определенных
обстоятельствах тело цикла может не исполниться ни разу. Однако в ряде случаев цикл с
постусловием более удобен. Примером такой задачи является, например, анализ правильности
ввода исходных данных, т.к. прежде чем проверять исходные данные, надо их хотя бы раз
ввести.
?
В чем особенности применения циклов с постусловием в языке Си++?
Задача: Написать игру «Угадай число»: компьютер «загадывает» случайное число из
диапазона от 0 до 9, а пользователь должен угадать его. Программа должна подсчитывать
количество попыток игрока.
Предварительные рассуждения:
Программа должна запрашивать у игрока ввод числа до тех пор, пока игрок не угадает
число.
Для решения данной задачи неудобно пользоваться циклом с предусловием, т.к. прежде
чем проверять угадал пользователь число или нет, сначала это число необходимо ввести. Т.о.,
для решения данной задачи выгоднее использовать оператор цикла с постусловием.
Решение задачи:
1. Какие переменные необходимы для решения задачи?
Для решения задачи необходимы 3 переменные:
пусть x число, загаданное компьютером;
i число игрока;
p количество попыток.
18
2. Как будут задаваться значения для этих переменных?
Значение переменной x должно задаваться с помощью генератора случайных чисел:
x=random(10); Значение этой переменной изменяться в ходе решения задачи не будет,
поэтому данную команду нельзя включать в тело цикла.
Значение переменной i пользователь должен будет вводить с клавиатуры.
Начальным значением переменной p должно быть число 0, это значение будет
увеличиваться при каждой новой попытке пользователя угадать число.
3. Что будет являться телом цикла?
Несколько раз должны повторяться следующие действия:
на экран компьютера должно выводиться приглашение на ввод пользователем числа;
введенное число должно запоминаться в переменной i;
кроме того, должно увеличиваться количество попыток игрока.
Т.е., программный код тела цикла будет выглядеть так:
{cout<<"угадай число ";
cin>>i;
p++;
}
4. Каким будет условие в данной циклической конструкции?
Пока число игрока неравно числу компьютера, пользователь должен вводить числа. Таким
образом, условие будет следующим: (i!=x)
Итак, вся конструкция цикла с постусловием для данной задачи будет выглядеть так:
do
{ cout<<"ugadai chislo ";
cin>>i;
p++;
}
while (i!=x);
Прочитать данную запись можно так: «Выполняй действия из тела цикла пока число
игрока неравно числу компьютера».
Программный код для задачи будет следующим:
void main()
{
randomize();
clrscr();
int x, i, p=0;
x=random(10);
do
{cout<<"угадай число ";
cin>>i;
p++;
}
while (i!=x);
cout<<"Молодец!!!"
<<'\n'<<"количество
попыток="<<p;
getch();
}
!
1. Как можно представить конструкцию цикла с постусловием в общем виде?
Цикл do-while сначала выполняет тело цикла, а затем выполняет проверку условия.
19
Повторение тела цикла происходит в том случае, пока условие принимает истинное значение.
do
{тело цикла;}
while (условие);
2. Может ли произойти такая ситуация, что тело цикла в конструкции цикла с
постусловием не выполнится ни разу.
Нет, такая ситуация не может иметь место, т.к. в данной конструкции выполнение тела
цикла происходит до проверки условия, таким образом конструкция гарантирует выполнение
тела цикла хотя бы один раз.
3. Заполните самостоятельно схему в виде колец Венна, выделив сходства и различия
конструкций цикла с предусловием и с постусловием:
I. Работа в парах или индивидуально (по выбору студентов):
1. Сколько раз будет выполнена проверка условия? Определить значения переменных a,
b, s (составить итерационную таблицу).
void main()
{clrscr();
int a,b,s;
a=1; b=1;
do
{
a++;
b+=2;
}
while (a+b<3)
s=a+b;
cout<<"a="<<a<<" b="<<b<<" s="<<s;
getch();
}
2. Определите значения переменных a и b после выполнения операторов:
void main()
{clrscr();
int a=1,b=1;
do
a++;
while (a<=3);
b++;
cout<<"a="<<a<<" b="<<b;
getch();
с
х
о
д
с
т
в
а
С постусловием
С предусловием
20
}
3. Определите значение переменной s после выполнения операторов:
void main()
{clrscr();
int s=0,i=0;
do
i++;
while (i<5);
s=s+100/i;
cout<<"s="<<s;
getch();
}
4. Определите значение переменной s после выполнения операторов:
void main()
{clrscr();
int s=0,i=1;
do
{
s=s+100/i;
i--;
}
while (i>1);
cout<<"s="<<s;
getch();
}
II. Задачи для индивидуального выполнения:
1 балл:
1. Написать программу, которая производит суммирование некоторого количества
произвольно введенных целых чисел. Признак окончания ввода – число 0.
2. С помощью цикла WHILE напишите программу определения идеального веса для
взрослых людей по формуле: Ид. Вес = рост – 100. выход из цикла: значение роста = 210 см.
2 балла:
3. Найдите первые 20 натуральных чисел, делящихся нацело на 13 и 17 и больших 500.
4. Найти минимальное число, большее 300, которое нацело делится на 19.
3 балла:
5. Написать программу, которая определяет, является ли число простым. Считаем, что
делители числа находятся в интервале от 2 од n/2.
6. Числа Фибоначчи (fn) определяются формулами: f0=f1=1; fn=fn-1+fn-2, при n=2, 3, …,
т.е. это бесконечная последовательность чисел вида: 1, 1, 2, 3, 5, 8, 13 … Составить программу
определения номера последнего числа Фибоначчи, которое входит в диапазон типа int.