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

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

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

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

Q&A

解決済

2回答

3045閲覧

C言語 キューの問題の解答が分かりません。

hukusama

総合スコア31

C

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

0グッド

2クリップ

投稿2016/07/05 01:57

C言語の勉強をやり始めて二か月の者です。
今、キューの問題を解いているのですが、解答が分かりません。この問題の解説はあるのですが、読んでも理解するのが難しくコードが書けません。
どなたか教えていただけないでしょうか?

キューの問題は以下に記載いたします。

名前 namei と必要な処理時間 timei を持つ n 個のプロセスが順番に一列に並んでいます。ラウンドロビンスケジューリングと呼ばれる処理方法では、CPU がプロセスを順番に処理します。各プロセスは最大 q ms(これをクオンタムと呼びます)だけ処理が実行されます。q ms だけ処理を行っても、まだそのプロセスが完了しなければ、そのプロセスは列の最後尾に移動し、CPU は次のプロセスに割り当てられます。

例えば、クオンタムを 100 msとし、次のようなプロセスキューを考えます。

A(150) - B(80) - C(200) - D(200)
まずプロセス A が 100 ms だけ処理され残りの必要時間 50 ms を保持しキューの末尾に移動します。

B(80) - C(200) - D(200) - A(50)
次にプロセス B が 80 ms だけ処理され、時刻 180 ms で終了し、キューから削除されます。

C(200) - D(200) - A(50)
次にプロセス C が 100 ms だけ処理され、残りの必要時間 100 ms を保持し列の末尾に移動します。

D(200) - A(50) - C(100)
このように、全てのプロセスが終了するまで処理を繰り返します。

ラウンドロビンスケジューリングをシミュレートするプログラムを作成してください。

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

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

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

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

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

Mr_Roboto

2016/07/05 02:13

少しでも自分が考えたコードを書かないと丸投げのマイナス評価をつけ続けられてしまうと思いますよ。 それができないのであれば、現状ではレベルが高すぎる問題に挑戦してるのではないでしょうか。 「質問するときのヒント」https://teratail.com/help/question-tips を読んだことがなければ読んでみてくださいね。
hukusama

2016/07/05 02:18

BJCRobotさん 「質問するときのヒント」を読んでから、また質問させていただきます。 この度はご迷惑をおかけして、大変申し訳ございません。
Mr_Roboto

2016/07/05 02:20

いえいえ迷惑だなんてとんでもないです 。 がんばってくださいね。誰でも通る道ですよ ^_^
Zuishin

2016/07/05 02:30

最近同じ問題を見た気がします。 https://teratail.com/questions/38081 解説を読んで理解できないならコードが書けないのは当たり前なので、まずその解説を理解するところから始めましょう。 ここに転記できますか? 転記するだけでなく、どの程度まで理解できるのか、間違っているかもしれないけどどのように思っているのかを書けば、間違いは正されるでしょうし、難解な部分には解説や例示がつくと思います。
guest

回答2

0

この問題ってまるっきり
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_B&lang=jp
と同じじゃない?

投稿2016/07/05 08:52

PineMatsu

総合スコア3579

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

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

0

ベストアンサー

これでわかる? ’なにがわからんか'を明記せんと答えようがないよ。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <assert.h> 5 6struct process_t { 7 char* name; /* 名前 */ 8 int time; /* 処理に必要な時間 */ 9 struct process_t* next; /* 次のprocess */ 10}; 11 12typedef struct process_t process; 13 14/* processを生成する */ 15process* new_process(const char* n, int t) { 16 process* prc = (process*)malloc(sizeof(process)); 17 assert( prc != NULL ); 18 prc->name = (char*)malloc(strlen(n)+1); 19 assert( prc->name != NULL ); 20 strcpy(prc->name, n); 21 prc->time = t; 22 prc->next = NULL; 23 return prc; 24} 25 26/* prcを廃棄する */ 27void delete_process(process* prc) { 28 free(prc->name); 29 free(prc); 30} 31 32void print_process(const process* prc) { 33 printf("%s(%4d) ", prc->name, prc->time); 34} 35 36/* queの末尾に prcを追加し、queを返す */ 37process* enque(process* que, process* prc) { 38 prc->next = NULL; 39 if ( que != NULL ) { /* queが空でないなら */ 40 /* queの末尾を辿り */ 41 process* p = que; 42 while ( p->next != NULL ) { 43 p = p->next; 44 } 45 /* 末尾の次に prcを繋ぐ */ 46 p->next = prc; 47 } else { /* queが空なら */ 48 que = prc; /* prcが先頭となる*/ 49 } 50 return que; 51} 52 53int main() { 54 const int quantum = 100; 55 process* queue = NULL; 56 queue = enque(queue, new_process("A", 150)); 57 queue = enque(queue, new_process("B", 80)); 58 queue = enque(queue, new_process("C", 200)); 59 queue = enque(queue, new_process("D", 200)); 60 61 while ( queue != NULL ) { /* queueが空になるまでくりかえす */ 62 process* prc = queue; /* 先頭のprocessを取り出し */ 63 queue = queue->next; /* queueをひとつ進める */ 64 print_process(prc); 65 printf("-> "); 66 prc->time -= quantum; /* quantumを引いて */ 67 print_process(prc); 68 if ( prc->time > 0 ) { /* 処理が完了していないなら */ 69 printf("queued again\n"); 70 queue = enque(queue, prc); /* queueの末尾に再投入 */ 71 } else { /* 完了したら */ 72 printf("FINISHED\n"); 73 delete_process(prc); /* processを廃棄 */ 74 } 75 } 76 return 0; 77}

投稿2016/07/05 03:03

episteme

総合スコア16614

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

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

hukusama

2016/07/06 07:33

この度はご迷惑をおかけして、大変申し訳ございませんでした。友人にも聞いて解決致しました。ご教示ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問