14週目

演習の課題(7月19日)
• 11問の内、5問を選択して提出する
こと。
• 全ての課題をやる必要はないが、試験
に出すかもしれません。
• 提出は
http://griffin.cc.nara-wu.ac.jp/
にアクセスして、センターのアカウント
でログインして、レポートを提出して
ください。
1
問題 1
シーザー暗号は文字を3文字ずらすことによって暗号文を作る。
つまり、a をd、bをe、… zをcに変換する。入力した文字列を
シーザ暗号文に変換するプログラムを作成せよ。
% ./a.out
文章を入力:konnnichiwa
暗号文は nrqqqlfklzd
%
この色はプログラムによる出力
2
問題 2
正の整数nに対して、nの約数の和(1を含みnを含まない
約数の和)を返す関数を作れ。これをもとに、1以上
10000以下の友愛数を求めるプログラムを作成せよ。
二つの数nとmについて、nの約数の和がmに等しく、また
mの約数の和がnに等しいとき、nとmを友愛数という。
#include <stdio.h>
int yakusu(int);
main()
{
int i,m,n;
for(i = 1; i < 10000; i++){
m = yakusu(i);
n = yakusu(m);
if(n == i)
printf(“%d and %d は友愛数¥n”, i, m);
}
}
3
問題 3
電気料金が
基本料 320.25円
19.05 円/kWh
15kWhまで
15kWhから120kWh まで
24.21 円/kWh
120kWh から300kWh まで
25.55 円/kWh
300kWh 以上
のように決められているとする。15kWhまでの使用量については、
基本料金のみの一定料金となる。例えば、一ヶ月に400kWh の電力量
を使用した場合の料金は、
19.05 × (120-15) + 24.21 × (300 − 120) + 25.55 × (400 − 300)
となる。(実際には、これに基本料と消費税が加わる。)
基本料金を320.25円、消費税が5%として、電力量を入力して、電
気料金を計算するプログラムを作成せよ。
4
問題 4
定積分によって面積を計算する。y=f(x)と、x=0,x=1,y=0で囲まれた面積は、
f(x)をx=0から1まで定積分することで求められる。これは、積分区間 [0, 1] を
細かく区切り、短冊の面積を合計することで積分を近似して求める事が出来る。
f(x)=√(1-x2) について、面積を求めるプログラムを作成せよ。
int i;
double dx = 0.01, sum = 0;
for(i=0; i<100; i++)
sum += f(i*dx)*dx;
区間幅を dx とする
積分は足し算にほか
ならない
printf(“%f\n”, sum);
5
問題 5
正の実数を入力し平方根を計算するプログラム。ただし、負の実数を
入力した場合は、その旨表示するよう気配りすること。
% ./a.out
% 正の実数を入力せよ: 16
16 の平方根は 4.000 です。
%
%./a.out
% 正の実数を入力せよ: -9
正の実数じゃないとだめ!
%
考え方:
1)変数の入力
2)入力した値の正負の判定:
もし正なら、平方根を計算して表示
そうでなければ、入力エラー表示
if (正)
平方根の計算と表示
else
"正の実数じゃないとだめ"の表示
6
問題 6
キーボードから 10 人の成績(100 点満点の整数値)を配列に読み込み、最高
点、最低点及び 平均点を表示するプログラム
% ./a.out
学籍 No. 0 の成績:80
学籍 No. 1 の成績:70
学籍 No. 2 の成績:95
...
学籍 No. 9 の成績:40
最高点は 100 点です。
最低点は 10 点です。
平均点は 55.3 点です。
%
考え方:
1) 10 人の成績を配列に読み込む。
2) その中で最高点を探し出して表示。
3) 最低点を探し出して表示。
最高点の検索方法
i = 0 として score[i] を仮の最高点 max とする。
i++ として、score[i] と max の大小を比較。
以上を繰り返す。
7
問題 7
下のような模様を出力するプログラムをつくれ。
%./a.out
文字は何にする?#
最大の個数は?5
#####
####
###
##
#
%
空白は5個、# が 5個 + 改行
空白が4個、# が 4 個 + 改行
空白が3個、# が 3 個 + 改行
1)出力する文字を入力
2)繰り返し処理(横方向と縦方向の反復)
一度に 2 重ループを処理しようとしないで、まず最初に横方
向の繰り返し処理を考える。この部分を縦方向の繰り返し処
理で包んでやる。
この色はプログラムによる出力
8
問題 8
ユークリッドの互除法を用いて、入力した 2 つの自然数の最大公約数を求めるプロ
グラムを作れ。
% ./a.out
自然数を2つ入力:54 144
144 と 54 の最大公約数は 18 です。
%
この色はプログラムによる出力
9
問題 9
適当な初期値
の解を求める方法にニュートン法がある。
から始めて、
を順に求めていくと、
は解に近づいていく。
#include <stdio.h>
#include <math.h>
main()
{
double x,y,c;
c = 2.0;
y=1.0;
do {
x = y;
y = (x+c/x)/2.0;
} while(fabs(x-y) > 0.0001);
printf(“sqrt(%lf) = %lf¥n”, c, y);
}
を元にして
プログラムすると、平方根を求める
プログラムが出来る。
同じようにして、与えられた数
の3乗根を求めるプログラムを
作れ。
fabs()はdoubleの絶対値を
求める関数。abs()は整数
の絶対値
10
問題 10
多項式を配列を使って表すことを考える。
例えば、
の場合、大きさ6の配列で
double f[6] = {-3,1,3,0,0,1};
でf(x)を表すことにする。f[0]は0次の係数、f[1]は1次の係数,…。
配列とそのサイズ(多項式の次数+1)と、値a に対して
を計算する関数のプログラムを作成せよ。
関数名はfuncで、プロトタイプは
double func(double a, double f[], int n);
とする。
11
問題 11
3次元での座標ベクトル(x、y、z)を構造体として定義し、
2点間の距離を求める関数をプログラムせよ。
また、この関数を用いて与えられた3点を頂点とする
三角形の面積を求めるプログラムを作成せよ。
ヘロンの公式
12