いわゆる数学的な関数を定義したり、決まった手続きを何度も行う場合は、関数を定義することが有効な手段です。
今回の演習では、関数をうまく定義する事で、小さくきれいなソースコードを書く練習をしましょう。
教科書(プログラミング言語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 を印刷して提出すること。