C言語の関数定義

 いわゆる数学的な関数を定義したり、決まった手続きを何度も行う場合は、関数を定義することが有効な手段です。
 今回の演習では、関数をうまく定義する事で、小さくきれいなソースコードを書く練習をしましょう。

演習課題1

 教科書(プログラミング言語C)P30、べき乗を計算するプログラムのソースコードを入力し、コンパイル&実行せよ。
 このプログラムは 2i(-3)ii=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
%

演習課題2

演習問題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) を作るのは簡単ではない。 興味のある人は、微積分の教科書を調べて考えてみよう。

演習課題3

 与えられた整数型変数 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;
}


演習課題4

 演習課題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  @@@@@@@@@@@@@@@@@@@@

演習課題5

以下のソースコードは、入力された正の整数に対して、その桁数を与える関数 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 % 32 となります。

今日の提出課題

演習課題4について、ソースコードとファイル out.dat を印刷して提出すること。


TOP