Няколко теоретични въпроса в Паскал
Отново пускам тема за Паскал (сигурно ставам досаден, но имам много важен изпит на него). Та въпросите:
1. "Кога се пише "var" при деклариране на променливи в процедурите - пример : "procedure action (var a:Masiv, y:integer)
В учебника пише, че когато компютъра бърка в оперативната памет, тогава се използва "var", но от това пояснение не ми става ясно, бихте ли ми дали точни примери ?
2. Как се определят интервалите в type ? Пример имам задача с интервал от елементи на масив от -999.99 до 999.999 и в type интервала е "1..30,1..30" ? Каква е логиката интервала да го декларирам с "1..30,1..30" ?
3. Имаме команда "write x[i,j]:4" (при процедура "Извеждане на Данни") как разбирам това ":4" какво число да бъде или примерно":4:2"? До колкото знам това са десетиците и единиците на изведените числа, но не ми е ясно как се определят чрез тези отношения
4. Кога се използва Byte ?
5. Имаме for "i:=1 to y do
j:=1 to y do
"
Кога се слага begin между "i:=1 to y do" и "j:=1 to y do" и кога след тях ?
6. Кога се слага begin след "j:=1 to y do" и кога "if" без begin ?
7.
begin
res[i,j] :=Q
count := count + 1;
end
else
res[i, j] :=a[i,j];
replace :=count;
end;
Защо в този случай "end" е без точка и запетая ?
Благодаря ви предварително
Re:Няколко теоретични въпроса в Паскал
Дай да почваме леко-полека:
Първи въпрос
Това е е***и учебника, ако така е написано. Има два вида предаване на параметри - по име (като указател) и по стойност. Това ще рече, че ако имаш променлива i, която е равна на 4 например, и я предадеш като параметър по стойност на функция, то функцията ще получи числото 4 и може да го използва за каквото е необходимо, но както и да го манипулира няма да се промени нищо. Ако се предаде по име, то функцията ще получи адреса на променливата, т.е. ще има достъп до нея и ако я манипулира, това ще се отрази. Нещо много сложно стана, нека дам пример:
Код:
function po_stoinost( i: integer )
begin
i:=i+1;
end;
function po_ime( var i: integer )
begin
i:=i+1;
end;
begin
i:=4;
po_stoinost( i );
writeln(i);
po_ime( i );
writeln(i);
end.
Ще ти изведе следното:
4
5
Втори въпрос
Тези интервали дефинират масиви. Интервалът 1..30 ще ти дефинира едномерен масив с 30 елемента, а интервалът 1..30,1..30 ще дефинира двумерен масив с общо 30х30 или 900 елемента
Трети въпрос
:4 означава да се изведе числото на 4 позиции, т.е. 2 ще се изведе като 3 интервала и числото 2, а 22 ще се изведе като 2 интервала и числото 22. Това е удобно да се форматират резултатите. Форматът :4:2 указва отново извеждане на 4 позиции, като 2 означава броя позиции за дробната част. Например 2.222:4:2 ще изглежда 2.22
Пети и шести въпрос
begin … end заграждат блок от команди, т.е разглеждат се като едно цяло. Независимо след if или for или какъвто и да било друг оператор е необходимо да се сложи begin … end за да се изпълнят повече от една команди. Ето пак един пример:
Код:
if( 1 = 2 )
writeln( 'Лъжа' );
writeln( 'Истина' );
if( 1 = 2 )
begin
writeln( 'Лъжа' );
writeln( 'Истина' );
end
Първото ще изпише „Истина“, защото if-ът, който не се изпълнява, ще важи само за първата команда. Второто няма да изпише нищо, защото отново if-ът важи само за първата команда след него, но това в случая е begin … end, който съдържа в себе си повече команди.
Седми въпрос
Просто преди else не трябва да има ;
Успех!
П.П. може да има някоя и друга грешка в синтаксиса, че сигурно 20 г. не съм писал на Pascal.
Re:Няколко теоретични въпроса в Паскал
Цитат:
Защо в този случай "end" е без точка и запетая ?
Защото синтаксиса (правописа) на изписването на оператора "If .. Then .. Else" е следния:
Пример1
If условие Then оператор 1
Else оператор 2;
или
Пример2
If условие Then
Begin
оператор 1
оператор 2
End
Else
оператор 3;
Изпълнява се по следния начин:
Пример1 -> Ако твърдението "условие" Е ВЯРНО , тогава изпълни оператор1, излез от условната структура и премини към изпълнението на следващия оператор след оператор2.Ако обаче твърдението "условие" НЕ Е ВЯРНО , тогава изпълни САМО оператор2, излез от условната структура и премини към изпълнението на следващия оператор.
Пример2 -> Ако твърдението "условие" Е ВЯРНО , тогава изпълни оператор1 и оператор2 (защото се използва Begin..End - изпълнява се всичко между тях), излез от условната структура и премини към изпълнението на следващия оператор след оператор3.Ако обаче твърдението "условие" НЕ Е ВЯРНО , тогава изпълни САМО оператор3, излез от условната структура и премини към изпълнението на следващия оператор.
Символът ";" се слага винаги след оператора след "Else", тоест в края на условната структура.
Цитат:
4. Кога се използва Byte ?
Byte е целочислен тип данни, тоест ако кажем , че променливата P е от тип Byte, то тя може да приема стойности само от 0 до 255.
Re:Няколко теоретични въпроса в Паскал
Благодаря ви много, а за да не спамя с нова тема искам да попитам за ето тази програма :
7. Да се състави главна програма за обработка на два двумерни масива А[10,10] и B[12,12]. Данните и в двата масива са в интервала [-500 - 500]. Съответните подпрограми да извършват следните обработки:
• минималните елементи на всеки ред да се изнесат в първата колонка, а максималните - в последната колонка; Да се определи броя на максималните елементи по-големи от зададено число М и броя на минималните елементи по-малки от зададено число N;
procedure moveMin(var a: matrix; size, M, N: integer; var max, min: integer);
var
i, j, minIndex, maxIndex, temp: integer;
begin
max := 0;
min := 0;
for i := 1 to size do
begin
minIndex := 1;
for j := 2 to size do
if a[i, j] < a[i, minIndex] then
minIndex := j;
if a[i, minIndex] < N then
min := min + 1;
if minIndex > 1 then
begin
temp := a[i, minIndex];
for j := minIndex downto 2 do
a[i, j] := a[i, j - 1];
a[i, 1] := temp;
end;
maxIndex := 1;
for j := 2 to size do
if a[i, j] > a[i, maxIndex] then
maxIndex := j;
if a[i, maxIndex] > M then
max := max + 1;
if maxIndex < size then
begin
temp := a[i, maxIndex];
for j := maxIndex to size - 1 do
a[i, j] := a[i, j + 1];
a[i, size] := temp;
end;
end;
end;
Можете ли да ми я разясните ?