Цитата:
Сообщение от Madara
Я с ума сойду
|
Я с Вами тоже.
Знаете, был такой анекдот:
- Подсудимый, ваше последнее слово!
- Ну вы, блин, даёте...
Ведь вот дана была хорошая, отлаженная программка - нет, хочу по-своему! Прекрасно. Вообще-то заслуживает всяческого уважения, куда большего, чем "ничего не знаю, дайте - я скатаю". Но всё-таки надо же представлять себе смысл простейших операторов языка!
Вот вы решили вместо массива записей (как у меня), каждая из которых содержит полную информацию о координатах одной точки, сделать единую запись с полями-массивами. Чудесно (хотя, по-моему, это доставание правого уха через-под левое колено, поскольку смысла в такой записи при наличии массивов координат - ровно ноль, ну да Вам виднее - можно и так). И что Вы делаете дальше? Вместо того, чтобы проверять истинность утверждения о том, что конкретная точка сидит в первом квадранте, Вы в функцию First_Quadr за каким-то хреном врабатываете цикл ПО ВСЕМ ТОЧКАМ, причем, вопреки всем правилам и здравому смыслу, используете один и тот же идентификатор (i) и как формальный параметр функции, и как переменную внутреннего цикла! Бедный Паскаль... Даже если он и продерётся через такую конструкцию, то в итоге на выходе функции появится информация о принадлежности к первому квадранту ТОЛЬКО ПОСЛЕДНЕЙ ТОЧКИ!
Короче говоря, первое, что нужно -
выкинуть цикл из функции: нечего ему там делать!!!
Должно быть как-то так:
Код:
Function First_Quadr(i:integer; z:Coord):boolean;
begin
if (z.x[i]>=0) and (z.y[i]>=0) then
First_Quadr:=true
else
First_Quadr:=false;
end;
Идём дальше. Вот Вы объявили переменную Point с этими чудовищными полями-массивами. Но где присвоение ей какого-то значения? Откуда основная программа узнает, что полями этой Вашей Point являются заданные константы-массивы? Нет уж, будьте любезны об этом позаботиться. Например, так:
Код:
Point.x:=x;
Point.y:=y;
Между прочим, одинаковое обозначение поля записи и константы-массива (х,у) - идея до крайности неудачная. Хоть формально и разрешено, но вместо ожидаемой наглядности вносит большую путаницу.
Поехали дальше.
Постановка операторных скобок begin..end внутри программы имеет смысл только тогда, когда ими выделяется тело какого-либо оператора. Выделение просто куска (блока) программы - бессмысленно. Поэтому "begin" после b:=true; и соответствующий ему "end" нужно убрать.
Далее. Ну зачем же при наличии точек вне первого квадранта выводить заголовок
'Координаты точек не попавших в первый квадрант: ' перед выводом координат КАЖДОЙ из этих точек?! Некрасиво. Кроме того, вывод самих координат следует, естественно, сделать форматным. Опять же для красоты.
Я тут нарисовал тестовый вариант без модуля (лень было с ним дрызгаться). Советую взять за основу.
Код:
Const
n=5;
Type
mass = array[1..n] of real;
Coord=Record
x,y:mass;
End;
Const
x:mass=(2, -3, 6, 7, 8);
y:mass=(0, 1, -2, 9, 3);
Var
i:byte;
b:boolean;
Point:Coord;
R:real;
Function First_Quadr(i:integer; z:Coord):boolean;
begin
if (z.x[i]>=0) and (z.y[i]>=0) then
First_Quadr:=true
else
First_Quadr:=false;
end;
Begin
Point.x:=x;
Point.y:=y;
R:=0;
b:=true;
for i:=1 to n do
if not First_Quadr(i, Point) then
begin
b:=false;
writeln('Point coordinates out of first quadrant: ');
end;
if not b then
begin
for i:=1 to n do
if not First_Quadr(i, Point) then
writeln('x = ',Point.x[i]:0:3,' y = ',Point.y[i]:0:3);
end
else
begin
for i:=1 to n do
if Sqrt(Sqr(Point.x[i])+Sqr(Point.y[i]))>R then
R:=Sqrt(Sqr(Point.x[i])+Sqr(Point.y[i]));
end;
if b then
begin
writeln('All points belong to first quadrant. ');
writeln('Rmax = ',R:0:3);
end;
Readln
End.