Програмни ипотпални процедури

Ипотпална процедура е подпрограма, която след изпълнението си може да връща произволен брой стойности


Същност – подпрограма, която след изпълнението си може да връща произволен брой стойности, една или нито една. Предназначение:
  • Реализиране на самостоятелни операции в програмата
  • Разделяне на програмата на по-малки особени части
  • Извършване на многократни повтарящи се изчисления в програмата посредством обмен на параметри с главна програма и промяна на тяхната стойност.
Изисквания – процедурата се извиква в качеството на оператор чрез своето име и списък от параметри, реализиращи връзката с извикващата програма. Видове – стандартни и дефинирани от потребителя.


Използване на ипотпални програмни процедури

Стандартните оператори в езика Паскал представляват процедури, които са описани в модула System. Процедурите в този модул са достъпни без посочване името на модула в декларативната част на програмата. Стандартните процедури са неразделни част от езика. Прилагайки нормалната процедура, не се интересуваме от нейното действие. За използването на стандартните процедури, които не са описани в модула System, е необходимо в декларативната част на програмата след uses да се посочи модулът който е описана определената процедура. В настоящия раздел се разглежда създаването и използването на ипотпал процедури, дефинирани от програмиста. Описвайки свои процедури, той има възможност, в съответствие с конкретните нужди на разработването на програмата да разшири множеството от оператори с които борави езикът. Обмен на данни - дефинираните от потребителя процедури могат да обменят данни изискващата програма или да не обменят, извършващи самостоятелни действия. Възможни са следните случаи:

  • процедурите получават входни данни и връщат изходни резултати
  • ипотпал процедурите получават входни данни, но не връщат резултати
  • процедурите не получават входни данни, а само връщат резултатите
  • процедурите не получават входни данни и не връщат изходни резултати.
Дефиниране на процедурата

програмна ипотпална процедураПроцедурата се описва в раздела на подпрограмите на декларативната част на извикващата програма. Описанието на процедурата се състои от заглавие, декларативната и изпълнителната част. В заглавието се определя името, с което се извиква процедурата, както и списъка с декларации на формални параметри, посредством които процедурата обменя данни с извикващата програма. Формалните параметри се използват в изпълнителната част на ипотпал процедурата. В декларативната част на процедурата се декларират обекти ,които се явяват локални ,т.е се използват само в процедурата и се съхраняват в паметта само докато е активна процедурата. Изпълнителната част на процедурата започва с Begin и завършва с End след които се поставя разделителят „;”. Извикване на процедура - процедурите се извикват в главната програма чрез своето име използвано в качеството на Оператор . Ако след името на процедурата в дефиницията в декларативната част на извикващата ипотпална програма има списък с формални параметри ,то при извикването на процедурата след името и трябва да има списък с фактически (действителни) параметри. Между формалните и фактическите параметри трябва да има съответствие по брой , по тип ,по смисъл и по място


Видове формални параметри:
Предавани по стойност – при стартирането на извикващата програма се отделя място в оперативната памет за фактическите параметри , а при извикването на процедурата – за съответните им формални параметри. В момента на извикване на процедурата стойностите на фактическите параметри се преписват в клетките определени за съответните им формални параметри. Процедурата променя стойностите само на формалните параметри ,защото няма достъп до фактическите.

Предавани по адрес – отделя се място само за фактическите параметри . При извикване на процедурата ,към формалните параметри се предават адресите на съответните им фактически параметри от главната програма.

Задача.

Program protocol_09_10_1;
type
   MAS1 = array [1..10,1..10] of Real;
   MAS2 = array [1..20,1..20] of Real;
   MAS3 = array [1..30,1..30] of Real;
   MAS4 = array [1..1400] of Real;
var
   A : MAS1;
   B : MAS2;
   C : MAS3;
   Polojitelni : MAS4;
   Ma, Mb, Mc, M4 : Integer;

procedure vhod_danni(var M1 : MAS1; var M2 : MAS2; var M3 : MAS3);
var
   i, j : Integer;
begin
   Writeln;
   Write('Vuvedete goleminata na dvumerniq masiv A: '); Readln(Ma);
   Write('Vuvedete goleminata na dvumerniq masiv B: '); Readln(Mb);
   Write('Vuvedete goleminata na dvumerniq masiv C: '); Readln(Mc);
   Writeln;
   Writeln('Vuvejdane na dannite za masiv A');
   for i := 1 to Ma do
      for j := 1 to Ma do
      begin
         repeat
            Write('A[',i,',',j,'] = ');
            Readln(A[i,j]);
         until (A[i,j] >= -999.99) and (A[i,j] <= 999.99)
      end;
   Writeln;
   Writeln('Vuvejdane na dannite za masiv B');
   for i := 1 to Mb do
      for j := 1 to Mb do
      begin
         repeat
            Write('B[',i,',',j,'] = ');
            Readln(B[i,j]);
         until (B[i,j] >= -999.99) and (B[i,j] <= 999.99)
      end;
   Writeln;
   Writeln('Vuvejdane na dannite za masiv C');
   for i := 1 to Mc do
      for j := 1 to Mc do
      begin
         repeat
            Write('C[',i,',',j,'] = ');
            Readln(C[i,j]);
         until (C[i,j] >= -999.99) and (C[i,j] <= 999.99)
      end;
end; {procedure vhod_danni}

procedure izvejdane_vhodni_danni(M1 : MAS1; M2 : MAS2; M3 : MAS3);
var
   i, j : Integer;
begin
   Writeln('Natisnete Enter za da produljite...');
   Readln;
   Writeln('Izvejdane na dannite za masiva A');
   for i := 1 to Ma do
   begin
      for j := 1 to Ma do
         Write(M1[i,j]:8:2);
      Writeln;
   end;
   Writeln;
   Writeln('Izvejdane na dannite za masiva B');
   for i := 1 to Mb do
   begin
      for j := 1 to Mb do
         Write(M2[i,j]:8:2);
      Writeln;
   end;
   Writeln;
   Writeln('Izvejdane na dannite za masiva C');
   for i := 1 to Mc do
   begin
      for j := 1 to Mc do
         Write(M3[i,j]:8:2);
      Writeln;
   end;
   Writeln;
end; {procedure izvejdane_vhodni_danni}

procedure nov_masiv(M1 : MAS1; M2 : MAS2; M3 : MAS3);
var
   i, j : Integer;
begin
   M4 := 0;
   for i := 1 to Ma do
      for j := 1 to Ma do
      begin
         if M1[i,j] > 0 then
         begin
            M4 := M4 + 1;
            Polojitelni[M4] := M1[i,j];
         end;
      end;
   for i := 1 to Mb do
      for j := 1 to Mb do
      begin
         if M2[i,j] > 0 then
         begin
            M4 := M4 + 1;
            Polojitelni[M4] := M2[i,j];
         end;
      end;
   for i := 1 to Mc do
      for j := 1 to Mc do
      begin
         if M3[i,j] > 0 then
         begin
            M4 := M4 + 1;
            Polojitelni[M4] := M3[i,j];
         end;
      end;
end; {procedure nov_masiv}

procedure sortirane(var A : MAS4);
var
   Flag : Boolean;
   rez : Real;
   I : Integer;
begin
   Flag := True;
   while Flag do
   begin
      Flag := False;
      for I := 1 to M4 - 1 do
         if A[I] > A[I+1] then
         begin
            Flag := True;
            Rez := A[I];
            A[I] := A[I+1];
            A[I+1] := Rez;
         end;
   end;
end; {procedure sortirane}

procedure rezultat(A : MAS4);
var i : Integer;
begin
   Writeln;
   Writeln('Rezultatut ot sortiraneto na ednomerniq masiv');
   for i := 1 to M4 do
      Write(A[i]:8:2);
end;

begin {Main}
   vhod_danni(A,B,C);
   izvejdane_vhodni_danni(A,B,C);
   nov_masiv(A, B, C);
   sortirane(Polojitelni);
   rezultat(Polojitelni);
   Readln
end. {Main}

Задача 2. 

Program protocol_09_10_2;
type
   MAS1 = array [1..10,1..20] of Real;
   MAS2 = array [1..20,1..30] of Real;
   MAS3 = array [1..30,1..40] of Real;
var
   A, Q1 : MAS1;
   B, Q2 : MAS2;
   C, Q3 : MAS3;
   Ma, Na, Mb, Nb, Mc, Nc, count : Integer;
   Q, interval_start, interval_end : Integer;

procedure vhod_danni(var M1 : MAS1; var M2 : MAS2; var M3 : MAS3);
var
   i, j : Integer;
begin
   Writeln;
   Write('Vuvedete broq redove na masiv A: '); Readln(Ma);
   Write('Vuvedete broq koloni na masiv A: '); Readln(Na);
   Write('Vuvedete broq redove na masiv B: '); Readln(Mb);
   Write('Vuvedete broq koloni na masiv B: '); Readln(Nb);
   Write('Vuvedete broq redove na masiv C: '); Readln(Mc);
   Write('Vuvedete broq koloni na masiv C: '); Readln(Nc);
   Writeln;
   Write('Vuvedete na4aloto na intervala [M - N]: '); Readln(interval_start);
   Write('Vuvedete kraq na intervala [M - N]: '); Readln(interval_end);
   Write('Vuvedete 4isloto Q: '); Readln(Q);
   Writeln;
   Writeln('Vuvejdane na dannite za masiv A');
   for i := 1 to Ma do
      for j := 1 to Na do
      begin
         repeat
            Write('A[',i,',',j,'] = ');
            Readln(A[i,j]);
         until (A[i,j] >= -99.99) and (A[i,j] <= 99.99)
      end;
   Writeln;
   Writeln('Vuvejdane na dannite za masiv B');
   for i := 1 to Mb do
      for j := 1 to Nb do
      begin
         repeat
            Write('B[',i,',',j,'] = ');
            Readln(B[i,j]);
         until (B[i,j] >= -99.99) and (B[i,j] <= 99.99)
      end;
   Writeln;
   Writeln('Vuvejdane na dannite za masiv C');
   for i := 1 to Mc do
      for j := 1 to Nc do
      begin
         repeat
            Write('C[',i,',',j,'] = ');
            Readln(C[i,j]);
         until (C[i,j] >= -99.99) and (C[i,j] <= 99.99)
      end;
end; {procedure vhod_danni}

procedure izvejdane_vhodni_danni(M1 : MAS1; M2 : MAS2; M3 : MAS3);
var
   i, j : Integer;
begin
   Writeln('Natisnete Enter za da produljite...');
   Readln;
   Writeln('Izvejdane na dannite za masiva A');
   for i := 1 to Ma do
   begin
      for j := 1 to Na do
         Write(M1[i,j]:7:2);
      Writeln;
   end;
   Writeln;
   Writeln('Izvejdane na dannite za masiva B');
   for i := 1 to Mb do
   begin
      for j := 1 to Nb do
         Write(M2[i,j]:7:2);
      Writeln;
   end;
   Writeln;
   Writeln('Izvejdane na dannite za masiva C');
   for i := 1 to Mc do
   begin
      for j := 1 to Nc do
         Write(M3[i,j]:7:2);
      Writeln;
   end;
   Writeln;
end; {procedure izvejdane_vhodni_danni}

procedure novi_masiv(M1 : MAS1; M2 : MAS2; M3 : MAS3; var Q1 : MAS1; var Q2 : MAS2; var Q3 : MAS3);
var
   i, j : Integer;
begin
   count := 0;
   for i := 1 to Ma do
      for j := 1 to Na do
      begin
         if (M1[i,j] >= interval_start) and (M1[i,j] <= interval_end) then
         begin
            count := count + 1;
            Q1[i,j] := Q;
         end
         else
            Q1[i,j] := M1[i,j];
      end;
   for i := 1 to Mb do
      for j := 1 to Nb do
      begin
         if (M2[i,j] >= interval_start) and (M2[i,j] <= interval_end) then
         begin
            count := count + 1;
            Q2[i,j] := Q;
         end
         else
            Q2[i,j] := M2[i,j];
      end;
   for i := 1 to Mc do
      for j := 1 to Nc do
      begin
         if (M3[i,j] >= interval_start) and (M3[i,j] <= interval_end) then
         begin
            count := count + 1;
            Q3[i,j] := Q;
         end
         else
            Q3[i,j] := M3[i,j];
      end;
end; {procedure nov_masiv}

procedure rezultat;
var i, j : Integer;
begin
   Writeln;
   Writeln('Rezultatut ot podmqnata na elementite s 4isloto ', Q);
   Writeln;
   Writeln('Masivut A');
   for i := 1 to Ma do
   begin
      for j := 1 to Na do
         Write(Q1[i,j]:8:2);
      Writeln;
   end;
   Writeln;
   Writeln('Masivut B');
   for i := 1 to Mb do
   begin
      for j := 1 to Nb do
         Write(Q2[i,j]:8:2);
      Writeln;
   end;
   Writeln;
   Writeln('Masivut C');
   for i := 1 to Mc do
   begin
      for j := 1 to Nc do
         Write(Q3[i,j]:8:2);
      Writeln;
   end;
end;

begin {Main}
   vhod_danni(A,B,C);
   izvejdane_vhodni_danni(A,B,C);
   Write('Natisnete Enter za produljenie...');
   Readln;
   novi_masiv(A, B, C, Q1, Q2, Q3);
   rezultat;
   Readln
end. {Main}

Ипотпал информация

Ипотпал Хардуерна Терминология



Моля, използвайте следните навигационни връзки от нашия уеб сайт: