Кодирование управляющих команд организации действий
на процедурных языках Ершол, QBasic, Turbo Pascal[13]
№ п/п | Название команды | Представление | ||||
Графическое | Turbo Pascal | QBasic | Ершол | |||
Серии S1,…,SN состоят из одной команды | Серии S1,…,SN содержат более одной команды | |||||
Команды ветвления | ||||||
Команда ветвления в полной форме | If P then S1 else S2; | If P then begin S1 end else begin S2 end; | If P then S1 else S2 End if | если P то S1 иначе S2 все | ||
Команда ветвления в сокращенной (неполной) форме | If P then S1; | If P then begin S1 end; | If P then S End if | если P то S все | ||
Команда выбора в полной форме | If P1 then begin S1; Goto K end; If P2 then begin S2; Goto K end; … If Pn then Sn else Sn+1; K: <следующий за командой выбора оператор> | If P1 then begin S1; Goto K end; If P2 then begin S2; Goto K end; … If Pn then begin Sn end else begin Sn+1 end; K: <следующий за командой выбора оператор> | If P1 then S1 elseif P2 then S2 elseif P3 then S3 … elseif Pn then Sn else Sn+1 End if | выбор при P1: S1 при P2: S2 при P3: S3 … при Pn: Sn иначе Sn+1 все | ||
Команда выбора в сокращенной форме | If P1 then begin S1; Goto K end; If P2 then begin S2; Goto K end; … If Pn then Sn; K: <следующий за командой выбора оператор> | If P1 then begin S1; Goto K end; If P2 then begin S2; Goto K end; … If Pn then begin Sn; end; K: <следующий за командой выбора оператор> | If P1 then S1 elseif P2 then S2 elseif P3 then S3 … elseif Pn then Sn End if | выбор при P1: S1 при P2: S2 при P3: S3 … при Pn: Sn все |
Циклические команды | ||||||
Команда повторения «пока» (цикл с предусловием) | While P do S; | While P do begin S end; | Do while P S Loop | нцпока P S кц | ||
Команда повторения «повторять S пока P не станет истинным» (цикл с постусловием) | Repeat S Until P; | Repeat S Until P; | Do S Loop until P | нц S кцпри P | ||
Команда повторения «для» (цикл с параметром) | For i:=i1 to i2 do S; For i:=i1 downto i2 do S; | For i:=i1 to i2 do begin S end; For i:=i1 downto i2 do begin S end; | For i=iнач to iкон [step шаг] S Next i | нцдля i от iнач до iкон [шаг iшаг] S кц |
Оператор варианта на языках QBasic и Turbo Pascal
QBasic | Turbo Pascal | ||
Select Case <выражение> Case <значение1> <серия операторов, которые выполняются, когда значение выражения равно значению1> Case <значение2> <серия операторов, которые выполняются, когда значение выражения равно значению2> … Case <значение_n> <серия операторов, которые выполняются, когда значение выражения равно значению_n> [Case Else <серия операторов, которые выполняются, когда значение выражения не равно значению1, значению2, … , значению_n> End Select | Case <выражение> of
<список1, значений выражения, перечисленных через запятую>:
begin
S1
end;
begin S2 end; … <список_n, значений выражения, перечисленных через запятую>: begin Sn end [else begin Sn+1 end;] end; |
2. Коды программ решения задач 10-36 на языках Ершол, QBasic, Turbo Pascal[14]
Задача 10, стр. 33 (Ершол): алг БИД (аргвещ a, b, резвещ x) начвещ R │ |ввод операндов a и b организует сама │ |система Ершол, они описаны как арг │ R:=a-b |найдем разность чисел a и b │ |команда ветвления в полной форме │ если R<0 |если условие R<0 истинно, │ │то x:=b |то x присваивается │ │ |значение b, │ │иначе x:=a| иначе х принимает зн. а │ │ все │ |вывод операнда x организует сама │ |система Ершол, он описан как рез кон Задача 10, стр. 33 (QBasic) REM Большее из двух 'Блок описания переменных a, b, R, x DIM a AS SINGLE, b AS SINGLE DIM R AS SINGLE, x AS SINGLE CLS 'Очистка экрана 'Ввод чисел a и b INPUT "Введите два числа a и b: "; a, b 'Найдена разность чисел a и b R = a – b 'Сравниваем разность с 0 IF R < 0 THEN 'Если разность меньше 0, то большее 'число b x = b ELSE 'иначе, 'если разность больше или равна 0, 'то большее число a x = a END IF 'Блок вывода результата PRINT "Большее из чисел "; PRINT USING "###.###"; a;:PRINT " и"; PRINT USING "###.###"; b;:PRINT " ---"; PRINT USING "###.###"; x END 'Конец Задача 11, стр. 34 (Turbo Pascal) Program Kvadr_ur; Uses CRT; | Задача 10, стр. 33 (Turbo Pascal): Program BID;{Заголовок} Uses CRT; {Подсоединение модуля CRT} {Блок описания переменных} Var a,b,R,x:real; {a, b, R, x – вещественные} Begin ClrScr; {Очистка экрана} {Вывод на экран подсказки} Write('Введите два числа: '); Readln(a,b); {Ввод чисел a и b} R:=a-b; {Нахождение разности чисел a и b} {Выбор большего из чисел a и b} If R<0 then x:=b else x:=a; {Блок печати} Writeln('max (',a:6:3,' и ',b:6:3,' - ) ', x:6:3) End. Задача 11, стр. 34 (Ершол) алг КВУР (аргвещ a,b,c) начвещ R,D,x1,x2 |данные R, D - │ |промежуточные величины │ |ввод аргументов организует │ |система Ершол │ D:=b*b-4*a*c|оператор │ |присваивания │ | команда ветвления в полной форме │ если D>0 │ │то │ │ |если D>0, то вычисляем корни │ │R:=sqrt(D) |квадратного уравнения │ │ x1:=(-b-R)/(2*a); x2:=(-b+R)/(2*a) │ │ |выводим знач. x1 и x2 │ │вывод нс, "x1= ",x1,нс,"x2= ",x2 │ │иначе │ │|выводим сообщение │ │ вывод нс │ │ вывод "корни не вычисляем │ │ (D<=0)" │ все кон | |
Var a,b,c,d,r,x1,x2:real; Begin Write('Введите коэффициенты a,b,c:'); Readln(a,b,c); d:=b*b-4*a*c; If d>0 then begin r:=sqrt(d); x1:=(-b-r)/(2*a); | Задача 11, стр. 34 (QBasic) REM Квадратное уравнение DIM a AS SINGLE, b AS SINGLE DIM c AS SINGLE, d AS SINGLE DIM r AS SINGLE, x1 AS SINGLE DIM x2 AS SINGLE INPUT "Введите коэфф. a,b,c: "; a,b,c d = b * b - 4 * a * c IF d > 0 THEN | |
x2:=(-b+r)/(2*a); Writeln('x1=',x1,' x2= ',x2) end else Writeln('Корни не вычисляем (D<=0)') End. Задача 12, стр. 34 (Ершол) алг площадь треугольника (резвещ s) дано надо начвещ a,b,c, вещ p,k │ |данные p и k-промежуточные │ |величины │ |оператор вывода сообщения │ вывод "введите знач. а" │ ввод a |оператор ввода операнда a │ |оператор вывода сообщения │вывод нс,"введите знач. b" │ ввод b |оператор ввода операнда b │вывод нс,"c= " |оператор вывода │ |сообщения │ ввод c |оператор ввода операнда c │ p:=(a+b+c)/2 |оператор присваивания │|оператор присваивания │k:=p*(p-a)*(p-b)*(p-c) │ если k>0 │ │то │ │ s:=sqrt(k) │ │иначе │ │ s:=-1 │ все │ |вывод значения s организует система │ |Ершол кон Задача 13, стр. 35 (Ершол) алг БИT (аргвещ a,b,c,d, резвещ max) дано надо нач │ |ввод данных a,b,c организует система │ |Ершол │ |команда ветвления в полной форме │если a<b |проверяется условие a<b, │ │то |если условие истинно, то │ │ max:=b |max присваивается │ │ |значение b, │ │иначе |если условие ложно, то │ │ max:=a |max присваивается │ │ |значение a │ все │|команда ветвления в сокращенной │|форме │ если max<c |проверяется условие │ |max<c, │ │то |если условие истинно, то │ │max:=c |max присваивается │ │ |значение с, │ │|иначе команда ветвления никаких │ │|действий не предписывает │ все │ |вывод результата max организует │ |система Ершол кон Задача 13, стр. 35 (QBasic) REM Большее из трех DIM a AS SINGLE, b AS SINGLE DIM c AS SINGLE, max AS SINGLE INPUT "Введите a,b,c: "; a, b, c IF a < b THEN max = b ELSE max = a END IF IF max < c THEN max = c PRINT max END Задача 14, стр. 35 (Turbo Pascal способ 1) Program Func; Uses CRT; Var x,y:real; Begin Write('Введите x: '); Readln(x); If x>22 then y:=1/(x*x+1) else If x<=3 then y:=x-1 else y:=x*x*x+2; Writeln('x=',x,' y=',y) End. Задача 14, стр. 35 (Ершол способ 2) алг функция (аргвещ x, резвещ y) дано надо нач │ |ввод знач. операнда x организует │ |система Ершол │ |команда выбора в полной форме │ выбор │ │|x<=3-истинно, то y присваивается │ │|значение x-1 │ │при x<=3: y:=x-1 │ │| 3<x<=22-истинно, то y принимает │ │|значение x**3+2, │ │при x<=22: y:=x**3+2 │ │| иначе x>22, y принимает значение │ │|1/(x*x+1) │ │иначе y:=1/(x*x+1) │ все │ |вывод результата y организует │ |система Ершол кон Задача 14, стр. 35 (QBasic способ 2) REM Значение функции DIM y AS SINGLE, x AS SINGLE INPUT "Введите x: "; x IF x <= 3 THEN y = x - 1 ELSEIF x <= 22 THEN y = x * x * x + 2 ELSE y = 1 / (x * x + 1) END IF PRINT "x="; x; " y="; y END Задача 15, стр. 37 (Ершол) алг пересечение отрезков (аргвещ a,b,c,d, резвещ R) начвещ x,y |промежуточные данные |x и y │ |ввод данных a,b,c,d организует │ |система Ершол │ |первая команда ветвления в полной │ |форме │если a>=c |если условие a>=c истинно, │ │то x:=a |то x присваивается │ │ |значение a, │ │иначе x:=c |иначе значение c │ все │|вторая команда ветвления в полной │|форме │ если b>=d |если условие b>=d │ |истинно, │ │то y:=d |то y присваивается значение │ |d, │ │иначе y:=b|иначе – значение b │ все │|третья команда ветвления в полной │|форме │ если x<=y |если условие x<=y │ |истинно, │ │то R:=1 |то R присваивается │ |значение 1, │ │ вывод нс, "[",x,";",y,"]" │ │иначе R:=0| иначе – значение 0 │ все │ |вывод операнда R организует система │ |Ершол кон Задача 16, стр. 37 (Ершол) алг сумма кубов (резцел s) дано надо начцел n │ |задание начальных значений │ |переменным s и n │ s:=0 |s - текущая сумма │ n:=1 |n - номер текущего слагаемого │|цикл с предусловием, │нцпока n<=100 |проверка условия, │ │ s:=s+n*n*n |пока условие истинно │ │n:=n+1 |выполняются команды │ |тела цикла │ кц │ |вывод значения s организует система │ |Ершол, т.к. операнд s описан как рез кон Задача 16, стр. 37 (Turbo Pascal) Program Summa; Uses CRT; Var s,n: integer; Begin s:=0; n:=1; Repeat s:=s+n*n*n; n:=n+1 Until n>100; Writeln('s=',s) End. Задача 16, стр. 37 (QBasic) REM Сумма кубов DIM s AS LONG, n AS INTEGER s = 0 : n = 1 DO s = s + n * n * n : n = n + 1 PRINT s, n LOOP UNTIL n > 100 PRINT "s="; s END Задача 17, стр. 39 (Turbo Pascal) Program Root; Uses CRT; Var x,e,y1,y2,d:real; Begin Write('Введите x,e'); Readln(x,e); y1:=x; Repeat y2:=2/3*(y1+x/(2*y1*y1)); d:=abs(y2-y1); y1:=y2 Until d<=e; Writeln(y1:7:5) End. Задача 17, стр. 39 (QBasic) REM Корень третьей степени DIM x AS SINGLE, e AS SINGLE DIM y1 AS SINGLE, y2 AS SINGLE DIM d AS SINGLE INPUT "Введите x, e"; x, e y1 = x DO y2 = 2 / 3 * (y1 + x / (2 * y1 * y1)) d = ABS(y2 - y1) : y1 = y2 LOOP UNTIL d <= e PRINTUSING "###.##"; y1 END Задача 18, стр. 40 (Turbo Pascal) Program Fibonacci; Uses CRT; Var a,b,c,k,n:integer; Begin Write('Введите n '); Readln(n); a:=1; b:=1; k:=3; Repeat c:=a+b; a:=b; b:=c; k:=k+1 Until k>n; Writeln(c) End. Задача 18, стр. 40 (QBasic) REM Число Фибоначчи DIM a AS INTEGER, b AS INTEGER DIM c AS INTEGER, k AS INTEGER DIM n AS INTEGER INPUT "Введите n "; n a = 1 b = 1 k = 3 DO c = a + b : a = b : b = c k = k + 1 LOOP UNTIL k > n PRINT c END Задача 19, стр. 41 (Turbo Pascal) Program Cosinus; Uses CRT; Var x,e,a,s,r:real; n:integer; Begin Write('Введите x,e '); Readln(x, e); a:=1; s:=1; x:=x*pi/180; r:=-1*x*x; n:=1; Repeat a:=a*r/((2*n-1)*2*n); s:=s+a; n:=n+1 Until abs(a)<=e; Writeln(x,s) End. Задача 20, стр. 41 (Ершол) |заголовок алг полет мухи(аргвещ e,d,vm,v1,v2) дано надо начлит l, вещ y,t,x,s │ |ввод операндов (e, d, vm, v1, v2) │ |организует система Ершол, они │ |описаны в заголовке как аргументы │ y:=d; s:=0|задание начальных значений │ l:="к поезду из B" |операндов y, s, l │ |цикл с предусловием, │ |пока y>e истинное высказывание │ нцпока y>e |выполнются команды │ | тела цикла, │ │|если муха летит к поезду B, │ │ если l="к поезду из B" │ │ │то |то далее она полетит │ │ │ l:="к поезду из A" |к поезду A, │ │ │|определим время полета мухи до │ │ │|встречи с поездом B, │ │ │ t:=y/(vm+v2) │ │ │иначе |иначе она летит к поезду A, │ │ │|далее она полетит к поезду B, │ │ │ l:="к поезду из B" │ │ │|определим время полета мухи до │ │ │|встречи с поездом A │ │ │ t:=y/(vm+v1) │ │ все │ │ |блок вывода операндов t, x, s, y │ │ |(можно выводить только x и s) │ │вывод нс,"t=",t │ │ x:=t*vm; вывод "x=",x │ │ s:=s+x; вывод "s=",s │ │ y:=y-t*(v1+v2); вывод "y=",y │ кц кон Задача 21, стр. 46 (Ершол) алг произведение1 (аргцел n, аргвещтаб a[1:n], резвещ П) начцел k │ |ввод количества элементов n и │ |элементов массива a организует │ |система Ершол │ |задание начальных значений данных │ П:=1;k:=1 |П и k │ |цикл с предусловием │ нцпока k<=n |проверяется условие │ |k<=n, │ │|пока условие истинно вычисляется │ │|произведение k элементов массива, │ │ П:=П*a[k] │ │|увеличивается номер (k) │ │ k:=k+1 |очередного элемента │ кц │ |если k<=n ложно, т.е. k>n, то │ |выполнится вывод произведения П, │ |вывод произведения организует │ |система Ершол кон Задача 21, стр. 46 (Turbo Pascal) Program Array_element_product; Uses CRT; Const n=10; Var k:integer; p:real; a:array [1..n] of real; Begin ClrScr; Write('Введите количество чисел n '); Readln(n); For k:=1 to n do begin Write('Введите a[',k,'] '); Readln(a[k]) end; p:=1; k:=1; While k<=n do begin p:=p*a[k]; k:=k+1 end; Writeln('p=',p) End. Задача 22, стр. 46 (QBasic) REM Произведение матриц DIM i AS INTEGER, j AS INTEGER DIM n AS INTEGER, m AS INTEGER INPUT "Введите m, n "; m, n DIM c(1 TO m) AS SINGLE DIM b(1 TO n) AS SINGLE DIM a(1 TO m, 1 TO n) AS SINGLE CLS FOR i = 1 TO m FOR j = 1 TO n PRINT "Введите a("; i; ","; j; ") ="; INPUT a(i, j) NEXT j NEXT i FOR i = 1 TO n PRINT "Введите b("; i; ")= "; INPUT b(i) NEXT i i = 1 DO c(i) = 0 : j = 1 DO c(i) = c(i) + a(i, j) * b(j) : j = j + 1 LOOP UNTIL j > n i = i + 1 LOOP UNTIL i > m FOR i = 1 TO m PRINT "c("; i; ")="; c(i) NEXT i END Задача 23, стр. 48 (Ершол) алг положительные элементы (аргцел n, аргвещтаб a[1:n]) начцел i, цел k │ |ввод аргумента n и элементов │ |массива a организует система Ершол │ |задание начальных значений │ |данных i, k │ k:=0; i:=1 │ |команда повторения с предусловием │ |проверяется условие i<=n и k=0, пока │ |условие истинно │ нцпока i<=n и k=0 | выполняется │ │|команда ветвления в неполной │ │|форме: │ │если a[i]>0 |проверяется условие │ │ |a[i]>0, │ │ │то |если оно истинно, то k │ │ │ k:=1 |присваивается значение 1 │ │ все │ │|i увеличивается на единицу, это │ │|индекс просматриваемого элемента │ │|массива │ │ i:=i+1 │ кц │ вывод нс,"k=",k |вывод значения k кон Задача 23, стр. 48 (Turbo Pascal) Program Positive_number; Uses CRT; Const n1=10; Var i,n,K:integer; a:array [1..n1] of real; Begin ClrScr; Write('Введите n '); Readln(n); For i:=1 to n do begin Write('Введите a[',i,'] '); Readln(a[i]) end; K:=0; i:=1; Repeat If a[i]>0 then K:=1; i:=i+1 Until (i>n) or (K=1); Writeln('K=',K) End. Задача 24, стр. 49 (Ершол) алг поиск буквы (аргцел n, арглиттаб w[1:n], аргсим v) дано надо начцел i, цел k │ |ввод операнда n и элементов массива │ |w организует Ершол │ |задание начальных значений │ k:=0 ;i:=1|операндов k и i │ |запишем команду повторения с │ |предусловием │ |проверяем условие i<=n и k=0, │ нцпока i<=n и k=0 |пока оно истинно │ │ если v=w[i] |выполняется команда │ │ |ветвления в полной форме: │ │ │то |проверим условие v=w[i], │ │ │|если оно истинно, то k присвоим │ │ │ k:=i |значение 1 иначе i │ │ │иначе i:=i+1 |увеличим на 1 │ │ все │ кц │ вывод нс, "k=",k кон Задача 24, стр. 49 (QBasic) REM Поиск буквы CONST n = 5 DIM i AS INTEGER, K AS INTEGER DIM w AS STRING *n, v AS STRING *1 CLS INPUT "Введите слово "; w INPUT "Введите букву "; v K = 0 i = 1 DO IF v = MID$(w, i, 1) THEN K = i ELSE i = i + 1 END IF LOOP UNTIL (i > n) OR (K <> 0) PRINT "K="; K END Задача 25, стр. 49 (Turbo Pascal) Program Amount_positive_element; Uses CRT; Const n1=10; Var n,i,K,l,m:integer; a:array[1..n1] of real; Begin ClrScr; Write('Введите n '); Readln(n); Write('Введите K '); Readln(K); For i:=1 to n do begin Write('Введите a[',i,'] '); Readln(a[i]) end; l:=0; i:=1; Repeat If a[i]>0 then l:=l+1; i:=i+1 Until (i>n) or (l=K); If l=K then m:=i-1 else m:=0; Writeln('m=',m) End. Задача 26, стр. 49 (Ершол) алг сдвиг в массиве (аргцел n, аргрезвещтаб a[1:n]) начвещ c, цел i │ |ввод операнда n и элементов массива │ |a организует система Ершол │ |значение a[n] сохраняется │ |в переменной c │ c:=a[n] │ нцдля i от n до 2 шаг -1 | команда │ │ a[i]:=a[i-1] |повторения "для" │ кц │|после сдвига всех элементов массива │|вправо на одну позицию, a[1] │ a[1]:=c |получает значение c или a[n] │ |вывод элементов нового массива a │ |организует система Ершол кон Задача 26, стр. 49 (QBasic) REM Сдвиг в массиве DIM n AS INTEGER, i AS INTEGER DIM c AS SINGLE CLS INPUT "Введите n "; n DIM A(1 TO n) AS SINGLE FOR i = 1 TO n PRINT "Введите A("; i; ") "; INPUT A(i) NEXT i c = A(n) FOR i = n TO 2 STEP -1 A(i) = A(i - 1) NEXT i A(1) = c FOR i = 1 TO n PRINT "A("; i; ")="; A(i) NEXT i END Задача 27, стр. 50 (Ершол, способ 1) алг максимальные в массиве (аргцел n, вещтаб a[1:n]) начвещ b, цел i, цел K, целтаб M[1:n] │|предположим, что больший │ b:=a[1] |элемент a[1] │ |будем сравнивать больший элемент с │ |элементами массива, начиная со │ i:=2 |второго (i=2) │ нц |команда цикла с постусловием │ │|команда ветвления в сокращенной │ │ если b<=a[i] |форме для │ │ │то |выбора большего из b и a[i] │ │ │ b:=a[i] │ │ все │ │|увеличение индекса просматривае- │ │ i:=i+1 |мого элемента массива на 1 │ кцпри i>n │|задание начального значения │|K(количество │ K:=0 |максимальных элементов) │ i:=1 |задание начального значения i │ нц |команда повторения │ |с постусловием │ │ |команда ветвления в │ │ если b=a[i] |сокращенной форме │ │ │то |подсчет элементов массива, │ │ │ K:=K+1 |равных b, создание │ │ │|массива индексов этих элементов │ │ │ M[K]:=i │ │ все │ │|получение индекса │ │ i:=i+1 |просматриваемого элемента │|проверка условия окончания цикла │ кцпри i>n │ |блок вывода значения K и значений │ |элементов массива M[1:K] │ вывод нс, K │ вывод нс │ нцдля i от 1 до K │ │ вывод M[i] │ кц кон Задача 27, стр. 50 (Turbo Pascal, способ 1) Program Maximum_elements_of_the_array; Uses CRT; Const n1=10; Var n,i,K:integer; a:array[1..n1] of real; M:array[1..n1] of byte; b:real; Begin ClrScr; Write('Введите n '); Readln(n); For i:=1 to n do begin Write('Введите A[',i,'] '); Readln(a[i]) end; b:=a[1]; i:=2; Repeat If b<=a[i] then b:=a[i]; i:=i+1 Until i>n; K:=0; i:=1; Repeat If b=a[i] then begin K:=K+1; M[K]:=i end; i:=i+1 Until i>n; For i:=1 to K do Writeln('M[',i,']=',M[i]); Writeln('K=',K) End. Задача 27, стр. 50 (QBasic, способ 2) REM Максимальные элементы в массиве DIM n AS INTEGER, i AS INTEGER DIM K AS INTEGER, b AS SINGLE CLS INPUT "Введите n "; n DIM a(1 TO n) AS SINGLE DIM M(1 TO n) AS INTEGER FOR i = 1 TO n PRINT "Введите A("; i; ") "; INPUT a(i) NEXT i b = a(1) : i = 2 K = 1 : M(K) = 1 DO IF b <= a(i) THEN IF b = a(i) THEN K = K + 1: M(K) = i ELSE b = a(i) K = 1 : M(K) = i END IF END IF i = i + 1 LOOP UNTIL i > n FOR i = 1 TO K PRINT "M("; i; ")="; M(i) NEXT i PRINT "K="; K END Задача 28, стр. 52 (Ершол) алг дружественные числа (аргцел n) дано надо начцел k,p,s, целтаб Делитель[1:n] │|первое просматриваемое число │|равно 2 │ k:=2 │|цикл "пока", проверка условия │ нцпока k<=n |окончания цикла │ │|единица - делитель всех просматри- │ │ Делитель[k]:=1 |ваемых чисел │ │|очередное просматриваемое число │ │ k:=k+1 │ кц │|первое просматриваемое число │|равно 2 │ k:=2 │|цикл "пока", проверка условия │ нцпока k<=div(n,2) |окончания цикла │ │|первое число имеющее делителем │ │ p:=k+k |число k (p<>k) │ │|цикл "пока", проверка условия │ │ нцпока p<=n |окончания цикла │ │ │|увеличение суммы делителей │ │ │|у чисел кратных k (p<>k) │ │ │ Делитель[p]:=Делитель[p]+k │ │ │|следующее число имеющее │ │ │ p:=p+k |делителем число k │ │ кц │ │|очередное просматриваемое число │ │ k:=k+1 │ кц │|организация поиска дружественных │|чисел │ нцдля k от 2 до n-1 │ │ нцдля s от k+1 до n │ │ │ если s=Делитель[k] и │ │ │ k=Делитель[s] │ │ │ │то │ │ │ │ вывод нс, k, s │ │ │ все │ │ кц │ кц кон Задача 28, стр. 52 (Turbo Pascal) Program Amicable_numbers; Uses CRT; Const n1=20000; Var k,n,p,s:integer; Divisor:array [1..n1] of integer; Begin Write('Введите n '); Readln(n); k:=2; While k<=n do begin Divisor[k]:=1; k:=k+1 end; k:=2; While k<=(n div 2) do begin p:=k+k; While p<=n do begin Divisor[p]:=Divisor[p]+k; p:=p+k end; k:=k+1; end; For k:=2 to n-1 do For s:=k+1 to n do If (Divisor[k]=s) and (Divisor[s]=k) then Writeln('Дружественные числа ',k,' и ',s) End. Задача 29, стр. 53 (Ершол) алг группировка (аргцел n, аргрезвещтаб A[1:n]) начцел i,k,j, вещ C │|задание начального значения индекса │ i:=1 |просматриваемого элемента │ k:=0|количество просмотренных │ |элементов │|команда цикла с предусловием, │|проверка условия окончания цикла │ нцпока k<n │ │ если A[i]>0 |если A[i]>0, то этот │ │ │то |элемент оставляем на месте, │ │ │ |получаем индекс следующего │ │ │ i:=i+1|просматриваемого элемента │ │ │иначе |если A[i]<0, то организуем │ │ │ C:=A[i] |сдвиг на 1 элемент влево, │ │ │ j:=i+1 |начиная с A[i+1] до A[n], │ │ │|A[i] ставим на место A[n] │ │ │ нцпока j<=n │ │ │ │A[j-1]:=A[j] |получим │ │ │ │ j:=j+1 |последовательность │ │ │ кц |A[1], A[2], ... , A[i-1], │ │ │ A[n]:=C |A[i+1], ... , A[n], A[i] │ │ все │ │ k:=k+1 │ кц кон Задача 29, стр. 53 (QBasic) REM Группировка DIM n AS INTEGER, i AS INTEGER DIM k AS INTEGER, j AS INTEGER DIM C AS SINGLE CLS INPUT "Введите n "; n DIM A(1 TO n) AS SINGLE FOR i = 1 TO n PRINT "Введите a("; i; ") "; INPUT A(i) NEXT i i = 1 k = 0 WHILE k < n IF A(i) > 0 THEN i = i + 1 ELSE C = A(i) j = i + 1 WHILE j <= n A(j - 1) = A(j) j = j + 1 WEND A(n) = C END IF k = k + 1 WEND FOR i = 1 TO n PRINT "A("; i; ")="; A(i) NEXT i END Задача 30, стр. 57 (Ершол) алг НОД4(аргцел a,b,c,d, резцел z) нач │ НОД(a,b,z) |команды обращения к │ НОД(z,c,z) |вспомогательному │ НОД(z,d,z) |алгоритму кон |вспомогательный алгоритм вычисления |НОД двух чисел алг НОД(аргцел m,n, резцел t) начцел m1,n1 |при хорошем стиле |программирования значения аргументов |в программе менять нельзя │ m1:=m; n1:=n │ |команда цикла с предусловием │ нцпока m1<>n1 │ │ |команда ветвления в полной форме │ │ если m1>n1 │ │ │то m1:=m1-n1 |большее из двух │ │ │ |чисел заменяем │ │ │иначе n1:=n1-m1 |разностью │ │ все |этих чисел │ кц │ t:=m1 кон Задача 30, стр. 57 (Turbo Pascal) Program Greatest_common_divisor; Uses CRT; Var a,b,c,d,z:integer; Procedure NOD(m,n:integer; Var t:integer); Begin While m<>n do If m>n then m:=m-n else n:=n-m; t:=m; Writeln(t) End; Begin ClrScr; Write('Введите a,b,c,d '); Readln(a,b,c,d); NOD(a,b,z); NOD(z,c,z); NOD(z,d,z); Writeln('НОД(',a,',',b,',',c,',',d,')=',z) End. Задача 31, стр. 58 (QBasic) REM Числа Мерсенна DECLARE SUB Prime (a AS INTEGER, fl1 AS INTEGER) DIM n AS INTEGER, n1 AS INTEGER DIM p AS INTEGER DIM Candidate AS INTEGER DIM fl AS INTEGER, fl1 AS INTEGER INPUT "Введите n "; n n1 = n \ 2 p = 2 Candidate = 3 fl = 0 DO Prime (p), fl1 IF fl1 = 1 THEN PRINT "Число Мерсенна - "; Candidate END IF p = p + 1 IF Candidate <= n1 THEN Candidate = Candidate * 2 IF Candidate < n THEN Candidate = Candidate + 1 ELSE fl = 1 END IF ELSE fl = 1 END IF LOOP UNTIL fl = 1 END SUB Prime (a AS INTEGER, fl1 AS INTEGER) DIM k AS INTEGER k = 2 fl1 = 1 WHILE (k <= a \ 2) AND (fl1 = 1) IF a MOD k = 0 THEN fl1 = 0 k = k + 1 WEND PRINT fl1 END SUB Задача 32, стр. 60 (Turbo Pascal) Program Most_element_in_array; Uses CRT; Var n,k:integer; a:array [1..10] of real; t:real; Procedure BID(m,l:real;Var z:real); Begin If m>l then z:=m else z:=l; Writeln(z) End; Begin ClrScr; Write('Введите n '); Readln(n); For k:=1 to n do begin Write('Введите a[',k,'] '); Readln(a[k]) end; k:=2; t:=a[1]; While k<=n do begin BID(t,a[k],t); k:=k+1 end; Writeln('Максимум ',t) End. Задача 33, стр. 61 (Ершол) алг близнецы(аргцел n) начцел p, лог fl │p:=2|очередное просматриваемое число │|цикл "пока", │ нцпока p<=n-2 |проверка условия │ |p<=n-2 │ │|обращение к вспомогательному │ │|алгоритму для проверки является ли │ │ простое(p,fl) |число p простым, │ │ если fl |если число p простое (fl=да), │ │ │то |то проверим является ли число │ │ │ простое(p+2,fl) |p+2 простым, │ │ │ если fl |если число p+2 простое │ │ │ |(fl=да), │ │ │ │то |то p и p+2 - близнецы, │ │ │ │ |выводим их на экран │ │ │ │ вывод нс,p,p+2 │ │ │ все │ │ все │ │ p:=p+1 │ кц кон |вспомогательный алгоритм определения |является ли число p простым (fl1=да) алг простое(аргцел a, резлог fl1) начцел k |очередной возможный |делитель числа a │ если a<>2 |если a<>2, │ │то |исследуем это число, │ │ если mod(a,2)<>0 |если число │ │ │то |нечетное, mod(a,2)<>0, то │ │ │ |исследуем это число │ │ │ |делителями нечетного числа │ │ │ |могут быть только нечетные │ │ │ |числа k<=div(a,2)+1 │ │ │ |k - целая часть от деления a на 2 │ │ │ k:=div(a,2) │ │ │ если mod(k,2)=0 |если k - │ │ │ │ |четное число, │ │ │ │то |то получим следующее за │ │ │ │ k:=k+1 |ним нечетное число │ │ │ все │ │ │ нцпока mod(a,k)<>0 |в цикле │ │ │ │k:=k-2|"пока" ищем из нечетных │ │ │ кц|делителей числа a больший, │ │ │ если k=1 |если наибольший │ │ │ │ |делитель числа a равен 1, │ │ │ │то fl1:=да |то число простое │ │ │ │ |(fl1=да), │ │ │ │иначе fl1:=нет |иначе число не │ │ │ все |является простым (fl1=нет), │ │ │иначе |если число четное, то оно │ │ │ fl1:=нет |не является простым │ │ все |fl1=нет │ │иначе |если a=2, │ │ fl1:=да |то число простое – fl1=да │ все кон Задача 34, стр. 62 (Ершол) алг сумма Фибоначчи(аргцел m) дано надо начцел s,f │ s:=m |текущей сумме присвоим │ | значение m │ нцпока s>0 |пока s>0 обращаемся к │ │|вспомогательному алгоритму для │ │|нахождения f - наибольшего числа │ │ Фиб(s,f) |Фибоначчи <= s │ │ s:=s-f |уменьшаем текущую сумму s │ │ |на f │ │ вывод f, “ +” │ кц кон |вспомогательный алгоритм для |нахождения наибольшего числа |Фибоначчи <=m1 алг Фиб(аргцел m1, резцел c) |значение найденного числа Фибоначчи |присвоим c начцел a,b │ a:=1;b:=1;c:=1 │ нцпока c<m1 │ │ c:=a+b │ │ a:=b │ │ b:=c │ кц │ если c>m1 │ │то │ │ c:=a │ все кон Задача 34, стр. 62 (QBasic) REM Сумма чисел Фибоначчи DECLARE SUB Fib (m1 AS INTEGER, c AS INTEGER) DIM m AS INTEGER, s AS INTEGER DIM f AS INTEGER CLS INPUT "Введите m "; m s = m WHILE s > 0 Fib (s), f s = s - f PRINT f; WEND END SUB Fib (m1 AS INTEGER, c AS INTEGER) DIM a AS INTEGER, b AS INTEGER a = 1 : b = 1 : c = 1 WHILE c < m1 c = a + b: a = b: b = c WEND IF c > m1 THEN c = a END SUB Задача 34, стр. 62 (Turbo Pascal) Program Sum_of_Fibonacci_numbers; Uses CRT; Var m,s,f:integer; Procedure Fib(m1:integer; Var c:integer); Var a,b:integer; Begin a:=1; b:=1; c:=1; While c<m1 do begin c:=a+b; a:=b; b:=c end; If c>m1 then c:=a End; Begin ClrScr; Write('Введите m '); Readln(m); s:=m; While s>0 do begin Fib(s,f); s:=s-f; Write(f,'+') end; End. Задача 35, стр. 62 (QBasic) REM Сдвиг1 элементов в массиве DECLARE SUB Shift (n AS INTEGER, A() AS SINGLE) DIM i AS INTEGER, k AS INTEGER DIM n AS INTEGER CLS INPUT "Введите k – величину сдвига"; k INPUT "Введите n "; n DIM B(1 TO n) AS SINGLE FOR i = 1 TO n PRINT "Введите B("; i; ")"; INPUT B(i) NEXT i FOR i = 1 TO k Shift (n), B() NEXT i FOR i = 1 TO n PRINT "B("; i; ")="; B(i) NEXT i END SUB Shift (n AS INTEGER, A() AS SINGLE) DIM c AS SINGLE, i AS INTEGER c = A(n) FOR i = n TO 2 STEP -1 A(i) = A(i - 1) NEXT i A(1) = c END SUB Задача 36, стр. 63 (Turbo Pascal) Program Multiple_pairs; Uses CRT; Const n1=10; Var i,k,n,s,q,r:byte; A,B:array[1..n1] of byte; Procedure Divisibility(x,y:byte; Var q,r:byte); Begin If x>y then begin q:=x div y; r:=x mod y end else begin q:=y div x; r:=y mod x end End; Begin ClrScr; Write('Введите n '); Readln(n); For i:=1 to n do begin Write('Введите A[',i,'] '); Readln(A[i]) end; For i:=1 to n do begin Write('Введите B[',i,'] '); Readln(B[i]) end; k:=0; s:=0; i:=1; While i<=n do begin Divisibility(A[i],B[i],q,r); If r=0 then begin k:=k+1; s:=s+q end; i:=i+1 end; Writeln('k=',k,' s=',s) End. | r = SQR(d)
x1 = (-b - r) / (2 * a)
x2 = (-b + r) / (2 * a)
PRINT "x1="; x1, " x2="; x2
ELSE
PRINT "Корни не вычисляем (D<=0)"
END IF
END
Задача 12, стр. 34 (Turbo Pascal)
Program treug;
Uses CRT;
Var a,b,c,p,k,s:real;
Begin
Write('Введите a,b,c: ');
Readln(a,b,c);
p:=(a+b+c)/2;
k:=p*(p-a)*(p-b)*(p-c);
If k>0 then
s:=sqrt(k)
else
s:=-1;
Writeln(s)
End.
Задача 12, стр. 34 (QBasic)
REM Площадь треугольника
DIM a AS SINGLE, b AS SINGLE
DIM c AS SINGLE, p AS SINGLE
DIM k AS SINGLE, s AS SINGLE
INPUT "Введите a,b,c: "; a, b, c
p = (a + b + c) / 2
k = p * (p - a) * (p - b) * (p - c)
IF k > 0 THEN
s = SQR(k)
ELSE
s = -1
END IF
PRINT s
END
Задача 13, стр. 35 (Turbo Pascal)
Program BIT;
Uses CRT;
Var a,b,c,max:real;
Begin
Write('Введите a,b,c: ');
Readln(a,b,c);
If a<b then
max:=b
else
max:=a;
If max<c then
max:=c;
Writeln(max)
End.
Задача 14, стр. 35 (Ершол способ 1)
алг функция (аргвещ x, резвещ y)
дано
надо
нач
│ |ввод знач. операнда x организует
│ |система Ершол
│ |вложенное ветвление
│ |команда ветвления в полной форме
│ если x>22 |проверяется условие
│ |x>22,
│ │то |если оно истинно, то y присваи-
│ │ |вается значение 1/(x*x+1),
│ │ y:=1/(x*x+1)
│ │иначе |иначе проверяется
│ │если x<=3 |условие x<=3, если оно
│ │ │то |истинно, то y присваивается
│ │ │ y:=x-1 |значение x-1,
│ │ │иначе |иначе 3<x<=22,
│ │ │|y присваивется значение x**3+2
│ │ │ y:=x**3+2
│ │ все
│ все
│ |вывод значения у
│ |организует система Ершол
кон
Задача 14, стр. 35 (QBasic способ 1)
REM Значение функции
DIM x AS SINGLE, y AS SINGLE
INPUT "Введите x: "; x
IF x > 22 THEN
y = 1 / (x * x + 1)
ELSЕ IF x <= 3 THEN
y = x - 1
ELSE
y = x * x * x + 2
END IF
END IF
PRINT "x="; x; " y="; y
END
Задача 14, стр. 35 (Turbo Pascal способ 2)
Program Func;
Uses CRT;
Label k;
Var y:real; x: integer;
Begin
Write('Введите x: ');
Readln(x);
If x<=3 then begin
y:=x-1; goto k
end;
If x<=22 then begin
y:=x*x*x+2; goto k
end;
y:=1/(x*x+1);
k: Writeln('x=',x,' y=',y)
End.
Задача 15, стр. 37 (Turbo Pascal)
Program Segment;
Uses CRT;
Var
a,b,c,d,x,y:real;
r:0..1;
Begin
Write('Введите a,b,c,d: ');
Readln(a,b,c,d);
If a>=c then
x:=a
else
x:=c;
If b>=d then
y:=d
else
y:=b;
If x<=y then
begin
r:=1; Writeln(r,x,y)
end
else
begin
r:=0; Writeln(r)
end
End.
Задача 15, стр. 37 (QBasic)
REM Пересечение отрезков
DIM a AS SINGLE, b AS SINGLE
DIM c AS SINGLE, d AS SINGLE
DIM x AS SINGLE, y AS SINGLE
DIM r AS INTEGER
INPUT "Введите a,b,c,d: "; a, b, c, d
IF a >= c THEN
x = a
ELSE
x = c
END IF
IF b >= d THEN
y = d
ELSE
y = b
END IF
IF x <= y THEN
r = 1
PRINT r, x, y
ELSE
r = 0
PRINT r
END IF
END
Задача 17, стр. 39 (Ершол)
алг корень третьей степени (аргвещ x,
аргвещ e, резвещ yn)
начвещ дельта,вещ yn1
│ |ввод аргументов (x, e) и вывод
│ |результата (yn) организует система
│ |Ершол, так как эти операнды
│ |описаны в заголовке как арг и рез
│ |задание начальных значений
│ |yn, yn1, дельта
│ yn:=x; yn1:=2/3*(yn+x/(2*yn*yn))
│ дельта:=abs(yn-yn1)
│ |цикл с предусловием
│ |проверка условия окончания цикла,
│ |пока условие истинно
│нцпока дельта>e | yn получает
│ │ yn:=yn1 |значение yn1,
│ │|вычисляется новое значение yn1,
│ │ yn1:=2/3*(yn+x/(2*yn*yn))
│ │|вычисляется погрешность
│ │ дельта:=abs(yn-yn1)
│ кц
кон
Задача 18, стр. 40 (Ершол)
алг Фибоначчи
дано
надо
начцел n,цел c, цел a,цел b, цел k
│ |блок ввода
│ вывод "введите номер иск. чл. Ф."
│ ввод n
│ |первому числу Фибоначчи – а –
│ |присвоим значение 1, второму –
│ |числу b – присвоим значение 1
│ a:=1;b:=1
│ |параметру цикла k присвоим зн. 3 -
│ |номер первого искомого числа Фиб.
│ k:=3
│ |цикл с предусловием
│ нцпока k<=n |проверка условия,
│ │ c:=a+b |пока условие истинно
│ │ a:=b |находят с - следующий чл.
│ │|Фиб. и переприсваивают значения
│ │ b:=c | предыдущих а и b
│ │|находят номер следующего
│ │|искомого числа Фибоначчи
│ │ k:=k+1
│ кц
│|блок вывода
│ вывод нс,"число Фибоначчи равно",c
кон
Задача 19, стр. 41 (Ершол)
алг косинус_x
начвещ x,e,s,a,R, цел n
│ | блок ввода
│ вывод "введите значение x -"
│ ввод x
│ вывод нс, "введите значение e -"
│ ввод e
│|задание начальных a,s,x,R,n
│ a:=1; s:=1;x:=x*arctg(1)*4/180;
│ R:=-x*x; n:=1
│ |цикл с предусловием
│ нцпока abs(a)>e |проверка условия,
│ │|пока условие истинно
│ │|выполняются команды тела цикла:
│ │|вычисляется новый член ряда,
│ │ a:=a*R/((2*n-1)*2*n)
│ │ s:=s+a |новая сумма ряда,
│ │ n:=n+1 |увеличивается n
│ кц
│ |блок вывода
│ вывод нс, "x= ",x
│ вывод нс,"вычисленное значение"
│ вывод "cos(x)=", s
│ вывод нс,"зн. встроенной функции"
│ вывод "cos(x)=",cos(x)
кон
Задача 19, стр. 41 (QBasic)
REM Косинус угла
DIM x AS SINGLE, e AS SINGLE
DIM a AS SINGLE, s AS SINGLE
DIM r AS SINGLE, n AS INTEGER
INPUT "Введите x, e "; x, e
a = 1 : s = 1 : x = x * ATN(1) * 4 / 180
r = -1 * x * x : n = 1
DO
a = a * r / ((2 * n - 1) * 2 * n)
s = s + a
n = n + 1
LOOP UNTIL ABS(a) <= e
PRINT x, s
END
Задача 20, стр. 41 (Turbo Pascal)
Program Fly;
Uses CRT;
Var d,v1,v2,vm,y,s,e,t,x:real;
l:string;
Begin
Write('Введите d,v1,v2,vm,e ');
Readln(d,v1,v2,vm);
y:=d;
s:=0;
l:='К поезду изB';
While y>e do
begin
If l='К поезду из B' then
begin
l:='К поезду из A';
t:=y/(v2+vm)
end
else
begin
l:='К поезду из B';
t:=y/(v1+vm)
end;
x:=t*vm; s:=s+x;
y:=y-t*(v1+v2);
Writeln(t,x,s)
end
End.
Задача 20, стр. 41 (QBasic)
REM Сверхбыстрая муха
DIM d AS SINGLE, v1 AS SINGLE
DIM v2 AS SINGLE, vm AS SINGLE
DIM y AS SINGLE, s AS SINGLE
DIM e AS SINGLE, t AS SINGLE
DIM x AS SINGLE, l AS STRING
INPUT "Вв. d,v1,v2,vm,e";d,v1,v2,vm,e
y = d
s = 0
l = "К поезду из B"
WHILE y > e
IF l = "К поезду из B" THEN
l = "К поезду из A"
t = y / (v2 + vm)
ELSE
l = "К поезду из B"
t = y / (v1 + vm)
END IF
x = t * vm
s = s + x
y = y - t * (v1 + v2)
PRINT t, x, s
WEND
END
Задача 21, стр. 46 (QBasic)
REM Произведение элементов массива
DIM n AS INTEGER, k AS INTEGER
DIM p AS SINGLE
CLS
INPUT "Введите количество чисел n "; n
DIM a(1 TO n) AS SINGLE
FOR k = 1 TO n
PRINT "Введите a("; k; ") ";
INPUT a(k)
NEXT k
p = 1
k = 1
WHILE k <= n
p = p * a(k)
k = k + 1
WEND
PRINT "p="; p
END
Задача 22, стр. 46 (Ершол)
алг произведение2 (аргцел n,m)
начвещтаб a[1:m,1:n], вещтаб b[1:n],
цел i,j,вещтаб c[1:m]
│ |ввод значений данных n и m
│ |организует система Ершол
│ |блок ввода элементов массива a
│ нцдля i от 1 до m шаг 1
│ │ нцдля j от 1 до n шаг 1
│ │ │ вывод "a[",i,",",j,"]="
│ │ │ ввод a[i,j]
│ │ кц
│ │|перевод курсора на новую строку
│ │ вывод нс
│ кц
│ |блок ввода элементов массива b
│ нцдля i от 1 до n шаг 1
│ │ вывод "b[",i,"]="
│ │ ввод b[i]
│ кц
│ |блок вывода элементов массива a
│ вывод нс, "массив a",нс
│ нцдля i от 1 до m шаг 1
│ │ нцдля j от 1 до n шаг 1
│ │ │ вывод a[i,j]
│ │ кц
│ │|перевод курсора на новую строку
│ │ вывод нс
│ кц
│ |блок вывода элементов массива b
│ вывод "массив b"
│ нцдля i от 1 до m шаг 1
│ │ вывод нс, b[i]
│ кц
│ нцдля i от 1 до m шаг 1
│ │ c[i]:=0 |блок получения
│ │ нцдля j от 1 до n шаг 1 |элементов
│ │ │ c[i]:=c[i]+a[i,j]*b[j] |массива с
│ │ кц
│ кц
│ |блок вывода элементов массива с
│ вывод нс, "массив c"
│ нцдля i от 1 до m шаг 1
│ │ вывод нс, c[i]
│ кц
кон
Задача 22, стр. 46 (Turbo Pascal)
Program Matrix_product;
Uses CRT;
Const n1=10; m1=10;
Var
i,j,n,m:integer;
c:array [1..m1] of real;
b:array [1..n1] of real;
a:array[1..m1,1..n1] of real;
Begin
ClrScr;
Write('Введите m, n ');
Readln(m,n);
For i:=1 to m do
For j:=1 to n do
begin
Write('Введите a[',i,',',j,'] ');
Readln(a[i,j])
end;
For i:=1 to n do
begin
Write('Введите b[',i,'] ');
Readln(b[i])
end;
i:=1;
Repeat
c[i]:=0; j:=1;
Repeat
c[i]:=c[i]+a[i,j]*b[j]; j:=j+1
Until j>n;
i:=i+1;
Until i>m;
For i:=1 to m do
Writeln('c[',i,']=',c[i])
End.
Задача 23, стр. 48 (QBasic)
REM Положительные числа
DIM i AS INTEGER, n AS INTEGER
DIM K AS INTEGER
CLS
INPUT "Введите n "; n
DIM a(1 TO n) AS SINGLE
FOR i = 1 TO n
PRINT "Введите a("; i; ") ";
INPUT a(i)
NEXT i
K = 0
i = 1
DO
IF a(i) > 0 THEN K = 1
i = i + 1
LOOP UNTIL (i > n) OR (K = 1)
PRINT "K="; K
END
Задача 24, стр. 49 (Turbo Pascal)
Program Searching_the_letter;
Uses CRT;
Const n=5;
Var
i,K:integer;
w:string[n];
v:char;
Begin
ClrScr;
Write('Введите слово ');
Readln(w);
Write('Введите букву ');
Readln(v);
K:=0;
i:=1;
Repeat
If v=w[i] then K:=i else i:=i+1
Until (i>n) or (K<>1);
Writeln('K=',K)
End.
Задача 25, стр. 49 (Ершол)
алг количество положительных (арг
цел n,K,аргвещтаб a[1:n])
начцел i,l,m
│ |ввод данных n, K и элементов
│ |массива организует система Ершол
│ l:=0; i:=1 |задание нач. значения l и i
│ | команда повторения "пока" с
│ |проверкой условия i<=n и l<K,
│ нцпока i<=n и l<K |пока условие
│ │ |истинно выполняются
│ │ если a[i]>0 |команды тела
│ │ │то |цикла: команда ветвления и
│ │ │ l:=l+1
│ │ все
│ │ i:=i+1 |команда присваивания
│ кц
│ если l=K
│ │то m:=i-1
│ │иначе m:=0
│ все
│ вывод нс,"m=",m
кон
Задача 25, стр. 49 (QBasic)
REM Количество положительных
REM элементов
DIM n AS INTEGER, i AS INTEGER
DIM K AS INTEGER, l AS INTEGER
DIM m AS INTEGER
CLS
INPUT "Введите n "; n
DIM a(1 TO n) AS SINGLE
INPUT "Введите K "; K
FOR i = 1 TO n
PRINT "Введите a("; i; ") ";
INPUT a(i)
NEXT i
l = 0
i = 1
DO
IF a(i) > 0 THEN l = l + 1
i = i + 1
LOOP UNTIL (i > n) OR (l = K)
IF l = K THEN m = i - 1 ELSE m = 0
PRINT "m="; m
END
Задача 26, стр. 49 (Turbo Pascal)
Program Shift_in_array;
Uses CRT;
Const n1=10;
Var
n,i:integer;
A:array[1..n1] of real;
c:real;
Begin
ClrScr;
Write('Введите n ');
Readln(n);
For i:=1 to n do
begin
Write('Введите A[',i,'] ');
Readln(A[i])
end;
c:=A[n];
For i:=n downto 2 do
A[i]:=A[i-1];
A[1]:=c;
For i:=1 to n do
Writeln('A[',i,']=',A[i])
End.
Задача 27, стр. 50 (QBasic,
способ 1)
REM Максимальные элементы массива1
DIM n AS INTEGER, i AS INTEGER
DIM K AS INTEGER
DIM b AS SINGLE
CLS
INPUT "Введите n "; n
DIM a(1 TO n) AS SINGLE
DIM M(1 TO n) AS INTEGER
FOR i = 1 TO n
PRINT "Введите A("; i; ") ";
INPUT a(i)
NEXT i
b = a(1)
i = 2
DO
IF b <= a(i) THEN b = a(i)
i = i + 1
LOOP UNTIL i > n
K = 0 : i = 1
DO
IF b = a(i) THEN
K = K + 1 : M(K) = i
END IF
i = i + 1
LOOP UNTIL i > n
FOR i = 1 TO K
PRINT "M("; i; ")="; M(i)
NEXT i
PRINT "K="; K
END
Задача 27, стр. 50 (Ершол,
способ 2)
алг максимальные в массиве (аргцел n,
аргвещтаб a[1:n])
начвещ b, цел i, цел K, целтаб M[1:n]
│|предположим, что больший
│ b:=a[1] |элемент a[1]
│|начальное значение индекса
│|просматриваемого элемента массива
│ i:=2 |равно 2
│|предположив, что больший элемент
│ K:=1 |уже есть (a[1]), имеем K=1
│|предположив, что больший элемент
│ M[K]:=1 |a[1], имеем M[1]=1
│ нц |команда цикла с постусловием
│ │|команда ветвления в
│ │ если b<=a[i] |сокращенной форме
│ │ │то |если b>a[i], то больший эле-
│ │ │|мент b, если b<=a[i], то рассмот-
│ │ │|рим два случая b=a[i] и b<a[i]:
│ │ │ если b=a[i] |если b=a[i], то a[i]
│ │ │|надо сосчитать как очередной
│ │ │ │то |больший элемент,
│ │ │ │ K:=K+1 |увеличим K на 1,
│ │ │ │|элементу массива M[K]
│ │ │ │ M[K]:=i |присвоим значение i;
│ │ │ │иначе |если b<a[i], то большее
│ │ │ │|число a[i],
│ │ │ │|b присвоим значение a[i],
│ │ │ │ b:=a[i]
│ │ │ │|количество наибольших из
│ │ │ │|просмотренных элементов
│ │ │ │ K:=1 |равно 1,
│ │ │ │|элементу массива M[1]
│ │ │ │ M[K]:=i |присвоим значение i
│ │ │ все
│ │ все
│ │|индекс очередного
│ │|просматриваемого элемента
│ │ i:=i+1 |увеличим на 1
│|проверим условие окончания цикла
│ кцпри i>n
│ |блок вывода значения K и элементов
│ |массива M[1:K]
│ вывод нс, K
│ вывод нс
│ нцдля i от 1 до K
│ │ вывод M[i]
│ кц
кон
Задача 27, стр. 50 (Turbo Pascal, способ 2)
Program Maximum_elements_of_the_array;
Uses CRT;
Const n1=10;
Var
n,i,K:integer;
a:array[1..n1] of real;
M:array[1..n1] of byte;
b:real;
Begin
ClrScr;
Write('Введите n ');
Readln(n);
For i:=1 to n do
begin
Write('Введите A[',i,'] ');
Readln(a[i])
end;
b:=a[1];
i:=2;
K:=1;
M[K]:=1;
Repeat
If b<=a[i] then
if b=a[i] then
begin
K:=K+1;
M[K]:=i
end
else
begin
b:=a[i];
K:=1;
M[K]:=i
end;
i:=i+1
Until i>n;
For i:=1 to K do
Writeln('M[',i,']=',M[i]);
Writeln('K=',K)
End.
Задача 28, стр. 52 (QBasic)
REM Дружественные числа
DIM k AS INTEGER, n AS INTEGER
DIM p AS INTEGER, s AS INTEGER
CLS
INPUT "Введите n "; n
DIM Divisor(1 TO n) AS INTEGER
k = 2
WHILE k <= n
Divisor(k) = 1
k = k + 1
WEND
k = 2
WHILE k <= n \ 2
p = k + k
WHILE p <= n
Divisor(p) = Divisor(p) + k
p = p + k
WEND
k = k + 1
WEND
FOR k = 2 TO n - 1
FOR s = k + 1 TO n
IF (Divisor(k)=s)AND(Divisor(s)=k) THEN
PRINT k, s
END IF
NEXT s
NEXT k
END
Задача 29, стр. 53 (Turbo Pascal)
Program Grouping;
Uses CRT;
Var
n,i,k,j:integer;
а:array [1..20] of real;
с:real;
Begin
ClrScr;
Write('Введите n ');
Readln(n);
For i:=1 to n do
begin
Write('Введите a[',i,'] ');
Readln(а[i])
end;
i:=1;
k:=0;
While k<n do
begin
If A[i]>0 then
i:=i+1
else
begin
с:=A[i];
j:=i+1;
While j<=n do
begin
A[j-1]:=A[j];
j:=j+1
end;
A[n]:=C
end;
k:=k+1
end;
For i:=1 to n do
Writeln('A[',i,']=',A[i])
End.
Задача 30, стр. 57 (QBasic)
REM Наибольший общий делитель
DECLARE SUB NOD (m AS INTEGER,
n AS INTEGER, t AS INTEGER)
DIM a AS INTEGER, b AS INTEGER
DIM c AS INTEGER, d AS INTEGER
DIM z AS INTEGER
INPUT "Введите a,b,c,d "; a, b, c, d
NOD (a), (b), z
NOD (z), (c), z
NOD (z), (d), z
PRINT "НОД(";a;",";b;",";c;",";d;")="; z
END
SUB NOD (m AS INTEGER,
n AS INTEGER, t AS INTEGER)
WHILE m <> n
IF m>n THEN m = m - n ELSE n = n - m
WEND
t = m
PRINT t
END SUB
Задача 31, стр. 58 (Ершол)
алг Мерсенн (аргцел n)
начцел n1,p,Кандидат, лог fl,fl1
│ |n1 - целая часть от деления n на 2
│ n1:=div(n,2)
│ |просмотрим все значения p от 2 до
│ |k, чтобы исследовать все числа вида
│ |2p-1<=n на принадлежность числам
│ |Мерсенна
│ p:=2
│ |первый кандидат в числа Мерсенна -
│ Кандидат:=3 |3=22-1
│|fl=нет - очередное исследуемое
│ fl:=нет |число 2p-1<=n, fl=да -
│ |очередное исследуемое
│ |число 2p-1>n
│ |команда повторения с постусловием
│ нц
│ │ |команда обращения к
│ │ | вспомогательному алгоритму для
│ │ | проверки, является ли число p
│ │ простое(p,fl1) |простым,
│ │ если fl1 |если число p - простое
│ │ │то |(fl1=да), то
│ │ │ |2p-1 - число Мерсенна
│ │ │ |вывод очередного числа
│ │ │ вывод нс, Кандидат |Мерсенна
│ │ все
│ │ |получение очередного
│ │ p:=p+1 |исследуемого числа p
│ │ |получение очередного
│ │ если Кандидат<=n1 |исследуемого
│ │ │то |кандидата в числа Мерсенна
│ │ │ Кандидат:=Кандидат*2
│ │ │ если Кандидат<n
│ │ │ │то Кандидат:=Кандидат+1
│ │ │ │иначе fl:=да
│ │ │ все
│ │ │иначе
│ │ │ fl:=да
│ │ все
│ кцпри fl
кон
|вспомогательный алгоритм
алг простое(аргцел a, резлог fl1)
начцел k
│|очередной возможный делитель
│ k:=2 |числа a
│|предположим, что число
│ fl1:=да |простое fl1=да
│ |цикл "пока", проверка условия
│ нцпока k<=div(a,2) и fl1 |окончания
│ |цикла
│ │ если mod(a,k)=0 |если число a
│ │ │то fl1:=нет |делится на k без
│ │ │|остатка, то число a не является
│ │ │|простым (fl1=нет)
│ │ все
│ │|получение очередного возможного
│ │ k:=k+1 |делителя числа a
│ кц
кон
Задача 31, стр. 58 (Turbo Pascal)
Program Mersenn_numbers;
Uses CRT;
Var
n,n1,p,Candidate:integer;
fl,fl1:boolean;
Procedure Prime(a:integer;Var fl1:boolean);
Var
k:integer;
Begin
k:=2;
fl1:=true;
While (k<=a div 2) and (fl1) do
begin
If a mod k=0 then
fl1:=false;
k:=k+1
end;
Writeln(fl1)
End;
Begin
ClrScr;
Write('Введите n ');
Readln(n);
n1:=n div 2;
p:=2;
Candidate:=3;
fl:=false;
Repeat
Prime(p,fl1);
If fl1 then
Writeln('Число Мерсенна-', Candidate);
p:=p+1;
If Candidate<=n1 then
begin
Candidate:=Candidate*2;
If Candidate<n then
Candidate:=Candidate+1
else
fl:=true
end
else
fl:=true
Until fl;
End.
Задача 32, стр. 60 (Ершол)
алг больший в массиве (аргцел n,
аргвещтаб a[1:n], резвещ t)
начцел k
│|индекс очередного
│ k:=2 |просматриваемого элемента
│|предположим, что больший
│ t:=a[1] |элемент a[1]
│|цикл с предусловием, проверка
│ нцпока k<=n |условия окончания
│ |цикла
│ │|обращение к вспомогательному
│ │|алгоритму для выбора бо
Дата добавления: 2015-01-26; просмотров: 1391; |
Генерация страницы за: 0.008 сек.