




已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C+筆記(day02) 2007-3-231、%ldd 可行文件的名字; -可查看連接庫2、C+嚴格區(qū)分大小寫,變量命名只能使用字母,數字,或下劃線,第一個字母必須使用字母或下劃線3、float單精度,double雙精度 sizeof(int)-返回int在內存中占的大小 size(bool)=1 size(char)=1 size(short)=2 size(int)=4 size(long)=4 size(float)=4 size(double)=8 無符號的數據一旦溢出,將成為0。 有符號的int最大值2147483647,益處變?yōu)樽钚≈?,負?、不同數據間賦值:有兼容性的,占空間小的數據類型,可以給占空間大的數據類型賦值 不兼容的,可能會造成數據丟失。int -float可以轉換;float-int 小數部分丟失5、運算符 要求數據類型要相同 i+ 先用后加 +i 先加后用 布爾運算符號:結果真或假 邏輯運算符:做bool運算!(1)“與”運算&,兩條件要同時成立(2)“或”運算|,只要有一個條件是真,就成立6、按位與“&” 有0則與的結果為0 按位或“|” 有1則或的結果為1 按位異或“” 兩位不同則為1,相同為07、左移 “ 右移1相當于除以28、三目運算符 條件?真:假 9、返回變量 - 表達式可以再次賦值,賦值語句返回變量本身 eg:(a=10)=20 返回變量的值 - 不可再次賦值 eg:(a+5)=10 左值:變量、賦值表達式,+i的返回值是左值 右值:不能放在“=”左邊的是右值,i+的返回值是右值 常量要在聲明時就賦值,并且不能修改10、流程控制 while(條件)循環(huán)體 條件成立,則進入循環(huán),知道條件為假時,退出循環(huán) (1)聲明循環(huán)變量 (2)while()確定循環(huán)條件 (3)循環(huán)變量要有所變化,避免形成死循環(huán) for(變量初始化;條件;變量的變化)循環(huán)體代碼 開始時判斷循環(huán)條件是否成立,循環(huán)結束后,到第三個條件,使用變量改變 do循環(huán)體while(條件); 先執(zhí)行一次,再判斷條件,選擇是否繼續(xù)執(zhí)行循環(huán) break; 跳出循環(huán),執(zhí)行循環(huán)之外的下一條語句 continue; 從次處開始,結束本次循環(huán),進行下一次循環(huán)11、課堂練習-求1到100之間的所有素數C+筆記 (day03) 2007-03-26 1、cin 輸入流一旦破壞,就不能恢復2、函數:一段相關代碼組成的集合,以便完成一個特定的目的。 (1)可以通過名字來使用,曾強了代碼的可重用性。 (2)提高可維護性。3、函數定義=聲明+函數體: 函數名(.) return . 函數返回值:只有在調用函數的同時才能保存返回值 函數定義時,小括號里的參數稱為形參,在函數被調用的時候才有意義。 函數調用時,小括號里的被傳入的參數稱為實參。4、函數在調用之前只有聲明就可以,因為在編譯階段,參照聲明可以完成語法上的檢測。 函數聲明 函數名(.); 聲明與定義的分離,實現并行開發(fā)!5、全局變量,局部變量 局部變量:函數內部聲明的變量,只能在它聲明的函數內部使用。如果沒有對其初始化就使用,則其值為垃圾數字。 全局變量:能被所有的函數共同使用,要聲明在所有函數(包括main函數)之外。盡量少使用,影響太大。如果沒有對其初始化就使用,系統(tǒng)默認為其初始化為0。6、數據區(qū):只存放全局數據,數據區(qū)的數據是穩(wěn)定的,程序啟動時,即創(chuàng)建,程序結束時,才消失 堆區(qū) 代碼區(qū) 棧區(qū):存儲局部變量。插入數據從棧頂插入,先進后出結構。 如果函數不調用的話,局部變量是不存在的 在main函數與其他函數之間有個標記,一旦函數返回,棧頂下落到標記處 棧中的數據是變化頻繁的 函數調用時創(chuàng)建,函數返回即消失 7、 值傳遞 函數調用并不是傳遞實參本身,而是創(chuàng)建一個臨時變量傳到函數中 (1)為形參創(chuàng)建一個臨時變量,臨時變量的值是拷貝實參的值 (2)對形參的使用,實際上是對臨時變量的使用,不會改變實參的大小 8、默認參數 (1)area(float a , float b =10); 當只傳遞一個參數時,形參b的位置默認為10 (2)有默認值的形參靠右擺放 9、內聯函數 聲明時加“inline”,運行效率高,不支持結構控制語句,必須先定義,不支持函數原形。 10、遞歸函數 在函數內部自己調用自己。 必須有明確的返回條件-遞歸的出口11、函數重載 (1)函數名相同。 (2)參數表不同(參數個數不同,參數類型不同,參數順序不同)。 (3)與參數名和返回類型不關 調用時會根據參數表匹配自動調用相應的函數 編譯之后,函數的名字都會發(fā)生改變,后面會加上形參縮寫作為后綴,沒有任何函數的名字是一樣的 不會做自動類型提升 對重載的函數最好不使用參數默認值12、const 在函數內部不允許修改此形參13、需求分析、設計、代碼實現 多文件示例: = chang.h = char change( char ); = chang_impl.cc = char change( char c ) if( c = 97 & c = 65 & c = 90 ) return c + 32 ; else return c ; = main.cc = #include #include change.h using namespace std; int main() char c = 0 ; while( 1 ) cout; cinc ; if( c = 0 ) break; cout change( c ) 程序結束 數據區(qū) Data 局部變量 函數內部 函數開始調用-函數返回 棧 Stack 靜態(tài)局部 函數中 第一次調用函數時(只被初始化一次)-程序結束 數據區(qū) -只需要一份數據,并且不希望別的函數訪問他 靜態(tài)全局 本源文件中 程序開始-程序結束 數據區(qū)作業(yè):實現銀行業(yè)務 = a.cc = long id; int password; double balance; long(id) create(balance , password); /創(chuàng)建賬戶 void save( sum ); int(staus 0,-1) withdraw(sum , password); float query(); = generatorId(); /得到唯一的ID號 int showMenu(); /現實主菜單 saveMenu(); /收集開戶信息,然后調用創(chuàng)建賬戶 createMenu(); withdrawMenu(); queryMenu(); = *今日重點:(1)形參和實參的區(qū)別 (2)遞歸 (3)函數重載練習: 觀察費波拉切數列1,1,2,3,5,8,13,21,34. . . . . .第一項和第二項都是1,后面的每一項是前面相鄰兩項的和。 使用遞歸方法計算第n項的費波拉切數列結果。C+筆記 2007-03-271、程序由函數組成,函數只完成自己特定的功能即可 把函數聲明寫在頭文件里(想使用函數時,可直接導入頭文件,調用函數),把函數實現寫在.cc文件中 把多個.cc文件編譯成可執(zhí)行文件 -分別編譯成.o文件,再連接到一起 2、值傳遞 函數中的參數傳遞是值傳遞,形參只是實參的一份拷貝數據,在函數中改變形參的值,對實參無影響 3、作業(yè)分析:顯示層(與用戶的交互) 操作數據(完成業(yè)務邏輯) biz層 數據(id , password , balance ) Bank實現代碼 = biz.cc=/operation /* p : Password of account . * b : balance of account . * return : id of account . */long create( int p , double b );void save( double sum ) ;/* * return : 0 success , otherwise -1 returned . */int withdraw( int p , double sum ) ; double query( int p ) ;long generateId();= biz.cc=static long id ;static int passwd ;static double balance ;#include using namespace std;long generateId()static int id = 1 ;return id+ ;long create( int p , double b )id = generateId();passwd = p ;balance = b ;return id ;void save( double sum )balance += sum ;int withdraw( int p , double sum )if( p != passwd )coutinvalid password . endl;return -1 ;if( balance (sum + 10) )coutno enough money . endl;return -1 ;balance -= sum ;return 0 ;double query( int p )if( p != passwd )coutinvalid password endl;return -1 ;elsereturn balance ;= menu.h=int showMenu();void createMenu();void saveMenu();void withdrawMenu();void queryMenu();= menu.cc=#include biz.h#include using namespace std;int showMenu()cout 1 endl;cout 2 endl;cout 3 endl;cout 4 endl;cout 0 endl;cout;int c ;cinc ;if( !cin )return -1 ;elsereturn c ;void createMenu()int passwd ;double balance ;cout;cinpasswd ;cout;cinbalance ;long id = create( passwd , balance );cout=endl;coutcreate account ok , id = id endl;cout=endl;void saveMenu()double sum ;cout;cinsum ;save( sum ) ;cout=endl;coutsave money ok endl;cout=endl;void withdrawMenu()int passwd ; double sum ;cout;cinpasswd ;cout;cinsum ;int ret = withdraw( passwd , sum ) ;if( ret = 0 )cout=endl;coutwithdraw successful . endl;cout=endl;void queryMenu()int passwd ;cout;cinpasswd ;double ret = query( passwd ) ;if( ret != -1 ) cout=endl; coutBLANCE : $ ret endl; cout=endl;else cout=endl; coutinvalid password endl; cout=endl;= main.cc=#include #include menu.husing namespace std;int main()int c = 0 ;doc = showMenu();if( c = -1 ) break ; switch( c ) case 1 : createMenu();break; case 2 : saveMenu();break; case 3 : withdrawMenu();break; case 4 : queryMenu();break; case 0 :cout=endl;coutGood Bye endl;cout=endl;break; default : cout=endl;coutinvalid option, try again.;coutendl;cout=endl;break;while( c != 0 );return 0 ;= 4、數組 (1)聲明數組 數組名元素個數 int intArray100; -intArray 是個集合,有100個元素,每個元素都是int類型的 (2)初始化數組 (3)使用 通過數組的下標來訪問數組中的元素,下標從0開始 intArray0=100; -intArray數組中的第一個元素賦值為100 數組聲明時,元素個數必須是常量表達式 數組聲明帶有初始化,則可直接為數組賦值 在數組聲明時,必須指明數組長度,若在聲明時候初始化,數組長度可省 int a12=100,200; 長度2 int a2 = 5,6,7; 長度3 對于數組中的元素個數,比聲明時的多,則會報錯,這樣的越界訪問,對整個程序來說會有很嚴重的后果! 比聲明少,系統(tǒng)會把余下的沒有定義數據的元素初始化為0 不初始化的數組,其中的元素數據為隨機數 下標工作的原理: 表示編號,還表示當前元素相對于數組起始位置的偏移量 計算機通過偏移量找到元素在內存中的位置5、數組的排序 選擇排序:找出最小的放在第一個位置 數組元素有n個,需要找n-1次,需要比較n-i次(i為開始元素的位置)6、多維數組 二維數組;一個數組中的每個元素是個數組 聲明: int iA510; -“5”代表數組有5行,“10”代表數組有10列 聲明時,第一維可以省略! 確定一個元素需要2個下標7、結構 用戶自己定義的一組數據類型 聲明結構時,編譯器不會分配空間,在聲明一個結構的變量的時候才會為其分配空間 結構中的成員是多個簡單類型組成的 用 “結構名.成員名”來操作其中的成員變量 strcpy(,huxz);為char數組賦值 結構類型的變量間也可以相互賦值 結構的大小就是所有成員的大小之和(每個成員的大小必須是int類型的整倍數,當不夠時,會自動補齊) Unix上還要求,結構的大小是結構的最大的成員的整倍數 size(of) 計算結構大小 作業(yè):把銀行系統(tǒng)用結構改寫,要求可以開多個賬戶(定義一個account類型的數組保存) struct account long id; int password; double balance; create(int password,double balance); void save(int id , double sum); int withdraw(int id,int password,double sun); double query(int id,int password); C+筆記 2007年3月28日1、變量的存儲 (1)內存是一塊空間,把其中的每個字節(jié)做了編號,為了以后計算機能通過編號找到數據 (2)編址方式:絕對編址(在整個程序中使用),相對編址(字節(jié)相對于邏輯0偏移量,在進程中使用)2、取變量地址 (1)& &i 表示取內存中i的地址 地址的編址用十六進制表示 (2)邏輯0在代碼區(qū) 全局變量在數據區(qū),地址的編址是大于0的 局部變量在棧區(qū),地址的編址是小于0的3、數組、結構的地址 (1)數組中的數據在內存中是連續(xù)存儲的。 數組中每個元素的地址相差的值應為數組元素類型的大小。 (2)結構的地址: 結構的空間是連續(xù)的。 結構的起始地址與第一個成員變量的地址是一樣的。4、存儲地址 指針:存儲變量的地址 指針的類型由將要保存的地址的變量類型決定 int*只能保存int變量的地址 指針賦值一定要是同類型的指針才能相互賦值! 5、指針的運算 (1)指針和指針之間的運算 “+”,“*”,“/” 指針與指針間是不能做這些運算,沒有意義! “-” 可以做減法運算,以“sizeof(指針類型)”作為計算單位的! 注意:要同類型的指針才能做此運算,不同的話,會對運算單位產生歧義。 (2)指針和數字之間的運算(加、減都可以) int i = 100; int * p = &i; 打印 p+1 - 相當于在地址上加4,因為存儲的變量是int類型的 p+2 - 相當于在地址上加86、通過指針訪問所指向的變量 *p 代表指針p所指向的變量 *p i 指針在聲明的時候,即初始化 int * p = NULL; 表示沒有明確指向,不能 *p ,會出現 “段錯誤”的異常 -空指針 段錯誤原因 (1)空指針 (2)數組越界 (3)遞歸的條件不正確7、課堂練習 用指針打印出數組中個元素的值 #include using namespace std; int main() int ai6=34,4,12,67,34,2; int *p = &ai0; for(int i = 0 ; i 6 ; i+) cout a i = *(p+i) endl; return 0; int *p = ai ; 數組的本質就是用指針實現的,數組的名字就代表數組的首地址(起始地址) 數組的名字是指向數組首地址(a0)的指針 ai 數組名,就是指向數組首地址的指針,可以用下標取元素,也可以把數組名當指針來訪問元素 *(ai+n) p 指針名,也是指向首地址的指針,也可以通過下標(像數組名一樣)訪問數組元素 pn *(p+n)8、結構指針 struct person int id; int age; int main() person per = 1,20; person* p = &per; cout per.id =per.idendl; /通過結構名取成員變量 cout per.age= per.age endl; cout =endl; cout (*P).id= (*P).id endl; /通過指針訪問結構的成員變量 cout (*P).age= (*P).age endl; / (*p).id p-id 只有結構指針可以這樣使用 cout =endl; cout id= id endl; cout age= age endl; return 0; 9、指針的地址 指針變量在內存中占4個字節(jié)(與類型無關,因為保存地址的指針只保存地址) 保存int型指針(int* p = &i)的地址用int*保存(int* pp = &p) #include using namespace std; int main() int i = 0 ; int * p = &i ; int * pp = & p ; cout&i = &i endl; coutp = p endl; cout&p = &p endl; coutpp = pp endl; cout&pp = &pp endl; couti = i endl; cout*p = *p endl; cout*pp = *pp endl; cout*pp = *pp p - i 指向關系 pp=&p p=&i *pp=p *p=i *pp=*p=iC+筆記 2007年3月29日1、數組指針聲明的時候不用初始化,聲明以后就指向數組的首地址了,以后不允許改變,所以,數組指針可以認為是一個常量,一旦賦值就不能改變2、char數組 (1)打印char數組的名字即打印數組的內容 (2)對于字符數組,0是結束標志 字符 0 = 數組0 可以認為字符0的ASCII碼就是0 要保存5個字符,就要把字符數組長度聲明為6 (3)strcpy()和memset() 給一個字符串數組賦值 strcpy(),自動為字符串補 0 在使用strcpy之前,要調用memset(str,0,sizeof(str));初始化一片內存 str - 初始化內存的起始位置 0 - 初始化的值 (初始化為0,清除垃圾數字) sizeof(str) - 初始化空間的大小 (4)strlen(str) 計算實際存儲的字符個數,不包括0 (5)strcmp(str1,str2) 比較2個字符串是否相等 實際比較的兩個字符串的ASCII碼的大小,返回0則內容一樣 (6)字符串的拆分 strtok(a,b); a、被拆分的字符串名字,當此處是NULL時,表示要拆分的不是新串 b、分隔符號 此函數調用一次,拆分一次 當此函數返回NULL時,則表明拆分完畢 Hello World叫字符串常量,存儲在data數據區(qū)里,類型就是char* 其值是一個地址,指向數據區(qū)里的一塊空間 數據區(qū)里的空間保存的內容就是Hello World char line50; strcpy(line,1:liucy:20:male); char *p = strtok(line , :); /p指針指向的變量 cout p endl; while(p != NULL) p = strtok ( NULL , : ); cout p endl; (7) strcpy(name,1234); /name是個變量,可以改變 strcpy(p,1234); /p是個指針,指向一個字符串,是常量,不能改變 p = 1234; /這樣是正確的 指針指向的是常量,不能通過指針改其值,若指向變量,則可以通過指針改變變量的值 (8)字符串連接 strcat(sub,world); 連接條件:sub字符串數組的剩余長度要大于連接的字符串長度 char *p = Hello; strcat(p,World); /error 指針指向一個常量,不能改變,所以指針后面不能添加東西 3、通過指針傳遞參數 通過傳遞地址。改變變量的值 #include using namespace std; void fn (int *pa) *pa = 2 * (*pa); /*pa是指針pa指向的變量的值,在此做的操作,會對變量造成永久的改變 int main() int a = 100; fn(&a); /把a的地址傳個fn函數 cout a endl; return 0; 4、課堂練習 字符串 “1:huxinzhe:20:male” 要求:聲明一個結構 Person int id; char name50; int age; char gender10; 拆分賦值 提示:atoi可以把字符串轉換成int型 #include #include #include using namespace std; struct Person int id; char name20; int age; char gender10; ; int main() Person per; char line50; while(true) cout ; cinline; if(strcmp(line,exit)=0) break; char *p = strtok(line , :); per.id = atoi(p); p = strtok(NULL , :); strcpy(,p); p = strtok(NULL , :); per.age = atoi(p); p = strtok(NULL , :); strcpy(per.gender,p); cout per.id = per.id endl; cout = endl; cout per.age = per.age endl; cout per.gender = per.gender id = 1; / (*p).id = 1; 6、 傳遞參數 最好傳地址,節(jié)省內存(因為不用進行入棧,出棧操作,直接用指針訪問數據) 在參數前加const,可避免在函數內部對數據進行非法修改 當一個數組做參數時,編譯器會自動把數組的首地址傳個函數 所以在函數內部對數組的更改,就是通過指針對數組中元素的永久性更改 7、數組,存數據個數不限,通過一個函數insert()存數據,disp()打印數組 C+ 筆記 2007年3月30日 1、數組是自動分配空間,指針要手工分配空間(i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度快遞配送服務承包合同
- 二零二五年度農業(yè)科技項目合作放棄承諾函合同范本
- 二零二五年度安防產品簡易加工制造合同
- 二零二五年度養(yǎng)老產業(yè)擔保與借款人服務協(xié)議
- 二零二五年度私人土地租賃與體育設施建設合同
- 基于人工智能技術的智慧城市規(guī)劃合同書
- 服裝設計與制作合同
- 科技部技術服務合同
- 互聯網行業(yè)用戶隱私保護及免責協(xié)議
- 物流園區(qū)投資建設協(xié)議
- 2025年湖南工業(yè)職業(yè)技術學院單招職業(yè)適應性測試題庫完整版
- 作品集合同范本
- 2輸變電工程施工質量驗收統(tǒng)一表式(變電工程土建專業(yè))-2024年版
- QCT457-2023救護車技術規(guī)范
- 剪紙藝術-認識剪紙
- 駕駛員違規(guī)違章學習記錄表
- 簡易瞬態(tài)工況法1
- 中國鐵路總公司環(huán)境保護管理辦法(鐵總計統(tǒng)〔2015〕260號)
- 技術分析介紹教程課件
- 汽車新能源汽車產業(yè)專利趨勢分析
- 故事小羊過橋PPT課件
評論
0/150
提交評論