今回は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++は数カ月程度の初心者です。
四度目の投稿なので至らないところもあると思いますが、どうかよろしく願いします。
C++の宿題で困っています。(問題)
Re:C++の宿題で困っています。(問題)
丸投げするつもりはなく、努力してくれるという前提での回答です。
> 行列(要素は整数型、3行x3列)に値を入力する
> 行列を表示する
まず、この部分だけ作ってみてください。
問題分の他の部分は無視しても構いませ
> 行列(要素は整数型、3行x3列)に値を入力する
> 行列を表示する
まず、この部分だけ作ってみてください。
問題分の他の部分は無視しても構いませ
Re:C++の宿題で困っています。(問題)
#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; } } }
まだ習っていないので調べて考えてみたのですが、これでいいんですかね?
Re:C++の宿題で困っています。(問題)
投稿を分ける時は同じトピック内にして下さい。
こちらに移しますね。
字数制限で分けさせていただきました。
=サンプルファイル=
こちらに移しますね。
字数制限で分けさせていただきました。
=サンプルファイル=
/************************************************************** プログラミング演習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; }
Re:C++の宿題で困っています。(問題)
サンプルではこう書いてあります。
ですから、このような関数にして、mainから呼び出して下さい。
i,jはローカル変数にしましょう。
データ入力を促すための表示がサンプルとは異なってます。
Nが未定義です。
>まだ習っていないので調べて考えてみたのですが
習ってないのは何がですか?2次元配列?
宿題なのに、習ってないなんて事あるかな。
/***************************************** 配列に値を入力する。 *****************************************/ 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++の宿題で困っています。(問題)
> まだ習っていないので調べて考えてみたのですが、これでいいんですかね?
コンパイルして、実行して、結果を確認してください。
ここまでは自分でできるでしょ。
(できなかったらそのことについて質問)
自分で満足できる結果が得られているのならば、その旨も書いてください。
コンパイルして、実行して、結果を確認してください。
ここまでは自分でできるでしょ。
(できなかったらそのことについて質問)
自分で満足できる結果が得られているのならば、その旨も書いてください。