Главная » Статьи » Программирование » Pascal |
Структурированные операторы (примерны можно найти на форуме)Структурированными являются такие операторы, которые состоят из других операторов. К ним относятся:
Составной операторСоставной оператор представляет собой группу из произвольного числа операторов, отделенных друг от друга «;» и ограниченную операторными скобками Begin и End Формат: Begin <оператор>; <оператор>; ……. <оператор>; End; Например: Begin A:=A*B+(N-D); Rez:=A+B*Pi; WriteLn(Rez:12:6); End; Условный оператор IfОператор If изменяет порядок выполнения операторов в зависимости от истинности или ложности некоторого условия. Существует два варианта оператора:
Условие может быть простым или сложным. Сложные условия образуются с помощью логических операций AND, OR, NOT. При записи условий могут использоваться все возможные операции отношения. Результат выражения всегда имеет булевский тип (истина или ложь). В первом варианте, если условие принимает значение "Истина", выполняется оператор 1, если условие - "Ложь", выполняется оператор 2. Например: A:=2; B:=8; If A>B Then WriteLn(‘A>B’) Else WriteLn(‘A<=B’); Во втором варианте формата, если условие принимает значение "Истина", выполняется оператор, если условие - "Ложь", выполняется оператор, следующий сразу за оператором If. Например: A:=2; B:=8: C:=0; If A>B Then C:=A+B; C:=C+12; WriteLn(‘C=’,C); (Результат выполнения программы – 12). Один оператор If может входить в состав другого оператора If. В таком случае говорят о вложенности операторов. Формат: If <условие> Then If <условие> Then <оператор> Else <оператор>; Например: If A<20 Then If A>=15 Then WriteLn(‘А в диапазоне 15 - 20’) Else (WriteLn(‘А в диапазоне 1 - 14’); Конструкцию со степенью вложенности более 2 – 3 лучше избегать из-за сложности их анализа. Примеры:
If A>B Then D:=A+B Else D:=A-B;
If A<B Then Begin WriteLn(‘A<B’); D:=A*B; End Else Begin WriteLn(‘A>=B’); D:=A/B; End;
If (A=B) And (C=D) Then Begin WriteLn(‘Норма’); F:=0; End Else Begin WriteLn(‘Превышение нормы’); F:=100; End;
Примеры решения задач
Var Mi, X,Y,Z:Integer; BEGIN WriteLn(‘Введите три числа’); ReadLn(X,Y,Z); Mi:=X; If Y<Mi Then Mi:=Y; If Z<Mi Them Mi:=Z; WriteLn(‘ Минимальное число=’,Mi); END.
Var PP,A,B,C:Real; BEGIN WriteLn(‘Введите три числа’); ReadLn(A,B,C); If A<B Then Begin PP:=A; A:=B; B:=PP; End; If A<C Then Begin PP:=A; A:=C; C:=PP; End; If B<C Then Begin PP:=B; B:=C; C:=PP; End; WriteLn(‘A>B>C’,A,B,C); END.
Var A,B,S:Integer; BEGIN Repeat WriteLn(‘Введите два натуральных значения’); ReadLn(A,B); Until (A>B) AND (B>C); WriteLn(‘Введите остаток’); ReadLn(S); If A MOD B = S Then WriteLn(‘остаток от деления А на В=’,S) Else WriteLn(‘остаток от деления А на В не =’,S); END.
4. Даны положительные целые числа A, B, C. Выяснить существует ли треугольник с длинами сторон A, B, C. USES Crt; VAR A, B, C: INTEGER; BEGIN ClrScr; WriteLn('Введите три числа'); ReadLn(A,B,C); IF (A+B>C) AND (A+C>B) AND (B+C>A) Then WriteLn('Треугольник построить можно') Else WriteLn('Треугольник построить нельзя'); END. 5. Верно ли, что в числе N первая и последняя цифры одинаковы (100<=N<1000). USES Crt; LABEL M1; VAR N,S,D,E: Integer; BEGIN M1: ClrScr; Write(‘Введите целое трехзначное число ’); ReadLn(N); If (N <100) OR (N>=1000) Then GoTo M1; {Выделение цифры в числе} S:=N Div100; {сотни} D:=((N-S*100) Div 10; {десятки} E:=N mod 10; {единицы} If S=E Then WriteLn(‘Первая и последняя цифры одинаковы’) Else WriteLn(‘Первая и последняя цифры не одинаковы’); END. Примеры для самостоятельного решения:
Условный оператор CaseОператор Case является обобщением оператора If и позволяет сделать выбор из произвольного числа имеющихся вариантов. Формат: Case <выражение> Of <список 1>:<оператор 1;> <список 2>:<оператор 2;> …….. <список n>:<оператор n;> [ Else <оператор>] End; В этой структуре: Выражение – выражение любого простого типа, кроме вещественного типа, значение которого вычисляется. список 1, список 2,…, список n – константы, с которыми сравнивается значение выражения. оператор 1, оператор 2,…, оператор n – операторы, из которых выполняется тот, с константой которого совпадает значение выражения. оператор – оператор, который выполняется, если значение выражения не совпадает ни с одной из констант. Ветвь оператора Else является необязательной. Если она отсутствует и значение выражения не совпадает ни с одной из перечисленных констант, весь оператор рассматривается как пустой. В отличие от оператора If перед словом Else точку с запятой можно ставить, хотя это и необязательно. Примеры решения задач
Ввести номер месяца и определить месяц, соответствующий этому номеру. Var X: Byte; BEGIN Write(‘Введите номер месяца:’); ReadLn(X); Case X Of 1: Write(‘Январь’); 2: Write(‘Февраль’); 3: Write(‘Март’); 4: Write(‘Апрель’); 5: Write(‘Май’); 6: Write(‘Июнь’); 7: Write(‘Июль’); 8: Write(‘Август’); 9: Write(‘Сентябрь’); 10: Write(‘Октябрь’); 11: Write(‘Ноябрь’); 12: Write(‘Декабрь’); Else WriteLn(‘Такого месяца нет’); End; END.
Ввести номер месяца и определить время года, к которому относится этот месяц. Var X: Byte; BEGIN Write(‘Введите номер месяца:’); ReadLn(X); Case X Of 1..2,12: WriteLn(‘Зима’); 3..5: WriteLn(‘Весна’); 6..8: WriteLn(‘Лето’); 9..11: WriteLn(‘Осень’); End; END.
Составить программу, которая по введенному значению выводит оценки по математике, физике, химии. USES Crt; VAR M:Char; BEGIN ClrScr; WriteLn(' По какому предмету Вы хотите увидеть оценки'); WriteLn(' М - математика'); WriteLn(' Ф - физика'); WriteLn(' Х - химия'); ReadLn(M); CASE M OF 'М','м':WriteLn('5 5 4 4 5 5 3 5 5 '); 'Ф','ф':WriteLn('5 4 5 3 5 4 5 5 5 '); 'Х','х':WriteLn('4 3 5 3 4 4 4 5 '); End; END. Примеры для самостоятельного решения:
Оператор цикла ForЦиклы позволяют многократно выполнять отдельный оператор или последовательность операторов, причем при этом нет необходимости записывать в тексте программы одинаковые операторы несколько раз. Оператор цикла For организует выполнение одного оператора (или несколько операторов) заранее известное число раз. Оператор For может быть представлен в двух форматах:
<тело цикла>;
<тело цикла>; <параметр цикла> - переменная цикла, которая может быть целочисленного или символьного типа. Параметр цикла изменяется, увеличиваясь до конечного значения (1 формат). Параметр цикла может изменяться в противоположном направлении - убывать (2 формат); S1 – начальное значение параметра цикла, которое она получает при первом выполнении цикла; S2 - конечное значение параметра цикла, достигнув которое повторение цикла прекращается; For…Do – заголовок цикла; < тело цикла > - оно может быть простым, состоящим из одного оператора или составным оператором. Например: For I:=1 To 20 Do Write(‘*’); 20 раз выведется на экран в одной строке «*» Особенности выполнения оператора For
Например: For I:=10 To 14 Do Write(I:3); {Результат выполнения - V10V11V12V13V14} For I:=14 DownTo 10 Do Write(I:3); {Результат выполнения - V14V13V12V11V10}
Например: For I:= 1 To 10 Do Begin Rez:=A/Pi; I:=I+1; {ошибка, попытка изменить параметр цикла} End;
Примеры решения задач1. Найти произведение положительных, сумму и количество отрицательных из 10 введенных целых значений. USES Crt; VAR X: INTEGER; S, K, P: INTEGER; I: BYTE; Begin Clrscr; {чистка экрана} P:=1; S:=0; K:=0; FOR I:=1 TO 10 DO Begin WriteLn(‘Введите ‘,I,’ -е значение’); ReadLn(x); IF X>0 Then P:=P*X; { произведение положительных } IF X<0 Then Begin S:=S+X; { сумма отрицательных } K:=K+1; { количество отрицательных } End; End; WriteLn(‘ Произведение положительных значений = ‘,p); WriteLn(‘ Сумма отрицательных значений = ‘,s); WriteLn(‘ Количество отрицательных значений = ‘,k); END. 2. Из N целых чисел найти минимальное значение. USES Crt; VAR MI, X: INTEGER; I,N: BYTE; BEGIN WriteLn('Введите количество значений'); ReadLn(n); WriteLn('Введите первое значение'); ReadLn(mi); FOR I:=2 TO N DO Begin WriteLn(‘Введите ‘,I,’ -е значение’); ReadLn(x); IF X<MI Then MI:=X; End; WriteLn(‘Минимальное значение = ‘,MI); END. 3. Из N целых чисел найти минимальное среди положительных и максимальное среди отрицательных значений. USES Crt; VAR MI, MA, N, I, X: INTEGER; FL, FL1: BYTE; BEGIN Clrscr; WriteLn('Введите количество значений'); ReadLn(N); FL:=0; FL1:=0; FOR I:=1 TO N DO Begin WriteLn('Введите ',I,' значение'); ReadLn(X); IF (FL=0) AND (X<0) Then Begin MA:=X; FL:=1; End; IF (FL1=0) AND (X>0) Then Begin MI:=X; FL1:=1; End; IF (X<0) AND (X>MA) Then MA:=X; IF (X>0) AND (X<MI) Then MI:=X; End; IF FL=1 Then WriteLn('максимальное среди отрицательных = ',ma) Else WriteLn('отрицательных нет'); IF FL1=1 Then WriteLn('минимальное среди положительных = ',mi) Else WriteLn('положительных нет'); END. Примеры для самостоятельного решения:
Оператор цикла Repeat…UntilЭтот оператор называется циклом с постусловием, т.к. проверка условия осуществляется после каждого выполнения тела цикла. Формат: Repeat <тело цикла>; Until <условие>; Условие – выражение булевского типа. При написании условия допустимы булевские операции (And, Or, Not) и операции отношения. Операторы, заключенные между словом Repeat и Until, являются телом цикла. Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Если результат выражения –False, тело цикла выполняется еще раз, если результат – True, то происходит выход из цикла. Особенности выполнения оператора Repeat
Например:
Примеры решения задач
Var X:Integer; Begin Repeat Write(‘Введите отрицательное число’); ReadLn(X); If X>=0 Then WriteLn(‘Введено неправильное число’); Until X<0; End.
Var I,Sum:Integer; Begin Sum:=0; I:=0; Repeat I:=I+1; Sum:=Sum+I; Until I=50; WriteLn(‘Сумма чисел от 1 до 50 = ’),Sum; End.
Var S, KS, N: Byte; {S-подсчет количества ступенек, KS-количество шагов} Begin S:=0; KS:=0; Repeat S:=S+3; KS:=KS+1; Until I>N; WriteLn(‘Количество шагов= ’,KS); End. Примеры для самостоятельного решения:
Оператор повтора WhileЭтот оператор называется циклом с предусловием, т.к. проверка условия осуществляется до начала очередной итерации. Формат: While <условие> Do <тело цикла>; Цикл выполняется, пока условие истинно. Как только условие нарушается, выполнение цикла завершается Особенности выполнения оператора While
В ряде случаев возникает необходимость в бесконечном цикле. Тогда в условии записывается константа True или условие, которое имеет значение True. Например: While True Do Write(‘Бесконечный цикл’); While 1=1 Do Write(‘Бесконечный цикл’); Примеры решения задач1. Дано целое число а и натуральное (целое неотрицательное) число n. Вычислить а в степени n. {Введем целую переменную k, которая меняется от 0 до n, причем поддерживается такое свойство: b = (a в степени k).} USES Crt; VARA, N, B, K : INTEGER; BEGIN ClrScr; Write(‘ Введите два значения ‘); ReadLn(A,N); K := 0; B := 1; While K <> N DO Begin K := K + 1; B := B * A; End; Write(‘ A в степени N = ’,B); END. 2. Даны натуральные числа а, b. Вычислить произведение а*b, используя в программе лишь операции +, -, =, <>. USES Crt; VAR A, B, C, K : INTEGER; BEGIN Write(‘ Введите два значения ‘); ReadLn(A,B); K := 0; C := 0; While K <> B DO Begin K := K + 1; C := C + A; End; {C = A * K и K = B, следовательно, C = A * B} Write(‘ A*B= ‘,C); END. 3. Вычислить значение переменной Y=2K+N при всех значениях переменных N=1,2,3 и K=2,4,6,8. обратите внимание на то, что если перебирать N и K получим 12 значений переменной Y. Var N,K,Y: Integer; Begin For N:=1 To 3 Do Begin K:=2; While K<=8 Do Begin Y:=2*K+N; WriteLn(‘При N= ’,N:4,’ и K= ’,K:4,’ Y= ’Y:4); K:=K+2; End; End; End. 4. Составить программу перевода числа из 10 системы счисления в 2 систему счисления. Для этой задачи представлено два решения. USES Crt; VAR DES, OST, I, DW:INTEGER; BEGIN ClrScr; Write('Введите десятичное число '); ReadLn(DES); I:=1; While (DES>=2) DO Begin OST:=DES mod 2; DES:=DES div 2; DW:=DW+OST*I; I:=I*10; End; DW:=DW+DES*I; Write('Двоичная запись числа ',DW); END. Примеры для самостоятельного решения: 1.К старушке на обед ходят кошки. Каждую неделю две кошки приводят свою подружку. В доме у старушки 100 мисок. Через какое время появятся лишние кошки, и сколько кошек при этом останется голодными. 2.Известна сумма номеров страниц, определить номер страницы. 3.Лягушка каждый последующий прыжок делает в два раза короче предыдущего. Достигнет ли она болота и за сколько прыжков. Длину первого прыжка задайте самостоятельно. Вложенные циклыДля решения задачи достаточно часто требуется использовать две и более циклические конструкции, одна из которых расположена внутри другой (других). Такие конструкции называются вложенными циклами. Какие именно циклы при этом используются, роли не играет, они могут быть организованы посредством любых рассмотренных ранее операторов (For, While, Repeat … Until). Примеры решения задач 1. Даны натуральные числа n и k. Составить программу вычисления выражения 1k + 2k + … + nk Для вычисления указанной суммы целесообразно использовать оператор For с управляющей переменной I, изменяющейся от 1 до n. В теле цикла вычисляется очередное значение y=Ik и накапливается искомая сумма s=s+y. Var n, k, y, I, s, j: Integer; Begin WriteLn (‘Введите n и k ‘); ReadLn (n, k); s: = 0; For i: = 1 To n Do Begin y: = 1; For j: = 1 To k Do y: = y*i; s: = s + y End; WriteLn (‘Сумма: ‘ , s) End.
2. Сложим все цифры какого-либо числа. Получим новое число, равное сумме всех цифр исходного числа. Продолжим этот процесс до тех пор, пока не получим однозначное число (цифру). Оно называется цифровым корнем исходного числа. Например, цифровой корень числа 34697 равен 2(3+4+6+9+7=29; 2+9=11; 1+1=2). Составьте программу нахождения цифрового корня натурального числа. Var n, k, s: LongInt; Begin WriteLn (‘Введите число‘); ReadLn (n); s: = n; While s>9 Do Begin k : = s ; s : = 0; Repeat s : = s + k mod 10; k : = k div 10 Until k = 0 End; WriteLn (‘Цифровой корень числа ‘,n,’ равен ‘,s) End. 3. Старинная задача. Сколько можно купить быков, коров и телят, если бык стоит 10 рублей, корова – 5 рублей, теленок – полтинник (0,5 рубля), при условии, что на 10 рублей надо купить 100 голов скота. Решение: обозначим через b – количество быков, k – количество коров, t – количество телят. После этого можно записать два уравнения: 10b + 5 k + 0,5t = 100 и b + k + t = 100 Преобразуем их: 20b + 10k + t = 200 и b + k + t = 100
На 100 рублей можно купить:
Таким образом, получаем:
Var b, k, t: Integer; Begin For b: = 0 To 100 Do For k: = 0 To 20 Do For t: = 0 To 200 Do If (20*b+10*k+t=200) and (b+k+t=100) Then WriteLn ( ‘быков ‘ ,b, ‘ коров ‘ ,k, ‘ телят ‘ ,t) End. Сколько раз будет проверяться условие в данной программе (сколько раз будет выполняться оператор If)? Переменная b принимает 11 различных значений (от 0 до 10), для каждого значения переменной b переменная k изменяется от 0 до 20, а для каждого значения переменной k переменная t изменяется от 0 до 200. Таким образом, условие будет проверяться 11 · 21 · 201 = 46431 раз. Но если известно количество быков и коров, то количество телят можно вычислить по формуле t = 100 – (b + k) и цикл по переменной t можно исключить. Program My 9_3; Var b, k, t: Integer; Begin For b: = 0 To 100 Do For k: = 0 To 20 Do Begin t: = 100 – (b + k) ; If (20*b+10*k+t=200) Then WriteLn ( ‘быков ‘ ,b, ‘ коров ‘ ,k, ‘ телят ‘ ,t) End End. В этой программе условие повторяется 11 · 21 = 231 раз. Попробуйте еще уменьшить количество проверок. 4. Написать программу, которая находит все четырехзначные числа abcd (a, b, c, d – цифры числа, причем все они различны), для которых выполняется условие: ab – cd = a + b + c + d Другими словами, разность чисел, составленных из старших цифр числа и из младших, должна быть равна сумме цифр числа. Эту задачу можно решать разными способами. Например, можно перебирать все четырехзначные числа и проверять выполнение условия. Попробуем сократить перебор: из равенства 10 · a + b – (10 · c + d) = a + b + c + d получаем 9 · (a – c ) = 2 · (c + d) или (a – c) / (c + d) = 2 / 9, a = c + 2, d = 9 – c и 0 ≤ c ≤ 7.
Var a, b, c, d: Integer; Begin For c: = 0 To 7 Do Begin a: = c + 2; d: = 9 - c; For b: = 0 To 9 Do If (b<>c) and (b<>a) and (b<>d) Then WriteLn (a, b, c, d) End End. 5. Дано натуральное число, кратное 3. Найдем сумму кубов цифр данного числа. Получим новое число. Применим к нему такое же преобразование и т.д. Оказывается, что любая последовательность чисел сходится к числу 153. Program My 9_5; Var n, m, t, s, q: LongInt; Begin WriteLn (‘Введите число, оно умножается на 3, далее для полученного числа строится последовательность ‘); ReadLn (n); m: = 3 * m; Write (m, ‘ ‘ ); Repeat s : = 0; t : = m; While m > 0 Do Begin q: = m mod 10; s: = s + q * q * q; m: = m div 10 End; m: = s; Write (m, ‘ ‘ ) Until m = t; ReadLn End. | |||
Просмотров: 3158 | | |
Всего комментариев: 0 | |