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.
{ TERC2.PAS                                                         }
{                                                                   }
{ Author: Quetocek                                                  }
{ Date  : 28.02.2006                           http://www.trsek.com }
 
Program Terc2;
 
{
Vstupne hodnoty
 
       Pocet medzikruzi: pocetkruhov=4
       Bodove hodnoty v jednotlivych medzikruziach: kruh1=1, kruh2=2, kruh3=3, kruh4=4
       Pocet vystrelov: pocetvystrelov=4
       Celkovy pocet nastrielanych bodov: pocetbodov=11
}
 
 uses Crt; { aby som mohla pouzivat niektore prikazy, napr. ClrScr, ktore patria do tejto kniznice }
 
 const { toto su konstanty, ktore som si zadefinovala a ktore sa pocas celeho programu nemenia }
  pocetkruhov=4;
  kruh1=1;
  kruh2=2;
  kruh3=3;
  kruh4=4;
  pocetvystrelov=4;
  pocetbodov=11;
 
 var { toto su premenne, ktore budem pouzivat vo vypocte v programe - pocas programu sa budu menit }
  pocetrieseni:integer;
  zasah1,zasah2,zasah3,zasah4:integer;
 
 Begin
 
  pocetrieseni:=0; { toto je pocitadlo, ktore som na zaciatku vynulovala }
 
  ClrScr; { vycisti obrazovku }
 
  Writeln('Vstupne hodnoty'); { vypise na obrazovku, vsetko co je napisane v uvodzovkach }
  Writeln;                    { bez parametrov vlozi prazdny riadok }
  Writeln('Pocet medzikruzi: pocetkruhov=4');
  Writeln('Bodove hodnoty v jednotlivych medzikruziach: kruh1=1, kruh2=2, kruh3=3, kruh4=4');
  Writeln('Pocet vystrelov: pocetvystrelov=4');
  Writeln('Celkovy pocet nastrielanych bodov: pocetbodov=11');
  Writeln('(pocetvystrelov*kruh1 <= pocetbodov <= pocetvystrelov*kruh4)');
  Writeln;
  Writeln('Vypis rieseni:');
  Writeln('(Pocet zasahov do kruhu1-kruhu2-kruhu3-kruhu4)');
 
  {
  nasleduju vnorene cykly, kde bude priradovat premennym zasah1 az zasah4
  hodnoty od 0 do 4 a to tak, ze najprv vsetkym priradi 0 a postupne zvysuje
  hodnotu az po pocet vystrelov, cim vytvori vsetky kombinacie nehladiac na
  pocet vystrelov a pocet bodov
 
  vo vnutri vnorenych cyklov overujeme ci su splnene 2 podmienky pomocou prikazu if
  1.podmienka - ci sedi pocet vystrelov
  2.podmienka - ci sedi pocet dosiahnutych bodov
 
  ak su obe podmienky splnene, tak zvysi pocitadlo rieseni o 1
  a vypise aktualne riesenie
  }
 
  for zasah1:=0 to pocetvystrelov do
   for zasah2:=0 to pocetvystrelov do
    for zasah3:=0 to pocetvystrelov do
     for zasah4:=0 to pocetvystrelov do
      if (zasah1 + zasah2 + zasah3 + zasah4 = pocetvystrelov) and
      ((zasah1*kruh1) + (zasah2*kruh2) + (zasah3*kruh3) + (zasah4*kruh4) = pocetbodov) then
        begin
         pocetrieseni:=pocetrieseni + 1;
         Writeln('riesenie ',pocetrieseni,': ',zasah1,'-',zasah2,'-',zasah3,'-',zasah4);
        end;
  Writeln;
  Writeln('Pocet rieseni:',pocetrieseni); { vypise napocitany pocet rieseni }
 
  ReadKey; { caka na stlacenie lubovolnej klavesy }
 
 End.