C語法基礎(chǔ)1課件_第1頁
C語法基礎(chǔ)1課件_第2頁
C語法基礎(chǔ)1課件_第3頁
C語法基礎(chǔ)1課件_第4頁
C語法基礎(chǔ)1課件_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

重慶郵電大學(xué)計算機科學(xué)與技術(shù)學(xué)院馮瀟fengxiao@2024/1/6本次課內(nèi)容C++程序的基本構(gòu)成重點C++基本數(shù)據(jù)類型初步學(xué)會cin、cout的基本用法初步理解標(biāo)準(zhǔn)名字空間的作用和用法標(biāo)準(zhǔn)頭文件和頭文件初步了解string和vector的基礎(chǔ)語法初步認(rèn)識和理解模板機制函數(shù)模板2024/1/6C++程序

基本構(gòu)成#include<iostream>usingnamespacestd;//使用標(biāo)準(zhǔn)名字空間std

intmain(){charname[20],classNo[9];

cout<<"inputnameandclassnumber:";

cin>>name>>classNo;

cout<<"Hello,"<<name<<",welcometoClassNo."<<classNo<<endl;return0;}說明C++標(biāo)準(zhǔn)頭文件名沒有擴展名“.h”namespace表示了標(biāo)識符的可見范圍標(biāo)準(zhǔn)名字空間std是C++標(biāo)準(zhǔn)庫中所有標(biāo)識符的有效可見范圍using指示符表示讓標(biāo)準(zhǔn)名字空間中所有標(biāo)識符可見試試將上述程序中的“using......”一行注釋掉C++中,行注釋//和段注釋/**/仍然可用2024/1/62024/1/6C++標(biāo)準(zhǔn)庫演化過程C++誕生后的很長時間,各個軟件廠商對C++庫的實現(xiàn)有所不同,這就意味著不同軟件廠商生產(chǎn)的C++程序庫,其內(nèi)容和行為可能不同C++標(biāo)準(zhǔn)化可以簡化C++的教學(xué)、使用以及在不同平臺間的移植,是C++的一個重要里程碑C++為保持向下兼容,以.h結(jié)尾的C++舊頭文件仍然可用而新的C++標(biāo)準(zhǔn)頭文件將舊頭文件中的.h去掉,如<iosteam>,并標(biāo)準(zhǔn)庫中的一切都被放在標(biāo)準(zhǔn)名字空間std中原來C語言的頭文件去掉.h擴展名,并在文件名前加c,如<cstring>2024/1/6C++中完成標(biāo)準(zhǔn)輸入/輸出C語言中,輸入和輸出通過庫函數(shù)scanf()和printf()完成C++通過I/O流庫完成輸入和輸出,I/O流庫聲明于標(biāo)準(zhǔn)庫文件<iostream>中,使用格式為#include<iostream>usingnamespacestd;//該文件在標(biāo)準(zhǔn)名字空間std下全局流對象cout(讀音,see-out)代表標(biāo)準(zhǔn)輸出設(shè)備,即屏幕全局流對象cin(讀音,see-in)代表標(biāo)準(zhǔn)輸入設(shè)備,即鍵盤全局

名字空間#include<iostream>usingnamespacestd;/*函數(shù)fun定義在所有函數(shù)之外,即定義在全局名字空間中*/voidfun(){cout<<"thisisatestfuction!"<<endl;}intmain(){fun();//調(diào)用全局函數(shù)fun

::fun();//全局名字空間前,域作用符::可省略

return0;}名字空間為避免軟件開發(fā)商、程序員所命名的不同標(biāo)識符產(chǎn)生命名沖突,可將自定義的標(biāo)識符放在自己定義的名字空間下這里以線性同余產(chǎn)生偽隨機數(shù)為例說明名字空間的用法古老的LCG(linearcongruentialgenerator)代表了最樸素的偽隨機數(shù)產(chǎn)生器算法。主要原因是容易理解,容易實現(xiàn),而且速度快。LCG算法數(shù)學(xué)上基于公式:X(n+1)=(a*X(n)+c)%m模m,m>0系數(shù)a,0<a<m增量c,0<=c<m原始值(種子)0<=X(0)<m2024/1/6其中參數(shù)c,m,a比較敏感,或者說直接影響了偽隨機數(shù)產(chǎn)生的質(zhì)量。一般而言,高LCG的m是2的指數(shù)次冪(一般2^32或者2^64),因為這樣取模操作截斷最右的32或64位就可以了。多數(shù)編譯器的庫中使用了該理論實現(xiàn)其偽隨機數(shù)發(fā)生器rand()自定義

名字空間xiao#include<iostream>usingnamespacestd;namespacexiao{ intrand();};intxiao::rand()//產(chǎn)生的隨機數(shù)不超過32767{ staticintxi=1;//(a*xi+c)%32767,位運算比除法快//高16位隨機性較好,令xi右移16位,得到的數(shù)在[0,65535] ((xi=214013L*xi+2531011L)>>16)&0x7fff; returnxi;}2024/1/6自定義

名字空間xiaointmain(){inttimes=10,i; for(i=1;i<=times;i++) { cout<<i<<"."<<xiao::rand()<<endl; }return0;}//采用域名::標(biāo)識符名可以有效避免命名沖突2024/1/62024/1/6空類型void整型int字符型實型邏輯型bool單字符型char寬字符型w_chart單精度型float雙精度型double指針type*結(jié)構(gòu)struct枚舉enum類class非基本數(shù)據(jù)類型數(shù)據(jù)類型基本數(shù)據(jù)類型聯(lián)合union數(shù)組type[]說明:

VC++中整型數(shù)據(jù)占4B,字符型占1B,float型占4B,double型占8B,指針占4Bbool類型示例-1編寫函數(shù)isalpha判斷字符是否是英文字符boolisalpha(charch){return(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z');}intmain(){charch;cin>>ch;if(isalpha(ch))cout<<ch<<"isaletter."<<endl;else

cout<<ch<<"isnotaletter."<<endl;}bool類型示例-2數(shù)樹某校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米??梢园疡R路看成一個數(shù)軸,馬路的一端在數(shù)軸0的位置,另一端在L的位置;數(shù)軸上的每個整數(shù)點,即0,1,2,……,L,都種有一棵樹。由于馬路上有一些區(qū)域要用來建地鐵。這些區(qū)域用它們在數(shù)軸上的起始點和終止點表示。已知任一區(qū)域的起始點和終止點的坐標(biāo)都是整數(shù),區(qū)域之間可能有重合的部分。現(xiàn)在要把這些區(qū)域中的樹(包括區(qū)域端點處的兩棵樹)移走。計算將這些樹都移走后,馬路上還有多少棵樹。2024/1/6樣本輸入數(shù)據(jù)5003//馬路長度500,區(qū)域數(shù)為3150300//第一個區(qū)域的起點和終點100200//第二個區(qū)域的起點和終點470471//第三個區(qū)域的起點和終點樣本輸出數(shù)據(jù)298//馬路上剩余的樹的數(shù)目思路定義bool類型數(shù)組,元素共L+1個,初始值均為true將區(qū)間內(nèi)的元素值標(biāo)記為false統(tǒng)計true值元素,即為所求樹的數(shù)目2024/1/6C++的順序存儲容器--vectorC++在標(biāo)準(zhǔn)頭文件<vector>中定義了向量類vector,用于存放大量同類型元素和C的數(shù)組相比,vector的元素個數(shù)可以由用戶動態(tài)指定、能做整體的賦值、比較等運算、程序運行過程中,數(shù)組容量可以擴大、縮小定義容器對于相關(guān)語法:vector<int>v1;//定義空的向量v1,里面沒有元素//定義bool類型向量v2,有l(wèi)+1個元素,每個元素值為truevector<bool>v2(l+1,true);對第i個元素賦值:v2[i]=falsememset:指定內(nèi)存塊填充值函數(shù)原型void*memset(void*s,intch,size_tn);作用將s所指向的某一塊內(nèi)存中的每個字節(jié)的內(nèi)容全部設(shè)置為ch指定的值,塊的大小由第三個參數(shù)指定,這個函數(shù)通常為新申請的內(nèi)存做初始化工作,或者給指定內(nèi)存塊填充指定值,其返回值為指向S的指針。對應(yīng)頭文件<cstring>2024/1/6#include<iostream>#include<vector>#include<cstring>usingnamespacestd;intmain(){ intl,blocksNumber; cout<<"inputlandblocks:"; cin>>l>>blocksNumber;//l+1個元素,每個元素值為true vector<bool>points(l+1,true);//blocksNumber*2個元,未初始化向量 vector<int>blocks(blocksNumber*2);inti;bool*start=&(*points.begin());for(i=0;i<blocksNumber*2;i+=2){ cout<<"inputstartandendpointofblockNo."<<i+1<<":"; cin>>blocks[i]>>blocks[i+1]; memset((void*)(start+blocks[i]),0,blocks[i+1]-blocks[i]+1);}intcount=0;for(i=0;i<l+1;i++){ if(points[i]==true) count++;}cout<<"treesremained:"<<count<<endl;

return0;}2024/1/6引用(reference)C++引入“引用”的目的指針存在著相當(dāng)大的安全隱患引用,即變量的別名引用的聲明格式類型&引用名=變量名;intnumber=10;int&ref=number;聲明引用時,必須對其進(jìn)行初始化numberref2024/1/6觀察程序#include<iostream>usingnamespacestd;intmain(){ intnumber=1; int*pointer;//指針未初始化,編譯器不報錯

int&ref=number;//去掉=number,編譯器報錯

cout<<ref<<endl; return0;}2024/1/6觀察程序#include<iostream>usingnamespacestd;intmain(){ intnumber=1;

int&ref=number;

constint&con_ref=number;

cout<<"++number="<<++number<<endl; cout<<"++ref="<<++ref<<endl; cout<<"++con_ref="<<++con_ref<<endl; return0;}2024/1/6指針VS.引用什么時候用指針?什么時候用引用?如果存在不指向任何對象的情況,應(yīng)使用指針不能定義引用類型的數(shù)組,只能當(dāng)以單個引用綁定單個變量引用比指針更安全……

voidswap(int&one,int&another){inttemp;

temp=one;one=another;another=temp;}

intmain(){intone=3,another=5;

print("交換前",one,another);

swap(one,another);print("交換后",one,another);return0;}我需要更通用的swap實現(xiàn)!voidswap(int&a,int&b){

inttemp;temp=a;a=b;b=temp;}voidswap(double&a,double&b){

doubletemp;temp=a;a=b;b=temp;}voidswap(string&a,string&b){

stringtemp;temp=a;a=b;b=temp;}voidswap(date&a,date&b){

datetemp;temp=a;a=b;b=temp;}2024/1/6intmain(){inta=3,b=5; charc='a',d='b'; doublee=3.1,f=1.1;cout<<"beforeswap,a="<<a<<",b="<<b<<endl;

swap(a,b);//swap(c,d);cout<<"afterswap,a="<<a<<",b="<<b<<endl;return0;}2024/1/6具有相似功能的不同函數(shù)使用同一函數(shù)名,但這些同名函數(shù)的參數(shù)類型、參數(shù)個數(shù)、返回值類型、函數(shù)功能可以不同編譯系統(tǒng)根據(jù)參數(shù)的類型和個數(shù)來判斷實際調(diào)用時該調(diào)用哪個函數(shù)函數(shù)重載是C++對多態(tài)性的一個體現(xiàn)如果只是函數(shù)返回值類型不同,無法讓編譯其確定調(diào)用哪個函數(shù)什么是函數(shù)重載參數(shù)泛化的swap()//如果把各種數(shù)據(jù)類型抽象為參數(shù)Type//并保證swap能接受各種已定義類型的參數(shù)voidswap(Type&a,Type&b){

Typetemp;temp=a;a=b;b=temp;}//泛化以后的swap具有更強的通用性intstringcomplexcomplex其他類型認(rèn)識模板#include<iostream>#include<string>#include<complex>usingnamespacestd;//這里的Type也可換成其他你愿意的,如<classAny>template<classType>voidSwap(Type&a,Type&b)//const能否加上?{ Typetemp; temp=a; a=b; b=temp;}intmain(){ inta1=5; inta2=3; cout<<"beforeswap,integer1="<<a1<<",integer2="<<a2<<endl; Swap(a1,a2);//int類型函數(shù)調(diào)用 cout<<"afterswap,integer1="<<a1<<",integer2="<<a2<<endl; strings1="C++"; strings2="Java"; cout<<"\nbeforeswap,string1="<<s1<<",string2="<<s2<<endl; Swap(s1,s2);//string類型函數(shù)調(diào)用 cout<<"afterswap,string1="<<s1<<",string2="<<s2<<endl; complex<double>c1(2.2,-5); complex<double>c2(-1,3.9); cout<<"\nbeforeswap,complex1="<<c1<<",complex2="<<c2<<endl; Swap(c1,c2);//complex類型函數(shù)調(diào)用 cout<<"afterswap,complex1="<<c1<<",complex2="<<c2<<endl; return0;}動態(tài)跟蹤程序執(zhí)行過程模板使用參數(shù)化的C++類型創(chuàng)建相應(yīng)的函數(shù)和類,是更高一級的抽象。模板分為函數(shù)模板和類模板一個模板并非實實在在的類或函數(shù),是參數(shù)化的類和函數(shù)函數(shù)模板的定義格式:template<class或typename<類型參數(shù)表>><返回值類型><函數(shù)名>(<參數(shù)表>){<函數(shù)體>}模板關(guān)于函數(shù)模板參數(shù)化的函數(shù)稱為函數(shù)模板,代表的是一個函數(shù)家族函數(shù)模板不是一個實實在在的函數(shù)。編譯系統(tǒng)不為其產(chǎn)生任何執(zhí)行代碼。只有當(dāng)編譯器發(fā)現(xiàn)一個具體的函數(shù)調(diào)用時,才根據(jù)具體的參數(shù)類型產(chǎn)生相應(yīng)的代碼,這部分代碼稱為模板函數(shù)。它是函數(shù)模板的一個具體實例,只處理唯一的一種數(shù)據(jù)類型。模板函數(shù)的生成由編譯系統(tǒng)隱式生成,其實質(zhì)是函數(shù)重載2024/1/6程序版式利用空行分隔出邏輯不同的各部分,緊密相關(guān)的代碼應(yīng)相互靠近利用空格分隔相關(guān)性較弱的事物,聯(lián)系緊密的事物不需要空格(如函數(shù)名和左圓括號、*和指針名),一行代碼一般保持在80個字符內(nèi),最多不超過120個字符變量聲明盡可能靠近其使用位置,標(biāo)識符命名做到名副其實注釋的恰當(dāng)用法是彌補我們在用代碼表達(dá)意圖時遭遇的失?。ㄗ⑨尶偸且环N失敗)程序員不能堅持維護(hù)注釋代碼是唯一真正準(zhǔn)確的信息來源請盡量用代碼而非注釋來表達(dá)自己的意圖如何寫好函數(shù)整潔代碼提倡函數(shù)應(yīng)該做一件事。做好這件事。只做這件事注意以下要點函數(shù)的長度以20行封頂最佳函數(shù)的縮進(jìn)層級不應(yīng)該多于一層或兩層(函數(shù)不應(yīng)該達(dá)到足以容納嵌套結(jié)構(gòu))if語句、else語句、while語句等,其中代碼塊應(yīng)該只有一行只做一件事的函數(shù)無法被合理的分為多個區(qū)段程序中重復(fù)出現(xiàn)的代碼應(yīng)抽象為函數(shù),重復(fù)的代碼潛藏著無數(shù)隱患2024/1/6整潔代碼相關(guān)作業(yè)獨立寫出篩選素數(shù)的整潔代碼編程實現(xiàn)打印2012年年歷已知2012年1月1日是星期天注意按照簡潔代碼的要求規(guī)范自己的程序能做出萬年歷最好寫出有張力的程序2024/1/6從很熟悉的問題談起#include<iostream>usingnamespacestd;

voidswap(int*p1,int*p2){inttemp;

temp=*p1;*p1=*p2;*p2=temp;}

intmain(){intx1=3,x2=5;

cout<<"beforeswap,x1="<<x1<<",x2="<<x2<<endl;swap(&x1,&x2);cout<<"afterswap,x1="<<x1<<",x2="<<x2<<endl;return0;}對比

前一程序#include<iostream>#include<string>usingnamespacestd;

voidswap(int*one,int*another){inttemp;

temp=*one;*one=*another;*another=temp;}

voidprint(stringhint,intone,intanother){cout<<hint<<",one="<<one<<",another="<<another<<endl;}對比前一程序intmain(){intone=3,another=5;

print("交換前",one,another);swap(&one,&another);print("交換后",one,another);return0;}//前后兩個程序哪個更好,為什么?2024/1/6說明標(biāo)識符的命名應(yīng)做到名副其實,以數(shù)字系列命名(x1、x2,...xN),則完全沒有提供正確信息或不能體現(xiàn)作者意圖函數(shù)名應(yīng)當(dāng)是動詞或動詞短語,如deleteNode、save代碼之間應(yīng)減少重復(fù)和依賴多次重復(fù)出現(xiàn)的代碼段應(yīng)想辦法將其模塊化為函數(shù)最小權(quán)限原則整潔代碼的編寫雖然也遵循很多規(guī)范,但也有較強主觀性,需要多加練習(xí)才能掌握大量的實用技巧并積累出優(yōu)化代碼和程序結(jié)構(gòu)的經(jīng)驗2024/1/6閱讀程序#include<iostream>usingnamespacestd;#defineN5boollegal(intscore){ returnscore>=0&&score<=100;}intmain(){ in

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論