質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

2050閲覧

queについて

ikuo-biyori

総合スコア56

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2017/04/28 07:03

編集2017/05/04 03:19

いつもお世話になっています。C初心者でただいま勉強中です。
ラウンドロビンスケジューリングと呼ばれる処理方法(CPU がプロセスを順番に処理します。各プロセスは最大 q ms(これをクオンタムと呼びます)だけ処理が実行されます。q ms だけ処理を行っても、まだそのプロセスが完了しなければ、そのプロセスは列の最後尾に移動する)プログラムを作りたいんですが、自分で考えたコードで理論上問題ないと思うんですが、実行結果と一致しません。なにがいけないのか教えてください。
以下が自分の書いたコードです。```C言語
コード

#include<string.h> #include<stdio.h> #define LEN 100005 typedef struct pp{ char name[100]; int t; }P; P Q[LEN+1]; int head, tail, n; void enqueue(P x){ Q[tail]=x; if( tail + 1 == LEN) tail = 0; else tail++; } P dequeue(){ P y; y = Q[head]; if( head + 1 == LEN) head = 0; else head++; return y; } int main(){ int i, q; scanf("%d %d", &n, &q); P u; P TIME[n+1]; int c; int elaps=0,count=0; for ( i = 1; i <= n; i++){ scanf("%s", Q[i].name); scanf("%d", &Q[i].t); } for ( i = 1; i <= n; i++){ enqueue(Q[i]); } while(1){ u=dequeue(); c=u.t-q;/*あまった時間*/ if(c<=0){ count++; // printf("countは%d\n",count); elaps=u.t+elaps; // printf("aaaaaaa%d\n",elaps); TIME[count].t=elaps; printf("%d\n",TIME[count].t); if(count==n){ break; } // break; } else if(c>0){ elaps+=q; // printf("elapsは%d\n",elaps); u.t=c; enqueue(u); } } for(count=1;count<n+1;count++){ // printf("%d\n",TIME[count].t); } return 0; }

入力例
5 100
p1 150
p2 80
p3 200
p4 350
p5 20
問題の実行結果
p2 180
p5 400
p1 450
p3 550
p4 800
自分の実行結果はこうなりました。
180
560
610
630
800
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

あまり詳しくは見ていませんが、気になったところ。

TIME配列の要素数が1固定。
scanfのあとに宣言する必要があるのでは。
領域外を参照して、おかしな動きになっている可能性があります。

配列の要素が1始まりに違和感。
辻褄があっていればいいですが、基本0始まりです。
0から使う癖を今から身に着けた方がよいです。

プログラムの問題とは関係ないですが…
人に見てもらうソースコードです。
インデントくらいきちんとしましょう。

投稿2017/04/28 07:28

ttyp03

総合スコア16998

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

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

ikuo-biyori

2017/05/04 03:15

scanfのあとにTIME配列を宣言したらうまくいきました。インデントの件についてこれから気をつけます。ご指摘ありがとうございます。
ikuo-biyori

2017/05/04 03:17

180 400 450 550 800 はうまくいったのですが、 p2 p5 p1 p3 p4 の出力がどうやればできるか分かりません。すみません、おしえてください。
guest

0

全部は見ていませんが。

enqueue()を使わずに、Qに直接要素をぶち込み、ぶち込んだ要素を直接参照してenqueue()していますが、大丈夫ですか?

C

1P Q[LEN+1]; 2// 中略 3 for (i = 1; i <= n; i++) { 4 scanf("%s", Q[i].name); 5 scanf("%d", &Q[i].t); 6 } 7 8 for (i = 1; i <= n; i++) { 9 enqueue(Q[i]); 10 }

こうではないですか?

C

1 for (i = 1; i <= n; i++) { 2 scanf("%s", u.name); 3 scanf("%d", &u.t); 4 enqueue(u); 5 }

投稿2017/05/04 07:57

編集2017/05/04 08:14
naomi3

総合スコア1105

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

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

ikuo-biyori

2017/05/04 08:05

for (i = 1; i <= n; i++) { enqueue(Q[i]); } のところいらないってことですか?
ikuo-biyori

2017/05/04 08:14

すいません、自己解決できました。お答え頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問