Ahojky.Tady mám zadání úkolu:
Trojúhelník v rovině je zadán pomocí souřadnic vrcholů. Sestavte program, dle těchto pokynů:
-program určí souřadnice středů stran výchozího trojúhelníka - tyto body budeme považovat za vrcholy nového výchozího trojúhelníka
-celý proces (určení středů stran) se bude opakovat tak dlouho, dokud se souřadnice vrcholů trojúhelníka budou lišit o více než předem zadanou hodnotu – vrcholy trojúhelníka se budou k sobě přibližovat, až v rámci zadané přesnosti splynou v jeden bod.
VSTUP: Souřadnice tří bodů (vrcholy),
Diference – hraniční hodnota pro ukončení výpočtů
VÝSTUP: Souřadnice výsledného bodu
V programu lze použít rekurzi.
Mám část, ale nevím jak dále.
Uses crt;
type TBod = record
x: Integer;
y: Integer;
end;
type TTroj = record
A: TBod;
B: TBod;
C: TBod;
end;
procedure nacti(var t:TTroj);
begin
WriteLn('Zadejte souradnice bodu A (x mezera y): ');
ReadLn(t.A.x, t.A.y);
Writeln;
WriteLn('Zadejte souradnice bodu B (x mezera y): ');
ReadLn(t.B.x, t.B.y);
Writeln;
WriteLn('Zadejte souradnice bodu C (x mezera y): ');
ReadLn(t.C.x, t.C.y);
end;
procedure vypis(t:TTroj);
begin
WriteLn('');
Write('Bod A - [', t.A.x,',', t.A.y,']');
Write(' ');
Write('Bod B - [', t.B.x,',', t.B.y,']');
Write(' ');
Write('Bod C - [', t.C.x,',', t.C.y,']');
WriteLn('');
end;
function isValid(t:TTroj): Boolean;
if ((t.A.x = t.B.x) and (t.A.x = t.C.x)) then
begin
result := false;
end
if ((t.A.y = t.B.y) and (t.A.y = t.C.y)) then
begin
result := false;
end
result := true;
var trojuhelnik: TTroj;
diff: Integer;
begin
nacti(trojuhelnik);
WriteLn('Zadejte diferenci: ');
ReadLn(diff);
Writeln;
WriteLn('Zadany trojuhelnik: ');
WriteLn('------------------------');
vypis(trojuhelnik);
ReadLn(diff);
end.
Fórum › Pascal
Trojuhelnik
Urcite jsou souradnice a diference integery? Spis bych dal real, jinak se bude muset furt zaokrouhlovat.
A co konkretne nechapes?
-Vytvoreni noveho trojuhelniku?
bude potreba jeste jeden trojuhelnik a pro kazdy bod udelas toto(samozrejne jine pismena):
noveA.x:=(A.x+B.x)/2;
noveA.y:=(A.y+B.y)/2;
-vzdalenost?
pro kazdou dvojici bodu spocitas vzdalenost pythagorovkou
vzdalenost1:=sqrt( (noveA.x-noveB.x)*(noveA.x-noveB.x)+(noveA.y-noveB.y)*(noveA.y-noveB.y))
-kdy pokracovat?
vsecky 3 vzdalenosti porovnas s differenci bude tam AND jestli staci jenom 1 aby byla mensi nebo OR pokud musi byt vsechny (nechapu zadani), pokud je to dobre tak prepises trojuhelnik tim novym a jedes cely velky cyklus znovu, jinak proste vypises vysledek (tady nechapu jak z 3 bodu jde vypsat 1? stred nebo co? )
if ((vzdalenost1>diference) AND (vzdalenost2>diference) AND (vzdalenost3>diference)) then
A jeste takova drobnost: ve funkci isvalid neuvazujes moznost splynuti 2 bodu ( napr pro [1,1] [1,1] [5,6] to bude pocitat) a body lezici v primce ruzne od os x a y ([1,1] [2,2] [3,3])
To Krychlik : Ahojky.Já to mám už upravený.......Myslíte někdo že by to mohlo podle zadání takhle vypadat?
Uses crt;
type TBod = record
x: Real;
y: Real;
end;
type TTroj = record
A: TBod;
B: TBod;
C: TBod;
end;
procedure nacti(var t:TTroj);
begin
Writeln('Zadejte souradnice bodu A (x mezera y): ');
Readln(t.A.x, t.A.y);
Writeln;
Writeln('Zadejte souradnice bodu B (x mezera y): ');
Readln(t.B.x, t.B.y);
Writeln;
Writeln('Zadejte souradnice bodu C (x mezera y): ');
Readln(t.C.x, t.C.y);
end;
procedure vypis(t:TTroj);
begin
Writeln('');
Write('Bod A - [', t.A.x,',', t.A.y,']');
Write(' ');
Write('Bod B - [', t.B.x,',', t.B.y,']');
Write(' ');
Write('Bod C - [', t.C.x,',', t.C.y,']');
Writeln('');
end;
function isValid(t:TTroj):boolean;
begin
isValid:= true;
if ((t.A.x = t.B.x) and (t.A.x = t.C.x)) then
begin
isValid:= false;
end;
if ((t.A.y = t.B.y) and (t.A.y = t.C.y)) then
begin
isValid:= false;
end;
end;
procedure prepocitej(var t:TTroj);
var A,B,C:TBod;
begin
A.x:= (t.A.x + t.B.x) / 2;
A.y:= (t.A.y + t.B.y) / 2;
B.x:= (t.B.x + t.C.x) / 2;
B.y:= (t.B.y + t.C.y) / 2;
C.x:= (t.A.x + t.C.x) / 2;
C.y:= (t.A.y + t.C.y) / 2;
t.A:= A;
t.B:= B;
t.C:= C;
end;
var trojuhelnik: TTroj;
diff: Real;
result: Boolean;
i: Integer;
begin
nacti(trojuhelnik);
Writeln('Zadejte diferenci: ');
Readln(diff);
Writeln('Zadany trojuhelnik: ');
Writeln('--------------------');
vypis(trojuhelnik);
result:= isValid(trojuhelnik);
if (result = false) then
begin
Writeln('Toto neni trojuhelnik !!!');
end
else
begin
for i:= 0 to 5 do begin
prepocitej(trojuhelnik);
WriteLn('Prepocitany trojuhelnik');
WriteLn('-----------------------');
vypis(trojuhelnik);
end;
end;
Readln(diff);
end.
To Malirka :
uz sem to jednou psal- musis spocitat jeste ty delky, podle kterych se urcuje, jestli skoncit a pouzit cyklus repeat until nebo while (podle nalady)
repeat
prepocitej(trojuhelnik);
spoctidelky(trojuhelnik);
until ((vzdalenost1>diference) AND (vzdalenost2>diference) AND (vzdalenost3>diference))
//tady pripadne misto AND dat OR podle nazoru na zadani
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Java - trojuhelnik — založil keet
Rovnoramenny trojuhelnik — založil Jakub
Trojúhelník z hvězdiček — založil LeArnie
Trojúhelník - optimalizace — založil PiKey
Pascaluv trojuhelnik — založil karel
Moderátoři diskuze