1. 程式人生 > >NOIP第12講需要注意的問題

NOIP第12講需要注意的問題

關於上週課程需要注意的一些小問題:

一. 關於scanf和printf的使用:

scanf和printf實際上是c語言的標準輸入和標準輸出方法,c++作為c語言的升級版本,在可以使用自己的cin和cout外,也可以使用scanf和printf,那這兩者既然可以實現同樣的功能,為什麼還要學習呢?這是因為我們在競賽的過程中,如果要涉及到輸入大量的資料,那麼使用scanf和printf的話效率會更高,就不會出現讀取超時或者輸出超時而被扣分的問題,所以這點是需要注意的。那麼,使用scanf和printf的格式是什麼呢?
格式:scanf(“佔位符” ,儲存地址);
格式:printf(“佔位符” ,變數名);
那什麼是佔位符:
佔位符,如其名字,就是幫變數佔位置的意思。那為什麼要幫變數佔位置呢?原因有二:

1.方便調整變數的格式

這更多應用在變數的輸出上,我們有時候希望在輸出某一變數的時候對其進行一定的優化,比如:輸出一個小數點為2的按四捨五入進位的浮點數,如果按照cout的做法,儘管可以實現,但過程需要進行轉化的步驟很多,對程式的執行時間造成很大的影響,並且容易出現邏輯問題,導致錯誤的發生。因此,這種情況下更應當使用佔位符進行解決。我們先佔著這麼一個位置,然後跟編譯器說明我們需要什麼樣的資料,編譯器把資料進行處理後,再在佔位符的位置進行輸出,這個過程是不需要我們去編寫的,因而更快速有效。

2.提高效率

我們平時用cout輸出的時候,遇到變數的時候,往往要隔開用(<<)符號隔開,最後把所有的輸出內容再一段一段的拼接成一個完整的輸出。這個過程是比較耗記憶體的。而使用佔位符的話,就不需要多次拼接,只是一個數據的替換即可,在執行效率上方便很多。
常見的佔位符有哪些:

佔位符 對應格式
%d int
%c char
%f float
%lf double(lf為LF的小寫)
%s string

注意1:

如果要輸出特定位數的浮點數,這在%後符號前加 . 號以及位數。比如 %.2lf(注意沒有空格)

注意2:

如果要輸入多個數據的時候,需要注意以下幾個場景:
scanf(“%d%c%f”,&a,&b,&c) —->輸入的資料不需要加空格(10c4.56),但是如果格式相同會產出一些問題,不建議使用
scanf(“%d %d %d”,&a,&b,&c ) —->輸入的資料間需要加空格(10 200 30)
scanf(“%d ,%d, %d”,&a,&b,&c) —->輸入的資料間需要加逗格(10 ,200 ,30)
也就是說,除了佔位符之外,在scanf裡面寫上的一些非佔位符資訊,都需要在資料輸入的時候寫上一遍,否則會得不到正確的資料

注意3:

使用scanf需要注意用&符號(取址,以後會說到),使用printf則直接使用變數

二、關於檔案輸入和檔案輸出

檔案輸入和輸出是競賽中必定使用的資料錄入和結果輸出工具,畢竟一場比賽可能需要上百個資料,人家總不會讓你一個數字一個數字地輸入,因此熟練掌握檔案的輸入和輸出是競賽的必備技能。本次有介紹兩種方法:

1.freopen方法:

freopen方法一般和scanf和printf方法一起使用。具體的步驟為:

1-1.開啟輸入檔案和輸出檔案

   freopen("file.in","r",stdin);  

開啟輸入檔案,三個引數,第一個檔名,第二個表明為可讀”r”read簡寫 第三個標準輸入流 stdin(std為標準standard的縮寫,in代表輸入)

 freopen("file.out","w",stdout);  

開啟輸出檔案,三個引數,第一個檔名,第二個表明為可寫”w”write簡寫 第三個標準輸入流 stdout(std為標準standard的縮寫,out代表輸出)

1-2.輸入或者輸出檔案

用scanf或者printf實現,執行1-1後,會直接從檔案讀取資料或者直接將資訊輸出到檔案中,不需要再在視窗上
敲入資料,也不能再在視窗上顯示結果。要檢視執行結果,要開啟輸出檔案

1-3關閉輸入輸出檔案

 fclose(stdin);
 fclose(stdout);

2.引入標頭檔案fstream

fstream是c++中用於處理檔案輸入和檔案輸出的文
件,特點是簡單,缺點是效率沒有freopen快,並且不能進行格式處理
使用方法如下:

2-1:引入標頭檔案 #include

2-2: 定義輸入輸出流

ifstream cin("輸入檔名");
ofstream cout("輸出檔名");

2-3使用cin 輸入檔案,使用cout輸出檔案

注意:

1.不管是哪種方法,輸入檔案和輸出檔案都要和執行檔案放在一起(建議cpp檔案也放在一起,dev編譯時會在cpp檔案的同級目錄生成執行檔案(.exe檔案))

2.使用引用標頭檔案的方法時,定義檔案輸入輸出流要放在using namespace std;之後

3.引用了fstream標頭檔案之後,就不能再引用iostream標頭檔案,注意啦!

4.以上兩種方法可以混用,比如引用標頭檔案,定義cin輸入資料,然後使用freopen開啟輸出檔案,用printf方法輸出結果,一般用於輸出規定格式的浮點數

三:結構體

結構體可以理解為我們自己定義的一個數據型別,實際上是基本資料型別的一個集合:其格式為:
struct 結構體名字{
基本資料型別 變數名;
…. ….;
} ;

 struct student{
   string name;
   int      age;
   int      score
};

注意:
1.相同的結構體可以直接整體交換,比如
student st1,st2,
可以直接這樣:
st1=st2;
而不需要像下面這樣,但注意是相同的結構體才可以
st1.name = st2.name;
st1.age = st2.age;
st1.score = st2.score;

總結:

從這一節課開始,接下來的課程會越來越重要,對於程式設計的邏輯訓練要求比較高,因此切記一定要認真聽課,及時跟著老師練習。反覆去模擬程式的執行過程,從而提高程式設計的邏輯思維。另外,要養成一些競賽的習慣,檔案輸入和輸出是競賽的基礎要求,必須要牢固掌握。不然資料沒法錄入,就會連分數都沒有。
平時練習的要求:
1.不要使用自定義標頭檔案

2.每次都要匯入cstdio標頭檔案,NOIP競賽的編譯器沒有這個標頭檔案會出現不能讀取資料的問題,要注意了

最後:多練,勤問,更要多思考,加油。堅持是為了最後的成功。