行列について(c++)
行列について(c++)
今回は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++は数カ月程度の初心者です。
五度目の投稿なので至らないところもあると思いますが、どうかよろしく願いします。
宿題の内容は以下の通りです。
=問題=
以下の機能を持つプログラムを作成する。
行列(要素は整数型、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++)
わかる範囲で書いてみましたが、3.3.1.と3.4.1.のところで入力された値が0~2ならば以下の処理を実行するという条件文を入れたのですが、これでコンパイルすると、加えたif文のところで: 「演算中の 'bool' 型の使用方法が安全ではありません」と表示されました。
どうしたらいいかわかりません。お願いします。
どうしたらいいかわかりません。お願いします。
Re:行列について(c++)
長すぎるみたいなので、半分に切りました。(その1)
#include <iostream> using namespace std; //定数定義 #define N 3 //配列の行数 #define M 3 //配列の列数 #define END 0 //終了 #define INPUT 1 //値の入力 #define SHOW 2 //表示 #define COLUMN 3 //列の入れ替え #define ROW 4 //行の入れ替え #define TRANSPOSE 5 //転置 //プロトタイプ宣言 void showMenu(void); //機能の一覧を表示する関数 void getMatrix(void); //行列に値を入力する関数 void showMatrix(void); //行列を表示する関数 void ExchangeColumn(int column1, int column2); //利用者が入力した列番号に基づいて、行列の2つの列を入れ替える関数 void ExchangeRow(int row1, int row2); //利用者が入力した列番号に基づいて、行列の2つの列を入れ替える関数 void transposeMatrix(void); //転置行列を求める関数 //大域変数 int matrix[N][M]; //対象とする行列 /******************************** メイン関数 ********************************/ void main(){ int functionNumber; //機能番号 int column1; //入れ替えする列番号 int column2; //入れ替えする列番号 int row1; //入れ替えする行番号 int row2; //入れ替えする行番号 //1.機能の一覧を表示する showMenu(); cout << "機能番号="; //2.機能番号を入力する cin >> functionNumber; //3.機能番号が「終了」でない限り以下の処理を繰り返す while(functionNumber != END){ //選択された機能番号によって処理を分岐する switch(functionNumber){ //3.1.「値の入力」が選択されたならば、行列に値を入力する case INPUT: getMatrix(); break; //3.2.「表示」が選択されたならば、行列を表示する case SHOW: showMatrix(); break; //3.3.「列の入れ替え」が選択されたならば、以下の処理を実行する case COLUMN: //3.3.1.入れ替わる列番号column1,column2を入力する cout << "入れ替える列番号を入力してください(0~2)" << endl; cin >> column1; cin >> column2; if(0 <= column1 <= 2, 0 <= column2 <= 2){ //3.3.2.配列のcolumn1列とcolumn2列を入れ替える ExchangeColumn(column1, column2); break; } //3.4.「行の入れ替え」が選択されたならば、以下の処理を実行する case ROW: //3.4.1.入れ替える行の番号row1,row2を入力する cout << "入れ替える行の番号を入力してください(0~2)" << endl; cin >> row1; cin >> row2; if(0 <= row1 <= 2, 0 <= row2 <= 2){ //3.4.2.配列のrow1行目とrow2行目を入れ替える ExchangeRow(row1, row2); break; } //3.5.「転置」が選択されたならば、行列を転置する case TRANSPOSE: transposeMatrix(); break; //3.6.機能番号が0~5以外ならば、以下のコメントを表示する default: cout << "それは選択できません" << endl; cout << "0~5から選択してください" << endl; break; } //3.7.機能の一覧を表示する showMenu(); cout << "機能番号="; //3.8.機能番号を入力する cin >> functionNumber; } }
Re:行列について(c++)
(その2)
/****************************************
機能の一覧を表示する
****************************************/
void showMenu(void){
//1.機能番号の一覧を表示する
cout << "機能番号を選択してください" << endl;
cout << "プログラムを終了する" << "・・・・・・・" << END << endl;
cout << "行列に値を入力する" << "・・・・・・・・" << INPUT << endl;
cout << "行列の値を表示する" << "・・・・・・・・" << SHOW << endl;
cout << "行列の指定された列を入れ替える" << "・・" << COLUMN << endl;
cout << "行列の指定された行を入れ替える" << "・・" << ROW << endl;
cout << "行列を転置する" << "・・・・・・・・・・" << TRANSPOSE << endl;
}
/****************************************
行列に値を入力する
****************************************/
void getMatrix(void){
//1.各行rowに対して以下の処理を繰り返す
for(int i = 0; i < N; i++){
//1.1.当該行の各列columnに対して以下の処理を繰り返す
for(int j = 0; j < M; j++){
//1.1.1.行列のrow行column列の要素に値を入力する
cout << "matrix[" << i << "] = ";
cout << "matrix[" << j << "] = ";
cin >> matrix[j];
}
}
}
/******************************
行列を表示する
******************************/
void showMatrix(void){
//1.各行rowに対して以下の処理を繰り返す
for(int i = 0; i < N; i++){
//1.1.当該行の各列columnに対して以下の処理を繰り返す
for(int j = 0; j < M; j++){
//1.1.1.行列のrow行column列の要素の値を表示する
cout << matrix[j] << "\t";
}
//1.2.改行する
cout << endl;
}
}
/******************************
行列の列を入れ替える
******************************/
void ExchangeColumn(int column1, int column2){
//1.各行rowに対して以下の処理を繰り返す
for(int i = 0; i < N; i++){
//1.1.行列のrow行column1列目の要素とrow行column2列目の要素とを入れ替える
int temp = matrix[column1];
matrix[column1] = matrix[column2];
matrix[column2] = temp;
}
}
/**********************************
行列の行を入れ替える
**********************************/
void ExchangeRow(int row1, int row2){
//1.各行columnに対して以下の処理を繰り返す
for(int j = 0; j < M; j++){
//1.1.行列のrow1行column列目の要素とrow2行column列目の要素とを入れ替える
int temp = matrix[row1][j];
matrix[row1][j] = matrix[row2][j];
matrix[row2][j] = temp;
}
}
/***********************************
行列を転置する
***********************************/
void transposeMatrix(void){
//1.各行rowに対して以下の処理を繰り返す
for(int i = 1; i < N; i++){
//1.1.当該行の0~row-1番目までの各列columnに対して以下の処理を繰り返す
for(int j = 0; j < N -1; j++){
//1.1.1.行列のrow行column列目の要素とcolumn行row列目の要素とを入れ替える
int temp = matrix[j];
matrix[j] = matrix[j];
matrix[j] = temp;
}
}
}
[/pre]
/****************************************
機能の一覧を表示する
****************************************/
void showMenu(void){
//1.機能番号の一覧を表示する
cout << "機能番号を選択してください" << endl;
cout << "プログラムを終了する" << "・・・・・・・" << END << endl;
cout << "行列に値を入力する" << "・・・・・・・・" << INPUT << endl;
cout << "行列の値を表示する" << "・・・・・・・・" << SHOW << endl;
cout << "行列の指定された列を入れ替える" << "・・" << COLUMN << endl;
cout << "行列の指定された行を入れ替える" << "・・" << ROW << endl;
cout << "行列を転置する" << "・・・・・・・・・・" << TRANSPOSE << endl;
}
/****************************************
行列に値を入力する
****************************************/
void getMatrix(void){
//1.各行rowに対して以下の処理を繰り返す
for(int i = 0; i < N; i++){
//1.1.当該行の各列columnに対して以下の処理を繰り返す
for(int j = 0; j < M; j++){
//1.1.1.行列のrow行column列の要素に値を入力する
cout << "matrix[" << i << "] = ";
cout << "matrix[" << j << "] = ";
cin >> matrix[j];
}
}
}
/******************************
行列を表示する
******************************/
void showMatrix(void){
//1.各行rowに対して以下の処理を繰り返す
for(int i = 0; i < N; i++){
//1.1.当該行の各列columnに対して以下の処理を繰り返す
for(int j = 0; j < M; j++){
//1.1.1.行列のrow行column列の要素の値を表示する
cout << matrix[j] << "\t";
}
//1.2.改行する
cout << endl;
}
}
/******************************
行列の列を入れ替える
******************************/
void ExchangeColumn(int column1, int column2){
//1.各行rowに対して以下の処理を繰り返す
for(int i = 0; i < N; i++){
//1.1.行列のrow行column1列目の要素とrow行column2列目の要素とを入れ替える
int temp = matrix[column1];
matrix[column1] = matrix[column2];
matrix[column2] = temp;
}
}
/**********************************
行列の行を入れ替える
**********************************/
void ExchangeRow(int row1, int row2){
//1.各行columnに対して以下の処理を繰り返す
for(int j = 0; j < M; j++){
//1.1.行列のrow1行column列目の要素とrow2行column列目の要素とを入れ替える
int temp = matrix[row1][j];
matrix[row1][j] = matrix[row2][j];
matrix[row2][j] = temp;
}
}
/***********************************
行列を転置する
***********************************/
void transposeMatrix(void){
//1.各行rowに対して以下の処理を繰り返す
for(int i = 1; i < N; i++){
//1.1.当該行の0~row-1番目までの各列columnに対して以下の処理を繰り返す
for(int j = 0; j < N -1; j++){
//1.1.1.行列のrow行column列目の要素とcolumn行row列目の要素とを入れ替える
int temp = matrix[j];
matrix[j] = matrix[j];
matrix[j] = temp;
}
}
}
[/pre]
Re:行列について(c++)
前回投稿より、少し進んだようですね。
さて、警告は
>if(0 <= column1 <= 2, 0 <= column2 <= 2){
2つの条件を並べて書くなら、 && か || です。
ついでに、breakは、ifブロックの外でなくていいですか?
長いプログラムを、字下げなしで貼られると、読む気がしません。
preをつけようと努力はしたみたいですが、このようなときは、削除キーを
入れておいて、うまくいかなかったときは、編集してください。
または、長いプログラムはファイルで添付してください。
さて、警告は
>if(0 <= column1 <= 2, 0 <= column2 <= 2){
2つの条件を並べて書くなら、 && か || です。
ついでに、breakは、ifブロックの外でなくていいですか?
長いプログラムを、字下げなしで貼られると、読む気がしません。
preをつけようと努力はしたみたいですが、このようなときは、削除キーを
入れておいて、うまくいかなかったときは、編集してください。
または、長いプログラムはファイルで添付してください。
Re:行列について(c++)
preは二つに分けた時に、一緒に分けてしまったのを削除キーを設定せずにUPしたのとともに
後で気づいてしまいました。
以後気をつけます。すみませんでした。
&&に変えても警告はなくなりませんでした。
後で気づいてしまいました。
以後気をつけます。すみませんでした。
&&に変えても警告はなくなりませんでした。
Re:行列について(c++)
>以後
Name: kos-mos ..初心者(8,456ポイント) Date: 2009/12/16(水) 12:28 No:44221 引用 編集
名前の右のリンクから編集できます。
>if(0 <= column1 <= 2, 0 <= column2 <= 2){
if(0 <= column1 <= 2 && 0 <= column2 <= 2){
こうした、ってことでしょうか?
Name: kos-mos ..初心者(8,456ポイント) Date: 2009/12/16(水) 12:28 No:44221 引用 編集
名前の右のリンクから編集できます。
>if(0 <= column1 <= 2, 0 <= column2 <= 2){
if(0 <= column1 <= 2 && 0 <= column2 <= 2){
こうした、ってことでしょうか?
Re:行列について(c++)
訂正します。すみません。
//3.3.1.入れ替わる列番号column1,column2を入力する cout << "入れ替える列番号を入力してください(0~2)" << endl; cin >> column1; cin >> column2; if(0 <= column1 <= 2 && 0 <= column2 <= 2){ //3.3.2.配列のcolumn1列とcolumn2列を入れ替える ExchangeColumn(column1, column2); } break;としたところ(抜粋です)、「warning C4804: '<=' 演算中の 'bool' 型の使用方法が安全ではありません」と警告されました。
Re:行列について(c++)
if(0 <= column1 && column1<= 2) && (0 <= column2 && column<= 2)
&か|なのかはコード読んでないのでわからないですが。
&か|なのかはコード読んでないのでわからないですが。