Výpočet dne v týdnu a počtu dní mezi dvěma daty

Obsah této kapitoly jistě dává do ruky mocný argument oponentům: otírá se (a to, prosím, opakovaně) o kalkulátory obdařené AOS stejně jako kapitola minulá. Není to známka poklonkování, servility či devótnosti, chcete-li, před systémem AOS. Je však třeba bez vší ironie a laciného přezírání brát vážně konkurenční výrobky takového kalibru jako je TI-58/59. Právě z jejího programového modulu Master Library je zcela bezostyšně vykraden programový blok s pořadovým číslem 20. Algoritmus pro výpočet dne v týdnu a počtu dní mezi dvěma daty je pro svoji jednoduchost natolik dráždivý, že v kombinaci s pocitem nádechu jeho praktické použitelnosti lze jen s vypětím všech sil (a morálně volních vlastností) odolat pokušení o implementaci pro stroj s RPN. Implementace se urodily pro HP-35s, HP-42s a HP-15C.


Původní řešení

Nejprve krátký pohled, jak na to šli borci z Texasu. Na následujících čtyřech "proužcích papíru" z tiskárny PC-100C je originální kód programu pro TI-58/59.

000  76 LBL
001  78 Σ+
002  53  (
003  93  .
004  04  4
005  65  ×
006  43 RCL
007  01  01
008  85  +
009  02  2
010  93  .
011  03  3
012  54  )
013  59 INT
014  94 +/-
015  85  +
016  61 GTO
017  77 x≥t
018  76 LBL
019  79  x
020  00  0
021  35 1/x
022  92 RTN
023  76 LBL
024  10 E'
025  53  (
026  42 STO
027  01  01
028  29 CP
029  22 INV
030  77 x≥t
031  79  x
032  22 INV
033  59 INT
034  22 INV
035  44 SUM
036  01  01
037  65  ×
038  04  4
039  22 INV
040  28 log
041  54  )
042  42 STO
043  03  03
044  32 x↔t
045  01  1
046  05  5
047  08  8
048  01  1
049  77 x≥t
050  79  x
051  03  3
052  02  2
053  32 x↔t
054  53  (
055  53  (
056  43 RCL
057  01  01
058  55  ÷
059  01  1
060  00  0
061  00  0
062  54  )
063  42 STO
064  01  01
065  22 INV
066  59 INT
067  22 INV
068  44 SUM
069  01  01
070  65  ×
071  01  1
072  00  0
073  00  0
074  54  )
075  42 STO
076  02  02
077  77 x≥t
078  79  x
079  01  1
080  03  3
081  32 x↔t
082  43 RCL
083  01  01
084  77 x≥t
085  79  x
086  53  (
087  03  3
088  06  6
089  05  5
090  65  ×
091  43 RCL
092  03  03
093  85  +
094  43 RCL
095  02  02
096  85  +
097  03  3
098  01  1
099  65  ×
100  43 RCL
101  01  01
102  75  -
103  03  3
104  01  1
105  85  +
106  03  3
107  32 x↔t
108  43 RCL
109  01  01
110  77 x≥t
111  78 Σ+
112  01  1
113  22 INV
114  44 SUM
115  03  03
116  76 LBL
117  77 x≥t
118  53  (
119  43 RCL
120  03  03
121  55  ÷
122  04  4
123  54  )
124  59 INT
125  75  -
126  53  (
127  93  .
128  07  7
129  05  5
130  85  +
131  53  (
132  43 RCL
133  03  03
134  55  ÷
135  01  1
136  00  0
137  00  0
138  54  )
139  59 INT
140  65  ×
141  93  .
142  07  7
143  05  5
144  54  )
145  59 INT
146  54  )
147  92 RTN
148  76 LBL
149  11  A
150  10 E'
151  42 STO
152  04  04
153  00  0
154  92 RTN
155  76 LBL
156  12  B
157  10 E'
158  42 STO
159  05  05
160  00  0
161  92 RTN
162  76 LBL
163  13  C
164  53  (
165  43 RCL
166  05  05
167  75  -
168  43 RCL
169  04  04
170  54  )
171  92 RTN
172  76 LBL
173  14  D
174  53  (
175  53  (
176  10 E'
177  42 STO
178  01  01
179  94 +/-
180  55  ÷
181  07  7
182  54  )
183  59 INT
184  65  ×
185  07  7
186  85  +
187  43 RCL
188  01  01
189  54  )
190  92 RTN
Programové řádky kódu mají následující významy:
000 - 017 Pokračování výpočtu faktoru (viz níže) pro měsíce březen až prosinec.
018 - 022 Hlášení o chybném zadání.
023 - 147 Výpočet faktoru. Tento blíže nespecifikovný termín je převzat z originální (německé) dokumentace. Výsledek dělení této hodnoty počtem dní v roce (pro ty, kteří o tom neradi přemýšlejí, je to 365) naznačuje, že tajemný faktor udává počet dní od začátku letopočtu. Zároveň jsou mezi řádky 028 - 085 prováděny kontroly zadání. Tím je vždy jediná hodnota (číslo ve tvaru MMDD.YYYY) udávající příslušné datum.
148 - 190 Zadání hodnot a spouštění jednotlivých výpočtů.


Řešení nové

Zde předkládané RPN řešení je pro HP-35s. Modifikace pro jiný RPN kalkulátor by byla velmi snadná. Stačí (1) nahradit (nebo obejít prostřednictvím více skoků) funkci znaménka SGN na řádku L026 a (2) spočítat zbytek po dělení, není-li k dispozici instrukce RMDR.

Nové řešení není otrockým přepisem výchozího řešení. Co je v novém RPN pojetí jinak ukazuje následující souhrn:

V tabulce s výpisem nově vzniklého programu jsou použity jednopísmenné symboly. Mají tyto významy:
p nějaká předchozí hodnota
y rok
m měsíc
d den
f faktor (viz výše)
v mezivýsledek

ADDRCODEXYZT
Vstupní bod pro výpočet dne v týdnu
L001LBL Lp


L002XEQ L012fp

L00311fp
L004-f - 1 → fp

L00577fp
L006RMDR0 ... 6p

L007RTNvýsledekp

Vstupní bod pro výpočet počtu dní mezi dvěma daty
L008XEQ L012f1


L009XEQ L012f2f1f1f1
L010-f1 - f2f1f1f1
L011RTNvýsledekf1f1f1
Výpočet faktoru zadaného data
L012INPUT Yyp

L013INPUT Mmyp
L014INPUT Ddmyp
L015R↑p


L016365365p

L017RCL× Y365 yp

L018RCL+ D365 y + dp

L0193131365 y + dp
L020RCL× M31 m365 y + dp
L021LASTx3131 m365 y + dp
L022-31 m - 31365 y + dp
L023+365 y + d + 31 m - 31p

L024-3-3vp
L025RCL+ Mm - 3vp
L026SGNsign(m - 3)vp
L027x<0?Je to leden nebo únor?


L028GTO L037-1vp
L029R↓vp

L0300.40.4vp
L031RCL× M0.4 mvp
L0322.32.30.4 mvp
L033+0.4 m + 2.3vp
L034IPintg(0.4 m + 2.3)vp
L035-v - intg(0.4 m + 2.3)p

L03600vp
L037RCL+ Yy nebo (y - 1)vp
L03844yvp
L039÷y / 4vp
L040IPintg(y / 4)vp
L041LASTxy / 4intg(y / 4)vp
L042R↓intg(y / 4)vpy / 4
L043+v + intg(y / 4)py / 4y / 4
L044R↑y / 4vp
L0452525y / 4vp
L046÷y / 100vp
L047IPintg(y / 100)vp
L0480.750.75intg(y / 100)vp
L049×0.75 intg(y / 100)vp
L050LASTx0.750.75 intg(y / 100)vp
L051+0.75 + 0.75 intg(...)vpp
L052IPintg(0.75 + ...)vpp
L053-v - intg(0.75 + ...)ppp
L054RTNvýsledekppp
LN=185, CK=EFB0

Použití programu:
Stisk klávesČinnostDisplay
1) Který den v týdnu byl 4. října 1978  
XEQ L ENTERspuštění programu Y?
0.0000
1 9 7 8 rok Y?
1978_
R/S M?
0.0000
1 0 měsíc M?
10_
R/S D?
0.0000
4 den D?
4_
R/S výpočet
RUNNING
výsledek: středa (3) 0.0000
3.0000


2) Počet dní mezi daty: 2. července 1964 až 4. října 1978
 
XEQ L 0 0 8spuštění programu Y?
1,978.0000
R/S ponechat datum... M?
10.0000
R/S ...z předchozího příkladu D?
4.0000
R/S výpočet faktoru prvního data
RUNNING
druhé datum bude jiné Y?
1,978.0000
1 9 6 4 rok Y?
1964_
R/S M?
10.0000
7 měsíc M?
7_
R/S D?
4.0000
2 den D?
2_
R/S dokončení výpočtu
RUNNING
výsledek: 5207 dní 277,276.0000
5,207.0000

Ve výčtu odlišností od verze pro TI-58/59 je hanebně zamlčen jeden dost vážný nedostatek. Pro opakované spuštění určení počtu dní mezi dvěma daty je vždy třeba zadat oba údaje - přitom potřeba zjišťovat počet dní mezi pevně zadaným datem a sérií měnících se dat je zcela jistě legitimní. K tomu přistupuje ještě jedna přitěžující okolnost: v případě výpočtu dní mezi dvěma daty je třeba hrůzostrašných pět stisků kláves k tomu, aby se program vůbec rozeběhl! Model HP-35s bohužel nemá klávesy pro přímé spouštění podprogramů, jaké známe z typů HP-67, HP-41C nebo HP-15C, a které byly vlastní i konkurenčním strojům z provenience Texas Instruments. Právě tyto klávesy dělaly ovládání programů z výměnných softwarových modulů kalkulátorů TI-58/59 uživatelsky přítulným.

Naštěstí není tak zle, jak by se na první pohled mohlo zdát. Z posledních řádků podprogramu výpočtu faktoru je vidět, že předchozí hodnota (což může být klidně faktor předešle zadaného data) je "rozplevelen" mezi Y-, Z- a T-registr RPN stacku. Toho lze s výhodou využít. Stačí tuto hodnotu přesunout do X-registru (instrukcí R↓) a výpočet spustit od zadání druhého data (instrukcí GTO L009).

Přátelé, přiznejme si, že zahájením iterace opakovaného výpočtu stiskem šesti kláves (z toho čtyři určují adresu, která musí být za každých okolností správná) je zaděláno na neúspěch. Zvyšovat pravděpodobnost dosažení chybného výsledku tak krkolomnou obsluhou je neúnosné. Jakoby nestačilo riziko chybného zadání roků, měsíců a dní... Vhodnější bude obětovat dva programové řádky/kroky navíc a zmíněné instrukce umístit na začátek programové paměti (viz PRGM TOP) třeba i bez označení návěštím (instrukce LBL). Instrukce RTN na adrese L011 ukončující běh ručně spuštěného programu vrátí čítač adres zpět na PRGM TOP, takže GTO . . je provedeno pouze poprvé. A vlastně nepovinně - všechny části tohoto programu svoji činnost končí instrukcí RTN. Použití se pak jednoduchostí vyrovná tomu původnímu Made in Texas.

ADDRCODEXYZT
0001R↓f1


0002GTO L009f1


Použití programu:
Stisk klávesČinnostDisplay
XEQ L 0 0 8spuštění programu Y?
0.0000
1 9 8 6 rok Y?
1986_
R/S M?
0.0000
3 měsíc M?
3_
R/S D?
0.0000
2 0 den D?
20_
R/S výpočet faktoru prvního data
RUNNING
druhé datum Y?
1,986.0000
1 9 6 4 rok Y?
1964_
R/S M?
3.0000
7 měsíc M?
7_
R/S D?
20.0000
2 den D?
2_
R/S dokončení výpočtu 1. rozdílu
RUNNING
výsledek: 7931 dní 725,450.0000
7,931.0000
GTO . . spuštění výpočtu od adresy... 725,450.0000
7,931.0000
R/S ...PRGM_TOP pro další rozdíl Y?
1,964.0000
1 9 7 8 rok Y?
1978_
R/S D?
7.0000
1 0 měsíc M?
10_
R/S D?
2.0000
4 den D?
4_
R/S výpočet 2. rozdílu
RUNNING
výsledek: 2724 dní 725,450.0000
2,724.0000
R/S výpočet dalšího rozdílu od PRGM_TOPY?
1,986.0000
1 9 8 4 rok 1984_
R/S M?
10.0000
4 měsíc M?
4_
R/S D?
4.0000
3 den D?
3_
R/S výpočet 3. rozdílu
RUNNING
výsledek: 716 dní 725,450.0000
716.0000


Nové řešení ještě jednou

Z úcty ke klasice je zde ještě jedna verze téhož. Ono vlastně použití termínu verze není zcela korektní, spíše se jedná o drobnou modifikaci... Ale dost výmluv a jiných žvástů, prostě sled instrukcí pro HP-35s je zopakován (a jen minimálně upraven), tentokrát v notaci HP-42s.

ADDRCODEXYZT
Vstupní bod pro výpočet dne v týdnu
01LBL "ML20W"p


02XEQ 00fp

0311fp
04-f - 1 → fp

0577fp
06MOD0 ... 6p

07RTNvýsledekp

Vstupní bod pro výpočet počtu dní mezi dvěma daty
08LBL "ML20D"



09XEQ 00f1


10XEQ 00f2f1f1f1
11-f1 - f2f1f1f1
12RTNvýsledekf1f1f1
Výpočet faktoru zadaného data
13LBL 00p


14+p → LASTx


15RCL 00y


16"YEAR:"



17PROMPT



18STO 00



19RCL 01m


20"MONTH:"



21PROMPT



22STO 01



23RCL 02d


24"DAY:"



25PROMPT



26STO 02



27LASTXp


28365365p

29RCL× 00365 yp

30RCL+ 02365 y + dp

313131365 y + dp
32RCL× 0131 m365 y + dp
33LASTX3131 m365 y + dp
34-31 m - 31365 y + dp
35+365 y + d + 31 m - 31p

36-3-3vp
37RCL+ 01m - 3vp
38SIGNsign(m - 3)vp
39X<0?Je to leden nebo únor?


40GTO 01-1vp
41R↓vp

420.40.4vp
43RCL× 010.4 mvp
442.32.30.4 mvp
45+0.4 m + 2.3vp
46IPintg(0.4 m + 2.3)vp
47-v - intg(0.4 m + 2.3)p

4800vp
49LBL 010vp
50RCL+ 00y nebo (y - 1)vp
5144yvp
52÷y / 4vp
53IPintg(y / 4)vp
54LASTXy / 4intg(y / 4)vp
55R↓intg(y / 4)vpy / 4
56+v + intg(y / 4)py / 4y / 4
57R↑y / 4vp
582525y / 4vp
59÷y / 100vp
60IPintg(y / 100)vp
610.750.75intg(y / 100)vp
62×0.75 intg(y / 100)vp
63LASTX0.750.75 intg(y / 100)vp
64+0.75 + 0.75 intg(...)vpp
65IPintg(0.75 + ...)vpp
66-v - intg(0.75 + ...)ppp
67ENDvýsledekppp

Použití je stejné, pouze spuštění jednotlivých částí podléhá "místním zvyklostem": Stisk kláves XEQ L ENTER nahrazuje XEQ ALPHA M L 2 0 W ALPHA a podobně místo XEQ L 0 0 8 je použito XEQ ALPHA M L 2 0 D ALPHA.

Stejně jako u HP-35s i zde platí poznámka o naprosto nesmyslném počtu stisků kláves potřebných ke spuštění programu. Kromě možnosti použití dvouřádkové "berličky" jako v případě provozu na HP-35s je v případě HP-42s ještě jedno (výrazně elegantnější) řešení: Předefinovat některé klávesy příkazem ASSIGN a kalkulátor provozovat v módu USER.


A do třetice ještě jedno nové řešení

Třetí podoba programu číslo 20 z Master Library kalkulátorů TI-58/59 je pro HP-15C. Předchozí řešení pro stroje s alfanumerickými (a navíc dvouřádkovými) displeji se snažila v co největší míře využít nabízené výhody zobrazení. Ambicí provedení pro HP-15C je maximální možné přiblížení se k původnímu řešení z kalkulátorů TI. Nově vzniklý program bude samozřejmě (co do vnitřní stavby) úplně jiný. Řešení jeho ovládání, tedy vstup a výstup, mohou však být naprosto totožné s ovládáním TI-58/59. Přesto zde jsou drobné odlišnosti, které (doufejme) budou spíše zvýšením uživatelského komfortu, nežli nedostatkem. Pojďme si zmíněné rozdíly vyjmenovat.

  1. Předně: "americký" formát MMDD.YYYY byl nahrazen tvarem YYYY.MMDD. Zadávání bez desetinné tečky by sice bylo ještě jednodušší, přesto byl ve vstupní hodnotě její výskyt ponechán. Důvod však není praktický, ale čistě estetický. Zobrazený údaj 1,986.0320 vypadá rozhodně více jako datum, než číslo 19,860,320.00.
  2. Zadání údajů pro výpočet rozdílu dní mezi dvěma daty nekončí zobrazením nuly, ale právě zadaného data.
  3. Spuštění výpočtu dne v týdnu (klávesou D stejně jako u TI-58/59) nepotřebuje zadanou vstupní hodnotu. Pro tuto úlohu se vždy bere se ta, která byla zadaná klávesou A při výpočtu rozdílu dní mezi dvěma daty. (Je sice třeba jednoho stisku navíc, ale i přesto to má svoji výhodu: určit den v týdnu lze snadno i pro hodnotu zadanou klávesou B.)
  4. Novou funkci přináší u TI-58/59 nevyužitá klávesa E. Vzájemně vymění zadání odpovídající klávesám A a B, a končí zobrazením hodnoty A. Lze toho využít pro kontrolu zadaných hodnot i pro možnost použití data B pro výpočet dne v týdnu (viz předchozí bod).

Ovládání programu však není jedinou změnou vůči předchozím řešením pro HP-35s resp. HP-42s. Velmi dramaticky se změnila i vlastní stavba programu. Některé změny jsou reakcí na absenci instrukcí, kterými HP-15C na rozdíl od novějších strojů nedisponuje.

Zcela zásadní rozdíl od předchozích RPN řešení naznačuje letmý pohled na následující výpis programu. Překvapivě se to tam "hemží" klíčovým slovem MATRIX! I když to vypadá dost děsivě, maticové výpočty se pro danou problematiku rozhodně nepoužívají. V tom je tato varianta s předchozími verzemi i s originálem zajedno. V programu pro HP-15C je totiž využito prostředků pro adresaci prvků matic. Ve formě matice M[3,1] jsou uloženy hodnoty YYYY→M[1,1], DD→M[2,1] a MM→M[3,1] (v tomto pořadí!). Všechny podprogramy, využívající "maticového" přístupu k položkám (YYYY, MM, DD) zadaných dat, adresují dvě vzniklé matice A[1,3] a B[1,3] (viz zadání klávesami A a B) nepřímo. Jde vlastně o dvojí indirekci. V jazyku C se to dá ilustrovat příkladem:
#define  MAT_ROWS   3
#define  MAT_COLS   1

void lbl_0(int date,
           int mat[MAT_ROWS][MAT_COLS])
{
    :
    :
    lbl_5(mat);
}

int  matA[MAT_ROWS][MAT_COLS],
     matB[MAT_ROWS][MAT_COLS];

void lbl_A(int date)
{
    lbl_0(date, matA);
}
Funkce lbl_0() má argument int mat[][]. Je to bázová adresa zpracovávané matice. Tou může být libovolná z matic A nebo B, což funkce lbl_0() nemá šanci rozlišit. Argumentu int mat[][] odpovídá obsah registru RI. Ten je naplněn některým z matrix-descriptorů ve výpisu programu označených jako A 0 0, B 0 0 nebo M 0 0, jde-li o obecné označení reprezentující libovolný ze dvou konkrétních matrix-descriptorů.

Jsou tu ještě dvě malé odlišnosti v porovnání s řešeními pro předchozí kalkulátory HP. Na řádcích programu 086..097 pro HP-15C je poněkud "kostrbatější" postup v porovnání s řádky L016..L021 (pro HP-35s) resp. 28..33 (v případě HP-42s). "Kostrbatost" se projevuje tím, že zde nejsou použity instrukce pro aritmetické operace s registry/proměnnými, ale tyto operace se provádějí "klasicky" s registry "RPN stacku". Důvody jsou hned dva:

  1. Vyčtení položek matic s automatickým posuvem indexu (zde konkrétně registru R0) je možné pouze instrukcí u RCL (i). Instrukce u RCL+ (i) neexistuje.
  2. Instrukce RCL× (i) nenastavuje registr LASTx.
Konečně slibovaný výpis programu:

ADDRCODEXYZT
Záměna zadání (index [j] zastupuje dvojici [R0, R1])
001-42,21,15LBL E



002-42,16, 1MATRIX 1



003-42,21, 4LBL 4



004- 45 11RCL AA[j]


005-42, 4,12x<> BA[j] ↔ B[j]


006u 44 11STO AHotovo?


007- 22 4GTO 4Ne.


008-45,16,11RCL MATRIX AA 0 0


009- 44 25STO IA 0 0


010- 22 5GTO 5



Den v týdnu
011-42,21,14LBL D



012-45,16,11RCL MATRIX AA 0 0


013- 32 2GSB 2f


014- 111f

015- 30-f - 1 → f


Zbytek po dělení 7
016- 44 0STO 0f


017- 777f

018-44,10, 0STO÷ 07f

019-42, 4, 0x<> 0f / 7f

020- 43 44INTintg(f / 7)f

021-45,20, 0RCL× 07 intg(f / 7)f

022- 30-f - 7 intg(f / 7)


023- 43 32RTNvýsledek


Počet dní mezi dvěma daty
024-42,21,13LBL C



025-45,16,12RCL MATRIX BB 0 0


026- 32 2GSB 2fB


027-45,16,11RCL MATRIX AA 0 0fB

028- 32 2GSB 2fAfB

029- 30-fB - fA


030- 43 32RTNvýsledek


Zadání data "B"
031-42,21,12LBL BYYYY.MMDD


032-45,16,12RCL MATRIX BB 0 0YYYY.MMDD

033- 22 0GTO 0B 0 0YYYY.MMDD

Zadání data "A"
034-42,21,11LBL AYYYY.MMDD


035-45,16,11RCL MATRIX AA 0 0YYYY.MMDD

Společné zadání data
036-42,21, 0LBL 0M 0 0YYYY.MMDD

037- 44 25STO IM 0 0YYYY.MMDD

038-42,16, 1MATRIX 1M 0 0YYYY.MMDD

039- 33R↓YYYY.MMDD


040-43,30, 4TEST 4 (x<=0)Jen zobrazení?


041- 22 5GTO 5Ano.


042- 333YYYY.MMDD

043- 45 1RCL 113YYYY.MMDD
044-42,23,25DIM I13YYYY.MMDD
045- 33R↓3YYYY.MMDD

046- 33R↓YYYY.MMDD


047- 43 44INTYYYY


048u 44 24STO (i)YYYY → M[1]


049- 32 6GSB 6MM


050- 32 6GSB 6DDMM

051u 44 24STO (i)DD → M[2]


052- 33R↓MM


053u 44 24STO (i)MM → M[3]


Zobrazení zadání
054-42,21, 5LBL 5



055u 45 24RCL (i)y


056u 45 24RCL (i)dy

057- 26EEX1 00dy
058- 441 04dy
059- 10÷d / 10000y

060- 40+YYYY.00DD


061- 45 24RCL (i)mYYYY.00DD

062- 26EEX1 00mYYYY.00DD
063- 221 02mYYYY.00DD
064- 10÷m / 100YYYY.00DD

065- 40+YYYY.MMDD


066- 43 32RTN



Výběr měsíce a dne ze zadání (2 řádky hodnot → 2 průchody)
067-42,21, 6LBL 6



068- 43 36LSTxYYYY.MMDD
MM.DD

MM


069- 42 44FRAC0.MMDD
0.DD

MM


070- 26EEX1 000.MMDD
0.DD

MM

071- 221 020.MMDD
0.DD

MM

072- 20×MM.DD
DD.0

MM


073- 43 44INTMM
DD

MM


074- 43 32RTN



Funkce znaménka
075-42,21, 1LBL 1xvp
076- 43 20x=0xvp
077- 43 32RTNxvp
078- 36ENTERxxvp
079- 43 16ABSabs(x)xvp
080- 10÷sign(x)vpp
081- 43 32RTN



Výpočet faktoru zadaného data
082-42,21, 2LBL 2M 0 0p

083- 44 25STO IM 0 0p

084- 33R↓p


085-42,16, 1MATRIX 1p


086- 333p

087- 6636p

088- 55365p

089u 45 24RCL (i)y365p
090- 20×365 yp

091u 45 24RCL (i)d365 yp
092- 40+365 y + dp

093- 45 24RCL (i)m365 y + dp
094- 333m365 y + dp
095- 1131m365 y + dp
096- 20×31 m365 y + dp
097- 43 36LSTx3131 m365 y + dp
098- 30-31 m - 31365 y + dp
099- 40+365 y + d + 31 m - 31p

100- 333vp
101- 16CHS-3vp
102-45,40,24RCL+ (i)m - 3vp
103- 32 1GSB 1sign(m - 3)vp
104-43,30, 2TEST 2 (x<0)Je to leden nebo únor?


105- 22 3GTO 3-1vp
106- 33R↓vp

107- 48.0.vp
108- 440.4vp
109-45,20,24RCL× (i)0.4 mvp
110- 2220.4 mvp
111- 48.2.0.4 mvp
112- 332.30.4 mvp
113- 40+0.4 m + 2.3vp
114- 43 44INTintg(0.4 m + 2.3)vp
115- 30-v - intg(0.4 m + 2.3)p

116- 000vp
117-42,21, 3LBL 30 nebo (-1)vp
118-42,16, 1MATRIX 10 nebo (-1)vp
119-45,40,24RCL+ (i)y nebo (y - 1)vp
120- 444yvp
121- 10÷y / 4vp
122- 43 44INTintg(y / 4)vp
123- 43 36LSTxy / 4intg(y / 4)vp
124- 33R↓intg(y / 4)vpy / 4
125- 40+v + intg(y / 4)py / 4y / 4
126- 43 33R↑y / 4vp
127- 222y / 4vp
128- 5525y / 4vp
129- 10÷y / 100vp
130- 43 44INTintg(y / 100)vp
131- 48.0.intg(y / 100)vp
132- 770.7intg(y / 100)vp
133- 550.75intg(y / 100)vp
134- 20×0.75 intg(y / 100)vp
135- 43 36LSTx0.750.75 intg(y / 100)vp
136- 40+0.75 + 0.75 intg(...)vpp
137- 43 44INTintg(0.75 + ...)vpp
138- 30-v - intg(0.75 + ...)ppp
139- 43 32RTNvýsledekppp

Použití programu:
Stisk klávesČinnostDisplay
[f] USER aktivovat "USER mode", pokud nebyl  


1) Který den v týdnu byl 4. října 1978
 
1 9 7 8 . 1 0 0 4zadání ve formě YYYY.MMDD... 1,978.1004
A ...datum "A" 1,978.1004
D spustit výpočet (vždy podle pro datum "A")running
výsledek: středa (3) 3.0000


2) Počet dní mezi daty: 2. července 1964 až 4. října 1978
 
1 9 6 4 . 0 7 0 2zadat... 1,964.0702
B ...datum "B" (datum "A" stále platí) 1,964.0702
C spustit výpočet running
výsledek: 5207 dní -5,207.0000


3) Záměna zadání
 
E spustit running
výsledek: aktuální datum "A" 1,964.0702


4) Který den v týdnu byl 2. července 1964
 
D spustit výpočet running
výsledek: čtvrtek (4) 4.0000


5) Zobrazení zadání
 
0 nula se neukládá, je to jen značka 0
A datum "A" 1,964.0702
nulu lze zadat i "smazáním displeje" 0
B datum "B" 1,978.1004

Co říci závěrem? Při porovnání dvou výtvorů - HP-15C vs. HP-35s - musí každého zcela logicky k smrti vyděsit délka programu pro HP-15C: je to šílených 139 řádků/kroků proti polovičnímu počtu pro HP-35s. Otázka "...a kde je ten přínos pro lidstvo?" je naprosto oprávněná. Přesto je zde, ctihodnosti, několik námitek proti argumentům obžaloby. Předně je třeba si uvědomit, že číselné konstanty u "patnáctky" zabírají tolik řádků/kroků, kolik mají cifer. Další drobnou úsporou pro "pětatřicítku" může být použití instrukcí skoků bez nutnosti vytvářet návěští (to je vlastně vidět už i při porovnání délky programů HP-35s vs. HP-42s). Největší měrou se však na enormním nárůstu délky programu podílí jeho - použijme moderní slovník - rozšířená funkcionalita. Kdyby k ní nedošlo, neobsahoval by program bloky řádků 001..010, 040..041 a 054..066, úhrnem tedy 25 řádků. V tu ránu se z obludných 139 dostáváme na 114 řádků, což je sice také obludné, ale - jak praví klasik Jiří Suchý *) - už ne tolik... To už by se dalo pohodlně svést na ty nešťastné číselné konstanty, návěští, chybějící funkce a zcela jiné zpracování vstupních hodnot, které vyžaduje speciální programovou obsluhu.

Také by se dalo s úspěchem polemizovat s nutností uchovávat zadané hodnoty ve formě trojice samostatných čísel (YYYY→M[1,1], MM→M[3,1] a DD→M[2,1]), když to jde evidentně jenom s jedním (YYYY.MMDD). Jasně, že by to šlo. Matice (pokud je vůbec nějaká potřeba) by byla použita jenom jedna pro rozklad zadání na samostatné položky a výpočet faktoru. Odpadly by "manévry" s matrix-descriptory - jediná použitá matice by se adresovala přímo. Určitě by to stálo za úvahu i při nutném použití dalších registrů (R2, R3, atd.; zde použité registry jsou pouze ty "permanentní": RI, R0 a R1). To vše by jistě šlo. Jenže už by to nebyla taková frajeřina!!!

*) "Slovo recitál je cizího původu. Na rozdíl od slova estráda, které je také cizího původu, ale už ne tolik..."