Паскаль лекции. Лекции Паскаль. Программа на языке машинных команд (ее называют объектной). Краткое знакомство
Скачать 1.24 Mb.
|
BEGIN Writeln(‘ Введите элементы массива’); For i:=1 to n do For j:=1 to n do Readln(a[i,j]); { Вывод значений массива} For i:=1 to n do begin For j:=1 to n do Write (a[i,j]:5:1); Writeln; end; s:=0; j=1; For i:=1 to n do s:=s+a[i,j]; Writeln(‘ Сумма элементов первого столбца = ’,s:5:2); end. 5. Вычисление суммы элементов всего двумерного массива. S:=0; for i:=1 to m do for j:=0 to n do S:=S+a[i,j]; 6. Задача поиска максимального (минимального) элемента и его индексов. Ищем максимальный элемент каждой строки : For i:=0 to m do begin PDF created with pdfFactory Pro trial version www.pdffactory.com 54 max:=a[i,1]; ind_L:=i; { сохраняем номер строки} ind_C:=1; { заносим номер 1 - первый столбец} for j:=1 to n do if a[i,j]>max then begin max:=a[i,j]; ind_C:=j { сохраняем номер j-ого столбца} end; writeln(‘max строки ’,i,’=’,max) end; Ищем минимальный элемент каждого столбца : For j:=0 to n do { перемещаемся по столбцу} begin min:=a[1,j]; ind_L:=1; { сохраняем номер строки} ind_C:=j; { сохраняем номер столбца} for i:=1 to m do if a[i,j] 7. Алгоритм поиска минимального элемента и его индексов для всего массива. Min:=a[1,1]; ind_L:=1; ind_C:=1; for i:=1 to m do for j:=1 to n do if a[i,j] Квадратные матрицы. Type mas4x4=array[1..4,1..4] of integer; var a: mas4x4; PDF created with pdfFactory Pro trial version www.pdffactory.com 55 Главная диагональ - элементы a 11 , a 22 , a 33 , a 44 ( индексы элементов, расположенных на главной диагонали (i=j) Побочная диагональ - элементы a 41 , a 32 , a 23 , a 14 ( сумма индексов элементов на 1 больше размерности строки (или столбца), т.е. i+j=4=1 или i+j=n+1. На рисунке главная диагональ закрашена сплошным серым цветом, побочная - черным. Элементы, расположенные над главной диагональю, Для индексов элементов, расположенных над главной диагональю выполняется отношение i Примеры : 1) Найти сумму элементов главной диагонали : S:=0; for i:=1 to n do S:=S+a[i,i]; a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 a 41 a 42 a 43 a 44 a 12 a 13 a 14 a 23 a 24 a 34 a 21 a 31 a 32 a 41 a 42 a 43 PDF created with pdfFactory Pro trial version www.pdffactory.com 56 2) Найти минимальный элемент побочной диагонали : min:=a[1,n]; for i:=1 to n do if a[i,n+1-i] Задача 1. Дан массив действительных чисел, состоящий из 3 строк и 5 столбцов. Вычислить произведение всех элементов массива. Program pr1; CONST N=3; M=5; TYPE MAS=array [1..N,1..M] of real; Var b: MAS; i: 1..N; j : 1..M; p:real; BEGIN Writeln(‘ Введите элементы массива’); For i:=1 to n do For j:=1 to m do Readln(b[i,j]); { Вывод значений массива} For i:=1 to n do begin For j:=1 to m do Write (b[i,j]); { Вывод элементов одной строки матрицы} Writeln; { переход на следующую строку экрана} end; p:=1; For i:=1 to n do For j:=1 to m do p:=p*b[i,j]; Writeln(‘ Произведение = ’,p:7:2); end. PDF created with pdfFactory Pro trial version www.pdffactory.com 57 Задача 2. Дан двумерный массив A[N,M] Сформировать массив B[N,M], где SQR(A[I.J]), если I- НЕЧЕТНОЕ; B[I,J] = SQR Т(A[I.J]), если I- ЧЕТНОЕ; Program pr3; CONST N=3; M=5; TYPE MAS=array [1..N,1..M] of real; Var a,b : MAS; i: 1..N; j : 1..M; BEGIN Writeln(‘ Введите элементы массива’); For i:=1 to N do For j:=1 to M do Readln(a[i,j]); { Вывод значений массива} For i:=1 to N do begin For j:=1 to M do Write (a[i,j]:5:1); Writeln; end; For i:=1 to N do if i/2= int(i/2) Then For j:=1 to M do b[i,j]:=sqrt (a[i,j]) Else For j:=1 to M do b[i,j]:=sqr (a[i,j]) For i:=1 to N do begin For j:=1 to M do Write (b[i,j]:7:2); Writeln; end; end. PDF created with pdfFactory Pro trial version www.pdffactory.com 58 §17. Подпрограммы В практике программирования часто встречаются задачи, в которых по ходу выполнения программы приходится производить одни и те же действия или вычисления, но при различных исходных данных. Чтобы исключить повторение одинаковых операторов и сделать тем самым программу проще и понятнее, можно выделить эти повторяющиеся действия в самостоятельную часть программы, которая может быть использована многократно по мере необходимости. Автономная часть программы, реализующая определенный алгоритм и допускающая обращение к ней из различных частей общей программы, называется подпрограммой. Подпрограммы оформляются в виде замкнутых участков программы, имеющих четко обозначенные вход и выход. Обращение к подпрограмме осуществляется из основной программы через заголовок подпрограммы. При вызове подпрограммы работа основной программы приостанавливается, и начинает выполняться вызванная подпрограмма. Она обрабатывает данные, переданные ей из основной программы, или просто выполняет заданную последовательность действий. По завершении выполнения подпрограммы основная программа продолжает выполнятся с того места, где прервалось ее действие. Передача данных из основной программы в подпрограмму ( входные данные) и возврат результата выполнения подпрограммы осуществляется с помощью параметров. Параметры - это данные, которые передаются вызываемой подпрограмме и используются последней в качестве входной и (или) выходной информации. Использование подпрограмм позволяет реализовать один из самых прогрессивных методов программирования - структурное программирование. PDF created with pdfFactory Pro trial version www.pdffactory.com 59 Процедура в Паскале и ее формат. Любая программа может содержать несколько процедур и функций. Процедуры и функции объявляются в разделе описания вслед за пределом описания переменных. Процедура - это независимая часть программы, которую можно вызывать по имени для выполнения определенных действий. Структура процедуры имеет вид : Procedure имя(список формальных параметров); (* раздел описаний *) begin (* раздел операторов *) end; Первая строка описания называется заголовком процедуры, а раздел операторов называется телом процедуры. В заголовке указывается служебное слово PROCEDURE, за которым следуют имя процедуры и список формальных параметров, заключенные в круглые скобки (если такие имеются). В списке перечисляются имена формальных параметров и их тип. Имя параметра отделяется от типа двоеточием, а параметры друг от друга - точкой с запятой. Если несколько формальных параметров имеют одинаковый тип, тогда их можно перечислить через запятую, а затем указать тип. Тело процедуры заключается в операторные скобки BEGIN и END, причем после END ставится точка с запятой. Раздел описаний процедуры подобен программе и состоит из разделов меток, констант, типов, переменных и , в свою очередь, процедур и функций. Процедура вызывается по ее имени : имя(список фактических параметров); PDF created with pdfFactory Pro trial version www.pdffactory.com 60 Формальные параметры - параметры, определенные в заголовке процедуры. Фактические параметры - выражения, задающие конкретные значения при обращении к процедуре. При обращении к процедуре ее формальные параметры замещаются фактическими, переданными из основной программы. Фактические параметры - это параметры, которые передаются процедуре при ее вызове. Количество и тип формальных и фактических параметров должны в точности совпадать. Формальные параметры описываются в заголовке процедуры и определяют тип и место подстановки фактических параметров. Формальные параметры делятся на два вида: параметры-переменные и параметры-значения. Параметры-переменные отличаются тем, что передними стоит служебное слово Var. Они используются тогда, когда необходимо, чтобы изменения значений формальных параметров в теле процедуры приводили к изменению соответствующих фактических параметров. Параметры-значения отличаются тем, что перед ними слово Var не ставится. Внутри процедуры можно производить любые действия с параметрами-значениями, но все изменения никак не отражаются на значениях соответствующих фактических параметров, то есть какими они были до вызова процедуры, такими же и останутся после завершения ее работы. Все переменные программы делятся на глобальные и локальные. Глобальные переменные объявляются в разделе описаний основной программы. Локальные переменные объявляются в процедурах и функциях. Таким образом, локальные переменные «живут» только во время работы подпрограммы. Пример. Составить программу для вычисления а n : целые числа а и n (n>=0) вводятся с клавиатуры. ( составить процедуру для вычисления степени целого числа). Program ex; var a, n : integer; PDF created with pdfFactory Pro trial version www.pdffactory.com 61 s: longint; Procedure Degree(x,y : integer; var st : longint); var i : integer; begin st:=1; for i:=1 to y do st:=st*x; end; { начало основной программы} begin writeln(‘ введите два числа - основание и показатель степени’); readln(a,n); Degree(a,n,s); { обращение к процедуре } writeln(‘ Результат ’,s); end. Процедура названа именем Degree. В скобках записан список формальных параметров, то есть перечислены переменные с указанием их типа. Используем три параметра: первый - основание степени, то есть число, которое надо возвести в степень; второй - показатель степени, третий - результат. Первые два формальных параметра - параметры значения, третий - параметр-переменная, и перед ним указано слово var. Все они описаны как целые (x и y - переменные типа integer, st - Longint, так как степенная функция быстро возрастает). После заголовка процедуры идут разделы описаний. В нашем примере имеется только раздел описания переменных, в котором описывается одна переменная i (счетчик цикла). Далее идет тело процедуры. Оно начинается служебным словом Begin и заканчивается служебным словом End, после которого стоит точка с запятой (в конце программы после последнего End ставится точка). В теле процедуры вычисляется степень числа x с помощью цикла For. В программе процедуры и функции описываются после раздела описания переменных программы, но до начала ее основной части, то есть до Begin , начинающего эту часть программы. !!!! Процедура вызывается как оператор, состоящий из имени процедуры. В круглых скобках записываются фактические параметры. PDF created with pdfFactory Pro trial version www.pdffactory.com 62 В нашем примере формальные параметры x, y и st принимают значения фактических параметров a, n и s соответственно. После завершения работы процедуры переменные a и n сохранят те же значения, что и при вызове, а s получит новое значение. Пример 2 : Используя процедуру для вычисления степени числа, найти значение выражения : y=a 4 x 4 + a 3 x 3 + a 2 x 2 + a 1 x + a 0 program ex2; var a: array[0..4] of integer; i, x: integer; y,s: longint; Procedure Degree(xx,n : integer; var st : longint); var i : integer; begin st:=1; for i:=1 to n do st:=st*xx; end; { начало основной программы} begin write(‘ введите значение переменной х ‘); readln(x); writeln(‘ введите массив коэффициентов’); for i:=0 to 4 do begin write(‘a[‘,i,’]=’); readln(a[i]); end; y:=a[0]; for i:=1 to 4 do begin Degree(x,i,s); y:=y+a[i]*s; end; writeln(‘y=’,y); end. Пример 3. Просуммировать различные части массива. Program sumir; var a: array [1..100] of integer; sa1, sa2,sa3 : integer; n,l,t : integer; procedure summa(a:array [1..100] of integer; k,m :integer; var s:integer); var i:integer; PDF created with pdfFactory Pro trial version www.pdffactory.com 63 begin s:=0; for i:=k to m do s:=s+a[i]; end; BEGIN for t:=1 to 100 do begin write(‘ введите очередной элемент массива ‘); readln(a[i]); end; summa(a,10,20,sa1); summa(a, n , l , sa2); summa(a, n,n+3,sa3); end. Функции Заголовок функции состоит из слова Function, за которым указывается имя функции, затем в круглых скобках записывается список формальных параметров, далее ставится двоеточие и указывается тип результата функции. В теле функции обязательно должен быть хотя бы один оператор присваивания, в левой части которого стоит имя функции, а в правой - ее значение. Иначе значение функции не будет определено. Таким образом, общий вид описания функции следующий : Function Имя[(список формальных параметров)]:Тип результата описательная часть Begin тело функции, в которой обязательно должно быть присваивание Имя_функции:=значение End; PDF created with pdfFactory Pro trial version www.pdffactory.com 64 Пример 1 Составить программу, подсчитывающую число сочетаний без повторения из n элементов по k. Число сочетания без повторения вычисляется по формуле )! ( ! ! k n k n k n С Обозначим через n и k переменные для хранения введенных чисел; С - переменную для хранения результата. Воспользуемся функцией для вычисления факториала числа n. (n!=1*2*..*n) program sochet; var n,k : integer; a1,a2,a3,c : lohgint; Function factorial(n:integer):longint; var i: integer; rez : longint; begin rez:=1; for i:=1 to n do rez:=rez*i; factorial:=rez; end; begin writeln(‘ ввод n и k :’); readln(n,k); a1:=factorial(n); { вычисление n!} a2:=factorial(k); { вычисление k!} a3:=factorial(n-k); { вычисление (n-k)!} c:=a1 div (a2*a3); { результат} writeln(‘ результат=’,c) ; end. Первая строка в описании функции - это ее заголовок. Служебное слово Function (функция) указывает на то, что именем factorial названа функция. В скобках записан список формальных параметров функции, состоящий из одной переменной целого типа. Далее в заголовке указан тип значения функции. В данном примере результат функции factorial - длинное целое число. За заголовком функции следует описательная часть функции, которая, как у программы, может состоять из разделов описания PDF created with pdfFactory Pro trial version www.pdffactory.com 65 переменных, констант, типов. В данном примере есть переменные i ( счетчик цикла) rez (для накопления значения факториала). Далее идет раздел операторов (тело функции). В тексте программы описания функций всегда следуют за разделом описания переменных и до начала основной части, как и описания процедур. Пусть n=5, k=3. Когда в программе встречается оператор a1:=factorial(n), выполняются следующие действия: выделяется память для переменных, описанных в функции factorial; формальному параметру присваивается значение фактического: n:=n (n=5); выполняется функция, вычисляется факториал числа 5; значение функции передается в место обращения к этой функции, то есть присваивается переменной a1; в операторах a2:=factorial(k) a3:=factorial(n-k) еще дважды вызывается функция factorial с параметрами k=3 n-k=2. Функция - это самостоятельная часть программы, имеющая собственные переменные, которым отводится отдельное место в памяти ЭВМ. Этим объясняется тот факт, что переменные с одинаковыми именами, используемые в функции и в основной программе, являются разными ( переменная n основной программы и параметр n функции). При выполнении программы машина «не путает» имена этих переменных, т.к. области их действия не совпадают. Пример 2 : Написать функцию, подсчитывающую количество цифр натурального числа. Используя ее, определить, в каком из двух данных чисел больше цифр. Program chisla; Var n1, n2 : longint; k1, k2 : byte; Function kol(x : longint): byte; var k: byte; begin k:=0; While x<>0 do begin PDF created with pdfFactory Pro trial version www.pdffactory.com 66 Inc(k); x:=x div 10; end; kol:=k; end; BEGIN writeln(‘ Введите два числа’); readln(n1, n2); k1:=kol(n1); k2:=kol(n2); if k1=k2 Then writeln(‘ одинаковое количество цифр’) else if k1>k2 Then Writeln(‘ в первом числе цифр больше’) else writeln(‘ во втором числе цифр больше’) END. §18. Примеры рекурсивного программирования Алгоритм, который в процессе работы обращается сам к себе, называется рекурсивным. Для иллюстрации понятия рекурсия часто приводят пример с телевизором, на экране которого изображен этот же телевизор, на экране второго - опять телевизор и так далее. Можно разбить все рекурсивные задачи на 4 вида. I. Задачи с рекурсивной формулировкой Некоторые объекты являются рекурсивными по определению, поэтому рекурсивные алгоритмы их получения буквально повторяют соответствующие определения. Пример : Вычисление факториала натурального числа. 1 при N=1 N(N-1)! При N>1 Function factorial(n:integer): longint; begin if n=1 Then factorial:=1 else factorial:=n*factorial(n-1); N! = PDF created with pdfFactory Pro trial version www.pdffactory.com 67 end; Функция вызывается 5 раз. N=1 - это условие окончания рекурсии. Задача 2. Написать рекурсивную функцию вычисления значений функции Аккермана для неотрицательных чисел n и m, вводимых с клавиатуры. m+1, если n=0 A(n,m) = A(n-1,1), если n0, m=0 A(n-1,A(n,m-1)), если n>0, m0 Задача 3. Найти первые N чисел Фибоначчи. Каждое число Фибоначчи, кроме первых двух, равно сумме двух предыдущих чисел, а первые два равны 1 (1, 1, 2, 3, 5, 8, 13, 21...) |