標籤:長度 將不 nat sub flags 功能 enter end
開始自己的C++複習進階之路。
聲明:
這次寫的博文純當是一個回想複習的教程。一些非常基礎的知識將不再出現。或者一掠而過,這次的主要風格就是示範範例代碼非常多~~~
全部代碼在Ubuntu 14.04 LTS版,GCC4.8.1(g++)編譯通過。其它的平台沒試過。預計有些代碼在VC6.0以下通過不了,由於有些語言特性是C++11標準的。
以下就是本文的開始吧。
一、C++必須說和必須略過的一些東西
1、工具
工具的話。簡答的編程貌似如今已經習慣了在GCC(g++)下了。Linux平台以下,一般不須要非常大的project的時候我都是用VIM寫好代碼,直接執行了。略微複雜一點的就用CodeBlocks。只是因為打字速度一般,認為VIM的編輯功能也不是非常強,所以通常是把代碼什麼的在VIM寫好,然後凝視文檔以及具體的閱讀改動的就直接上Sublime Text或者Gedit了。(Emacs還沒用到過, -_-||).
Windows以下的話。假設寫的代碼用不到C++11的新特性那就用VC6.0吧。CodeBlocks也能夠,只是寫這篇教程的時候我用的是VS2010的cmd編譯的。貌似Windows以下好多各種的編譯器。。。喜歡什麼用什麼吧。假設要用C++11特性的話。貌似CodeBlocks最新版本號碼的是能夠支援的。其它的編譯器布吉島。
。
。
所以。關於編譯器的問題,或者因為編譯器導致的問題,就不說了。麻煩。
2、代碼風格
代碼風格神馬的也貌似沒什麼能夠說的,無非是你的花括弧是怎麼括,你的運算子兩旁有沒有空格,你的凝視是寫在哪裡等等。。
。
關於我的風格在詳細的示範範例中能夠看粗來。
全部的風格僅僅要不要太標新立異或者奇葩的話。堅持你的風格就好啦。這個實在沒有什麼好說的。
3、文檔凝視
關於C++自己主動文檔產生我選擇了Doxygen,這個在Windows和Linux以下都能用,只是Windows以下還沒用,只是目測應該要比Linux以下好看和易用一點吧。
關於這個文檔的一些keyword和標準請查看官方文檔或者自行百度,Google一下。非常多人都寫了技巧和使用方法。
所以,關於文檔和凝視什麼不再解釋。
以下開始詳細的回想複習了。。
。
二、C++基礎
2.1整數運算式
程式示範範例:輸入一系列的整數,輸出其平均值。當輸入的數字小於0個的時候給出提示。
整數運算式這些的。實在不是必需多費口舌。
直接上代碼。
代碼例如以下:
/************************************************************************* > File Name: list0301_int_exp.cpp > Author: suool > Mail: [email protected] > Created Time: 2014年05月16日 星期五 21時06分20秒 ************************************************************************/#include<iostream>using namespace std;int main(){ int sum(0); int count(0); int x; while(cin >> x) { sum += x; count += 1; } if(count <= 0) { cout << count << endl; cout << "The couunt is below zero !" << endl; } else { cout << count << endl; cout << "Average = " << sum/count << endl ; } return 0;}
執行結果和示範範例略去。(當時執行的時候木有,如今也不想執行截了。)
2.2字串與簡單的輸入輸出
這一部分涉及到逸出字元,關於逸出字元,在C語言和其它語言裡面大家應該都灰常清楚了,所以,不再說了-_-||。
。
。。。
非常顯然C++的輸入輸出操作符>> & <<大家都明確的:操作符箭頭指向愛你過的方向是資訊流向的方向:從流到變數是輸入。從變數到流是輸入。
以下是一個字串的簡單示範範例:一個簡單的人機互動對話。代碼入下:
/************************************************************************* > File Name: list0502_cin_string.cpp > Author: suool > Mail: [email protected] > Created Time: 2014年05月16日 星期五 21時23分43秒 ************************************************************************/#include<iostream>#include<string>using namespace std;int main(){ string name; string response; cout << "What‘s your name ?" << endl; cin >> name ; cout << "Hello " << name << ", how are you ?" <<endl; cin >> response ; cout << name << "Good bye !" << endl;}
2.3格式化輸出(流程式控制制語句)
關於if或者while或者for等等迴圈控制語句沒有必要再講了吧。這些實在是看代碼都能看懂的東西。
僅僅要有點其它的語言基礎都沒問題的。
So。讓我們直接進入C++的格式化輸出。
我們首先要達到以下的輸出效果,要求就是寫出這個程式。
效果例如以下:
程式碼例如以下:
/************************************************************************* > File Name: list0801_cout_format.cpp > Author: suool > Mail: [email protected] > Created Time: 2014年05月16日 星期五 21時31分52秒 ************************************************************************/#include<iostream>#include<iomanip>using namespace std;int main(){ cout << " N N^2 N^3" << endl; // cout.flags(ios::left); for (int i = 0; i < 21; i++ ) { cout << setw(2) << i+1 << setw(7) << (i+1)*(i+1) << setw(8) << (i+1)*(i+1)*(i+1) << endl; } cout << "Finaish it !" << endl; return 0;}
從上面的代碼應該就能夠看出,C++關於對齊的設定是使用cout.flags(ios::left);進行設定的,以下的程式中有第二種的設定方法,就是使用cout << right; 前提是聲明#include<ios>。
So。以下看一個略微複雜一點的格式化輸出,輸出的效果例如以下:(事實上就是乘法表。。)
效果例如以下:
程式碼例如以下:
/************************************************************************* > File Name: list0807_table_cout.cpp > Author: suool_hu > Mail: [email protected] > Created Time: 2014年05月17日 星期六 19時14分40秒 ************************************************************************/#include<iomanip>#include<iostream>#include<string>using namespace std;// 輸出10X10的一個乘法表int main(){ // 基本變數設定 int const min(1); int const max(10); int const colwidth(4); // cout << ios::right; // 列印表頭 cout << setw(colwidth) << ‘*‘ << ‘|‘; for (int i=1; i<=max ; i++) cout << setw(colwidth) << i; cout << endl; // 列印切割行 // 設定填充符 cout << setfill(‘-‘) << setw(colwidth) << "" << ‘+‘ << setw(max * colwidth) << "" << endl; // 重設填充符 cout << setfill(‘ ‘); // 列印每一行 for (int row=1; row<=max; row++) { cout << setw(colwidth) << row << ‘|‘; for (int col= 1; col<=row; col ++) { cout << setw(colwidth) << row*col; } cout << endl; } return 0;}
以下的小程式是關於setw()函數和對其方式和預設填充方式設定的詳細表現的示範範例:
示範範例一:
/*************************************************************************> File Name: list0803.cpp> Author: suool_hu> Mail: [email protected]> Created Time: 2014年05月16日 星期五 22時56分42秒************************************************************************//** Using Alternative Fill Characters */#include <iomanip>#include <iostream>#include <ostream>int main(){ using namespace std; int day(16); int month(5); int year(2014); int dollars(42); int cents(7); // Print date in USA order. Later in the book, you will learn how to // handle internationalization. //setfill()填充方式設定 cout << "Date: " << setfill(‘0‘) << setw(2) << month << ‘/‘ << setw(2) << day << ‘/‘ << setw(2) << year << ‘\n‘; cout << "Pay to the order of: CASH\n"; cout << "The amount of $" << setfill(‘*‘) << setw(8) << dollars << ‘.‘ << setfill(‘0‘) << setw(2) << cents << ‘\n‘; return 0;}
效果例如以下:
示範範例二:
/************************************************************************* > File Name: list0804_format_cout.cpp > Author: suool_hu > Mail: [email protected] > Created Time: 2014年05月16日 星期五 21時56分42秒 ************************************************************************/#include<iostream>#include<iomanip>#include<string>#include<ios>using namespace std;// 格式化輸出練習int main(){ cout << ‘|‘ << setfill(‘*‘) << setw(6) << 1234 << ‘|‘ << endl; cout << ‘|‘ << left << setw(6) << 1234 << ‘|‘ << endl; cout << ‘|‘ << setw(6) << 1234 << ‘|‘ << endl; cout << ‘|‘ << right << setw(6) << 1234 << ‘|‘ << endl; return 0;}
效果例如以下:
2.4數組和向量
如今我們要寫一個程式。要求實現:從標準輸入讀取數字,然後將數字排序後輸出,每行輸出一個。
有些人可能先想到的資料結構是用數組解決,只是。在C++中,數組是一種比較劣等的資料結構了,大多數時候我們都更傾向於使用C++的容器類型的資料結構。這個程式我們就能夠使用容器中的向量來解決,代碼例如以下:
/************************************************************************* > File Name: list0904_iterator_alg.cpp > Author: suool_hu > Mail: [email protected] > Created Time: 2014年05月18日 星期日 07時47分42秒 ************************************************************************/#include<algorithm>#include<iostream>#include<iterator>#include<string>#include<vector>using namespace std;// 適用迭代器和演算法讀入數字並排序(向量儲存)int main(){ cout << "請輸入數字:" << endl; vector<int> data; // 每次讀取一個數字 copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(data)); // 排序 sort(data.begin(), data.end()); cout << "您輸入的數位排序結果為:"<< endl; // 列印向量,一行一個數字 copy(data.begin(), data.end(), ostream_iterator<int>(cout, "\n"));}
關於向量:
類型:在角括弧內部的是向量的類型vector<int> data;是int類型的向量
初始化:vector沒有大小,能夠隨時擴充和縮小,沒有數組的長度大小的限制。可是在初始化的時候依舊能夠聲明其長度大小,如:
Vector<int> full_zero(10); // 預設以0初始化,這個含有10個0的向量Vector<int> full_ten(41, 10); // 包括41個10的向量。聲明以10初始化
Vector有非常多內建的方法,比方插入,刪除等等內建方法,詳細須要使用什麼方法請自行百度吧。
迭代器
上面的代碼中有一個調用的函數是sort,不要以為那個是vector的成員函數,那個事實上是C++ STL中的一個函數。能夠對全部傳遞給他的序列進行排序。僅僅要該類型能夠用比較操作符(即是大於或者小於),通過提供初始位置和末端位置。
關於上面的那個begin和end的位置。end是超出末端元素的下一個位置,例如以解:
Std::sort是泛型演算法的一個範例,之所以稱之為泛型,是由於這些函數實現了通用演算法而且具有一般性。
即是說。僅僅要可以表示成一個序列且資料可以比較。就能調用泛型演算法中函數。大部分在標頭檔<algorithm>中,一部分在<numeric>中。
差點兒全部的泛型都使用迭代器(唯一的例外是std::min & std::max,他們返回序列中最大最小值)。C++中總共同擁有五種迭代器。可是能夠分為兩類:讀迭代器和寫迭代器。
讀迭代器:指向值序列中的一個位置。使得能夠對該序列進行讀操作。
演算法對於輸入使用讀迭代器。且不改動值。一般而言,必須指定一對讀迭代器:開始位置和超出末端的下一個位置。
寫迭代器:指向序列中的一個位置。從該位置演算法開始寫輸出。
一般而言,僅僅須要指定輸出序列的位置就可以。
演算法不能檢查溢出,因此必須保證輸出序列有足夠的空間容納演算法要寫的全部內容。
Such as: std::copy( )演算法從一個輸入序列中複製值到一個輸出序列。函數有三個參數:兩個讀迭代器以指定範圍。一集一個寫迭代器指定輸出範圍的開始位置,因此必需要保證輸出有足夠大的容量。
C++基礎學習教程(一)