1. 程式人生 > >第三次作業(第四次不要電梯了吧)

第三次作業(第四次不要電梯了吧)

字符 ace end 內容 第四次 關閉 uri ifs ios

電梯

倉庫地址:https://github.com/vjudge0913/FZU_homework3

題目:

一棟10層的大樓(樓層編號1-10),設有一臺無限載重的電梯,初始時電梯停在1層。電梯移動1層的耗時為1,在某一層停靠的耗時為1(時間初始為0)。為了使得乘客等待的時間(電梯在目的層的停靠時刻 - 乘客發出請求時刻)總和最小,請你編寫一個程序來進行電梯調度。

本次作業是在上一次的電梯調度的代碼上進行改善叠代,不僅加入新的功能,也對程序的輸入輸出提出了新的要求。

作業要求:

一、 輸入從文件讀取,輸出是寫入文件。

大家在學習 C 語言的時候,應該明白了控制臺程序的輸入和輸出。但文件操作往往是之前的課程中被忽略的一個部分,大家有沒有試過“如果我要將程序的輸出保存下來”、“如果我要從一個文件中獲得輸入”這些實操的環節呢?如果沒有,現在是一個再好不過的學習機會,來吧,learning by doing!

要求:輸入輸出改成文件輸入輸出操作。輸入文件的文件名為 input.txt 裏面保存著輸入樣例,一個輸入為一行,輸入的格式見作業的第二條要求。

例如:

0 1 5
2 2 5

程序輸出每次對應的決策,每一行的輸出格式為 xx時,停靠在x樓。輸出在文件名為output.txt的文件中。

二、這次的乘客不再像上一次作業那樣只會去頂樓或者是 1 樓了,現在要使我們的程序功能更加貼近現實。

叠代:乘客會前往任意一層,請修改程序代碼並實現。自然,輸入請求就變為了:每個請求一行,格式為 請求時刻 起始樓層數 去往樓層 。同樣,大家也需要自己構造測試樣例,讓這臺“電梯”盡可能好的工作。構造五個輸入樣例,最後輸出完成五個請求(所有乘客都到達目的地)後,各乘客的等待時間總和。輸入輸出的詳細例子可以參加上一次作業的要求。


春節的氣氛裏,磕磕絆絆總算是碼完了,這次乘客目的地不是固定的,我看了下之前的代碼,呵呵,只能全部推翻重寫一個了??

可能還沒學到位,也沒有那個勇氣去碼那個最優解,完成的還是跟第二次作業差不多的順風車版本,有客撿客,逾期不候。
最終提交代碼:

version 行數 debug數 用時
initial 85(117) 16 10h
second 120 30+ 18h

ps:寫這種項目太可怕了,各方面都有聯系,bug成堆出現
技術分享圖片

然後測試樣例的話就是如下圖的五組,取的是各種極端吧,好像還有點重復(我已經被摧殘得心誌不堅了),有順路、簡單掉頭(非刻意省時掉頭)、等待、一趟完成幾種情況。
技術分享圖片

技術分享圖片

輸出就如上圖 ↑

來說說文件吧,感覺真的是個好東西,尤其是EOF。。。
就看了c++的文件輸入輸出流,c的沒看了

1、流的分類總結
  1. ofstream :文件的寫操作,主要是從內存寫入存儲設備(如磁盤),它是繼承istream類
  2. ifstream :文件的讀操作,主要是從存儲設備中讀取數據到內存,它是繼承了ostream類
  3. fstream :讀寫操作,對打開的文件可進行讀寫操作,它是繼承了iostream類。
2、打開文件

打開文件作為我們對文件操作一個最基本操作,它主要就是把我們的類對象和一個文件相關聯起來,這樣這個被打開的文件就可以用那個類對象表示,之後我們對類對象所做的輸入和輸出操作其實都是對那個文件所做的操作。

在每個文件流的類中都定義了一個打開文件的成員函數:open,函數原型為:

void open(const char* filename,ios_base::openmode mode);

參數的含義:
   filename:  要打開的文件名
  mode:    要打開文件的方式

其中mode定義在之前說的所有IO的基類:ios類中,它包括如下幾種方式:

    ios::app:   以追加的方式打開文件
  ios::ate:   文件打開後定位到文件尾,ios:app就包含有此屬性
  ios::binary: 以二進制方式打開文件,缺省的方式是文本方式。兩種方式的區別見前文
  ios::in:    文件以輸入方式打開(文件數據輸入到內存)(ifstream對象默認方式就是這個)
  ios::out:   文件以輸出方式打開(內存數據輸出到文件)(ofstream對象默認的打開方式)
  ios::nocreate: 不建立文件,所以文件不存在時打開失敗
  ios::noreplace:不覆蓋文件,所以打開文件時如果文件存在失敗
  ios::trunc:  如果文件存在,把文件長度設為0
3、關閉文件

當我們完成了對文件的操作後,我們就需要調用函數close來關閉我們的文件流,close函數的作用其實就是清空該類對象的在緩存中的內容並且關閉該類對象和那個文件的關聯關系。為了防止一個類對象被銷毀後,還和某個文件保留著關聯關系,所以文件流類的析構函數都會自動調用close函數。

4、文件讀寫操作

對於文件讀寫操作要分兩種:

  • 二進制文件的讀取(暫不介紹)
  • 文本文件的讀取
    對文本文件的讀寫操作有兩種方式:
    一種方式是使用輸入輸出操作符“<<”、“>>”;
    另一種方式是使用put、get、getline等函數進行操作。
    後者是使用函數,但是這些函數只是能用於處理字符,對於其它數據類型則有些有心無力了,為此還是建議使用第一種方式,因為第一種方式重載了輸入輸出操作符,它可以處理所有內建數據類型。

THE END


第三次作業(第四次不要電梯了吧)