Ngôn ngữ lập trình

Ngôn ngữ lập trình rất quan trọng và rất đa dạng. Lập trình viên thường học một vài ngôn ngữ nhưng vẫn có riêng một ngôn ngữ thiết yếu để làm việc...

Hướng dẫn cài đặt Visual Studio 2017

Bước 1: Truy cập địa chỉ https://www.visualstudio.com/downloads/ để tải phiên bản Visual Studio 2017 phù hợp.

Hình 1. Chọn Free download với bản Community hoặc Free trial với bản Professional hoặc Enterprise

Chú ý:
Các bạn nên lựa chọn 03 mục bên dưới để tìm hiểu rõ tính năng cập nhật, so sánh và cách cài đặt của từng phiên bản.
– Release notes & documentation: giới thiệu tính năng cập nhật
– Compare Visual Studio editions: so sánh giữa các phiên bản.
– How to install offline: hướng dẫn các cách cài đặt offline.

Hình 2. Các tùy chọn cần đọc khi lựa chọn phiên bản

Hoặc download bản FULL miễn phí dưới đấy:

Tải Visual Studio Enterprise 2017 Full Active Link Fshare

Key: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

Tải Visual Studio 2017 Full Active Link Google Drive Offline Max Tốc Độ

Bao gồm 3 phiên bản. Bạn muốn sử dụng bản nào thì tải bản đó nhé.

Visual-Studio-2017-Full-Crack-yeulaptrinh.pw

Key Cài Đặt Visual Studio 2017

2XNFG-KFHR8-QV3CP-3W6HT-683CH
HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
HMGNV-WCYXV-X7G9W-YCX63-B98R2

Bước 2: Sau khi lựa chọn phiên bản tải về, các bạn click vào file vs_enterprise_942992239.1488853819.exe để tiến hành cài đặt

Chú ý: Tùy theo phiên bản tải về sẽ có tên khác nhau
– vs_enterprise
– vs_professional
– vs_community

 

Bước 3: Lựa chọn các thành phần, ngôn ngữ, nền tảng để cài đặt

Hình 3. Lựa chọn công cụ cho các môi trường windows, web, mobile, game trong tab Workloads

Hình 4. Lựa chọn NET Framework và Database bạn muốn sử dụng trong tab Individual Components

Hình 5. Lựa chọn ngôn ngữ sử dụng trong tab Language packs

 

Bước 4: Bạn nhấn nút Install ở góc dưới cùng bên phải để bắt đầu tiến trình cài đặt

 

Hoàn thành !!!

 

Nguồn: ky-thuat-lap-trinh

Tổng hợp tài liệu Java cơ bản

Hưởng dẫn dịch chương trình Java: http://uet.vnu.edu.vn/~chauttm/guides/BuildingFirstJavaProgram.pdf

Head First Java: https://zimslifeintcs.files.wordpress.com/2011/12/head-first-java-2nd-edition.pdf

How to Program Java: http://mobile.skku.ac.kr/lecture/2017_1/CEL/how%20to%20program%20Java.pdf

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++

Toán tử so sánh (Relational operators)

Toán tử logic trong C++ (Logical operators)
Toán tử trên bit trong C++ (Bitwise operators)
Các toán tử hỗn hợp trong C++ (Misc Operators)

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

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