1 семестр сессия / Bilet3
.docБилет №3. Особенности разработки программы с подпрограммой.
Практически все используемые прикладные программы - это программы с подпрограммами (процедурами и функциями). Подпрограммы, как уже указывалось, позволяют преодолевать сложность, обеспечивая декомпозицию программы на более простые составные части. Разработка программ на Турбо-Паскале с подпрограммами имеет ряд отличий от той методики, которая изложена выше применительно с простым программам. Эти отличия касаются как этапа разработки проекта, так и разработки алгоритма задачи. Остановимся на них несколько более детально.
При разработке проекта программы с подпрограммами обычно определяется и состав основных подпрограмм, предполагаемых для использования, хотя для программ с небольшим количеством подпрограмм состав подпрограмм часто определяется на этапе разработки алгоритма. В проекте программы состав основных подпрограмм может быть указан в разделе входных и выходных переменных, предназначенном также и для описания новых типов данных, используемых в этих переменных. В остальном проект программы с подпрограммами создается также, как и для программ без подпрограмм.
При разработке алгоритма на псевдокоде для программы с подпрограммами возможны две стратегии (или их сочетание).
Первая стратегия предполагает, что состав подпрограмм определяется раньше фактического использования этих подпрограмм в разделе операторов программы. Для таких подпрограмм вначале указывается их заголовок (в разделе описаний программы), возможно с необходимыми комментариями и возможно без расшифровки реализации этих подпрограмм. Затем в разделе операторов используются вызовы этих подпрограмм. Если тела подпрограмм ещё отсутствуют, то они создаются в процессе последующих уточнений.
Вторая стратегия предполагает, что вызовы подпрограмм использованы раньше, чем появилось описание подпрограмм (даже в виде заголовка). Эта стратегия естественна для случаев, когда состав подпрограмм не определён на этапе проекта программы, и подпрограммы "зарождаются" непосредственно при создании алгоритма задачи. Использование "опережающего" вызова предполагает, что после этого будет уточнен раздел описаний и в нём будет спроектировано тело подпрограммы.
Необходимо учесть также некоторые особенности проектирования подпрограмм по сравнению с обычными программами:
во-первых, заголовок подпрограммы, в отличие от заголовка программы, содержит, по сути, полную информацию о входных и выходных переменных подпрограммы в виде описания формальных параметров. Таким образом, заголовок подпрограммы выполняет функцию проекта подпрограммы, а именно разделов входных - выходных переменных и аномалий (поскольку аномалии следует отображать в виде специально предусмотренных параметров). Вся недостающая информация (например, функциональное назначение подпрограммы) может быть указана в комментариях заголовка подпрограммы.
во-вторых, многие подпрограммы непосредственно не используют операторы вывода на экран. В этих случаях нет необходимости в описании экранной формы.
Таким образом, при разработке подпрограмм во многих случаях нет необходимости в оформлении проекта подпрограммы иначе, чем в это предусмотрено в самом заголовке подпрограммы.
Методика разработки алгоритма подпрограммы не отличается от разработки алгоритма программы. Приведем пример разработки программы с функцией:
program letters; {проект}
1.Постановка задачи:
Для вводимой строки символов определить и вывести на экран все
повторяющиеся латинские буквы (не различая большие и малые буквы).
2. Входные и выходные переменные:
str: string; {входная строка}
j:char; {текущая латинская буква}
3. Аномалии:
if <отсутствуют повтор. латинские буквы> then ‘Нет повторяющихся букв’
4. Экранная форма:
begin
‘Введите строку:’
<str>
‘Повторяющиеся буквы:’
[ {<j>}]
[ Нет повторяющихся букв]
end.
program letters; {0.1}
{Нахождение повторяющихся латинских букв во вводимой строке}
var str:string;j:char;alfa:Boolean;
{0* function count(s:string;k:char):byte;}
{число вхождений символа k в строку s}
BEGIN writeln('Введите строку:');readln(str); writeln('Повторяющиеся буквы:'); alfa:=true; for j:='A' to 'Z' do if count(str,j)>1 then begin write(j,' ');alfa:=false end;
if alfa then writeln('Нет повторяющихся букв');writeln;
END.
program letters;{0.2}
{Нахождение повторяющихся латинских букв во вводимой строке}
var str:string;j:char;alfa:Boolean;
function count(s:string;k:char):byte;
var c,j:byte;
begin c:=0;for j:=1 to length(s) do
if upcase(s[j])=k then c:=c+1;count:=c
end{count};
BEGIN writeln('Введите строку:');readln(str); writeln('Повторяющиеся буквы:'); alfa:=true; for j:='A' to 'Z' do if count(str,j)>1 then begin write(j,' ');alfa:=false end;
if alfa then writeln('Нет повторяющихся букв');writeln;
END.
Задача 4.2.6(3)
program alex3;
type mas=array[1..5,1..4]of integer;
mass=array[1..5]of real;
var b:mas;
c:mass;
i,j:integer;
y:real;
procedure proc(x:mas;k:integer;var sr:real);
var i,sum,l:integer;
begin
sr:=0;
l:=0;
for i:=2 to 5 do
if x[k,i]>x[k,1] then begin
sr:=sr+x[k,i];
l:=l+1;
end;
sr:=sr/l;writeln(sr:5:2);readln;
end;
begin
for i:=1 to 5 do
for j:=1 to 4 do
read(b[i,j]);
for i:=1 to 5 do
proc(b,i,c[i]);
y:=exp(5*ln(c[1]-1))+exp(4*ln(c[2]-1))+exp(3*ln(c[3]-1))+sqr(c[4]-1)+(c[5]-1);
writeln('y=',y:5:2);
readln;
end.