第3回:文字列の並べ替え


先週の練習

キーボードから文字列を入力すると,何文字入力されたかを画面に表示するプログラムを作成する.

ヒント:文字列の終わりはnull文字で判断する.

[答え]

#include <stdio.h>

void main()
{
    char c[256];
    int i;

    printf("文字列を入力してください:");
    scanf("%s", c);

    for(i=0; c[i] != 0; i++);        /* これで,文字数を数えている.null文字は,0 */

    printf("入力された文字列は,%s で,%d 文字です\n", c, i);       /* なぜ,i が文字数なのか */
}


今週は,配列の仕上げとして,二次元配列 と 文字列の配列 を取り上げます.

2次配列

これまで習った配列,文字列では,要素は横方向へ増えていく一次元でした.

下の成績表のように,二次元のデータはどう扱ったらよいでしょう.このような成績表は,出席番号と科目という 2つの要素から成り立っています.つまり,2つの添え字があれば,点数を読み出せます.

出席番号 国語 数学 理科 社会 英語
1 65 71 74 82 97
2 84 83 74 64 65
3 74 74 78 80 78
4 90 90 90 90 90
5 87 78 85 60 88
6 93 95 94 92 95

この表を配列を用いて効率よく扱うためには,二次元配列を用います.

int seiseki[6][5];
  宣言のみ
  [6][5]は配列の大きさ
  (縦6人分、横5科目分 確保する)
int seiseki[6][5]={{65,71,74,82,97},
                  {84,83,74,64,65},
                  {74,74,78,80,78},
                  {90,90,90,90,90},
                  {87,78,85,60,88},
                  {93,95,94,92,95}};
  宣言 + 初期化  
seiseki[0][2] = 0;   代入
printf("%d\n", seiseki[1][0]);   参照


問題

次の成績表から,各人の合計点,偏差値を求めなさい.

ヒント: 出席番号は1から始まるが,配列は0から始まることに注意しよう

出席番号 国語 数学 理科 社会 英語 合計点 偏差値
1 65 71 74 82 97 - -
2 84 83 74 64 65 - -
3 74 74 78 80 78 - -
4 90 90 90 90 90 - -
5 87 78 85 60 88 - -
6 93 95 94 92 95 - -

ステップ1

各人の合計点と,試験全体の平均値を求めるプログラムを作ろう.

ステップ2

これができた人は,標準偏差を求めてから各点数の偏差値を求めてみよう.

偏差値の求め方:

 偏差値=(得点−平均値)/標準偏差*10+50

標準偏差:

 標準偏差=

平方根は,sqrt()関数を用いて求めることができます.

使い方:

 #include <math.h>

 double sqrt(double x);

例: s = sqrt(a+b+c);

アドバンスドステップ

さらに,できた人は,結果を成績のよい順に並べ替えてみよう.


Oh-o! Meijiのレポートから(第3回)のところへ,演習で作成したプログラムを送る.プログラムには必ず,学年,組,番号,氏名を記入すること.