"+-" в функции для построения графика
Не получается сделать так чтобы ветви графика были не только в первой четверти но и в четвёртой.:confused:
Заранее огромное спасибо!:)
Вот сам текст:
program Prg_graf;
Uses crt,Graph;
var
xn,xk,x,y,Ymin,Ymax,dx,a,b,c:real;
MX,MY,i,n:word;
Gd,Gm:integer;
Function F(xf:real):real;
begin
f:=xf*sqr((a+xf)/(a-xf));
end;
Function Xe:word;
begin
Xe:=10+Round((MX-20)*(x-xn)/(xk-xn));
end;
Function Ye:word;
Begin
Ye:=MY-10-Round((MY-20)*(f(x)-Ymin)/(Ymax-Ymin));
end;
begin
Write('x the first='); Readln(xn);
Write('x the past='); Readln(xk);
Write('kolichestvo tochec graphika=');Readln(n);
a:=20;
dx:=(xk-xn)/(n-1);
x:=xn; Ymin:=f(xn); Ymax:=f(xn);
for i:=2 to n do
begin
x:=x+dx;
if f(x)<Ymax then Ymin:=f(x);
if f(x)>Ymax then Ymax:=f(x);
end;
Gd:=Detect;
Initgraph(Gd,Gm,'');
if GraphResult <> 0 then
begin
Writeln('Oshibka iniqialithaqii geaph regima');
Halt(1);
end;
MX:=GetMaxX; MY:=GetMaxY;
Rectangle(0,0,Mx,My);
Rectangle(10,10,Mx-10,My-10);
OutTextXY(270,2,'Graphic phynkqii');
x:=0; Line(Xe,MY-10,Xe,10);
OutTextXy(Xe-10,15,'Y');
y:=0; Line(10,MY-Ye,Mx-10,MY-Ye);
OutTextXy(Mx-10,MY-Ye+2,'X');
OutTextXy(Xe-10,MY-Ye+2,'0');
x:=xn; MoveTo(Xe,Ye);
for i:=2 to n do
begin
x:=x+dx; LineTo(Xe,Ye);
end;
Readln;
CloseGraph;
end.
2. прими центр за начало отсчета, координаты выставляй в соответствии.
3. проходишь по всем х и вычисляешь у, строишь.
4. делаешь тоже самое что и шагом выше только вычесленное значение у умножаешь на -1, строишь.
5. вроде все.
ты бы хотя бы само задание привел, так как оно дано было, чтоб легче разобраться было в том, что ты делаешь.
Что мне надо изменить в своей программе чтобы всё было ОК?:confused:
[highlight=pascal]
var
xn,xk,x,y,Ymin,Ymax,dx,a,b,c:real;
MX,MY,i,n:word;
Gd,Gm:integer;
Function F(xf:real):real;
begin
f:=xf*sqr((a+xf)/(a-xf));
end;
Function Xe:word;
begin
Xe:=10+Round((MX-20)*(x-xn)/(xk-xn));
end;
Function Ye(t:boolean):word;{изменено!}
Begin
if t then
Ye:=round(MY/2)-Round((MY/2-20)*(f(x)-Ymin)/(Ymax-Ymin))
else
Ye:=round(MY/2)+Round((MY/2-20)*(f(x)-Ymin)/(Ymax-Ymin));
end;
begin
Write('x the first='); Readln(xn);
Write('x the past='); Readln(xk);
Write('kolichestvo tochec graphika=');Readln(n);
a:=20;
dx:=(xk-xn)/(n-1);
x:=xn; Ymin:=f(xn); Ymax:=f(xn);
for i:=2 to n do
begin
x:=x+dx;
if f(x)<Ymax then Ymin:=f(x);
if f(x)>Ymax then Ymax:=f(x);
end;
Gd:=Detect;
Initgraph(Gd,Gm,'');
if GraphResult <> 0 then
begin
Writeln('Oshibka iniqialithaqii geaph regima');
readln;
Halt(1);
end;
MX:=GetMaxX; MY:=GetMaxY;
Rectangle(0,0,Mx,My);
Rectangle(10,10,Mx-10,My-10);
OutTextXY(270,2,'Graphic phynkqii');
x:=0; Line(Xe,MY-10,Xe,10);
OutTextXy(Xe-10,15,'Y');
y:=0; Line(10,MY-Ye(true),Mx-10,MY-Ye(true));
OutTextXy(Mx-10,MY-Ye(true)+2,'X');
OutTextXy(Xe-10,MY-Ye(true)+2,'0');
x:=xn; MoveTo(Xe,Ye(true));
for i:=2 to n do
begin
x:=x+dx; LineTo(Xe,Ye(true));
end;
x:=xn;{изменено!}
MoveTo(Xe,Ye(true));
for i:=2 to n do
begin
x:=x+dx; LineTo(Xe,Ye(false));
end;
Readln;
CloseGraph;
end.
[/highlight]
Хорошо на счёт оформления учту! Но в чём проблема подскажите?
неправильно выразился, дело в том, что я тебе ошибку исправил и выше приведенный код все что надо рисует. ты посмотри и сравни. дело было в том, что у тебя начало координат было в левом нижнем углу, поэтому даже если бы ты и рисовал, то ничего не увидел бы 4 четверть. вообщем смотри и разбирайся.
Появился следующий вопрос. Вставил код вывода графика в свою программу но во вкладке "таблица" повторяются только конечное и начальное значение X, а не каждого в отдельности.:(
В чём проблема?
Сам код:
Program Prog_proc;
Uses Crt, printer, Graph;
var
a, xn, xk, h,Ymin,Ymax,dx :real;
i, j, m, n,MX,MY : word;
x, y : real;
mnu : array [1..6] of string[10];
vv : char;
Gd,Gm:integer;
Function F(xf:real):real;
begin
f:=xf*sqr((a+xf)/(a-xf));
end;
Function Xe:word;
begin
Xe:=10+Round((MX-20)*(x-xn)/(xk-xn));
end;
Function Ye(t:boolean):word;
Begin
if t then
Ye:=round(MY/2)-Round((MY/2-20)*(f(x)-Ymin)/(Ymax-Ymin))
else
Ye:=round(MY/2)+Round((MY/2-20)*(f(x)-Ymin)/(Ymax-Ymin));
end;
Procedure my_mnu;
begin
Window (1, 1, 80, 1); TextColor(0); GoTOXY (1,1);
FOR i:=1 to 5 do
if i=m then
begin
TextBackground (2); Write (' ',mnu, ' ');
end
else
begin
TextBackground (7); Write (' ',mnu, ' ');
end;
Window (1, 2, 80, 25);
GoTOXY (1,1); TextColor(15); TextBackground (0);
end;
Procedure input_kl;
begin
ClrScr;
Write ('x nach= '); Readln(xn);
Write ('x kon= '); Readln(xk);
Write ('kol-vo tochek (n<50) = '); Readln(n);
m:=2; my_mnu
end;
Procedure calc_dat;
begin
a:=20;
dx:=(xk-xn)/(n-1);
x:=xn; Ymin:=f(xn); Ymax:=f(xn);
for i:=2 to n do
begin
x:=x+dx;
if f(x)<Ymax then Ymin:=f(x);
if f(x)>Ymax then Ymax:=f(x);
ClrScr; Write ('OK!')
end;
end;
Procedure out_dat;
begin
ClrScr;
Writeln('----------------------------------');
Writeln(' X Y ');
Writeln('----------------------------------');
for i:=1 to n do Writeln (x:15:5,y:15:5);
Writeln('----------------------------------');
end;
Procedure out_gr;
begin
Gd:=Detect;
Initgraph(Gd,Gm,'');
if GraphResult <> 0 then
begin
Writeln('Oshibka iniqialithaqii geaph regima');
Halt(1);
end;
MX:=GetMaxX; MY:=GetMaxY;
Rectangle(0,0,Mx,My);
Rectangle(10,10,Mx-10,My-10);
OutTextXY(270,2,'Graphic phynkqii');
x:=0; Line(Xe,MY-10,Xe,10);
OutTextXy(Xe-10,15,'Y');
y:=0; Line(10,MY-Ye(true),Mx-10,MY-Ye(true));
OutTextXy(Mx-10,MY-Ye(true)+2,'X');
OutTextXy(Xe-10,MY-Ye(true)+2,'0');
x:=xn;
MoveTo(Xe,Ye(true));
for i:=2 to n do
begin
x:=x+dx; LineTo(Xe,Ye(true));
end;
x:=xn;
MoveTo(Xe,Ye(true));
for i:=2 to n do
begin
x:=x+dx; LineTo(Xe,Ye(false));
end;
Readln;
CloseGraph;
end;
begin
TextBackground(0); ClrScr;
mnu[1]:='Data';
mnu[2]:='Raschet';
mnu[3]:='Tablica';
mnu[4]:='Grafik';
mnu[5]:='Exit';
m:=1;
my_mnu;
Repeat
vv:=Readkey;
if ord(vv)=0 then vv:=Readkey;
case ORD(VV) of
13:begin
case m of
1:input_kl;
2:calc_dat;
3:out_dat;
4:out_gr;
end;
end;
77:begin if m<5 then m:=m+1 else m:=1; my_mnu end;
75:begin if m>1 then m:=m-1 else m:=5; my_mnu end;
end;
until (vv=chr(13)) and (m=5);
end.
[highlight=pascal]
Procedure out_dat;
var
dx: real;
begin
ClrScr;
dx:=(xk-xn)/n;
Writeln('----------------------------------');
Writeln(' X Y ');
Writeln('----------------------------------');
for i:=0 to n do
Writeln ((xn+i*dx):15:5,f(xn+i*dx):15:5);
Writeln('----------------------------------');
end;
[/highlight]
Вот такой ещё вопрос. Надо чтобы программа выводила какое-нибудь сообщение, но информацию о цвете букв, фона, расположения надписи на экране брала из файла "privet.cfg", созданного ранее. У меня получается записать в файл данные, но не получается прочитать их от туда и вставить куда надо.
Сам код:
uses crt;
Var f1:text;
ch:real;
a:real;
Begin
Assign (f1, 'privet.cfg');
Rewrite(f1);
writeln(f1,'red');
close(f1);
Readln;
end.
[highlight=pascal]
var
f: text;
s: string;
{................}
assign(f, 'privet.cfg');{ассоциируем файл с переменной}
reset(f); {открываем файл для чтения}
readln(f, s); {считываем одну строку}
close(f); {закрываем файл}
[/highlight]
только для своего случая сам смотри, ты же будешь знать сколько строк считать и какая что означает.
А приведи пример чтобы сначала записать в файл слово "red", а потом считать его от туда и вывести на экран текст красного цвета.
http://forum.codenet.ru/showpost.php?p=244800&postcount=9 ты записываешь слово в файл, в моем сообщении http://forum.codenet.ru/showpost.php?p=244812&postcount=10 считывается слово. ты не знаешь как сделать так чтобы в зависимости от слова выставлялся цвет текста что ли? ну тут нет ничего страшного можно:
1) все провернуть с помощью if'ов;
2) всего 16 цветов, поэтому можно сделать константный массив строк 0..15 и искать в нем введенное слово, индекс по которому найдешь соответствие и есть номер цвета(имена цветов в массиве ты сам придумываешь)
3) опять же 16 цветов, если ты вдруг обзовешь цвета так, что у их названий будут разные первые буквы, то можно сделать константную строку и потом в ней искать первую букву считанного из файла слова, позиция вхождения и будет номером цвета, точнее номер цвета + 1.
а что его приводить? вон же в твоем сообщении
1) все провернуть с помощью if'ов;
2) всего 16 цветов, поэтому можно сделать константный массив строк 0..15 и искать в нем введенное слово, индекс по которому найдешь соответствие и есть номер цвета(имена цветов в массиве ты сам придумываешь)
3) опять же 16 цветов, если ты вдруг обзовешь цвета так, что у их названий будут разные первые буквы, то можно сделать константную строку и потом в ней искать первую букву считанного из файла слова, позиция вхождения и будет номером цвета, точнее номер цвета + 1.
Покажи как можно "1) все провернуть с помощью if'ов;"
Заранее огромное спасибо!
[highlight=pascal]
{устанавливаем цвет по умолчанию}
{начинаем проверять что же за цвет}
{в переменное s строкового типа считанная строка из файла с цветом}
if s = 'red' then {устанавливаем красный цвет};
if s = 'green' then {и т.д.};
{и еще 14 таких же конструкций}
[/highlight]
второй вариант схематично можно представить так:
[highlight=pascal]
const
sarr: array[0..15]of string = (здесь в кавычках цвета через запятую, лучше чтобы соответствовали номерам - точнее в этом и главный прикол);
{тут что-то делаешь}
{считываешь в s название цвета}
for i:=0 to 15 do
if sarr = s then
begin
{устанавливаешь цвет, номер цвета равен i}
break;
end;
[/highlight]
ну что типа такого.
uses crt;
Var f1:text;
ch:real;
a:real;
Begin
Assign (f1, 'privet.cfg');
Rewrite(f1);
writeln(f1,'red');
close(f1);
Readln;
end.
поэтому считываешь текст из файла, как считать я уже показывал, а потом сравниваешь (тоже показывал как) и выставляешь цвет текста с помощью TextColor, в качестве входного параметра указывая номер цвета как раз таки, например для любимого тобой красного этот номер будет 4.
Вот что у меня получилось:
Код:
uses crt;
Var f:text;
ch:real;
t,a,s:string;
Begin
Clrscr;
Assign (f, 'privet.cfg');
Rewrite(f);
writeln(f,'red');
writeln(f,'White');
writeln(f,'40');
reset(f);
readln(f,s);
readln(f,a);
readln(f,t);
close(f);
if s='red' then textcolor(red);
if a='White' then TextBackground(White);
if t='40' then ch:=40;
Write('Прива!':ch);
Readln;
end.
Var f:text;
ch:real;
t,a,s:string;
Begin
Clrscr;
Assign (f, 'privet.cfg');
Rewrite(f);
writeln(f,'red');
writeln(f,'White');
writeln(f,'40');
reset(f);
readln(f,s);
readln(f,a);
readln(f,t);
close(f);
if s='red' then textcolor(red);
if a='White' then TextBackground(White);
if t='40' then ch:=40;
Write('Прива!':ch);
Readln;
end.
а с отступами делай так:
[highlight=pascal]
function tabstr(n: word):string;
var
s: string;
i: word;
begin
s:='';
for i:=1 to n
s:=s+' ';
tabstr:=s;
end;
[/highlight]
функция вернет строку с отступом. соответственно в вызове writeln сначала напишешь её с величиной отступа, а потом + строка, которую нужно вывести.
Код:
uses crt;
Var f:text;
ch:real;
t,a,s:string;
function tabstr(n: word):string;
var
s: string;
i: word;
begin
s:='';
for i:=1 to n
s:=s+' ';
tabstr:=s;
end;
Begin
Clrscr;
Assign (f, 'privet.cfg');
Rewrite(f);
writeln(f,'red');
writeln(f,'White');
writeln(f,'40');
reset(f);
readln(f,s);
readln(f,a);
readln(f,t);
close(f);
if s='red' then textcolor(red);
if a='White' then TextBackground(White);
if t='40' then ch:=40;
Write('Прива!':ch);
Readln;
end.
Var f:text;
ch:real;
t,a,s:string;
function tabstr(n: word):string;
var
s: string;
i: word;
begin
s:='';
for i:=1 to n
s:=s+' ';
tabstr:=s;
end;
Begin
Clrscr;
Assign (f, 'privet.cfg');
Rewrite(f);
writeln(f,'red');
writeln(f,'White');
writeln(f,'40');
reset(f);
readln(f,s);
readln(f,a);
readln(f,t);
close(f);
if s='red' then textcolor(red);
if a='White' then TextBackground(White);
if t='40' then ch:=40;
Write('Прива!':ch);
Readln;
end.
[highlight=pascal]
uses crt;
Var f:text;
ch:real;
t,a,s:string;
function tabstr(n: word):string;
var
s: string;
i: word;
begin
s:='';
for i:=1 to n do
s:=s+' ';
tabstr:=s;
end;
Begin
Clrscr;
Assign (f, 'privet.cfg');
Rewrite(f);
writeln(f,'red');
writeln(f,'White');
writeln(f,'40');
reset(f);
readln(f,s);
readln(f,a);
readln(f,t);
close(f);
if s='red' then textcolor(red);
if a='White' then TextBackground(White);
if t='40' then ch:=40;
Write(tabstr(ch)+'Прива!');
Readln;
end.
[/highlight]
kosfiz [SIZE="4"][COLOR="Red"]Огромное Тебе спасибо! Респект и уважуха!!![/COLOR][/SIZE]:). Я РГР по информатике сделал и в Паскале немножко подразобрался.