Меню
Главная
Авторизация/Регистрация
 
Главная arrow Информатика arrow Введение в программирование на языке Visual C#

Оператор цикла do...while

Для выполнения оператора for необходимо задать параметры, которые будут определять, сколько раз должен выполниться оператор(ы) цикла. Альтернативой циклу с оператором for являются циклы с неизвестным количеством повторений, в которых оператор(ы) выполняе(ю)тся до тех пор, пока логическое выражение не примет определенное значение.

Циклическая структура, в которой число повторений цикла заранее неизвестно, а определяется только в процессе выполнения алгоритма, называется итеративной.

Такие циклы нужно применять в тех задачах, где мы не можем знать точно, сколько раз будет повторен цикл. Например, пользователь должен вводить пароль, для того чтобы начать работу с какой-нибудь программой. Какое количество попыток он использует? Неизвестно.

В зависимости от условий выполнения существует несколько разновидностей циклов с неизвестным количеством повторений. Одним из них является цикл с оператором do...while (с постпроверкой условия).

Общий вид в алгоритме оператора do...while представлен на рис. 90. Синтаксис оператора do...while следующий:

do

г

і

Р.;

р2;

А II 5

}

while (Логическое выражение);

где Р], Р2, ... Р„ — операторы, do (делать, выполнять), while (пока, до тех пор) — служебные слова языка.

Цикл с оператором do...while начинается с выполнения операторов внутри цикла, поэтому цикл, организованный с помощью этого оператора, в любом случае выполнится хотя бы один раз. Затем проверяется логическое выражение. Если оно ложно, то осуществляется выход из цикла. Если же значение логического выражения истинно, то выполнение операторов Рь Р2, ... Рп повторяется, а затем вновь проверяется логическое выражение. Следует отметить, что в цикле с оператором do...while в случае выполнения нескольких операторов операторные скобки { } обязательны.

Пример.

Как будет организовано выполнение операторов при решении задачи: найдите сумму целых чисел от 1 до 50 с применением оператора цикла do...while.

Комментарий: переменная К будет необходима для подсчета количества по вторений цикла, а так как мы знаем, что слагаемых 50, то логично в качестве ус ловия выхода из цикла задать условие К не равно 50? Таким образом, накопле ние суммы в ячейке Sum будет происходить до тех пор, пока не будут просум мированы все 50 слагаемых.

Разработка алгоритма решения задачи представлена на рис. 91.

В листинге 72 приведен код процедуры, отвечающий за решение задачи.

Листинг 72

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void Forml_Load(object sender, EventArgs e) {

int k, sum; k = 0; sum = 0; do {

k = k + 1; sum = sum + k;

}

while (k != 50);

MessageBox.Show("Сумма чисел от 1 до 50 = " + sum.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

Application.Exit();

}

}

Результат выполнения программы представлен на рис. 92.

Сумма чисел от 1 до 50 равна 1275

Рис. 92. Сумма чисел от 1 до 50 равна 1275

Задача. Создадим проект, который будет осуществлять преобразование из градусов Фаренгейта в градусы по Цельсию. Внешний вид окна с запросом температуры представлен на рис. 93.

В цикле с оператором do...while пользователю предлагается ввести значение температуры, которое затем преобразуется в градусы по Цельсию и отображается на экране с помощью функции MessageBox. Цикл выполняется до тех пор, пока пользователь не введет значение, равное нулю.

Это условие проверяется в конце цикла с помощью оператора while. В программе применяется функция Round, чтобы выходное значение температуры в градусах Цельсия не содержало десятичной части.

Запрос температуры

Рис. 93. Запрос температуры

В листинге 73 приведен код процедуры, отвечающий за решение задачи. Листинг 73

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void Forml_Load(object sender, EventArgs e)

{

double Celsius=0; string F_Temp; double FTemp; do {

F_Temp =

Microsoft.VisualBasic.Interaction.InputBox("Введите температуру по Фаренгейту", "Преобразование из F в С", -1, -1);

FTemp= Convert.ToDouble(F_Temp); if (FTemp != 0)

Celsius = Math.Round((FTemp + 40) * 5 / 9 - 40) ;

MessageBox.Show("Температура по Цельсию =" +

Celsius.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

while (FTemp != 0);

Application.Exit();

}

}

}

Упражнения к параграфу

Вопрос 1. Определите, какое значение находится в ячейке у после выполнения фрагмента программы?

private void buttonl_Click(object sender, EventArgs e)

{

int a = 6; int d = 4; int у — 0; do {

a = a + 1 ; у = d + a;

}

while (y > 13) ;

textBoxl.Text = у.ToString("n");

}

Ответ. При первом прохождении цикла в ячейке а оказывается число 7, а в ячейке у число 11. Проверяется логическое выражение у>13 (11>13). В цикле с оператором do...while выход из цикла происходит тогда, когда логическое выражение имеет значение false (ложь), следовательно, в данном примере происходит выход из цикла. Правильный ответ: в ячейке у находится число 11.

Вопрос 2. Определите, какое значение находится в ячейке t после выполнения фрагмента программы?

private void buttonl_Click(object sender, EventArgs e)

{

int f = 5; int t = 5; do {

f = f - 1 ; t = t + 1 ;

}

while (t <= 7);

textBoxl.Text = t.ToString("n");

}

Ответ. При первом прохождении цикла в ячейке f оказывается число 4, а в ячейке t число 6. Проверяется логическое выражение t <= 7 (6 <= 7). Его результат: true (истина). В цикле с оператором do...while выход из цикла происходит тогда, когда логическое выражение имеет значение false (ложь), следовательно, операторы цикла выполняются вновь. Увеличившись на 1, значение ячейки t станет равным 7. Проверяется логическое выражение t <= 7 (7 <= 7). Его результат: true (истина). В третий раз осуществляется выполнение тела цикла, в ячейке t оказывается значение 8. Проверяется логическое выражение t <= 7 (8 <= 7). Его результат: false (ложь), происходит выход из цикла. Ответ: в ячейке t находится число 8.

Вопрос 3. Определите, какое значение находится в ячейке s после выполнения фрагмента программы?

private void buttonl_Click(object sender, EventArgs e)

{

int m = 8; int s = 0; do {

m = m - 2 ; s = m - 1 ;

}

while (s >= 5) ;

textBoxl.Text = s.ToString("n");

}

Ответ. При первом прохождении цикла в ячейке ш оказывается число 6, а в ячейке s число 5. Проверяется логическое выражение s >= 5 (5 >= 5). Его результат: true (истина). В цикле с оператором do...while выход из цикла происходит тогда, когда логическое выражение имеет значение false (ложь), следовательно, операторы цикла выполняются вновь. После выполнения оператора m = ш — 2 в ячейке ш находится число 4, а после выполнения оператора s = ш — 1 в ячейке s оказывается число 3 (4 — 1). Проверяется логическое выражение s >= 5 (3 >= 5). Его результат: false (ложь). Происходит выход из цикла. Ответ: в ячейке s находится число 3.

Вопрос 4. Какое количество ошибок в следующем фрагменте программы:

private void Forml_Load(object sender, EventArgs e)

{

int n, x, a; m = 1 ; x = a ; n = 6; do {

x = x + 15 ;

m = m + 1 ;

a = n ;

}

while (a==n);

MessageBox.Show("Ответ =" + x.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

Ответ. Первая ошибка: переменная ш, которая используется в операторе ш=1, не описана в разделе описания переменных. Вторая ошибка: оператор х=а недопустим, так как переменная а не инициализирована, т.е. перед ее использованием в программе ей надо присвоить значение. Третья ошибка: оператор do...while заканчивается проверкой логического выражения, которое в данном фрагменте будет иметь истинное значение (произойдет «эффект зацикливания»). В этом несложно убедиться, проанализировав операторы, выполняемые в теле цикла. Таким образом, в данном фрагменте программы 3 ошибки.

Вопрос 5. Определите, какое значение находится в ячейке у после выполнения фрагмента программы?

private void buttonl_Click(object sender, EventArgs e)

{

int a = 6; int d = 4; int y; do {

a = a * 2 ; у = d + a ;

}

while (y < 40) ;

textBoxl.Text = у.ToString("n");

}

Ответ. Рассуждать нужно следующим образом: цикл с оператором do...while начинается с выполнения оператора а = а * 2. В ячейке а оказывается значение 12. После выполнения оператора у = d + а в ячейку у заносится число 16 (4 + 12). Проверяется логическое выражение у < 40. Оно истинно, следовательно, выполнение операторов повторяется. При втором прохождении цикла в ячейку а заносится число 24 (12 * 2), а в ячейку у число 28 (4 + 24). Логическое выражение вновь оказывается истинным (28 < 40). При повторении тела цикла в ячейку а заносится значение, равное 48 (24 * 2), а в ячейку у значение, равное 52. Проверив логическое выражение, убеждаемся в том, что оно ложно, а значит, происходит выход из цикла. Следовательно, в ячейке у находится число 52.

Вопрос 6. Сколько раз будет выполнено тело цикла в следующем фрагменте программы?

private void buttonl_Click(object sender, EventArgs e)

{

int m = 3; int n = 22; do {

n = m ; m = n + 1 ;

}

while (m != 8);

textBoxl.Text = у.ToString("n");

}

Ответ. В цикле с оператором do...while выход из цикла происходит тогда, когда логическое выражение ложно, поэтому в данном примере выход из цикла должен произойти тогда, когда в ячейке ш будет число, не равное 8. Таким образом, при первом прохождении цикла в ячейку п заносится число 3 (п = ш), а в ячейку ш число 4 (m = n + 1). Далее проверяется логическое выражение, и снова начинается выполнение операторов цикла. Значение ячейки ш каждый раз будет увеличиваться на 1 после выполнения оператора m = n + 1. Следовательно, для того чтобы значение ячейки m увеличилось с 4 до 8, нужно выполнить тело цикла 5 раз.

Вопрос 7. Определите, какое значение находится в ячейке у после выполнения фрагмента программы?

private void buttonl_Click(object sender, EventArgs e)

{

int a = 6; int d = 4; int y; do {

d = d + 1 ; у = d * a ;

}

while (y < 40) ;

textBoxl.Text = у.ToString("n");

}

Ответ. В данном примере выход из цикла должен произойти тогда, когда в ячейке у будет число, которое больше, чем число 41. При первом прохождении цикла в ячейку у заносится число 30, а значение ячейки d увеличивается на 1 и становится равным 5. Проверяется логическое выражение; оно истинно, а значит, начинается выполнение операторов цикла. Значение ячейки d увеличивается на 1 после выполнения оператора d = d + 1 и равно 6. После выполнения оператора у = d * а в ячейку у заносится число 36 (6*6). Проверяется логическое выражение; оно истинно, а значит, вновь начинается выполнение операторов цикла. Значение ячейки d увеличивается на 1 и будет равно 7, а в ячейке а находится 6. Следовательно, после выполнения оператора у = d * а в ячейке у будет значение, равное 42. Логическое выражение оказывается ложным, происходит выход из цикла.

Вопрос 8. Определите, какое значение находится в ячейке х после выполнения фрагмента программы?

rivate void buttonl_Click(object sender, EventArgs e)

{

int d = 5; int x = 2; int i = 1; do {

x = d + i ; d = d - 1 ; i = i + 1 ;

}

while (i != 5 ) ;

textBoxl.Text = x.ToString("n");

}

Ответ. Рассуждаем следующим образом: при первом прохождении цикла в ячейку х заносится число 6 (х = d + i), значение ячейки d, уменьшившись на 1, станет равным 4, а значение ячейки i, увеличившись на 1, станет равным 2. Проверяется логическое выражение; оно истинно, а значит, начинается выполнение операторов цикла. Можно проследить следующую закономерность: значение ячейки х всякий раз увеличивается на сумму ячеек d и i. В свою очередь, значение ячейки d при каждом прохождении цикла уменьшается на 1, а значение ячейки i увеличивается на 1, следовательно, до выхода из цикла значение ячейки х будет неизменным и останется равным 6.

Вопрос 9. Какое количество ошибок в следующем фрагменте программы:

private void Forml_Load(object sender, EventArgs e)

{

int m; byte n; double x; m = 5e+00 ; x = 5 ; n = 315; do {

x = x + 1 ; m = n ;

}

while x>m;

MessageBox.Show("Ответ =" + x.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

Ответ. Первая ошибка в операторе ш =5е+00, так как переменная ш описана в разделе описаний как целочисленная, а присваивается ей число, записанное в форме с плавающей точкой. Вторая ошибка заключается в том, что логическое выражение в операторе while не заключено в круглые скобки. Оператор и = 315 недопустим, поскольку ячейка и описана типом byte, переменные которого должны принимать значения от 0 до 256. Итого: 3 ошибки.

Вопрос 10. Определите, какое значение находится в ячейке t после выполнения фрагмента программы?

private void buttonl_Click(object sender, EventArgs e)

{

int f = 3; int t = 5; do {

f = f + t ; t = f + 1 ;

}

while (t < 15) ;

textBoxl.Text = t.ToString("n");

}

Ответ. При первом прохождении цикла в ячейку f заносится число 8, а в ячейку t число 9. Логическое выражение оказывается истинным, следовательно, вновь выполняется тело цикла. После выполнения оператора f = f + t в ячейке f оказывается число 17, а после выполнения t = f + 1 в ячейку t заносится число 18. Логическое выражение ложно, происходит выход из цикла. Следовательно, в ячейке t после выполнения фрагмента программы оказывается число 18.

Примеры решения задач

Задача 1. Вводится последовательность целых чисел, не равных 0. Известно, что последний элемент последовательности равен 0. Найдите количество отрицательных чисел и их среднее арифметическое.

Комментарий: выход из цикла с оператором do...while происходит тогда, когда логическое выражение (заданное в качестве условия выхода из цикла) становится ложным. Таким образом, в данной задаче пользователь вводит любую последовательность чисел, в ячейке kolotr, которая играет роль счетчика, накапливается количество отрицательных чисел, в ячейке sum накапливается сумма чисел. Выход из цикла происходит в момент ввода пользователем нулевого значения, при этом происходит подсчет среднего арифметического значения по формуле srarifm = sum / kolotr.

В листинге 74 приведен код процедуры, отвечающий за решение задачи. Листинг 74

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void Forml_Load(object sender, EventArgs e)

{

int chislo, kolotr, sum;

string chislo_;

double srarifm; kolotr = 0 ; sum = 0 ;

do //Выполнять тело цикла

{

//Ввод исходных данных

chislo_ =

Microsoft.VisualBasic.Interaction.InputBox("Введите число", "Окно ввода данных", -1, -1);

chislo = Convert.ToIntl6(chislo_); if (chislo < 0) //Проверка: отрицательно ли введенное число или нет?

{

kolotr = kolotr + 1 ; //Увеличение значения ячейки на 1 в случае истинности проверяемого условия

sum = sum + chislo ; //Увеличение значения ячейки на величину числа в случае истинности проверяемого условия

}

}

while (chislo != 0); //Цикл выполняется до тех пор пока очередное число, которое вводит пользователь, не будет равно нулю

srarifm = sum / kolotr ;

MessageBox.Show("Количество отрицательных чисел= " + kolotr.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

MessageBox.Show("Их среднее арифметическое^ " + srarifm.ToString("n"), "Заголовок окна", MessageBoxButtons.OK, MessageBoxIcon.Information);

Application.Exit();

}

}

}

Задача 2. Вводится последовательность целых чисел, 0 — конец последовательности. Определите, содержит ли последовательность хотя бы два равных соседних числа.

Разработка алгоритма решения задачи представлена на рис. 95.

Комментарий: в ячейку chislo заносится первое число из будущей последовательности чисел, в ячейку chislol заносится второй элемент последовательности. В цикле происходит проверка: не равны ли два соседних элемента? И в случае истинности проверяемого условия переменная булевского типа flag принимает значение истина. Подобные действия повторяются до тех пор, пока пользователь не введет число, равное нулю.

Алгоритм решения задачи

Рис. 95. Алгоритм решения задачи

В листинге 75 приведен код процедуры, отвечающий за решение задачи.

Листинг 75

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void Forml_Load(object sender, EventArgs e)

{

int chislol, chislo; string chislo_, chislo_l; bool flag; flag = false ; chislo_ =

Microsoft.VisualBasic.Interaction.InputBox("Введите первое число", "Окно ввода данных", -1, -1);

chislo = Convert.ToIntl6(chislo_); chislo_l =

Microsoft.VisualBasic.Interaction.InputBox("Введите второе число", "Окно ввода данных", -1, -1);

chislol = Convert.ToIntl6(chislo_l); do //Выполнять тело цикла {

if (chislo == chislol)

//Проверка: не равны ли два

соседних элемента?

flag = true ;

chislo = chislol ; //Следующее число становится текущим chislo_l =

Microsoft.VisualBasic.Interaction.InputBox("Продолжаем ввод чисел, для выхода введите 0", "Окно ввода данных", -1, -1);

chislol = Convert.ToIntl6(chislo_l);

}

while (chislol != 0); //Цикл выполняется до тех пор пока очередное число, которое вводит пользователь, не будет равно нулю

if (flag)

MessageBox.Show("В последовательности есть равные соседние числа", "Заголовок окна", MessageBoxButtons.ОК,

MessageBoxIcon.Information);

else

MessageBox.Show("В последовательности нет равных соседних чисел", "Заголовок окна", MessageBoxButtons.ОК,

MessageBoxIcon.Information);

Application.Exit();

}

}

Контрольные вопросы к параграфу

  • 1. Расскажите, в каких случаях применяются циклы с неизвестным числом повторений.
  • 2. Нарисуйте общий вид в алгоритме оператора цикла do.. .while.
  • 3. Напишите синтаксис оператора цикла do.. .while.
  • 4. Расскажите о работе оператора цикла do...while. Приведите примеры.
  • 5. В чем отличие организации регулярных и итеративных циклов?
  • 6. Как определить число повторений операторов тела цикла в итеративной циклической структуре?

Задачи для самостоятельного решения

  • 1. Разработайте алгоритм и программу решения следующей задачи: вычислите значение функции у = sin (х) / х на интервале [0; pi] с шагом 0.2
  • 2. Разработайте алгоритм и программу решения следующей задачи: вычислить сумму конечного ряда:

с 1 1 1 1

  • S 1 Н---1---h ... Н--
  • 2 3 50
  • 3. Разработайте алгоритм и программу решения следующей задачи: вводится последовательность ненулевых чисел, 0 — конец последовательности, определите, сколько раз последовательность меняет знак.
  • 4. Разработайте алгоритм и программу решения следующей задачи: программа запрашивает пароль пользователя, в случае правильности пароля выводится на экран фраза: «Можно приступать к работе!»
  • 5. Разработайте алгоритм и программу решения следующей задачи: вычислите значение функции у = sin (Зх + п/5) для X, изменяющегося от 2 до 15.
  • 6. Разработайте алгоритм и программу решения следующей задачи: вычислите сумму нечетных чисел в диапазоне от 1 до 99 включительно.
  • 7. Разработайте алгоритм и программу решения следующей задачи: программа определяет максимальное из всех введенных пользователем чисел (признаком конца ввода является введенное число 0).
  • 8. Разработайте алгоритм и программу решения следующей задачи: программа выводит на экран четные числа от 2 до 30.
  • 9. Разработайте алгоритм и программу решения следующей задачи: определите количество чисел, сумма которых меньше заданного числа.
 
Если Вы заметили ошибку в тексте выделите слово и нажмите Shift + Enter
< Пред   СОДЕРЖАНИЕ   След >
 
Популярные страницы