1 #include
2 #include
3 typedef struct course{/*进程结构体*/
4 char courseName;/*进程名称*/
5 int startTime/*到达时间*/,serviceTime/*服务时间*/;
6 int survivalTime/*生存时间*/,WhetherIn/*是否就绪*/;
7 int destructionTime/*销毁时间*/,readyTime/*就绪时间*/;
8 struct course*next;
9 }course;
10 void typeIn(course*courseData,int n);/*录入进程数据*/
11 void myQSort(course*courseData,int left,int right);/*按到达时间排序进程数据*/
12 void output(course*courseData,int n);/*按到达时间升序进程数据后输出*/
13 void FCFSreal_timeSimulation(course*courseData,int n);/*实时模拟FCFS进程调度算法*/
14 void summarize(course*courseData,int n);/*实验总结*/
15 int main(){
16 int n;
17 course courseData[100];
18 while(1){
19 system("cls");
20 printf("模拟实验的进程数量:");
21 scanf("%d",&n);
22 system("cls");
23 typeIn(courseData,n);/*录入进程数据*/
24 myQSort(courseData,0,n-1);/*按到达时间排序进程数据*/
25 system("cls");
26 //output(courseData,n);/*按到达时间升序进程数据后输出*/
27 FCFSreal_timeSimulation(courseData,n);/*实时模拟FCFS进程调度算法*/
28 summarize(courseData,n);/*实验总结*/
29 system("pause");
30 }
31 return 0;
32 }
33 void typeIn(course*courseData,int n){
34 int i;
35 for(i=0;i){
36 printf("进程名称(Char):");
37 scanf(" %c",&courseData[i].courseName);
38 printf("到达时间(Int):");
39 scanf("%d",&courseData[i].startTime);
40 printf("服务时间(Int):");
41 scanf("%d",&courseData[i].serviceTime);
42 courseData[i].survivalTime=courseData[i].serviceTime;
43 courseData[i].WhetherIn=0;
44 printf("\n");
45 }
46 }
47 void myQSort(course *courseData,int left,int right){
48 int i=left,j=right;
49 course key,exchange;
50 if(i<j){
51 do{
52 key=courseData[i];
53 while(ikey.startTime)
54 j--;
55 if(i<j){
56 exchange=courseData[i];
57 courseData[i]=courseData[j];
58 courseData[j]=exchange;
59 i++;
60 }
61 while(ikey.startTime)
62 i++;
63 if(i<j){
64 exchange=courseData[i];
65 courseData[i]=courseData[j];
66 courseData[j]=exchange;
67 j--;
68 }
69 }while(i<j);
70 courseData[i]=key;
71 myQSort(courseData,left,i-1);
72 myQSort(courseData,i+1,right);
73 }
74 }
75 void output(course*courseData,int n){
76 int i;
77 printf("按到达时间升序进程数据后输出如下:\n");
78 printf("序号 进程名称 到达时间 服务时间\n");
79 for(i=0;i)
80 printf("%d\t%c\t%d\t%d\n",i+1,courseData[i].courseName,courseData[i].startTime,courseData[i].serviceTime);
81 }
82 void FCFSreal_timeSimulation(course*courseData,int n){
83 int i,j,k;
84 i=k=0;
85 course *queueF,*queueT,*p,*m;
86 queueF=queueT=NULL;
87 while(1){
88 //printf("当前时间%d:\n",i);
89 if(queueF){/*本次执行进程*/
90 if(!queueF->WhetherIn){
91 queueF->WhetherIn=1;
92 queueF->readyTime=i-1;
93 }/*
94 printf("本次执行进程:\n");
95 printf("进程名称 :%c\n",queueF->courseName);
96 printf("到达时间 :%d\n",queueF->startTime);
97 printf("服务时间 :%d\n",queueF->serviceTime);
98 printf("服务开始时间 :%d\n",queueF->readyTime);
99 printf("已服务时间 :%d\n",queueF->serviceTime-queueF->survivalTime);
100 printf("剩余服务时间 :%d\n\n",queueF->survivalTime);*/
101 queueF->survivalTime--;
102 }
103 printf("\n");
104 for(j=0;courseData[j].WhetherIn&&j/*过滤已就绪进程*/
105 for(;j/*本次就绪进程*/
106 if(courseData[j].startTime==i){
107 /*printf("本次就绪进程:\n");
108 printf("进程名称 :%c\n",courseData[j].courseName);
109 printf("到达时间 :%d\n",courseData[j].startTime);
110 printf("服务时间 :%d\n\n",courseData[j].serviceTime);*/
111 m=(course*)malloc(sizeof(course));
112 m->courseName=courseData[j].courseName;
113 m->survivalTime=m->serviceTime=courseData[j].serviceTime;
114 m->startTime=courseData[j].startTime;
115 courseData[j].WhetherIn=1;
116 m->WhetherIn=0;
117 if(queueF)
118 queueT->next=m;
119 else
120 queueF=m;
121 queueT=m;
122 }
123 if(queueT)
124 queueT->next=NULL;
125 if(queueF&&!queueF->survivalTime){/*本次销毁进程*/
126 queueF->destructionTime=courseData[k].destructionTime=i;
127 courseData[k].readyTime=queueF->readyTime;
128 /*printf("本次销毁进程:\n");
129 printf("进程名称 :%c\n",queueF->courseName);
130 printf("到达时间 :%d\n",queueF->startTime);
131 printf("服务时间 :%d\n",queueF->serviceTime);
132 printf("服务开始时间 :%d\n",queueF->readyTime);
133 printf("服务结束时刻 :%d\n",i);
134 printf("服务周转时间 :%d\n",queueF->destructionTime-queueF->startTime);
135 printf("加权周转时间 :%.2f\n\n",1.0*(queueF->destructionTime-queueF->startTime)/queueF->serviceTime);*/
136 if(queueF==queueT){
137 free(queueF);
138 queueF=queueT=NULL;
139 }
140 else{
141 p=queueF;
142 queueF=p->next;
143 free(p);
144 }
145 k++;
146 }
147 if(k==n)
148 return;
149 i++;
150 //system("pause");
151 }
152 }
153 void summarize(course*courseData,int n){
154 int i;
155 system("cls");
156 printf("实时模拟FCFS进程调度算法结果如下:\n");
157 for(i=0;i){
158 printf("进程名称 :%c\n",courseData[i].courseName);
159 printf("到达时间 :%d\n",courseData[i].startTime);
160 printf("服务时间 :%d\n",courseData[i].serviceTime);
161 printf("服务开始时间 :%d\n",courseData[i].readyTime);
162 printf("服务结束时刻 :%d\n",courseData[i].destructionTime);
163 printf("服务周转时间 :%d\n",courseData[i].destructionTime-courseData[i].startTime);
164 printf("加权周转时间 :%.2f\n\n",1.0*(courseData[i].destructionTime-courseData[i].startTime)/courseData[i].serviceTime);
165 }
166 }