c++語言程序設(shè)計超級簡單了解
信息來源:邪惡八進制信息安全團隊([url]www.eviloctal.com[/url])
文章作者:金州
c++語言程序設(shè)計超級簡單了解
千里之行,始于足下。
這是非常非常非常表面的介紹,是為一點都不知道的朋友寫著玩的。也許你看過之后什么都沒有
收獲到,一直罵作者是個sb.那么我請您原諒耽誤了您的時間,先表示抱歉了。呵呵
一。結(jié)構(gòu)程序設(shè)計方法,要點。.三種基本控制結(jié)構(gòu)。順序,循環(huán),選擇
選擇結(jié)構(gòu),兩種。if switch
if形式1.if 2. if else 3. if else if else if
switch(多分支選擇,金州注釋)
switch
{case 常量表達式1 :語句1
case 常量表達式n :語句n
default:語句n+1
}
循環(huán),while(沒有什么解釋的,先判斷,后執(zhí)行,金州注釋)
例子,求1到100整數(shù)和
#include <iostream.h> (套入函數(shù),金州注釋)
void main() (下面主體,金州注釋)
{
int i, sum = 0; (定義i,賦予數(shù)值1,總和開始為0,金州注釋)
i = 1;
while(i <= 100) (循環(huán)下面部分,當(dāng)i<100,判斷條件,金州注釋)
{
sum += i; (加,一直加,金州注釋)
i++;
} (循環(huán)結(jié)束,金州注釋)
cout<<"sum = "<<sum; (搞出來結(jié)果,字符串sum=那個結(jié)果。金州注釋)
}
do-while 循環(huán)(先執(zhí)行,后判斷)
例子,還舉上面那個,就是求1到100整數(shù)和
#include <iostream.h>
void main()
{
int i, sum=0; (定義賦值。金州注釋)
i = 1;
do (下面是循環(huán),金州注釋)
{
sum += i;
i++;
}while(i<=100); (條件,如果條件滿足就循環(huán),金州注釋)
cout<<"sum = "<<i;
}
for循環(huán),
例子,還是上面那個,求1到100整數(shù)和
#include <iostream.h>
void main()
{
for(sum = 0, i = 1; i <= 100; i++)sum += i;
cout<<"sum = "<<sum;
}
(就是1-2-3-2-3-2-3(1指的是表達式),如果2不滿足,結(jié)束。金州注釋)
二,語言基礎(chǔ):
看例子比較方便了解,
//simple.cpp是一個簡單的C++程序 (標(biāo)準(zhǔn)注釋方法,不執(zhí)行,我沒有用這種注釋,金州注釋)
#include <iostream.h> (一個文件頭,金州注釋)
void main(void) (函數(shù),金州注釋)
{ (main函數(shù)體開始標(biāo)記,金州注釋)
int i; (聲明一個變量,金州注釋)
cout<<"jinzhou sb!"; (輸出,后面的東西,金州注釋)
cout<<"請輸入一個整數(shù):\n"; (\n是換行的意思,<<輸出符號,金州注釋)
cin>>i; (輸入,后面的東西。金州注釋)
cout<<"輸入的整數(shù)是:";
cout <<i;
cout <<‘\n‘; (上三行簡寫:cout<<"您輸入的整數(shù)是:" <<i <<‘\n‘;)
} (主體結(jié)束,金州注釋)
(Visual C++6編譯連接運行后,就是屏幕上出現(xiàn)“jinzhou sb!請輸入一個整數(shù)”
然后你隨便輸入一個,回車,得到“輸入的整數(shù)是:”,就是你輸入的那個,大
概明白是這么個格式就行了。注意一點的就是,函數(shù)定義返回類型為void,不用返回
,如果定義為int,則不同。如下。金州注釋。)
int main()
{
…
return 0;
}
(還有就是c++區(qū)分大小寫,一般命令小寫多,常量大寫多。變量混用多。金州注釋)
數(shù)據(jù)類型略過。大多類似的。
變量使用舉一個簡單的例子。
#include <iostream.h>
int main (void)
{
int workDays = 5; (定義一個整型變量,初始化為5,金州注釋)
float workHours, payRate, weeklyPay; (實型變量三個,金州注釋)
workHours = 7.5; payRate = 38.55; (賦值,金州注釋)
weeklyPay = workDays * workHours * payRate; (乘法運算,金州注釋)
cout << "Weekly Pay = " << weeklyPay << ‘\n‘; (輸出換行,金州注釋)
}
就是計算工資呢。
例子,打印給定半徑的圓的面積和周長(有常量定義的實例程序)
void main()
{
const double PI = 3.1415926535898; (定義圓周率常量PI,金州注釋)
double radius; (定義圓半徑變量,金州注釋)
double area; (定義圓面積變量,金州注釋)
double circumference; (定義圓周長變量,金州注釋,)
cout << "輸入半徑 : "; (輸出,屏幕顯示,金州注釋)
cin >> radius; (輸入,金州注釋)
area = PI*radius*radius; (面積公式,金州注釋)
circumference = 2.0*PI*radius; (周長共識,金州注釋)
cout << "面積 " << radius << " is "
<< area << " \n";
cout << "周長是 " << circumference (輸出到屏幕,金州注釋)
<< ";
}
(注意定義常量的形式為 const 類型 名字 = 值。)
三,運算符和表達式
要注意的是:
+ + 自加(前綴) ++valuel + 10 // 得出16,valuel變?yōu)?
+ + 自加(后綴) valuel++ + 10 // 得出15,valuel變?yōu)?
- - 自減(前綴) --valuel + 10 // 得出14,valuel變?yōu)?
- - 自減(后綴) valuel-- + 10 // 得出15,valuel變?yōu)?
(其實質(zhì)就是用‘++‘代替了"+1"(后綴)和"1+"(前綴)、‘-‘代替了"-1"。金州注釋)
! 邏輯非 !(5 = = 5) // 得出 0 (0是假,1是真,金州注釋)
&& 邏輯與 5 < 6 && 6 < 6 // 得出 0
|| 邏輯或 5 < 6 || 6 < 5 // 得出 1
~ 取反 ~‘\011‘ // 得出 ‘\366‘
& 逐位與 ‘\011‘ & ‘\027‘ // 得出‘\001‘
| 逐位或 ‘\011‘ | ‘\027‘ // 得出‘\037‘
^ 逐位異或 ‘\011‘ ^ ‘\027‘ // 得出‘\036‘
<< 逐位左移 ‘\011‘ << 2 // 得出‘\044‘
>> 逐位右移 ‘\011‘ >> 2 // 得出‘\002‘
實例 10進制值 二進制值
x 011 0 0 0 0 1 0 0 1
y 027 0 0 0 1 0 1 1 1
~x 366 1 1 1 1 0 1 1 0
x & y 001 0 0 0 0 0 0 0 1
x | y 037 0 0 0 1 1 1 1 1
x ^ y 036 0 0 0 1 1 1 1 0
x << 2 044 0 0 1 0 0 1 0 0
x >> 2 002 0 0 0 0 0 0 1 0
運算例子,
#include <iostream.h>
void main( )
{
int a,b, m=3,n=4;
a=7*2+-3%5-4/3;//-3%5=-3,4/3=1
b=m++ - --n;
cout<<a<<"\t"<<b<<"\t"<<m<<"\t"<<n<<endl;
}
結(jié)果10 0 4 3
例子
#include <iostream.h>
void main( )
{
char x=‘m‘,y=‘n‘;
int n;
n=x<y;
cout <<n<<endl;
n=x==y-1;
cout<<n<<endl;
n=(‘y‘!=‘Y‘)+(5<3)+(y-x==1);
cout <<n<<endl;
}
結(jié)果 1 1 2
四,流程控制語句。
if語句;if-else語句;switch語句;while語句;do-while語句;for語句;break語句;continue語句
(都是簡單英語,沒有什么解釋的,哈哈,金州注釋)
五,函數(shù)。
這個解釋多多網(wǎng)上。
舉例子;求長方形面積。
#include<iostream.h> (C++庫函數(shù)說明,金州注釋)
int area(int length, int width); ( area函數(shù)說明,定義長寬,金州注釋)
void main() (主函數(shù),程序從該函數(shù)開始執(zhí)行,金州注釋)
{
int this_length, this_width; (定義長寬,金州注釋)
cout << "輸入長度: "; (cout和cin,就是函數(shù),輸出后面字符串。金州注釋)
cin >> this_length; (輸入,金州注釋)
cout << "輸入寬度: "; (輸出那句話到屏幕,金州注釋)
cin >> this_width;
cout << "\n"; (回車,金州注釋)
cout << "面積 " << this_length << "x" << this_width;
cout << " 長方形面積是 " << area(this_length, this_width); (調(diào)用area函數(shù),金州注釋)
}
int area(int length, int width) (area函數(shù)定義,金州注釋)
{
int number;
number = length * width;
return number;
}
例子,比較大小的。
#include <iostream.h>
int max(int a,int b) (調(diào)用這個函數(shù),金州注釋)
{
if(a>b)return a; (如果則怎么怎么的,金州注釋)
else return b;
} (以上是定義max函數(shù)的,金州注釋)
void main()
{
int max(int a,int b);
int x,y,z;
cout<<"輸入兩個數(shù)"<<endl; (屏幕顯示,回車輸入)
cin>>x>>y;
z=max(x,y); (z為比較結(jié)果,金州注釋)
cout<<"最大的數(shù)="<<z; (輸出,金州注釋)
}
例子
#include <iostream.h>
void Foo (int num)
{
num = 0;
cout << "num = " << num << ‘\n‘;
}
int main (void)
{
int x = 10;
Foo(x);
cout << "x = " << x << ‘\n‘;
return 0;
}
(這個更簡單,不多說,主要是明白num是一個形參變量num,x是實參變量,實參調(diào)用時
送到形參,但是因為內(nèi)存單元不同,即使num賦值0,并不影響x的值,道理大概理解了
就好,金州注釋)
(不多解釋了,相關(guān)詳細內(nèi)容,要找資料好好揣摩,這里只是簡單說一下,金州注釋)
六,數(shù)組與字符串。
#include <iostream.h>
void main(void)
{
int marks[4] = {82,92,95,88}; (這個就是數(shù)組,就是這個格式,金州注釋)
cout<<"第二個元素是:"<<marks[1]<<endl; (四個數(shù)排序是0123,所以1是第二個元素,金州注釋)
}
(這就是定義數(shù)組了,找第二個元素的。92。金州注釋)
例子,求字符串的長度 (這個是字符串的,金州注釋。)
#define MAXLEN 80
#include <stdio.h>
void main(void)
{
char str[MAXLEN + 1]; (最長加1,因為是從0計算的,金州注釋)
int l; (定義長度,這個符號可不是1啊,金州注釋)
printf("Input a string:"); (輸出,告訴你開始輸入,金州注釋)
scanf("%s",str); (檢查你輸入的,如果空,金州注釋)
l = 0; (長度0,金州注釋)
while(str[l] != ‘\0‘) (非空,金州注釋)
l ++; (加加,數(shù)出來,金州注釋)
printf("The length of this string is %d\n",l); (輸出結(jié)果回車,金州注釋)
}
七,指針與引用
指針就是在內(nèi)存中的地址,它可能是變量的地址,也可能是函數(shù)的入口地址。
引用為變量提供了一個別名,變量通過引用訪問與通過變量名訪問是完全等價的。
引用提供了與指針相同的能力,但比指針更為直觀,更易于理解。
int d =1;
int* const p =&d
(有const表示不可修改,p是一個常量指針,它指向一個整型變量。就是d,p本
身不能修改,但它所指向的內(nèi)容卻可以修改:*p =2;這個不大好說,請查閱相
嚴謹詳細資料。關(guān)金州注釋。)
例如:
#include <iostream.h>
#define SIZE 10
void main()
{
int array[SIZE]; (聲明整數(shù)數(shù)組,金州注釋)
int *p=array; (定義一個整型指針p,給他數(shù)組首地址,金州注釋)
int i ; (定義變量i,金州注釋)
for(i=0;i<SIZE;i++) (賦值,運算,金州注釋)
array[i]=i;
for(i=0;i<SIZE;i++)
cout<<*p++<<endl; (*p++就是訪問下一個數(shù)組元素,金州注釋)
p=&array[8]; (給他array[8]的地址,金州注釋)
cout<<"array[8]="<<*p<<endl; (輸出*p,金州注釋)
cout<<"array[8]="<<array[8]<<endl; (輸出array[8],金州注釋)
}
(兩個值是一樣的,因為從0開始,所以都是對數(shù)組第9個元素的訪問。金州注釋)
例子:折半查找函數(shù)
int BinSearch (char *item, char *table[], (就是在table中查找是否含有item的元素)
int n, int (*Compare)(const char*, const char*)) Compare是一個比較函數(shù)指針,金州注釋)
{
int bot = 0; (底部0,金州注釋)
int top = n - 1; (頂部n-1,金州注釋)
int mid, cmp; (定義比較變量,比較,金州注釋)
while (bot <= top) (比較當(dāng)然需要循環(huán),循環(huán)條件,意思就是不空,金州注釋)
{ (以下循環(huán)內(nèi)容)
mid = (bot + top) / 2; (mid等于,全部除以2,就是一半,金州注釋)
if ((cmp = Compare(item,table[mid])) == 0) (如果恰好相等,金州注釋)
return mid; ( 就是它,金州注釋)
else if (cmp < 0) (不相等,金州注釋)
top = mid - 1; ( 查找數(shù)組的下半部,金州注釋)
else
bot = mid + 1; ( 查找數(shù)組的上半部,金州注釋)
}
return -1; (上面循環(huán)之后,返回-1,沒有找到,因為n就是0了。金州注釋)
}
例如。
char *cities[] = {"Beijing", "Shanghai", "Tianjin", "Zhongqing"};
cout << BinSearch("Tianjin ", cities, 4, strcmp) << ‘\n‘
輸出結(jié)果2
(就是,給出一個數(shù)組,找找“Tianjin”在四個中的位置,2就是在第三個位置。)
八。結(jié)構(gòu) 鏈表
結(jié)構(gòu)(struct)數(shù)據(jù)類型,它能夠識別一組相關(guān)的數(shù)據(jù)。
鏈表也是表示線性數(shù)據(jù)最有用的方法之一,用鏈表保存線性數(shù)據(jù),可以克服數(shù)組的問題
舉例
#include <iostream.h>
#include <string.h>
struct Person_Info { (個人信息表,下面是相關(guān)內(nèi)容。金州注釋)
char name[10];
int age;
long ssn;
};
void main (void)
{
Person_Info* p1; (給個指針,金州注釋)
p1 = new Person_Info; (申請內(nèi)存,金州注釋)
p1->age = 27; ( 給age成員賦值,金州注釋)
strcpy(p1->name,"jinzhou"); (給name成員賦值 ,金州注釋)
cout << "Name: " << p1->name << endl; ( 打印name成員,金州注釋)
cout << "Age: " << p1->age << endl; (打印age成員,金州注釋)
delete p1; (釋放申請的內(nèi)存,金州注釋)
}
簡單例子學(xué)生結(jié)構(gòu)的實例
struct stu
{
int num;
int score;
stu *next;
}
(明白這個意思就行了,金州注釋)
九,編譯預(yù)處理
C++提供的編譯預(yù)處理功能主要有以下三種:(一) 宏定義(二) 文件包含(三) 條件編譯
宏定義例子;
#include <iostream.h>, (一定要有,或者出錯,金州注釋)
#define CUBE_THREE 3*3* (用簡單宏定義定義了一個符號常量"CUBE_THREE")
void main()
{
int a; (定義變量,金州注釋)
a=CUBE_THREE; (賦予值,就是a=3*3*3,金州注釋)
cout<<"a is"<<a<<endl; (輸出,結(jié)果為27,金州注釋)
}
(這個意思主要是說可以把常用的東西定義為宏。這個不帶參數(shù),帶參數(shù)的略。金州注釋)
文件包含類的略。
例子:條件編譯命令的一個例子
#include <iostream.h>
#define TIME
void main()
{
#ifdef TIME (如果TIME被定義過,輸出下面句話。金州注釋)
cout<<"Now begin to work"<<endl;
#else (如果沒有定義,輸出下面的,金州注釋)
cout<<"You can have a rest"<<endl;
#endif
}
(所謂條件,就是有條件的,金州注釋。就是要選擇。哈哈)
十。類與對象
略過,請找尋相關(guān)詳細資料閱讀,不好意思。
十一,繼承與多態(tài)。(略過)
十二,輸入輸出流。
抽象流基類
ios 流基類
輸入流類
istream 普通輸入流類和用于其它輸入流的基類
ifstream 輸入文件流類
istream_withassign 用于cin的輸入流類
istrstream 輸入串流類
輸出流類
ostream 普通輸出流類和用于其它輸出流類的基類
ofstream 輸出文件流類
ostream_withassign 用于cout、cerr和clog的流類
ostrstream. 輸出串流類
輸入輸出流類
iostream 普通輸入輸出流類和用于其它輸入輸出流的基類
fstream 輸入輸出文件流類
strstream 輸入輸出串流類
stdiostream 用于標(biāo)準(zhǔn)輸入輸出文件的輸入輸出類
緩沖流類
streambuf 抽象緩沖流基類
filebuf 用于磁盤文件的緩沖流類
strstreambuf. 用于串的緩沖流類
stdiobuf 用于標(biāo)準(zhǔn)輸入輸出文件的緩沖流類
預(yù)定義流初始化類
iostream_init 預(yù)定義流初始化的類
其中,ios、istream、ostream和streambuf類構(gòu)成了C++中iostream輸入輸出功能的基礎(chǔ)
(略)
如果你真的捏著鼻子再捏著鼻子讀完的話,也許和我一樣覺得算是了解了c++九牛一毛了,
其實后來才發(fā)現(xiàn)不過是才知道牛是有毛的而已。到現(xiàn)在我也沒有抓住牛頭,據(jù)說編程需要天才,
我沒有哪個天分,哈哈,只是希望有朋友看到之后能夠有一個很大概地了解。不好意思。不過大家可
以常常到邪惡八進制來看看,這里有很多這方面的超級高手,至少算是看看天才的樣子,哈哈
祝福!
金州。邪惡八進制
2005.12.17
定義常量也可以使用define、inline去實現(xiàn)
我建議大家用const和inline而不用#define
這個條款最好稱為:“盡量用編譯器而不用預(yù)處理”,因為#define經(jīng)常被認為好象不是語言本身的一部分。這是問題之一。再看下面的語句:
#define ASPECT_RATIO 1.653
編譯器會永遠也看不到ASPECT_RATIO這個符號名,因為在源碼進入編譯器之前,它會被預(yù)處理程序去掉,于是ASPECT_RATIO不會加入到符號列表中。如果涉及到這個常量的代碼在編譯時報錯,就會很令人費解,因為報錯信息指的是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO不是在你自己寫的頭文件中定義的,你就會奇怪1.653是從哪里來的,甚至?xí)〞r間跟蹤下去。這個問題也會出現(xiàn)在符號調(diào)試器中,因為同樣地,你所寫的符號名不會出現(xiàn)在符號列表中。
解決這個問題的方案很簡單:不用預(yù)處理宏,定義一個常量:
const double ASPECT_RATIO = 1.653;
這種方法很有效。但有兩個特殊情況要注意。
首先,定義指針常量時會有點不同。因為常量定義一般是放在頭文件中(許多源文件會包含它),除了指針?biāo)傅念愋鸵x成const外,重要的是指針也經(jīng)常要定義成const。例如,要在頭文件中定義一個基于char*的字符串常量,你要寫兩次const:
const char * const authorName = "Scott Meyers";
關(guān)于const的含義和用法,特別是和指針相關(guān)聯(lián)的問題,參見條款21。
另外,定義某個類(class)的常量一般也很方便,只有一點點不同。要把常量限制在類中,首先要使它成為類的成員;為了保證常量最多只有一份拷貝,還要把它定義為靜態(tài)成員:
class GamePlayer {
private:
static const int NUM_TURNS = 5; // constant eclaration
int scores[NUM_TURNS]; // use of constant
...
};
還有一點,正如你看到的,上面的語句是NUM_TURNS的聲明,而不是定義,所以你還必須在類的實現(xiàn)代碼文件中定義類的靜態(tài)成員:
const int GamePlayer::NUM_TURNS; // mandatory definition;
// goes in class impl.file
你不必過于擔(dān)心這種小事。如果你忘了定義,鏈接器會提醒你。
舊一點的編譯器會不接受這種語法,因為它認為類的靜態(tài)成員在聲明時定義初始值是非法的;而且,類內(nèi)只允許初始化整數(shù)類型(如:int, bool, char 等),還只能是常量。
在上面的語法不能使用的情況下,可以在定義時賦初值:
class EngineeringConstants { // this goes in the class
private: // header file
static const double FUDGE_FACTOR;
...
};
// this goes in the class implementation file
const double EngineeringConstants::FUDGE_FACTOR = 1.35;
大多數(shù)情況下你只要做這么多。唯一例外的是當(dāng)你的類在編譯時需要用到這個類的常量的情況,例如上面GamePlayer::scores數(shù)組的聲明(編譯過程中編譯器一定要知道數(shù)組的大小)。所以,為了彌補那些(不正確地)禁止類內(nèi)進行整型類常量初始化的編譯器的不足,可以采用稱之為“借用enum”的方法來解決。這種技術(shù)很好地利用了當(dāng)需要int類型時可以使用枚舉類型的原則,所以GamePlayer也可以象這樣來定義:
class GamePlayer {
private:
enum { NUM_TURNS = 5 } // "the enum hack" — makes
// NUM_TURNS a symbolic name
// for 5
int scores[NUM_TURNS];// fine
};
除非你正在用老的編譯器(即寫于1995年之前),你不必借用enum。當(dāng)然,知道有這種方法還是值得的,因為這種可以追溯到很久以前的時代的代碼可是不常見的喲。
回到預(yù)處理的話題上來。另一個普遍的#define指令的用法是用它來實現(xiàn)那些看起來象函數(shù)而又不會導(dǎo)致函數(shù)調(diào)用的宏。典型的例子是計算兩個對象的最大值:
#define max(a,b) ((a) > (b) ? (a) : (b))
這個語句有很多缺陷,光想想都讓人頭疼,甚至比在高峰時間到高速公路去開車還讓人痛苦。
無論什么時候你寫了象這樣的宏,你必須記住在寫宏體時對每個參數(shù)都要加上括號;否則,別人調(diào)用你的宏時如果用了表達式就會造成很大的麻煩。但是即使你象這樣做了,還會有象下面這樣奇怪的事發(fā)生:
int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次
這種情況下,max內(nèi)部發(fā)生些什么取決于它比較的是什么值!
幸運的是你不必再忍受這樣愚笨的語句了。你可以用普通函數(shù)實現(xiàn)宏的效率,再加上可預(yù)計的行為和類型安全,這就是內(nèi)聯(lián)函數(shù)(見條款33):
inline int max(int a, int b) { return a > b ? a : b; }
不過這和上面的宏不大一樣,因為這個版本的max只能處理int類型。但模板可以很輕巧地解決這個問題:
template<class T>
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }
這個模板產(chǎn)生了一整套函數(shù),每個函數(shù)拿兩個可以轉(zhuǎn)換成同種類型的對象進行比較然后返回較大的(常量)對象的引用。因為不知道T的類型,返回時傳遞引用可以提高效率(見條款22)。
順便說一句,在你打算用模板寫象max這樣有用的通用函數(shù)時,先檢查一下標(biāo)準(zhǔn)庫(見條款49),看看他們是不是已經(jīng)存在。比如說上面說的max,你會驚喜地發(fā)現(xiàn)你可以后人乘涼:max是C++標(biāo)準(zhǔn)庫的一部分。
有了const和inline,你對預(yù)處理的需要減少了,但也不能完全沒有它。拋棄#include的日子還很遠,#ifdef/#ifndef在控制編譯的過程中還扮演重要角色。預(yù)處理還不能退休,但你一定要計劃給它經(jīng)常放長假。