使用c++ 结构体,实现sjf短作业优先调度算法
时间: 2023-11-17 17:05:03 浏览: 32
好的,让我向您解释一下如何使用C结构体来实现SJF短作业优先调度算法。
首先,我们需要定义一个结构体来表示每个作业的信息,包括作业的名称、到达时间、服务时间和等待时间。结构体可以定义如下:
```c
struct job {
char name[10];
int arrive_time;
int service_time;
int waiting_time;
};
```
然后,我们可以创建一个作业数组来存储所有的作业信息,并按照到达时间的顺序对它们进行排序。这可以通过一个输入函数来实现,如下所示:
```c
void input_jobs(struct job jobs[], int n) {
int i;
for (i = 0; i < n; i++) {
printf("请输入第 %d 个作业的名称、到达时间和服务时间: ", i + 1);
scanf("%s %d %d", &jobs[i].name, &jobs[i].arrive_time, &jobs[i].service_time);
}
// 按照到达时间排序
qsort(jobs, n, sizeof(struct job), cmp_by_arrive_time);
}
```
在这个函数中,我们让用户逐个输入每个作业的名称、到达时间和服务时间,并按照到达时间进行排序。我们还需要定义一个函数 cmp_by_arrive_time() 来比较两个作业的到达时间:
```c
int cmp_by_arrive_time(const void *a, const void *b) {
const struct job *j1 = (const struct job *)a;
const struct job *j2 = (const struct job *)b;
return j1->arrive_time - j2->arrive_time;
}
```
接下来,我们可以实现SJF短作业优先调度算法。该算法基于服务时间来决定下一个要执行的作业。我们使用一个指针来指向当前时间点正在执行的作业,并将其初始化为 NULL。然后,我们遍历作业数组,如果遇到了一个到达时间小于等于当前时间并且服务时间比当前作业更短的作业,就将当前指针指向该作业。最后,我们更新当前时间,将等待时间和运行时间都累加到总和中,并输出结果。
完整的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct job {
char name[10];
int arrive_time;
int service_time;
int waiting_time;
};
void input_jobs(struct job jobs[], int n);
int cmp_by_arrive_time(const void *a, const void *b);
int main() {
int n, i, current_time = 0, total_waiting_time = 0, total_service_time = 0;
struct job *current_job = NULL;
struct job *jobs;
printf("请输入作业个数: ");
scanf("%d", &n);
jobs = malloc(n * sizeof(struct job));
input_jobs(jobs, n);
for (i = 0; i < n; i++) {
if (current_job != NULL && current_time < jobs[i].arrive_time && total_service_time != 0) {
// 暂停执行当前作业,更新等待时间和当前时间
current_job->waiting_time += (jobs[i].arrive_time - current_time);
total_waiting_time += (jobs[i].arrive_time - current_time);
current_time = jobs[i].arrive_time;
}
if (current_job == NULL || jobs[i].service_time < current_job->service_time) {
// 切换到更短的作业
current_job = &jobs[i];
}
current_job->service_time--;
total_service_time++;
if (current_job->service_time == 0) {
// 当前作业执行完毕,更新当前时间
current_time += 1;
current_job = NULL;
}
}
printf("\n作业执行结果如下:\n");
for (i = 0; i < n; i++) {
printf("作业名称:%s,等待时间:%d\n", jobs[i].name, jobs[i].waiting_time);
}
printf("平均等待时间:%f\n", (float)total_waiting_time / n);
free(jobs);
return 0;
}
void input_jobs(struct job jobs[], int n) {
int i;
for (i = 0; i < n; i++) {
printf("请输入第 %d 个作业的名称、到达时间和服务时间: ", i + 1);
scanf("%s %d %d", &jobs[i].name, &jobs[i].arrive_time, &jobs[i].service_time);
}
// 按照到达时间排序
qsort(jobs, n, sizeof(struct job), cmp_by_arrive_time);
}
int cmp_by_arrive_time(const void *a, const void *b) {
const struct job *j1 = (const struct job *)a;
const struct job *j2 = (const struct job *)b;
return j1->arrive_time - j2->arrive_time;
}
```
希望这可以帮助您更好地理解如何使用C结构体来实现SJF短作业优先调度算法。