今回は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列)に値を入力する
> 行列を表示する
まず、この部分だけ作ってみてください。
問題分の他の部分は無視しても構いませ
-
kos-mos
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;
}
}
}まだ習っていないので調べて考えてみたのですが、これでいいんですかね?
-
Dixq (管理人)
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;
}-
non
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++の宿題で困っています。(問題)
> まだ習っていないので調べて考えてみたのですが、これでいいんですかね?
コンパイルして、実行して、結果を確認してください。
ここまでは自分でできるでしょ。
(できなかったらそのことについて質問)
自分で満足できる結果が得られているのならば、その旨も書いてください。
コンパイルして、実行して、結果を確認してください。
ここまでは自分でできるでしょ。
(できなかったらそのことについて質問)
自分で満足できる結果が得られているのならば、その旨も書いてください。