実例3 (Fizz Buzz)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/17 23:55 UTC 版)
「COBOL」の記事における「実例3 (Fizz Buzz)」の解説
000100 IDENTIFICATION DIVISION.000200 PROGRAM-ID. FIZZBUZZ.000300 DATA DIVISION.000400 WORKING-STORAGE SECTION.000500 01 I PIC 9(3).000600 PROCEDURE DIVISION.000700 PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100000800 EVALUATE FUNCTION MOD(I 3) = ZERO000900 ALSO FUNCTION MOD(I 5) = ZERO001000 WHEN TRUE ALSO TRUE001100 DISPLAY 'FIZZBUZZ'001200 WHEN TRUE ALSO FALSE001300 DISPLAY 'FIZZ'001400 WHEN FALSE ALSO TRUE001500 DISPLAY 'BUZZ'001600 WHEN OTHER001700 DISPLAY I(3 - FUNCTION INTEGER(FUNCTION LOG10(I)):)001800 END-EVALUATE001900 END-PERFORM.002000 STOP RUN. 出力 12FIZZ4BUZZFIZZ78FIZZBUZZ11 (中略)FIZZBUZZ9192FIZZ94BUZZFIZZ9798FIZZBUZZ COBOLでは剰余を求める際に、商・剰余それぞれを格納する変数を定義した上でDIVIDE文を用いることが多いが、商は不要で剰余のみが知りたい場合や、それを変数に格納しておく必要が無い場合は、組み込み関数のMODを用いても良い。 また、COBOLの数字項目は定義された桁数よりも少ない桁数の値が格納された場合、ゼロパディングした状態で扱うため、このまま表示させると001、002、…、098と先頭に0が補われて表示されてしまう。 N {\displaystyle N} 桁で定義された数字項目に、正の整数 n {\displaystyle n} が格納された場合、その最上位桁の位置は左から N − ⌊ log 10 n ⌋ {\displaystyle N-\left\lfloor \log _{10}n\right\rfloor } カラム目であるから、上記のようにDISPLAY I(3 - FUNCTION INTEGER(FUNCTION LOG10(I)):)と記述することで、パディングされた0を除いた部分だけを表示させることが出来る。 なお、0、負の数、小数を扱う場合は、下記のように数字編集項目によるゼロサプレスとUNSTRING文を組み合わせることでパディングされた0を除いて表示させることが出来る。 000100 IDENTIFICATION DIVISION.000200 PROGRAM-ID. FIZZBUZZ.000300 DATA DIVISION.000400 WORKING-STORAGE SECTION.000500 01 I PIC S9(3).000600 01 HENSHU-IKI PIC X(4).000700 01 HENSHU-NUM REDEFINES HENSHU-IKI PIC ---9.000800 01 DUMMY-IKI PIC X(1).000900 PROCEDURE DIVISION.001000 PERFORM VARYING I FROM -100 BY 1 UNTIL I > 100001100 EVALUATE FUNCTION MOD(I 3) = ZERO001200 ALSO FUNCTION MOD(I 5) = ZERO001300 WHEN TRUE ALSO TRUE001400 DISPLAY 'FIZZBUZZ'001500 WHEN TRUE ALSO FALSE001600 DISPLAY 'FIZZ'001700 WHEN FALSE ALSO TRUE001800 DISPLAY 'BUZZ'001900 WHEN OTHER002000 COMPUTE HENSHU-NUM = I002100 UNSTRING002200 HENSHU-IKI DELIMITED BY ALL SPACE002300 INTO DUMMY-IKI HENSHU-IKI002400 END-UNSTRING002500 DISPLAY HENSHU-IKI002600 END-EVALUATE002700 END-PERFORM.002800 STOP RUN. COBOLの数字編集項目によるゼロサプレスは、単純に0を空白に置き換えるだけであるから、先頭に空白が生じる(=整数部分が右寄せになる)。ゼロサプレスを行い更に先頭の空白も除去したい(=左寄せにしたい)場合は、空白を区切り文字に指定してUNSTRING文を用いれば良い。上記の例では、UNSTRING文実行後の変数DUMMY-IKIには常に空白が入り(対象の文字列がいきなり空白=区切り文字から始まり、その前には何も無いため、何も入らない=空白が入る)、変数HENSHU-IKIには数字の部分だけが入る。
※この「実例3 (Fizz Buzz)」の解説は、「COBOL」の解説の一部です。
「実例3 (Fizz Buzz)」を含む「COBOL」の記事については、「COBOL」の概要を参照ください。
- 実例3のページへのリンク