Консультация № 176011
13.01.2010, 03:01
0.00 руб.
0 16 1
Здравствуйте уважаемые эксперты, подскажите пожалуйста ошибку в программе, программа должна выводить график, а она выдает ошитбку при компиляции что невозможно обнаружить модуль graph

Приложение:
uses crt,graph;
function F1(x:real):real;
begin
F1:=cos(x)/sin(x);{левая часть}
end;
function F2(x:real):real;
begin
F2:=1/x-x/2;{правая часть}
end;
function F(x:real):real;
begin
F:=F1(x)-F2(x);{исследуемая функция}
end;
{процедура уточнения корня на интервале мотодом половинного деления - бисекции}
procedure Bisec(a,b,e:real;var x:real);
var c:real;
begin
if F(a)*F(b)<0 then
begin
repeat
c:=(a+b)/2;
if F(a)*F(c)<=0 then b:=c
else a:=c;
until b-a<e;
x:=(a+b)/2;
end
else x:=a-1;
end;
var a,b,x,e:real;{границы интервала, значение корня, точность}
k:array[1..20] of real;{массив корней}
n,i:integer;{количество корней, счетчик циклов}
gd,gm,x0,y0,xi,y1,y2:integer;{переменные для работы в граф. режиме}
mx,my:real;{массшатабы для перевода реальных координат в экранные}
s:string[10];{строка для перевода чисел в текст для вывода на экран в граф. режиме}
begin
clrscr;
writeln('F(x)=ctg(x)-1/x+x/2');
e:=0.00001;n:=0;
a:=0.5;b:=pi-e;{период функции ctg=pi}
while b<=20 do
begin
Bisec(a,b,e,x);{вычисляем корень на отрезке}
n:=n+1; {считаем}
k[n]:=x;{пишем в массив}
a:=a+pi;{переходим в новый отрезок}
b:=b+pi;
end;
writeln('Корни уравнения не интервале 0.5 20:');
for i:=1 to n do
writeln('x',i,'=',k[i]:9:6);
write('Press Enter...');
readln;
gd:=0;
initgraph(gd,gm,'');{переходим в графический режим}
x0:=30;y0:=getmaxY div 2;{начало координат}
mx:=(getmaxX-15-x0)/20;
my:=(getmaxY-20)/(2*abs(F2(20)));{массштабы = размеры экрана по осям/максимальные значения}
{ось Х}
line(x0,y0,getmaxX,y0);
outtextXY(getmaxX-10,y0-15,'X');
for i:=1 to 21 do
begin
line(x0+round((i-1)*mx),y0-3,x0+round((i-1)*mx),y0+3);
str(i-1,s);
outtextXY(x0+round((i-1)*mx),y0+10,s);
end;
{ось У}
line(x0,5,x0,getmaxY-5);
outtextXY(x0-20,5,'Y');
for i:=1 to round(abs(F2(20))) do
begin
line(x0+3,y0-round(i*my),x0-3,y0-round(i*my));
str(i,s);
outtextXY(x0-10,y0-round(i*my),s);
line(x0+3,y0+round(i*my),x0-3,y0+round(i*my));
str(i,s);
outtextXY(x0-20,y0+round(i*my),'-'+s);
end;
{подписи значений корней}
settextstyle(0,1,1);
setcolor(11);
for i:=1 to n do
begin
insert('.',s,length(s)-5);
str(k[i]:8:6,s);
outtextXY(x0+round(k[i]*mx),y0-80,s);
setlinestyle(0,1,3);
circle(x0+round(k[i]*mx),y0,1);
end;
{построение графика}
x:=0.5;
while x<=20 do
begin
xi:=x0+round(x*mx);
if sin(x)<>0 then
begin
y1:=y0-round(F1(x)*my);
putpixel(xi,y1,12);
end;
y2:=y0-round(F2(x)*my);
putpixel(xi,y2,10);
x:=x+0.01;
end;
readln
end.

Обсуждение

Неизвестный
13.01.2010, 03:21
общий
Кирилл Васильевич:
Чтобы не ругался на Graph просто скопируйте его из папки BGI в папку BIN тогда программа запустится, но график она не выводит заканчивается примерно на середине программы.
Неизвестный
13.01.2010, 07:38
общий
это ответ
Здравствуйте, Кирилл Васильевич!
Проверьте наличее файла Graph.tpu в папке UNITS. Проверьте, что Options -> Directories -> Unit Directories указывает на каталог с TPU - файлами (если CRT он находит, то это так). Самый простой, но не самый лучший вариант - положить Graph.tpu в папку с исходными файлами.
давно
Профессионал
304622
583
13.01.2010, 09:27
общий
Sky-er:
Там проблема не с инициализацией графического режима, а с обнаружением самого модуля при компиляции. Это решается настройками IDE.
Неизвестный
13.01.2010, 11:09
общий
Сергей Бендер:
Ну и ответ! Не надо так больше
Неизвестный
13.01.2010, 11:09
общий
Sky-er:
Вы не нашли причину? Если "да", то напишите в ответах
давно
Профессионал
304622
583
13.01.2010, 12:27
общий
Boriss:
Цитата: 422
Ну и ответ! Не надо так больше


?! В каком смысле? Я не давал ответа. Просто написал Sky-er'у, что его примечание несколько не к месту.

А ответ дан Иваном Колесниковым -- на мой взгляд достаточен.
Неизвестный
13.01.2010, 13:05
общий
Сергей Бендер:
Вы обнаружил ошибку, напишите в чём дело. Иван Колесников не проверял программу
Неизвестный
13.01.2010, 14:09
общий
Boriss:
Цитата: Boriss
Вы не нашли причину? Если "да", то напишите в ответах

Вы знаете я посоветовал как сделать, чтобы программа не ругалась на модуль Graph, запустил программу, но в 4 утра как то не смог нормально посмотреть код программы поэтому и написал в мини-форуме. А так на поставленный вопрос я ответил.
давно
Старший Модератор
31795
6196
13.01.2010, 14:24
общий
Boriss:
Программа рабочая.
У меня модули bgi и tpu находятся в папке с программой.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Профессионал
304622
583
13.01.2010, 14:40
общий
Boriss:
Извините, но или вы неправильно меня поняли, или вы неясно выражаетесь, или уж я не знаю в чём дело.
1) С ответом № 258585, данным Иваном Колесниковым, я согласен. Нет возражений. Мне незачем писать какой-то другой ответ.
2) В мини-форуме Sky-er написал замечание, с которым я не согласился. Вот и всё.
давно
Профессионал
304622
583
13.01.2010, 14:54
общий
Sky-er:
В папке BGI хранятся драйверы видеоадаптера. Их программа ищет уже при выполнении, в команде initgraph. Их необнаружение приводит к Runtime Error, но не к ошибке компиляции.

А в задаче говорится, что программа не компилируется. Это проблема с поиском и подключением модуля.
Неизвестный
13.01.2010, 20:07
общий
Спасибо, я сделал так: Чтобы не ругался на Graph просто скопируйте его из папки BGI в папку BIN тогда программа запустится, но график она не выводит заканчивается примерно на середине программы.
Но теперь возникла еще одна проблема: при компиляции выходит сообщение что Invalid filename

программа запускается в пустой папке, где кроме *.pas , файлов нет...не подскажете в чем может быть проблема?
давно
Старший Модератор
31795
6196
13.01.2010, 20:33
общий
Кирилл Васильевич:
Распакуйте архив GRAPH.zip в папку с программой.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Профессионал
304622
583
14.01.2010, 10:20
общий
Зенченко Константин Николаевич:
Цитата: Зенченко Константин Николаевич
У меня модули bgi и tpu находятся в папке с программой


Это, конечно, вариант решения. Но, по моему частному мнению, нелучший. Это ж значит, что надо их копировать во все папки где лежат программы. Или все программы складывать в одну папку -- вообще моветон. Кроме того, это значит, что в состав модулей уже никаких изменений заведомо вноситься не будет (хотя RTL такую возможность даёт). В общем, Паскаль заведомо не используется для серьёзной работы. Я понимаю, что это так и есть, но как-то всё равно ...
давно
Старший Модератор
31795
6196
14.01.2010, 11:03
общий
Сергей Бендер:
Смотрим код программы.
initgraph(gd,gm,'');{переходим в графический режим}

Последний параметр - пустая строка, а это значит, что графический драйвер находится в папке вместе с программой.

Есть ещё вариант. Декомпилировать файл драйвера с помощью BINOBJ и потом его скомпилировать вместе с программой как подключаемый модуль.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Профессионал
304622
583
27.01.2010, 18:02
общий
Зенченко Константин Николаевич:
Только сейчас обнаружил ваше сообщение (уведомление куда-то затерлось, наверно).

Цитата: Зенченко Константин Николаевич
Смотрим код программы.
© Цитата:
initgraph(gd,gm,'');{переходим в графический режим}

Последний параметр - пустая строка, а это значит, что графический драйвер находится в папке вместе с программой.


Ну, для графического драйвера это ещё нормально. Тем более, что нужен-то реально только один драйвер. Более того, Егавгу-бги надо к экзешнику прикладывать, аще вдруг напишешь что-то для общего пользования. Либо через BINOBJ включать -- совершенно справедливо.

Но вот про модули -- извините, уже другая песня. Тут я остаюсь при том же мнении. Они-то прописываются не в программе, а в IDE. А своё рабочее место надо хорошо (и правильно) обустраивать. Вот как я думаю.
Форма ответа