Практикум по информатике
Скачать 7.84 Mb.
|
§4. Циклы В данном параграфе рассматриваются следующие вопро- сы : операторы цикла (For do, While do, Repeat Until), компонент Memo. Теория Операторы цикла Операторы цикла используются для организации циклов (по- второв). Цикл представляет собой последовательность операто- ров, которая может выполняться более одного раза. Группу по- 356 вторяемых операторов называют телом цикла. Всего имеется три вида операторов цикла: — с параметром; — с предусловием; — с постусловием. Обычно, если количество повторов известно заранее, приме- няется оператор цикла с параметром, в противном случае — опе- раторы с пост или предусловием (чаще используется оператор с предусловием). Операторы циклов могут быть вложенными друг в друга. Оператор цикла с параметром Оператор цикла с параметром имеет два следующих формата: for <Параметр> := <Выражение1> to <Выражение2> do <Оператор>; и for <Параметр> := <Выражение1> downto <Выражение2> do <Оператор>; Параметр цикла представляет собой переменную порядково- го типа, которая должна быть определена в том же блоке, где на- ходится оператор цикла, выражение1 и выражение2 являются со- ответственно начальным и конечным значениями параметра цик- ла и должны иметь тип, совместимый с типом параметра цикла. Оператор цикла обеспечивает выполнение тела цикла, которым является оператор после слова do, до полного перебора всех зна- чений параметра цикла от начального до конечного с соответст- вующим шагом. Шаг параметра всегда равен 1 для первого фор- мата цикла и –1 — для второго формата. То есть значение пара- метра последовательно увеличивается (for… to) или уменьшается (for.. .downto) на единицу при каждом повторении цикла. Цикл может не выполниться ни разу, если для цикла for . . . to значение начального выражения больше конечного, а для цикла for.. .downto, наоборот, значение начального выражения меньше ко- нечного. Пример. Циклы с параметром. var n, k: integer; s:Real; f:Extended; begin {цикл вычисления суммы ряда 1+1/2+1/3+…+1/n, n=1,…, 10} s := 0; 357 for n := 1 to 10 do s := s + 1/n; f :=1; { цикл вычисления произведения членов ряда 1*1/2*1/3*…*1/k, k=1,…, 20} for к := 1 to 20 do begin f :=f*1/k end; Оператор цикла с предусловием Оператор цикла с предусловием целесообразно использовать в случаях, когда число повторений тела цикла заранее неизвест- но. Тело цикла может не выполняться, если условие цикла явля- ется ложью. Формат оператора цикла с предусловием: while <Условие> do <Оператор>; Оператор тела цикла выполняется до тех пор, пока логическое выражение не примет значение False, то есть в отличие от цикла с постусловием, цикл выполняется при значении логического вы- ражения True. Пример. Оператор цикла с предусловием. Рассмотрим расчет суммы натуральных чисел от 1 до n с шагом 3 var i,n: integer; sum: integer; begin sum := 0; i:=1; while i <= n do begin sum := sum + i; i := i + 3; end; end; Если перед первым выполнением цикла условие не выполня- ется (значение логического выражения равно False), то тело цик- ла не выполняется ни разу и происходит переход на следующий за оператором цикла оператор. Оператор цикла с постусловием 358 Во многом этот оператор аналогичен оператору цикла с пре- дусловием, но проверка условия выполняется в конце оператора. Выход из цикла происходит при равенстве условия константе True (Истина). Формат оператора цикла с постусловием: repeat <Оператор>; until <Условие>; Пример. Найдем сумму ∑ = − 10 1 ) ( n n x n с шагом 2, при x–n≠0. n:=1; Sum : =0; Repeat Sum := Sum + n/(x–n); n:=n+2; Until (n>10) or (x–n=0); В операторе Repeat Until условие проверяется после выполнения операторов тела цикла. Следовательно, операторы цикла в любом случае выполнятся хотя бы один раз. В этом примере, если в про- грамме заранее не определено, что x≠1, при попадании в цикл произойдет ошибка выполнения (деление на ноль). Компонент Memo TMemo ― иная форма компонента TEdit. Memo находится на вкладке Standard. Подразумевает работу с большими тек- стами и может выполнять основные функции редактора (ввод и редактирование текста). Memo имеет ограничения на объем тек- ста в 32Кб, это составляет 10-20 страниц. Главные свойства компонента Memo Свойство Назначение Name Имя компонента Text Текст, находящийся в поле Memo. Рассматривается как единое целое Lines Текст, находящийся в поле Memo. Рассматривается как со- вокупность строк. Доступ к строке осуществляется по но- меру 359 Lines.Count Количество строк в поле Memo Например, присвоить переменной ST весь текст, находящий- ся в компоненте Memo можно так: ST:=Memo1.Text; Добавить строку: Memo1.Lines.Add( ′Еще одна строка′); Переменной можно присвоить содержимое одной строки: Stroke:=Memo1.Lines[i]; Практика Задача Составить программу для вычисления таблиц значений квадра- тов, кубов, квадратных и кубических корней, πn, π/(4n 2 ),1/n. Компоненты Имя компонента Свойства компонента Значение Назначение Form1 Caption Квадраты, кубы, кв. и куб. корни, пи*n, пи/4*(n в кв.), 1/n Заголовок формы Label1 Caption Программа вычисляет по вашему желанию таблицы значений в заданном ин- тервале натуральных чи- сел n Справочная ин- формация для пользователя про- граммы Label2 Caption Задайте интервал значе- ний натурального числа n Подсказка пользо- вателю Label3 Caption Поле для вывода результатов Edit1 Text Поле для ввода начального значе- ния n Edit2 Text Поле для ввода конечного значе- ния n ComboBox1 Text Items Выберите нужное матема- тическое выражение Квадраты Кубы Квадратные корни Кубические корни Пи*n Пи/[4*(n в кв.)] 1/n Текст в заголовке списка Значения строк в списке Button1 Caption Вычислить Кнопка для вычис- ления Button2 Caption Выход Кнопка закрытия 360 формы и выхода из программы Переменные Обозначение в программе Содержание Тип n Текущее значение числа Целый n1 Начальное значение интервала натураль- ных чисел Целый n2 Конечное значение ин- тервала натуральных чисел Целый Проект формы Текст модуля unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Math; // обязательно к стандартному списку подключить библиотеку // математических функций Math ……………………… var Form1: TForm1; n1,n2:Integer;{начальное и конечное значения интервала натуральных чисел} 361 n:integer; // текущее значение числа implementation {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); begin // процедура закрывает форму и осуществляет // выход из программы Form1.Close end; procedure TForm1.Button1Click(Sender: TObject); begin // ввод начального и конечного значений интервала // натуральных чисел n1:=StrToInt(Edit1.Text); n2:=StrToInt(Edit2.Text); Case ComboBox1.ItemIndex of 0: begin // очистка поля ввода от предыдущих значений label3.Caption:=' '; // если в поле со списком выбрано значение Квадраты // в цикле от n1 до n2 с шагом 1 вычисляются значения // квадратов чисел For n:=n1 To n2 Do Begin Label3.Caption:= Label3.Caption+ #13+ IntToStr(n)+' '+IntToStr(Sqr(n)); end; end; 1:begin // очистка поля ввода от предыдущих значений label3.Caption:=' '; // если в поле со списком выбрано значение Кубы // в цикле от n1 до n2 с шагом 1 вычисляются значения // кубов чисел For n:=n1 To n2 Do Begin Label3.Caption:= Label3.Caption+ #13+ IntToStr(n)+ ' ' + IntToStr(n*n*n); end; end; 2:begin label3.Caption:=' '; // если в поле со списком выбрано значение Квадратные корни 362 // в цикле от n1 до n2 с шагом 1 вычисляются значения // квадратных корней чисел For n:=n1 To n2 Do Begin Label3.Caption:= Label3.Caption+ #13+ IntToStr(n)+' ' + FloatToStrF(Sqrt(n),Fffixed,10,6); end; end; 3:begin label3.Caption:=' '; // функция логарифм не определена при нуле, // поэтому сдвигаем интервал значений на единицу If n1=0 Then begin label3.Caption:='0';n1:=n1+1; end; // если в поле со списком выбрано значение Кубические корни // в цикле от n1 до n2 с шагом 1 вычисляются значения // кубических корней чисел For n:=n1 To n2 Do Begin Label3.Caption:= Label3.Caption+ #13+ IntToStr(n)+' ' + FloatToStrF(exp(1/3*ln(n)),Fffixed,10,6); end; end; 4:begin label3.Caption:=' '; For n:=n1 To n2 Do Begin // если в поле со списком выбрано значение пи*n // в цикле от n1 до n2 с шагом 1 вычисляются значения // пи*n чисел Label3.Caption:= Label3.Caption+ #13+ IntToStr(n)+' '+ FloatToStrF((pi*n),Fffixed,10,6); end; end; 5:begin label3.Caption:=' '; // если в поле со списком выбрано значение пи/[4*(n в кв.)] // в цикле от n1 до n2 с шагом 1 вычисляются значения // пи/[4*(n в кв.)] If n1=0 Then begin Label3.Caption:='Бесконечность'; n1:=n1+1 End; For n:=n1 To n2 Do Begin Label3.Caption:= Label3.Caption+ #13+ IntToStr(n)+' '+ FloatToStrF((pi/(4*n*n)),Fffixed,10,6); end; 363 end; 6:begin label3.Caption:=' '; If n1=0 Then begin Label3.Caption:=' Бесконечность'; n1:=n1+1 end; // если в поле со списком выбрано значение 1/n // в цикле от n1 до n2 с шагом 1 вычисляются значения 1/n For n:=n1 To n2 Do Begin Label3.Caption:= Label3.Caption+ #13+ IntToStr(n)+' '+ FloatToStrF(1/n,Fffixed,10,6); end; end; Else Exit; end; end; end. Задача Составить программу для вычисления таблицы уклонов ме- стности. Уклоны местности определяют при проектировании ка- налов, дорог, направления движения тракторных агрегатов на пашне, изучении эрозии почв. Уклоном i называют отношение превышения h между точками к горизонтальному проложению S между ними. Для вычислений воспользоваться следующими формулами: ). 60 * .) (( ), ( , 180 * / ) tan( , / гр в i i округление мин в i i часть целая гр в i i Arc i s h i o o o − = = = = π Компоненты Имя компонента Свойства компонент Значение Назначение Form1 Caption Таблица уклонов Заголовок формы Label1 Caption При проектировании кана- лов, дорог, направления движения тракторных агре- гатов на пашне, изучении эрозии почв определяют уклоны местности. Уклоном i называют отношение пре- Справочная ин- формация для пользователя про- граммы 364 вышения h между точками к горизонтальному проложе- нию S между ними. Label2 Caption Интервал изменения пре- вышений Подсказка пользо- вателю Edit1 Text Нижняя граница интервала превы- шений Edit2 Text Верхняя граница интервала превы- шений Label3 Caption Шаг изменения превыше- ний Подсказка пользо- вателю Edit3 Text Поле для ввода шага изменения превышений Label4 Caption Интервал изменения гори- зонтальных проложений Подсказка пользо- вателю Edit4 Text Нижняя граница интервала горизон- тальных проложе- ний Edit5 Text Верхняя граница интервала горизон- тальных проложе- ний Label5 Caption Шаг изменения горизон- тальных проложений Подсказка пользо- вателю Edit6 Text Поле для ввода шага изменения горизонтальных проложений Label6 Caption В это поле про- грамма выводит шапку таблицы ук- лонов Memo1 Lines ScrollBars ….. ssBoth Компонент для вы- вода значений таб- лицы уклонов Выводить обе по- лосы прокрутки (вертикальную и горизонтальную) Button1 Caption ВЫЧИСЛИТЬ Кнопка для выпол- нения Button2 Caption ВЫХОД Кнопка для завер- шения работы про- граммы Переменные 365 Обозначение в программе Содержание Тип h Текущее значение пре- вышения Вещественный расши- ренный h1 Нижняя граница интер- вала превышений Вещественный расши- ренный h2 Верхняя граница интер- вала превышений Вещественный расши- ренный s Текущее значение гори- зонтального проложения Вещественный расши- ренный s1 Нижняя граница интер- вала горизонтальных проложений Вещественный расши- ренный s2 Верхняя граница интер- вала горизонтальных проложений Вещественный расши- ренный Dh Шаг изменения превы- шений Вещественный расши- ренный Ds Шаг изменения горизон- тальных проложений Вещественный расши- ренный i Текущее значение укло- на в тангенсах Вещественный расши- ренный ig Градусная часть уклона Целый im Минутная часть уклона Целый Ari Текущее значение укло- на в градусах Вещественный расши- ренный 366 Проект формы Текст модуля unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Math; // библиотека математических функций Math // подключается программистом …………… var Form1: TForm1; h1,h2: Extended; // границы интервала изменения превышений Dh:Extended;// шаг изменения превышений s1,s2:Extended;// интервал изменения горизонтальных проложений Ds: Extended; // шаг изменения горизонтальных проложений implementation {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); begin Form1.Close 367 end; procedure TForm1.Button1Click(Sender: TObject); Var i:Extended;// текущее значение уклона в тангенсах ig:Integer; // градусная часть уклона im:Integer; // минутная часть уклона h,s:Extended;// текущее значение превышения и // горизонтального проложения ARi:Extended;// текущее значение уклона в градусах begin // ввод исходных данных для программы h1:=StrToFloat(Edit1.Text); h2:=StrToFloat(Edit2.Text); Dh:=StrToFloat(Edit3.Text); s1:=StrToFloat(Edit4.Text); s2:=StrToFloat(Edit5.Text); Ds:=StrToFloat(Edit6.Text); // вывод шапки таблицы уклонов Label6.Caption:='Превышение Горизонтальное проложение Уклон в тангенсах' + ' Уклон в гр., мин.'; // текущее значение превышения принимает значение нижней границы h:=h1; { цикл выполняется, пока текущее значение превышения не превысит значение правой верхней границы} While h <= h2 Do Begin // текущее значение горизонтального проложения принимает значение // нижней границы s:=s1; { цикл выполняется, пока текущее значение горизонтального проложения не превысит значение правой верхней границы} While s <= s2 Do begin // вычисление текущего значения уклона в тангенсах i:=h/s; // перевод уклона в градусную меру ARi:=ArcTan(i)/pi*180; // выделение целой части — градусная часть уклона ig := Trunc(ARi); // вычисление минутной части значения уклона im:=Round((ARi-ig)*60); // вывод строки таблицы уклонов Memo1.Lines.Add(' '+ FloatToStrF(h,Fffixed,6,1) + ' | ' 368 + FloatToStrF(s,Fffixed,15,2) + ' | ' + FloatToStrF(i,Fffixed,15,5) + ' | ' + ' ' + IntToStr(ig) + ' ' + IntToStr(im)); // увеличение горизонтального проложения на величину шага s:=s+Ds; end; // увеличение превышения на величину шага h:=h+Dh; end; end; end. Один из возможных результатов работы программы Задача Составить программу для вычисления числа е. Известно, что сумма ряда 1+1/1!+1/2!+...+1/n! стремится к числу е. Число е=2,71828 играет важную роль в качестве основа- ния натуральных логарифмов. Компоненты Имя компонента Свойства компонента Значение Назначение Form1 Caption Число е Заголовок формы 369 Label1 Caption Известно, что сумма ряда 1+1/1!+1/2!+...+1/n! стре- мится к числу е. Число е=2,71828 играет важную роль в качестве основания натуральных логарифмов Справочная ин- формация для пользователя про- граммы Label2 Caption Точность вычисления чис- ла е Подсказка пользо- вателю Edit1 Text Поле для ввода точности вычисле- ния числа е Button1 Caption Вычислить Кнопка для вычис- ления Button2 Caption Новые данные Кнопка для очистки введенного значе- ния точности Button3 Caption Выход Кнопка для завер- шения работы про- граммы Label3 Caption Поле, в которое программа выводит вычисленное зна- чение числа е Переменные Обозначение в программе Содержание Тип n Номер члена ряда -1 Целый e Число е Вещественный, расширенный z Знаменатель члена ряда Длинный целый element Текущий элемент ряда Вещественный, расширенный T Точность вычисления числа е Вещественный, расширенный Проект формы Текст модуля unit Unit1; 370 …………………………… var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); begin Edit1.Clear end; procedure TForm1.Button3Click(Sender: TObject); begin Form1.Close end; procedure TForm1.Button1Click(Sender: TObject); Var e: Extended; // число е element:Extended; // текущий элемент ряда T: Extended;// точность вычисления числа е n:Integer; // номер члена ряда -1 z:LongInt; // знаменатель члена ряда begin // инициализируем числом 1 значения переменных e, z, n e:=1; z:=1; n:=1; // ввод точности вычисления числа e T:=StrToFloat(Edit1.Text); //цикл вычисления суммы ряда для числа e Repeat z:=Z*n; element:=1/z ; e:=e+element; n:=n+1; { выход из цикла происходит, когда очередной член ряда меньше или равен точности вычисления числа е} Until T >=element ; // вывод вычисленного числа e Label3.Caption:='число е равно: '+FloatToStrF(e,Fffixed,10,8) end; end. 371 Задачи для самостоятельного решения Циклы с условием № 4.1. Написать программу для вычисления значений Y= Z 2 при изменении Z от N1 до N2 с шагом K, где K, N1, N2 — натураль- ные числа. № 4.2. Написать программу для вычисления суммы нечетных чи- сел натурального ряда в интервале от N1 до N2, , где N1, N2 — натуральные числа. № 4.3. Написать программу для вычисления значений Y Q = при изменении Y от N1 до N2 с шагом K, где K, N1, N2 — натураль- ные числа. № 4.4. Написать программу для вычисления суммы обратных ве- личин чисел от N1 до N2 с шагом K, где K, N1, N2 — натураль- ные числа. № 4.5. Написать программу для вычисления выражения S= π*R*R при изменении R в интервале от 1 до N с шагом K где K, N — на- туральные числа. № 4.6. Составить программу для вычисления членов последова- тельности: ) 1 ( 1 3 2 1 2 1 1 + ⋅ + + ⋅ + ⋅ = n n S n , где n — натуральное число. Члены последовательности вычислять до тех пор, пока текущий член последовательности не станет меньше заданного числа ε (0< ε<0,0001). № 4.7. Составить программу для вычисления суммы ряда: 372 3 3 3 3 1 3 1 2 1 1 1 n + + + + , где n — натуральное число. Сумму ряда вычислять до тех пор, пока текущий член последова- тельности не станет меньше заданного числа ε (0<ε<0,0001). № 4.8. Составить программу для вычисления суммы ряда: 6 1 5 1 4 1 3 1 2 1 1 + − + − + − Сумму ряда вычислять до тех пор, пока текущий член последова- тельности не станет меньше заданного числа ε (0<⏐ε⏐<0,0001). № 4.9.Составить программу для вычисления члена a n последова- тельности a 1 , a 2 , …, образованной по закону для которого выполняется условие ⏐a n –a n-1 ⏐<ε, причем n — номер члена последовательности (n ≥2), ε — заранее заданное положительное число. № 4.10. Написать программу для вычисления члена b n последова- тельности b 1 , b 2 , …, образованной по закону ), 1 1 1 )...( 3 1 1 )( 2 1 1 ( + − − − = n b n для которого выполняется условие ⏐b n –b n-1 ⏐<ε, где n — номер элемента последовательности (n ≥2); ε — заданное положительное число. Циклы с параметром № 4.11. Написать программу для вычисления суммы S=S+1/i, где i=1, 2,..., N. № 4.12. Написать программу для вычисления произведения пер- вых N натуральных чисел. № 4.13. Написать программу для вычисления dx=h*h/(2*S), при значениях: 100 ≤ S ≤ 1000 м. № 4.14. Написать программу для вычисления суммы S из значе- ний Y=X*X*X, где X задан в интервале от N1 до N2, где N1 и N2 — натуральные числа. , 1 1 2 2 − − + = n n n a n |