V kartezianskom suradnom systeme je danych N dvojic bodov Bi(xi,yi,zi), A(xi,yi,zi). Kazda dvojica definuje vektor. Zostavte algoritmus na najdenie dvojice bodov, ktorej vektor ma najmensi priemet do roviny XY.
som z toho fakt zufala uz!
jasné, toto som potrebovalmastermind napísal:aky algoritmus? prechadzat polom snad vies. nepotrebujes urobit nic ine iba vypocitat priemet vektora do roviny xy. nepouzijes nic ine iba pytagorovu vetu.
velkost vektora je prepona a posunutie na osi z je jedna odvesna. toto dosadis do pytagorovej vety, vypocitas druhu odvesnu a to je priemet vektora do roviny XY
Kód: Vybrať všetko
unit vektory;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
ListBox1: TListBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Button1: TButton;
Button2: TButton;
Label7: TLabel;
ListBox2: TListBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ListBox1DblClick(Sender: TObject);
private
{ Private declarations }
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var riadok1,riadok2:string;
prepona,odvesna:real;
begin
riadok1:='A: '+Edit1.Text+','+Edit2.Text+','+Edit3.Text+' B: '+Edit4.Text+','+Edit5.Text+','+Edit6.Text; //pripravím si jeden vstup s hodnotami pre prvý listbox
prepona:=sqrt((sqr (StrToInt(Edit4.Text)-StrToInt(Edit1.Text)))+(sqr(StrToInt(Edit5.Text)-StrToInt(Edit2.Text)))+(sqr(StrToInt(Edit6.Text)-StrToInt(Edit3.Text)))); //veľkosť vektora
odvesna:=StrToFloat(Edit6.Text)-StrToFloat(Edit3.Text); //posunutie na z-osi (viď mastermindov post na fore)
riadok2:=FloatToStr(sqrt(sqr(prepona)-sqr(odvesna))); //a výsledok
Listbox1.Items.Add(riadok1); // do listboxu si vložím prvý riadok pre prehľadnosť a evidovanie predošlích vstupov
Listbox2.Items.Add(riadok2); //do druhého listboxu (skrytého) si vložím výsledok
end;
//*****************hľadanie najmenšieho zobrazenia****************
procedure TForm1.Button2Click(Sender: TObject);
var I:Integer;
minimum:real;
begin //skúsim či vôbec máme nejaké hodnoty:
If Listbox1.Items.Count=0 then showmessage('Nie je definovaný žiaden vektor') else begin
minimum:=StrToFloat(Listbox2.Items[0]); //ak áno, do minima vložím prvú hodnotu zo skrytého listboxu
for I:=0 to Listbox2.Items.Count-1 do //prejdem všetkými jeho prvkami
if StrToFloat(Listbox2.Items[I])<=minimum then begin //a porovnávam s minimom
minimum:=StrToFloat(Listbox2.Items[I]); //ak nájdem menší alebo rovný, tak ho nahradím
Listbox1.ItemIndex:=I; //a nastavím sa na pozíciu kde sa nachádzal
end;
Label7.Caption:='Najmenší priemet v rovine má označený vektor'+chr(13)+'Jeho hodnota je: '+FloatToStr(minimum); //vypíšem jeho hodnotu, a stále ostanem nastavený na jeho pozícii
end;
end;
//*******************mazanie záznamov****************
procedure TForm1.ListBox1DblClick(Sender: TObject);
var index:integer;
begin
index:=Listbox1.ItemIndex; //zistím si na ktorom sa nachádzam
Listbox1.Items.Delete(index); //a zmažem z jedného
Listbox2.Items.Delete(index); //aj druhého listboxu
end;
//************************ AMEN ***************************
end.
Kód: Vybrať všetko
program vektor;
var A:array[1..3] of real; //pole kde si ulozim hodnoty
vyber:char; //vyber či chceme zadat dalsi
AX,AY,AZ,BX,BY,BZ:integer; //jednotlive hodnoty
I:integer; //na riadenie cyklu
MIN:real; //najmensia hodnota
P:integer; //pocet zadanych prvkov
begin
P:=0; //počet uložených vektorov
repeat begin
Write ('Zadaj hodnotu Xa: ');
read (AX);
Write ('Zadaj hodnotu Ya: ');
read (AY);
Write ('Zadaj hodnotu Za: ');
read (AZ);
Write ('Zadaj hodnotu Xb: ');
read (BX);
Write ('Zadaj hodnotu Yb: ');
read (BY);
Write ('Zadaj hodnotu Zb: ');
read (BZ);
P:=P+1; //zvýšim počet zadaných vektorov
A[P]:=sqrt((sqr(BX-AX))+(sqr(BY-AY))); //uložím si hodnotu priemetu
Write('Zadat novy vektor? <A/N> '); //spytame sa ci chce zadat nove hodnoty
read(vyber); //nacitam stlacenu klavesu
end until vyber='N'; //ak sa rovná písmenu N tak skončím načítavať
min:=A[1]; //do minima dám prvú hodnotu
For I:=1 TO P do if A[I]<MIN then MIN:=A[I]; //prehladám pole a najdem minimum
writeln('Najmensie zobrazenie je: ',MIN); //vypíšem ho
readln
end.
Kód: Vybrať všetko
program vektor;
var A:array[1..10] of real; //pole kde si ulozim hodnoty, najviac však 10 vektorov
AX,AY,AZ,BX,BY,BZ:integer; //jednotlive hodnoty
I:integer; //na riadenie cyklu
MIN:real; //najmensia hodnota
P:integer; //pocet zadanych prvkov
poradie:integer; //poradie najmenšieho vektora
begin
Write('Pocet vektorov: ');
read(P); //načítam koľko vektorov chce zadať
For I:=1 to P do begin
writeln('===================='); //vykreslím oddelovač pre prehladnosť
Write ('Zadaj hodnotu Xa: ');
read (AX);
Write ('Zadaj hodnotu Ya: ');
read (AY);
Write ('Zadaj hodnotu Za: ');
read (AZ);
Write ('Zadaj hodnotu Xb: ');
read (BX);
Write ('Zadaj hodnotu Yb: ');
read (BY);
Write ('Zadaj hodnotu Zb: ');
read (BZ);
A[I]:=sqrt((sqr(BX-AX))+(sqr(BY-AY))); //uložím si hodnotu priemetu
end;
min:=A[1]; //do minima dám prvú hodnotu
poradie:=1; //a jeho pozícia je 1
For I:=1 TO P do if A[I]<MIN then begin //prejdem celým polom a porovnavam veľkosti
MIN:=A[I]; //a najdene minimum si uložim
poradie:=I; //aj s jeho poziciou
end;
writeln; //voľný riadok pre prehľadnosť
writeln('Namensi priemet ma ',poradie,'. vektor a jeho velkost je: ',MIN:0:5); //vypíšem ho
readln (I)
end.