いわゆる数学的な関数を定義したり、決まった手続きを何度も行う場合は、関数を定義することが有効な手段です。
今回の演習では、関数をうまく定義する事で、小さくきれいなソースコードを書く練習をしましょう。
教科書(プログラミング言語C)P30、べき乗を計算するプログラムのソースコードを入力し、コンパイル&実行せよ。
このプログラムは 2i、(-3)i を i=0,1,...,9 まで計算して印字するものです。
#include <stdio.h> int power(int base, int n); /* べき乗関数をテストする */ main(){ int i; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2,i), power(-3,i)); return 0; } /* power: base を n のべき乗する ; n >=0 */ int power(int base, int n){ int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; }
実行結果
% ./a.out 0 1 1 1 2 -3 2 4 9 3 8 -27 4 16 81 5 32 -243 6 64 729 7 128 -2187 8 256 6561 9 512 -19683 %
演習問題1のプログラムを修正する事で、base と戻り値を float 型にした power 関数を定義し、
2.5i、を i=0,1,...,9 について印字するプログラムを作れ。
実行結果
% ./a.out 0 1.000000 1 2.500000 2 6.250000 3 15.625000 4 39.062500 5 97.656250 6 244.140625 7 610.351562 8 1525.878906 9 3814.697266(コメント) 指数も実数型にしたベキ乗関数 float power(float base, float n) を作るのは簡単ではない。 興味のある人は、微積分の教科書を調べて考えてみよう。
与えられた整数型変数 n に対して n個の '@' 記号を印字する関数 hist(int n)
を以下の様に定義した。
void hist(int n){ int i; for (i=0;i < n; i++) putchar('@'); }
(ここで戻り値の型が void となっていますが、これは「戻り値の無い関数」を意味します。)
これを利用して、以下の様な出力が得られるプログラムを作りなさい。
@ @@ @@@ @@@@ @@@@@ @@@@@@ @@@@@@@ @@@@@@@@ @@@@@@@@@ @@@@@@@@@@
ヒント:以下のプログラムは @ を10個印字するものです.これを参考にしてください.
#include <stdio.h> void hist(int n){ int i; for (i=0;i < n; i++) putchar('@'); } main() { hist(10); return 0; }
演習課題3と前回の演習課題4
を組み合わせることによって、
入力文字の中から各数字 '0'~'9' の出現回数に応じて '@' を印字することで、
出現回数を表す棒グラフを印字するプログラムを作れ。
また実行テストとしてファイル /homer/pl/tea/kht23151/Examples/gnuplot/sample.gpl を入力し、結果をファイル out.dat として
出力せよ。
完成予定図(実際は値が少し違います)
% cat out.dat 数 個数 グラフ 0 18 @@@@@@@@@@@@@@@@@@ 1 21 @@@@@@@@@@@@@@@@@@@@@ 2 29 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3 14 @@@@@@@@@@@@@@ 4 11 @@@@@@@@@@@ 5 14 @@@@@@@@@@@@@@ 6 13 @@@@@@@@@@@@@ 7 15 @@@@@@@@@@@@@@@ 8 16 @@@@@@@@@@@@@@@@ 9 20 @@@@@@@@@@@@@@@@@@@@
以下のソースコードは、入力された正の整数に対して、その桁数を与える関数 int dnum(int n) と、
m桁目の位の数を与える関数 int pnum(int n, int m) を定義し、
整数「1234」の桁数と各桁の数を印字するものである。
これを利用して、与えられた正の整数を漢数字にして表示する関数を定義し、
「1234」を漢数字として「千二百三十四」と表示させるプログラムを作りなさい。
#include <stdio.h> int dnum(int n); /* 整数 n の桁数を与える関数 */ int pnum(int n, int m); /* 整数 n の m 桁目の位の数を与える関数 */ main(){ int i; printf("%d \n",dnum(1234)); for(i=1;i<=dnum(1234);i++) printf("%d 桁目は %d\n",i,pnum(1234,i)); } int dnum(int n){ int i; i=1; while((n=n/10) > 0) i++; return i; } int pnum(int n, int m){ m--; while(m > 0){ n = n /10; m--; } return n % 10; }
ヒント '1'~'9' までの整数が与えられたら、それに対応する漢数字を出力する関数を作っておくと、少し簡単になります。
void printKS(int n){ if(n==1) printf("一"); else if(n==2) printf("二"); ... else if(n==9); printf("九"); }
演算子 % は、整数の割算をした余りを与えます。例えば、5 % 3 は 2 となります。
演習課題4について、ソースコードとファイル out.dat を印刷して提出すること。