第一篇:救護(hù)車調(diào)度模擬系統(tǒng)課程設(shè)計報告
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計
說 明 書
學(xué) 院: 信息科學(xué)與工程學(xué)院 班 級: 計算機11-3
完 成 人:
姓 名: 徐海杰
學(xué) 號: 201101050323 姓 名: 薛德利 學(xué) 號: 201101050324 指導(dǎo)教師:
山 東 科 技 大 學(xué)
2010年××月××日
實驗題目
救護(hù)車調(diào)度模擬系統(tǒng)
需求分析
1.問題描述
設(shè)計實現(xiàn)一個用事件驅(qū)動的“救護(hù)車調(diào)度”離散模型,模擬120急救中心響應(yīng)每個 病人的呼救信號統(tǒng)一調(diào)度救護(hù)車運行的情況。
我們對問題作適當(dāng)簡化,假設(shè):某城市共有m個可能的呼救點(居民小區(qū)、工廠、學(xué)校、公司、機關(guān)、單位等),分布著n所醫(yī)院(包含在m個點中),有k輛救護(hù)車分派在各醫(yī) 院待命,出現(xiàn)呼救病人時,由急救中心統(tǒng)一指派救護(hù)車接送至最近的醫(yī)院救治。救護(hù)車 完成一次接送任務(wù)后即消毒,并回原處繼續(xù)待命。假定呼救者與急救中心、急救中心與 救護(hù)車之間的通訊暢通無阻,也不考慮道路交通堵塞的影響??梢杂胢個頂點的無向 網(wǎng)來表示該城市的各地點和道路。時間可以分鐘為單位,路段長可表示為救護(hù)車行駛化 費的分鐘數(shù)。
2.要求
模擬每一起病人呼救—派車往救—接人回院的過程:顯示每輛救護(hù)車的狀態(tài)(待命、往救、送院{可能還有返點})和每個病人的狀態(tài)(待派車、待接、送院途中),顯示各醫(yī)院 的待命救護(hù)車隊列,實時顯示當(dāng)前的病人平均接送時間和平均派車延遲時間以及已送達(dá) 病人數(shù)。救護(hù)車應(yīng)按最快的路線接送病人。
呼救事件發(fā)生的間隔時間和地點都是隨機的(其發(fā)生頻度先給一個省缺值,可實時 調(diào)整)。點數(shù)m、點名、路段數(shù)e和每段長度以及醫(yī)院點的名稱都由教師以文本文件形 式給出,格式為:
m n e
ABCDEFGH… …
(m個點名稱,大小寫代表不同點)
AEGHK… …
(n個醫(yī)院名稱)
AB11,AC15,EG9, … … FK24,(e條路段及長度)
救護(hù)車總數(shù)及分派方案在運行前從鍵盤輸入。
3.提示
可以設(shè)3種事件:病人呼救,救護(hù)車到病人家,救護(hù)車到醫(yī)院。一個事件隊列,一 個呼救等待隊列,n個救護(hù)車待命隊列。
初始化時設(shè)置第一個病人呼救事件插入事件隊列,以啟動系統(tǒng)運行。處理病人呼救 事件時,將這個呼救排入呼救等待隊列,同時產(chǎn)生下一個病人呼救事件。
無向網(wǎng)可用鄰接多重表。求出每個醫(yī)院到其他各點的最短路徑,每個點設(shè)一個由近到遠(yuǎn)的醫(yī)院列表。
參考教科書中第3章第5節(jié):離散事件模擬。
設(shè)計說明
#include
//**********************定義結(jié)構(gòu)體**********************// typedef struct
//醫(yī)院 {
char hospital_name;
int hospital_Num;} hospital_stc;hospital_stc hospitals[10];
typedef struct
//呼救 {
int Num;
int name;} Call_stc;Call_stc call_vex[52];
typedef struct
//呼救地點與醫(yī)院距離矩陣 {
int distance;
int Num;
int name;} Call_Hos_stc;Call_Hos_stc Hos_Call_matrix[10][52];Call_Hos_stc Call_Hos_matrix[52][10];typedef struct
// 地點 {
char vex_name;
int vex_Num;} Node_stc;Node_stc vertices[52];
typedef struct
//路段 {
char v1_name;
char v2_name;
int v1_Num;
int v2_Num;
int distance_v12;} section_Node;section_Node sections[90];
typedef struct ArcCell
//路徑矩陣 {
int adj;
int w;} ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;} MGraph;MGraph G;
typedef struct ambulance //救護(hù)車 {
int Num;
int NowStatus;
char termini_name;
int wait_time;} CHE;
typedef struct QNode {
CHE che;
struct QNode *next;} QNode,*QueuePtr;
typedef struct
//救護(hù)車隊列 {
QueuePtr front;
QueuePtr rear;} LinkQueue;LinkQueue AmbuQueue[10];
typedef struct event
//事件 {
int AidNo;
int CallTime;
int DealTime;
int EventType;
char OccurName;
int Occur_GNum;
int interval;
int Hos_Num;
int Che_Num;
struct event *next;} EVENT;EVENT *EventList;EVENT *CallWaitList;
//**********************定義變量**********************// int short_path_matrix[99][99];//最短路徑矩陣
int VexNum,HosNum,ArcNum,CheNum,Call_VexNum;
// 地點數(shù),醫(yī)院數(shù),路段數(shù),救護(hù)車數(shù),呼救地點數(shù); int num[20];int nearest_Hos[99];// 最近醫(yī)院 int freqMOD=0,delayMOD=500;int AidEvent_Num=0;int EndTime=999;// 結(jié)束時間 int CurrentTime;
// 當(dāng)前時間
int ServicedNum;
//已送達(dá)病人數(shù)
int TotalDelayTime,TotalWaitTime,TotalDealTime,road_length;//總延遲,等待,處理事件,路段長度
float DelayAverage,WaitAverage,DealAverage;//平均延遲,等待,處理
//**********************定義函數(shù)**********************// void start();void ready();int GName_GNum(MGraph,char);
void readfile();//讀文件函數(shù)
void CreateGraph(MGraph *);// 創(chuàng)建矩陣 void arrange_ambulances();// 安排救護(hù)車
void InitAmbu();// 初始化救護(hù)車隊列 Status InitQueue(LinkQueue *);// 初始化 Status EnQueue(LinkQueue *,CHE);// 進(jìn)隊 Status DeQueue(LinkQueue *);// 出隊 CHE GetAmbu(LinkQueue);Status IsEmptyQueue(LinkQueue);//判斷隊列是否為空 Status Display_Queue(LinkQueue);// 顯示隊列
EVENT * InsertEvent(EVENT *,EVENT);// 插入事件隊列 EVENT * DeleteEvent(EVENT *);// 刪除事件 EVENT GetEvent(EVENT *);// 獲取事件
void Event_Call();
// 事件函數(shù) void Event_ArriveHome();void Event_ArriveHos();
void Display_WaitingAmbu();
// 顯示函數(shù) void Display_Patient_Status(EVENT *,EVENT *);void Display_Ambulance_Status(EVENT *);void Display_All();
int main()
//主函數(shù) {
system(“cls”);
// 清屏
loop:
printf(“請輸入結(jié)束時間(h<=999):n”);
scanf(“%d”,&EndTime);
if(EndTime>999)
{
printf(“無效輸入,請再次輸入!n”);
goto loop;
}
ready();
InitAmbu();
start();} void ready(){
int l,k,i,j,not_hos,temp;
int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM],D[MAX_VERTEX_NUM];
system(“cls”);
readfile();
//讀文件
arrange_ambulances();
//安排救護(hù)車
CreateGraph(&G);
//創(chuàng)建矩陣
G.vexnum=VexNum;
G.arcnum=ArcNum;
for(k=0;k<=G.vexnum-1;k++)
//最短路徑
{
Short_Path(G,k,P,D);
for(i=0;i<=G.vexnum-1;i++)
{
short_path_matrix[k][i]=D[i];
}
}
printf(“nPress any key to continue...n”);
getch();
system(“cls”);
for(i=0,k=0;i<=G.vexnum-1;i++)
// 篩選出呼救地點和醫(yī)院地點
{
not_hos=0;
for(j=0;j<=HosNum-1;j++)
{
if(i!=hospitals[j].hospital_Num)not_hos++;
else break;
}
if(not_hos==HosNum)
{
call_vex[k].Num=i;
call_vex[k].name=vertices[call_vex[k].Num].vex_name;
k++;
}
}
for(i=0;i<=HosNum-1;i++)
// 醫(yī)院距離呼救地點距離
{
for(j=0,l=0;j<=VexNum-1;j++)
{
not_hos=0;
for(k=0;k<=HosNum-1;k++)
{
if(j!=hospitals[k].hospital_Num)not_hos++;
else break;
}
if(not_hos==HosNum)
{
Hos_Call_matrix[i][l].distance=short_path_matrix[hospitals[i].hospital_Num][j];
Hos_Call_matrix[i][l].name=call_vex[l].name;
Hos_Call_matrix[i][l].Num=call_vex[l].Num;
l++;
}
}
}
for(i=0;i<=Call_VexNum-1;i++)
//呼救地點距離醫(yī)院的距離
{
for(j=0;j<=HosNum-1;j++)
{
Call_Hos_matrix[i][j].distance=Hos_Call_matrix[j][i].distance;
Call_Hos_matrix[i][j].name
=hospitals[j].hospital_name;
Call_Hos_matrix[i][j].Num
=hospitals[j].hospital_Num;
}
}
for(k=0;k<=Call_VexNum-1;k++)
//按距離排序
{
for(i=1;i<=HosNum-1;i++)
for(j=0;j<=HosNum-2;j++)
{
if(Call_Hos_matrix[k][j].distance>Call_Hos_matrix[k][j+1].distance)
{
temp=Call_Hos_matrix[k][j].distance;
Call_Hos_matrix[k][j].distance=Call_Hos_matrix[k][j+1].distance;
Call_Hos_matrix[k][j+1].distance=temp;
temp=Call_Hos_matrix[k][j].Num;
Call_Hos_matrix[k][j].Num=Call_Hos_matrix[k][j+1].Num;
Call_Hos_matrix[k][j+1].Num=temp;
temp=Call_Hos_matrix[k][j].name;
Call_Hos_matrix[k][j].name=Call_Hos_matrix[k][j+1].name;
Call_Hos_matrix[k][j+1].name=temp;
}
}
} }
void InitAmbu()
//救護(hù)車初始化 {
int i,j,counter=0;
CHE che;
for(i=0;i<=HosNum-1;i++)
{
InitQueue(&AmbuQueue[i]);
for(j=0;j<=num[i]-1;j++)
{
che.wait_time=-1;
che.NowStatus=0;
che.termini_name=' ';
che.Num=counter++;
EnQueue(&AmbuQueue[i],che);
}
} }
void start(){
EVENT hold;
int rand_num,key_num;
srand((unsigned)time(NULL));//初始化隨機函數(shù)種子
rand_num=rand()%(G.vexnum-HosNum);// 隨機產(chǎn)生病人
srand((unsigned)time(NULL));
hold.DealTime=rand()%10;
hold.OccurName=call_vex[rand_num].name;
hold.Occur_GNum=call_vex[rand_num].Num;
hold.AidNo=0;
hold.EventType=0;
hold.interval=-1;
hold.Che_Num=-1;
hold.Hos_Num=-1;
EventList=InsertEvent(EventList,hold);
for(CurrentTime=0;CurrentTime<=EndTime;)
{
while(CurrentTime==GetEvent(EventList).DealTime)
{
switch(GetEvent(EventList).EventType)
{
case 0:
Event_Call();
break;
case 1:
Event_ArriveHome();
break;
case 2:
Event_ArriveHos();
break;
}
}
if(!kbhit())
{
Ambu_WaitTime();
Display_All();
Sleep((long)(2*delayMOD));
CurrentTime++;
}
else
switch(getch())
{
case 'd':
if(delayMOD==0);
else delayMOD--;
break;
case 'a':
if(delayMOD==1000);
else delayMOD++;
break;
case 27:
exit(0);
case 's':
if(freqMOD==0);
else freqMOD--;
break;
case 'w':
if(freqMOD==100);
else freqMOD++;
break;
}
} }
//********************** ready有關(guān) 函數(shù) **********************// void readfile()//讀文件 {
FILE * fp;
int i,j;
char ch,* ch_p1,* ch_p2;
char str[8]=“ ”;
system(“cls”);
if((fp=fopen(“D:data.txt”,“r”))==NULL)
{
printf(“cannot open filen”);
exit(0);
}
for(i=0;i<=7;str[i++]=' ');
i=0;
while(1)
{
ch=getc(fp);
if(ch>=48&&ch<=57)str[i++]=ch;
else break;
}
VexNum=atoi(str);
//atoi:轉(zhuǎn)化成長整數(shù)型
printf(“給定的地點數(shù)是 %dn”,VexNum);
for(i=0;i<=7;str[i++]=' ');
i=0;
while(1)
{
ch=getc(fp);
if(ch>=48&&ch<=57)str[i++]=ch;
else break;
}
HosNum=atoi(str);
printf(“給定的醫(yī)院數(shù)是 %dn”,HosNum);
Call_VexNum=VexNum-HosNum;
for(i=0;i<=7;str[i++]=' ');
i=0;
while(1)
{
ch=getc(fp);
if(ch>=48&&ch<=57)str[i++]=ch;
else break;
}
ArcNum=atoi(str);
printf(“給定的路段數(shù)是 %dn”,ArcNum);
printf(“地點: ”);
for(i=0;i<=VexNum-1;i++)
{
ch=getc(fp);
vertices[i].vex_name=ch;
vertices[i].vex_Num=i;
printf(“%c ”,vertices[i].vex_name);
}
ch=getc(fp);
printf(“n”);
printf(“醫(yī)院: ”);
for(i=0;i<=HosNum-1;i++)
{
ch=getc(fp);
hospitals[i].hospital_name=ch;
for(j=0;j<=VexNum-1;j++)
if(vertices[j].vex_name==hospitals[i].hospital_name)
{
hospitals[i].hospital_Num=vertices[j].vex_Num;
break;
}
printf(“%c ”,hospitals[i].hospital_name);
}
ch=getc(fp);
printf(“n”);
printf(“路段: ”);
for(i=0;i<=ArcNum-1;i++)
{
sections[i].v1_name=getc(fp);
for(j=0;j<=VexNum-1;j++)
if(vertices[j].vex_name==sections[i].v1_name)
{
sections[i].v1_Num=vertices[j].vex_Num;
break;
}
putchar(sections[i].v1_name);
sections[i].v2_name=getc(fp);
for(j=0;j<=VexNum-1;j++)
if(vertices[j].vex_name==sections[i].v2_name)
{
sections[i].v2_Num=vertices[j].vex_Num;
break;
}
putchar(sections[i].v2_name);
for(j=0;j<=7;str[j++]=' ');
j=0;
while(1)
{
ch=getc(fp);
if(ch>=48&&ch<=57)str[j++]=ch;
else break;
}
sections[i].distance_v12=atoi(str);
printf(“:%d ”,sections[i].distance_v12);
} }
void arrange_ambulances()//安排救護(hù)車 {
int i,left;
loop1:
printf(“nn請輸入所有醫(yī)院救護(hù)車總數(shù)量: ”);
scanf(“%d”,&CheNum);
if(CheNum { printf(“無效輸入,請再次輸入!n”); goto loop1; } for(i=0,left=CheNum;i<=HosNum-1;i++) { loop2: printf(“請輸入 %c 醫(yī)院的救護(hù)車數(shù)量: ”,hospitals[i].hospital_name); scanf(“%d”,&num[i]); left=left-num[i]; if(left<=0&&i!=HosNum-1) { printf(“無效輸入,請重新開始!n”); goto loop2; } } printf(“n”);} void CreateGraph(MGraph *g)//創(chuàng)建矩陣 { int i,j,k; g->vexnum=VexNum; g->arcnum=ArcNum; for(i=0;i<=g->vexnum-1;i++) g->vexs[i]=vertices[i].vex_Num; for(i=0;i<=g->vexnum-1;i++) for(j=0;j<=g->vexnum-1;j++) { g->arcs[i][j].adj=0; g->arcs[i][j].w=INFINITY_; } for(k=0;k<=g->arcnum-1;k++) { i=sections[k].v1_Num; j=sections[k].v2_Num; g->arcs[i][j].adj=1; g->arcs[j][i].adj=g->arcs[i][j].adj; g->arcs[i][j].w=sections[k].distance_v12; g->arcs[j][i].w=g->arcs[i][j].w; } } Status Short_Path(MGraph G,int v0,int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM],int D[MAX_VERTEX_NUM]){ //最短路徑 int v,w,i,j,min; int final[MAX_VERTEX_NUM]; for(v=0;v<=G.vexnum-1;v++) { final[v]=FALSE; D[v]=G.arcs[v0][v].w; for(w=0;w<=G.vexnum-1;w++) P[v][w]=FALSE; if(D[v] { P[v][v0]=TRUE; P[v][v]=TRUE; } } D[v0]=0; final[v0]=TRUE; for(i=1;i<=G.vexnum-1;i++) { min=INFINITY_; for(w=0;w<=G.vexnum-1;w++) if(!final[w]) if(D[w] { v=w; min=D[w]; } final[v]=TRUE; for(w=0;w<=G.vexnum-1;w++) if(!final[w]&&(min+G.arcs[v][w].w { D[w]=min+G.arcs[v][w].w; for(j=0;j<=G.vexnum-1;j++) P[w][j]=P[v][j]; P[w][w]=TRUE; } } } //********************** InitAmbu有關(guān) 函數(shù) **********************// Status InitQueue(LinkQueue *Q){ (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode)); if(!(*Q).front)exit(OVERFLOW_); (*Q).front->next=NULL; return OK;} Status EnQueue(LinkQueue *Q,CHE e){ QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode)); if(!p) { printf(“Full!”); exit(-2); } p->che=e; p->che.NowStatus =e.NowStatus; p->che.termini_name=e.termini_name; p->che.Num=e.Num; p->next=NULL; (*Q).rear->next=p; (*Q).rear=p; return OK;} Status Display_Queue(LinkQueue Q){ QueuePtr p; if(Q.front==Q.rear) { printf(“ /”); } else { p=Q.front->next; while(p) { printf(“%2d ”,p->che.Num); p=p->next; } } return OK;} //********************** start有關(guān) 函數(shù) **********************// EVENT * InsertEvent(EVENT * h,EVENT e){ EVENT *s,*p,*q; p=h; s=(EVENT *)malloc(sizeof(EVENT)); s->CallTime=e.CallTime; s->AidNo=e.AidNo; s->DealTime=e.DealTime; s->OccurName=e.OccurName; s->Occur_GNum=e.Occur_GNum; s->EventType=e.EventType; s->interval=e.interval; s->Hos_Num=e.Hos_Num; s->Che_Num=e.Che_Num; if(h==NULL) { h=s; s->next=NULL; } else { while((s->DealTime>p->DealTime)&&(p->next!=NULL)) { q=p; p=p->next; } if(s->DealTime<=p->DealTime) { if(h==p)h=s; else q->next=s; s->next=p; } else { p->next=s; s->next=NULL; } } return h;} EVENT GetEvent(EVENT * h){ EVENT hold; hold.CallTime=h->CallTime; hold.AidNo=h->AidNo; hold.DealTime=h->DealTime; hold.OccurName=h->OccurName; hold.Occur_GNum=h->Occur_GNum; hold.EventType=h->EventType; hold.interval=h->interval; hold.Che_Num=h->Che_Num; hold.Hos_Num=h->Hos_Num; hold=*h; return hold;} void Event_Call(){ EVENT hold; int rand_num,interval,OkHos_i,call_GNo; char call_name; CHE hold_che; hold=GetEvent(EventList); CallWaitList=InsertEvent(CallWaitList,hold); EventList=DeleteEvent(EventList); OkHos_i=SearchHos(GName_GNum(G,hold.OccurName)); srand((unsigned)time(NULL)); interval=5+rand()%(60/(freqMOD/5+1)); srand((unsigned)time(NULL)); rand_num=rand()%(G.vexnum-HosNum); call_GNo=call_vex[rand_num].Num; call_name=call_vex[rand_num].name; hold.DealTime= CurrentTime+interval; hold.AidNo=AidEvent_Num++; hold.Occur_GNum=call_GNo; hold.OccurName=call_name; hold.EventType=0; hold.interval=-1; hold.Hos_Num=-1; hold.Che_Num=-1; EventList=InsertEvent(EventList,hold); if(OkHos_i!=-1) { hold=GetEvent(CallWaitList); hold_che=GetAmbu(AmbuQueue[OkHos_i]); hold.Che_Num=hold_che.Num; hold.Hos_Num=OkHos_i; hold.DealTime=CurrentTime+Call_Hos_matrix[GNo_CallNo(hold.Occur_GNum)][Hos_i_matrix(hold.Occur_GNum,OkHos_i)].distance; hold.EventType=1; hold.interval=Call_Hos_matrix[GNo_CallNo(hold.Occur_GNum)][Hos_i_matrix(hold.Occur_GNum,OkHos_i)].distance; EventList=InsertEvent(EventList,hold); CallWaitList=DeleteEvent(CallWaitList); DeQueue(&AmbuQueue[OkHos_i]); } else hold.CallTime=CurrentTime;} void Event_ArriveHome(){ EVENT hold; hold=GetEvent(EventList); EventList=DeleteEvent(EventList); hold.DealTime=CurrentTime+hold.interval; hold.EventType=2; EventList=InsertEvent(EventList,hold); road_length=2*hold.interval;} void Event_ArriveHos(){ CHE che,hold_che; EVENT hold; int interval,OkHos_i; hold=GetEvent(EventList); EventList=DeleteEvent(EventList); che.Num=hold.Che_Num; che.NowStatus=0; EnQueue(&AmbuQueue[hold.Hos_Num],che); ServicedNum++; TotalDealTime+=TotalDelayTime+road_length; DealAverage=(float)TotalDealTime/ServicedNum; if(CallWaitList!=NULL) { hold=GetEvent(CallWaitList); TotalDelayTime+=(CurrentTime-hold.DealTime); DelayAverage=(float)TotalDelayTime/ServicedNum; OkHos_i=SearchHos(GName_GNum(G,hold.OccurName)); if(OkHos_i!=-1) { hold.Hos_Num=OkHos_i; hold_che=GetAmbu(AmbuQueue[OkHos_i]); hold.Che_Num=hold_che.Num; hold.DealTime= CurrentTime+hold.interval; hold.DealTime=CurrentTime+Call_Hos_matrix[GNo_CallNo(hold.Occur_GNum)][Hos_i_matrix(hold.Occur_GNum,OkHos_i)].distance; hold.EventType=1; hold.interval=Call_Hos_matrix[GNo_CallNo(hold.Occur_GNum)][Hos_i_matrix(hold.Occur_GNum,OkHos_i)].distance; EventList=InsertEvent(EventList,hold); CallWaitList=DeleteEvent(CallWaitList); DeQueue(&AmbuQueue[OkHos_i]); } } } int Ambu_WaitTime(void){ int i; QueuePtr p; for(i=0;i<=HosNum-1;i++) { if(AmbuQueue[i].front==AmbuQueue[i].rear); else { p=(AmbuQueue[i].front)->next; while(p) { TotalWaitTime++; p=p->next; } } } } void Display_All(){ system(“cls”); printf(“n”); printf(“n”); printf(“ttt當(dāng)前時間:%4dn”,CurrentTime); printf(“n”); printf(“ 已送達(dá)病人數(shù):%4dn”,ServicedNum); printf(“n”); printf(“平均延遲:% 5.1f ”,DelayAverage); printf(“平均處理:% 5.1f ”,DealAverage); printf(“平均等待:% 5.1fn”,WaitAverage=(float)TotalWaitTime/CheNum-1); printf(“n”); Display_Patient_Status(CallWaitList,EventList); Display_Ambulance_Status(EventList); Display_WaitingAmbu(); printf(“n %c/%c:Frequence:%3d”,'W','S',freqMOD); printf(“ %c/%c:Delay:%3d”,'A','D',delayMOD); printf(“ ESC:quit”);} EVENT * DeleteEvent(EVENT * h){ if(h!=NULL)h=h->next; return h;} int GName_GNum(MGraph g,char ch){ int i; for(i=0;i<=g.vexnum-1;i++) if(ch==vertices[i].vex_name)break; return i;} int SearchHos(int call_NoinG){ int call_No,i,j,k; call_No=GNo_CallNo(call_NoinG); for(i=0;i<=HosNum-1;i++) { for(j=0;j<=HosNum-1;j++) { if(Call_Hos_matrix[call_No][i].Num==hospitals[j].hospital_Num)k=j; } if(!IsEmptyQueue(AmbuQueue[k]))return k; } return-1;} CHE GetAmbu(LinkQueue Q){ return Q.front->next->che;} int GNo_CallNo(int g_No){ int i; for(i=0;i<=Call_VexNum-1;i++) if(g_No==call_vex[i].Num)return i;} int Hos_i_matrix(int call_GNo,int Hos_i){ int i,call_No; call_No=GNo_CallNo(call_GNo); for(i=0;i<=HosNum-1;i++) if(Call_Hos_matrix[call_No][i].Num==hospitals[Hos_i].hospital_Num)} Status DeQueue(LinkQueue *Q){ QueuePtr p; if((*Q).front==(*Q).rear); else { p=(*Q).front->next; (*Q).front->next=p->next; if((*Q).rear==p)(*Q).rear=(*Q).front; free(p); } return OK;} Status IsEmptyQueue(LinkQueue Q){ return(Q.front==Q.rear)? TRUE : FALSE;} void Display_Patient_Status(EVENT *h1,EVENT *h2){ EVENT *p; printf(“n”); printf(“ 病人的狀態(tài): ”); p=h1; if(h1!=NULL) { return i; while(p) { printf(“ %d”,p->AidNo); printf(“:待派車 ”); p=p->next; } } p=h2; if(h2!=NULL) { while(p) { printf(“ %d”,p->AidNo); switch(p->EventType) { case 0: printf(“b ”); break; case 1: printf(“:待接中 ”); break; case 2: printf(“:送院中 ”); break; } p=p->next; } printf(“n”); } } void Display_Ambulance_Status(EVENT *h){ int i; EVENT *p; printf(“n”); printf(“n”); printf(“ 救護(hù)車狀態(tài): ”); p=h; if(h!=NULL) { while(p) { switch(p->EventType) { case 1: printf(“ %2d”,p->Che_Num); printf(“:往救中 ”); break; case 2: printf(“ %2d”,p->Che_Num); printf(“:送院中 ”); break; } p=p->next; } } printf(“n”);} void Display_WaitingAmbu(void){ int i; printf(“n”); for(i=0;i { printf(“ %c ”,hospitals[i].hospital_name); printf(“醫(yī)院待命救護(hù)車: ”); Display_Queue(AmbuQueue[i]); printf(“n”); } } 函數(shù)調(diào)用 Main()主函數(shù)調(diào)用ready()InitAmbu()start()函數(shù); Ready()函數(shù)調(diào)用 readfile()arrange_ambulances()CreateGraph()Short_Path()函數(shù); InitAmbu()函數(shù)調(diào)用 InitQueue()EnQueue()Display_Queue()函數(shù); Start()函數(shù)調(diào)用 InsertEvent()GetEvent()Event_Call()Event_ArriveHome()Event_ArriveHos()Ambu_WaitTime()Display_All()DeleteEvent()SearchHos()GetAmbu()DeQueue()IsEmptyQueue()Display_Patient_Status()Display_Ambulance_Status()Display_WaitingAmbu()使用說明 開始運行,輸入程序運行的時間。 然后屏幕會輸出文件中給出的數(shù)據(jù),并要求鍵盤輸入安排救護(hù)車。 從文件中讀出給定8個地點,其中A,E,G為醫(yī)院,其余為可能發(fā)生病人呼救事件的地點。并且得到10條路段。 現(xiàn)假設(shè)共12輛救護(hù)車,三所醫(yī)院分別為3,4,5輛救護(hù)車,分配好救護(hù)車后按任意鍵進(jìn)入綜合顯示界面,界面顯示“已接送病人數(shù)”,“平均延遲時間”“平均處理時間”“平均等待時間”“病人的狀態(tài)”“救護(hù)車狀態(tài)”“待命救護(hù)車”以及可調(diào)節(jié)時間快慢頻率,延遲時間大小和ESC退出鍵。 程序結(jié)束,按任意鍵退出程序。 GIS課程系統(tǒng)設(shè)計文檔 學(xué)院名稱: 專業(yè)名稱撰寫人學(xué)號:111104006 開發(fā)工具:Visual c#.net++ArcGIS Engine 1)系統(tǒng)建設(shè)目標(biāo) 本課程設(shè)計是在一個學(xué)期《GIS設(shè)計與實現(xiàn)》的學(xué)習(xí)以后的一個綜合實驗,很好地融合了理論與實踐。該系統(tǒng)建設(shè)本著實用性,標(biāo)準(zhǔn)性,簡潔性和友好性為原則,目標(biāo)是利用AE開發(fā)實現(xiàn)地圖各種基本的功能,熟練掌握二次開發(fā)的基本流程。 2)系統(tǒng)建設(shè)內(nèi)容 系統(tǒng)建設(shè)的內(nèi)容包括系統(tǒng)的編寫目標(biāo),系統(tǒng)需求分析,系統(tǒng)配置要求,系統(tǒng)的詳細(xì)設(shè)計,系統(tǒng)編程實現(xiàn),系統(tǒng)的測試維護(hù)。 3)系統(tǒng)功能設(shè)計 系統(tǒng)實現(xiàn)了地圖操作的基本功能,包括:(1)地圖輸入:支持地圖輸入;支持用戶選擇文件輸入;(2)地圖顯示:顯示地圖,支持縮放、漫游、全圖功能;(3)地圖管理:圖層信息顯示;圖層關(guān)閉操作;圖層添加操作等(4)查詢:支持屬性查詢和空間查詢(如點查詢、圓查詢、矩形查(5)空間分析:實時獲取點坐標(biāo);量測距離;量測面積(6)專題圖制作(7)地圖輸出:輸出柵格圖(8)提供網(wǎng)絡(luò)分析和地圖要素的符號化。 4)系統(tǒng)數(shù)據(jù)庫設(shè)計 本系統(tǒng)采用的是ArcGIS自帶的地理數(shù)據(jù)庫,既能滿足實驗要求,有很好的和gis兼容,使用起來更加高效方便。數(shù)據(jù)庫設(shè)計要較好的解決數(shù)據(jù)冗余、數(shù)據(jù)不一致性和數(shù)據(jù)聯(lián)系弱等缺陷,本數(shù)據(jù)庫采用面向?qū)ο蟮臄?shù)據(jù)庫技術(shù)。分別從外部級,概念級和內(nèi)部級構(gòu)建數(shù)據(jù)庫的體系結(jié)構(gòu),充分展現(xiàn)了數(shù)據(jù)庫的三級結(jié)構(gòu)和兩級映像,達(dá)到了數(shù)據(jù)庫物理獨立性和邏輯獨立性的要求。數(shù)據(jù)庫的主要功能有數(shù)據(jù)庫的定義,數(shù)據(jù)庫的操縱,數(shù)據(jù)庫的保護(hù),數(shù)據(jù)庫的維護(hù)以及數(shù)據(jù)字典。 5)系統(tǒng)軟硬件配置 操作系統(tǒng):Windows7 數(shù)據(jù)庫:地圖數(shù)據(jù)庫 File Geodatabase 開發(fā)語言:VS C#.NET 開發(fā)環(huán)境:.net Framework 4.0 開發(fā)平臺: Windowsphone VS2010 GIS平臺:ArcGIS10.0ArcGIS Engine10.0 6)關(guān)鍵技術(shù)實現(xiàn)(關(guān)鍵技術(shù)解決思路、關(guān)鍵的函數(shù)、程序說明等) 7)實習(xí)的體會與建議 課程設(shè)計指導(dǎo)書 課題名稱:模擬電信計費系統(tǒng) 設(shè)計目標(biāo):按照軟件工程的規(guī)范,以SQL Server或Access為后臺數(shù)據(jù)庫,以Visual C++、Delphi等為前端開發(fā)工具,設(shè)計并實現(xiàn)一個能模擬電信計費過程的系統(tǒng)。需求描述: 本系統(tǒng)存放固定電話通話的源數(shù)據(jù)和費率數(shù)據(jù)。通話數(shù)據(jù)包括:主叫區(qū)號、主叫電話號碼、被叫區(qū)號、被叫電話號碼、通話開始時間、通話時長(秒)。如果主、被叫區(qū)號相同,則為本地通話;否則為長途通話。費率數(shù)據(jù)存放本地到外地的通話費率,包括:被叫區(qū)號和通話費率。 系統(tǒng)應(yīng)實現(xiàn)以下功能: (1)計費功能(對應(yīng)專門的菜單): 根據(jù)存放在源通話數(shù)據(jù)中的通話記錄和長途費率對每一條通話記錄 計算其通話費用。其中: 通話費的計算方法如下: 通話費=長途電話費+本地電話費 長途電話費=費率(元/分鐘)×通話時長(分鐘) (通話時長不滿1分鐘的按1分鐘計算) 本地電話費為:3分鐘以內(nèi)0.5元,以后每3分鐘0.2元。 (2)話費查詢:按電話號碼查詢某月或某幾個月該電話號碼的所有本地話費、長途話費和總費用。 (3)話單查詢:按電話號碼查詢某月或某幾個月該用戶的所有通話記錄。結(jié)果形式: 提交課程設(shè)計報告、源程序和可演示的軟件 課程設(shè)計報告要求:詳見課程設(shè)計模板 課程設(shè)計參考思路: (1)熟悉數(shù)據(jù)庫和開發(fā)工具,掌握開發(fā)工具與本地數(shù)據(jù)庫的連接方法。 (2)理解系統(tǒng)的信息需求,進(jìn)行合理的數(shù)據(jù)庫設(shè)計,建立各數(shù)據(jù)庫表。 (3)理解系統(tǒng)的功能需求,設(shè)計應(yīng)用軟件。結(jié)合Delphi 或VC++進(jìn)行系統(tǒng)界面 (窗體、菜單以及相應(yīng)控制按鈕)的設(shè)計、連接與操縱數(shù)據(jù)庫方案的設(shè)計,編寫程序。 (4)系統(tǒng)運行、調(diào)試并完善。 (5)撰寫設(shè)計報告。 《Java語言程序設(shè)計》 課程設(shè)計報告 題 目: ATM柜員機 專 業(yè): 信息與計算科學(xué) 學(xué) 號: 姓 名: 單 焱 指導(dǎo)教師: 李 又 良 成績: 2010 年 12 月 10 日 目 錄 1課程設(shè)計研究背景及意義.......................................2 2 課程設(shè)計題目描述和基本功能設(shè)計要求...........................2 3 系統(tǒng)需求分析.................................................2 3.1 功能需求分析............................................2 3.2 其他需求分析............................................3 4 系統(tǒng)設(shè)計.....................................................3 4.1 總體設(shè)計................................................3 4.2 ATM柜員機界面設(shè)計......................................4 4.3 各功能模塊設(shè)計..........................................5 4.3.1 登陸頁面模塊設(shè)計................................5 4.3.2 選擇服務(wù)模塊設(shè)計................................6 4.3.3 取款模塊設(shè)計....................................7 4.3.4 修改密碼模塊設(shè)計................................8 4.3.5 查詢余額模塊設(shè)計................................9 4.3.6 退卡模塊設(shè)計....................................9 4.4 異常處理情況說明.......................................10 5 系統(tǒng)實現(xiàn)與測試..............................................10 6 課程設(shè)計總結(jié)................................................13 6.1 遇到的問題及解決辦法...................................13 6.2 心得體會...............................................14 參考文獻(xiàn)......................................................14 附錄(源碼)..................................................14 1課程設(shè)計研究背景及意義 這次課程設(shè)計是通過JAVA編程來實現(xiàn)ATM柜員機的功能。以前,人們用手算取錢,不管從方便的角度還是速度的角度來看都不及現(xiàn)在。電子技術(shù)的不斷發(fā)展使得ATM自動化的功能不斷完善。在二十一世紀(jì)的今天,ATM柜員機是人們生活中重要的工具,所以,對ATM柜員機的研究的課程設(shè)計具有重大意義。 這次課程設(shè)計的主要目的是結(jié)合面向?qū)ο蟪绦蛟O(shè)計課程,培養(yǎng)我們面向?qū)ο箝_發(fā)的思維,初步了解軟件開發(fā)的一般流程,提高用JAVA編程的實際動手能力并增強大家對面向?qū)ο蟮牧私?。這次課程設(shè)計的主要內(nèi)容是獨立用JAVA語言開發(fā)一個小的應(yīng)用程序。課程設(shè)計題目描述和基本功能設(shè)計要求 本次設(shè)計的ATM柜員機主要是由各個Windows窗口組成,它是由登錄頁面、選擇服務(wù)、取款、查詢余額、修改密碼和退卡等功能。它的各種按鈕的事件和功能可以簡單的模擬ATM柜員機的要求。組員分工: 組長(單焱): 負(fù)責(zé)分配其他組員的任務(wù),構(gòu)建需求分析,系統(tǒng)實現(xiàn)及異常處理情況,調(diào)試程序等,把握ATM柜員機的整體布局。 組員1(劉星):負(fù)責(zé)登陸界面模塊,選擇服務(wù)模塊及退卡模塊,編寫相應(yīng)代碼。組員2(王玲玲):負(fù)責(zé)取款、修改密碼、查詢余額模塊,編寫相應(yīng)代碼。系統(tǒng)需求分析 3.1 功能需求分析 本ATM柜員機的主要功能如下所述: 要求使用圖形用戶界面。當(dāng)輸入給定的卡號和密碼(初始卡號為000000和密碼為123456)時,系統(tǒng)能登錄ATM柜員機系統(tǒng),用戶可以按照以下規(guī)則進(jìn)行: ? 查詢余額:初始余額為50000元 ? ATM取款:每次取款金額為100的倍數(shù),總額不超過5000元,支取金額不允許透支。 ? ATM存款:不能出現(xiàn)負(fù)存款。 ? 修改密碼:只有舊密碼正確,新密碼符合要求,且兩次輸入相同的情況下才可以成功修改密碼。 3.2 其他需求分析 (1)性能描述 實時性好、靈活性強、易于不同年齡階段的人操作。(2)設(shè)計約束 開發(fā)工具:Eclipse3.2.運行環(huán)境:Windows 2000以上。(3)界面要求 以Windows窗口形式顯示,標(biāo)題欄為ATM柜員機名稱,右上角有最小化按鈕、最大化按鈕、關(guān)閉按鈕,不同的窗口中有不同的按鈕和選擇菜單。系統(tǒng)設(shè)計 4.1 總體設(shè)計 本次設(shè)計的ATM柜員機主要是由登錄頁面模塊還由選擇服務(wù)模塊組成,其中選擇服務(wù)模塊又由取款模塊、查詢余額模塊、修改密碼模塊、退卡模塊組成。如圖: 圖1 ATM功能結(jié)構(gòu)示意圖 4.2 ATM柜員機界面設(shè)計 一個系統(tǒng)的界面應(yīng)該要簡單明了,當(dāng)然樣式美觀就更好了。本次設(shè)計的界面主要是由窗體組成,操作簡單。而每一個窗口則執(zhí)行相應(yīng)的功能。 一個系統(tǒng)界面的好壞直接影響到用戶的操作,界面設(shè)計要求樣式美觀、簡單明了、方便易操作。界面主要分為窗體、菜單、按鈕和文本輸入框幾個部分,分別執(zhí)行相應(yīng)的操作。 (1)窗體的設(shè)計 窗體整個框架使用Frame類構(gòu)造,F(xiàn)rame有自己的外邊框和自己的標(biāo)題,創(chuàng)建Frame時可以指定其窗口標(biāo)題,我創(chuàng)建的窗口標(biāo)題是各個不同功能的模塊的名字,比如說查詢余額,還有取款等。相應(yīng)源代碼為:WindowBox(String s){super(s);}、Selection(String s,Account act){ } 向Frame窗口中添加組件使用add()。例如:button1 = new Button(“存款”); p1.add(button1);this.add(p1);super(s);每個Frame在其右上角都有三個控制圖標(biāo),分別代表將窗口最小化、窗口最大化和關(guān)閉的操作,其中最小化和最大化操作Frame可自動完成,而關(guān)閉窗口操作實現(xiàn)需要書寫有關(guān)的代碼,在我的程序中我采用的是對WINDOWS_CLOSING事件做出響應(yīng),調(diào)用dispose()方法關(guān)閉窗口。Frame也可以引發(fā)WindowsEvent類代表的窗口事件。相應(yīng)源代碼為: addWindowListener(new WindowAdapter()//窗口偵聽器,以從此窗口接收窗口事件 {public void windowClosing(WindowEvent e)//處理窗口關(guān)閉事件 { System.exit(0);} });}(2)窗體的主要結(jié)構(gòu)的設(shè)計(網(wǎng)格布局) 我所設(shè)計的窗口的主要結(jié)構(gòu)的特點就是每個窗口都對應(yīng)著一個特定的功能。比如說報各種各樣的錯,還有各種查詢余額、取款、選擇服務(wù)等,所以它們都是由各種按鈕和文本框,標(biāo)簽組成的,而聯(lián)系各個窗體成為一個整體的就是各個按鈕的監(jiān)聽事件。所以整個設(shè)計就趨向簡單化了。 為了定義各個按鈕所對應(yīng)的命令和操作,首先需要將各個按鈕注冊給實現(xiàn)了動作事件的監(jiān)聽接口ActionListener的監(jiān)聽者,然后為監(jiān)聽者定義actionPerformed(ActionEvent e)方法,在這個方法中調(diào)用e.getSource()或e.getActionCommand()來判斷用戶點擊的菜單子項,并完成這個菜單子項定義的操作。 4.3 各功能模塊設(shè)計 4.3.1 登陸頁面模塊設(shè)計 與ATM柜員機打交道比較多的,也是大家對安全比較關(guān)心的問題:密碼。所以第一個界面就是要輸入密碼和卡號才能繼續(xù)服務(wù)。 我定義了文本框累的對象tf1,tf2。抓藥是用于輸入單行的文本;文本區(qū)調(diào)用public String getText()方法,獲取用戶想要的字符串。用來判斷輸入的密碼和卡號是否正確,如果不正確的話,則彈出密碼或卡號錯誤的警告框,并用dispose()關(guān)掉窗口。此模塊相應(yīng)的部分源代碼為: public void actionPerformed(ActionEvent e){ Account act; String card; String pwd; act=new Account(“000000”,“Devil”,“123456”,50000);//初始化 /*選擇各種服務(wù)*/ if(e.getSource()== button1){ String number1,number2; number1=tf1.getText(); number2=tf2.getText(); /*判斷密碼和卡號是否正確*/ if((act.get_Code().equals(number1))&&(act.get_Password().equals(number2))){ dispose(); /*卡號和密碼都正確則進(jìn)入功能選擇窗口*/ Selection s = new Selection(“選擇服務(wù)”,act); }else{ dispose(); JOptionPane.showMessageDialog(null, “您輸入的卡號或密碼不正確,請核實后再確定”,“消息!”, JOptionPane.INFORMATION_MESSAGE); new WindowBox(“登錄界面”); } } /*退卡*/ if(e.getSource()==button2){ dispose(); JOptionPane.showMessageDialog(null, “謝謝使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0); } } 4.3.2 選擇服務(wù)模塊設(shè)計 在選擇服務(wù)模塊中,有各種ATM的服務(wù)功能,只要用戶在該界面中選擇按鈕,它就會彈出各個相應(yīng)的界面。每一個按鈕都有監(jiān)聽器,在選擇了按鈕后,java.awt.event中的ActionEvent類創(chuàng)建一個事件對象,并將它傳遞給方法public void actionPerformed(ActionEvent e)中的參數(shù)e,監(jiān)視器就會知道所發(fā)生的事件,對此事件進(jìn)行處理。其中的部分源代碼為: p.add(new Label(“請選擇你要的服務(wù)”)); this.add(p); button1 = new Button(“存款”); p1.add(button1); this.add(p1); button2 = new Button(“取款”); p2.add(button2); this.add(p2); button3 = new Button(“查詢余額”); p3.add(button3); this.add(p3); button4 = new Button(“退出”); p4.add(button4); this.add(p4); button5 = new Button(“修改密碼”); p5.add(button5); this.add(p5); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } });button2.addActionListener(this);button3.addActionListener(this);button4.addActionListener(this);button5.addActionListener(this);setBounds(300,300,300,300);setVisible(true);validate();} public void actionPerformed(ActionEvent e){ if(e.getSource()==button2){//取款 dispose(); GetBalance gb = new GetBalance(“取款”,act);} if(e.getSource()==button3){//查詢余額 Query q =new Query(“查詢余額”,act); dispose();} else if(e.getSource()==button4){//退出 dispose(); } JOptionPane.showMessageDialog(null, “謝謝使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0); } else if(e.getSource()==button5){//修改密碼 ChangePassword cp = new ChangePassword(“修改密碼”,act); dispose();} 4.3.3 取款模塊設(shè)計 在取款模塊中,和其他的界面也是同樣的結(jié)構(gòu)。也是有一個文本框和一個按鈕還有標(biāo)簽組成的。用戶在文本框中輸入他想取的數(shù)額,但是必須是100的倍數(shù),而且每一次最多只能取5000塊。當(dāng)然了取款的時候也不能超過卡里的余額,再就是卡里的余額不可以為負(fù),否則就會彈出報錯的窗口。其方法為: if(e.getSource()== button){ if(act.get_Money()< 0){// 判斷余額是否為負(fù) dispose();JOptionPane.showMessageDialog(null, “余額為負(fù)數(shù)”, “消息”,JOptionPane.INFORMATION_MESSAGE);} else if(money <= act.get_Money()){// 取錢的數(shù)額不大于余額 if(money % 100 == 0){ dispose(); JOptionPane.showMessageDialog(null, “取款成功!”, “消息”,JOptionPane.INFORMATION_MESSAGE);act.set_Balance(money);this.setVisible(false);Selection s = new Selection(“選擇服務(wù)”, act);} if((money % 100!= 0)||(money >= 5000)){// 取錢數(shù)為100的倍數(shù)或不大于5000 dispose(); JOptionPane.showMessageDialog(null,的錢!“, ”消息“,務(wù)窗口 } ”每次只能取100的倍數(shù),而且不能超過5000,請重新輸入你想取 JOptionPane.INFORMATION_MESSAGE);act.get_Money();this.setVisible(false);Selection s = new Selection(“選擇服務(wù)”, act);// 返回選擇服} else if(money > act.get_Money()){// 判斷取款數(shù)額是否大于余額 dispose(); JOptionPane.showMessageDialog(null, “超過已有的錢數(shù),請重新輸入你想取的錢!”,“消息”, JOptionPane.INFORMATION_MESSAGE); this.setVisible(false); } Selection s = new Selection(“選擇服務(wù)”, act);} 4.3.4 修改密碼模塊設(shè)計 在修改密碼模塊中,首先你必須要輸入你的舊密碼是否正確,否則就會報錯。再一個就是要兩次輸入你的新密碼,且兩次藥匹配,否則也會報錯,然后再重新回到修改密碼的界面。在修改密碼時用到的方法為: /*判斷舊密碼是是否正確*/ if(pwd2.equals(act.get_Password())){ /*判斷兩次輸入的密碼是否匹配*/ if(pwd3.equals(pwd4)){ /*如果都正確的話就設(shè)置新密碼*/ act.setPassword(pwd3); dispose(); Selection s = new Selection(“選擇”,act);}else{ dispose(); ErrorWarn2 ew2 = new ErrorWarn2(“消息”,act); } }else{ this.setVisible(false); ErrorWarn3 ew1 = new ErrorWarn3(“消息”,act); dispose();} 4.3.5 查詢余額模塊設(shè)計 在查詢余額模塊設(shè)計中, 和其他的界面的結(jié)構(gòu)相差不多。有一個余額顯示和一個按鈕還有標(biāo)簽組成的。查詢時用到的方法: Query(String s, Account act){// 構(gòu)造函數(shù) super(s);this.act = act;button = new Button(“確定”);// TextField tf = new TextField(6);Panel panel1 = new Panel();Panel panel = new Panel();panel1.add(new Label(“你的余額為: ” + act.get_Money()));// 查詢余額的button.addActionListener(this);panel.add(button);this.add(panel);this.add(panel1);this.setLayout(new GridLayout(2, 1));this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });setBounds(300, 300, 300, 300);setVisible(true); 方法 } 4.3.6 退卡模塊設(shè)計 在退卡模塊設(shè)計中,這個方法就更加的簡單了,它只是用了if(e.getSource()==button4){//退出 dispose();JOptionPane.showMessageDialog(null, “謝謝使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0);} 這個方法就可以實現(xiàn)了,這里就不再多說了。 4.4 異常處理情況說明 (1)打開、保存文件時的異常處理 需要處理的異常:IOException(2)數(shù)據(jù)庫訪問時的異常處理 需要處理的異常:SQLException(3)加載類時的異常處理 需要處理的異常:ClassNotFindException,當(dāng)應(yīng)用程序試圖使用Class類中的forName方法通過字符串名加載類時,但是沒有找到具有指定名稱的類的定義。 (4)加載URL時的異常 需要處理的異常:MalformedURLException,拋出這一異常指示出現(xiàn)了錯誤的 URL?;蛘咴谝?guī)范字符串中找不到任何合法協(xié)議,或者無法分析字符串。系統(tǒng)實現(xiàn)與測試 (1)編譯運行程序后,將會看到如下的界面,如圖2所示。如果輸入的密碼或卡號不正確的話就會報右下圖的錯誤。 圖2 主界面—登陸頁面 (2)選擇服務(wù)界面效果 當(dāng)輸入的密碼和卡號正確,單擊確定后就會進(jìn)入到選擇服務(wù)的界面,如圖3所示。然后就可以選擇所需要的服務(wù)了。 圖3 選擇服務(wù)界面 (3)取款界面,如圖4所示。 圖4 取款界面 當(dāng)輸入的錢數(shù)不是100的倍數(shù)或每一次大于5000時就會報圖5的錯誤。 圖5 輸入錯誤1 當(dāng)取款時如果超過卡里的余額的話就會報圖6的錯誤。 圖6 輸入錯誤2(4)查詢余額界面,如圖7所示。 圖7 查詢余額界面 (5)修改密碼界面,如圖8所示。 圖8 修改密碼界面 當(dāng)輸入的初始密碼不正確會報圖9所示錯誤。 圖9 輸入錯誤1 當(dāng)2次輸入的新密碼不同會報圖10所示錯誤。 圖10 輸入錯誤2 經(jīng)過測試,所有的功能基本上都實現(xiàn)了,而且運行正常。課程設(shè)計總結(jié) 6.1 遇到的問題及解決辦法 在此次課程設(shè)計中遇到了一些問題,如:對于面向?qū)ο蟮姆椒私獠粔蛲笍?,運用到實際的軟件開發(fā)中存在著困難;對于Java語言,只學(xué)習(xí)到了一些最基本的知識,這導(dǎo)致編寫程序時經(jīng)常出現(xiàn)一些語法錯誤,而且要在短時間內(nèi)用Java語言來設(shè)計一個具體的系統(tǒng)是一個較大的挑戰(zhàn);還有對于正規(guī)開發(fā)一個系統(tǒng)的流程不熟悉,適應(yīng)起來比較慢,編寫各個模塊相對應(yīng)的操作時,自己感覺難以動手,這表明所學(xué)的知識不能靈活運用到實際中。 對于以上的問題,自己有清楚的認(rèn)識,解決辦法是需要大量閱讀相關(guān)的書籍,對于書上以及網(wǎng)站上下載的資料中的Java實例必須有清楚的理解,還有就是多跟精通此方面的老師和同學(xué)交流,取其精華。對于實際動手能力與系統(tǒng)開發(fā)的流程的適應(yīng),必須多進(jìn) 行實際的練習(xí)與操作,才能有大的進(jìn)步。 6.2 心得體會 在這次的課程設(shè)計中,主要運用了Java語言的界面設(shè)計、異常處理、、Awt控件、Swing控件,輸入輸出流等,綜合運用了Java語言。深刻感受到了面向?qū)ο笳Z言中類庫的強大功能,掌握了運用Java中的類實現(xiàn)某些基本功能,并學(xué)會了自己查詢使用類的方法,為以后的面向?qū)ο笳Z言的自學(xué)奠定了基礎(chǔ)。 通過這次課程設(shè)計我學(xué)到了一些東西,這次的課程設(shè)計中,主要是運用JAVA語言來編寫一個小的應(yīng)用程序,當(dāng)然還可以用其他的技術(shù)來輔助。在這個小應(yīng)用程序當(dāng)中,我用了Java外還用了Swing控件。輸入輸出流等。由于以前學(xué)的不是很扎實,而且還有些知識我們都是沒有學(xué)過的,這就要求我們?nèi)ゲ橄嚓P(guān)的書籍,還有就是和同學(xué)之間的交流。正因為這樣,才鍛煉了我的自學(xué)的能力,還有就是加深了我對各個知識點的認(rèn)識,并且提高了我對專業(yè)的學(xué)習(xí)的興趣,為我以后的學(xué)習(xí)打下了基礎(chǔ)。此外,還感受到了面向?qū)ο笳Z言的類庫的強大的功能,掌握了運用JAVA中的類實現(xiàn)某些基本功能,并學(xué)會了自己查詢使用類的方法,也就是要會用API文檔,為以后更好的學(xué)習(xí)面向?qū)ο笳Z言奠定了基礎(chǔ)。 通過努力,這次課程設(shè)計終于完成了,在這個過程當(dāng)中,學(xué)到了很多的知識,同時也感謝我的同學(xué)的幫助和指導(dǎo)。在以后的學(xué)習(xí)當(dāng)中,我會更加努力的學(xué)習(xí)好專業(yè)知識,并將所學(xué)的知識用于實踐當(dāng)中去,以便牢固掌握知識。 參考文獻(xiàn) [1] 王萌,劉婧,來賓著.JAVA程序設(shè)計[M]北京 冶金工業(yè)出版社,2004 [2] 黃聰明 精通 JAVA2程序設(shè)計[M]北京:清華大學(xué)出版社,2004.4 [3] 王文濤,袁海燕 JAVA實用程序設(shè)計100例[M]北京:人民郵電出版社,2005.5 [4] 雍俊海 JAVA程序設(shè)計[M]北京:清華大學(xué)出版社,2006.8 [5] 劉寶林 JAVA程序設(shè)計與案例[M]北京:高等教育出版社,2006.11 附錄(源碼) /******登陸頁面首窗口*******/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*; import java.io.*; public class WindowBox extends Frame implements ActionListener { Box baseBox, box1, box2;TextField tf1, tf2;Button button1;Button button2; WindowBox(String s){// 構(gòu)造方法 super(s);tf1 = new TextField(6);tf2 = new TextField(6);box1 = Box.createVerticalBox(); box1.add(new Label(“請輸入你的卡號”));// 輸入卡號 box1.add(Box.createVerticalStrut(8));box1.add(new Label(“請輸入你的密碼”));// 輸入密碼 box2 = Box.createVerticalBox();box2.add(tf1);// box2.add(new TextField(16)); box2.add(Box.createVerticalStrut(8));box2.add(tf2);// box2.add(new TextField(16)); baseBox = Box.createHorizontalBox();baseBox.add(box1);baseBox.add(Box.createHorizontalStrut(10));baseBox.add(box2);add(baseBox);button1 = new Button(“確定”);// 加入按鈕 button1.addActionListener(this);add(button1);button2 = new Button(“退卡”);// 退卡按鈕 button2.addActionListener(this);add(button2);setLayout(new FlowLayout());/* 監(jiān)聽器 */ this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });setBounds(300,300,220,220);setVisible(true);} public void actionPerformed(ActionEvent e){ Account act;String card;String pwd;act = new Account(“000000”, “Devil”, “123456”, 50000);// 初始化 /* 選擇各種服務(wù) */ if(e.getSource()== button1){ String number1, number2;// 輸入的兩個卡號和密碼的變量 number1 = tf1.getText();number2 = tf2.getText();/* 判斷兩次輸入的卡號和密碼是否正確 */ if((act.get_Code().equals(number1)) &&(act.get_Password().equals(number2))){ dispose();Selection s = new Selection(“選擇服務(wù)”, act);} else { dispose(); JOptionPane.showMessageDialog(null, “您輸入的卡號或密碼不正確,請核實后再確定”,“消息!”, JOptionPane.INFORMATION_MESSAGE); // 報輸入密碼或卡號不正確 new WindowBox(“登錄界面”); } } if(e.getSource()== button2){ System.exit(0); dispose();// 退出 } } } /*************主函數(shù)****************/ public class ATM { public static void main(String[] args){ new WindowBox(“登錄頁面”);} } /********* 選擇服務(wù)窗口 ***************/ import java.awt.*;import java.awt.event.*; public class Selection extends Frame implements ActionListener { Button button1, button2, button3, button4, button5; Panel p1 = new Panel();Panel p2 = new Panel();Panel p3 = new Panel();Panel p4 = new Panel();Panel p5 = new Panel();Panel p = new Panel();Account act;public Selection(){ } Selection(String s, Account act){ super(s);this.act = act;this.setLayout(null);this.setLayout(new GridLayout(6, 1)); p.add(new Label(“請選擇你要的服務(wù)”));this.add(p);/* 各種服務(wù)功能 */ button1 = new Button(“存款”);p1.add(button1);this.add(p1);button2 = new Button(“取款”);p2.add(button2);this.add(p2);button3 = new Button(“查詢余額”);p3.add(button3);this.add(p3);button4 = new Button(“退出”);p4.add(button4);this.add(p4);button5 = new Button(“修改密碼”);p5.add(button5);this.add(p5);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });button2.addActionListener(this);button3.addActionListener(this);button4.addActionListener(this);button5.addActionListener(this);setBounds(300, 300, 300, 300);setVisible(true);validate(); } } public void actionPerformed(ActionEvent e){ } if(e.getSource()== button2){// 取款 dispose();GetBalance gb = new GetBalance(“取款”, act);} if(e.getSource()== button3){// 查詢余額 Query q = new Query(“查詢余額”, act);dispose();} else if(e.getSource()== button4){// 退出 dispose(); JOptionPane.showMessageDialog(null, “謝謝使用!”, “消息!”,JOptionPane.INFORMATION_MESSAGE);System.exit(0);} else if(e.getSource()== button5){// 修改密碼 ChangePassword cp = new ChangePassword(“修改密碼”, act);dispose();} /**********取款功能************/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*; public class GetBalance extends Frame implements ActionListener { Box baseBox, box1, box2;Button button;TextField tf;Account act; GetBalance(String s, Account act){// 構(gòu)造函數(shù) super(s);this.act = act; button = new Button(“確定”);Panel panel = new Panel();Panel panel1 = new Panel();tf = new TextField(6);this.setLayout(new GridLayout(2, 1));panel1.add(new Label(“請輸入你想取錢的數(shù)目”));panel1.add(tf);panel.add(button);this.add(panel1); this.add(panel);button.addActionListener(this);this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } });setBounds(300, 300, 300, 300);this.setVisible(true);} public void actionPerformed(ActionEvent e){ // System.out.println(e.getActionCommand()); double money;money = Double.parseDouble(tf.getText().trim());if(e.getSource()== button){ if(act.get_Money()< 0){// 判斷余額是否為負(fù) dispose();JOptionPane.showMessageDialog(null, “余額為負(fù)數(shù)”, “消息”,JOptionPane.INFORMATION_MESSAGE);} else if(money <= act.get_Money()){// 取錢的數(shù)額不大于余額 if(money % 100 == 0){ dispose(); JOptionPane.showMessageDialog(null, “取款成功!”, “消息”,JOptionPane.INFORMATION_MESSAGE);act.set_Balance(money);this.setVisible(false);Selection s = new Selection(“選擇服務(wù)”, act);} if((money % 100!= 0)||(money >= 5000)){// 取錢數(shù)為100的倍數(shù)或不大于5000 dispose(); JOptionPane.showMessageDialog(null,的錢!“, ”消息“,務(wù)窗口 ”每次只能取100的倍數(shù),而且不能超過5000,請重新輸入你想取 JOptionPane.INFORMATION_MESSAGE);act.get_Money();this.setVisible(false);Selection s = new Selection(“選擇服務(wù)”, act);// 返回選擇服 // dispose();} } else if(money > act.get_Money()){// 判斷取款數(shù)額是否大于余額 dispose();JOptionPane.showMessageDialog(null, “超過已有的錢數(shù),請重新輸入 你想取的錢!”,“消息”, JOptionPane.INFORMATION_MESSAGE); this.setVisible(false);口 Selection s = new Selection(“選擇服務(wù)”, act);// 返回選擇服務(wù)窗 } } } } /********修改密碼功能*************/ import java.awt.Button;import java.awt.Frame;import java.awt.GridLayout;import java.awt.Label;import java.awt.Panel;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JOptionPane; public class ChangePassword extends Frame implements ActionListener { Panel panel1 = new Panel();Panel panel2 = new Panel();Panel panel3 = new Panel();Panel panel = new Panel();TextField tf4, tf5, tf6;Button button;Account act;ChangePassword(String s, Account act){ super(s); this.act = act; tf4 = new TextField(6); tf5 = new TextField(6); tf6 = new TextField(6); button = new Button(“確定”);button.addActionListener(this);/* 建立新密碼 */ panel1.add(new Label(“請輸入你的舊密碼:”));panel1.add(tf4);panel2.add(new Label(“請輸入你的新密碼:”));panel2.add(tf5); } panel3.add(new Label(“請再次輸入你的新密碼”));panel3.add(tf6);panel.add(button);this.add(panel1);this.add(panel2);this.add(panel3);this.add(panel);setLayout(new GridLayout(4, 1));setBounds(300, 300, 300, 300);this.setVisible(true);/* 窗口事件 */ this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0);} });/* 判斷事件源,看條件是否成立再修改密碼 */ public void actionPerformed(ActionEvent e){ if(e.getSource()== button){ String pwd2, pwd3, pwd4; pwd2 = tf4.getText(); pwd3 = tf5.getText(); pwd4 = tf6.getText(); if(pwd2.equals(act.get_Password())){// 判斷舊密碼是否正確 if(pwd3.equals(pwd4)){// 判斷兩次輸入的新密碼是個匹配 act.setPassword(pwd3);// 啟用新的密碼 dispose(); JOptionPane.showMessageDialog(null, “密碼修改成功!”, “消息 JOptionPane.INFORMATION_MESSAGE); ”,Selection s = new Selection(“選擇”, act);// 返回服務(wù)窗口 } else { this.setVisible(true); // ErrorWarn2 ew = new ErrorWarn2(“消息”,act);dispose();JOptionPane.showMessageDialog(null, “兩次密碼輸入不匹配”, “ JOptionPane.INFORMATION_MESSAGE); 消息”,Selection s = new Selection(“選擇”, act);// 返回服務(wù)窗口 } } else { this.setVisible(false);dispose(); “,} JOptionPane.showMessageDialog(null, ”初始密碼輸入錯誤“, ”消息 JOptionPane.INFORMATION_MESSAGE); Selection s = new Selection(“選擇”, act);// 返回選擇服務(wù)窗口 } } } /**************查詢余額功能******************/ import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.awt.event.*; public class Query extends Frame implements ActionListener { Button button;Account act; Query(String s, Account act){// 構(gòu)造函數(shù) super(s);this.act = act; button = new Button(“確定”);// TextField tf = new TextField(6);Panel panel1 = new Panel();Panel panel = new Panel(); panel1.add(new Label(“你的余額為: ” + act.get_Money()));// 查詢余額的方法 // panel1.add(tf); button.addActionListener(this); panel.add(button); this.add(panel); this.add(panel1); this.setLayout(new GridLayout(2, 1)); this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); setBounds(300, 300, 300, 300); setVisible(true);} public void actionPerformed(ActionEvent e){ if(e.getSource()== button){ dispose(); Selection s = new Selection(“選擇服務(wù)”, act);// 返回選擇服務(wù)窗口 } } } /***********賬戶****************/ import java.io.*;/* 該類為實現(xiàn)客戶信息及部分功能 */ public class Account { { } private String code = null;// 信用卡號 private String name = null;// 客戶姓名 private String password = null;// 客戶密碼 private double money = 0.0;// 卡里金額 public Account(String code, String name, String password, double money) } this.code = code;this.name = name;this.password = password;this.money = money;public String get_Code(){// 取得卡號 return code;} public String get_Name(){// 取得名字 return name;} public String get_Password(){// 取得密碼 return password;} public double get_Money(){// 重置余額 return money;} /* 得到剩余的錢的數(shù)目 */ protected void set_Balance(double mon){ money-= mon;} /* 重置密碼的方法 */ public String setPassword(String pwd){ password = pwd;return password;} 操作系統(tǒng) 課程設(shè)計報告 學(xué)校:廣州大學(xué) 學(xué)院:計算機科學(xué)與教育軟件學(xué)院 班級:計算機127班 課題:處理機調(diào)度程序 任課老師:陶文正、陳文彬 姓名:黃俊鵬 學(xué)號:1200002111 班內(nèi)序號:27 成績: 日期:2015年1月6日 一、設(shè)計目的 在多道程序和多任務(wù)系統(tǒng)中,系統(tǒng)內(nèi)同時處于就緒狀態(tài)的進(jìn)程可能有若干個。也就是說能運行的進(jìn)程數(shù)大于處理機個數(shù)。為了使系統(tǒng)中的進(jìn)程能有條不紊地工作,必須選用某種調(diào)度策略,選擇一進(jìn)程占用處理機。要求學(xué)生設(shè)計一個模擬處理機調(diào)度算法,以鞏固和加深處理機調(diào)度的概念。 二、設(shè)計要求 1)進(jìn)程調(diào)度算法包括:時間片輪轉(zhuǎn)法,短作業(yè)優(yōu)先算法,動態(tài)優(yōu)先級算法。2)可選擇進(jìn)程數(shù)量 3)本程序包括三種算法,用C語言實現(xiàn),執(zhí)行時在主界面選擇算法(可用函數(shù)實現(xiàn))(進(jìn)程數(shù),運行時間,優(yōu)先數(shù)由隨機函數(shù)產(chǎn)生)執(zhí)行,顯示結(jié)果。 三、設(shè)計思路及算法思想 1.界面菜單選項 一級菜單提供2個選項: ① 自動生成進(jìn)程數(shù)量 ② 手動輸入所需進(jìn)程數(shù)量 一級菜單選擇完畢后進(jìn)入二級菜單: ① 重新生成進(jìn)程 ② 時間片輪轉(zhuǎn)法 ③ 短作業(yè)優(yōu)先算法 ④ 動態(tài)優(yōu)先級算法 ⑤ 退出程序 2.調(diào)度算法 程序所用PCB結(jié)構(gòu)體 需要用到的進(jìn)程結(jié)構(gòu)體如上圖所示 1)時間片輪轉(zhuǎn)法 主要是設(shè)置一個當(dāng)前時間變量,curTime和時間片roundTime。 遍歷進(jìn)程組的時候,每運行一個進(jìn)程,就把curTime += roundTime。進(jìn)程已運行時間加roundTime 2)短作業(yè)優(yōu)先算法 遍歷進(jìn)程組,找到未運行完成并且運行時間最短的進(jìn)程,讓它一次運行完成,如此往復(fù),直到所有進(jìn)程都運行完成為止。 3)動態(tài)優(yōu)先級算法 做法跟短作業(yè)優(yōu)先算法類似,此處主要是比較進(jìn)程的優(yōu)先數(shù),優(yōu)先級高者,先執(zhí)行。直到全部執(zhí)行完畢。當(dāng)一個進(jìn)程運行完畢后,適當(dāng)增減其余進(jìn)程的優(yōu)先數(shù),以達(dá)到動態(tài)調(diào)成優(yōu)先級的效果。 3.程序流程圖 四、運行截圖 1)啟動后輸入5,生成5個進(jìn)程 2)輸入1,選擇時間片輪轉(zhuǎn)法。 自動輸出結(jié)果,分別是時間片為1和4的結(jié)果 3)輸入2,選擇短作業(yè)優(yōu)先算法 4)輸入3,選擇動態(tài)優(yōu)先級算法 5)輸入0,重新生成進(jìn)程,再輸入3,生成3個進(jìn)程,選擇2.短作業(yè)優(yōu)先算法 6)輸入q,退出 五、心得體會 通過這次實驗,讓我對操作系統(tǒng)的進(jìn)程調(diào)度有了更進(jìn)一步的了解。這個實驗的模擬程度跟真實系統(tǒng)相比只是冰山一角,由此可見操作系統(tǒng)是何其復(fù)雜的軟件產(chǎn)品,僅進(jìn)程調(diào)度就有那么豐富和內(nèi)涵的知識需要掌握。 但是再復(fù)雜的系統(tǒng),都是由小部件構(gòu)成的。古語云:不積跬步,無以至千里。不積小流,無以成江海。掌握這些基礎(chǔ)的知識,可以為以后打下扎實的基礎(chǔ)。 六、附錄(源代碼) // // main.c // ProcessDispatch // // Created by Jeans on 1/5/15.// Copyright(c)2015 Jeans.All rights reserved.// #include //最小進(jìn)程數(shù) #define MIN_PROCESS //最大進(jìn)程數(shù) #define MAX_PROCESS //最小優(yōu)先數(shù) #define MIN_PRIORITY 0 //最大優(yōu)先數(shù) #define MAX_PRIORITY //最小運行時間 #define MIN_RUNNING_TIME //最大運行時間 #define MAX_RUNNING_TIME typedef struct PCB{ char name; //進(jìn)程名 int priority; //優(yōu)先數(shù) int runningTime; //運行時間 int arriveTime; //到達(dá)時間 int beginTime; //開始時間 int finishTime; //完成時間 int cyclingTime; //周轉(zhuǎn)時間 double weigthCyclingTime;//帶權(quán)周轉(zhuǎn)時間 int hadRunTime; //已經(jīng)運行時間 int finish; //是否完成 }PCB;//獲取隨機數(shù) int GetRandomNumber(int min,int max){ return arc4random()%(max-min)+ min;} //初始化PCB組 void InitPCBGroup(PCB p[],int num){ char name = 'A'; for(int i = 0;i < num;i++){ p[i].name = name; p[i].priority = GetRandomNumber(MIN_PRIORITY, MAX_PRIORITY); p[i].runningTime = GetRandomNumber(MIN_RUNNING_TIME,MAX_RUNNING_TIME); name++; } } void PrintResult(PCB p[],int num){ double avgCycTime = 0,avgWeiCycTime = 0; printf(“|進(jìn)程名 到達(dá)時間 運行時間 開始時間 完成時間 周轉(zhuǎn)時間 帶權(quán)周轉(zhuǎn)時間 優(yōu)先數(shù) |n”); for(int i = 0;i < num;i++){ printf(“|%3c %-4d %-4d %-4d %-4d %-4d %-6.2f %-4d|n”,p[i].name,p[i].arriveTime,p[i].runningTime,p[i].beginTime,p[i].finishTime,p[i].cyclingTime,p[i].weigthCyclingTime,p[i].priority); avgCycTime += p[i].cyclingTime; avgWeiCycTime += p[i].weigthCyclingTime; //還原 p[i].arriveTime = 0; p[i].beginTime = 0; p[i].finishTime = 0; p[i].cyclingTime = 0; p[i].weigthCyclingTime = 0; p[i].hadRunTime = 0; p[i].finish = 0; } avgWeiCycTime /= num; avgCycTime /= num; printf(“平均周轉(zhuǎn)時間:%.2f 平均帶權(quán)周轉(zhuǎn)時間:%.2fn”,avgCycTime,avgWeiCycTime);} //時間片輪轉(zhuǎn)法 void RealRoundRobin(PCB p[],int num,int roundTime){ printf(“nn-----------------------------時間片:%d------n”,roundTime); int finishNum = 0; int curTime = 0; while(finishNum!= num){ for(int i = 0;i < num;i++){ if(p[i].finish)continue; //開始時間 if(p[i].beginTime == 0 && i!= 0){ p[i].beginTime = curTime; } //已經(jīng)完成 if(p[i].hadRunTime + roundTime >= p[i].runningTime){ p[i].finishTime = curTime + p[i].runningTimep[i].arriveTime; p[i].weigthCyclingTime = p[i].cyclingTime/(double)p[i].runningTime; p[i].finish = 1; finishNum ++; curTime += p[i].runningTimep[min].arriveTime; p[min].weigthCyclingTime = p[min].cyclingTime/(double)p[min].runningTime; p[min].finish = 1; finishNum++; curTime = p[min].finishTime; } PrintResult(p, num);} //動態(tài)優(yōu)先級算法 void DynamicPriorityFirst(PCB p[],int num){ printf(“nn-----------------------------動態(tài)優(yōu)先級算法--n”); int finishNum = 0; int curTime = 0; while(finishNum!= num){ int min = 0; //查找優(yōu)先級最高下標(biāo) for(int i = 1;i < num;i++){ if(p[i].finish == 0 && p[min].priority >= p[i].priority) min = i; else if(p[i].finish == 0 && p[min].finish == 1) min = i; } p[min].beginTime = curTime; p[min].hadRunTime = p[min].runningTime; p[min].finishTime = p[min].beginTime + p[min].runningTime; p[min].cyclingTime = p[min].finishTime-p[min].arriveTime; p[min].weigthCyclingTime = p[min].cyclingTime/(double)p[min].runningTime; p[min].finish = 1; finishNum++; curTime = p[min].finishTime; } PrintResult(p, num);} int main(int argc, const char * argv[]){ PCB pcbGroup[30]; //pcb數(shù)組 int processNum = 0;//進(jìn)程數(shù) while(1){ //選擇進(jìn)程數(shù)量 while(1){ if(processNum!= 0) break; printf(“n----------n”); printf(“當(dāng)前默認(rèn)進(jìn)程數(shù)范圍%d--%dn”,MIN_PROCESS,MAX_PROCESS); printf(“1)輸入0可隨機生成進(jìn)程數(shù)目n2)輸入%d-%d范圍內(nèi)數(shù)字,回車,可生成指定數(shù)目進(jìn)程n>>>>>>”,MIN_PROCESS,MAX_PROCESS); int num = 0; scanf(“%d”,&num); if(num == 0){ processNum = GetRandomNumber(MIN_PROCESS, MAX_PROCESS); break; }else{ if((num >= MIN_PROCESS)&&(num <= MAX_PROCESS)){ processNum = num; InitPCBGroup(pcbGroup,processNum); break; }else printf(“n輸入有誤,請重新輸入.n”); } } //選擇算法 printf(“n-----------------------------請輸入對應(yīng)選項序號-----------------------------n”); printf(“0.重新生成進(jìn)程 | 1.時間片輪轉(zhuǎn)法 | 2.短作業(yè)優(yōu)先算法 | 3.動態(tài)優(yōu)先級算法 | q.退出n>>>>>>”); char ch; while((ch = getchar())== 'n'); switch(ch){ case '0'://0 重新生成進(jìn)程 processNum = 0;break; case '1'://1 時間片輪轉(zhuǎn)法 RoundRobin(pcbGroup, processNum);break; case '2'://2 短作業(yè)優(yōu)先算法 ShortestJobFirst(pcbGroup, processNum);break; case '3'://3 動態(tài)優(yōu)先級算法 DynamicPriorityFirst(pcbGroup,processNum);break; case 'q'://q 退出 exit(0); default: break; } } return 0;}第二篇:課程設(shè)計系統(tǒng)報告
第三篇:課程設(shè)計--模擬電信計費系統(tǒng)
第四篇:JAVA課程設(shè)計-ATM機模擬系統(tǒng)
第五篇:操作系統(tǒng)-課程設(shè)計報告-處理機調(diào)度程序