Set trong C++

Tổng quan

  • Set là một loại associative containers để lưu trữ các phần tử không bị trùng lặp (unique elements), và các phần tử này chính là các khóa (keys).
  • Khi duyệt set theo iterator từ begin đến end, các phần tử của set sẽ tăng dần theo phép toán so sánh.
  • Mặc định của set là sử dụng phép toán less, bạn cũng có thể viết lại hàm so sánh theo ý mình.
  • Set được thực hiện giống như cây tìm kiếm nhị phân (Binary search tree).

Khai báo:

#include <set>
set <int> s;
set <int, greater<int> > s;
Hoặc viết class so sánh theo ý mình:
struct cmp{
bool operator() (int a,int b) {return a<b;}
};
set <int,cmp > myset ;

Capacity:

  • size : trả về kích thước hiện tại của set. ĐPT O(1)
  • empty : true nếu set rỗng, và ngược lại. ĐPT O(1).

Thay đổi:

  • insert : Chèn phần tử vào set. ĐPT O(logN).
  • erase : có 2 kiểu xóa: xóa theo iterator, hoặc là xóa theo khóa. ĐPT O(logN).
  • clear : xóa tất cả set. ĐPT O(n).
  • swap : đổi 2 set cho nhau. ĐPT O(n).

Truy cập phần tử:

  • find : trả về itarator trỏ đến phần tử cần tìm kiếm. Nếu không tìm thấy itarator trỏ về “end” của set. ĐPT O(logN).
  • lower_bound : trả về iterator đến vị trí phần tử bé nhất mà không bé hơn (lớn hơn hoặc bằng) khóa (dĩ nhiên là theo phép so sánh), nếu không tìm thấy trả về vị trí “end” của set. ĐPT O(logN).
  • upper_bound: trả về iterator đến vị trí phần tử bé nhất mà lớn hơn khóa, nếu không tìm thấy trả về vị trí “end” của set.. ĐPT O(logN).
  • count : trả về số lần xuất hiện của khóa trong container. Nhưng trong set, các phần tử chỉ xuất hiện một lần, nên hàm này có ý nghĩa là sẽ return 1 nếu khóa có trong container, và 0 nếu không có. ĐPT O(logN).

 

Chương trình Demo 1:

#include <iostream>
#include <set>
using namespace std;
main() {
      set <int> s;
      set <int> ::iterator it; s.insert(9);  // s={9}
      s.insert(5);  // s={5,9} cout << *s.begin() << endl; //In ra 5 s.insert(1);  // s={1,5,9} cout << *s.begin() << endl; // In ra 1

      it=s.find(5);
      if (it==s.end()) cout << "Khong co trong container" << endl; else  cout << "Co trong container" << endl;

      s.erase(it);  // s={1,9}
      s.erase(1);  // s={9}

      s.insert(3);  // s={3,9}
      s.insert(4);  // s={3,4,9}

      it=s.lower_bound(4);
      if (it==s.end()) cout << "Khong co phan tu nao trong set khong be hon 4" << endl; else cout << "Phan tu be nhat khong be hon 4 la " << *it << endl;  // In ra 4

      it=s.lower_bound(10);
      if (it==s.end()) cout << "Khong co phan tu nao trong set khong be hon 10" << endl; else cout << "Phan tu be nhat khong be hon 10 la " << *it << endl; // Khong co ptu nao

      it=s.upper_bound(4);
      if (it==s.end()) cout << "Khong co phan tu nao trong set lon hon 4" << endl; else cout << "Phan tu be nhat lon hon 4 la " << *it << endl;  // In ra 9

      /* Duyet set */

      for (it=s.begin();it!=s.end();it++) { cout << *it <<  " ";
      }
      // In ra 3 4 9

      cout << endl; system("pause");
}

Lưu ý: Nếu bạn muốn sử dụng hàm lower_bound hay upper_bound để tìm phần tử lớn nhất “bé hơn hoặc bằng” hoặc “bé hơn” bạn có thể thay đổi cách so sánh của set để tìm kiếm. Mời bạn xem chương trình sau để rõ hơn:

#include <iostream>
#include <set>
#include <vector> using namespace std;
main() {
      set <int, greater <int> > s;
      set <int, greater <int> > :: iterator it; // Phép toán so sánh là greater

      s.insert(1);  // s={1}
      s.insert(2);  // s={2,1}
      s.insert(4);  // s={4,2,1}
      s.insert(9);  // s={9,4,2,1}

      /* Tim phần tử lớn nhất bé hơn hoặc bằng 5 */ it=s.lower_bound(5);
      cout << *it << endl;  // In ra 4

      /* Tim phần tử lớn nhất bé hơn 4 */ it=s.upper_bound(4);
      cout << *it << endl;  // In ra 2

      system("pause");
}

Vector trong C++

Khai báo vector:

Vector có thể hiểu là một mảng có trình tự, giống như với danh sách liên kết hay một chuỗi thông thường nhưng “vector” khác với chuỗi hoăc mảng thông thường là chúng ta có thể thay đổi kích thước của nó và cũng có thể truy cập trực tiếp đến các phần tử, điều này làm cho việc sử dụng “vector” linh hoạt hơn so với “list”…

#include <vector>
...
/* Vector 1 chiều */

/* tạo vector rỗng kiểu dữ liệu int */ vector <int> first;

//tạo vector với 4 phần tử là 100 vector <int> second (4,100);

// lấy từ đầu đến cuối vector second
vector <int> third (second.begin(),second.end())

//copy từ vector third vector <int> four (third)

/*Vector 2 chiều*/

/* Tạo vector 2 chiều rỗng */ vector < vector <int> > v;

/* khai báo vector 5×10 */
vector < vector <int> > v (5, 10) ;

/* khai báo 5 vector 1 chiều rỗng  */ vector < vector <int> > v (5) ;

//khai báo vector 5*10 với các phần tử khởi tạo giá trị là 1 vector < vector <int> > v (5, vector <int> (10,1) ) ;
Các bạn chú ý 2 dấu “ngoặc” không được viết liền nhau. Ví dụ như sau là sai:
/*Khai báo vector 2 chiều SAI*/
vector <vector <int>> v;

Các hàm thành viên:

  • size : trả về số lượng phần tử của vector. ĐPT O(1).
  • empty : trả về true(1) nếu vector rỗng, ngược lại là false(0). ĐPT O(1).

 

Truy cập tới phần tử:

  • operator [] : trả về giá trị phần tử thứ []. ĐPT O(1).
  • at : tương tự như trên. ĐPT O(1).
  • front: trả về giá trị phần tử đầu tiên. ĐPT O(1).
  • back: trả về giá trị phần tử cuối cùng. ĐPT O(1).

 

Chỉnh sửa:

  • push_back : thêm vào ở cuối vector. ĐPT O(1).
  • pop_back : loại bỏ phần tử ở cuối vector. ĐPT O(1).
  • insert (iterator,x): chèn “x” vào trước vị trí “iterator” ( x có thể là phần tử hay iterator của 1 đoạn phần tử…). ĐPT O(n).
  • erase : xóa phần tử ở vị trí iterator. ĐPT O(n).
  • swap : đổi 2 vector cho nhau (ví dụ: first.swap(second);). ĐPT O(1).
  • clear: xóa vector. ĐPT O(n).

 

Nhận xét:

  • Sử dụng vector sẽ tốt khi:
    • Truy cập đến phần tử riêng lẻ thông qua vị trí của nó O(1)
    • Chèn hay xóa ở vị trí cuối cùng O(1).
  • Vector làm việc giống như một “mảng động”.

 

Một vài ví dụ:

Ví dụ 1: Ví dụ này chủ yếu để làm quen sử dụng các hàm chứ không có đề bài cụ thể.

#include <iostream>
#include <vector>
using namespace std;
vector <int> v; //Khai báo vector
vector <int>::iterator it;  //Khai báo iterator
vector <int>::reverse_iterator rit; //Khai báo iterator ngược int i;
main() {
      for (i=1;i<=5;i++) v.push_back(i); // v={1,2,3,4,5} cout << v.front() << endl;  // In ra 1
      cout << v.back() << endl;  // In ra 5

      cout << v.size() << endl;  // In ra 5

      v.push_back(9);  // v={1,2,3,4,5,9}
      cout << v.size() << endl;  // In ra 6

      v.clear();  // v={}
      cout << v.empty() << endl;  // In ra 1 (vector rỗng)

      for (i=1;i<=5;i++) v.push_back(i); // v={1,2,3,4,5} v.pop_back();  // v={1,2,3,4}
      cout << v.size() << endl;  // In ra 4

      v.erase(v.begin()+1);  // Xóa ptử thứ 1 v={1,3,4} v.erase(v.begin(),v.begin()+2);  // v={4}
      v.insert(v.begin(),100);  // v={100,4}
      v.insert(v.end(),5);  // v={100,4,5}

      /*Duyệt theo chỉ số phần tử*/
      for (i=0;i<v.size();i++) cout << v[i] << " "; // 100 4 5 cout << endl;

      /*Chú ý: Không nên viết
      for (i=0;i<=v.size()-1;i++) ...
      Vì nếu vector v rỗng thì sẽ dẫn đến sai khi duyệt !!!
      */

      /*Duyệt theo iterator*/
      for (it=v.begin();it!=v.end();it++) cout << *it << " " ;
      //In ra giá trị ma iterator đang trỏ tới "100 4 5" cout << endl;

      /*Duyệt iterator ngược*/
      for (rit=v.rbegin();rit!=v.rend();rit++) cout << *rit << " "; // 5 4 100
      cout << endl;

      system("pause");
}
Ví dụ 2: Cho đồ thị vô hướng G có n đỉnh (các đỉnh đánh số từ 1 đến n) và m cạnh và không có khuyên (đường đi từ 1 đỉnh tới chính đỉnh đó).

Cài đặt đồ thị bằng danh sách kề và in ra các cạnh kề đối với mỗi cạnh của đồ thị. Dữ liệu vào:

  • Dòng đầu chứa n và m cách nhau bởi dấu cách
  • M dòng sau, mỗi dòng chứa u và v cho biết có đường đi từ u tới Không có cặp đỉnh u,v nào chỉ cùng 1 đường đi.

Dữ liệu ra:

  • M dòng: Dòng thứ i chứa các đỉnh kề cạnh i theo thứ tự tăng dần và cách nhau bởi dấu cách.

Giới hạn: 1 <= n,m <= 10000 Ví dụ:

INPUT OUTPUT
6 7 2 3 5 6
1 2 1 3 6
1 3 1 2 5
1 5  
2 3 1 3
2 6 1 2
3 5  
6 1  

 

Chương trình mẫu:

#include <iostream>
#include <vector> using namespace std;
vector < vector <int> > a (10001);

//Khai báo vector 2 chiều với 10001 vector 1 chiều rỗng int m,n,i,j,u,v;
main() {
      /*Input data*/ cin >> n >> m;
      for (i=1;i<=m;i++) { cin >> u >> v; a[u].push_back(v);
      a[v].push_back(u);
      }
      /*Sort cạnh kề*/ for (i=1;i<=m;i++)
      sort(a[i].begin(),a[i].end());
      /*Print Result*/
      for (i=1;i<=m;i++) {
      for (j=0;j<a[i].size();j++) cout << a[i][j] << " "; cout << endl;
      }
      system("pause");
}

Toán tử trong C++

Trong bài ta sẽ cùng tìm hiểu các vấn đề:

  • Toán tử quan hệ trong C++
  • Toán tử logic trong C++
  • Toán tử trên bit trong C++
  • Các toán tử hỗn hợp trong C++
  • Độ ưu tiên toán tử trong C++

Toán tử quan hệ trong C++ (Relational operators)

Toán tử quan hệ dùng để so sánh 2 toán hạng với nhau. Sẽ trả về 2 giá trị là 1 (true) hoặc 0 (false).

Bảng bên dưới mô tả các toán tử quan hệ trong C++, giả sử x = 6, y = 9:

Operator Symbol Form Operation Example
Greater than > x > y true if x is greater than y, false otherwise (x > y) is false
Less than < x < y true if x is less than y, false otherwise (x < y) is true
Greater than or equals >= x >= y true if x is greater than or equal to y, false otherwise (x >= y) is false
Less than or equals <= x <= y true if x is less than or equal to y, false otherwise (x <= y) is true
Equality == x == y true if x equals y, false otherwise (x == y) is false
Inequality != x != y true if x does not equal y, false otherwise (x != y) is true

Chú ý: Phân biệt toán tử gán bằng (=) và toán tử so sánh bằng (==).

Ví dụ:

<span class="hljs-preprocessor">#include &lt;iostream&gt;</span> <span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> <span class="hljs-built_in">std</span>; <span class="hljs-keyword">int</span> sum(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b) { <span class="hljs-keyword">return</span> a + b; } <span class="hljs-keyword">int</span> main() { <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"Enter an integer: "</span>; <span class="hljs-keyword">int</span> x; <span class="hljs-built_in">cin</span> &gt;&gt; x; <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"Enter another integer: "</span>; <span class="hljs-keyword">int</span> y; <span class="hljs-built_in">cin</span> &gt;&gt; y; <span class="hljs-keyword">if</span> (x == y) <span class="hljs-built_in">cout</span> &lt;&lt; x &lt;&lt; <span class="hljs-string">" == "</span> &lt;&lt; y &lt;&lt; <span class="hljs-string">"\n"</span>; <span class="hljs-keyword">if</span> (x != y) <span class="hljs-built_in">cout</span> &lt;&lt; x &lt;&lt; <span class="hljs-string">" != "</span> &lt;&lt; y &lt;&lt; <span class="hljs-string">"\n"</span>; <span class="hljs-keyword">if</span> (x &gt; y) <span class="hljs-built_in">cout</span> &lt;&lt; x &lt;&lt; <span class="hljs-string">" &gt; "</span> &lt;&lt; y &lt;&lt; <span class="hljs-string">"\n"</span>; <span class="hljs-keyword">if</span> (x &lt; y) <span class="hljs-built_in">cout</span> &lt;&lt; x &lt;&lt; <span class="hljs-string">" &lt; "</span> &lt;&lt; y &lt;&lt; <span class="hljs-string">"\n"</span>; <span class="hljs-keyword">if</span> (x &gt;= y) <span class="hljs-built_in">cout</span> &lt;&lt; x &lt;&lt; <span class="hljs-string">" &gt;= "</span> &lt;&lt; y &lt;&lt; <span class="hljs-string">"\n"</span>; <span class="hljs-keyword">if</span> (x &lt;= y) <span class="hljs-built_in">cout</span> &lt;&lt; x &lt;&lt; <span class="hljs-string">" &lt;= "</span> &lt;&lt; y &lt;&lt; <span class="hljs-string">"\n"</span>; <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>; }
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

Outputs:

Operators

 

Toán tử quan hệ và so sánh số chấm động?

Trong lập trình, việc so sánh trực tiếp 2 số chấm động là điều không nên và có thể cho ra những kết quả không mong muốn. Đó là do lỗi làm tròn của số chấm động, vấn đề này đã được giải thích trong bài Số tự nhiên và Số chấm động trong C++ (Integer, Floating point).

Ví dụ:

<span class="hljs-preprocessor">#include &lt;iostream&gt;</span> <span class="hljs-preprocessor">#include &lt;iomanip&gt; <span class="hljs-comment">// for std::setprecision()</span></span> <span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> <span class="hljs-built_in">std</span>; <span class="hljs-keyword">int</span> main() { <span class="hljs-keyword">double</span> d1{ <span class="hljs-number">1.0</span> }; <span class="hljs-keyword">double</span> d2{ <span class="hljs-number">0.1</span> + <span class="hljs-number">0.1</span> + <span class="hljs-number">0.1</span> + <span class="hljs-number">0.1</span> + <span class="hljs-number">0.1</span> + <span class="hljs-number">0.1</span> + <span class="hljs-number">0.1</span> + <span class="hljs-number">0.1</span> + <span class="hljs-number">0.1</span> + <span class="hljs-number">0.1</span> }; <span class="hljs-keyword">if</span> (d1 == d2) <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"d1 == d2"</span> &lt;&lt; <span class="hljs-string">"\n"</span>; <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (d1 &gt; d2) <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"d1 &gt; d2"</span> &lt;&lt; <span class="hljs-string">"\n"</span>; <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (d1 &lt; d2) <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"d1 &lt; d2"</span> &lt;&lt; <span class="hljs-string">"\n"</span>; <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-built_in">std</span>::setprecision(<span class="hljs-number">20</span>); <span class="hljs-comment">// show 20 digits</span> <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"d1 = "</span> &lt;&lt; d1 &lt;&lt; endl; <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"d2 = "</span> &lt;&lt; d2 &lt;&lt; endl; <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>; }
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Outputs:

Operators

 

Trong chương trình trên, trong toán học thì 2 biến d1 == d2, nhưng trong lập trình biến d1 > d2 vì lỗi làm tròn số dấu chấm động.

Tương tự, bạn hãy thử với trường hợp 0.1 + 0.7 == 0.8 ?

Chú ý: Không bao giờ so sánh hai giá trị dấu chấm động bằng nhau hay không. Hầu như luôn luôn có sự khác biệt nhỏ giữa hai số chấm động. Cách phổ biến để so sánh 2 số chấm động là tính khoảng cách giữa 2 số đó, nếu khoảng cách đó là rất nhỏ thì ta cho là bằng nhau. Giá trị dùng để so sánh với khoảng cách đó thường được gọi là epsilon.

Toán tử logic trong C++ (Logical operators)

Nếu chỉ sử dụng toán tử quan hệ để so sánh biểu thức quan hệ đúng hay sai, bạn chỉ có thể kiểm tra một điều kiện tại một thời điểm. Nhưng thực tế, có lúc bạn sẽ cần kiểm tra nhiều điều kiện cùng lúc.

Ví dụ: để trở thành một soái ca thì bạn phải có nhiều điều kiện như cầm, kỳ, thi, họa. Lúc này không chỉ đơn giản 1 điều kiện nữa.

Toán tử logic (Logical operators) sẽ kiểm tra nhiều điều kiện cùng lúc giúp bạn. Có 3 toán tử logic trong C++:

Operator Symbol Form Operation
Logical NOT ! !x true if x is false, or false if x is true
Logical AND && x && y true if both x and y are true, false otherwise
Logical OR || x || y true if either x or y are true, false otherwise

Chú ý: Luôn sử dụng dấu ngoặc đơn () khi thực hiện với các mệnh đề quan hệ để thể hiện rõ ràng ý nghĩa dòng lệnh và hạn chế sai sót. Với cách này, bạn thậm chí không cần nhớ nhiều về độ ưu tiên toán tử.

Ví dụ:

<span class="hljs-preprocessor">#include &lt;iostream&gt;</span> <span class="hljs-preprocessor">#include &lt;iomanip&gt; <span class="hljs-comment">// for std::setprecision()</span></span> <span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> <span class="hljs-built_in">std</span>; <span class="hljs-keyword">int</span> main() { <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"Enter a number: "</span>; <span class="hljs-keyword">int</span> value; <span class="hljs-built_in">cin</span> &gt;&gt; value; <span class="hljs-keyword">if</span> (!value) <span class="hljs-built_in">cout</span> &lt;&lt; value &lt;&lt; <span class="hljs-string">" is false"</span> &lt;&lt; endl; <span class="hljs-keyword">else</span> <span class="hljs-built_in">cout</span> &lt;&lt; value &lt;&lt; <span class="hljs-string">" is true"</span> &lt;&lt; endl; <span class="hljs-keyword">if</span> ((value &gt; <span class="hljs-number">1</span>) &amp;&amp; (value &lt; <span class="hljs-number">100</span>)) <span class="hljs-built_in">cout</span> &lt;&lt; value &lt;&lt; <span class="hljs-string">" is between 1 and 100"</span> &lt;&lt; endl; <span class="hljs-keyword">else</span> <span class="hljs-built_in">cout</span> &lt;&lt; value &lt;&lt; <span class="hljs-string">" is not between 1 and 100"</span> &lt;&lt; endl; <span class="hljs-keyword">if</span> ((value == <span class="hljs-number">1</span>) || (value == <span class="hljs-number">100</span>)) <span class="hljs-built_in">cout</span> &lt;&lt; value &lt;&lt; <span class="hljs-string">" == 1 or "</span>&lt;&lt; value &lt;&lt;<span class="hljs-string">" == 100"</span> &lt;&lt; endl; <span class="hljs-keyword">else</span> <span class="hljs-built_in">cout</span> &lt;&lt; value &lt;&lt; <span class="hljs-string">" != 1 or "</span> &lt;&lt; value &lt;&lt; <span class="hljs-string">" != 100"</span> &lt;&lt; endl; <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>; }
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

Outputs:

Operators

 

Toán tử trên bit trong C++ (Bitwise operators)

Toán tử trên bit dùng để thao tác với các bit trên một biến.

Tại sao cần thao tác trên bit? Trong quá khứ, bộ nhớ máy tính chưa phát triển, vấn đề về quản lý bộ nhớ là rất quan trọng. Vì vậy, người lập trình cần tận dụng tối đa các bit trong bộ nhớ.

Ví dụ: Các biến được lưu trong bộ nhớ ở một địa chỉ duy nhất, những địa chỉ này được xác định với đơn vị nhỏ nhất là byte. Xét kiểu dữ liệu bool, nó chỉ nắm giữ 2 giá trị true (1) hoặc false (0). Kiểu bool chỉ cần 1 bit để lưu trữ dữ liệu, nhưng nó lại chiếm giữ 1 byte trong bộ nhớ, vậy 7 bit còn lại sẽ là lãng phí. Sử dụng toán tử trên bit giúp bạn có thể chứa 8 biến kiểu bool vào 1 byte duy nhất, và tiết kiệm bộ nhớ đáng kể.

Trong quá khứ, sử dụng toán tử trên bit rất được ưu chuộng. Ngày nay, bộ nhớ máy tính đã phát triển và rẻ hơn, lập trình viên thường quan tâm đến tính dễ hiểu và dễ nâng cấp của mã nguồn. Do đó, việc thao tác trên bit không còn được ưu chuộng, ngoại trừ những trường hợp cần tối ưu tối đa tốc độ, bộ nhớ (những chương trình thao tác big data, những game lớn, lập trình nhúng …).

Vì các toán tử trên bit ít gặp nên mình chỉ giới thiệu qua cho các bạn tham khảo, bạn có thể tự tìm hiểu thêm nếu muốn chuyên sâu hơn.

Bảng bên dưới gồm 6 toán tử thao tác trên bit:

Operator Symbol Form Operation
left shift << x << y all bits in x shifted left y bits
right shift >> x >> y all bits in x shifted right y bits
bitwise NOT ~ ~x all bits in x flipped
bitwise AND & x & y each bit in x AND each bit in y
bitwise OR | x | y each bit in x OR each bit in y
bitwise XOR ^ x ^ y each bit in x XOR each bit in y

Bảng bên dưới gồm 5 toán tử gán trên bit:

Operator Symbol Form Operation
Left shift assignment <<= x <<= y Shift x left by y bits
Right shift assignment >>= x >>= y Shift x right by y bits
Bitwise OR assignment |= x |= y Assign x | y to x
Bitwise AND assignment &= x &= y Assign x & y to x
Bitwise XOR assignment ^= x ^= y Assign x ^ y to x

Các toán tử hỗn hợp trong C++ (Misc Operators)

Sizeof operator

Operator Symbol Form Operation
Sizeof sizeof sizeof(type)
sizeof(variable)
Returns size of type or variable in bytes

Để xác định kích thước của một kiểu dữ liệu trên một máy tính cụ thể, C++ cung cấp cho bạn toán tử sizeof. Toán tử sizeof là toán tử một ngôi, nhận vào một kiểu dữ liệu hoặc một biến, và trả về kích thước (byte) của kiểu dữ liệu hoặc biến đó. Toán tử này sizeof đã được giải thích chi tiết trong bài Số tự nhiên và Số chấm động trong C++ (Integer, Floating point).

Comma operator

Operator Symbol Form Operation
Comma , x, y Evaluate x then y, returns value of y

Các biểu thức đặt cách nhau bằng dấu phẩy (,), các biểu thức con lần lượt được tính từ trái

sang phải. Biểu thức mới nhận được là giá trị của biểu thức bên phải cùng.

Ví dụ:

x = (a++, b = b + <span class="hljs-number">2</span>); <span class="hljs-comment">// Tương đương với</span> a++; b = b + <span class="hljs-number">2</span>; x = b;
0
1
2
3

hoặc

<span class="hljs-keyword">int</span> x = <span class="hljs-number">0</span>; <span class="hljs-keyword">int</span> y = <span class="hljs-number">2</span>; <span class="hljs-keyword">int</span> z = (++x, ++y); <span class="hljs-comment">// increment x and y</span> <span class="hljs-comment">// Tương đương với</span> <span class="hljs-keyword">int</span> x = <span class="hljs-number">0</span>; <span class="hljs-keyword">int</span> y = <span class="hljs-number">2</span>; ++x; ++y; <span class="hljs-keyword">int</span> z = y;
0
1
2
3
4
5
6
7
8
9
10

Chú ý: Dấu phẩy có ưu tiên thấp nhất trong tất cả các toán tử.

Vì vậy, hai dòng code sau đây sẽ cho kết quả khác nhau:

z = (a, b); <span class="hljs-comment">// z = b</span> z = a, b;   <span class="hljs-comment">// z = a, và b bị bỏ qua</span>
0
1

Chú ý: Tránh sử dụng các toán tử dấu phẩy (,), ngoại trừ trường hợp dùng trong vòng lặp. Vấn đề về vòng lặp sẽ được hướng dẫn chi tiết trong bài Vòng lặp For trong C++ (For statements).

Conditional operator

Operator Symbol Form Operation
Conditional ?: c ? x : y If c is nonzero (true) then evaluate x, otherwise evaluate y

Toán tử điều kiện ( ?: ) là toán tử 3 ngôi duy nhất trong C++ (có 3 toán hạng), tương đương với câu điều kiện ( if/else statements ).

Cấu trúc câu điều kiện if/else:

<span class="hljs-keyword">if</span> (condition)     <span class="hljs-comment">// nếu condition là true</span>      expression1;  <span class="hljs-comment">// thực thi câu lệnh này</span> <span class="hljs-keyword">else</span>      expression2;  <span class="hljs-comment">// nếu condition là false, thực thi câu lệnh này</span>
0
1
2
3

Hoặc :

<span class="hljs-keyword">if</span> (condition)     <span class="hljs-comment">// nếu condition là true</span>      x = value1;   <span class="hljs-comment">// x = value 1</span> <span class="hljs-keyword">else</span>      x = value2;   <span class="hljs-comment">// nếu condition là false, x = value 2</span>
0
1
2
3

Viết lại dưới dạng toán tử điều kiện ( ?: ):

(condition) ? expression1 : expression2;
0

Hoặc:

x = (condition) ? value1 : value2;
0

Ví dụ:

<span class="hljs-preprocessor">#include &lt;iostream&gt;</span> <span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> <span class="hljs-built_in">std</span>; <span class="hljs-keyword">int</span> main() { <span class="hljs-keyword">int</span> x{ <span class="hljs-number">6</span> }, y{ <span class="hljs-number">9</span> }, max; <span class="hljs-keyword">if</span> (x &gt; y) { max = x; } <span class="hljs-keyword">else</span> { max = y; } <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"Max = "</span> &lt;&lt; max &lt;&lt; endl; <span class="hljs-comment">// Tương đương với</span> max = (x &gt; y) ? x : y; <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"Max = "</span> &lt;&lt; max &lt;&lt; endl; <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>; }
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Outputs:

Operators

Chú ý: Chỉ sử dụng toán tử điều kiện với những câu điều kiện đơn giản.

Ví dụ:

<span class="hljs-preprocessor">#include &lt;iostream&gt;</span> <span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> <span class="hljs-built_in">std</span>; <span class="hljs-keyword">int</span> main() { <span class="hljs-keyword">int</span> a{ <span class="hljs-number">3</span> }, b{ <span class="hljs-number">2</span> }, c{ <span class="hljs-number">4</span> }, max; <span class="hljs-comment">// Khó hiểu, dễ sai =&gt; Không nên</span> max = a &gt; b ? (a &gt; c ? a : c) : (b &gt; c ? b : c); <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"Max = "</span> &lt;&lt; max &lt;&lt; endl; <span class="hljs-comment">// Dễ hiểu =&gt; Nên</span> max = a; <span class="hljs-keyword">if</span> (max &lt; b) { max = b; } <span class="hljs-keyword">if</span> (max &lt; c) { max = c; } <span class="hljs-built_in">cout</span> &lt;&lt; <span class="hljs-string">"Max = "</span> &lt;&lt; max &lt;&lt; endl; <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>; }
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Outputs:

Operators

Chú ý: Toán tử điều kiện ( ?: ) có thể là một biểu thức (expression), trong khi câu điều kiện ( if/else ) chỉ là một câu lệnh (statements).

Ví dụ:

<span class="hljs-keyword">bool</span> bIsVip = <span class="hljs-keyword">true</span>; <span class="hljs-comment">// Initializing a const variable</span> <span class="hljs-keyword">const</span> <span class="hljs-keyword">double</span> dPrice = bIsVip ? <span class="hljs-number">1000</span> : <span class="hljs-number">500</span>;
0
1
2
3

Trong ví dụ trên, không thể dùng câu điều kiện ( if/else ) để thay thế. Vì một hằng số phải được khởi tạo giá trị tại thời điểm khai báo.

Một số toán tử khác

Operator Description
. (dot) and -> (arrow) Member operators are used to reference individual members of classes, structures, and unions.
Cast Casting operators convert one data type to another. For example, int(2.2000) would return 2.
& Pointer operator & returns the address of an variable. For example &a; will give actual address of the variable.
* Pointer operator * is pointer to a variable. For example *var; will pointer to a variable var.

Độ ưu tiên và quy tắc kết hợp toán tử trong C++

Để đánh giá đúng một biểu thức như 6 + 9 * 8, bạn cần hiểu rõ ý nghĩa mỗi toán tử trong biểu thức đó, và thứ tự thực hiện của nó. Thứ tự thực hiện của các toán tử trong 1 biểu thức gọi là độ ưu tiên của toán tử (operator precedence).

Khi áp dụng độ ưu tiên toán tử, biểu thức bên trên sẽ tương đương với 6 + ( 9 * 8 ) = 78. Phép nhân (*) có độ ưu tiên cao hơn phép cộng (+), compiler sẽ tự động hiểu và thực hiện đúng theo độ ưu tiên của từng toán tử.

Khi 2 toán tử có cùng độ ưu tiên trong 1 biểu thức, các quy tắc kết hợp (associativity rules) sẽ nói cho compiler biết nên thực hiện từ trái sang phải (L->R) hay từ phải sang trái (R->L).

Ví dụ: bạn có biểu thức 6 * 9 / 8. Trong biểu thức này, phép nhân (*) và chia (/) cùng độ ưu tiên, nhưng nó có quy tắc kết hợp từ trái sang phải (L->R). Vì vậy nó sẽ tương đương (6 * 9) / 8.

Bảng độ ưu tiên (operator precedence) và quy tắc kết hợp (associativity rules) các toán tử trong C++:

Prec/Ass Operator Description Pattern
1 None ::
::
Global scope (unary)
Class scope (binary)
::name
class_name::member_name
2 L->R ()
()
()
{}
type()
type{}
[] .
->
++
––
typeid
const_cast
dynamic_cast
reinterpret_cast
static_cast
Parentheses
Function call
Initialization
Uniform initialization (C++11)
Functional cast
Functional cast (C++11)
Array subscript
Member access from object
Member access from object ptr
Post-increment
Post-decrement
Run-time type information
Cast away const
Run-time type-checked cast
Cast one type to another
Compile-time type-checked cast
(expression)
function_name(parameters)
type name(expression)
type name{expression}
new_type(expression)
new_type{expression}
pointer[expression] object.member_name
object_pointer->member_name
lvalue++
lvalue––
typeid(type) or typeid(expression)
const_cast<type>(expression)
dynamic_cast<type>(expression)
reinterpret_cast<type>(expression)
static_cast<type>(expression)
3 R->L +

++
––
!
~
(type)
sizeof
&
*
new
new[] delete
delete[]
Unary plus
Unary minus
Pre-increment
Pre-decrement
Logical NOT
Bitwise NOT
C-style cast
Size in bytes
Address of
Dereference
Dynamic memory allocation
Dynamic array allocation
Dynamic memory deletion
Dynamic array deletion
+expression
-expression
++lvalue
––lvalue
!expression
~expression
(new_type)expression
sizeof(type) or sizeof(expression)
&lvalue
*expression
new type
new type[expression] delete pointer
delete[] pointer
4 L->R ->*
.*
Member pointer selector
Member object selector
object_pointer->*pointer_to_member
object.*pointer_to_member
5 L->R *
/
%
Multiplication
Division
Modulus
expression * expression
expression / expression
expression % expression
6 L->R +
Addition
Subtraction
expression + expression
expression – expression
7 L->R <<
>>
Bitwise shift left
Bitwise shift right
expression << expression
expression >> expression
8 L->R <
<=
>
>=
Comparison less than
Comparison less than or equals
Comparison greater than
Comparison greater than or equals
expression < expression
expression <= expression
expression > expression
expression >= expression
9 L->R ==
!=
Equality
Inequality
expression == expression
expression != expression
10 L->R & Bitwise AND expression & expression
11 L->R ^ Bitwise XOR expression ^ expression
12 L->R | Bitwise OR expression | expression
13 L->R && Logical AND expression && expression
14 L->R || Logical OR expression || expression
15 R->L ?:
=
*=
/=
%=
+=
-=
<<=
>>=
&=
|=
^=
Conditional (see note below)
Assignment
Multiplication assignment
Division assignment
Modulus assignment
Addition assignment
Subtraction assignment
Bitwise shift left assignment
Bitwise shift right assignment
Bitwise AND assignment
Bitwise OR assignment
Bitwise XOR assignment
expression ? expression : expression
lvalue = expression
lvalue *= expression
lvalue /= expression
lvalue %= expression
lvalue += expression
lvalue -= expression
lvalue <<= expression
lvalue >>= expression
lvalue &= expression
lvalue |= expression
lvalue ^= expression
16 R->L throw Throw expression throw expression
17 L->R , Comma operator expression, expression
Có thể bạn sẽ không hiểu phần lớn những toán tử trong bảng trên ở thời điểm này, bạn chỉ cần quan tâm đến những toán tử vừa học ở phần trên. Những toán tử còn lại bạn có thể tự tìm hiểu nếu bạn có nhu cầu đặt biệt nào đó.

Các cấu trúc điều khiển trong C++

Cấu trúc lặp for

   for(biểu_thức_1; biểu_thức_2; biểu_thức_3)
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;
   }
  • Ý nghĩa từng biểu thức:
  • biểu_thức_1: thường dùng khởi tạo biến đếm vòng lặp.
  • biểu_thức_2: thường dùng kiểm tra điều kiện vòng lặp.
  • biểu_thức_3: thường dùng điều khiển biến đếm của vòng lặp
  • Ví dụ: for(int i=0; i<10; i++)
  • Thứ tự thực hiện:
    • Bước 1: Xác định biểu_thức_1
    • Bước 2: Xác định biểu_thức_2
    • Bước 3: Nếu biểu_thức_2 đúng chương trình sẽ thực hiện khối lệnh trong vòng lặp for. Ngược lại thoát khỏi for.
    • Bước 4: Tính biểu_thức_3, sau đó quay lại bước 2 để bắt đầu vòng lặp mới.

Cấu trúc điều khiển rẽ nhánh if

   if(biểu_thức_điều_kiện)
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;
   }

Cấu trúc điều khiển rẽ nhánh if…else

   if(biểu_thức_điều_kiện)
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;
   }
   else
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;
   }

Cấu trúc điều khiển switch

   switch(biều_thức_chọn)
   {
      case Giá_trị_1:
            Lệnh_1;
            Lệnh_2;
            ...
            break;
      case Giá_trị_2:
            Lệnh_1;
            Lệnh_2;
            ...
            break;
      default:
            Lệnh_1;
            Lệnh_2;
            ...
            break;
   }
  • biều_thức_chọn trong switch sẽ được so sánh với các giá trị trong tương ứng với các mệnh đề case.
  • Nếu giá trị biều_thức_chọn bằng Giá_trị_i thì khối lệnh của case i được thực hiện. Ngược lại thì khối lệnh tương ứng với khóa default được thực hiện.

Cấu trúc điều khiển lặp while

   while(<điều_kiện_lặp)
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;
   }
  • Điều kiện lặp được kiểm tra trước khi thực hiện khối lệnh

Cấu trúc lặp while

   do
   {
      Câu lệnh 1;
      ...
      Câu lệnh n;
   }while(điều_kiện_lặp);
  • Điều kiện lặp được kiểm tra khi khối lệnh được thực hiện xong. Do đó khối lệnh trong vòng lặp được thực hiện ít nhất 1 lần

Chọn trình soạn thảo C++ nào?

Hiện tại có rất nhiều trình soạn thảo C++ nhưng để chọn được trình soạn thảo phủ hợp với đặc thù công việc thì cần thời gian dài trải nghiệm và học hỏi… Dưới đây là 9 trình soạn thảo C++ hay còn gọi là IDE tốt nhất do các chuyên gia trên thế giới đánh giá.

1. CLion

Platforms: Linux, Mac OS X, Windows

  • Soạn thảo thông minh
  • Hộ trợ lập trình nhúng
  • Hỗ trợ thêm nhiều ngôn ngữ: C++11, libc++, boost, JavaScript, XML, HTML and CSS
  • Phím tắt giúp tạo nhanh dự án
  • CMake hộ trợ
  • Thống kê

2. Visual Studio

 

Platforms: Windows
IDE này do gã khổng lồ Microsoft sản xuất. Một phần lý do trình soạn thảo này chỉ hoạt động trên Windows. Đây là một trong những trình soạn thảo tốt nhất không chỉ cho C/C++ developers mà còn cho nhiều ngôn ngữ khác. Nếu bạn làm việc team thì có thể bạn cần phiên bản Pro trả phí nhưng nếu bạn làm một mình thì bạn có thể sử dụng bản Express miễn phí.

3. XCode

 

Platforms: Mac OS X
This IDE is the best choice for Mac users. Probably there are so many programmers who prefer to use a Mac. And again this IDE like the previous one (Visual Studio) is not only for C/C++ developers, there are many other popular languages supported. It is completely free to use. So you get pretty cool features to develop your program with C/C++.
Đây là sự lựa chọn tốt nhất cho người dùng Mac. Nó hoàn toàn miễn phí cho bạn nhưng cũng rất nhiều tính năng hay danh cho C/C++ developers

4. Eclipse

 

Platforms: Linux, Mac OS X, Windows
Eclipse hỗ trợ đã nền tảng và nó có một kho mã nguồn mở lớn và miễn phí.
  • Công cụ phát triển C/C++
  • Cộng đồng hỗ trợ Eclipse Git Team
  • Danh sách task Mylyn
  • Khai thác từ xa

Xem thêm

5. NetBeans

 

Platforms: Linux, Mac OS X, Windows
  • Hỗ trợ C++11
  • Bộ công cụ hỗ trợ Qt
  • Phát triển từ xa
  • Tệp điều hướng
  • Cài đắt cấu hình trình biên dịch

Xem thêm

6. Code::Blocks

Platforms: Linux, Mac OS X, Windows

  • Đơn giản, dễ dùng
  • Viết bằng C++.
  • Có thể mớ rộng bằng plugins
  • Open Source! GPLv3 miễn phí
  • Hỗ trợ nhiều trình biên dịch
  • Interfaces GNU GDB
  • Hỗ trợ MS CDB
  • Xem thông kê sử dụng CPU
  • Chuyển đổi giữa các threads

Hướng dẫn học C++

Xem thêm

7. Qt Creator

Platforms: Linux, Mac OS X, Windows
Thư viện nguồn mở là một điểm cộng.
  • Biên dịch nhanh Qt
  • Khởi động Qt nhanh
  • Qt Quick 2D Renderer
  • Qt WebView
  • Qt Bàn phím ảo
IDE có phiên bản pro trả phí.

8. Geany

Platforms: Linux, Mac OS X, Windows
Nhẹ, dễ sử dụng
  • Syntax highlighting
  • Code folding
  • Tự động đóng thẻ XML và HTML
  • Xây dựng hệ thống để biên dịch và thực thi
  • Quản lý project đơn giản

Xem thêm

9. CodeLite

Platforms: Linux, Mac OS X, Windows
  • Hiển thị lỗi dễ hiểu
  • Hỗ trợ Built-in GDB
  • Hỗ trợ C++11 auto keyword, templates, inheritance etc.

Xem thêm

Tóm lại

Yêu cầu công việc khác nhau thì nên lựa chọn những trình soạn thảo khác nhau.

  • Nếu bạn yêu cầu làm những dự án nhỏ hay chỉ mới học lập trình C++ thì có thể lựa chọn những IDE nhẹ, dễ sử dụng như Code::Blocks, Geany
  • Nếu bạn đang làm dự án lớn thì nên chọn những IDE có nhiều công cụ có sẵn như: VLion, Visual Studio

Nên chọn ngôn ngữ lập trình nào?

Bài viết này phù hợp với cả người mới học lập trình lẫn người lập trình thành thạo.

Khi bắt đầu vào con đường phát triển phần mềm, điều quan trọng là bạn nên đầu tư thời gian một cách khôn ngoan trong việc lựa chọn học một công nghệ nào đó mà nó sẽ có cả lợi ích cho bạn trong ngắn hạn với những kết quả nhìn thấy được, cũng như là cho phép bạn thiết lập một nền tảng cho bất kỳ ngôn ngữ lập trình nào trong tương lai. Lựa chọn của bạn sẽ còn phụ thuộc vào một số các yếu tố, vì thế hãy xem qua những đặc thù của chúng, xem nó có dễ học và giúp bạn kiếm sống được hay không. Tôi sẽ cung cấp tới bạn một vài đoạn code hiển thị dòng chữ “hello world”, đó là ứng dụng đầu tiên mà nhiều người tập viết khi học một ngôn ngữ lập trình mới.

Trong bài viết này, chúng ta sẽ xem xét những ngôn ngữ được sử dụng để phát triển phần mềm — là các ứng dụng chạy trên máy tính hoặc các thiết bị di động. Trong bài viết sau, chúng ta sẽ bàn về danh sách các ngôn ngữ lập trình web phổ biến, thường được sử dụng để tạo ra các trang web động và các giao diện tương tác người dùng thông qua trình duyệt.

Nên học ngôn ngữ lập trình nào để phát triển phần mềm?
Nên học ngôn ngữ lập trình nào để phát triển phần mềm?

C/C++

Mặc dù thực ra đó là hai ngôn ngữ riêng biệt, nhưng chúng lại thường được nhóm lại với nhau, C++ về cơ bản là một phiên bản mở rộng của C, bổ sung thêm đặc trưng hướng đối tượng. C++ là ngôn ngữ lập trình được lựa chọn bởi các lập trình viên chuyên nghiệp, hầu hết các game trên máy tính và các phần mềm cho Windows là được viết bằng nó. Nó có tốc độ thực thi rất nhanh, nhưng yêu cầu các lập trình viên phải quản lý bộ nhớ một cách chính xác, do đó để giỏi được ngôn ngữ này là rất khó. Người mới bắt đầu học lập trình thì chưa nên học ngôn ngữ này.

Cơ hội kiếm tiền:

Có ít sự cạnh tranh, các lập trình viên C++ có nhiều yêu cầu tuyển dụng và được trả lương rất cao, đặc biệt là trung lĩnh vực phát triển game.

Ngôn ngữ lập trình C++

Java

Java là một ngôn ngữ lập trình hoàn toàn hướng đối tượng, strongly typed, cùng với một tập đặc trưng mở rộng tập trung vào lập trình mạng và khả năng tương thích trên nhiều nền tảng. Các ứng dụng viết bằng Java thì gần như có thể chạy trên mọi hệ điều hành – mặc dù tốc độ sẽ không tốt được như ứng dụng được thiết kế chạy trên môi trường gốc.

Nó là ngôn ngữ lập trình được lựa chọn cho hầu hết các khóa học về Khoa học Máy tính, và do đó hầu như mọi người đều có ít nhất là một chút kinh nghiệm lập trình Java. Các ứng dụng Android thì cũng được viết bằng Java, tuy vậy bạn không thể đơn giản chạy một ứng dụng Java thông thường trên thiết bị Android hoặc ngược lại.

Cơ hội kiếm tiền:

Bạn có thể tạo ra các ứng dụng có giá trị để bán trên chợ ứng dụng Android; và cũng có rất nhiều công ty lớn tuyển dụng lập trình viên Java, nhưng tỷ lệ cạnh tranh khá lớn và mức lương hơi thấp.

Ngôn ngữ lập trình Java[Chú ý: Đừng nhầm lẫn Java với JavaScript, vì JavaScript là một ngôn ngữ hoàn toàn khác được sử dụng cho lập trình web – chúng ta sẽ nói về nó trong bài viết sau].

C#

Bạn phát âm nó là C sharp, đây là một ngôn ngữ của Microsoft nhân bản từ Java (mặc dù chúng cũng có nhiều điểm khác nhau hoàn toàn) – là một ngôn ngữ hướng đối tượng, đa năng và strongly-type. Tốc độ thực thi khá tốt, mặc dù không nhanh được như C++. Phần mềm viết bằng C# thì yêu cầu phải có .Net Framework và chỉ chạy trên hệ điều hành Windows.

Ngôn ngữ lập trình C#Tiềm năng kiếm tiền:

Có một số lượng khá lớn các công việc yêu cầu C# trong các dự án enterprise, nhưng bạn không có tiềm năng để kiếm tiền trên những dự án nhỏ. Tuy nhiên, nó là một ngôn ngữ thú vị và khá dễ học cho người mới bắt đầu, chắc chắn là tôi sẽ đề xuất nó nếu bạn muốn tập trung phát triển ứng dụng trên hệ điều hành Windows.

Bạn có thể tải bản Visual Studio Express miễn phí của Microsoft, nó là công cụ tuyệt vời để bạn thiết kế giao diện GUI và viết code cho chương trình. Bạn cũng có thể sử dụng IDE này với ngôn ngữ Visual Basic và nhiều ngôn ngữ khác của Microsoft.

Visual Basic

Là một đóng góp khác của Microsoft, Visual Basic là một ngôn ngữ hướng sự kiện tập trung vào các ứng dụng có thiết kế giao diện đồ họa GUI đơn giản. Hướng sự kiện nghĩa là code bạn viết ra thì nói chung sẽ xảy ra theo hành động của người dùng – ví dụ nó xảy ra khi người dùng click chuột vào một cái button chẳng hạn. Ngôn ngữ này rất dễ dàng để học và xây dựng các ứng dụng đơn giản, nhưng nó không phải là ngôn ngữ tốt nhất để học về các khái niệm nền tảng trong lập trình.

Ngôn ngữ lập trình Visual BasicObjective-C/ Cocoa

Đây là một ngôn ngữ dành cho Apple Mac, hầu hết các ứng dụng chạy trên hệ điều hành OSX và iOS đều được viết bằng ngôn ngữ này. Về mặt kỹ thuật, Objective-C là một phiên bản mở rộng của ngôn ngữ C với đặc trưng hướng đối tượng, giống như C++, nhưng nó gần như luôn kết hợp cùng với Cocoa framework để xây dựng các giao diện ứng dụng người dùng và các đặc trưng ở mức độ cao hơn trên nền tảng Mac. Bạn cũng phải cẩn thận trong việc quản lý bộ nhớ khi viết bằng ngôn ngữ này.

Các cú pháp và khái niệm bạn cần học thì tương đối phức tạp khi so sánh với một ngôn ngữ như Java hoặc C#, nhưng mặt khác, Apple cung cấp một môi trường phát triển toàn diện và miễn phí (XCode) và các công cụ khác sẽ làm cho quá trình tạo ra các ứng dụng thực tế và có thể xài được thì khá dễ dàng. Ngoài ra cũng có nhiều bài hướng dẫn và các video trên mạng hướng dẫn cho bạn, vì thế nó cũng chắc chắn là dễ học hơn C++. Khi bạn chọn ngôn ngữ này thì cơ bản là bạn sẽ phát triển ứng dụng cho OSX và iOS, nhưng bạn cũng sẽ có khả năng để viết ứng dụng cho Apple desktop và môi trường di động với chỉ một ngôn ngữ duy nhất.

Ngôn ngữ lập trình Objective-CTiềm năng kiếm tiền:

Chỉ với một tài khoản dành cho developer ($99 đô-la/năm), bạn có thể xây dựng ứng dụng và có cơ hội kiếm khá bộn tiền — Apple đã trả hơn $2 tỉ đô-la cho các nhà phát triển ứng dụng. Các nhà phát triển ứng dụng cho App Store thì có cơ hội tốt hơn các nhà phát triển cho Android để kiếm tiền với các ứng dụng có trả phí, trong khi các nhà phát triển cho Android có khuynh hướng kiếm thu nhập từ việc quảng cáo trên các ứng dụng miễn phí.

Đó là tất cả các ngôn ngữ mà tôi muốn giới thiệu với bạn ngày hôm nay, và chúng là những ngôn ngữ phổ biến để phát triển phần mềm trong thế giới thực trên máy PC, Mac và môi trường di động. Trước khi tôi nhận được những bình luận của bạn, tôi đã quyết định đặt ngôn ngữ Python vào trong danh sách các ngôn ngữ dành cho phát triển web ở bài viết sau, bởi vì có vẻ như nó được sử dụng nhiều nhất ở mảng đó.

Sự thực là một khi bạn đã có kiến thức khá cơ bản trong bất kỳ một ngôn ngữ nào, thì nó rất dễ để học thêm một ngôn ngữ khác; nó cũng giống như là nếu bạn biết tiếng Trung Quốc theo lối tượng hình thì việc học đọc và viết tiếng Nhật Bản cũng dễ hơn rất nhiều — các ngôn ngữ lập trình cũng thường kế thừa và vay mượn lẫn nhau, chúng chia sẻ cùng tập các cú pháp và đặc trưng cơ bản. Trong bài viết tới tôi sẽ giới thiệu các ngôn ngữ chuyên dành cho phát triển web như là JavaScript và PHP.

Bạn đang sử dụng ngôn ngữ nào để lập trình, bạn có tranh luận gì về các ngôn ngữ lập trình hiện nay? Hãy để lại vài dòng bình luận nhé!

Nguồn: dịch từ Makeuseof

Các hàm làm tròn số trong C++

value   round   floor   ceil    trunc
-----   -----   -----   ----    -----
2.3     2.0     2.0     3.0     2.0
3.8     4.0     3.0     4.0     3.0
5.5     6.0     5.0     6.0     5.0
-2.3    -2.0    -3.0    -2.0    -2.0
-3.8    -4.0    -4.0    -3.0    -3.0
-5.5    -6.0    -6.0    -5.0    -5.0

Hàm round(x)

Làm tròn về số nguyên gần nhất so với số thực x.

Hàm trunc(x)

Trả về số thực có giá trị bằng phần nguyên của x.

Hàm ceil(x)

Làm tròn lên số thực x. Trả về số thực có giá trị bằng số nguyên nhỏ nhất lớn hơn hoặc bằng x.

Hàm floor(x)

Làm tròn xuống số thực x. Trả về số thực có giá trị bằng số nguyên lớn nhất nhỏ hơn hoặc bằng x.

 

Chú ý: Tất cả các hàm trên đều thuộc thư viện cmath. Bạn phải khai báo thư viện này trước khi sử dụng các hàm trên.

Các kiểu dữ liệu trong Pascal

Kiểu số nguyên

Các kiểu số nguyên

Tên kiểu Phạm vi Dung lượng
Shortint -128 đến 127 1 byte
Byte 0 đến 255 1 byte
Integer -32768 đến 32767 2 byte
Word 0 đến 65535 2 byte
LongInt -2147483648 đến 2147483647 4 byte

int64          -2^63…2^63-1
qword         0…2^64-1

Các phép toán trên kiểu số nguyên

Các phép toán số học:

+, -, *, / (phép chia cho ra kết quả là số thực).

Phép chia lấy phần nguyên: DIV  (Ví dụ : 34 DIV 5 = 6).

Phép chia lấy số dư: MOD (Ví dụ:  34 MOD 5 = 4).

Các phép toán xử lý bit:

Trên các kiểu ShortInt, Integer, Byte, Word có các phép toán:

  • NOT, AND, OR, XOR.
A B A AND B A OR B A XOR B NOT A
1 1 1 1 0 0
1 0 0 1 1 0
0 1 0 1 1 1
0 0 0 0 0 1
  • SHL (phép dịch trái): a SHL n Û a ´ 2n
  • SHR (phép dịch phải): a SHR n Û a DIV 2n

Kiểu logic

– Từ khóa: BOOLEAN

– miền giá trị: (TRUE, FALSE).

– Các phép toán: phép so sánh (=, <, >) và các phép toán logic: AND, OR, XOR, NOT.

Trong Pascal, khi so sánh các giá trị boolean ta tuân theo qui tắc: FALSE < TRUE.

Giả sử A và B là hai giá trị kiểu Boolean. Kết quả của các phép toán được thể hiện qua bảng dưới đây:

A B A AND B A OR B A XOR B NOT A
TRUE TRUE TRUE TRUE FALSE FALSE
TRUE FALSE FALSE TRUE TRUE FALSE
FALSE TRUE FALSE TRUE TRUE TRUE
FALSE FALSE FALSE FALSE FALSE TRUE

Kiểu số thực

Các kiểu số thực:

Tên kiểu Phạm vi Dung lượng
Single 1.5´10-45 ® 3.4´10+38 4 byte
Real 2.9´10-39 ® 1.7´10+38 6 byte
Double 5.0´10-324 ® 1.7´10+308 8 byte
Extended 3.4´10-4932 ® 1.1´10+4932 10 byte

Chú ý: Các kiểu số thực Single, Double và Extended yêu cầu phải sử dụng chung với bộ đồng xử lý số hoặc phải biên dich chương trình với chỉ thị {$N+} để liên kết bộ giả lập số.

Các phép toán trên kiểu số thực:          

+, -, *, /

Chú ý: Trên kiểu số thực không tồn tại các phép toán DIV và MOD.

Các hàm số học sử dụng cho kiểu số nguyên và số thực:

SQR(x):                                  Trả về x2

SQRT(x):                                Trả về căn bậc hai của x (x³0)

ABS(x):                                   Trả về |x|

SIN(x):                                                Trả về sin(x) theo radian

COS(x):                                  Trả về cos(x) theo radian

ARCTAN(x): Trả về arctang(x) theo radian

LN(x):                                     Trả về ln(x)

EXP(x):                                  Trả về ex

TRUNC(x):                Trả về số nguyên gần với x nhất nhưng bé hơn x.

INT(x):                                               Trả về phần nguyên của x

FRAC(x):                               Trả về phần thập phân của x

ROUND(x):                Làm tròn số nguyên x

PRED(n):                               Trả về giá trị đứng trước n

SUCC(n):                               Trả về giá trị đứng sau n

ODD(n):                                 Cho giá trị TRUE nếu n là số lẻ.

INC(n):                                   Tăng n thêm 1 đơn vị (n:=n+1).

DEC(n):                                  Giảm n đi 1 đơn vị (n:=n-1).

Kiểu ký tự

– Từ khoá: CHAR.

– Kích thước: 1 byte.

– Để biểu diễn một ký tự, ta có thể sử dụng một trong số các cách sau đây:

  • Đặt ký tự trong cặp dấu nháy đơn. Ví dụ ‘A’, ‘0’.
  • Dùng hàm CHR(n) (trong đó n là mã ASCII của ký tự cần biểu diễn). Ví dụ CHR(65) biễu diễn ký tự ‘A’.
  • Dùng ký hiệu #n (trong đó n là mã ASCII của ký tự cần biểu diễn). Ví dụ #65.

– Các phép toán: =, >, >=, <, <=,<>.

* Các hàm trên kiểu ký tự:

UPCASE(ch): Trả về ký tự in hoa tương ứng với ký tự ch. Ví dụ: UPCASE(‘a’) = ‘A’.

ORD(ch): Trả về số thứ tự trong bảng mã ASCII của ký tự ch. Ví dụ ORD(‘A’)=65.

CHR(n): Trả về ký tự tương ứng trong bảng mã ASCII có số thứ tự là n. Ví dụ: CHR(65)=’A’.

PRED(ch): cho ký tự đứng trước ký tự ch. Ví dụ: PRED(‘B’)=’A’.

SUCC(ch): cho ký tự đứng sau ký tự ch. Ví dụ: SUCC(‘A’)=’B’.

Các hàm toán học có sẵn trong C++

YeuLapTrinh xin được tóm tắt một số các  hàm toán học hay dùng. Các hàm này đều được khai báo trong file nguyên mẫu math.h.

  1. Các hàm số học
  • abs(x), labs(x), fabs(x) : trả lại giá trị tuyệt đối của một số nguyên, số nguyên dài và số thực.
  • pow(x, y) : hàm mũ, trả lại giá trị x lũy thừa y (xy).
  • exp(x) : hàm mũ, trả lại giá trị e mũ x (ex).
  • log(x), log10(x) : trả lại lôgarit cơ số e và lôgarit thập phân của x (lnx, logx) .
  • sqrt(x) : trả lại căn bậc 2 của
  • atof(s_number) : trả lại số thực ứng với số viết dưới dạng xâu kí tự
  1. Các hàm lượng giác
  • sin(x), cos(x), tan(x) : trả lại các giá trị sinx, cosx,

Các phần mềm lập trình .NET, VB.NET, C#, ASP.NET

Công cụ để lập trình .NET (VB.NET, C#, ASP.NET) gồm có:

1. Visual Studio 2008 Professional Edition

2. Microsoft Visual Studio 2010 Ultimate v10.0.30319.1 Final Full Crack Actived

Bạn hãy chỉ chọn một trong hai công cụ trên.

1. Visual Studio 2008 Professional Edition
Dung lượng: 3.30 GB

http://download.microsoft.com/download/8/1/d/81d3f35e-fa03-485b-953b-ff952e402520/VS2008ProEdition90dayTrialENUX1435622.iso

Sau khi cài đặt xong, vào Start –> Control Panel –> Settings –> Add or Remove Programs
Chọn Visual Studio 2008 Professional Edition – ENU click chọn Change/Remove
Chờ 1 chút cho nó load lên, click Next
Nếu bản của bạn đang là bản dùng thử, nhìn xuống dưới cùng của cửa sổ Microsoft VS 2008 Setup Maintenance sẽ có chỗ Upgrade key.
Bạn điền key sau vào và click vào Upgrade là xong
Khi Crack xong, vào chương trình VS 2008 Pro Edition, click Help –> About nó sẽ hiện ra cửa sổ như sau và mất đi dòng Trial

Key: XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4WT

– Hướng dẫn Crack trên Windows 7:
Trên Windows 7, thì cách trên không hoạt động đc. Bạn hãy làm như sau:
+ Dùng Ultra ISO để mở file VS 2008, tìm tới file setup.sdb (nằm trong thư mục Setup).
+ Mở file setup.sdb bằng Notepad hoặc bất kỳ Editor nào.
+ Tìm tới dòng [Product Key] và sửa giá trị cho nó : XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4WT
Sau khi sửa xong, hãy lưu file setup.sdb lại và tiến hành cài đặt bình thường. Sau khi cài đặt xong, nó sẽ tự động Active cho bạn.

2. Microsoft Visual Studio 2010 Ultimate v10.0.30319.1 Final Full Crack Actived x86:

http://www.fshare.vn/folder/TX9VZR3V3T

Hoặc: Visual Studio 2010 Ultimate x86
http://up.4share.vn/f/66575f54545e5756/en_visual_studio_2010_ultimate_x86_dvd_509116.iso.file

3. Hệ quản trị CSDL:

Hệ quản trị CSDL là phần vô cùng quan trọng trong quá trình lập trình. Microsoft đã phát triển nhiều những phần mềm giúp ta xây dựng CSDL, tôi xin được chia sẻ với bạn ở bên dưới.
a. SQL Server 2005:
Bước 1: Cài phần mềm http://www.microsoft.com/downloads/en/details.aspx?FamilyId=C243A5AE-4BD1-4E3D-94B8-5A0F62BF7796&displaylang=en

Bước 2: Cài thêm http://go.microsoft.com/fwlink/?linkid=65109

b. SQL Server 2008:

SQL Server 2008 có nhiều phiên bản khác nhau, trong đó bản Express   là  bản thấp nhất, được Microsoft cung cấp miễn phí cho người dùng với   mục  đích học tập và ứng dụng vào những ứng dụng nhỏ, không yêu cầu  cao  về  các tính năng khác ngoài việc lưu trữ và xử lý đơn giản.

Yêu cầu về phần cứng và hệ điều hành sử dụng:– Hệ điều hành tối thiểu: Windows XP SP3, Windows Wista SP1, Windows 7, Windows 2003 SP2.
Phần cứng: Pentium IV 2Gb MHz trở lên. Tối thiểu  1 GB RAM. Ổ cứng 10 GB.

Link Download :
– Để cài đặt SQL Server 2008 Express download về tại địa chỉ:
http://www.microsoft.com/en-us/download/details.aspx?id=1695

Để cài đặt SQL Server 2008 Express with management tools download về tại địa chỉ:
http://www.microsoft.com/en-us/download/details.aspx?id=22973

Đối với WinXp bắt buộc phải cài thêm: Bạn phải có Windows PowerShell 1.0
http://go.microsoft.com/fwlink/?LinkId=120552

Ngoài ra: Nếu máy đã cài xong VS2010 thì chỉ cần cài: Microsoft SQL Server 2008 Management Studio Express
tại địa chỉ: http://www.microsoft.com/en-us/download/details.aspx?id=7593

 

Chú ý : đối với máy tính cài Windows XP, khi cài SQL Express 2008, nó sẽ thường báo lỗi máy tính phải có cài .Net Framework 2.0 SP2 và  Windows Installer 4.5 rồi nó mới cho cài SQL Express 2008. Thì các bạn phải down Net framework 2.0 sp2Windows Installer 4.5 ở link trên về cài đặt xong rồi mới cài Sql Express 2008.
Các bước cài đặt :
Bước 1 : Tại màn hình cài đặt SQL Server 2008 bạn chọn mục Installation sau đó chọn New SQL Server stand-alone installation or add features to an existing installation

– Bước 2 : Tại màn hình Setup Support Rules  chọn OK

Bước 3 : Tại màn hình “Product Key“, chọn Next để tiếp tục

– Bước 4 : Tại màn hình License Term, đánh dấu chọn nút “I accept the licence terms”, rồi chọn “Next”

Bước 5 : Tại màn hình “setup support files”  nhấn nút “install” để tiếp tục.

Bước 6 : tại màn hình “Setup Support Rules“, nếu mỗi thứ suôn sẽ, thì nhấn nút “Next” để tiếp tục.

Bước 7 : Trên màn hình “features selection“, nhất nút “Sellect All” để chọn tất cả, sau đó nhấn nút “Next“.

Bước 8 : tại màn hình “instance Configuratio”, có 2 lựa chọn : chọn như hình dưới, rồi nhấn nút Next để tiếp tục ….

Bước 9 : Chọn Next để tiếp tục.

Bước 10 : Chọn “Account Name” và chọn là NT AUTHORITY\NETWORK như trong hình sau đây, sau đó nhấn Next để tiếp tục.

Bước 11 : Trên màn hình “Database Engine Configuration“, trong phần Account Provisioning, ta chọn “Windows Authotication Mode” hoặc “Mixed Mode” đều được cả
+ Chọn “Windows Authotication Mode” không cần nhập PassWord, để đơn giản ta nên chọn “Windows Authotication Mode
+ Chọn “Mixed Mode” thì ta phải nhập PassWord.
+ Sau cùng ta nhấn vào nút “Add Current User“, rồi nhấn nút Next để tiếp tục.

Bước 12 : nhấn nút “Next” để tiếp tục

Bước 13 : nhấn nút “Next” để tiếp tục

Bước 14 : nhấn nút “Install” để tiến hành cài đặt, quá trình cài đặt khoảng 3 phút …

Bước 15 : Nhấn nút “Next” để hoàn thành quá trình cài đặt. Cuối cùng cũng xong