問題 1 シーザー暗号は文字を3文字ずらすことによって暗号文を作る。 つまり、a をd、bをe、… zをcに変換する。入力した文字列を シーザ暗号文に変換するプログラムを作成せよ。 % ./a.out 文章を入力:konnnichiwa 暗号文は nrqqqlfklzd % この色はプログラムによる出力 1 問題 2 フィボナッチ数列 xn は次で定義される。 1000 以下のフィボナッチ数を全て表示するプログラムを作れ。n 番目のフィボ ナッチ数を返す関数 int fibonacci(int n) を定義して用いよ。 int fibonacci(int); main() { int i=1, f; while( (f=fibonacci(i)) < 1000 ){ printf("%d\n", f); i++; } } 2 問題 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%として、電力量を入力して、電 気料金を計算するプログラムを作成せよ。 3 問題 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); 4 問題 2 学生のデータを扱う為の構造体を定義せよ。この構造体の値を設定する ための入力関数read_dataと出力する関数write_dataを作れ。 データは各自適当に決めてよい。名前は、文字型の配列とし、サイズは20文字 にする。 ./a.out 名前は: kako fujio 学籍番号は: 999999 年齢:20 #include <stdio.h> 身長:163.4 struct student { 体重:72.5 必要な変数を定義; 登録データ }; kako fujio 999999 main() 20歳 { 163.4 cm struct student s; 72.5kg read_data(&s); printf(“登録データ\n”); write_data(s); } 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
© Copyright 2024 ExpyDoc