練習問題の答え合わせ

ソースコードを404のPCからこぴーできなかったから、ちょいまってて

課題と配列と数当てゲーム

下の二つの資料のところどころにある練習問題のフローチャートを書いて、プログラムを作ってみよう!

ある型のデータが、ずらーっとメモリ上に並んでいるデータ構造を配列と呼びます(ましたね?)
例えば、整数の以下のような配列は


これをC++で同じ状態を作るとしたら、こんな感じでしたね?

<配列の作り方と初期化>

  • 以下のようにして初期化する
    • 型 変数名[要素数] = { 初期化子1, 初期化子2, 初期化子3, … , 要素数分の初期化子 };
  • また、初期化子を並べると要素数が確定するので、要素数の指定を省略できる
    • 型 変数名[] = {初期化子1, 初期化子2, 初期化子3, … , 要素数分の初期化子 };
int arr[6];
 
arr[0] = 2;
arr[1] = 5;
arr[2] = 7;
arr[3] = 1;
arr[4] = 0;
arr[5] = 3;

配列のそれぞれの番号を表す[]内の数字のことを添え字(index:インデックス)と呼びます。

これを、初期化と宣言を同時に行うと以下のようになりました。
参考(前にやった配列の初期化の資料)

int arr[6] = { 2, 5, 7, 1, 0, 3 };

配列を使って、人数分の学生の得点を入力し、平均点と合計点を表示するプログラムを作れ
学生の人数は、定数(整数)で初めに決めておく(5から10人ぐらいがいいのでは?)

  1. 定数で学生の人数を宣言しておく
  2. 定数を使って学生数分の配列を用意
  3. 変数を用意(合計、平均など小数点出そうな計算に使うものは実数型で)
    1. 人数分のデータを入力(配列のインデックスと、カウンタ型ループを使う)
    2. データが入った配列をsum(合計計算用の変数)にすべて足す(学生分のデータの合計を求める)
  4. 合計/SNUMを計算して平均値を求め出力する
  5. 終了
今日の練習問題
#include <iostream>

using namespace std;
//出席番号1~5番までの学生の点数を処理するプログラム
//キーボードからデータを入力
//画面には "出席番号〇番の学生の点数:" 〇は番号に変換
//データを入力し終わったら、画面に
//全員の番号と得点
//合計点と平均点
//できそうな人は、最高点と最低点、を表示
//さらに余裕あったら、学生名も入れてみよう!
//学生数は、定数を使うこと!
//ヒント 配列は[0]~[4]までだから、それを1から5番までに使おうとすると
//       番号ずれちゃうから、足したり引いたりして工夫する!
int main()
{
    //SNUM:学生の人数(定数=プログラム中でここ以降変わらない数)
    const int SNUM = 5;//入力大変だから5にしようね

    return 0;
}

ヒント:
C++では、以下のようなルールがあります。今まで黙っててごめんね。
整数/整数 ⇒ 整数
整数/実数 ⇒ 実数
実数/整数 ⇒ 実数
実数変数 = 整数(代入) ⇒ 小数点部分切り捨てで代入
実数変数 = 実数 ⇒ 小数点部分ありで代入(あたりまえか。。。)
整数変数 = 実数 ⇒ 小数点部分を切り捨てて、整数に変換されて代入
計算結果はどんな型になるか、それをどんな型に代入して使えば正しい動作になるか?
常に考えてソースコードを書こう。

模範解答

"配列へのデータ入力と統計処理"
#include <iostream> //iostreamヘッダー ヘッダーにいろんな機能が詰まってるよ
#include <string> //stringヘッダー それを呼び出して使う
#include <iomanip>//setw使うのに必要
 
using namespace std;
 
int main()
{
	const int STUNUM = 5;
 
	int stuScore[STUNUM];//定数で配列を取得
	string stuName[STUNUM];
 
	int max;
	int min;
 
	for (int i = 0; i < STUNUM; i++)//配列はゼロから始まる
	{
		cout << "出席番号" << i + 1 << "番目の学生の名前を入力:";
		cin >> stuName[i];//インデックスで、配列の番号を指定
 
		cout << "出席番号" << i + 1 << "番 " << stuName[i] << "さんの得点を入力:";
		cin >> stuScore[i];
	}
	//max min を求めるループ
	max = stuScore[0];
	min = stuScore[0];
	for (int i = 0; i < STUNUM; i++)
	{
		if (stuScore[i] < min)
			min = stuScore[i]; //今の最小値より小さかったら最小値を更新
 
		if (stuScore[i] > max)
			max = stuScore[i]; //今の最大値より大きかったら最大値を更新
	}
 
 
	cout << "+------------------------------------------+" << endl;
 
	for (int i = 0; i < STUNUM; i++)
	{
		cout << "出席番号" <<  setw(2) << i + 1 << "番 " << setw(5) << stuName[i] 
			<< "さんの得点|" << setw(4) << right << stuScore[i] << "|" << endl;
	}
 
	cout << "+------------------------------------------+" << endl;
 
	float sum = 0;
	float average = 0.0f; //浮動小数点だよ
	for (int i = 0; i < STUNUM; i++)
	{
		sum += stuScore[i];
	}
	cout << "全員の合計点:" << sum << endl;
	average = sum / STUNUM;
	cout << "全員の平均点:" << average << endl;
 
	cout << "最高点:" << max << endl;
	cout << "最低点:" << min << endl;
 
 
	return 0;
}

https://vipprog.net/wiki/?%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C.html
URL変わってたから貼りなおしたよ。

  • game-engineer/classes/2023/game-programing-1/first-term/5/05-23-4.txt
  • 最終更新: 3年前
  • by root