#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> typedef struct _proc { char name[32]; /*定義進程名稱*/ int team; /*定義柱面號*/ int ci; /*定義磁道面號*/ int rec; /*定義記錄號*/ struct _proc *prior; struct _proc *next; }PROC; PROC *g_head=NULL,*g_curr=NULL,*local; int record=0; int yi=1; void init() { PROC *p; /*初始化鏈表(初始I/O表)*/ g_head = (PROC*)malloc(sizeof(PROC)); g_head->next = NULL; g_head->prior = NULL; p = (PROC*)malloc(sizeof(PROC)); strcpy(p->name, "P1"); p->team=100; p->ci=10; p->rec=1; p->next = NULL; p->prior = g_head; g_head->next = p; g_curr=g_head->next; p = (PROC*)malloc(sizeof(PROC)); strcpy(p->name, "P2"); p->team=30; p->ci=5; p->rec=5; p->next = NULL; p->prior = g_curr; g_curr->next = p; g_curr=p; p = (PROC*)malloc(sizeof(PROC)); strcpy(p->name, "P3"); p->team=40; p->ci=2; p->rec=4; p->next = NULL; p->prior = g_curr; g_curr->next = p; g_curr=p; p = (PROC*)malloc(sizeof(PROC)); strcpy(p->name, "P4"); p->team=85; p->ci=7; p->rec=3; p->next = NULL; p->prior = g_curr; g_curr->next = p; g_curr=p; p = (PROC*)malloc(sizeof(PROC)); strcpy(p->name, "P5"); p->team=60; p->ci=8; p->rec=4; p->next = NULL; p->prior = g_curr; g_curr->next = p; g_curr=g_head->next; local = (PROC*)malloc(sizeof(PROC)); /*選中進程*/ strcpy(local->name, "P0"); local->team=0; local->ci=0; local->rec=0; local->next=NULL; local->prior=NULL; } void PrintInit() /*打印I/O表*/ { PROC *t = g_head->next; printf("-------------------------------------\n"); printf(" ---------I/O LIST---------\n"); printf(" process team ci rec \n"); while(t!=NULL) { printf("%4s %8d %8d %5d\n", t->name, t->team, t->ci, t->rec ); t = t->next; } printf("\n\nCurrent process is :\n"); printf("------------------------------\n\n"); printf(" process team ci rec \n"); printf("%4s %8d %8d %5d\n", local->name, local->team, local->ci, local->rec ); switch(yi) { case 1:{printf("current direction is UP\n");break;} case 0:{printf("current direction is down\n");break;} } } void acceptreq() /*接受請求函數*/ { PROC *p; p = (PROC*)malloc(sizeof(PROC)); printf("please input the information of the new process\nprocess-name:\nprocess-team\nprocess-ci\nprocess-rec\n"); printf("1.name\n"); scanf("%s",p->name); printf("2.team 0-199\n"); scanf("%d",&p->team); /*輸入請求進程信息*/ printf("3.ci 0-19\n"); scanf("%d",&p->ci); printf("4.rec 0-7\n"); scanf("%d",&p->rec); getchar(); g_curr=g_head; /*將此節點鏈入I/O請求表*/ while(g_curr->next!=NULL) g_curr=g_curr->next; p->next=NULL; p->prior=g_curr; g_curr->next=p; g_curr=g_head->next; printf("NEW I/O LIST\n\n"); PrintInit(); /*將新的I/O請求表輸出*/ } void qddd() /*驅動調度函數*/ { PROC *out; int min; int max=g_head->next->team; if (g_head->next==NULL); /*若已全部調度,則空操作*/ else { switch (yi) { case 1: { min=g_head->next->team;out=g_head->next; /*選出最小的team進程,模擬啟動此進程*/ strcpy(local->name,out->name); local->team=out->team; local->ci=out->ci; local->rec=out->rec; for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next) { if (g_curr->team > record) { min = g_curr->team;break;} } for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next) { if (min>=g_curr->team&&g_curr->team>record) { min=g_curr->team; out=g_curr; strcpy(local->name,out->name); local->team=out->team; local->ci=out->ci; local->rec=out->rec; } } printf("\n-----------------------\n"); printf("the process choosed :\n"); printf(" process team ci rec \n"); printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci,out->rec ); record = local->team; printf("%d",record); for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next) { if (max<g_curr->team) max=g_curr->team; } if(max==record) { yi=0; record=1000; break; } break; }/*case 1*/ case 0: /*case 1 的對稱過程*/ { max=g_head->next->team;out=g_head->next; strcpy(local->name,out->name); local->team=out->team; local->ci=out->ci; local->rec=out->rec; for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next) { if (g_curr->team < record) { max = g_curr->team;break;} } for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next) { if (max<=g_curr->team&&g_curr->team<record) { max=g_curr->team; out=g_curr; strcpy(local->name,out->name); local->team=out->team; local->ci=out->ci; local->rec=out->rec; } } printf("\n-----------------------\n"); printf("the process choosed :\n"); printf(" process team ci rec \n"); printf("%4s %8d %8d %5d\n", out->name, out->team, out->ci,out->rec ); min=g_head->next->team; for (g_curr=g_head->next;g_curr!=NULL;g_curr=g_curr->next) { if (min>g_curr->team) min=g_curr->team; } record = local->team; if(min==record) { yi=1; record=0; break; } break; } default : return -1; }/*switch*/ if (out->next==NULL) /*將選中的進程從I/O請求表中刪除*/ { out->prior->next=NULL; free(out); } else { out->prior->next=out->next; out->next->prior=out->prior; free(out); } }/*else*/ } void acceptnum() /*通過輸入0~1選擇‘驅動調度’或是‘接受請求’*/ { float num; char c; while(1) { printf("----------------------------------------------\n"); printf("please input a number between 0 and 1\nnum<=0.5:accept request\nnum>0.5:qudong diaodu\n\nnum==2:I/O LIST\n\nnum=?\n"); scanf("%f",&num); getchar(); while((num<0||num>1)&&num!=2) /*過濾不合法數據 注意:本程序其他輸入數據可能未過濾*/ { printf("number ERROR!Input again please!\nnum=?\n "); scanf("%f",&num); getchar(); } if(num>0.5&&num!=2) /*驅動調度*/ { if (g_head->next==NULL) { printf("\n\n"); printf("---------------------\n"); printf("I/O list is empty!!!\n"); /*請求表為空 無需調度*/ } else { printf("qudong diaodu\n"); qddd(); /*調用函數進行調度*/ } } else if (num<=0.5) /*接受請求*/ { printf("accept request\n\n"); acceptreq(); } else if (num==2) /*通過輸入2顯示當前請求I/O表*/ { printf("I/O LIST;"); printf("-------------------\n"); PrintInit(); printf("\n"); } printf("-----------------------\n"); printf("choose 'n' to quit else to continue\n"); /*輸入n離開本程序*/ if(strcmp(c=getchar(),'n')==0||strcmp(c=getchar(),'N')==0) { //clrscr(); printf("\n\n\n\n\n\n"); printf("thank you for testing my program!\n"); printf(" ---by 01\n"); sleep(2); printf("\n\nBYEbye!!"); sleep(2); return -1; } else { //clrscr(); } } } main () /*主程序*/ { init(); PrintInit(); acceptnum(); }
|