Въпрос при извеждане на процедурите
Да се състави главна програма за обработка на два двумерни масива C[10,10] и D[12,12]. Данните и в двата масива са в интервала [-999 - 999]. Съответните подпрограми да извършват следните обработки:
• извеждане на условието на задачата и името на автора
• въвеждане на входните данни;
• извеждане на входните данни;
• да се определи броя на отрицателните елементи по редове и по стълбове, а така също реда и стълба с най-малко отрицателни елементи;
• да се изведат резултатите;
• резултатът да се запише във външен файл на диск С: с име DATA08.DAT.
program task08;
type
matrix=array[1..50, 1..50] of integer;
procedure uslovie;
begin
writeln('Da se systavi glavna programa za obrabotka na ............');
end;
procedure readMatrix(var m: matrix; n:integer);
var
i, j: integer;
begin
for i := 1 to n do
for j := 1 to n do
begin
write('cell at row ', i, ', column ', j, ': ');
readln(m[i, j]);
end;
end;
procedure printMatrix(m: matrix; n:integer);
var
i, j: integer;
begin
for i := 1 to n do
begin
for j := 1 to n do
write(m[i, j]:2, ' ');
writeln;
end;
end;
procedure countNeg(a: matrix; n: integer; var negR, negC: array of integer; var minR, minC: integer);
var
i, j: integer;
begin
for i := 1 to n do
begin
negR[i] := 0;
negC[i] := 0;
end;
for i := 1 to n do
for j := 1 to n do
if a[i, j] < 0 then
begin
negR[i] := negR[i] + 1;
negC[j] := negC[j] + 1;
end;
minR := 1;
for i := 1 to n do
if negR[i] < negR[minR] then
minR := i;
minC := 1;
for i := 1 to n do
if negC[i] < negC[minC] then
minC := i;
end;
procedure printArray(m: array of integer; n:integer);
var
i, j: integer;
begin
for i := 1 to n do
write(m[i], ' ');
writeln;
end;
procedure printArrayToFile(var f: text; m: array of integer; n:integer);
var
i, j: integer;
begin
for i := 1 to n do
write(f, m[i], ' ');
writeln(f);
end;
var
a, b: matrix; (* vmesto C i D sym gi narekyl A i B zaradi copy-paste *)
negRA, negCA, negRB, negCB: array[1..50] of integer;
minRA, minCA, minRB, minCB: integer;
f: text;
begin
(* izvejdane na uslovieto i avtora *)
uslovie;
writeln;
(* vyvejdane na vhodnite danni *)
writeln('matrix A:');
readMatrix(a, 2); (* vmesto 10, 12 - 2, 3, za po-byrzo vyvejdane ot klaviaturata *)
Не мога да разбера това readMatrix(a,2), защо човека, който е писал програмата използва число (т.е. 2 ) вместо параметър ? В кой случай се използват тези числа и какво е приложението им ? И какво ще рече (* vmesto 10, 12 - 2, 3, za po-byrzo vyvejdane ot klaviaturata *
Re:Въпрос при извеждане на процедурите
А какво е "параметър" според теб? Струва ми се, че започваш да се учиш отзад-напред и ще ти е трудно. Ако разбереш какво е заместване по стойност и заместване по адрес може би ще си отговориш на въпроса.
А относно : "И какво ще рече (* vmesto 10, 12 - 2, 3, za po-byrzo vyvejdane ot klaviaturata *" пробвай да компилираш , като вместо 2 напишеш да кажем 12 и ще видиш разликата :)
Re:Въпрос при извеждане на процедурите
Добре заместване по стойност не е ли когато е въведен масива от програмиста, а по адрес, когато декларатора сам определя range-a ?
Re:Въпрос при извеждане на процедурите
Независимо (почти) от езика:
Когато една функция е декларирана така, че да очаква входните параметри да се задават по стойност, тя на практика няма достъп до променливите от викащата я функция. Можеш да я извикаш по два начина:
func(2, 7);
или
func(var1, var2);
Във втория случай реално изпращаш във функцията не самите променливи var1 и var2, а техни копия.
Когато функцията очаква адрес (reference), тя получава указателя към мястото от паметта, където е поместена променливата.
По тази причина такава функция НЕ можеш да извикаш с func(2, 7), защото това не са адреси от паметта.
И този вид функция може да промени стойностите на външните за нея променливи.
Според мен извикване по адрес е добре да ползваш в два случая. Когато искаш функцията да ти върне няколко променливи или когато й предаваш нещо, което заема повечко памет и искаш да намалиш използваната памет (иначе то се копира още веднъж).