Lecture 9 2019年度中間テスト再履修者向け(解答例)



【注意】これは試験です!
    コピペ等,何らかの不正が認められた場合は全問0点として処理し,
    その後然るべき処置を取るので注意すること.


【注意】すべてのソースコードの先頭行に,
    学籍番号,年組番号,氏名をコメントとして記入すること.


【注意】すべての問題は,1つの .cpp ファイルで完結したプログラムとすること







以下の問いに答えよ.

問題1

1から1000までの自然数のうち.
 ① 7の倍数
 ② 5のつく数字
 ③ 上の両方の条件を満たす数字
はいくつあるか,それぞれカウントして表示するプログラムをつくりなさい.
プログラムのファイル名を 学籍番号10桁-09-1.cpp とせよ.

// 実行例
1から1000までの自然数のうち,
- 7の倍数は xx 個
- 5のつく数字は yy 個
- 5のつく数字で7の倍数なのは zz 個
それぞれあります.

解答例



解説

  • 上記プログラム中,3, 7としているところを,7, 5に変更する.
  • この問題とほぼ同様の問題はおさらいでもやっていますし, 解答例も載せています.この問題ができなかった人は完全な準備不足です.
  • 上記のサンプルプログラムは,〜の倍数等の部分を汎用的に作っています.
  • 試験では汎用的なプログラムでなくても良いですが,汎用的に作る癖をつけましょう.
  • 基数等は一旦文字定数に置き(19-21行目.これは必ずやってください)
  • 関数の引数に渡しています(3, 7, 29, 32, 35行目).
  • main関数の中の条件文(特に35行目など)を関数にすることで, 条件がわかりやすくなっています.この様に必ず関数にするようにしましょう.
  • 〜の倍数(3-5行目)は,基数で割り切れる,すなわち割った余りが0になる, ということを利用しています.
  • 〜のつく数字(7-14行目)は,一桁ずつ,その数字かどうかをチェックしています.



問題2

以下の英文をキーボードから入力せよ.Microsoft Wordを用い,フォントはTimes New Romanの12ptを使用しなさい. ファイル名を 学籍番号10桁-09-2.docx とせよ.

学籍番号,年組番号,氏名

解説

  • タイピングさえできれば得点できる点取らせ問題.
  • 高速に正確にキー入力ができる必要があります.タイプ練習ソフト等でよく練習してください.
  • この問題は普通の文書だったので,小さな誤字脱字は減点にはなりませんでした. しかし,本来はプログラムの入力をしてもらうつもりでした
  • プログラムの場合,誤って入力すると,コンパイルできなかったり,できても動かなかったりします. その場合,おかしい場所を,コンパイラのエラー等をみて見つけ出すことができなければなりません.
  • コンパイルできなければ得点にはなりませんし,実行出来なければ同様に得点できません.
  • キータイプの速度が速ければ他のプログラムを作る速度も格段に上がります. 情報処理技術の一つとして(全てに関わるという意味で)最も影響の大きい, 重要な技術だと認識してください.




問題3

キーボードから入力された文字列の中から,"Tokyo"という文字列を検索し, 先頭からのオフセット(何文字目にあるか)を返す関数 find_tokyo を作成せよ. 大文字小文字は問わない. 先頭を0文字目とし,スペースも1文字と数える.見つからない場合は-1を返すこと. 以下のmain関数を変更せずに利用すること. printf, scanf以外のライブラリ関数(string.h等)は使わずに実現すること. プログラムのファイル名を 学籍番号10桁-09-3.cpp とせよ.
#include <stdio.h>

int main(void)
{
    char str[200];
    printf("文章を入力:");
    scanf("%[^¥n]", str);

    int ret = find_tokyo(str);

    if(ret == -1) {
        printf("文字列が見つかりません¥n");
    } else {
        printf("%d文字目です.¥n", ret);
    }
}

// 実行例:
文章を入力:Hello Tokyo
6文字目です

文章を入力:Hello, TOKYO
7文字目です

文章を入力:Konnichiwa! toKYo
12文字目です

文章を入力:Hello Tokio
文字列が見つかりません

文章を入力:Hello Tokvo
文字列が見つかりません


解答例



解説

  • 上記プログラムで"kikaika"の部分を"tokyo"に直せば本問題の解答となる.
  • islower()やtoupper()などは作成済みなので,それ以外ができればよい.
  • 大文字小文字のどの様な組み合わせでもマッチさせるためには,すべての文字を 大文字(あるいは小文字)に変換してから比較すればよい.
  • プログラムのコアな部分に関しては,find_string()さえできればよいのだが, その中で単語がマッチするかを確認する関数 ismatch() が作れるかどうかが鍵となる.
  • ismatch()ではなくて,strcmp()関数を作って使ってももちろん良い.




問題4

要素数10個の整数型配列 int data[10]; に対して,
 (a) キーボードから数値を10個入力する
 (b) 大きい順に並び替え(ソート)
 (c) 平均値を算出する
する各関数を作成し,プログラムを完成せよ. 以下のmain関数を変更せずに利用せよ. なお,配列の中身を表示する関数 output を例示する. プログラムのファイル名を 学籍番号10桁-09-4.cpp とせよ.
#include <stdio.h>

void output(int data[], int n)    //配列を引数にとる.n は要素数
{
    for(int i=0; i<n; i++){
        printf("data[%d] = %d¥n", i, data[i]);    // i 番目の data にアクセスする
    }
}

int main(void)
{
    const int n = 10;
    int data[n];                    // 配列の宣言

    input(data,n);                  // 入力する関数

    sort(data,n);                   // 大きい順に並び替える関数
    output(data,n);                 // 変数の中身を画面に表示する関数

    float ave = average(data,n);    // 平均値を算出する関数
    printf("平均値 = %f¥n",ave);
}


解答例



解説

  • これも,sort() やswap() はやっているので,出来てあたりまえ.
  • 平均を求めるのも過去にやっているはずなので,この問題は出来なければダメです.
  • 「数字を10個入力する」という部分は,開発中に毎回入力すると時間がかかって 仕方がないので,開発時には3-4個で行い,デバッグが済んだら最後に10にするのが早い.







以上