1、cin 輸入資料流一旦破壞,就不能恢複
2、函數:一段相關程式碼群組成的集合,以便完成一個特定的目的。
(1)可以通過名字來使用,曾強了代碼的可重用性。
(2)提高可維護性。
3、函數定義=聲明+函數體:
<傳回型別> 函數名(<參數表>...){
return ...
}
函數傳回值:只有在調用函數的同時才能儲存傳回值
函數定義時,小括弧裡的參數稱為形參,在函數被調用的時候才有意義。
函數調用時,小括弧裡的被傳入的參數稱為實參。
4、函數在調用之前只有聲明就可以,因為在編譯階段,參照聲明可以完成文法上的檢測。
函式宣告 <傳回型別> 函數名(<參數表>...);
聲明與定義的分離,實現並行開發!
5、全域變數,局部變數
局部變數:函數內部聲明的變數,只能在它聲明的函數內部使用。如果沒有對其初始化就使用,則其值為垃圾數字。
全域變數:能被所有的函數共同使用,要聲明在所有函數(包括main函數)之外。盡量少使用,影響太大。如果沒有對其初始化就使用,系統預設為其初始化為0。
6、資料區:只存放全域資料,資料區的資料是穩定的,程式啟動時,即建立,程式結束時,才消失
堆區
代碼區
棧區:儲存局部變數。插入資料從棧頂插入,先進後出結構。
如果函數不調用的話,局部變數是不存在的
在main函數與其他函數之間有個標記,一旦函數返回,棧頂下落到標記處
棧中的資料是變化頻繁的
函數調用時建立,函數返回即消失
7、 值傳遞
函數調用並不是傳遞實參本身,而是建立一個臨時變數傳到函數中
(1)為形參建立一個臨時變數,臨時變數的值是拷貝實參的值
(2)對形參的使用,實際上是對臨時變數的使用,不會改變實參的大小
8、預設參數
(1)area(float a , float b =10); 當只傳遞一個參數時,形參b的位置預設為10
(2)有預設值的形參靠右擺放
9、內嵌函式
聲明時加“inline”,運行效率高,不支援結構控制語句,必須先定義,不支援函數原形。
10、遞迴函式
在函數內部自己調用自己。
必須有明確的返回條件----遞迴的出口
11、函數重載
(1)函數名相同。
(2)參數表不同(參數個數不同,參數類型不同,參數順序不同)。
(3)與參數名和傳回型別不關
調用時會根據參數表匹配自動調用相應的函數
編譯之後,函數的名字都會發生改變,後面會加上形參縮寫作為尾碼,沒有任何函數的名字是一樣的
不會做自動型別提升
對重載的函數最好不使用參數預設值
12、const
在函數內部不允許修改此形參
13、需求分析、設計、代碼實現
View Code
========================================= chang.h ========================================= char change( char );
View Code
========================================= chang_impl.cc ========================================= char change( char c ){ if( c >= 97 && c <= 122 ){ return c - 32 ; }else if( c >= 65 && c <= 90 ){ return c + 32 ; }else{ return c ; } }
View Code
========================================= main.cc ========================================= #include <iostream> #include "change.h" using namespace std; int main(){ char c = '0' ; while( 1 ){ cout<<"enter a char [ 0 exit] >"; cin>>c ; if( c == '0' ){ break; } cout<<" ====> " << change( c ) <<endl; } return 0 ; }
14、外部變數和內部變數
外部變數:extern int g; ----聲明外部變數,引入一個變數,在別的來源程式中聲明
內部變數:在源檔案中聲明的變數
外部變數肯定是一個全域變數!
範圍 生命週期 儲存位置
全域變數(外部變數) 所有函數 程式啟動->程式結束 資料區 Data
局部變數 函數內部 函數開始調用->函數返回 棧 Stack
靜態局部 函數中 第一次調用函數時(只被初始化一次)->程式結束 資料區 ---只需要一份資料,並且不希望別的函數訪問他
靜態全域 本源檔案中 程式開始->程式結束 資料區
作業:實現銀行業務 ========= a.cc ==================
long id;
int password;
double balance;
long(id) create(balance , password); //建立賬戶
void save( sum );
int(staus 0,-1) withdraw(sum , password);
float query();
===================================
generatorId(); //得到唯一的ID號
int showMenu(); //現實主菜單
saveMenu(); //收集開戶資訊,然後調用建立賬戶
createMenu();
withdrawMenu();
queryMenu();
===================================
***今日重點:(1)形參和實參的區別
(2)遞迴
(3)函數重載
練習: 觀察費波拉切數列1,1,2,3,5,8,13,21,34. . . . . .第一項和第二項都是1,後面的每一項是前面相鄰兩項的和。
使用遞迴方法計算第n項的費波拉切數列結果。