program SrazenaAuta; {@obtiznost: 4} type pole_mest = array[1..10] of real; var mesta: pole_mest; nazvy_mest: array[1..10] of string[20]; vychozi1, vychozi2, mest, i: integer; rychlost1, rychlost2: real; vzdal_srazky, cas_srazky: real; {funkce najde město nejbližší k zadanému místu se vzdalenosti "vzdalenost"} {hledá binárním vyhledáváním - viz příslušný příklad} function nejblizsi_mesto( var m: pole_mest; poc_mest: integer; vzdalenost: real ): integer; var low, high, mid: integer; begin low := 0; high := poc_mest+1; while (high-low > 1) do begin mid := (low+high) div 2; if vzdalenost > m[mid] then low := mid else if vzdalenost < m[mid] then high := mid else low := high + 1; end; if low >= high then nejblizsi_mesto := mid else if abs(vzdalenost-m[low]) <= abs(vzdalenost-m[high]) then nejblizsi_mesto := low else nejblizsi_mesto := high; end; begin write('Zadejte pocet mest :'); readln(mest); {zadá se název města 1 s polohou 0} write('Zadejte nazev vychoziho mesta :'); readln(nazvy_mest[1]); {zadají se názvy a polohy všech dalších měst} {poloha < 0 znamená, že město je "vlevo" od prvního města} for i:= 2 to mest do begin write('Zadejte nazev a vzdalenost mesta ',i,'. od prvniho mesta: '); readln(nazvy_mest[i]); readln(mesta[i]); end; for i:= 2 to mest do writeln('Mesto ',i, '. ',nazvy_mest[i], ' je od prvniho mesta vzdaleno ',mesta[i],' km.'); write('Zadejte cislo vychoziho mesta prvniho auta :'); readln(vychozi1); write('Zadejte rychlost prvniho auta :'); readln(rychlost1); write('Zadejte cislo vychoziho mesta druheho auta :'); readln(vychozi2); write('Zadejte rychlost druheho auta :'); readln(rychlost2); {spočte čas srážky} cas_srazky := (mesta[vychozi2]-mesta[vychozi1])/(rychlost1-rychlost2); {a místo srážky - tj. její vzdálenost od bodu 0} vzdal_srazky := mesta[vychozi1] + cas_srazky * rychlost1; {vypíše město nejbližší k místu srážky - jeho název} writeln('Pro pomoc by meli jet do mesta ', nazvy_mest[nejblizsi_mesto(mesta, mest, vzdal_srazky)],'.'); end.