Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 21.05.2014, 15:53   #1 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Разработка многомодульной программы с использованием нескольких процедур

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

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

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

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

Старый 21.05.2014, 15:53
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Наверное проблема уже решена в похожих темах

Нужно сделать в Pascal с использованием функций и процедур
Разработка программы с использованием процедур и функций
Из данной программы сделать программу с использованием процедур и функций

Старый 21.05.2014, 16:23   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

А квадрант - это очень просто. Представьте себе бесконечную плоскость, в которой проведены горизонтальная (X) и вертикальная (Y) координатные прямые, обе идут от -∞ до +∞, разделяя плоскость на 4 квадранта, соприкасающихся углами при х=у=0. Стандартная нумерация квадрантов (идем против часовой стрелки):
Первый - правый верхний, x≥0; y≥0
Второй - левый верхний, x≤0; y≥0
Третий - левый нижний, x≤0; y≤0
Четвертый - правый нижний, x≥0; y≤0.
Vladimir_S вне форума   Ответить с цитированием
Старый 21.05.2014, 17:04   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ладно, вот. Если, конечно, устроит Паскаль. Правда, боюсь, смысл этой "схемы-подсказки" навсегда останется тайной ее составителя, я попроще сделал. И не вижу, куда бы тут впихнуть "много модулей" и даже "несколько процедур". ВАЖНО: модуль сохранить под именем 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.
Vladimir_S вне форума   Ответить с цитированием
Старый 22.05.2014, 00:32   #4 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Ой, прошу прощения, да паскаль, СПАСИБО БОЛЬШОЕ!=))
Madara вне форума   Ответить с цитированием
Старый 24.05.2014, 15:00   #5 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Прошу прощения, а как написать так, чтобы выводились координаты точек, не вошедших в квадрант примерно в таком виде:

Координаты точек не вошедших в квадрант:
(-1.00 ; -2.00) , (-2.00 ; 3.00)
или так как есть только без рандома, а через матрицу или 2 массива.
Как лучше прописывать? Двумя массивами (1-ый это Х, 2-ой это У) или матрицей 2хN ?
Не получается работать с таким типом.
Madara вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 24.05.2014, 15:41   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Madara Посмотреть сообщение
Не получается работать с таким типом.
Что именно "не получается"? Извините, но - не верю! С типом "запись" должен уметь работать даже грёбанный АВС. Скажите уж честно - лень с записями разбираться...
Цитата:
Сообщение от Madara Посмотреть сообщение
Прошу прощения, а как написать так, чтобы выводились координаты точек, не вошедших в квадрант примерно в таком виде: Координаты точек не вошедших в квадрант: (-1.00 ; -2.00) , (-2.00 ; 3.00)
Попробуйте справиться самостоятельно. Изменить формат вывода - это вообще детский сад.
Цитата:
Сообщение от Madara Посмотреть сообщение
Как лучше прописывать? Двумя массивами (1-ый это Х, 2-ой это У) или матрицей 2хN ?
Как Вам удобнее. По мне - лучше как у меня, через запись. А если нет, то на то Вы и программист, чтобы самому решать такие вещи.
Vladimir_S вне форума   Ответить с цитированием
Старый 04.06.2014, 00:41   #7 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Я с ума сойду , не получается вообще. Помогите мне

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


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

Interface

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

Function 
First_Quadr(i:integerz:Coord):boolean;

Implementation

Function First_Quadr(i:integerz:Coord):boolean;
begin
for i:=1 to n do
 if (
z.x[i]>=0) and (z.y[i]>=0then
   First_Quadr
:=true
     
else
        
First_Quadr:=false;
end;
end
PHP код:
Uses My_Unit;

Var
 
i:byte;
 
b:boolean;
 
Point:Coord;
 
R:real;
 
 Const
xmass = (2, -3678);
ymass = (01, -293);


Begin
 R
:=0;
 
b:=true;
  
begin
   
for i:=1 to n do
      if 
not First_Quadr(iPointthen
    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
Madara вне форума   Ответить с цитированием
Старый 04.06.2014, 09:48   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Madara Посмотреть сообщение
Я с ума сойду
Я с Вами тоже.

Название: offtopic.gif
Просмотров: 185

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

Ведь вот дана была хорошая, отлаженная программка - нет, хочу по-своему! Прекрасно. Вообще-то заслуживает всяческого уважения, куда большего, чем "ничего не знаю, дайте - я скатаю". Но всё-таки надо же представлять себе смысл простейших операторов языка!
Вот вы решили вместо массива записей (как у меня), каждая из которых содержит полную информацию о координатах одной точки, сделать единую запись с полями-массивами. Чудесно (хотя, по-моему, это доставание правого уха через-под левое колено, поскольку смысла в такой записи при наличии массивов координат - ровно ноль, ну да Вам виднее - можно и так). И что Вы делаете дальше? Вместо того, чтобы проверять истинность утверждения о том, что конкретная точка сидит в первом квадранте, Вы в функцию 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.
Vladimir_S вне форума   Ответить с цитированием
Старый 04.06.2014, 11:35   #9 (permalink)
Madara
Member
 
Регистрация: 29.11.2013
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо большое=)

PHP код:
Unit My_Unit;

Interface

Const
 
n=5;

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

Function 
First_Quadr(i:integerz:Coord):boolean;

Implementation

Function First_Quadr(i:integerz:Coord):boolean;
begin
 
if (z.x[i]>=0) and (z.y[i]>=0then
  First_Quadr
:=true
 
else
  
First_Quadr:=false;
end;
end
PHP код:
Uses My_Unit;

Const
 
x:mass=(2, -3678);
 
y:mass=(0,  1, -2,93);

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(iPointthen
   begin
    b
:=false;
   
end;
 if 
not b then
  begin
  writeln
('Координаты точек, не попавших в 1 квадрант: ');
   for 
i:=1 to n do
    if 
not First_Quadr(iPointthen
      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
Madara вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 16:01.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.