鱼C论坛

 找回密码
 立即注册
查看: 1315|回复: 0

孩子期末救救

[复制链接]
发表于 2022-6-21 17:00:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
#include<ctime>
using namespace std;
int Num; //定义总进程数
int Time = 0;   //定义系统时间
int slice = 1; //定义时间片长度
#define MAXSIZE 10     //定义就绪队列最大长度
#define false 0
#define true 1

typedef struct PCB
{
        char name;
        int arrivetime;
        int runtime;
        char state;//
}PCB;
typedef struct
{
        PCB* base;
        int front;
        int rear;
}LinkQueue;
void initqueue(LinkQueue L)
{
        if (!L.base)
                exit(1);
        L.front = L.rear = 0;
}
void init(PCB p[])
{
        for (int i = 0; i < Num; i++)
        {
                p[i].name = 'A' + i;
                p[i].arrivetime = rand() % 8 + 1;
                p[i].runtime = rand() % 5 + 1;
                p[i].state = 'R';
        }
}
void print(PCB p[])
{
        cout << "进程名\t" << "到达时间\t" << "估计运行时间\t" << "进程状态" << endl;
        for (int i = 0; i < Num; i++)
        {
                cout << p[i].name << "\t" << p[i].arrivetime << "\t\t" << p[i].runtime << "\t\t" << p[i].state << endl;
        }
}
void sort(PCB p[])//插入排序
{
        for (int i = 1; i < Num; i++)
        {
                PCB key = p[i];
                int j = i - 1;
                while ((j >= 0) && (key.arrivetime < p[j].arrivetime))
                {
                        p[j + 1] = p[j];
                        j--;
                }
                p[j + 1] = key;
        }
}
void show(LinkQueue& L)
{
        while (1)
        {
                if (L.front == L.rear)
                {
                        cout << "队列为空" << endl;
                        break;
                }
                else
                {
                        cout << "进程名" << L.base[L.front].name << "\t" << "到达时间" << L.base[L.front].arrivetime << "\t"
                                << "运行时间" << L.base[L.front].runtime << "\t" << "进程状态" << L.base[L.front].state << endl;
                        L.front = (L.front + 1) % MAXSIZE;
                }
        }
}
void time_slice(LinkQueue& L, PCB p[])
{
        int count = 0;
        int* record = new int[Num];
        for (int i = 0; i < Num; i++)
        {
                record[i] = false;
        }
        while (count != Num)
        {
                for (int i = 0; i < Num; i++)
                {
                        if (Time >= p[i].arrivetime && record[i] == false)
                        {
                                L.base[L.rear] = p[i];
                                L.rear = (L.rear + 1) % MAXSIZE;
                                record[i] = true;
                        }
                }
                if (L.front == L.rear)//队列为空
                {
                        cout << "*************************系统时间为" << Time << "************************" << endl;
                        cout << "就绪队列为空" << endl;
                        Time+=slice;
                }
                else
                {
                        if (L.base[L.front].runtime == slice)
                        {
                                cout << "*************************系统时间为" << Time << "************************" << endl;
                                cout << "当前运行进程是" << L.base[L.front].name << ",即将运行完成,估计运行时间由"
                                        << L.base[L.front].runtime <<"变为"<<L.base[L.front].runtime-1<< endl;
                                L.base[L.front].state = 'F';
                                Time += slice;
                                L.base[L.front].runtime--;
                                show(L);
                                L.front = (L.front + 1) % MAXSIZE;//出队
                                count++;
                    }
                        else if (L.base[L.front].runtime != slice)
                        {
                                cout << "*************************系统时间为" << Time << "************************" << endl;
                                cout << "当前运行进程是" << L.base[L.front].name <<",估计运行时间由"
                                        << L.base[L.front].runtime << "变为" << L.base[L.front].runtime - 1 << endl;
                                L.base[L.front].state = 'r';
                                Time += slice;
                                L.base[L.front].runtime--;
                                show(L);
                                L.base[L.front].state = 'R';
                                L.base[L.rear] = L.base[L.front];//队头元素放进队尾
                                L.front = (L.front + 1) % MAXSIZE;//队头加一
                                L.rear = (L.rear + 1) % MAXSIZE;//队尾加一
                        }
                }
        }
}
int main()
{
        LinkQueue L;
        srand(unsigned int(time(NULL)));
        Num = rand() % 3 + 5;
        PCB* p = new PCB[Num];
        L.base = new PCB[MAXSIZE];
        initqueue(L);
        init(p);
        print(p);
        sort(p);
        print(p);
        time_slice(L, p);
        system("pause");
        return 0;
}
L.base[L.rear] = p[i];这一行出现问题,写入访问权限冲突
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-30 03:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表