-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsao-faq.sgml
674 lines (610 loc) · 26.1 KB
/
sao-faq.sgml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
<!doctype debiandoc public "-//DebianDoc//DTD DebianDoc//EN">
<book>
<title>Vastauksia tietokoneohjelmoinnista usein esitettyihin kysymyksiin
<author>Juha Autero <email>[email protected]
<author>Antti-Juhani Kaijanaho <email>[email protected]
<version>$Revision: 1.67 $ $Date: 2004/09/25 18:59:10 $
<abstract>
Tämä artikkeli vastaa joihinkin useimmin tietokoneohjelmoinnista
esitettyihin kysymyksiin. Keskityn pääasiassa Suomen
erityiskysymyksiin mutta käsittelen muitakin aiheita tarpeen mukaan.
</abstract>
<copyright>
Copyright © 1997-2000 Antti-Juhani Kaijanaho.
Copyright © 2002 Juha Autero
<p>
Tätä kirjoitelmaa
saadaan levittää ja muuttaa vapaasti sillä ehdolla, että muutosten
tekijä ja päiväys ilmoitetaan muutetuissa versioissa selkeästi.
Kirjoitelman tekijät (mukaanlukien kaikki mahdollisten muutosten
tekijät) on mainittava kirjoitelmasta ja sen johdannaisteoksista
tehdyissä teoskappaleissa, jollei kukin sitä omalta osaltaan erikseen
kiellä.
<p>
Toivon, että kaikissa viittauksissa tähän artikkeliin mainitaan sen
ikiosoite
<url id="http://www.iki.fi/jautero/faq/sao-faq.html"
name="http://www.iki.fi/jautero/faq/sao-faq.html"> .
Viittauksissa ei tule käyttää muita osoitteita, sillä vain mainitun
osoitteen toimiminen taataan.
<p>
<strong/FAQin kokoaja ei vastaa vastausten oikeellisuudesta./ FAQin on
tarkoitus olla mahdollisimman luotettava ja puolueeton tietolähde,
totta kai, mutta koska sitä kirjoitetaan lähinnä harrastuksen vuoksi,
ei sen kokoaja voi ottaa siitä sellaista vastuuta, joka voisi joskus
viedä oikeuteen.
</copyright>
<toc>
<chapt>Yleistä
<sect>Olemisen tarkoitus
<p>
Tämän dokumentin on tarkoitus vastata sellaisiin keskusteluryhmissä
<tt/sfnet.atk.ohjelmointi/
usein esitettyihin kysymyksiin, joihin ei ole järkevää vastata tai
joihin ei ole vielä vastattu kansainvälisissä FAQ:eissa. Tämä
tarkoittaa sitä, että tämä FAQ ei juurikaan käsittele esimerkiksi
ohjelmointikieliä eikä numeerisia menetelmiä. Tässä artikkelissa
käsitellään myös hieman ryhmissä noudatettavia käyttäytymissääntöjä.
<p>
Ohjelmoinnin ja ohjelmointikielten alkeita käsitellään ryhmän
<tt/sfnet.atk.ohjelmointi.alkeet/
<url id="http://www.iki.fi/jautero/faq/saoa-faq.html" name="FAQ:ssa">
<p>
Edellä esitettyjen rajausten vuoksi tämä FAQ käsittelee lähinnä
sellaisia algoritmeja, joiden käyttöönoton taustalla on hallinnollinen
tai poliittinen päätös.
<sect>Mistä tämän FAQin saa?
<p>
Yleensä tähän kysymykseen vastataan: "Luet sitä nyt juuri, joten
<em/säilytä/ hallussasi oleva kappale."
<p>
Uusin versio on aina löydettävissä FAQin <url
id="http://www.iki.fi/jautero/faq/sao-faq.html" name="seittisivulta">.
<p>
Tämä dokumentti on olemassa myös tekstiversiona (<url
id="http://www.iki.fi/jautero/faq/sao-faq.txt" name="ilman korostuksia">
ja <url id="http://www.iki.fi/jautero/faq/sao-faq.tov"
name="korostuksineen">).
<p>
Myös FAQin <url id="http://www.iki.fi/jautero/faq/sao-faq.sgml"
name="SGML-sorsat"> ovat saatavilla. Tarvitset niiden käsittelemiseen
uudehkon <url
id="http://www.debian.org/Packages/unstable/text/debiandoc-sgml.html"
name="Debiandoc-SGML-paketin">, joka toiminee ainakin kaikissa
Unixeissa.
<p>
Kaikissa ylläolevissa osoitteissa on aina FAQin uusin julkaistu versio.
<p>
Kirjoitelmaan tehdyt muutokset löytyvät <url
id="http://www.iki.fi/jautero/faq/ChangeLog" name="GNU ChangeLog"> sekä
<url id="http://www.iki.fi/jautero/faq/changelog.html"
name="HTML">-muodossa.
<p>
Tämä FAQ pyritään postaamaan joka kuukauden 17. päivänä uutisryhmään
<tt/sfnet.atk.ohjelmointi/.
<sect>Missä ja mitä voin kysyä?
<p>
Ennenkuin kysyt, tarkista, onko kysymykseesi vastattu tässä
kirjoitelmassa.
<p>
Uutisryhmä <tt/sfnet.atk.ohjelmointi/ on tarkoitettu
tietokoneen ohjelmoinnin yhteydessä esiin nousseiden aiheiden
käsittelyyn. Virallisen kuvauksen mukaan ryhmään sopii "kaikenlainen
ohjelmointiin vaan ei valmiiden ohjelmien käyttöön liittyvä
keskustelu: algoritmit, ohjelmointikielet, työkalut, ohjelmien
suunnittelu, määrittely, testaus jne."
<p>
Uutisryhmä <tt/sfnet.atk.ohjelmointi.moderoitu/ on yllämainitun ryhmän
moderoitu versio, joka poistettiin moderointisoftan lakattua
toimimasta
eikä sitä ole enää syytä käyttää.
<p>
Keväällä 1998 perustettiin uutisryhmä
<tt/sfnet.atk.ohjelmointi.alkeet/. Ryhmän virallinen kuvaus kertoo,
että se "on tarkoitettu ohjelmointia aloitteleville tai sellaisille,
jotka tutustuvat itselleen uuteen ohjelmoinnin osa-alueeseen". Hyvä
nyrkkisääntö on, että jos jotain kysymystä käsitellään hyvin
osa-alueen perusoppikirjoissa, se kuuluu alkeet-ryhmään. Toisaalta
se, että vuosia ohjelmoinut ihminen ei kohtuullisella vaivalla löydä
ratkaisua ongelmaansa, on kohtuullisen hyvä merkki siitä, että kysymys
ei ole alkeista. Alkeet-ryhmällä on <url name="oma FAQ"
id="http://www.iki.fi/jautero/faq/saoa-faq.html">.
<p>
<em/HTML-kieleen liittyvät kysymykset eivät kuulu mihinkään
ohjelmointiryhmään,/ sillä HTML ei ole ohjelmointikieli. Esitä ne
mielummin WWW-kysymyksille varatussa ryhmässä
<tt/sfnet.viestinta.www/, kun olet ensin tarkistanut, ettei
kysymykseesi ole vastattu <url
id="http://www.heikniemi.net/svwww-vukk/"
name="ryhmän VUKK:ssa"> tai englanninkielisessä <url
id="http://www.stack.nl/htmlhelp/faq/wdgfaq.htm" name="FAQ:ssa">.
<p>
Esittäessäsi kysymyksen muista kertoa kaikki olennainen! Älä jätä
mainitsematta käyttöjärjestelmää, ohjelmointikieltä äläkä kielen
tulkkia tai kääntäjää, paitsi jos olet varma, etteivät ne ole
olennaisia. Kerro myös omat ajatuksesi; mainitse jotain siitä, mitä
olet (tuloksettomasti) jo kokeillut; kerro myös, miksi esität
kysymyksesi. Näin varmistat sen, että ryhmän muut lukijat pääsevät
ongelmaasi nopeasti kiinni, ja saat heti alusta alkaen hyödyllisiä
vastauksia.
<chapt>Numerosarjoja ja niiden tarkistemerkkejä
<p>
Numerosarjojen tarkisteista on olemassa tätä FAQia kattavampi esitys
<url name="Tarkistusmerkkien laskentamekanismeja"
id="http://www.mbnet.fi/%7Ethales/tarkmerk.htm">. Sen on kirjoittanut
Teppo Vuori. Pankkeihin liittyviä tunnusnumeroita koskevat vastaukset
perustuvat <url id="http://www.pankkiyhdistys.fi/" name="Suomen
pankkiyhdistyksen"> julkaisuun Tilisiirto-opas 1.12.1998 <url
name="(saatavana verkosta PDF-muodossa)"
id="http://www.pankkiyhdistys.fi/sisalto/upload/pdf/tsopas.pdf">.
<sect>Miten pankkiviitenumero muodostetaan?
<p>
Pankkiviitenumero korkeintaan 20 merkkiä pitkä numerosarja. Sen tulisi
kuitenkin olla mahdollisimman lyhyt, jotta näppäilyvirheet
vähenisivät. Mielellään kuitenkin vähintään 4 merkkiä. Laskuttaja voi
valita viitenumeron vapaasti viimeistä numeroa
lukuunottamatta. Viitenumero suositellaan tulostettavaksi viiden
numeron ryhmissä oikealta alkaen. Alkunollia ei tulosteta.
<p>
Viitenumeron viimeinen numero on tarkiste. Se muodostetaan
seuraavasti:
&
<list>
<item>Tarkistettavan viitteen numerot tarkistetta lukuunottamatta
kerrotaan oikealta vasemmalle painoarvoilla 7, 3, 1, 7, 3, 1, ...
<item>Tulot lasketaan yhteen ja summa vähennetään seuraavasta täydestä
kymmenestä.
<item>Erotus on viitenumeron tarkiste.
</list>
Esimerkiksi <tt/123 45672/ on oikein muodostettu viitenumero.
<p>
Kimmo Surakka <email/[email protected]/ on kirjoittanut tästä aiheesta
<url id="http://www.cs.tut.fi/~kusti/viite.html" name="seittisivun">,
josta löytyy mm. C-kielinen esimerkkifunktio.
<sect>Miten rakentuu pankkitilinumero?
<p>
Suomalaisten pankkien tilinumerot rakentuvat tällä hetkellä (tammikuu
1999) seuraavasti. Tilinumero on korkeintaan 14 merkkiä pitkä ja
koostuu pelkästään numeromerkeistä. Kun tilinumero on tarkoitettu
ihmisten luettavaksi, se kirjoitetaan kahdessa osassa, joiden välissä
on yhdysviiva. Ensimmäinen osa on aina kuusi merkkiä pitkä, ja toisen
osan pituus vaihtelee välillä kahdesta kahdeksaan merkkiä.
Tilinumeron kaksi ensimmäistä merkkiä ilmaisevat tiliä hallinnoivan
pankin tai pankkiryhmän. Tilinumeron viimeinen merkki on tarkiste.
<p>
Tilinumeron konekielinen muoto, eli se muoto, jota ihmisten ei ole
tarkoitus lukea, muodostetaan selväkielisestä muodosta seuraavasti.
<list>
<item>Mikäli tilinumero alkaa <tt/1/, <tt/2/, <tt/31/, <tt/32/,
<tt/33/, <tt/34/, <tt/35/, <tt/6/ tai <tt/8/, tilinumero täydennetään
vasemmalta lukien kuuden numeron jälkeen siten, että 14 numeroa
täyttyy.
<item>Mikäli tilinumero alkaa <tt/4/ tai <tt/5/, tilinumero
täydennetään vasemmalta lukien seitsemännen numeron jälkeen siten,
että 14 numeroa täyttyy.
</list>
Esimerkiksi tilinumerot <tt/123456-785/ ja <tt/12345600000785/
merkitsevät samaa tiliä, ja tilinumerot <tt/432456-781/ ja
<tt/43245670000081/ merkitsevät samaa tiliä.
<p>
Tilinumeron tarkiste lasketaan tilinumeron konekielisen muodon 13
ensimmäisestä merkistä vasemmalta lukien. Kukin numeromerkki
kerrotaan painoarvolla 2 tai 1 siten, että oikeanpuolimmaisin
kerrotaan painolla 2 ja vierekkäiset merkit kerrotaan eri painolla.
Näiden tulojen numeromerkkien summa vähennetään pienimmästä kyseistä
summaa suuremmasta, kymmenellä jaollisesta luvusta. Tämä erotus on
tilinumeron tarkiste, joka merkitään tilinumeron viimeiseksi eli
14. merkiksi.
<sect>Miten henkilötunnus muodostetaan?
<p>
Suomalaisen henkilötunnuksen muoto on määrätty väestötietoasetuksen 2
pykälässä (<url id="http://www.finlex.fi/" name="Finlex-säädöskokoelman">
numero 886/1993 muutettu 84/1997).
<p>
Henkilötunnus
(aiemmin sosiaaliturvatunnus) koostuu syntymäajasta,
vuosisatamerkistä, tunnusluvusta ja tarkistemerkistä. Niinpä se on
muotoa PPKKVVCNNNT. Kaikki nollat tulostetaan.
<p>
Vuosisatamerkki (C) on <tt/-/ 1900-luvulla ja <tt/+/ 1800-luvulla
syntyneillä. 2000-luvulla (tarkkaan ottaen 1.1.2000 ja sen jälkeen)
syntyneiden henkilötunnuksissa käytetään isoa A-kirjainta. <em/Huomaa,
että henkilötunnuksessa ei ole automaattisesti viivaa välissä/; kaikki
ohjelmat, jotka olettavat henkilötunnuksen olevan muotoa
<tt/111111-1111/, hajoavat 2000-luvulla.
<p>
Tunnusluku (NNN) on kolminumeroinen luku, joka on miehillä pariton ja
naisilla parillinen. Tunnusluku on harvoin kovin suuri.
<p>
Tarkistemerkki (T) lasketaan siten, että syntymäaika ja tunnusluku
yhdistetään yhdeksi 9-merkkiseksi luvuksi, joka on siis muotoa
PPKKVVNNN. Tämä luku jaetaan 31:llä. Jakojäännöksen perusteella
valitaan tarkistemerkiksi yksi merkeistä
<tt/0123456789ABCDEFHJKLMNPRSTUVWXY/ siten, että jaon mennessä tasan
tarkistemerkki on 0, jakojäännöksen ollessa yksi se on 1 jne. Jos siis
jakojäännös on 30, on tarkistemerkkinä kirjain Y.
<p>
Olen kirjoittanut <url name="C-kielisen ohjelman"
id="http://www.iki.fi/jautero/faq/hetu.c">, joka tarkastaa
henkilötunnuksen oikeellisuuden.
<p>
<url name="Lars Wirzenius" id="http://www.iki.fi/liw/"> on
kirjoittanut <url name="Python-skriptin" id="http://liw.iki.fi/liw/download/tee-hetu.py">, joka generoi
henkilötunnuksia annetuista päivämääristä.
<sect>Miten LY-tunnus muodostetaan?
<p>
LY-tunnuksen muoto on määrätty asetuksessa liike- ja
yhteisötunnuksesta (598/1991). Asetuksen teksti on saatavissa myös
verkosta <url id="http://www.finlex.fi/" name="Finlex-säädöskokoelman">
kautta. Seuraava kappale on melko suoraa lainausta asetustekstistä (4 §).
<p>
Liike- ja yhteisötunnuksen muodostavat järjestysnumero ja tarkistusnumero
mainitussa järjestyksessä. Järjestysnumero on enintään
seitsemännumeroinen. Tarkistusnumeron laskemiseksi kerrotaan oikealta vasemmalle lukien
järjestysnumeron
<list>
<item>ensimmäinen numero luvulla 2,
<item>toinen numero luvulla 4,
<item>kolmas numero luvulla 8,
<item>neljäs numero luvulla 5,
<item>viides numero luvulla 10,
<item>kuudes numero luvulla 9,
<item>seitsemäs numero luvlla 7
</list>
lasketaan näin saadut tulot yhteen ja jaetaan summa luvulla 11.
Tarkistusnumero määräytyy jakolaskun jakojäännöksen perusteella
seuraavasti: jos jakojäännös on nolla, on tarkistusnumero nolla. Jos
jakojäännös on suurempi kuin yksi, on tarkistusnumero erotus, joka
saadaan vähentämällä jakojäännös luvusta 11. Jos jakojäännös on yksi,
jätetään tarkistusnumeroa vastaava järjestysnumero käyttämättä.
<p>
Selvennykseksi mainittakoon, että minkään oikeellisen ly-tunnuksen
jakojäännös ei voi olla yksi.
<chapt>Euroopan yhteisvaluutta euro
<sect>Miten muutan markat (tai kruunut tai ...) euroiksi ja takaisin?
<p>
Euron ja siihen sidottujen kansallisten valuuttojen välillä tai näiden
kansallisten valuuttojen kesken saa tehdä muutoksia vain tiettyjen
sääntöjen mukaisesti. Nämä säännöt on asetettu <url name="Neuvoston
asetuksessa (EY) numero 1103/97"
id="http://europa.eu.int/eur-lex/fi/lif/dat/1997/fi_397R1103.html">.
Säännöt ovat seuraavat:
<p>
Euron ja kansallisten eurovaluuttojen välisissä muuntokursseissa
(jotka on esitetty myöhemmin tässä kirjoitelmassa) on kuusi
merkitsevää numeroa, ja ne ilmaisevat yhden euron arvon kunkin
kansallisen valuutan mukaan. Muuntokursseja ei saa pyöristää, eikä
niitä saa lyhentää. Ei ole myöskään sallittua käyttää kurssin
pyöristettyä käänteislukua, tai muuntokursseista johdettuja kahden
kansallisen valuutan välisiä kursseja. Muunnoksen välituloksena
käytettävä euromääräinen rahasumma saadaan pyöristää vähintään kolmen
desimaalin tarkkudelle.
<p>
Muunnokset on siis tehtävä seuraavasti:
<list>
<item>Euro muutetaan kansalliseksi valuutaksi kertomalla euromääräinen
rahasumma muuntokurssilla. Tulos pyöristetään kansallisen valuutan
tavan mukaisesti lähimpään yksikköön, alayksikköön tai jomman kumman
kerrannaiseen tai murto-osaan. Esimerkiksi markkamääräinen tulos
voidaan tilanteesta riippuen pyöristää joko penneiksi tai kymmeniksi
penneiksi. Näin esimerkiksi 5 euroa on 5 * 5,94573 Suomen markkaa eli
asianmukaisesti pyöristettynä 29 markkaa ja 70 penniä.
<item>Kansallinen valuutta muutetaan euroiksi jakamalla rahasumma
muuntokurssilla. <strong/Ei ole luvallista kertoa muuntokurssin
käänteisluvulla/, mikäli pyöristysvirheet ovat mahdollisia. Saatu
rahasumma pyöristetään ylös- tai alaspäin lähimpään senttiin.
Esimerkiksi 20 Suomen markkaa on 20 / 5,94573 euroa eli
asianmukaisesti pyöristettynä kolme euroa ja 36 senttiä.
<item>Kansallinen euroalueen valuutta muunnetaan toiseksi
kansalliseksi euroalueen valuutaksi käymällä euron kautta.
Euromääräinen välitulos saadaan pyöristää vähintään kolmen desimaalin
tarkkuudelle. Esimerkiksi 100 Suomen markkaa on 100 / 5,94573 =
16,819 euroa ja siis 16,819 * 1,95583 Saksan markkaa eli
asianmukaisesti pyöristettynä 32,90 Saksan markkaa.
</list>
Muita menetelmiä saadaan käyttää vain, jos ne antavat täsmälleen saman
tuloksen kuin tässä mainitut.
<sect>Kansallisten eurovaluuttojen ja euron väliset muuntokertoimet
<p>
Seuraavia muuntokertoimia tulee käyttää muunnettaessa kansalliset
eurovaluutat euroiksi ja päinvastoin:
<list>
<item>
1 EUR = 40.3399 BEF
</item>
<item>
1 EUR = 1.95583 DEM
</item>
<item>
1 EUR = 166.386 ESP
</item>
<item>
1 EUR = 6.55957 FRF
</item>
<item>
1 EUR = .787564 IEP
</item>
<item>
1 EUR = 1936.27 ITL
</item>
<item>
1 EUR = 40.3399 LUF
</item>
<item>
1 EUR = 2.20371 NLG
</item>
<item>
1 EUR = 13.7603 ATS
</item>
<item>
1 EUR = 200.482 PTE
</item>
<item>
1 EUR = 5.94573 FIM
</item>
</list>
Lähde: Euroopan unionin sivu "Euro Conversion Rates"
<url id="http://europe.eu.int/eurobirth/rates.txt" name="(txt)"> ja
<url id="http://europe.eu.int/eurobirth/rates.html" name="(html)">.
<p>
Muuntokertoimet eivät riitä oikean muutoksen tekemiseksi. Tarkat
ohjeet on mainittu edellä.
<chapt>Päiväykseen liittyviä algoritmeja
<sect>Yleistä ja pari kalenterikirjastoa
<p>
Vaikka monet päiväykseen liittyistä algoritmeista ovatkin
kansainvälisiä, käsittelen osaa niistä tässä. Koska Suomi ja
Yhdysvallat laskevat kalenterinsa hieman eri tavoin, emme voi odottaa,
että pääasiassa yhdysvaltalaiset faqinkokoajat osaisivat vastata
suomalaisten kannalta oikein.
<p>
Itse asiassa huomasin etsiessäni tähän dokumenttiin vastauksia, että
osaa päiväysalgoritmeista ei ole oikeastaan ollenkaan käsitelty
kansainvälisissä FAQ:eissa. Niissäkin, joissa näitä harvoin
käsiteltyjä kysymyksiä on käsitelty, on kokoaja sanonut, että hänellä
ei ole hajuakaan, onko hänen antamansa vastaus oikea.
<p>
Riku Meskanen <email/[email protected]/ on kirjoittanut C-kielisen
kalenterikirjaston. Kirjasto on GNU General Public Licensen alainen ja
on saatavissa <url id="ftp://ftp.jyu.fi/private/mesrik/"
name="FTP:llä"> sekä <tt/tar.gz/- että <tt/zip/-tiedostona.
<p>
Steffen Beyer <email/[email protected]/ on kirjoittanut Perl-modulin
<tt/Date::DateCalc/, joka sisältää yksinkertaisia päiväykseen
liittyviä rutiineja. Minulla ei ole kokemuksia sen
toimivuudesta. Modulin voi hakea CPAN-mirroreista esimerkiksi
hakemistosta <tt>modules/by-module/Date</tt>.
<sect>Miten määritän annetun päivän viikkonumeron?
<p>
Tähän kysymykseen annetaan huomattavasti enemmän vääriä kuin oikeita
vastauksia. Seuraava on yritetty varmistaa oikeaksi, mutta takuita en
anna.
<p>
Toisin kuin esimerkiksi Yhdysvallat, Suomi numeroi viikkonsa
kansainvälisen ISO 8601 -standardin mukaisesti. Lisää yleistä tietoa
tästä standardista saa Jukka Korpelan kirjoittamasta jutusta <url
name="ISO 8601, the date and time representation standard"
id="http://www.malibutelecom.com/yucca/iso8601.html">. Standardi otettiin
käyttöön Suomessa vuonna 1973. Sen mukaan:
<list>
<item>viikon ensimmäinen päivä on maanantai; ja
<item>vuoden ensimmäinen viikko (viikko 1) on se viikko, johon kuuluu
vuoden ensimmäinen torstai.
</list>
Tästä seuraa muutama viikkonumeron laskemista vaikeuttava asia. Kaksi
tärkeintä lienevät se, että tammikuun 1. päivä ei välttämättä kuulu
vuoden ensimmäiseen viikkoon, ja se, että vuodessa on vuodesta
riippuen joko 52 tai 53 viikkoa.
<p>
<url id="http://www.tondering.dk/claus/calendar.html"
name="Calendar FAQ:in"> (osa 3, kysymys 5.6) mukaan 53 viikkoa on
kaikissa vuosissa, jotka alkavat torstaina, sekä lisäksi
karkausvuosissa, jotka alkavat keskiviikkona. Muissa on 52 viikkoa.
<p>
Niinpä kohtuullisen yksinkertainen algoritmi on seuraavanlainen
(mukailtu edellämainitussa Riku Meskasen <email/[email protected]/
kalenterikirjastossa olevan toteutuksen pohjalta):
<enumlist>
<item>Laske, montako päivää on kulunut vuoden alusta (jos annettu
päivä on tammikuun ensimmäinen, vastaus on 0). Lisää tähän 0, jos
tammikuun 1. on maanantai, 1, jos tammikuun ensimmäinen on tiistai jne.
Jaa vastaus seitsemällä ja ota osamäärästä huomioon vain kokonaiset;
tämä on ensimmäinen arvaus viikkonumerkoksi.
<item>Jos vuosi on alkanut maanantaina, tiistaina, keskiviikkona tai
torstaina, lisää arvaukseen yksi.
<item>Jos tulos on välillä 1-52, se kelpaa viikkonumeroksi
mutta jos tulos on nolla, niin:
<list>
<item>Jos edellinen vuosi on alkanut torstaina, tai se on ollut
karkausvuosi ja alkanut keskiviikkona, viikkonumero on
todellisuudessa 53.
<item>Muussa tapauksessa todellinen viikkonumero on 52.
</list>
jos tulos on 53, niin päätellään edellisen kohdan mukaisesti, onko
vuodessa oikeasti 53 viikkoa:
<list>
<item>Jos kuluva vuosi on alkanut torstaina, tai se on ollut
karkausvuosi ja alkanut keskiviikkona, viikkonumero on
todellisuudessa 53.
<item>Muussa tapauksessa kyseessä on seuraavan vuoden 1. viikko ja
viikkonumero on 1.
</list>
</enumlist>
Seuraavassa C-ohjelmanpätkässä oleva weekno()-funktio laskee annetulle
päivälle (d = päivä 1 - 31, m = kuukausi 1 .. 12 ja y = vuosi)
viikkonumeron. Se on Tapani Tarvaisen <email/[email protected]/
käsialaa.
<p>
<example>
int julian(int d, int m, int y)
{
int n1, n2;
n1 = 12*y+m-3;
n2 = n1/12;
return (734*n1+15)/24-2*n2+n2/4-n2/100+n2/400+d+1721119;
}
int weekno(int d, int m, int y)
{
int n1, n2, w;
n1 = julian(d, m, y);
n2 = 7*(n1/7)+10;
y = y+1;
while ((w = (n2-julian(1,1,y))/7) <= 0) {
y = y-1;
}
return w;
}
</example>
<p>
Monet ohjelmointivälineet ja käyttöjärjestelmät tarjoavat välineitä
viikkonumeron laskemiseen. Ohjelmoijan on oltava kuitenkin tarkkana
siitä, että hän käyttää työkaluja, jotka laskevat oikean maan
viikkonumeroita - oikein. <tt/:-)/
<chapt>Muuta luettavaa
<p>
Tämän artikkelin sisälmys on tarkoituksella rajattu ahtaasti, sillä
maailmalla on runsaasti hyvää (ja toki myös asiantuntematonta)
materiaalia, joka vastaa useimpiin kysymyksiin. Tässä annetaan
vihjeitä hyviksi aloituspaikoiksi. Lisää, itse asiassa aivan liikaa
vastauksia ohjemoinnista usein esitettyihin kysymyksiin on <url
name="FAQ-arkistossa" id="http://www.faqs.org/faqs/">. Katsele
erityisesti <tt/comp/-hierarkian FAQeja.
<sect>Kirjallisuutta
<p>
Vesa Lappalainen on koonnut <url name="seittisivulleen"
id="http://www.mit.jyu.fi/vesal/kurssit/kirjallisuutta.html">
arvioita ohjelmointiin yleensä ja erityisesti graafisiin
käyttöliittymiin, olio-ohjelmointiin, C++-kieleen ja Delphiin
liittyvistä kirjoista. Tuolla sivulla on myös linkkejä Lappalaisen
kirja-arvosteluihin.
<sect>Ohjelmointikielet
<p>
Tärkein verkosta saatavissaa oleva C-ohjelmointikieleen liittyvä
kirjoitus on <url name="C-FAQ"
id="http://www.eskimo.com/~scs/C-faq/top.html">. Jukka Korpela on
myös koonnut <url name="Tietoa C-ohjelmointikielestä (ja C++:sta) Internetissä"
id="http://www.malibutelecom.com/yucca/Cinfo.html">.
<p>
Bjarne Stroustrupin kehittämään C++-kieleen liittyvää materiaalia
löytyy kasapäin keksijän itsensä kokoaman <url name="seittisivun"
id="http://www.research.att.com/~bs/C++.html"> kautta. Erityisesti
mainittakoon <url name="C++-FAQ Lite"
id="http://www.parashift.com/c++-faq-lite/"> sekä <url
name="SGI:n Standard Template Library Programmer's Guide"
id="http://www.sgi.com/tech/stl/">.
<p>
Java-kielestä on olemassa <url name="FAQ-lista"
id="http://www.afu.com/intro.html">. Muutakin Java-materiaalia on
<url name="seitissä" id="http://www.afu.com/">.
<p>
Pascal-kielen Borland-murteisiin (poislukien Delphi) liittyviä
tekstejä löytyy <url name="mini-FAQ:n"
id="http://www.faqs.org/faqs/pascal/borland-minifaq/"> kauttta.
<p>
Perl-materiaalia on <url name="The Perl Instituten seittisivulla"
id="http://www.perl.org">. Lisäksi on saatavilla
<url name="Perl-FAQ" id="http://www.faqs.org/faqs/perl-faq/part0/">.
Jukka Korpela on tehnyt itse materiaalia ja kerännyt linkkejä
Perl-kielestä sekä
<url name="suomeksi" id="http://www.malibutelecom.com/yucca/perl/linkit.html"> että
<url name="englanniksi" id="http://www.malibutelecom.com/yucca/perl/">.
<p>
Python-kielen <url name="seittisivusto" id="http://www.python.org/">
on olemassa. Jukka Korpela on koonnut
<url name="Perustietoa Python-ohjelmointikielestä suomeksi"
id="http://www.malibutelecom.com/yucca/python/">.
<p>
<url name="Visual Basic FAQ"
id="http://www.thebestweb.com/vbfaqs/"> on.
<p>
Lisp-kielestäkin on <url name="FAQ-lista"
id="http://www.cs.cmu.edu/Groups/AI/html/faqs/lang/lisp/top.html"> sekä
<url name="käyttäjäyhdistys" id="http://www.lisp.org/"> (The Association
of Lisp Users),
ja Schemellä on <url id="http://www.niksula.cs.hut.fi/~candolin/scheme/"
name="Suomessa fanisivusto">, jossa on erinomainen linkkilista.
<p>
Haskell-kielellä on <url name="seittisivusto" id="http://www.haskell.org/">.
<p>
Jukka Korpela on koonnut <url name="Tietoa Fortran-ohjelmointikielestä Internetissä" id="http://www.malibutelecom.com/yucca/Fortran.html">.
<sect>Käyttöjärjestelmät
<p>
Microsoftin käyttöjärjestelmistä tietoa löytyy kasapäin ympäri
verkkoa. Parhaan tuloksen saa etsimällä kysymykseensä vastausta
suosikkihakurobotillaan ja lisäksi <url name="Googlen
keskusteluarkistoista" id="http://groups.google.com/">.
MS-DOS-ohjelmoinnin kysymyksiin vastaillaan <url name="FAQ-listassa"
id="http://www.faqs.org/faqs/msdos-programmer-faq/part1/preamble.html">.
Windows-ohjelmointiin sopiva lähtöpaikka lienee <url
id="http://msdn.microsoft.com" name="Microsoftin oma
ohjelmointiportaali">.
<p>
Macintosh-ohjelmoinnista on <url name="FAQ-lista"
id="http://www.faqs.org/faqs/macintosh/programming-faq/">.
<p>
Unix-ohjelmoinnistakin on <url name="FAQ-lista"
id="http://www.erlenstar.demon.co.uk/unix/faq_toc.html">
<sect>Standardit ja muut normit
<p>Standardeista, normeista ja "teollisuusstandardeista" yleisesti
kertoo Jukka Korpelan kirjoitus <url name="Standardi, mikä se on?"
id="http://www.malibutelecom.com/yucca/stand.html">.
<p>Suomen aakkostamista käsittelee SFS-standardi 4600. Asiasta on
luettavissa
<url name="lehdistötiedote" id="http://www.sfs.fi/standard/20000619.html">.
Jukka Korpela on kirjoittanut seittisivun <url name="aakkostuksesta Suomessa"
id="http://www.cs.tut.fi/~jkorpela/abc.html">.
<p>Euroopan standardointijärjestö
<url name="CEN" id="http://www.cenorm.be/default.htm">
on julkaissut eräitä epävirallisiksi mutta merkittäviksi normeiksi
luonnehdittavissa olevia sopimuksia, ns.
<url name="CWA:ita (CEN Workshop Agreement)"
id="http://www.cenorm.be/isss/CWAs/cwalist.htm">.
Niissä mm. käsitellään sitä, miten erilaiset kieli- ja
kulttuuririippuvuudet tulisi ottaa huomioon tietokoneohjelmien
suunnittelussa sekä mikä on yleiseurooppalaisiin yhteyksiin sopiva
käytäntö päiväysten, rahamäärien yms. esittämiseen eli
ns. pan-European locale.
<chapt>Kommentteja halutaan
<p>
Tätä kirjoitelmaa ylläpitää Juha Autero.
<email/[email protected]/.
Korjauksia, lisäyksiä ja muuta sellaista otetaan vastaan.
<p>FAQ:n ylläpitäjä tarvitsee avustajia! Jos olet kiinnostunut, ota yhteyttä
ylläpitäjään <email/[email protected]/.
<chapt>Kiitokset
<p>
Seuraavat ihmiset ovat auttaneet minua tämän kirjoitelman kokoamisessa
palautteellaan, kokemuksellaan, tiedoillaan ja ehdotuksillaan. Suuri
kiitos heille kaikille.
<list>
<item>Juha Antila
<item>Jaakko Haakana
<item>Martti Halminen
<item>Jonne Itkonen
<item>Jukka Korpela
<item>Jouko Koski
<item>Jarno Käyhkö
<item>Jani Lahti
<item>Jukka Lahtinen
<item>Tero Lahtinen
<item>Sami J. Laine
<item>Vesa Lappalainen
<item>Jari Lehtonen
<item>Ville Lehtonen
<item>Veli-Pekka Lehtosaari
<item>Tor Lillqvist
<item>Teemu Luojola
<item>Riku Meskanen
<item>Jori Mäntysalo
<item>Markku Nevalainen
<item>Kimmo Pyykkö
<item>Juha-Heikki Ruismäki
<item>Rauli Ruohonen
<item>Kimmo Surakka
<item>Tapani Tarvainen
<item>Mikko Vierula
<item>Teppo Vuori
<item>Lars Wirzenius
<item>Miika Åsten
</list>
</book>