- 締切済み
c言語
スーパーのレジがあるとします。 そこに客が並びます。その客の会計が終わったら列から抜けて次に並んでいる客の処理をします。 レジは途中で開き、閉まることがあります。 input --------- 2 Akira 3 9 Yoko 4 12 Takumi 6 20 Kouta 9 18 # 11 1 Miku 18 22 @ 22 1 Daiki 23 10 ---------------- これはファイルinput.txtの内容で、読み込みます。 最初にレジの台数を入力します。 名前の後空白で区切ってレジに到着した時間その後にまた空白で区切って処理の終了時間 # 11 1 はレジが閉まる時間でこの場合は0番目、1番目のレジがある中で11の時間に1番目のレジが閉まるということです。 @ 22 1 は22の時間に1番目のレジが開くということです。 2人以上がレジに並んでいる時にレジが閉まったら処理中の客以外は開いているレジに並びます。 客はレジに並んでいる人数が少ない列に優先的に並びます。もし同じ人数が並んでいたら数字が若いレジが優先です(0番目から) --------------------- output Akira 12 0 Yoko 16 1 Takumi 32 0 Daiki 33 1 Kouta 50 0 Miku 72 0 ------------------ outputもファイルで行います。 処理の終了した順に名前と処理時間、処理したレジの番号を出力します。 このコードを教えてもらえないでしょうか。 #define MAX_QUEUE_SIZE 10 int global_clock; typedef struct Customer { char id[20]; // 客 id int arr_time; // 客が銀行に着く時間 int ser_time; // 客の処理にかかる時間 }Customer; typedef struct TellerQueue { int status; // status, 0: close, 1:お客様が一人しか残っていない状態、つまりCLOSE, 2:open int front; // front pointer,最初の要素elementへのインデックスindex int rear; // rear pointer,最後の要素elementの次のインデックスindexを指す int count; // queue 待ち行列の人数 int current_served_time; // 現在、お客様との取引に費やしている時間 Customer queue[MAX_QUEUE_SIZE]; // 配列形式の円形待ち行列のシミュレーション。 }TellerQueue; これらの構造体が最初に与えられています。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- AsarKingChang
- ベストアンサー率46% (3467/7474)
まず、 >window[0].id >window[1].id >の2つでいいと思いますが、それが3個以上あるとしたらどう切り換えればいいでしょうか? ここは、切り替える必要はないです。 例えば、レジの数がMAX台なら、 int i; for (i=0;i<max;i++) { window[i].~~~ } と全体を回すように動かせばいいだけだと思います。 また、例えば1台目のレジに何人いるかは、 その他のレジには全く関与しないわけなので、 レジ間の比較は不要と思います。 ただ、まだ全体的に何がしたいのかが、はっきりしない部分は ありますね。 typedef struct Customer { char id[20]; // 客 id int arr_time; // 客が銀行に着く時間 int ser_time; // 客の処理にかかる時間 }Customer; タグ名と構造体名が、どちらもCustomerなので、タグ名は いらないんじゃないかと。 次にid も、idなのに、char []形式なのが、違和感はあります。 int arr_time; // 客が銀行に着く時間 時間なのにintなのも、違和感があり。 int status; // status, 0: close, 1:お客様が一人しか残っていない状態、つまりCLOSE, 2:open ここも、 1=つまりCLOSEなら、0のCLOSEとの違いが不明 int front; // front pointer,最初の要素elementへのインデックスindex ポインターって書いているのに値がインデックスになってたり int rear; // rear pointer,最後の要素elementの次のインデックスindexを指す 最後の要素の次は、「ありません」から次はないと思います。 なおC言語では、時間を表す型は time_tというものになります。 などが、今回の捕捉での回答と気になった場所になります。 ひとまず、 whileとfor命令を使いこなせれば解決する要件に感じます。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
>このコードを教えてもらえないでしょうか。 いいですよ。 ただコード書いてみてもらえますか? できればその中で、どこがわからないなども、 書いてもらえれば、他の人でもCがわかる人が 回答すると思います。 今回コードがなかったので、回答できずにいます。
補足
typedef struct Customer { char id[20]; // 客 id int arr_time; int ser_time; int nop; }Customer; main(){ Customer window[100]; } 最初に2というレジの台数があると思いますが、2代だと最初から決まっているなら window[0].id window[1].id の2つでいいと思いますが、それが3個以上あるとしたらどう切り換えればいいでしょうか? データ構造内の int nop; は並んでいる人数を数えるためのものですが、たとえばレジが10台あるとして1番目のレジに並んだら window[0].nop++ 処理を完了したら window[0].nop-- のようにしたらいいとは思うんですが10台をどう比較すればいいのかがわかりません。 今は10台だと仮定して話していますが10台は固定じゃないので...