行列について(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++は数カ月程度の初心者です。
五度目の投稿なので至らないところもあると思いますが、どうかよろしく願いします。

kos-mos

Re:行列について(c++)

#2

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

わかる範囲で書いてみましたが、3.3.1.と3.4.1.のところで入力された値が0~2ならば以下の処理を実行するという条件文を入れたのですが、これでコンパイルすると、加えたif文のところで: 「演算中の 'bool' 型の使用方法が安全ではありません」と表示されました。
どうしたらいいかわかりません。お願いします。

kos-mos

Re:行列について(c++)

#3

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

長すぎるみたいなので、半分に切りました。(その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;
    }
}

kos-mos

Re:行列について(c++)

#4

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

(その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]

non

Re:行列について(c++)

#5

投稿記事 by non » 15年前

前回投稿より、少し進んだようですね。

さて、警告は
>if(0 <= column1 <= 2, 0 <= column2 <= 2){
2つの条件を並べて書くなら、 && か || です。

ついでに、breakは、ifブロックの外でなくていいですか?

長いプログラムを、字下げなしで貼られると、読む気がしません。
preをつけようと努力はしたみたいですが、このようなときは、削除キーを
入れておいて、うまくいかなかったときは、編集してください。
または、長いプログラムはファイルで添付してください。

kos-mos

Re:行列について(c++)

#6

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

preは二つに分けた時に、一緒に分けてしまったのを削除キーを設定せずにUPしたのとともに
後で気づいてしまいました。
以後気をつけます。すみませんでした。

&&に変えても警告はなくなりませんでした。

Mist

Re:行列について(c++)

#7

投稿記事 by Mist » 15年前

> &&に変えても警告はなくなりませんでした。

どう変えたのか、どういう警告が出るのかを書かないと回答しようが無いですよ。

sizuma

Re:行列について(c++)

#8

投稿記事 by sizuma » 15年前

>以後
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){
こうした、ってことでしょうか?

kos-mos

Re:行列について(c++)

#9

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

訂正します。すみません。
//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' 型の使用方法が安全ではありません」と警告されました。

sizuma

Re:行列について(c++)

#10

投稿記事 by sizuma » 15年前

if(0 <= column1 && column1<= 2) && (0 <= column2 && column<= 2)

&か|なのかはコード読んでないのでわからないですが。

non

Re:行列について(c++)

#11

投稿記事 by non » 15年前

0 <= column1 <= 2
このような書き方はできません。&& か || を使ってください。

kos-mos

Re:行列について(c++)

#12

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

無事に警告が出ることなくコンパイルできました。
ありがとうございました。

閉鎖

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