Ex07

From Prog0

Jump to: navigation, search

演習第7回

Contents

演習問題

主な内容

  • 配列の定義、初期化
  • 配列の要素と添字
  • 配列への入力
  • 配列要素の条件判定と出力・表示

なお、一人ひとりの授業理解度を確認することを目的として、口頭試問形式による採点を行います。
採点対象の問題が解けたら手を挙げ、教員またはTA/SAを呼んでください。口頭で解答の内容を説明してもらいます。
正しく説明できた場合は点数を付け、説明が不十分な場合はやり直してもらいます(間違えても減点はしません)。
今回の口頭採点の対象は A-1 の1問のみです。 (口頭採点の対象も、その他の問題と同様、menuコマンドで提出してください。)

出席確認

演習時間中に出席確認をLMS上の「演習出欠」で行ってください。出席確認用のパスワードは演習時間のどこかのタイミングで提示されます。


A問題

A-1 (口頭試問) 配列の初期化・表示・エラー

ファイル名: ex07a1.c

以下の仕様を満たすプログラムを作成しなさい。

  • 要素数15のint型の配列arrayを宣言する
    • 宣言時に配列arrayの内容を 1, 5, 12, 19, 23, 31, 36, 40, 44, 51, 55, 63, 78, 85, 90 で初期化する
  • キーボードから整数値を入力させる
  • 入力された値を配列の添字とみなし、その添字をもつ配列の要素を表示する。
    • 例えば、2が入力されたら、「array[2] = 12」と表示する。
  • 続けて、その配列要素が偶数か奇数かを判定して表示する。
  • 入力された値が配列の範囲を越えている場合には「範囲外です!」とエラーを表示する

以下の下線部の空欄を埋めてプログラムを完成させなさい。

#include <stdio.h>

int main()
{
  int array[__] = {1, 5, 12, 19, 23, 31, 36, 40, 44, 51, 55, 63, 78, 85, 90};
  int index;
  
  printf("添字を入力してください: ");
  scanf("%d",&index);
  
  if(___________) {
    printf("array[%d] = %d\n",____,______);
    
    if (_______)
      printf("%dは偶数です。\n",______);
    else
      printf("%dは奇数です。\n",______);
  } 
  else {
    printf("範囲外です!\n");
  }
  
  return 0;
}

[実行例]

% ./a.out
添字を入力してください: 1
array[1] = 5
5は奇数です。
% ./a.out
添字を入力してください: 7
array[7] = 40
40は偶数です。
% ./a.out
添字を入力してください: 12
array[12] = 78
78は偶数です。
% ./a.out
添字を入力してください: 15
範囲外です!
% 

A-2 偶数・奇数の表示

ファイル名: ex07a2.c

実行例にならって次の仕様を満たすような偶数・奇数を表示するプログラムを作成しなさい。

仕様(動作の要件):

  • キーボードから入力された整数値が偶数か奇数かを判定し、それぞれ偶数用配列、奇数用配列に格納する(0は除外)
  • 0が入力されたら、その時点でどちらの個数が多いかを表示した上、多い方の配列の内容を表示する
  • 個数が同じだった場合、同じであることを表示した上、両方の配列の内容を表示する
  • 配列の要素数はそれぞれ100とし、偶数・奇数の数がそれぞれ100個を超えることは無いものとする


実行例 (出力形式を実行例に合わせなくでも良いです)


% ./a.out
1 2 3 4 5 6 7 8 9 0
奇数が多い!!
   1    3    5    7    9
% ./a.out
1 2 3 4 5 6 7 8 0
偶数と奇数が同数
   1    3    5    7
   2    4    6    8
% ./a.out
2 3 4 5 6 7 8 0
偶数が多い!!
   2    4    6    8
%

B問題

B-1 成績一覧の表示

ファイル名: ex07b1.c

7人分の成績の評点(0~100の整数)を入力し、評点と評価(A, B, C, D, F)を一覧表の形式で表示するプログラムを作成しなさい。

  • 評点を配列に入力する
    • 複数の評点を、下の実行例のように、改行くぎりでscanfで入力し配列に格納する場合、for文を利用する方法はハンドアウトLec07-20ページ(プログラム lec07-5.c)を参考のこと
  • 7人分の評点と評価を表示する
  • 評点のエラーチェック(評点が0未満、又は100より大きかった場合の処理)は省略して良い

評点と評価の対応関係は以下のとおり:

  • A : 80以上
  • B : 65以上80未満
  • C : 50以上65未満
  • D : 35以上50未満
  • F : 35未満

実行例

% ./a.out
7人分の評点を入力して下さい。
50
80
70
100
60
0
35
1: 50 C
2: 80 A
3: 70 B
4: 100 A
5: 60 C
6: 0 F
7: 35 D
%

B-2 配列の最大値と最小値

ファイル名: ex07b2.c

キーボードから1個以上10個以下の整数を配列に入力し、その中の最大値と最小値を表示するプログラムを作成しなさい。

実行例のように、入力された整数も最後に表示すること。

なお、キーボードから入力された配列サイズが、10個を超えた場合のエラー処理は考えなくてよい。


[実行例]

 % ./a.out
整数の個数を入力してください(1〜10): 8
8個の整数を空白で区切って入力してください。
3 10 -5 4 20 9 -12 -8 
最大値は20です。
最小値は-12です。
入力された整数の表示
3 10 -5 4 20 9 -12 -8
% 

ヒント:前の問題では、scanfへの入力は改行区切りだったが、この問題では空白区切りである。 しかし、前の問題と同様にscanfにfor文を組み合わせれば、空白区切りの入力にも対応できる。

B-3 配列要素の逆順表示

ファイル名: ex07b3.c

以下の仕様に従い、実行例のように動作するプログラムを作成せよ。

  • 要素数10のint型配列を用意する
  • キーボードから入力された整数値を配列に格納する
    • -1が入力されたらそこで入力を打ち切ること
    • 10個以上の入力があった場合も10個で打ち切ること
  • 入力内容を入力された順番通り表示する
  • 続いて、入力内容を入力された順番とは逆順に表示する


実行例

% ./a.out 
0 3 5 7 9 -2 -4 -6 -1
Input order:       0    3    5    7    9   -2   -4   -6 
Reversed order:   -6   -4   -2    9    7    5    3    0 
% ./a.out
1 2 3 4 5 6 7 8 9 10 11
Input order:       1    2    3    4    5    6    7    8    9   10 
Reversed order:   10    9    8    7    6    5    4    3    2    1 
% ./a.out
1 2 3 4 5 6 7 8 -1 9 10
Input order:       1    2    3    4    5    6    7    8 
Reversed order:    8    7    6    5    4    3    2    1 
%

なお、キーボードからの複数の数値の連続入力は、ハンドアウトLec07-8 (p36) のサンプルプログラムlec07-1.cやLec06-12 (p32) のlec06-3.cのようにforループなどで実現できる。 実行例のように連続して入力された場合でも、ループ内にある1つの値を読み取るscanfで1つずつ処理される。 ループ回数より多い入力は無視されるほか、ループを途中で脱出した場合もそこで入力(キーボード入力の読み取り)は打ち切られる。 このような書き方をした場合、入力は上記の実行例の通り1行に空白区切りで行ってもよいし、改行が入っていてもよい。つまり、入力を以下のようにしても同じである。


実行例(入力の仕方を変えた場合)

% ./a.out 
0
3
5 7 9
-2 -4 -6
-1
Input order:       0    3    5    7    9   -2   -4   -6 
Reversed order:   -6   -4   -2    9    7    5    3    0 
%

Extra問題

E-1 フィボナッチ数列

ファイル名: ex07e1.c

先行2項の和が次の項となるフィボナッチ数列

{0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89...}

は、次の漸化式で与えられる。

Fibonacci[i] = Fibonacci[i-1] + Fibonacci[i-2]
ただし、Fibonacci[0] = 0, Fibonacci[1] = 1

この隣り合う項の比が黄金比 (1+√5)/2 = 1.6180339887... に次第に近づくことを確認しよう。

フィボナッチ数列を要素数21の一次元配列 Fibonacci[i] に格納かつ一覧表示し、更に Fibonacci[i+1] / Fibonacci[i] で表される隣接項比と、黄金比、の差分、がどう移り変わるか、実行例にならって出力するプログラムを作りなさい。なお、差分を計算する際の黄金比(変数名:goldenratio)は今は簡単のため 1.6180339887 と近似することとする。出力の際のフォーマットも実行例通りになるように注意すること。

実行例

% ./a.out
Fibonacci[0] = 0
Fibonacci[1] = 1
Fibonacci[2] = 1
Fibonacci[3] = 2
Fibonacci[4] = 3
...
Fibonacci[20] = 6765
Fibonacci[2]/Fibonacci[1]  - goldenratio = -6.180e-01
Fibonacci[3]/Fibonacci[2]  - goldenratio =  3.820e-01
...
Fibonacci[17]/Fibonacci[16]  - goldenratio =  4.591e-07
Fibonacci[18]/Fibonacci[17]  - goldenratio = -1.753e-07
Fibonacci[19]/Fibonacci[18]  - goldenratio =  6.703e-08
Fibonacci[20]/Fibonacci[19]  - goldenratio = -2.553e-08
%

課題提出上の注意事項

解答ファイルはmenuコマンドを使って提出してください。以下のようにmenuコマンドを実行し、表示されるメッセージに沿って操作すること。

% ~prog0/bin/menu

menuコマンドは、解答ファイルが ~/Prog0/Ex## のディレクトリに指定されたファイル名で置かれているものとして処理します。正常に提出された場合は ○ が、何らかのエラーが生じた場合は × が表示されます。

解答の提出期間は以下のとおりです。

問題提出受付開始提出〆切
A問題 演習日の6日前の午後9時演習終了時刻
B, Extra問題 演習日の6日前の午後9時演習日の6日後の午後9時

提出は〆切前であれば何度でもやり直すことができます。再提出すると、前に提出したファイルは新しい内容で上書きされます。

Personal tools