русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Цикл с предварительной проверкой условия.


Дата добавления: 2015-07-09; просмотров: 4245; Нарушение авторских прав


 

WHILE <условие> DO

пока

оператор;

{или группа операторов в операторных скобках BEGIN - END}

 

До тех пор пока условие является истиным, выполняются операторы цикла.

О чем надо помнить:

  1. Если условие ложно, сразу же при первом обращении к циклу, то тело цикла не выполнится ни разу.
  2. Данная конструкция может работать, как конструкция цикла со счетчиком, но при этом необходимо изменять переменную, являющуюся счетчиком, с помощью оператора присваивания. В конструкции WHILE можно выбрать любой необходимый шаг.

Рассмотрим сказанное выше на конкретных примерах.

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

Рис.4.4. Схеме алгоритма подсчета количества слагаемых, сумма которых меньше 100.

 

Текст программы.

 

PROGRAM WHILE1;

USES CRT;

VAR

K: integer;

S: integer;

BEGIN

clrscr;

S := 0;

K := 0;

WHILE S<=100 DO

BEGIN

K := K + 1;

S := S + K

END;

writeln('Количество слагаемых ', K, ' их сумма = ', S);

writeln('Нажмите любую клавишу для выхода...');

readln;

END.

 

О ЧЕМ НАДО ПОМНИТЬ:

  1. Выход из цикла осуществляется только в том случае, когда значение переменной S превысит 100.
  2. Обратите внимание: начальное значение переменной K=0, в этом случае оператор присваивания K:=K+1 расположен до оператора присваивания S=S+K, в этом случае значение переменной K при выходе из цикла показывает номер слагаемого, на котором произойдет превышение суммы. Очень часто начальное значение K задают равным 1, тогда при выходе из цикла необходимо уменьшить K на единицу, чтобы получить номер слагаемого, на котором произошло превышение суммы.

Задача 2. Вычислить сумму первых 10 натуральных чисел.



Это задание было разобрано при изучении оператора FOR. Рассмотрим вариант, когда конструкция WHILE работает со счетчиком.

PROGRAM WHILE10N;

USES CRT;

VAR

i: integer; {очередное слагаемое-счетчик}

S: integer; {сумма}

BEGIN

clrscr;

i := 1;

S := 0;

WHILE i <= 10 DO

BEGIN

S := S+i;

i := i+1

END;

writeln('сумма = ', S);

writeln('Нажмите любую клавишу для выхода...');

readln;

END.

 

 

Задача 3. Вычислить сумму четных чисел на отрезке от 10 до 30.

 

PROGRAM SUM10N30;

USES CRT;

VAR

K: integer; {очередное слагаемое}

S: integer; {сумма}

BEGIN

clrscr;

K:=10;

S:=0;

WHILE K <= 30 DO

BEGIN

S:=S+K;

K:=K+2

END;

writeln('сумма четных чисел от 10 до 30 = ', S);

writeln('Нажмите любую клавишу для выхода...');

readln;

END.

 

Цикл с последующей проверкой условия.

Конструкция цикла с последующей проверкой условия.

REPEAT

тело цикла

UNTIL <условие>;

 

Служебное слово repeat (англ. повторять) открывает тело цикла, выполняются последовательно операторы тела цикла, а затем проверяется условие выхода из цикла. Переводится конструкция так — повторять до тех пор, пока условие не станет истиной.

О ЧЕМ НАДО ПОМНИТЬ:

· Тело цикла выполнится хотя бы один раз в любом случае.

· Выход из тела цикла происходит только при достижении истинности условия.

PROGRAM REPEAT1;

USES CRT;

VAR

K: integer; {слагаемое}

S: integer; {сумма}

BEGIN

clrscr;

K:=1;

S:=0;

REPEAT

S := S + K*K;

K := K + 1

UNTIL K > 20;

writeln('сумма равна = ', S);

writeln('Нажмите любую клавишу...');

readln;

END.

 

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

Пример.

С клавиатуры вводятся последовательно целые числа, и вычисляется их сумма до первого встреченного отрицательного числа (не включая его самого).

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

1. Конструкция цикла со счетчиком FOR отпадает сразу, так как заранее не известно, количество повторений тела цикла.

2. Конструкция цикла с последующей проверкой условия REPEAT — UNTIL. Данную конструкцию можно использовать, но при этом продумать последовательность операторов.

Поясним на примере:

VAR

a: integer; {вводимое число}

S: integer; {сумма}

BEGIN

S:=0;

a:=0; {мы вынуждены выполнить этот искусственный шаг}

REPEAT

S:=S+a;

readln(a)

UNTIL a<0;

................

 

Мы были вынуждены обнулить переменную а, только для того, чтобы действие ввода поставить после суммирования, первое выполнение операции суммирования выполняется при нулевом значении переменной a — это, естественно, искусственный шаг.

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

S:=0;

REPEAT

readln(a);

S:=S+a

UNTIL a<0;

..................

 

Первое прохождение:

Вводим a = -10

Тело цикла выполняется (см. пункт 1 предупреждения), затем происходит выход из цикла, и получаем сумму равную -10, условие задачи нарушено. Мы должны из суммы удалять лишнее отрицательное слагаемое.

3. Конструкция цикла с предварительной проверкой условия WHILE. Эту конструкцию так же можно использовать, но при этом помнить, что в тело цикла можно попасть только в случае истинности условия.

Для того чтобы попасть в тело цикла первое значение переменной a необходимо ввести до цикла.

...

readln(a);

S:=0;

WHILE a>0 DO

BEGIN

S:=S+a;

readln(a)

END;

...

Итак, мы пришли к выводу, что при решении такого типа задач используется конструкция цикла либо с предварительной, либо с последующей проверкой условия. Какую из этих конструкций выбрать это уже каждый решает сам, самое главное выбранную конструкцию использовать грамотно, избежав ошибок.

4. А теперь давайте попробуем применить оператор условного перехода IF. Напомню, что оператор (или операторы заключенные в скобки begin end) стоящие за оператором условного перехода, выполнятся только в случае истиности условия.

VAR

a: integer; {вводимое число}

S: integer; {сумма}

BEGIN

S:=0;

REPEAT

readln(a)

IF a > 0 THEN

S := S + a

UNTIL a<0;

...

В данном примере a прибавляется к сумме только в том случае, когда выполняется условие a > 0, в противном случае сумма S не изменяется.

 

4.4. Вложенные циклы

Рассмотрим задачу: Вычислить:

Для решения этой задачи необходимо организовать два цикла. Первый цикл (он называется внешним) работает по переменной i. Телом этого цикла является в, свою очередь, опять оператор цикла, но по переменной j. Посмотрим, как изменяются значения переменных i и j.

 

i=1 i=2 i=3 … i=100

j=1 j=1 j=1 j=1 j=1

j=2 j=2 j=2 j=2 j=2

j=3 j=3 j=3 j=3 j=3

… … … … …

j=50 j=50 j=50 j=50 j=50

 

Общее количество повторений равно 100*50.

Фрагмент программы:

S := 0;

for i:= 1 to 100 do

for j:=1 to 50 do

S := S + 1/(i+j*j);

 

 

Задача.

  1. Вычислить , где n — натуральное число, а — действительное число.

Первое, что необходимо увидеть – это базовые алгоритмы, которые будут использоваться при решении. В данной задаче их два — вычисление суммы и вычисление (или ).

Изобразим алгоритм решения графически:

Рис. 4.5. Схема алгоритма нахождения суммы ряда.

 

Теперь напишем текст программы, при этом необходимо помнить, что объявление типов данных должно быть корректным.

n — показатель степени натурального числа, переменную n можно объявить как byte.

i - количество повторений цикла, оно совпадает с n, следовательно, переменная i объявляется как byte.

a - действительное число, следовательно, тип real.

Текст программы:

PROGRAM P_N;

USES CRT;

VAR

n: byte; {показатель степени}

i,j: byte; {счетчии циклов}

a: real; {вводимое число}

W: real; {степень 1/an}

S: real; {сумма}

BEGIN

clrscr;

write('введите значение переменной a: ');

readln(a);

write('введите значение переменной n: ');

readln(n);

S:=0;

FOR i:=1 TO n DO

BEGIN

W := 1;

FOR j:=1 TO i DO

W := W * a;

S := S + 1/W;

END;

writeln('Cумма = ',S:5:3);

writeln('Нажмите любую клавишу для выхода...');

readln;

END.

 

Использование константы.

Значение n можно задать, используя служебное слово const в разделе описания типов переменных, но при этом необходимо помнить, что изменить n по ходу выполнения программы будет нельзя.

  1. Вычислить: , где n - натуральное число, x - действительное число. При решении используем три базовых алгоритма - an, и сумма n чисел.

Текст программы:

PROGRAM P_N_FACT;

USES CRT;

CONST

N=3;

VAR

i,j: byte; {счетчики цикла}

W: real; {xn}

F: longint; {n!}

x: real; {вводимое число}

S: real; {сумма}

BEGIN

clrscr;

write('задайте значение переменной x: ');

readln(x);

S:=0;

FOR i:=1 to n DO

BEGIN

W := 1;

FOR j:=1 TO i DO

W := W * x;

F := 1;

FOR j:=1 TO i DO

F := F * j;

S := S + W/F

END;

writeln('искомая сумма = ', S:5:3);

writeln('Нажмите любую клавишу для выхода...');

readln;

END.

4.5 Решение задач

 

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

 

Пример 1. Вычисление суммы чисел удовлетворяющих условию

 

Задание: из 20 чисел заданных случайным образом, найти сумму чисел кратных 5. Для получения случайного числа в языке Турбо Паскаль существует оператор random(a), который возвращает число от 0 до a. (на самом деле, как и readln(a) это не оператор, а функция, но о функциях речь пойдёт позже)

 

Для решения поставленной задачи нам потребуется использовать базовый алгоритм накопления суммы чисел, но только тех, которые удовлетворяют условию. Организуем цикл, повторяющийся 20 раз (цикл FOR), в цикле будем получать случайное число, проверять кратно ли оно 5, и если условие истинно, накапливать сумму в переменной S.

 

 

Текст программы:

PROGRAM RANDOM20;

USES CRT;

VAR

a: shortint;

i, k: byte;

S: integer;

BEGIN

clrscr;

randomize; {функция позволяет в дальнейшем получать случайные числа}

S:=0;

k:=0;

FOR i:=1 TO 20 DO

BEGIN

a := random(15); { случайное целое положительное число меньше 15}

IF a mod 5 = 0 THEN

BEGIN

k:=k+1;

S:=S+a

END

END;

IF k = 0 THEN

writeln('чисел, удовлетворяющих условию нет.')

ELSE

writeln('сумма чисел, кратных 5 = ', S);

writeln('Нажмите любую клавишу для выхода...');

readln;

END.

 

Пример 2. Числа Фибоначчи

 

Дано действительное число d. Найти первое число Фибоначчи, превышающее заданное число d. Последовательность Фибоначчи образуется по следующему закону — первое число равно 0, второе 1, каждое следующее — это сумма двух предыдущих. Пусть a — первое число, b — второе число, с — очередное число.

На рис. 4.6. представлен алгоритм решения задачи.

Рис. 4.6. Схема алгоритма нахождения числа Фибоначчи превышающего заданное.

 

Рассмотрим работу алгоритма на конкретном примере, пусть d=7;

a=b=1 b=c=2 с=a+b=3 3<=7? да
a=b=2 b=c=3 с=a+b=5 5<=7? да
a=b=3 b=c=5 с=a+b=8 8<=7? нет
Выход из цикла. Печать результата.

 

 

Текст программы:

PROGRAM FIBO;

USES CRT;

CONST

D = 7;

VAR

c, a, b : integer;

BEGIN

clrscr;

a:=0;

b:=1;

c:=1;

WHILE c <= D DO

BEGIN

a:=b;

b:=c;

c:=a+b

END;

writeln('первое число Фибоначчи, превышающее ', D, ' = ', c);

writeln('Нажмите любую клавишу...');

readln;

END.

 

Пример 3. Вычисление алгебраического произведения

 

Вычислить:

Примечание: заглавная буква означает, что необходимо вычислить произведение элементов последовательности, общий член которой задается формулой. Посмотрите, как выглядят элементы при k=1, k=2 и k=3.

k=1

k=2

k=3

Для решения данной задачи организуем внешний цикл, повторяющийся 5 раз, в котором будет накапливаться произведение. Внутри внешнего цикла нам необходимо вычислить первое слагаемое , для которого понадобится организовать цикл вычисления факториала, второе слагаемое , для которого понадобится организовать цикл вычисления степени.

 

Текст программы:

 

PROGRAM PROIZV_RYADA;

USES CRT;

CONST

N = 5;

VAR

P : double; {накопление произведения}

a1 : double; {первое}

fact : word; {факториал}

cos_n : double; {косинус в степени n - второе слагаемое}

abs_xk : double; {аргумент косинуса}

k , i : byte; {счетчики циклов}

x : double; {переменная}

BEGIN

clrscr;

write('Введите x : ');

readln(x);

P := 1;

FOR k := 1 TO N DO

BEGIN

{вчислим факториал k}

fact:=1;

FOR i:=1 TO k DO

fact := fact * i;

{вычислим первое слагаемое}

a1 := x / ( fact + 1);

{вычислим косинус в нужной степени}

cos_n := 1;

abs_xk := abs(x+k);

FOR i:= 1 TO k DO

cos_n := cos_n * cos(abs_xk);

{теперь вычтем из первого слагаемов второе и умножим на P}

P := P * (a1 - cos_n);

END;

writeln('P = ', P:1:5);

writeln('Нажмите любую клавишу...');

readln;

END.

 

Небольшие пояснения: функции abs и cos – стандартные математические функции, которые были рассмотрены в главе 2. Для корректного отображения на экране вещественного числа используется шаблон вывода P:1:5 означающий, что число P необходимо вывести в десятичном виде с одной цифрой в целой части и 5 знаками после запятой, т.е. число займет на экране 6 позиций под цифры и одну позицию под разделительную точку.

 



<== предыдущая лекция | следующая лекция ==>
Подсчет количества чисел, удовлетворяющих заданному условию. | Задачи для самостоятельного решения


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.449 сек.