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

以下の数列 mn を表示するプログラムを作成しなさい。

  • 初項 (第0項) m0 = 0 とする
  • 第n項は、第(n-1)項を用いて次のように表すことができる
    • mn = 2 * mn-1 + 1
  • 初項 (第0項) m0 から第10項 m10 までを計算して配列に格納する
  • 配列への格納がすべて終わったら、配列の要素を[実行例]のように表示する

[実行例]


% ./a.out
  0:       0
  1:       1
  2:       3
  3:       7
  4:      15
  5:      31
  6:      63
  7:     127
  8:     255
  9:     511
 10:    1023
%

この数列の第n項は 2n - 1 となっていることがわかる。これはメルセンヌ数と呼ばれ、2進数で書くと 11...1 とすべての桁が 1 となる数である。

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

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

  • 要素数100のint型配列input, odd, evenを宣言する
  • キーボードから最大100個の正の整数値を入力し、配列inputに格納する
  • 入力値のうち奇数は配列oddにも格納する
  • 入力値のうち偶数は配列evenにも格納する
    • 配列input, odd, evenに格納された数値の個数は別途変数に格納しておくこと
    • 0が入力されたら入力を打ち切る
  • 入力終了後、配列input, odd, evenの要素を順に表示する


繰り返しになるが、入力値を、配列inputだけでなく、その値に応じてoddまたはevenにも格納しないといけないことに注意しよう。


[実行例]


% ./a.out
1 2 3 4 5 6 7 0
Input: 1 2 3 4 5 6 7 
Odd:   1 3 5 7 
Even:  2 4 6 
%

Extra問題

E-1 配列によるヒストグラムの計算

ファイル名: ex07e1.c

ある試験の評点データが240件分あるとする。

(この問題では、便宜的に、240件の評点データを乱数で生成することにする。)

このようにして生成された評点データの分布を見るために、10点刻みで分類し、その数を数えたい。

具体的には「0から9点」、「10から19点」...「90点から99点」、そして100点の11分類とする。

以下のプログラムに必要な変数宣言や処理を補って、プログラムを完成させなさい。

  • 分類には配列変数histを使うこと。histは、適当な場所で全要素を0で初期化してください。
  • switch文を使わないこと。
  • 評点データは0から100までの整数値で与えられるとする。

[プログラム]

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  int i;
  int score[240];  /* 評点データの配列 */
  int hist[11];     /* 11分類 */

  srand((unsigned int)time(NULL)); /* 実行のたび異なる乱数を得るための命令 */

  for(i = 0; i < 240; i++) {
    score[i] = rand() % (100 + 1);
  }

  /* 分類処理 */
  for(i=0; i<240; i++) {
    /* 分類処理の記述をすること */
  } 

  /* 結果出力 */
  /* for文を使って「x点からy点の人はn人です」 と繰り返すこと */
  /* 最後は「100点の人はn人です」 とする */

  return 0;
}

実行例 (乱数を使っているため実行結果は異なる場合がある)


% ./a.out
0点から9点の人は15人です
10点から19点の人は20人です
20点から29点の人は25人です
30点から39点の人は22人です
40点から49点の人は22人です
50点から59点の人は19人です
60点から69点の人は24人です
70点から79点の人は27人です
80点から89点の人は33人です
90点から99点の人は27人です
100点の人は6人です
%

課題提出上の注意事項

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

% ~prog0/bin/menu

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

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

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

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

Personal tools