10週目 課題

問題 1
正の実数を受け取り、小数部分のみを取り出す関数を定義して、以下の動作
をするプログラムを作れ。
ヒント:int 型の変数に double 型の値を代入すると小数点以下が
切り捨てられることを用いよ。
% ./a.out
正の実数を入力: 5.1234
小数部分は 0.1234 です。
%
main 文はすでに完成している。関数 my_function を完成せよ。
double my_function(double);
main()
{
double input, output;
printf(“正の実数を入力:);
scanf(“%lf”, &input);
output = my_function(input);
printf(“小数部分は %f です\n”, output);
}
1
問題 2
成績(100点満点の整数値)を受け取り、秀、優、良、可、不可、を出力する
関数を定義して、以下の動作をするプログラムを作れ。
100~90 : 秀
89 ~ 80 : 優
79 ~ 70 : 良
69 ~ 60 : 可
59 ~ 0 : 不可
% ./a.out
成績を入力:90
貴方の成績は秀です。
%
main 文の骨格はすでに完成している。
関数 hantei を定義せよ。
void hantei(int);
main()
{
int score;
printf(“成績を入力:”);
scanf(“%d”, &score);
hantei(score);
}
関数 hantei は成績を引数として受け取り、上記の判定
にしたがって、秀・優・良・可・不可を表示する。
(返却値無し)
2
問題 3
正の整数を受け取り、それが素数であれば 1 (int) を、素数でなければ 0 (int) を返
却値として返す関数 prime を完成させよ。正の整数でなければ−1を返す様にする。
% ./a.out
正の整数を入力:13
13 は素数です
%
main 文の骨格部分はすでにでき上がっている。
int prime(int);
関数 prime は整数値の引数を
main()
受け取る。返却値は int 0 もし
{
くは 1,-1 である。
int i,r
scanf(“%d”, &i);
r = prime(i);
if( r == 1 )
printf(“%d は素数です\n”, i);
else if(r == 0)
printf(“%d は素数ではない\n”, i);
else
printf(“%d は正の整数でありません。\n”, i);
}
3
問題 4
正の整数nを受け取り、1以上n未満のnの約数の和を求める関数
int yakusuu(int n)
を定義せよ。これを使って、友愛数を求めるプログラムを作成せよ。
2 つの自然数について、
% ./a.out
片方の約数(自分自身は
220 の友愛数は 284 です。
除く)の和が、他方の約数
1184 の友愛数は 1210 です。
(同じく自分自身は除く)の
2620 の友愛数は 2924 です。
和に等しくなるとき、これら
5020 の友愛数は 5564 です。
2 つの自然数は友愛数の
...
関係にあるという。
%
int yakusuu(int);
main()
{
int i, j;
for(i = 1; i < 100000; i++) {
j = yakusuu(i);
if (j > i && i == yakusuu(j))
printf(“%dの友愛数は%dです\n”, i、j);
}
}
4
問題 5
gnuplot 等の視覚化ツールを用いて次の関数をグラフに描け。
z = f(x, y) = cos(x2 + y2)/(1+x2+y2) –4 ≤ x ≤ 4, –4 ≤ y ≤ 4
2 次元平面上の点 (x, y) の高さが z = f(x, y) で与えられる 3 次元空間内の曲面。
2 つの引き数をもつ関数を自分で定義して次の形式で出力する。
% ./a.out
-4.000000 -4.000000 0.025279
-4.000000 -3.900000 0.030390
-4.000000 -3.800000 0.017824
....
% ./a.out > data
% gnuplot
...
gnuplot > splot "data"
gnuplot > quit
%
x, y, z の形式で出力(スペースで区切って出
力)
リダイレクションで計算結果をファイルへ書き込む。
gnuplot からデータファイルを読み込み視覚化する。
5
gnuplotによるグラフ描画
gnuplotはグラフを描画するソフトで、二次元、三次元の
グラフを描く事が出来る。
% gnuplot
二次元グラフの描画
gnuplot > plot "data”
gnuplot >splot “ data2”
三次元グラフの描画
gnuplot>set isosamples 100
gnuplot>splot [-4:4][-4:4]cos(x*x+y*y)/(1+x*x+y*y)
gnuplot > quit
標本点の数を100に設定
%
6