void input(struct sjf *p,int N)//输入进程相关信息 { printf("请输入进程号、提交时间、运行时间:\n"); printf("\n"); for(int i=0; i<N; i++) { scanf("%s",p[i].name); scanf("%f",&p[i].daoda); scanf("%f",&p[i].ing); } }
时间: 2024-04-29 21:20:43 浏览: 49
这段代码是一个函数,函数名为`input`,包含两个参数,分别为`struct sjf *p`和`int N`。其中`struct sjf`是一个结构体类型,`*p`表示结构体指针,`int N`表示输入的进程数量。
函数的作用是输入进程的相关信息,包括进程号、提交时间和运行时间。具体实现过程如下:
1. 首先在控制台输出提示信息,要求用户输入进程号、提交时间和运行时间。
2. 然后通过`for`循环,依次输入每个进程的信息。循环次数为输入的进程数量`N`。
3. 对于每个进程,通过`scanf`函数分别输入进程号、提交时间和运行时间,并将其存储到结构体指针`p`所指向的内存中。
注意,这段代码中的`%s`、`%f`等格式控制符用于指定输入的数据类型,`p[i].name`、`p[i].daoda`和`p[i].ing`分别表示结构体中的成员变量,用于存储输入的进程号、提交时间和运行时间。
相关问题
运用c语言编程实现进程调度算法的基本过程,设计要求: (1)能够选择进程调度算法(先来先服务、短进程优先算法和高响应比优先算法)。 (2)可以输入进程数目(至少3个进程),以及各进程的提交时间和运行时间。 (3)能够显示调度过程及相应时间。(4)输出结果包含周转时间和带权周转时间(5)并有相关注释
以下是一个使用C语言编写的进程调度算法程序,实现了先来先服务、短进程优先算法和高响应比优先算法。
```c
#include <stdio.h>
#include <stdlib.h>
// 进程结构体
typedef struct {
int pid; // 进程ID
int at; // 到达时间
int bt; // 运行时间
int ct; // 完成时间
int tat; // 周转时间
float wt; // 带权周转时间
} Process;
// 比较函数,用于排序
int cmp(const void *a, const void *b) {
return ((Process*)a)->at - ((Process*)b)->at;
}
// 选择进程调度算法
int select_algorithm() {
int alg;
printf("请选择进程调度算法:\n");
printf("1. 先来先服务\n");
printf("2. 短进程优先\n");
printf("3. 高响应比优先\n");
printf("请输入数字选择算法:");
scanf("%d", &alg);
return alg;
}
// 输入进程数目和信息
void input(Process *p, int n) {
int i;
printf("请输入每个进程的到达时间和运行时间:\n");
for (i = 0; i < n; i++) {
printf("进程%d:", i + 1);
scanf("%d %d", &p[i].at, &p[i].bt);
p[i].pid = i + 1;
}
}
// 先来先服务(FCFS)算法
void fcfs(Process *p, int n) {
int i;
float avg_tat = 0, avg_wt = 0;
p[0].ct = p[0].at + p[0].bt;
p[0].tat = p[0].ct - p[0].at;
p[0].wt = (float)p[0].tat / p[0].bt;
for (i = 1; i < n; i++) {
if (p[i].at > p[i - 1].ct) {
p[i].ct = p[i].at + p[i].bt;
} else {
p[i].ct = p[i - 1].ct + p[i].bt;
}
p[i].tat = p[i].ct - p[i].at;
p[i].wt = (float)p[i].tat / p[i].bt;
}
printf("进程\t到达时间\t运行时间\t完成时间\t周转时间\t带权周转时间\n");
for (i = 0; i < n; i++) {
printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%.2f\n", p[i].pid, p[i].at, p[i].bt, p[i].ct, p[i].tat, p[i].wt);
avg_tat += p[i].tat;
avg_wt += p[i].wt;
}
avg_tat /= n;
avg_wt /= n;
printf("平均周转时间:%.2f\n", avg_tat);
printf("平均带权周转时间:%.2f\n", avg_wt);
}
// 短进程优先(SJF)算法
void sjf(Process *p, int n) {
int i, j, t = 0;
float avg_tat = 0, avg_wt = 0;
qsort(p, n, sizeof(Process), cmp);
for (i = 0; i < n; i++) {
t += p[i].bt;
p[i].ct = t;
p[i].tat = p[i].ct - p[i].at;
p[i].wt = (float)p[i].tat / p[i].bt;
}
printf("进程\t到达时间\t运行时间\t完成时间\t周转时间\t带权周转时间\n");
for (i = 0; i < n; i++) {
printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%.2f\n", p[i].pid, p[i].at, p[i].bt, p[i].ct, p[i].tat, p[i].wt);
avg_tat += p[i].tat;
avg_wt += p[i].wt;
}
avg_tat /= n;
avg_wt /= n;
printf("平均周转时间:%.2f\n", avg_tat);
printf("平均带权周转时间:%.2f\n", avg_wt);
}
// 高响应比优先(HRRN)算法
void hrrn(Process *p, int n) {
int i, j, t = 0;
float avg_tat = 0, avg_wt = 0, max_wt_ratio;
for (i = 0; i < n; i++) {
max_wt_ratio = -1;
for (j = 0; j < n; j++) {
if (p[j].ct == 0) { // 未完成的进程
float wt_ratio = 1 + (t - p[j].at) / (float)p[j].bt;
if (wt_ratio > max_wt_ratio) {
max_wt_ratio = wt_ratio;
i = j;
}
}
}
t += p[i].bt;
p[i].ct = t;
p[i].tat = p[i].ct - p[i].at;
p[i].wt = (float)p[i].tat / p[i].bt;
}
printf("进程\t到达时间\t运行时间\t完成时间\t周转时间\t带权周转时间\n");
for (i = 0; i < n; i++) {
printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%.2f\n", p[i].pid, p[i].at, p[i].bt, p[i].ct, p[i].tat, p[i].wt);
avg_tat += p[i].tat;
avg_wt += p[i].wt;
}
avg_tat /= n;
avg_wt /= n;
printf("平均周转时间:%.2f\n", avg_tat);
printf("平均带权周转时间:%.2f\n", avg_wt);
}
int main() {
int n, alg;
printf("请输入进程数目:");
scanf("%d", &n);
Process p[n];
input(p, n);
alg = select_algorithm();
switch (alg) {
case 1:
fcfs(p, n);
break;
case 2:
sjf(p, n);
break;
case 3:
hrrn(p, n);
break;
default:
printf("输入错误!\n");
}
return 0;
}
```
程序中使用了结构体来存储每个进程的信息,包括进程ID、到达时间、运行时间、完成时间、周转时间和带权周转时间。使用了qsort库函数来对进程按照到达时间排序。选择算法和输入进程数目和信息都是通过用户输入实现的。在每个算法的函数中,都使用了不同的逻辑来计算每个进程的完成时间、周转时间和带权周转时间,并输出结果。
注释中已经详细解释了每个函数和变量的作用,如果还有问题可以提出来。
请选择一个进程调度或作业调度的调度算法,进行编程实现,要求输入进程名称、进程到达时间服务时间,按键选择相应调度算法,就可以计算输出进程开始执行时间、完成时间、等待时间以及周转时间。相关需求分析(进程名称定义、优先级定义等)及定义的数据结构请详细写明。
好的,我明白了。关于进程调度或作业调度的调度算法,常用的有FCFS(First-Come-First-Serve,先来先服务)、SJF(Shortest-Job-First,最短作业优先)、优先级调度(Priority Scheduling)、轮转法(Round-Robin Scheduling)等。我可以选择其中一种算法进行编程实现,以下以SJF算法为例。
需求分析:
1. 进程名称定义:我们可以用字符串数组存储进程名称;
2. 到达时间定义:我们用整型数组存储每个进程的到达时间;
3. 服务时间定义:我们用整型数组存储每个进程需要的服务时间;
4. 优先级定义:对于SJF算法,我们不需要给每个进程设置优先级,直接按照服务时间从小到大进行调度;
5. 定义的数据结构:可以使用结构体来定义每个进程,包括进程名称、到达时间、服务时间、开始执行时间、完成时间和等待时间。
以下是示例代码(注释中有详细解释):
#include <stdio.h>
#define MAX_PROCESS 10 // 最大进程数
// 进程结构体定义
typedef struct {
char name[20];
int arrive_time;
int service_time;
int start_time; // 进程开始执行时间
int end_time; // 进程完成时间
int waiting_time; // 进程等待时间
} process;
// 输入进程信息,返回进程数量
int input_process(process p[]) {
int i, n;
printf("请输入进程数量(最多%d个):", MAX_PROCESS);
scanf("%d", &n);
printf("请输入每个进程的名称、到达时间和服务时间:\n");
for (i = 0; i < n; i++) {
printf("进程%d:", i + 1);
scanf("%s%d%d", p[i].name, &p[i].arrive_time, &p[i].service_time);
}
return n;
}
// SJF算法对进程进行排序
void sort_process(process p[], int n) {
int i, j;
process temp;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (p[i].service_time > p[j].service_time) {
temp = p[i]; p[i] = p[j]; p[j] = temp;
}
}
}
}
// 执行SJF调度算法
void sjf_schedule(process p[], int n) {
int i, time;
// 对进程按照服务时间从小到大排序
sort_process(p, n);
// 对于每个进程,计算开始执行时间、完成时间和等待时间
for (i = 0, time = 0; i < n; i++) {
p[i].start_time = time;
p[i].end_time = time + p[i].service_time;
p[i].waiting_time = time - p[i].arrive_time;
time = p[i].end_time;
}
}
// 输出进程的执行信息
void print_process(process p[], int n) {
int i;
double avg_waiting_time = 0, avg_turnaround_time = 0;
printf("进程名称 到达时间 服务时间 开始时间 完成时间 等待时间\n");
for (i = 0; i < n; i++) {
printf("%-10s %-8d %-8d %-8d %-8d %-8d\n", p[i].name, p[i].arrive_time, p[i].service_time, p[i].start_time, p[i].end_time, p[i].waiting_time);
avg_waiting_time += p[i].waiting_time;
avg_turnaround_time += (p[i].end_time - p[i].arrive_time);
}
avg_waiting_time /= n; // 平均等待时间
avg_turnaround_time /= n; // 平均周转时间
printf("平均等待时间:%.2lf\n", avg_waiting_time);
printf("平均周转时间:%.2lf\n", avg_turnaround_time);
}
int main() {
process p[MAX_PROCESS];
int n;
n = input_process(p); // 输入进程信息
sjf_schedule(p, n); // 执行SJF算法进行调度
print_process(p, n); // 输出进程的执行信息
return 0;
}
在执行程序时,输入进程的名称、到达时间和服务时间即可。程序会自动执行SJF算法进行调度,并输出每个进程的执行情况和平均等待时间、平均周转时间等信息。
阅读全文