欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      救護(hù)車調(diào)度模擬系統(tǒng)課程設(shè)計報告

      時間:2019-05-14 14:56:11下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《救護(hù)車調(diào)度模擬系統(tǒng)課程設(shè)計報告》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《救護(hù)車調(diào)度模擬系統(tǒng)課程設(shè)計報告》。

      第一篇:救護(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 #include #include #include #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define OVERFLOW_-2 #define INFINITY_ 9999 #define MAX_VERTEX_NUM 52 #define Status int #define VertexType int //定點類型

      //**********************定義結(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é)束,按任意鍵退出程序。

      第二篇:課程設(shè)計系統(tǒng)報告

      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è)計--模擬電信計費系統(tǒng)

      課程設(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è)計-ATM機模擬系統(tǒng)

      《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è)計報告-處理機調(diào)度程序

      操作系統(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 #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;}

      下載救護(hù)車調(diào)度模擬系統(tǒng)課程設(shè)計報告word格式文檔
      下載救護(hù)車調(diào)度模擬系統(tǒng)課程設(shè)計報告.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報,并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        人事管理系統(tǒng)Java課程設(shè)計報告

        湖南科技大學(xué)計算機科學(xué)與工程學(xué)院 數(shù)據(jù)庫課程設(shè)計報告 題目:人事管理管理系統(tǒng) 學(xué) 號:1005030221 姓 名:艾向兵 指導(dǎo)教師:張黎 完成時間:2012年1月4日 組員:蘇勇,成佳裕,艾向兵 企......

        酒店管理系統(tǒng)課程設(shè)計報告

        課程設(shè)計報告 課程名稱: 項目名稱: 院 系: 專 業(yè): 姓 名: 班 級: 學(xué) 號: 指導(dǎo)教師: 設(shè)計地點: 基于ASP.net 2.0的Web應(yīng)用開發(fā) 酒店管理系統(tǒng) 計算機科學(xué)與工程學(xué)院 計算機科學(xué)與技......

        嵌入式系統(tǒng)基礎(chǔ)課程設(shè)計報告

        河南機電高等??茖W(xué)校 嵌入式系統(tǒng)基礎(chǔ)課程設(shè)計報告 系 部: 電子通信工程系 專 業(yè): 班 級: 學(xué)生姓名: 學(xué) 號: 2012年 06月 嵌入式系統(tǒng)基礎(chǔ)課程設(shè)計任務(wù)書 1.時間:2012年06月11日~201......

        嵌入式系統(tǒng)基礎(chǔ)課程設(shè)計報告

        河南機電高等??茖W(xué)校 《嵌入式系統(tǒng)基礎(chǔ)》 課程設(shè)計報告 設(shè)計題目: 系 部: 電子通信工程系 班 級: 學(xué) 號: 學(xué)生姓名: 成 績: 2012年 05月 《嵌入式系統(tǒng)基礎(chǔ)》課程設(shè)計任務(wù)書 1.時......

        倉庫管理系統(tǒng)課程設(shè)計報告

        倉庫管理系統(tǒng)課程設(shè)計報告 一、概述 項目背景: 倉庫管理在企業(yè)的整個供應(yīng)鏈中起著至關(guān)重要的作用,如果不能保證正確的進(jìn)貨和庫存控制及發(fā)貨,將會導(dǎo)致管理費用的增加,服務(wù)質(zhì)量難......

        宿舍管理系統(tǒng)課程設(shè)計報告

        青島農(nóng)業(yè)大學(xué) 理學(xué)與信息科學(xué)學(xué)院 高級語言課程設(shè)計報告 設(shè) 計 題 目 宿舍管理系統(tǒng) 學(xué)生專業(yè)班級班 學(xué)生姓名(學(xué)號) 設(shè)計小組其他同學(xué)姓名(學(xué)號)指 導(dǎo) 教 師 完 成 時 間......

        網(wǎng)上購物系統(tǒng)課程設(shè)計報告[定稿]

        荊楚理工學(xué)院 課程設(shè)計成果 學(xué)院: 計算機工程學(xué)院班 級: 11級計算機科學(xué)與技術(shù)3班學(xué)生姓名: 學(xué) 號: 設(shè)計地點(單位)A5-102 設(shè)計題目: 網(wǎng)上購物系統(tǒng)完成日期: 2014 年 6 月3......

        倉庫管理系統(tǒng)課程設(shè)計報告

        《軟件工程》課程設(shè)計報告 倉庫信息管理系統(tǒng) 專業(yè)班級: 學(xué)生學(xué)號: 學(xué)生姓名: 指導(dǎo)教師姓名: 2016年6 月 目錄 一、系統(tǒng)可行性研究 ....................................... 2......