类函数不会永久更改成员变量

Class function does not change member variables permanently

本文关键字:成员 变量 类函数      更新时间:2023-10-16

我正在尝试实现FCFS先进先出(FIFO),也称为先到先得(FCFS)C++算法。

#include<bits/stdc++.h>
using namespace std;
class Process{
public:
static int count;
static int cycle_count;
int id;
int at;
int wt;
int tat;
int bt;
Process(){
id = count++;
}
void compute(){
if (cycle_count < at){
cycle_count = at;
}
cycle_count += bt;
tat = cycle_count;
wt = tat - bt;
}
};
float average_wt(int n, vector<Process> v){
float avg = 0;
for (Process i: v){
avg += i.wt;
}
avg /= n;
return avg;
}
float average_tat(int n, vector<Process> v){
float avg = 0;
for (int i = 0; i < n; ++i){
avg += v[i].tat;
}
avg /= n;
return avg;
}
void print(int n, vector<Process> v){
cout << "ProcesstBurst TimetArrival TimetWaiting TimetTurnaround Time" << endl;
cout << "-------t----------t------------t------------t---------------" << endl;
for(Process i: v){
i.compute();
cout << i.id << "ttt" << i.bt << "ttt" << i.at << "tttt" << i.wt << "tttt" << i.tat << endl;
}
cout << "Average Waiting Time: " << average_wt(n, v) << endl;
cout << "Average Turnaround Time: " << average_tat(n, v) << endl;
cout << endl;
}

bool sort_on_at(Process a, Process b){
return a.at < b.at;
}
int Process::count = 0;
int Process::cycle_count = 0;
int main(int argc, char const *argv[]) {

int n;
cout << "Enter the number of processes: ";
cin >> n;
vector<Process> process(n);
for(int i = 0; i < n; ++i){
cout << "Process " << i << ":" << endl;
cout << "tArrival Time: ";
cin >> process[i].at;
cout << "tBurst Time: ";
cin >> process[i].bt;
}
sort(process.begin(), process.end(), sort_on_at);
print(n, process);
return 0;
}

问题是此代码正确打印了各个流程的等待和周转时间,但给出了平均等待和周转时间0

预期输出:

Enter the number of processes: 3
Process 0:
Arrival Time: 0
Burst Time: 24
Process 1:
Arrival Time: 0
Burst Time: 3
Process 2:
Arrival Time: 0
Burst Time: 3
Process Burst Time  Arrival Time    Waiting Time    Turnaround Time
------- ----------  ------------    ------------    ---------------
0           24          0               0               24
1           3           0               24              27
2           3           0               27              30
Average Waiting Time: 17
Average Turnaround Time: 27

实际输出:

Enter the number of processes: 3
Process 0:
Arrival Time: 0
Burst Time: 24
Process 1:
Arrival Time: 0
Burst Time: 3
Process 2:
Arrival Time: 0
Burst Time: 3
Process Burst Time  Arrival Time    Waiting Time    Turnaround Time
------- ----------  ------------    ------------    ---------------
0           24          0               0               24
1           3           0               24              27
2           3           0               27              30
Average Waiting Time: 0
Average Turnaround Time: 0

我确实尝试了一些调试,发现compute()函数确实更改了值(因为它为各个进程打印了正确的值),但由于某种原因,wttat值对于average_tat()average_wt()中的所有进程都是0的。

如果我能说得更清楚,请告诉我。

wt

是在compute方法中计算的,但这在Process的副本上运行:

for(Process i: v){  // a copy is made
i.compute();

您需要使用值引用(在本例中&i)来处理存储在向量中的原始Process,然后wt将被保存。

for(Process& i: v){
i.compute();