Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Itachi261092
Веб-Разработчик
79 / 79 / 9
Регистрация: 23.01.2012
Сообщений: 696
1

Исправить ошибки простой программы

23.01.2012, 16:44. Просмотров 598. Ответов 7
Метки нет (Все метки)

В общем проблема в следующем. Задали написать простенькую программку на делфи. но я его не учил совсем. только паскаль знаю средненько. И не могу справиться с этим заданием. Первоначальная задача была "составить программу которая будет расчитывать дробную часть площади треугольника по координатам трёх его вершин. координаты нужно вводить в одно текстовое поле через пробелы" теоретически исполнение мне понятно - забить строковую переменную и анализировать её в цикле и при нахождении пробела записывать элементы строки находящиеся между двумя соседними пробелами в 1 переменную. потом вставить в формулу найденные переменные и дело в шляпе... мне казалось всё просто... написал:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    CheckBox1: TCheckBox;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  x1,y1,x2,y2,x3,y3,x,z:real;
  A,B,C,H:String;
  B1,C1,H1:array of char;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
Var i,k,g1,g2,q,n:integer;
    l:char;
begin
 A:=Edit1.Text;
 {B:=Edit1.Text;}
 g1:=0;
 q:=0;
 For i:=1 to (Length(A)) do
      begin
 g2:=i;
 if A[i]=#32 then begin
                       for k:=1 to g2 do begin
                                        l:=A[(g1+k)];
                                        B[k]:=l;
                                        label1.Caption:=b;
                                         end;
 
                       g1:=i;
                       q:=q+1;
                     end;
 if q=1 then x1:=StrToFloat(B);
 if q=2 then y1:=StrToFloat(B);
 if q=3 then x2:=StrToFloat(B);
 if q=4 then y2:=StrToFloat(B);
 if q=5 then x3:=StrToFloat(B);
 if q=6 then y3:=StrToFloat(B);
      end;
 x:=((((x1-x2)*(y1-y3))-((x1-x3)*(y1-y2)))/2);
 C:=FloatToStr(x);
 H:=FloatToStr(x);
 n:=0;
 For i:=1 to (Length(C)) do
  If C[i]=#44 then n:=i;
 If n<>0 then For i:=1 to (Length(C)) do H[i]:=C[(n+i-1)] else z:=0;
 If z<>0 then z:=StrToInt(H);
 If CheckBox1.Checked=True then Label2.Caption:=B;
 If CheckBox1.Checked=False then Label2.Caption:=H;
end;
 
end.
знаю, написано по идиотски. но обидно другое. текст компилируется нормально и запускается тоже... но при попытке расчёта вылетает ошибка:

--------------------------------------
забил... попытался сделать совсем через жопу. с 6ю текстовыми полями. и тут возникла другая проблема - не могу составить нужную формулу(
может быть кто то поможет мне? желательно с первым вариантом но можно и со вторым. вот текст:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Button1: TButton;
    Button2: TButton;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  x1,x2,x3,y1,y2,y3,z:real;
  p1,p2,p3,p4,p5,p6:string;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var l1,l2,l3,p,p0:real;
begin
p1:=Edit1.Text;
x1:=StrToFloat(p1);
p2:=Edit2.Text;
y1:=StrToFloat(p2);
p3:=Edit3.Text;
x2:=StrToFloat(p3);
p4:=Edit4.Text;
y2:=StrToFloat(p4);
p5:=Edit5.Text;
x3:=StrToFloat(p5);
p6:=Edit6.Text;
y3:=StrToFloat(p6);
Label7.Caption:=FloatToStr(x1);
Label8.Caption:=FloatToStr(y1);
Label9.Caption:=FloatToStr(x2);
Label10.Caption:=FloatToStr(y2);
Label11.Caption:=FloatToStr(x3);
Label12.Caption:=FloatToStr(y3);
//расчёт площади
l1:= sqrt(sqr(x2-x1)+sqr(y2-y2));
l2:= sqrt(sqr(x3-x2)+sqr(y3-y2));
l3:= sqrt(sqr(x3-x1)+sqr(y3-y1));//длины сторон
p0:=l1+l2+l3;//периметр
p:=p0/2;//полупериметр для формулы Герона
z:=sqrt(p*(p-l1)*(p-l2)*(p-l3));//площадь
Label6.Caption:=FloatToStr(z);
end;
 
end.
тут 7-12 лейблы стоят для проверки переменных, как они считываются
 Комментарий модератора 
Теги кода исправлены модератором. Для оформления кода Delphi следует выделить этот код и на панели редактирования сообщения нажать кнопку: "DELPHI".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2012, 16:44
Ответы с готовыми решениями:

Исправить ошибки при запуске программы
Не могу ни как запустить программу, ошибки. Посмотрите пожалуйста

2 ошибки в простой программе. Сам не могу найти.
вобщем вот) procedure TForm1.Button1Click(Sender: TObject); begin...

Исправить ошибки
Добрый вечер. Очень нужна помощь, помогите, пожалуйста, довести приложение до...

Исправить ошибки
unit Unit1; interface uses Windows, Messages, SysUtils, Variants,...

Исправить ошибки в коде
Не хочет создавать программу Помогите

7
REALIST07
Автор FAQ
Автор FAQ
182 / 182 / 20
Регистрация: 11.06.2010
Сообщений: 949
23.01.2012, 16:47 2
Прикрепи свою программу сюда и посмотрим что там у тебя,а то тут код анреал
1
Itachi261092
Веб-Разработчик
79 / 79 / 9
Регистрация: 23.01.2012
Сообщений: 696
23.01.2012, 17:23  [ТС] 3
вот 1й вариант. второй пока не буду выкладывать
0
Вложения
Тип файла: rar Lab2.rar (166.3 Кб, 7 просмотров)
unick12345
1751 / 1090 / 168
Регистрация: 27.03.2009
Сообщений: 4,142
23.01.2012, 17:54 4
не знаю что именно ты хотел тут замутить, но примерно так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure TForm1.Button1Click(Sender: TObject);
Var i,k,g1,q,n:integer;
begin
 A:=Edit1.Text;
 {B:=Edit1.Text;}
 g1:=1;
 q:=0;
 label1.Caption:='';
 For i:=1 to (Length(A)) do
      begin
 if A[i]=#32 then begin
 b:='';
                       for k:=g1 to i-1 do
                       B:=B+A[k];
                       label1.Caption:=label1.Caption+' '+b;
                       g1:=i+1;
                       inc(q);
                     end;
 if q=1 then x1:=StrToFloat(B);
 if q=2 then y1:=StrToFloat(B);
 if q=3 then x2:=StrToFloat(B);
 if q=4 then y2:=StrToFloat(B);
 if q=5 then x3:=StrToFloat(B);
 if q=6 then y3:=StrToFloat(B);
      end;
 x:=((((x1-x2)*(y1-y3))-((x1-x3)*(y1-y2)))/2);
 C:=FloatToStr(x);
 H:=FloatToStr(x);
 n:=0;
 For i:=1 to (Length(C)) do
  If C[i]=#44 then n:=i;
 If n<>0 then For i:=1 to (Length(C)) do H[i]:=C[(n+i-1)] else z:=0;
 If z<>0 then z:=StrToInt(H);
 If CheckBox1.Checked=True then Label2.Caption:=B
 else Label2.Caption:=H;
end;
1
Itachi261092
Веб-Разработчик
79 / 79 / 9
Регистрация: 23.01.2012
Сообщений: 696
23.01.2012, 18:33  [ТС] 5
unick12345, спасибо чувак! не полностью но помог! обалденно. я не очень понял зачем в лэйбл пробел но оно работает... хотя и не правильно считает. но это наверное у меня с формулой что то не так. может ещё посмотришь? я могу весь СВОЙ код пояснить

Код
procedure TForm1.Button1Click(Sender: TObject);
Var i,k,g1,q,n:integer;
begin
 A:=Edit1.Text;//переменной присваиваем текст из поля
 {B:=Edit1.Text;}
 g1:=1; //вспомогательная переменная
 q:=0; //вспомогательная
 label1.Caption:='';
 For i:=1 to (Length(A)) do
      begin
 if A[i]=#32 then begin //если встретили пробел, заносим найденные до этого значения...
 b:='';
                       for k:=g1 to i-1 do
                       B:=B+A[k];//... в строковую переменную БЭ
                       label1.Caption:=label1.Caption+' '+b;//не вижу смысла это писать
                       g1:=i+1; //плюсуем счётчик для следующего расчёта
                       inc(q); //это Вы мне поставили( не знаю что это
                     end;
 if q=1 then x1:=StrToFloat(B);
 if q=2 then y1:=StrToFloat(B);
 if q=3 then x2:=StrToFloat(B);
 if q=4 then y2:=StrToFloat(B);
 if q=5 then x3:=StrToFloat(B);
 if q=6 then y3:=StrToFloat(B); //по "флагу" присваиваем переменным значения из строки преобразуя строку в real 
      end;
 x:=((((x1-x2)*(y1-y3))-((x1-x3)*(y1-y2)))/2);//эта формула по идее должна высчитывать то что мне нужно но видимо работает не правильно(
 {C:=FloatToStr(x);
 H:=FloatToStr(x);
 n:=0;
 For i:=1 to (Length(C)) do
  If C[i]=#44 then n:=i;
 If n<>0 then For i:=1 to (Length(C)) do H[i]:=C[(n+i-1)] else z:=0;
 If z<>0 then z:=StrToInt(H);
 If CheckBox1.Checked=True then Label2.Caption:=B
 else Label2.Caption:=H;}//с этим я сам разберусь. это можно убрать
 Label2.Caption:=FloatToStr(x);//вывод результата. если вводить в строку "10 9 21 39 29 12" то результатом должно быть "268,5"
end;
вот как то так(((
вот ТУТ указана формула для расчёта площади треугольника по координатам его вершин. она та мне и нужна. но я видимо неправильно её запрограммировал(
0
Itachi261092
Веб-Разработчик
79 / 79 / 9
Регистрация: 23.01.2012
Сообщений: 696
23.01.2012, 19:28  [ТС] 6
ВСЕМ СПАСИБО! дальше сам закончил. вроде всё работает как надо. формула оказалась рабочей!) всем респект паСаны =)
0
Itachi261092
Веб-Разработчик
79 / 79 / 9
Регистрация: 23.01.2012
Сообщений: 696
23.01.2012, 20:49  [ТС] 7
люди кому не сложно потестируйте программку. может ошибки найдёте.
суть: в текстовое поле вводите последовательно через пробел 6 координат. это точки вершин треугольника.
при нажатии кнопки считать в окне результат программа должна выдавать площадь треугольника расчитываемую по формуле:

x:=((((x1-x2)*(y1-y3))-((x1-x3)*(y1-y2)))/2);

где х1,у1,х2,у2,х3,у3 - координаты введённые в текстовое поле.
По идее программа должна работать с отрицательными и дробными числами (разделителем дробного числа должна быть запятая)

и результатом может быть либо полное число (площадь) либо его дробная часть при активном флажке (внизу слева) при смене флажка кнопку считать нужно нажать снова.

в правильности формулы я не очень уверен но программа вроде работает.

если вдруг что то не так, сообщите или если сможете, помогите исправить недочёты =)

кому интересно вот код:
Код
var
  Form1: TForm1;
  x1,y1,x2,y2,x3,y3,x,z:real;
  A,B,C,H:String;
  u:integer; //переменные

implementation

{$R *.dfm} //эт я не знаю

procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end; //кнопка выход

procedure TForm1.Button1Click(Sender: TObject);
Var i,k,g1,q,n:integer;
begin
 A:=Edit1.Text; //присваиваем строковой переменной А текст вводимый в текстовое поле 
 g1:=1;
 q:=0; //вспомогательные переменные
 A:=A+' '; //добавляем в конец строки пробел - так нужно для правильной работы захвата переменных
 For i:=1 to (Length(A)) do //цикл перебирает элементы строки А
      begin
 if A[i]=#32 then begin //когда находим пробел...
 b:='';
                       for k:=g1 to i-1 do//..открываем новый цикл
                       B:=B+A[k]; // и присваиваем строке БЭ символы до пробела  
                       g1:=i+1; 
                       inc(q); //плюсуем счётчики
                     end; //конец цикла присваивания к переменной БЭ
 if q=1 then x1:=StrToFloat(B);
 if q=2 then y1:=StrToFloat(B);
 if q=3 then x2:=StrToFloat(B);
 if q=4 then y2:=StrToFloat(B);
 if q=5 then x3:=StrToFloat(B);
 if q=6 then y3:=StrToFloat(B); //через функцию StrToFloat переводим значение строки БЭ  
                                           //в значение переменных с типом REAL
      end;   // конец цикла присваивания переменных
 x:=((((x1-x2)*(y1-y3))-((x1-x3)*(y1-y2)))/2); //формула для расчёта площади треугольника
 if x<0 then x:=-x; //иногда формула даёт результат с минусом,
                            //это перевод отрицательного числа в положительное
 If CheckBox1.Checked=True then x:=frac(x);// при желании можно поставить флажок и тогда Х
                                                              //примет дробное значение от исходного
 Label2.Caption:=FloatToStr(x);         /вывод найденного значения
end;
0
Вложения
Тип файла: rar Lab2.rar (166.1 Кб, 7 просмотров)
unick12345
1751 / 1090 / 168
Регистрация: 27.03.2009
Сообщений: 4,142
24.01.2012, 11:52 8
если ты считаешь площадь треугольника, то у тебя формула совсем не сходится с той что на самом деле ((x1-x3)*(y2-y3)-(x2-x3)*(y1-y3))/2 (это со страницы с формулами). а вот и сам код немного переделанный
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Var q:integer;b:string;
begin
 A:=Edit1.Text;
 q:=0;
 while pos(' ',a)<>0 do
 begin
 b:=copy(a,1,pos(' ',a)-1);
 a:=copy(a,pos(' ',a)+1,length(a));
 inc(q);
 case q of
 1: x1:=StrToFloat(b);
 2: y1:=StrToFloat(b);
 3: x2:=StrToFloat(b);
 4: y2:=StrToFloat(b);
 5: x3:=StrToFloat(b);
 6: y3:=StrToFloat(b);
 end;
 end;
 if length(a)>0 then
 y3:=strtofloat(a);
 x:=abs(((x1-x3)*(y2-y3)-(x2-x3)*(y1-y3))/2);
 If CheckBox1.Checked=True then x:=frac(x);
 Label2.Caption:=FloatToStr(x);
0
24.01.2012, 11:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2012, 11:52

Как исправить ошибки?
Определить, является ли введенное четырехзначное число палиндромом (палиндром...

Исправить ошибки в программе
День добрый! Сделал часть необходимого задания, но не могу довести его до...

Исправить ошибки в коде
В архиве есть код і т.д. Нужно пофиксить і сделать робочей. спасибо заранее....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru