C++の宿題で困っています。(問題)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kos-mos

C++の宿題で困っています。(問題)

#1

投稿記事 by kos-mos » 15年前

今回は3x3行列の表示、行・列の入れ替え、転置行列という宿題についての質問です。

宿題の内容は以下の通りです。
付属のサンプルファイルは次のに載せます。
どう書いたらいいか初めからわからないので、丸投げのようで申し訳ないですが、教えていただけると嬉しいです。

=問題=
以下の機能を持つプログラムを作成する。

行列(要素は整数型、3行x3列)に値を入力する
行列を表示する
利用者が入力した列番号に基づいて、行列の2つの列を入れ替える
利用者が入力した行番号に基づいて、行列の2つの行を入れ替える
転置行列を求める

=演習問題の考え方=
1) プログラムを1つにまとめる
機能毎に関数を定義する
主プログラム(main)
行列に値を入力する関数(getMatrix)
行列を表示する関数(showMatrix)
利用者が入力した列番号に基づいて、行列の2つの列を入れ替える関数(exchangeColumn)
利用者が入力した列番号に基づいて、行列の2つの行を入れ替える関数(exchangeRow)
転置行列を求める関数(transposeMatrix)
機能の一覧を表示する関数(showMenu)
アルゴリズム、プログラムは、関数毎に独立に作成する

2) プログラムの構造
行列は大域変数とする
二次元配列を用いる
行列以外の変数は局所変数とする
main関数の役割
利用者が各機能を選べるようにする
利用者の指示に従って、各機能を呼び出す
その他の関数の役割
指定された機能だけを完全に実現する
それ以外の機能を含めない

3) 機能の一覧
機能番号は定数で定義する
例:終了(0)、値の入力(1)、表示(2)、列の入れ替え(3)、行の入れ替え(4)、転置(5)
main関数のステップ3-1~3-4はswitch文で実現する
機能の一覧を表示する関数showMenuを定義する
main関数の中で2回使う (参考例を参照)
機能:機能の一覧と機能番号を一覧表示する
アルゴリズム
定数: 配列の行数 N 3
配列の列数 M 3

定数: 機能番号「終了」 0
機能番号「値の入力」 1
機能番号「表示」 2
機能番号「列の入れ替え」 3
機能番号「行の入れ替え」 4
機能番号「転置」 5

大域変数: 配列 int matrix[N][M]

主プログラム
変数: 機能番号 int functionNumber
入替えする列番号 int column1,column2

1. 機能の一覧を表示する。
2. 機能番号を入力する。
3. 機能番号が「終了」でない限り以下の処理を繰り返す。
 3-1. 「値の入力」が指定されたならば、行列に値を入力する。
 3-2. 「表示」が指定されたならば、行列を表示する。
 3-3. 「列の入れ替え」が指定されたならば、以下の処理を実行する。
  3-3-1. 入れ替える列の番号column1, column2を入力する。
  3-3-2. 配列のcolumn1列とcolumn2列を入れ替える。
 3-4. 「行の入れ替え」が指定されたならば、以下の処理を実行する。
  3-4-1. 入れ替える行の番号row1, row2を入力する。
  3-4-2. 配列のrow1行とrow2行を入れ替える。
 3-5. 「転置」が指定されたならば、行列を転置する。
 3-6. 機能の一覧を表示する。
 3-7. 機能番号を入力する。

行列に値を入力する
引数:なし
1. 各行row に対して以下の処理を繰り返す。
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 行列の row行 column列の要素に値を入力する。

行列を表示する
引数:なし
1. 各行row に対して以下の処理を繰り返す。
1-1. 当該行の各列column に対して以下の処理を繰り返す。
1-1-1. 行列の row行 column列の要素の値を表示する。
1-2. 改行する。

行列の列を入替える
引数: 入れ替え対象の列番号: int column1, column2

1. 各行rowに対して以下の処理を繰り返す。
1-1. 行列の row 行 column1列目の要素とrow 行 column2 列目の要素とを入れ替える。

行列の行を入替える
引数: 入れ替え対象の行番号:
int row1, row2

1. 各列columnに対して以下の処理を繰り返す。
1-1. 行列の row1 行 column列目の要素とrow2 行 column 列目の要素とを入れ替える。

行列を転置する
引数:なし
1. 各行row に対して以下の処理を繰り返す。
1-1. 当該行の0~row-1番目までの各列column に対して以下の処理を繰り返す。
1-1-1. 行列の row 行 column 列目の要素とcolumn 行 row 列目の要素とを入替える。

機能の一覧を表示する
引数:なし
1. 「機能番号 0 は プログラムを終了する。」と表示する。
2. 「機能番号 1 は 行列に値を入力する。」と表示する。
3. 「機能番号 2 は 行列の値を表示する。」と表示する。
4. 「機能番号 3 は 行列の指定された行を入れ替える。」と表示する。
5. 「機能番号 4 は 行列の指定された行を入れ替える。」と表示する。
6. 「機能番号 5 は 行列を転置する。」と表示する。

OS:Vista
コンパイラ:VC++ 2008
C++は数カ月程度の初心者です。
四度目の投稿なので至らないところもあると思いますが、どうかよろしく願いします。

たいちう

Re:C++の宿題で困っています。(問題)

#2

投稿記事 by たいちう » 15年前

丸投げするつもりはなく、努力してくれるという前提での回答です。


> 行列(要素は整数型、3行x3列)に値を入力する
> 行列を表示する

まず、この部分だけ作ってみてください。
問題分の他の部分は無視しても構いませ

non

Re:C++の宿題で困っています。(問題)

#3

投稿記事 by non » 15年前

それに、サンプルを2次元に書き直して、添付してください。
変数名等を質問者さんに決めてもらった方が、回答しやすいですね。

kos-mos

Re:C++の宿題で困っています。(問題)

#4

投稿記事 by kos-mos » 15年前

#define N 3
#define M 3
int matrix[N][M];
int i;
int j;
void main(){
  for(i = 0; i <= N -1; i++){
    for(j = 0; j <= M -1; j++){
      cout << matrix[j] << "の値を入力してください" << endl;
      cin >> matrix[j];
    }
  }     
  for(i = 0; i <= N -1; i++){
    for(j = 0; j <= M -1; j++){
       cout << matrix[j] << endl;
    }
  }
}

まだ習っていないので調べて考えてみたのですが、これでいいんですかね?

Dixq (管理人)

Re:C++の宿題で困っています。(問題)

#5

投稿記事 by Dixq (管理人) » 15年前

投稿を分ける時は同じトピック内にして下さい。
こちらに移しますね。

字数制限で分けさせていただきました。

=サンプルファイル=
/**************************************************************
プログラミング演習I課題(第10回サンプル)
 1次元配列の操作を行う。エラー処理は略す。
  学籍番号:         氏名:
  提出日: 年 月 日
**************************************************************/
#include <iostream>
using namespace std;

// 定数定義
#define N 10  // 要素数

#define END     0  // 終了
#define INPUT   1  // 入力
#define SHOW    2  // 表示
#define GET     3  // 要素値の取得
#define SET     4  // 要素値の設定

// プロトタイプ宣言
void showMenu(void);                   // メニューを表示する。
void inputArray(void);                 // 配列に値を入れる。
void showArray(void);                  // 配列を表示する。
int getElement(int index);             // 配列要素の値を取り出す。
void setElement(int index, int value); // 配列要素に値を設定する。

// 大域変数
int array[N]; // 対象とする配列

/*****************************************
 メイン関数
*****************************************/
void main() {

	int choice;    // 機能番号
	int index;     // 要素番号
	int value;     // 要素値

	// 1. 機能の一覧を表示し、機能番号を受け取る。
	showMenu();
	cout << "機能番号=";
	cin >> choice;

	// 2. 機能番号が「終了」でない限り以下の処理を繰り返す
	while(choice != END) {

		// 2.1. 機能番号によって処理を分岐する。
		switch(choice) {

			// 2.1.1. 機能番号が「入力」ならば配列に値を入力する
			case INPUT: 
				inputArray(); 
				break;

			// 2.1.2. 機能番号が「表示」ならば、配列を表示する
			case SHOW:
				showArray(); 
				break;

			// 2.1.3. 機能番号が「要素取得」ならば、要素番号を受け取り、要素を取得して表示する。
			case GET:
				cout << "値を取得する要素番号を入れてください" << endl;
				cin >> index;
				value = getElement(index);
				cout << "要素の値=" << value << endl; 
				break;

			// 2.1.4. 機能番号が「要素設定」ならば、変更要素番号と要素値を受け取り、配列要素を入れ替える。
			case SET:
				cout << "値を設定する要素番号と設定値を入れてください" << endl;
				cin >> index >> value;
				setElement(index, value); 
				break;

			// 2.1.5. 機能番号がそれ以外は何もしない。
			default: 
				break;
		}

		// 2.2. 機能の一覧を表示し、機能番号を受け取る。
		showMenu();
		cout << "機能番号=";
		cin >> choice;
	}
}

/*****************************************
 メニューを表示する。
*****************************************/
void showMenu(void) {

	// 1. 機能番号の一覧を表示する。
	cout << "番号を選択ください。" << endl;
	cout << "終了  :" << END    << endl;
	cout << "入力  :" << INPUT  << endl;
	cout << "表示  :" << SHOW   << endl;
	cout << "要素取得:" << GET    << endl;
	cout << "要素設定:" << SET    << endl;
}

/*****************************************
 配列に値を入力する。
*****************************************/
void inputArray(void) {

	// 1. 変数 i を0~N-1まで変えながら以下の処理を繰り返す
	for(int i = 0; i < N; i++) {

		// 1.1. 配列のi番目の要素に値を入力する
		cout << "array[" << i << "] = ";
		cin >> array;
	}
}

/*****************************************
 配列を表示する。
*****************************************/
void showArray(void) {

	// 1. 配列の全要素を表示する(要素はタブで区切る)。
	for(int i = 0; i < N; i++) {
		cout << array << "\t";
	}

	// 2. 改行する。
	cout << endl;
}

/*****************************************
 配列要素を取得する。
 index: 所得する要素の番号
 戻り値: 取得した要素値
*****************************************/
int getElement(int index) {

	// index番目の配列要素を戻す。
	return array[index];
}

/*****************************************
 配列要素に値を設定する。
 index: 設定する要素番号
 value: 設定する値
*****************************************/
void setElement(int index, int value) {

	// index番目の配列要素に値valueを設定する。
	array[index] = value;
}

non

Re:C++の宿題で困っています。(問題)

#6

投稿記事 by non » 15年前

サンプルではこう書いてあります。
/*****************************************
 配列に値を入力する。
*****************************************/
void inputArray(void) {

	// 1. 変数 i を0~N-1まで変えながら以下の処理を繰り返す
	for(int i = 0; i < N; i++) {

		// 1.1. 配列のi番目の要素に値を入力する
		cout << "array[" << i << "] = ";
		cin >> array;
	}
}

/*****************************************
 配列を表示する。
*****************************************/
void showArray(void) {

	// 1. 配列の全要素を表示する(要素はタブで区切る)。
	for(int i = 0; i < N; i++) {
		cout << array << "\t";
	}

	// 2. 改行する。
	cout << endl;
}

ですから、このような関数にして、mainから呼び出して下さい。
i,jはローカル変数にしましょう。
データ入力を促すための表示がサンプルとは異なってます。
Nが未定義です。

>まだ習っていないので調べて考えてみたのですが
習ってないのは何がですか?2次元配列?
宿題なのに、習ってないなんて事あるかな。

たいちう

Re:C++の宿題で困っています。(問題)

#7

投稿記事 by たいちう » 15年前

> まだ習っていないので調べて考えてみたのですが、これでいいんですかね?

コンパイルして、実行して、結果を確認してください。
ここまでは自分でできるでしょ。
(できなかったらそのことについて質問)

自分で満足できる結果が得られているのならば、その旨も書いてください。

閉鎖

“C言語何でも質問掲示板” へ戻る