2008年6月27日 星期五

9426135 期末程式

找不到空間可以放程式,先把主體放上來,等找到空間再改


以下是程式碼


//從大二上之後就在也沒有碰過 C語言,寫這程式真的有點吃力,尤其是我也沒有學過物件導向的 C++,為了這個程式,還去念了一點書,但是還是無法寫出一個可以運作的結果,感謝實驗室學長的幫忙,我才知道要怎麼著手,但是還是模仿居多,為樂自己的專題著想,大肆還是多去研究點程式的寫法,不然會很淒慘吧。

//寫這程式,首先把老師的程式碼片段都給下載下來,然後好好的看了一下,之後亂拼湊一通,當然BUG一堆,慢慢修改過後,還是搞不定,舊只能丟個屍體出來。

//include的方法,請參閱各CPP的參考書
#include          //這個表頭檔包含了所有的輸入輸出的function
using namespace std;
#include "PoissonArrival.h"  //老師所給的.h檔案
#include "DynamicQueue.h"    //老師所給的.h檔案

//程式本體內,有些變數沒有被宣告到,剛開始就給她ㄧ個值吧
//宣告一些常數
#define departure 2 這個值很重要,剛開始忘了宣告,會出現很多BUG
#define queued 3
#define DATA 2048


Dynamic_Link_Queue Schedular;
Dynamic_Link_Queue DataBuffer;
Queue Q;


 
//從下面開始,是老師寫的程式本體,複製下來就給它放進去吧
int main()
{
       int Simulation_Status;  //加入一些缺的宣告值          
                int new_packet_arrival=1;   //加入ㄧ些缺的宣告值
                double PacketGeneratingRate=0.0;
double PacketArrivalTime = 0.0;
double MeanPacketLength = 0.0;  //integer in bytes, 
int BufferSize = 0;
double LineSpeed = 0.0;
double SimulationTime = 0.0;

//try{            // 應該要有程式防止錯誤的輸入,這裡省略
cout<<"Packet Generating rate(Packets/sec):";
cin>>PacketGeneratingRate;
        PacketArrivalTime = 1.0 / PacketGeneratingRate;
cout<<"Mean Packet Length(Bytes):";
cin>>MeanPacketLength;
cout<<"Buffer size:";
cin>>BufferSize;
cout<<"Line Speed(Bit/sec):";
cin>>LineSpeed;
cout<<"Simulation Time(sec):";
cin>>SimulationTime;
//}

double TimeStamp = 0.0;
PoissonArrival TrafficModel;
int channel_state = 0; //.....

// 系統初始化,手動加入第一個事件,這裡是封包產生事件
// 初始化效能統計參數
long total_data_packets = 0;
long total_departed_pakcets = 0;

double total_packet_system_time = 0.0;
   double total_packet_queueing_time = 0.0;
long number_of_packet_queued = 0;
long number_of_blocked_data = 0;

double channel_time = 0.0; // 統計輸出線路忙線的時間
while(Schedular.get_event(Q) != Empty){} // 清空 Queue,這裡拿來示範,這兩行在這個程式沒作用
while(DataBuffer.get_event(Q) != Empty){}

Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime);
Q.Create_Time = Q.Scheduled_Time;
Q.length = TrafficModel.frame_length(MeanPacketLength);  // double, however it should be integer in bytes in realistic
Q.event = new_packet_arrival;
Q.data_type = DATA;
Q.seq_no = Schedular.seq_no++;
Schedular.join_from_head(Q);




//OutputFile1 = File_name->Text; // 輸出結果資料檔位置

cout<<"Running..."<
Simulation_Status = 1;

// 開始模擬
// transient state
          while (TimeStamp<1000)>
          {
            Schedular.get_event(Q);
            if (Schedular.seq_no > 200000000)
              Schedular.seq_no = 0;
            //Memo->Lines->Add(IntToStr(Schedular.count));
            //Memo->Lines->Add(IntToStr(Q.event));
            switch(Q.event)
            {
            case new_packet_arrival:
              if (TimeStamp > Q.Scheduled_Time)
                cout<<<">
              else
              {
                TimeStamp = Q.Scheduled_Time;
                if (channel_state == 0)
                {
                  // 若有可用通道
                  Q.event = departure;     //一剛開始就宣告它為一個常數
                  Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp;
                  ++channel_state;
                  Schedular.join_from_end(Q);

 cout<
                }
                else if (DataBuffer.count <>
                {
                  // 若無可用通道但有可用buffer
                  Q.event = queued;
                  DataBuffer.join_from_end(Q);
 cout<
                }
                else
                {
                  // 若無可用通道也無可用buffer
                  // block this call
                  // not count in transient state
cout<
                }

                // schedule creating new data packet
                Q.data_type = DATA;
                Q.event = new_packet_arrival;
                Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime) + TimeStamp;
                Q.Create_Time = Q.Scheduled_Time;
                Q.length = TrafficModel.frame_length(MeanPacketLength);
                Q.seq_no = Schedular.seq_no++;
                Schedular.join_from_end(Q);
              }
              break;
            case departure:
              if (TimeStamp > Q.Scheduled_Time)
                cout<<<"error447"<
              else
              {
                TimeStamp = Q.Scheduled_Time;
                // Recording

                //if (used_channels <>
                //  Memo->Lines->Add("error248");

                --channel_state; // 這樣寫是有風險的,但是也容易發覺蟲子
                if (Q.data_type == DATA)
                {
                  // 一定是
                  
                }
cout<

                if (DataBuffer.count != 0)
                {
                  DataBuffer.get_event(Q);

                  Q.event = departure;
                  Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp;
 // 上式因為Q.length的結構是 double,不過一般封包長度是用byte做單位,所以做一些長度的修正
                  ++channel_state;
                  Schedular.join_from_end(Q);

 cout<
                }
              }
              break;
            }
          }
          

// 開始模擬
// steady state
        while (TimeStamp <>
{
// 加油,和上面的程式碼一樣,但要加上統計值的記錄
//TimeStamp += SimulationTime; // 只是讓迴圈結束

// 忍不住寫一下
Schedular.get_event(Q);
            if (Schedular.seq_no > 200000000)
              Schedular.seq_no = 0;
            
            switch(Q.event)
            {
            case new_packet_arrival:
              if (TimeStamp > Q.Scheduled_Time)
                cout<<<"error503"<
              else
              {
                TimeStamp = Q.Scheduled_Time;

++total_data_packets; // 產生的封包數+1

                if (channel_state == 0)
                {
                  // 若有可用通道
                  Q.event = departure;
                  Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp;
                  ++channel_state;
                  Schedular.join_from_end(Q);
                }
                else if (DataBuffer.count <>
                {
                  // 若無可用通道但有可用buffer
                  Q.event = queued;
                  DataBuffer.join_from_end(Q);

 ++number_of_packet_queued;
 cout<

                }
                else
                {
                  // 若無可用通道也無可用buffer
                  // block this call
                  ++number_of_blocked_data;
                }

                // schedule creating new data packet
                Q.data_type = DATA;
                Q.event = new_packet_arrival;
                Q.Scheduled_Time = TrafficModel.next_arrival(PacketArrivalTime) + TimeStamp;
                Q.Create_Time = Q.Scheduled_Time;
                Q.length = TrafficModel.frame_length(MeanPacketLength);
                Q.seq_no = Schedular.seq_no++;
                Schedular.join_from_end(Q);
              }
              break;
            case departure:
              if (TimeStamp > Q.Scheduled_Time)
                cout<<<"error447"<
              else
              {
                TimeStamp = Q.Scheduled_Time;
                // Recording
++total_departed_pakcets;
total_packet_system_time += (TimeStamp - Q.Create_Time);
                //if (used_channels <>
                //  Memo->Lines->Add("error248");

                --channel_state; // 這樣寫是有風險的,但是也容易發覺蟲子
                if (Q.data_type == DATA)
                {
                  // 一定是
                  
                }

                if (DataBuffer.count != 0)
                {
                  DataBuffer.get_event(Q);

                  Q.event = departure;
                  Q.Scheduled_Time = ((floor(Q.length) * 8) / LineSpeed) + TimeStamp;
                  ++channel_state;
                  Schedular.join_from_end(Q);

 total_packet_queueing_time += (TimeStamp - Q.Create_Time);
                }
              }
              break;
            }
}
cout<<"Finished"<
Simulation_Status = 0;

// 效能計算
// 封包遺失率 = lost packet / generated packet; 這裡有一點誤差,因為沒有計算還在queue裡面的封包,不過因為數量太少影響不大。
double packet_loss_rate = double(number_of_blocked_data) / double(total_data_packets);

// 平均延遲時間
double average_delay = total_packet_system_time / double(total_departed_pakcets);

// 平均排程時間
double average_queueing_delay = total_packet_queueing_time / double(total_departed_pakcets);
// 平均排程時間 | if queued
double average_queueing_delay2 = total_packet_queueing_time / double(number_of_packet_queued);
cout<<"封包遺失率 = " <<>
        cout<<"平均延遲時間 = " <<>
cout<<"平均排程時間 = " <<>
cout<<"平均排程時間 | if queued = " <<>
cin.get();
cin.get();
}

沒有留言: