バス時刻表を格納する一次元リストとその反復子を操作するプログラムを作成しています.
・バス時刻表(busSchedule)は各バス停の到着情報(Arrival)をリスト構造につなげたものです
バス停タイプ(0:乗車のみ、1:乗降可能、2:降車のみ)
バス停名
通過時刻(hh:mmの形式)
・初期状態では空であり、反復子は末尾を参照します
・反復子が参照すべき要素が存在しない場合にはend()を参照とします
・SHOWの場合には各要素の内容を各一行に表示します
・反復子が参照する要素には、行の先頭に「 > 」のマークを付けます
(表示例)
0 kokunai 10:15
0 daisan 10:17
0 kokusai 10:27
1 tsukushino 10:41
1 kiyama 10:45
・INSERTの場合には、追加する要素のバス停名、バス停タイプ、通過時刻の時と分をキー入力から取得します
・「反復子がbegin()を参照するときのPREVIOUSコマンド」および「反復子がend()を参照するときのNEXTコマンド」は無効とします
・SHOWとINSERTの処理のみ関数にします
・listとその反復子は、大域変数として定義します
以下のコードまで作成したのですが,コマンド番号4の反復子を次の要素に進める操作が,無効になってしまいます.
正しく操作が行われるには,コードをどのように修正したらよいでしょうか?教えてください.よろしくお願いします.
C++
1#include <iostream> 2#include <list> 3#include <string> 4using namespace std; 5 6#define SHOW 1 //表示 7#define INSERT 2 //追加 8#define DELETE 3 //削除 9#define NEXT 4 //次の要素 10#define PREVIOUS 5 //前の要素 11#define END 6 //終了 12 13//バス停到着情報クラス 14class Arrival { 15public: 16 int busStopType; //バス停タイプ 17 string busStopName; //バス停名 18 string time; //通過時刻 19 20 // コンストラクタ 21 Arrival(int type, string name, string t) { 22 busStopType = type; 23 busStopName = name; 24 time = t; 25 } 26}; 27 28void showMenu(void); //機能の一覧を表示する。 29void show(); 30void insert(string busStopName, int busStopType, string time); 31 32// 大域変数 33list<Arrival> busSchedule; //バス時刻表リスト 34list<Arrival>::iterator p; //上記を参照する反復子 35 36/**** 37メイン関数 38****/ 39void main() { 40 int type=0; 41 string name, time; 42 string t; 43 int command; 44 int busStopType=0; //バス停タイプ 45 string busStopName; //バス停名 46 47 p = busSchedule.end(); //反復子がリスト末尾を指すようにする 48 49 //機能の一覧を表示する。 50 showMenu(); 51 52 //コマンド番号を入力する。 53 cout << "コマンド番号="; 54 cin >> command; 55 56 //コマンドが「終了」でない限り、以下の処理を繰り返す。 57 while (command != END) { 58 59 //コマンドが「表示」であれば、以下を実行する。 60 switch (command) { 61 case SHOW: 62 show(); 63 break; 64 65 //コマンドが「追加」であれば、以下を実行する。 66 case INSERT: 67 insert(busStopName,busStopType,time); 68 break; 69 70 //コマンドが「削除」であれば、以下を実行する。 71 case DELETE: 72 p = busSchedule.erase(p); //pの参照先を削除、戻り値は次の要素を参照 73 break; 74 75 //コマンドが「次の要素」であれば、以下を実行する。 76 case NEXT: 77 while (p != busSchedule.end()) { 78 p++; //反復子が次の要素を参照するようにする 79 } 80 break; 81 82 //コマンドが「前の要素」であれば、以下を実行する。 83 case PREVIOUS: 84 while (p != busSchedule.begin()) { 85 p--; //反復子が前の要素を参照するようにする 86 } 87 break; 88 } 89 90 // 機能の一覧を表示する。 91 showMenu(); 92 93 // コマンド番号を入力する。 94 cout << "コマンド番号="; 95 cin >> command; 96 } 97} 98 99 /***************************************** 100 機能の一覧を表示する。 101*****************************************/ 102 void showMenu(void){ 103 104 // 1. 「コマンド番号 1 は リストに登録されている要素を一覧表示する。」と表示する。 105 cout << "コマンド番号 1 は リストに登録されている要素を一覧表示する。" << endl; 106 107 // 2. 「コマンド番号 2 は 反復子の直前に新規要素を追加する。」と表示する。 108 cout << "コマンド番号 2 は 反復子の直前に新規要素を追加する。" << endl; 109 110 // 3. 「コマンド番号 3 は 反復子が参照する要素を削除する。」と表示する。 111 cout << "コマンド番号 3 は 反復子が参照する要素を削除する。" << endl; 112 113 // 4. 「コマンド番号 4 は 反復子を次の要素に進める。」と表示する。 114 cout << "コマンド番号 4 は 反復子を次の要素に進める。" << endl; 115 116 // 5. 「コマンド番号 5 は 反復子を前の要素に進める。」と表示する。 117 cout << "コマンド番号 5 は 反復子を前の要素に進める。" << endl; 118 119 // 6. 「コマンド番号 6 は プログラムを終了する。」と表示する。 120 cout << "コマンド番号 6 は プログラムを終了する。" << endl; 121 } 122 123 void show() { 124 list<Arrival>::iterator q; 125 p = busSchedule.begin(); 126 for (q = busSchedule.begin(); q != busSchedule.end(); q++) { 127 if (q == p) { 128 cout << ">"; 129 } 130 cout << q->busStopType << " " << q->busStopName << " " << q->time << endl; 131 } 132 } 133 134 void insert(string busStopName, int busStopType, string time){ 135 int type=0; 136 // 入力を受け取る 137 cout << "バス停タイプ(0:乗車のみ、1:乗降可能、2:降車のみ),バス停名,通過時刻(hh : mmの形式)> "; 138 cin >> busStopType; //バス停タイプ 139 cin >> busStopName; //バス停名 140 cin >> time; 141 p = busSchedule.insert(p, Arrival(busStopType, busStopName, time)); //pの参照先の直前に挿入、戻り値は挿入要素を参照 142 }
回答1件
あなたの回答
tips
プレビュー