• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Разработка многомодульной программы с использованием нескольких процедур

  • Автор темы Автор темы Madara
  • Дата начала Дата начала

Madara

Новые
Регистрация
29 Ноя 2013
Сообщения
50
Реакции
0
Баллы
0
Разработка многомодульной программы с использованием нескольких процедур

Доброго времени суток.
Прошу вас о помощи.

Разработать программу из двух модулей: Unit и Program.
Самостоятельно выделить в задаче процедуры и функции, разместив их в отдельном модуле (Unit) для использования в головном модуле (Program).
Если все заданные точки плоскости принадлежат первому квадранту, определить координаты точки, наиболее удаленной от начала координат, иначе определить координаты точек, не попавших в первый квадрант.

Впервые сталкиваюсь с такой программой, даже не знаю что такое квадрант. Не умею работать с модулем Unit. Есть схема-"подсказка", но мне она ничего не подсказывает tehno014
Почитав в интернете про это, я понял только то, что имя файла.pas должно соответствовать имени модуля Unit tehno015

Это моя последняя программа, завершающая курс информатики, прошу вас помочь мне в последний раз)
Заранее спасибо!
 

Вложения

  • Screenshot-6.webp
    Screenshot-6.webp
    3.6 KB · Просмотры: 170
Мать-перемать, трам-тарарам - язык какой?!!!!
(Не, ну сколько можно просить - ВСЕГДА указывать ЯП! Зла прям не хватает!).

А квадрант - это очень просто. Представьте себе бесконечную плоскость, в которой проведены горизонтальная (X) и вертикальная (Y) координатные прямые, обе идут от -∞ до +∞, разделяя плоскость на 4 квадранта, соприкасающихся углами при х=у=0. Стандартная нумерация квадрантов (идем против часовой стрелки):
Первый - правый верхний, x≥0; y≥0
Второй - левый верхний, x≤0; y≥0
Третий - левый нижний, x≤0; y≤0
Четвертый - правый нижний, x≥0; y≤0.
 
Ладно, вот. Если, конечно, устроит Паскаль. Правда, боюсь, смысл этой "схемы-подсказки" навсегда останется тайной ее составителя, я попроще сделал. И не вижу, куда бы тут впихнуть "много модулей" и даже "несколько процедур". ВАЖНО: модуль сохранить под именем My_Unit.pas (ну или под другим, но тогда, соответственно, меняйте и первую строку), программу называйте, как хотите.

Модуль:
Код:
Unit My_Unit;

Interface

Type
 Coord=Record
        x,y:Real;
       End;

Function First_Quadr(z:Coord):boolean;

Implementation

Function First_Quadr(z:Coord):boolean;
begin
 if (z.x>=0) and (z.y>=0) then First_Quadr:=true else First_Quadr:=false;
end;

end.
Программа:
Код:
Uses My_Unit;

Const
 N=40;
Var
 i:byte;
 b:boolean;
 Point:Coord;
 R:real;
Begin
 R:=0;
 Randomize;
 b:=true;
 for i:=1 to N do
  begin
   Point.x:=Random*10-0.12;
   Point.y:=Random*10-0.12;
   if not First_Quadr(Point) then
    begin
     b:=false;
     writeln('x = ',Point.x:6:3,'      y = ',Point.y:6:3);
    end
   else
    if Sqrt(Sqr(Point.x)+Sqr(Point.y))>R then
         R:=Sqrt(Sqr(Point.x)+Sqr(Point.y));
  end;
 if b then
  begin
   writeln('All points belong to first quadrant');
   writeln('Rmax = ',R:6:3);
  end;
 Readln
End.
 
Ой, прошу прощения, да паскаль, СПАСИБО БОЛЬШОЕ!=))
 
Прошу прощения, а как написать так, чтобы выводились координаты точек, не вошедших в квадрант примерно в таком виде:

Координаты точек не вошедших в квадрант:
(-1.00 ; -2.00) , (-2.00 ; 3.00)
или так как есть только без рандома, а через матрицу или 2 массива.
Как лучше прописывать? Двумя массивами (1-ый это Х, 2-ой это У) или матрицей 2хN ?
Не получается работать с таким типом.
 
Не получается работать с таким типом.
Что именно "не получается"? Извините, но - не верю! С типом "запись" должен уметь работать даже грёбанный АВС. Скажите уж честно - лень с записями разбираться...
Прошу прощения, а как написать так, чтобы выводились координаты точек, не вошедших в квадрант примерно в таком виде: Координаты точек не вошедших в квадрант: (-1.00 ; -2.00) , (-2.00 ; 3.00)
Попробуйте справиться самостоятельно. Изменить формат вывода - это вообще детский сад.
Как лучше прописывать? Двумя массивами (1-ый это Х, 2-ой это У) или матрицей 2хN ?
Как Вам удобнее. По мне - лучше как у меня, через запись. А если нет, то на то Вы и программист, чтобы самому решать такие вещи.
 
Я с ума сойду tehno035, не получается вообще. Помогите мне :kapitul:

Не могу я написать так чтобы выводились координаты всех не вошедших после того как все точки введены. Получается либо сразу после ввода 1 точки, или выводит только последнюю точку если она не вошла....


Вот так мне кажется больше похоже на то что надо, но не работает, не знаю как правильно написать.
PHP:
Unit My_Unit;

Interface

Const n=5;
Type
 mass = array[1..n] of real;
 Coord=Record
        x,y:mass;
       End;

Function First_Quadr(i:integer; z:Coord):boolean;

Implementation

Function First_Quadr(i:integer; z:Coord):boolean;
begin
for i:=1 to n do
 if (z.x[i]>=0) and (z.y[i]>=0) then
   First_Quadr:=true
     else
        First_Quadr:=false;
end;
end.

PHP:
Uses My_Unit;

Var
 i:byte;
 b:boolean;
 Point:Coord;
 R:real;
 
 Const
x: mass = (2, -3, 6, 7, 8);
y: mass = (0, 1, -2, 9, 3);


Begin
 R:=0;
 b:=true;
  begin
   for i:=1 to n do
      if not First_Quadr(i, Point) then
    begin
     b:=false;
     writeln('Координаты точек не попавших в первый квадрант: ');
     writeln('x = ',Point.x[i],'      y = ',Point.y[i]);
    end
   else
    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('Все точки принадлежат первому квадранту ');
   writeln('Rmax = ',R:0:3);
  end;
End.
 
Я с Вами тоже.

offtopic.gifЗнаете, был такой анекдот:
- Подсудимый, ваше последнее слово!
- Ну вы, блин, даёте...

Ведь вот дана была хорошая, отлаженная программка - нет, хочу по-своему! Прекрасно. Вообще-то заслуживает всяческого уважения, куда большего, чем "ничего не знаю, дайте - я скатаю". Но всё-таки надо же представлять себе смысл простейших операторов языка!
Вот вы решили вместо массива записей (как у меня), каждая из которых содержит полную информацию о координатах одной точки, сделать единую запись с полями-массивами. Чудесно (хотя, по-моему, это доставание правого уха через-под левое колено, поскольку смысла в такой записи при наличии массивов координат - ровно ноль, ну да Вам виднее - можно и так). И что Вы делаете дальше? Вместо того, чтобы проверять истинность утверждения о том, что конкретная точка сидит в первом квадранте, Вы в функцию 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.
 
Спасибо большое=)

PHP:
Unit My_Unit;

Interface

Const
 n=5;

Type
 mass = array[1..n] of real;
 Coord=Record
        x,y:mass;
       End;

Function First_Quadr(i:integer; z:Coord):boolean;

Implementation

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;
end.

PHP:
Uses My_Unit;

Const
 x:mass=(2, -3, 6, 7, 8);
 y:mass=(0,  1, -2,9, 3);

Var
 i:byte;
 b:boolean;
 Point:Coord;
 R:real;

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;
   end;
 if not b then
  begin
  writeln('Координаты точек, не попавших в 1 квадрант: ');
   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('Все точки принадлежат 1 квадранту. ');
   writeln('Rmax = ',R:0:3);
  end;
End.
 
Назад
Сверху