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ória: Programy v Pascale

Program: Terc.pasTerclight.pasTerc2.pas
Súbor exe: Terc.exeTerc2.exe
Súbor ubuntu: Terc
Prí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.
{ TERC.PAS                  Copyright (c) TrSek alias Zdeno Sekerak }
{ Akymi kombinaciami zasahov sa da dosiahnut definovany pocet bodov }
{ Urcite vsetky vektory P ( P[1] .. P[M] ) poctov zasahov do        }
{ medzikruzia. Vytvorte program, ktorě vypise vsetky mozne riesenia }
{ a ich pocet (0, 1, 2, ).                                         }
{                                                                   }
{ 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                    }
{                                                                   }
{ Datum:14.11.2004                             http://www.trsek.com }
 
program terc;
uses crt,dos;
const MAX_M=20;         { maximalny pocet vystrelov }
 
var m:integer;          { pocet medzikruzi }
    v:integer;          { pocet vystrelov  }
    z:integer;          { celkovy pocet nastrielanych bodov }
    i:integer;          { pomocna premenna }
    poc:integer;        { pocet rieseni }
 
    { tieto 2 polia su zaroven globalnymi polami }
    { do pola vv si odovzdavaju jednotlive funkcie vygenerovane hodnoty }
    b:array [1..MAX_M] of integer;      { hodnoty medzikruzi }
    vv:array [1..MAX_M] of integer;     { vektor riesenia }
 
 
{ skolonovanie slova riesenie, slovencina moja }
function Sklon(poc:integer):string;
begin
case poc of
  1: Sklon:='riesenie';
  2: Sklon:='riesenia';
  3: Sklon:='riesenia';
  4: Sklon:='riesenia';
else
     Sklon:='rieseni';
end;
end;
 
 
{ funkcia zisti celkovy pocet vystrelov }
function PocetVystr(m:integer):integer;
var poc:integer;
begin
  poc:=0;
 
  for i:=1 to m do
    poc:=poc+ vv[i];
 
  PocetVystr:=poc;
end;
 
 
{ najtazsia cast programu }
{ bude generovat jednotlive kombinacie zasahov }
{ POSTUP: }
{ -najdem od zadu posledne cislo vo vektore, ktore nema nulu }
{ -od tohoto cisla odpocitam 1                               }
{ -pole za tymto cislom dopocitam do poctu vystrelov v       }
{ -ak vsetky maju nulu koncim                                }
function DalsiVektor(m,v:integer):boolean;
var i:integer;
begin
  vv[m]:=0;
 
  { najprv najdem od zadu posledne ktore nema nulu }
  i:=m-1;
  while((i>1) and (vv[i]=0)) do
    i:=i-1;
 
  { je koniec? }
  if((i=1) and (vv[i]=0))then
   begin
     DalsiVektor:=false;
   end
  else
   begin
    { od tohoto cisla odpocitam 1 }
    vv[i]:=vv[i]-1;
 
    { dopocitam cislo }
    vv[i+1]:=v-PocetVystr(m-1);
    DalsiVektor:=true;
   end;
end;
 
 
{ funkcia zisti kolko ma vektor bodov }
function PocetBodov(m:integer):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(m:integer);
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);
  {m:=4; b[1]:=2; b[2]:=5; b[3]:=7; b[4]:=8; v:=5; z:=27;}
 
 
  { nastavim default hodnoty - znulujem }
  for i:=1 to MAX_M do vv[i]:=0;
  vv[1]:=v;           { pocet vystrelov dam do prveho pola }
  poc:=0;
 
 
  { zacneme riesit ulohu }
  WriteLn;
 
  while( DalsiVektor(m,v)) do
  begin
    { kontrola vektora - pocet bodov OK }
    if( PocetBodov(m)=z )then
      begin
        inc(poc);
        Write('Riesenie ',poc:2,': ');
        VypisVektor(m);
      end;
  end;
 
 
  { zhodnoti kolko nasiel rieseni }
  if( poc=0 )then
    WriteLn('Pre zadane hodnoty neexistuje ziadne riesenie.')
  else
    WriteLn('Celkovo ', poc, ' ', Sklon(poc));
 
END.