文章目錄
一、面向對象/過程
1. 面向過程過程
優點:
有效地將一個較複雜的程序系統設計任務分解成許多易於控制和處理的子任務,便於開發和維護
缺點:
- 可重用性差、數據安全性差、難以開發圖形界面的應用
- 把數據和處理數據的過程分離爲相互獨立的實體。
- 當數據結構改變時,所有相關的處理過程都要進行相應的修改。
- 每一種相對於老問題的新方法都要帶來額外的開銷。
- 圖形用戶界面的應用,很難用過程來描述和實現,開發和維護都很困難。
2. 面向對象編程
面向對象的基本概念
- 對象
- 抽象與分類
- 封裝
- 繼承
- 多態
優點:
- 程序模塊間的關係更爲簡單,程序模塊的獨立性、數據的安全性就有了良好的保障。
- 通過繼承與多態性,可以大大提高程序的可重用性,使得軟件的開發和維護都更爲方便。
二、C++語言基礎
1. 信息的存儲單位
2. 命名空間
若沒有using namespace std 則: cout << 改爲 std :: cout <<
3. 基本數據類型 + 字符串
C++的基本數據類型
- bool
- char(字符類型)
- int
- float
- double
注: 基本數據類型中沒有字符串類型(string)
一對 “ ”
括起來的字符序列表示 字符串(在末尾添加’\0’作爲結尾標記),
‘ '
括起來的表示 單個字符
字符串處理
C++基本數據類型中沒有字符串變量,存儲和處理方法有兩種如下:
-
用字符數組來存放字符串;(C風格字符串)
-
標準C++庫預定義 string 類
4. string 類詳解
string類是一個模板類,它的定義如下:
typedef basic_string<char> string
4.1 string類的初始化
• string s1("Hello");
//一個參數的構造函數,用Hello初始化
• sting s2(5,'x');
//兩個參數的構造函數,5代表x出現的次數
• string month = "March";
不提供以字符和整數爲參數的構造函數
string error1 = 'c';
//errorstring error2 = ('u');
//errorstring error3 = 22;
//errorstring error4(8);
//error
可以將字符賦值給string對象
string s;
s = 'n';
4.2 string 的賦值和連接
賦值
- 用 = 賦值
string s1("cat"), s2;
s2 = s1;
- 用
assign
成員函數複製
string s1("cat"),s2;
s2.assign(s1); //s1賦值給s2
- 用assign成員函數部分複製
string s1("cat"),s2;
s2.assign(s1,1,3); //從s1的下標爲1的字符開始複製3個字符給s2
- 單個字符複製
s2[4] = s1[3];
- 使用
at
成員函數逐個訪問 string 對象中的字符
string s1 = "hello";
for(int i = 0; i<s1.length();i++)
cout<< s1.at(i) <<endl;
注:成員函數at會做下標範圍檢查,若果超出範圍會拋出out_of_range異常,而下標運算符不做範圍檢查
連接
- 用 + 連接字符串
string s1("good"),s2("morning!");
s1 += s2;
cout<<s1;
- 用成員函數
append
連接
s1.append(s2);
s2.append(s1,3,s1.size());
//s1.size() s1的字符數
//從s1的下標3開始,連接s1.size()個的字符
//若字符串內沒有足夠字符,則複製到s1的末尾就停止
4.3 常用方法
長度 length() / size()
構造的string太長無法表達 -> 會拋出 length error 異常
s.length() / s.size()
子串 substr()
成員函數 substr()
s2 = s1.substr(3,2); //下標3開始2個字符
尋找字符 find()
- 成員函數
find()
s1.find("lo");
//從s1中從前往後找lo第一次出現的位置,返回l所在的位置下標
//若沒有找到,返回string::npos(string中定義的靜態常量)
s1.rfind("lo");
//從後往前查找,返回l的位置
s1.find("a",2); //從下標2開始查找“a"
-
成員函數
find_first_of()
查找字符第一次出現的下標 -
成員函數
find_last_of()
查找字符最後一次出現的地方
消除 erase()
s1.erase(3); //返回 消除下標3及以後的字符串
替換 replace()
s1.replace(2,3,"hala",1,2);
//將s1中下標從2開始的3個字符 替換成 "hala"中從下標1開始的2個字符
插入 insert()
s1.insert(4,s2); //將s2插入s1下標爲4的位置
s1. insert(2,s2,5,3) //將s2中下標5開始的3個字符插入s1下標爲2的位置
轉換成C語言形式char*字符串 c_str()
s1.c_str();
//返回傳統的const char*類型字符串
//且該字符串以'\0'結尾
5. 運算
此處就不詳細解釋了,就挑出了一些容易混淆的地方
當 / 用於兩個整型數據相除時,其結果取商的整數部分,小數部分被自動捨棄。
int a = 1/2 ----> a = 0;
逗號運算
a=3*5, a*4;
---->結果爲第二個表達式的值60
邏輯運算
&& 和 || 具有短路特性。
-
對於&&,如果第一個表達式爲false,則不再對第二個表達式求值;
(因爲無論第二個表達式爲多少最後結果都爲false) -
對於||,如果第一個表達式爲true,則不再對第二個表達式求值;
(a==b) || (++c == 1) 這個表達式中c的自增只有在a!=b的時候纔會執行
位運算
sizeof 運算
6. 類型轉換
隱含類型轉換
賦值運算要求左值與右值的類型相同,若類型不同,編譯系統會自動將右值轉換爲左值的類型。
ex:
float fval;
double dval;
unsigned long ulval;
dval = ulval + fval; //ulval被轉換爲float類型,加法運算的最終結果被轉化爲double
顯示類型轉換
float z;
強制類型轉換int(z)只是將float類型變量z臨時取出來轉換爲int型,
這時變量z所在的內存單元中的值並未真正改變。
三、算法的基本控制結構
- if語句 (選擇結構)
- switch語句(選擇結構)
- while語句(循環結構)
- do while語句(循環結構)
- for語句(循環結構)
- 其他控制語句
四、enum 枚舉類型
語法形式: enum 枚舉類型名 {變量值列表};
例:enum Weekday {SUN, MON, TUE, WED, THU, FRI, SAT};
默認情況下 SUN=0,MON=1,TUE=2,…,SAT=6
ex: 口袋中有紅、黃、藍、白、黑五種顏色的球若干個。每次從口袋中取出3個不同顏色的球,問有多少種取法。
分析: 由於球只能是五種顏色之一,故可用枚舉類型表示球的顏色。
設取出的球爲 i、j、k,根據題意,i、j、k分別可以有五種取值,且i≠j≠k。
可以用窮舉法,逐個檢驗每一種可能的組合,從中找出符合要求的組合並輸出。
int main()
{
enum color{red,yellow,blue,white,black};
color pri; //enum color pri;
int n = 0; //一共有多少種情況
for (int i = red; i <= black; i++)
for (int j = red; j <= black; j++)
if (i != j)
{ //前兩個球顏色不同
for (int k = red; k <= black; k++)
if (k != i && k != j)
{
n = n + 1;
cout.width(4);
cout << n;
//以下代碼爲輸出所有組合,解題核心是上面的三層嵌套循環
for (int loop = 1; loop <= 3; loop++)
{
switch (loop)
{
case 1:
pri = color(i); // (enum color) i
break;
case 2:
pri = color(j);
break;
case 3:
pri = color(k);
break;
default:
break;
}
switch (pri)
{
case red:
cout << " red";
break;
case yellow:
cout << " yellow";
break;
case blue:
cout << " blue";
break;
case white:
cout << " white";
break;
case black:
cout << " black";
break;
default:
break;
}
}
cout << endl;
}
}
cout << n;
return 0;
}
👉 👉 👉 原文首發 - 小牛肉的個人博客,歡迎來訪~👈 👈 👈