Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.141.166.242] |
|
Сообщ.
#1
,
|
|
|
есть программа расчёта пересечения окружностей, помогли сделать чтение из файла, но как сделать запись в файл с начала?
пробовал сам сделать, но бред получается помогите пожалуйста сделать данную программу только начал изучать делфи unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) LabeledEdit1: TLabeledEdit; LabeledEdit2: TLabeledEdit; LabeledEdit3: TLabeledEdit; LabeledEdit4: TLabeledEdit; LabeledEdit5: TLabeledEdit; LabeledEdit6: TLabeledEdit; Button1: TButton; LabeledEdit7: TLabeledEdit; btn2: TButton; procedure Button1Click(Sender: TObject); procedure btn2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} // думал сделать так, добавить еще одну кнопку и сохранять данные, но абракадабра получается ( procedure TForm1.btn2Click(Sender: TObject); var x1,y1,r1,x2,y2,r2:integer; a:textfile; begin AssignFile(a,'Coord.txt');//файл в папке с программой Rewrite(a); Writeln (a,x1,y1,r1,x2,y2,r2); CloseFile(a); LabeledEdit1.Text:=IntToStr(x1); LabeledEdit2.Text:=IntToStr(y1); LabeledEdit3.Text:=IntToStr(r1); LabeledEdit4.Text:=IntToStr(x2); LabeledEdit5.Text:=IntToStr(y2); LabeledEdit6.Text:=IntToStr(r2); Append(a); Read(a); end; // программа чтения из файла к примеру 4 4 4 и в след строке 5 5 5 - работает procedure TForm1.Button1Click(Sender: TObject); const e=0.0001; var x1,y1,r1,x2,y2,r2:integer; x,y,a,b,h,d,x3,y3,x4,y4:real; f:textfile; begin AssignFile(f,'Coord.txt');//файл в папке с программой Reset(f); Read(f,x1,y1,r1,x2,y2,r2); CloseFile(f); LabeledEdit1.Text:=IntToStr(x1); LabeledEdit2.Text:=IntToStr(y1); LabeledEdit3.Text:=IntToStr(r1); LabeledEdit4.Text:=IntToStr(x2); LabeledEdit5.Text:=IntToStr(y2); LabeledEdit6.Text:=IntToStr(r2); Append(f); Writeln(f,''); if (abs(x1-x2)<e)and(abs(y1-y2)<e)and(abs(r1-r2)<e) then begin LabeledEdit7.Text:='Окружности совпадают'; Writeln(f,'Окружности совпадают'); end else begin d:=sqrt(sqr(x1-x2)+sqr(y1-y2)); if (d>r1+r2)or(d<abs(r1-r2)) then begin LabeledEdit7.Text:='Точек пересечения нет'; Writeln(f,'Точек пересечения нет'); end else if abs(d-(r1+r2))<0.000001 then begin x:=(x1+x2)/2; y:=(y1+y2)/2; LabeledEdit7.Text:='Окружности касаются в точке x=' +FloattostrF(x,ffFixed,6,2)+' y=' +FloattostrF(y,ffFixed,6,2); Writeln(f,'Окружности касаются в точке x=',x:0:2,' y=',y:0:2); end else begin b:=(sqr(r2)-sqr(r1)+sqr(d))/(2*d); a:=d-b; h:=sqrt(sqr(r2)-sqr(b)); x:=x1+(x2-x1)/(d/a); y:=y1+(y2-y1)/(d/a); x3:=x-(y-y2)*h/b; y3:=y+(x-x2)*h/b; x4:=x+(y-y2)*h/b; y4:=y-(x-x2)*h/b; LabeledEdit7.Text:='Точки пересечения x1=' +FloattostrF(x3,ffFixed,6,2)+' y1=' +FloattostrF(y3,ffFixed,6,2) +' x2='+FloattostrF(x4,ffFixed,6,2)+' y2=' +FloattostrF(y4,ffFixed,6,2); Writeln(f,'Точки пересечения x1=',x3:0:2,' y1=',y3:0:2,' x2=',x4:0:2,' y2=',y4:0:2); end; end; CloseFile(f); end; end. Прикреплённый файл______________________________________________1_______________.rar (7,33 Кбайт, скачиваний: 59) |
Сообщ.
#2
,
|
|
|
Наверное результаты расчёта можно вынести в какие-то глобальные переменные:
var Form1: TForm1; x3,y3, x4,y4:real; // результат! ... procedure TForm1.btn2Click(Sender: TObject); var a:textfile; begin AssignFile( a, 'Coord.txt');//файл в папке с программой Rewrite( a ); Writeln( a, x3,y3, x4,y4); CloseFile( a ); ... // программа чтения из файла к примеру 4 4 4 и в след строке 5 5 5 - работает procedure TForm1.Button1Click( Sender: TObject); const e=0.0001; var x1,y1,r1,x2,y2,r2 : integer; x,y,a,b,h,d : real; f:textfile; begin ... |
Сообщ.
#3
,
|
|
|
Цитата SENDEJ @ // думал сделать так, добавить еще одну кнопку и сохранять данные, но абракадабра получается ( Естественно, т.к. локальные переменные x1..r2 изначально содержат какой-то случайный мусор. Поэтому перед использованием их нужно обязательно инициализировать, т.е. присвоить какие-то конкретные значения. Если ты хочешь записать в файл значения, которые вводятся в LabeledEdit, то нужно перед записью в файл (лучше перед открытием файла) конвертировать эти значения в числа x1:=StrToInt(LabeledEdit1.Text) и т.д. PS: В принципе можно записывать в файл не числовые значения x1 и т.д., а непосредственно их строковые представления из LabeledEdit1 и т.д., но тогда, по хорошему, нужно будет добавить проверки, что во все LabeledEdit введены корректные числа. В случае же преобразования строк в числа через StrToInt, эти проверки выполняются автоматически, и в случае пустого или не числового значения будет выдана ошибка (исключение), и в файл ничего не запишется (если преобразования будут делаться до открытия файла). |
Сообщ.
#4
,
|
|
|
Цитата leo @ В случае же преобразования строк в числа через StrToInt, эти проверки выполняются автоматически, и в случае пустого или не числового значения будет выдана ошибка (исключение) тогда проще TryStrToInt использовать для проверки. чтобы не ловить исключения. |
Сообщ.
#5
,
|
|
|
Цитата SENDEJ @ помогите пожалуйста сделать данную программу То что вы пытаетесь сделать называется Logger Советую разбить процесс записи на следующие функции: 1. Открытие файла 2. Запись блока данных 3. Закрытие файла function logOpen(name:string) : textfile; var res:textfile; begin AssignFile(res,name);//файл в папке с программой Rewrite(res); result:=res; end; procedure logPut(log:TextFile; values:Integer...); // насчёт вариадиков в дельфи не уверен, но, полюбому, должна быть альтернатива var i:Integer; begin for i in values do begin WriteLn(a,IntToStr(i)); end; end; procedure logPut(log:textfile; value:string); begin WriteLn(a,value); end; procedure logClose(log:textfile); begin CloseFile(log); end; В общем случае, ваш код можно переписать как: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) LabeledEdit1: TLabeledEdit; LabeledEdit2: TLabeledEdit; LabeledEdit3: TLabeledEdit; LabeledEdit4: TLabeledEdit; LabeledEdit5: TLabeledEdit; LabeledEdit6: TLabeledEdit; Button1: TButton; LabeledEdit7: TLabeledEdit; btn2: TButton; procedure Button1Click(Sender: TObject); procedure btn2Click(Sender: TObject); procedure FormCreate(Sender: TObject); // <- добавляем метод создания формы procedure FormClose(Sender: TObject; var Action: TCloseAction); // <- добавляем метод закрытия формы private { Private declarations } public { Public declarations } end; const LOG_FILE: String = 'Coords.txt'; // файл-лог SAVED_FILE: String = 'Saved.txt'; // файл с голыми данными var Form1: TForm1; log:TextFile; implementation {$R *.dfm} function logOpen(name:String) : TextFile; var res:TextFile; begin AssignFile(res,name);//файл в папке с программой Rewrite(res); result:=res; end; procedure logPut(log:TextFile; values:Integer...); // насчёт вариадиков в дельфи не уверен, но, полюбому, должна быть альтернатива var i:Integer; begin for i in values do begin WriteLn(a,IntToStr(i)); end; end; procedure logPut(log:TextFile; value:String); begin WriteLn(a,value); end; procedure logClose(log:TextFile); begin CloseFile(log); end; procedure TForm1.FormCreate(Sender: TObject); // при создании формы открываем лог, тем самым, закрываем к нему доступ для других программ begin log:=logOpen(LOG_FILE); // запоминаем открытый лог в глобальную переменную end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin logClose(log); // закрываем файл и освобождаем открытый лог end; procedure TForm1.btn2Click(Sender: TObject); var x1,y1,r1,x2,y2,r2:Integer; f:TextFile; begin x1:=StrToInt(LabeledEdit1.Text); y1:=StrToInt(LabeledEdit2.Text); r1:=StrToInt(LabeledEdit3.Text); x2:=StrToInt(LabeledEdit4.Text); y2:=StrToInt(LabeledEdit5.Text); r2:=StrToInt(LabeledEdit6.Text); logPut(x1,y1,r1,x2,y2,r2); // записываем данные в лог AssignFile(f,SAVED_FILE); // сохраняем данные в файл с сохранениями ReWrite(f); Write(f,x1,y1,r1,x2,y2,r2); CloseFile(f); end // программа чтения из файла к примеру 4 4 4 и в след строке 5 5 5 - работает procedure TForm1.Button1Click(Sender: TObject); const e=0.0001; var x1,y1,r1,x2,y2,r2:Integer; x,y,a,b,h,d,x3,y3,x4,y4:real; f:TextFile; begin AssignFile(f,SAVED_FILE); Reset(f); Read(f,x1,y1,r1,x2,y2,r2); CloseFile(f); LabeledEdit1.Text:=IntToStr(x1); LabeledEdit2.Text:=IntToStr(y1); LabeledEdit3.Text:=IntToStr(r1); LabeledEdit4.Text:=IntToStr(x2); LabeledEdit5.Text:=IntToStr(y2); LabeledEdit6.Text:=IntToStr(r2); if (abs(x1-x2)<e)and(abs(y1-y2)<e)and(abs(r1-r2)<e) then begin LabeledEdit7.Text:='Окружности совпадают'; logPut('Окружности совпадают'); end else begin d:=sqrt(sqr(x1-x2)+sqr(y1-y2)); if (d>r1+r2)or(d<abs(r1-r2)) then begin LabeledEdit7.Text:='Точек пересечения нет'; logPut('Точек пересечения нет'); end else if abs(d-(r1+r2))<0.000001 then begin x:=(x1+x2)/2; y:=(y1+y2)/2; LabeledEdit7.Text:='Окружности касаются в точке x=' +FloattostrF(x,ffFixed,6,2)+' y=' +FloattostrF(y,ffFixed,6,2); logPut(LabeledEdit7.Text); end else begin b:=(sqr(r2)-sqr(r1)+sqr(d))/(2*d); a:=d-b; h:=sqrt(sqr(r2)-sqr(b)); x:=x1+(x2-x1)/(d/a); y:=y1+(y2-y1)/(d/a); x3:=x-(y-y2)*h/b; y3:=y+(x-x2)*h/b; x4:=x+(y-y2)*h/b; y4:=y-(x-x2)*h/b; LabeledEdit7.Text:='Точки пересечения x1=' +FloattostrF(x3,ffFixed,6,2)+' y1=' +FloattostrF(y3,ffFixed,6,2) +' x2='+FloattostrF(x4,ffFixed,6,2)+' y2=' +FloattostrF(y4,ffFixed,6,2); logPut(LabeledEdit7.Text); end; end; end; end. |
Сообщ.
#6
,
|
|
|
Цитата VisualProg @ Большое спасибо, Вы правы, подскажите пожалуйста по поводу формы, насколько я понял, добавляются еще 2 компонента на форму Delphi 7 - ругается на "function logOpen(name:String) : TextFile;" |
Сообщ.
#7
,
|
|
|
Цитата SENDEJ @ насколько я понял, добавляются еще 2 компонента на форму Нет. Это не компоненты. Это методы. Компонент всё тот же - TForm экземпляр которого вы используете под именем Form1. Переделал под Delphi7. Надеюсь, я правильно понял то что вы хотели... Прикреплённый файл______________________________________________2_.rar (172,46 Кбайт, скачиваний: 59) |
Сообщ.
#8
,
|
|
|
Цитата VisualProg @ да, именно это, большое спасибо |