Program zistí akými kombináciami zásahov do terča sa dá dosiahnuť požadovaný počet bodov Z v pascale

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Kategórie: Programy v Pascalu

Program: Terc.pasTerclight.pasTerc2.pas
Soubor exe: Terc.exeTerc2.exe
Soubor ubuntu: Terc
Příklady: Terc.txtTerc2.txt

Program zistí akými kombináciami zásahov do terča sa dá dosiahnuť požadovaný počet bodov Z. Určí všetky vektory P ( P[1] .. P[M] ) a počet zásahov do medzikružia. Nakoniec vypíše všetky možné riešenia a ich počet (0, 1, 2, …). Podrobný postup riešenia nájdete v Terc.txt.

Ako všade aj tu platí že sa dá naprogramovať jednodušia verzia TercLight.pas ktorá ale nieje taká výkonná.

Nakoniec ešte uverejňujem verziu Terc2.pas od prispievateľky s nickom Quetocek. Vďaka nej je k dispozícii aj dokumentácia.
{ Akymi kombinaciami zasahov sa da dosiahnut definovany pocet bodov }
{ Zadanie:                                                          }
{  - Pocet medzikruzi v terci M                                     }
{  - Bodove hodnoty jednotlivych medzikruzi B[1] .. B[M]            }
{  - Celkovy pocet vystrelov V                                      }
{  - Celkovy pocet nastrielanych bodov v terci Z                    }
 
program terc;
uses crt,dos;
const MAX_M=20;
 
var m:integer;          { pocet medzikruzi, globalna premenna }
    v:integer;          { pocet vystrelov, globalna premanna  }
    z:integer;          { celkovy pocet nastrielanych bodov }
    i:integer;          { pomocna premenna }
    poc:integer;        { pocet rieseni }
 
    b:array [1..MAX_M] of integer;      { hodnoty medzikruzi }
    vv:array [1..MAX_M] of integer;     { vektor riesenia }
 
 
{ najtazsia cast programu }
{ bude generovat jednotlive kombinacie zasahov }
function DalsiVektor:boolean;
var i:integer;
begin
  i:=m;                { budeme pouzivat tuto premennu }
  vv[i]:=vv[i]+1;     { zvysim hodnotu posledneho }
  DalsiVektor:=true;
 
  { pokial mi presahuje pocet vystrelov v }
  { zmenim na 0 a zvacsim dalsie medzikruzie v poradi }
  while( vv[i]>v ) do
  begin
    vv[i]:=0;
 
    { test ci mozem zmenit dalsie }
    if( i=1 )then
     begin
      DalsiVektor:=false;  { uz som na konci }
     end
    else
     begin
      i:=i-1;            { menim dalsie medzikruzie }
      vv[i]:=vv[i]+1;
     end;
 
   end;  { while }
end;
 
 
{ funkcia zisti celkovy pocet vystrelov }
function PocetVystr:integer;
var poc:integer;
begin
  poc:=0;
 
  for i:=1 to m do
    poc:=poc+ vv[i];
 
  PocetVystr:=poc;
end;
 
 
{ funkcia zisti kolko ma vektor bodov }
function PocetBodov:integer;
var i:integer;
    vys:integer;
begin
  vys:=0;
 
  for i:=1 to m do
    vys:=vys+ vv[i]*b[i];
 
  PocetBodov:=vys;
end;
 
 
{ vypise pozadovany vektor }
procedure VypisVektor;
var i:integer;
begin
  Write('(');
 
  for i:=1 to m do
  begin
    if (i=m) then
      Write(vv[i],')')
    else
      Write(vv[i],',');
  end;
  WriteLn;
end;
 
 
BEGIN
  { uvod }
  ClrScr;
  WriteLn('Program na zistenie kombinacii zasahov pre dosiahnutie poctu bodov.');
  WriteLn;
 
  { zistenie pociatocnych hodnot }
  Write('Zadaj pocet medzikruzi v terci (max=', MAX_M, '):');
  ReadLn(m);
 
  for i:=1 to m do begin
    Write('Zadaj hodnotu medzikruzia B[',i,']=');
    ReadLn(b[i]);
  end;
 
  WriteLn;
  Write('Zadaj celkovy pocet vystrelov:');
  ReadLn(v);
 
  Write('Zadaj pozadovany pocet nastrielanych bodov:');
  ReadLn(z);
 
 
  { nastavim default hodnoty - znulujem }
  for i:=1 to MAX_M do vv[i]:=0;
  poc:=0;
 
 
  { zacneme riesit ulohu }
  WriteLn;
 
  while( DalsiVektor ) do
  begin
 
    { kontrola vektora }
    if( PocetVystr=v ) then      { pocet vystrelov OK }
      if( PocetBodov=z )then     { pocet bodov OK }
      begin
        inc(poc);
        Write('Riesenie ',poc:2,': ');
        VypisVektor;
      end;
  end;
 
 
  { zhodnoti kolko nasiel rieseni }
  if( poc=0 )then
    WriteLn('Pre zadane hodnoty neexistuje ziadne riesenie.')
  else
    WriteLn('Celkovo najdene ', poc, ' krat.');
 
END.