🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1537閲覧

バス時刻表を格納する一次元リストとその反復子を操作するプログラム

退会済みユーザー

退会済みユーザー

総合スコア0

STL

STL(Standard Template Library)は、ジェネティックコンテイナー、イテレーター、アルゴリズム、そして関数オブジェクトのC++ライブラリーです。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/11/27 04:03

編集2019/11/29 07:18

バス時刻表を格納する一次元リストとその反復子を操作するプログラムを作成しています.
・バス時刻表(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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2019/11/27 04:08

問題となっている事柄を明らかにしてください。現状ではただの丸投げです。
退会済みユーザー

退会済みユーザー

2019/11/27 04:12

・リストに登録されている要素を一覧表示する関数 ・反復子の直前に新規要素を追加する。 ・反復子が参照する要素を削除する ・反復子を次の要素に進める ・反復子を前の要素に進める 以下のコードをどのように書いたら良いのか分からないので、教えてください。よろしくお願いします。
yumetodo

2019/11/27 05:22

すでに書かれているように見えます。ロジックがぐちゃぐちゃですが。
退会済みユーザー

退会済みユーザー

2019/11/27 05:51 編集

現在のコードで実行すると、1〜5のどのコマンド番号を選択しても、実行結果が画面に出力されずに、また機能一覧が表示されます。実行結果が出力されるには、コードをどのように書いたら良いでしょうか?教えてください。よろしくお願いします。
yumetodo

2019/11/27 05:56

そりゃロジックぐちゃぐちゃで意図した挙動はするわけない。それをどうすればいいか答えるのはteratailのヘルプにある通り推奨されない行為なのでいたしません。 https://teratail.com/help/avoid-asking まあまずどういう入力に対してどういう出力をしないといけないのか確認するところから初めてはどうでしょうか。
y_waiwai

2019/11/27 12:49

あなたのいう反復子というのはどういうもんなんでしょうか。ちと意味不明です
退会済みユーザー

退会済みユーザー

2019/11/27 13:26

反復子とはポインタみたいなもので、要素の一つを指す目印のことです。
y_waiwai

2019/11/27 13:29

あなた独自の用語を使ってらっしゃるようで、質問文が意味不明になってますねー
yumetodo

2019/11/27 13:31

>y_waiwai いや反復子ってiteratorでしょ、見ればわかるのでは
guest

回答1

0

ベストアンサー

void show() {
list<Arrival>::iterator q;
p = busSchedule.begin();
for (q = busSchedule.begin(); q != busSchedule.end(); q++) {
cout << p->busStopType << " " << p->busStopName << " " << p->time << endl;
p++;
}
}

の部分ですが、pは変動させる理由はなんでしょうか?
qが表示する場所を指しているで、
pとqが一緒なら、その列に>を表示する・・・というプログラムなら実装できそうですよね!
<< endl;を書かないことで改行せずに描画できます。

・コマンド番号の3と4の処理が正しく実行されないのですが,コードをどのように修正したらよいでしょうか?

上記のshow()のせいかと思います。

C++

#define SHOW 1 //表示
#define INSERT 2 //追加
#define DELETE 3 //削除
#define NEXT 4 //次の要素
#define PREVIOUS 5 //前の要素
#define END 6 //終了

は、enumを利用するといいかもしれません・・・! NEXTとPREVIOUSは存在しないところまで行かないようにエラー処理をすることも大切です! ======================================================================================== 11/29追記 1.show関数のp関係は削除。  showを実行するたびpは最後尾を指してしまいます。  もし最後尾にしたいのであれば、p=busSchedule.end();の方がいいです。 2.show関数のcoutを全てp->からq->へ変更  1.でpがshow内で変動しなくなり、同じ要素しか指さないため。  また、forの意味が特に無くなっています。 3.show関数の内容描画の前に、p=qの時だけ">"を描画する。 4.コマンド4,5ははみ出ないようにp!=busSchedule.begin()のような対策を。  pが最後尾(end())じゃなければp++。pが先頭(begin())でなければp--。  pが行き過ぎないようそういった条件が必要になります。

投稿2019/11/28 01:39

編集2019/11/29 00:40
kurara674

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/28 08:36 編集

pは変動させないと,2つ目の要素を入力したときに,一つ目の要素が上書きされてしまうので,p++;としています. コマンド番号の3と4の処理が正しく実行されないのですが,コードをどのように修正したらよいでしょうか? 教えてください.よろしくお願いします.
kurara674

2019/11/28 14:44

「pは変動させないと,2つ目の要素を入力したときに,一つ目の要素が上書きされてしまうので,p++;としています.」 ですが、insertは自動でずらしてくれたはず・・かと? そして、このままだと、showを実行するとどれだけ4と5のコマンドをしたところでend()(要素+1)を指してしまいます。 また、入力関係をshow関数に書くのも綺麗とは言えません。 「コマンド番号の3と4の処理が正しく実行されないのですが,コードをどのように修正したらよいでしょうか?」 の件ですが、上記に書いた(要素+1)がミソでして・・・ 要素+1のところに消せるデータなど無く、次の指す場所もありません。 逆に先頭で-1もすることができないです。
kurara674

2019/11/28 14:57

あ、ただの間違えかもしれませんが、showのcoutに書いてあるのはp->よりもq->が良いかと。
退会済みユーザー

退会済みユーザー

2019/11/28 15:32

コードをどのように修正したらよいのかわからないので,具体的に教えてください.よろしくお願いします.
kurara674

2019/11/29 00:41

手順を追記しました。 コードを書いてしまえば早いのですが、理解しなければまた躓いてしまうでしょうし言葉だけで。 1つ1つ潰していけばできると思うので頑張ってください!
退会済みユーザー

退会済みユーザー

2019/11/29 04:24

手順を教えていただきありがとうございます. 上記のようにコードを修正したのですが,コマンド番号4の反復子を次の要素に進める操作が,無効になってしまいます. 正しく操作が行われるには,コードをどのように修正したらよいでしょうか?教えてください.よろしくお願いします.
kurara674

2019/11/29 05:20

show()の中で、pをbegin(先頭)に戻しているからですね。 なのでそちらを削除してみてください!
退会済みユーザー

退会済みユーザー

2019/11/29 07:07

p = busSchedule.begin();を削除したところ,コマンド番号4を選択すると反復子の「 > 」のマークが消えてしまいます. 反復子を次の要素に進めるには,コードをどのように修正したらよいでしょうか?教えてください.よろしくお願いします.
kurara674

2019/11/30 05:32

今のshow関数だと、pがendを選択している時は描画できないようになっています。 for文を抜けた後、 qがend()なら、 cout << ">" << endl; というブログラムを追加してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問