joho1-2016の日記

情報処理実習1の解説ブログです.皆さんが課題を解く時の助けになれば幸いです.

第8回 おさらい

今週は模擬テストだったので,授業解説はなしです.また,6組は課題もないので,5組のみ課題の考え方について記述します.

5組
1.練習問題と同様,キーボードから実数を10個入力し配列に格納し,最大値,最小値を画面に表示せよ.
ただし,最大値,最小値の計算は関数として作成すること.

/* 配列中の最大値を返す関数 */
float find_max(float data[], int n)   /* nは配列の要素数 */
{
    ...
    return ???;
}


/* 配列中の最小値を返す関数 */
float find_min(float data[], int n)   /* nは配列の要素数 */
{
    ...
    return ???;
}


int main(void)
{
    const int N = 10;
    float data[N];   /* 実数10個分の配列 */
    
    .../* データ入力 */
    for(...)
        ...
    
    printf("最大値は %f \n", find_max(data, N));
    printf("最小値は %f \n", find_min(data, N));

    return 0;
}

この課題のポイントは,
 ①データの入力方法
 ②関数内での処理方法
です.①は10個の実数を入力すればいいだけなので,上のヒントの通り繰り返し処理をすればいいでしょう.配列へのアクセス時は要素数番号は0~N-1であることにも注意しましょう.②も考え方としては①のように繰り返し処理が楽かと思います.この際,何を返り値にするのか,そこがやや考えるポイントになるかもしれませんね.

2.キーボードから正の整数を10個入力し配列に格納し,そのなかから奇数の数をカウントして画面に表示せよ.
正の整数以外が入力されたらエラーを表示して,正しい値が入力されるまで再入力させよ.
配列を受け取ると,奇数の個数を返す関数 int count_odd(int array[], int n) を必ず作成すること.

実行例:
a[0]= 10
a[1]= -3
入力エラー! 正の整数を入力
a[1]= 0
入力エラー! 正の整数を入力
a[1]= 5
a[2]= 100
a[3]= 2
  .
  .
  .
a[9]= 10

奇数は 4 個ありました.

この課題のポイントは,
 ①入力された数が正の整数か判定
 ②奇数の判定
です.①は先生が授業中にポロっと言ったように,do-while文で入力されるたびに判定すれば良いでしょう.
②は2で割り切れるか判定すれば良いだけですね.

3.前問と同様,キーボードから 2 以上の整数を10個入力し,その中の素数の個数を数え表示するプログラムを作成せよ.
配列を受け取り,素数の個数を返す関数 int count_prime(int array[], int n) を必ず作成すること.

実行例:
a[0]= 10
a[1]= 1
入力エラー! 2以上の整数を入力
a[1]= 5
a[2]= 11
a[3]= 2
  .
  .
  .
a[9]= 10;

素数は 3 個ありました.

この課題のポイントは,
 ①入力された数が2以上の整数か判定
 ②素数の判定
①は2と同様にdo-while文で判定できますね.②は第7回課題の4で作成した関数を配列用に変更すれば完成ですね.

4.キーボードから10個の整数を配列に入力し,1.まずその中の画面に表示,2.次に大きい順に並べ替えて表示せよ.
ヒント(各自で調査せよ):ソーティング,アルゴリズム,単純ソート,挿入ソート,バブルソートヒープソートなど

a[0]= -2
a[1]= 1
a[2]= 11
a[3]= 2
  .
  .
  .
a[9]= 10;

並べ替え前:-2 1 11 2 ... 10
並べ替え後:11 10 ... 2 1 -2

この課題のポイントは,
 ①配列の並べ替え
です.様々なやり方があると思いますが,配列の要素番号の隣同士を比較して,要素番号が小さい方の中身の数が小さければ大きい方と入れ替える,という作業を要素数だけ繰り返せば,最終的にできた配列は大きい順に並び替わります.これには繰り返し処理のネストが必要になりますね.

5.整数型配列の各要素を全て絶対値に変換する関数 abs_array を作成し, 変換前,後の配列の中身を表示せよ.
配列の中身を表示する関数 disp_array も作成せよ.

void abs_array(int data[], int N) /* Nは要素数 */
{
    ...
}


void disp_array(int data[], int N) /* Nは要素数 */
{
    .../* 配列の中身を表示 */
}

int main(void)
{
    const int N = 10;
    int a[N] = {3, -4, -9, 10, -5, 6, 2, 0, -9, 5};
		
    disp_array(...);
    abs_array(...);
    disp_array(...);
	
    return 0;
}

実行例:
変換前:3, -4, -9, 10, -5, 6, 2, 0, -9, 5
変換後:3, 4, 9, 10, 5, 6, 2, 0, 9, 5

この課題のポイントは,
 ①整数を絶対値にする
です.条件判定してもいいですが,C言語には絶対値を計算する関数というものがあります.
詳しくは「C言語 絶対値」などでググるとでてきます.この時,いつものstdio.h以外にも他のヘッダーファイルをインクルードしないといけないことにも注意しましょう.

以上で5組の課題の考え方を終わります.