Skip to content
Narrow screen resolution Wide screen resolution Auto adjust screen size Increase font size Decrease font size Default font size default color grey color
         
 | 
VNOI - Olympic tin học Việt Nam

Điểm tin VOJ

Số thành viên:6040
Số bài tập:1001
Số bài nộp:722923
Bài nộp hôm nay:0

Top 10 thành viên xuất sắc

HạngThành viênĐiểm
1mr_invincible587.9
2white_cobra418.6
3hieult403.4
4phaleq384.0
5vodanh9x368.2
6con_nha_ngheo352.0
7flash_mt350.2
8darksabers349.8
9yenthanh132345.3
10rockman9x_94343.1
Diễn đàn arrow Thư viện arrow Bài viết arrow Ngôn ngữ lập trình arrow Giải bài tập tin học bằng C++
Giải bài tập tin học bằng C++ In E-mail
(58 votes)
Người viết: Ngô Minh Đức   
29/03/2008

Bài viết này dành cho các bạn đã quen với ngôn ngữ lập trình Pascal và C, muốn chuyển sang sử dụng C++ để giải các bài tập tin học. Nếu chỉ mới biết Pascal, các bạn nên đọc loạt bài ‘Từ Pascal đến C’ trước.

Do kiến thức về C++ cũng còn chưa chuyên sâu, nên tác giả sẽ đi vào những ví dụ cụ thể, cần thiết để làm bài hơn là những lý giải chi tiết về C++.

Giới thiệu

Ngôn ngữ

C++ là một ngôn ngữ lập trình rất mạnh. C++ hỗ trợ cả lập trình cấu trúc (structural, như Pascal) và lập trình hướng đối tượng (như Java, C#).

Nhược điểm thường gặp khi dùng C++ để giải bài tập đó là chương trình C++ khó gỡ rối, vì chưa có một phần mềm hỗ trợ gỡ rối nào đủ mạnh. GNU C++ cũng biên dịch chậm hơn so với C#.

Trình biên dịch

Trình biên dịch dùng trong các kỳ thi và Online Judge đó là G++, một trình biên dịch mã nguồn mở cho ngôn ngữ C++.

Để tận dùng công cụ gỡ rối, đôi khi các bạn cần dùng trình biên dịch Visual C++ (msvc) của Microsoft. Trình biên dịch này so với G++ có một vài điểm khác biệt cần lưu ý khi giải bài tập. Nhưng nhìn chung, có thể dùng chương trình viết cho VC++ để nộp bài mà không gây ra lỗi biên dịch nào đáng kể.

IDE

Microsoft Visual Studio từ phiên bản 2005 hỗ trợ việc gỡ rối C++ tốt hơn nhiều so với các IDE khác.

Trong trường hợp không có VS, trong các kỳ thi, trên hệ điều hành Windows thường sử dụng Dev-C++:

http://jaist.dl.sourceforge.net/sourceforge/dev-cpp/devcpp-4.9.9.2_setup.exe

Dev-C++ hỗ trợ việc debug/gỡ rối kém hiệu quả, và dự án mã nguồn mở này đến nay cũng không được phát triển thêm nữa.

Trên hệ điều hành Linux, một giải pháp phù hợp là RHIDE. Tuy nhiên, khi sử dụng RHIDE bạn phải thiết lập các thông số sao cho giao diện không bị các lỗi về phím nóng, phải cài đặt hệ thống debug,…

(Do không sử dụng Linux nhiều nên nếu bạn nào biết giải pháp tốt để làm bài C++ cho Linux xin vui lòng cho tác giả biết!)

 

STL

Sức mạnh của C++ đến từ STL, viết tắt của Standard Template Libary, một thư viện lớn các class và thủ tục chuẩn cho C++. Các trình biên dịch mới như G++ và VS đều hỗ trợ tốt STL.

Lập trình

Tên thư viện

Tên thư viện trong C++ thường không có đuôi .h như C nữa (mặc dù bạn vẫn có thể sử dụng). Để dùng một thư viện cũ của C, bạn cần bỏ đuôi .h và thêm chữ cái c vào phía trước. Ví dụ:

C:

#include <stdio.h>  

#include <string.h>

 

C++

#include <cstdio>

#include <cstring>

 

Namespace

Namespace chẳng qua là một nơi để chứa các thủ tục, class cùng có một điểm chung nào đó tránh việc trùng tên và cũng làm việc lập trình dễ quản lý hơn. Khi sử dụng thư viện chuẩn STL, namespace là std. Vì vậy ta thường thêm dòng:

using namespace std;

để tránh việc việc lại namespace khi phải dùng các thủ tục, class.

 

Ví dụ: để đọc dữ liệu, ta viết

:

Khi không khai báo dòng lệnh trên

std::cin >> n;

Khi đã khai báo dòng lệnh trên

cin >> n

Thư viện

Các thư viện C++ thường dùng khi giải bài tập:

  • iostream: để đọc và ghi dữ liệu với đối tượng cin, cout, cách đọc ghi dữ liệu của C++
  • string: để dùng đối tượng chuỗi của C++
  • algorithms: chứa các thuật toán hữu ích như sort, binary search, next_permutation, max, min...
  • vector: kiểu hướng đối tượng thay thế cho mảng
  • set: kiểu tập hợp
  • map: bảng (khóa, giá trị) được cài đặt bằng cây cân bằng hoặc bảng băm, rất hiệu quả
  • sstream: thường dùng để chuyển số sang chuỗi và ngược lại

Các thư viện cũ của C thường dùng:

  • cstdio: đọc và ghi dữ liệu với các lệnh scanf, printf,...
  • cstring: các hàm xử lý trên kiểu chuỗi (char*) của C
  • cmath: các hàm toán học

 

C++/C

Khi viết chương trình C++, hầu như bạn có thể dùng mọi yếu tố trong ngôn ngữ C. Do đó bạn có thể lựa chọn đọc ghi dữ liệu sử dụng cstdio hay iostream, sử dụng đối tượng string hay char* cho chuỗi, hoặc thậm chí sử dụng cả hai loại trong một chương trình.

Nhìn chung, các phương pháp cũ của C có tốc độ nhanh hơn, tuy nhiên các đối tượng của C++ lại giúp lập trình dễ dàng và sáng sủa hơn.

 

Số nguyên 64 bit

Kiếu số nguyên 64 bit cho G++ (tương đương với int64 của Free Pascal) ký hiệu là long long.

Ví dụ:

long long a;

 

Đọc ghi dữ liệu với iostream

Thông thường, khi giải những bài cần đọc ghi khối lượng dữ liệu lớn, bạn nên sử dụng scanf và printf vì thời gian chạy sẽ tốt hơn. Thậm chí nếu đã quen dùng thì cách nhập xuất với C này cũng đủ sử dụng cho mọi bài tập.

Tuy nhiên với các bài có khối lượng đọc/ghi dữ liệu không đáng kể, iostream của C++ là lựa chọn tốt vì rất dễ sử dụng.

 

Có hai đối tượng chính mà bạn sẽ sử dụng, đó là cin và cout.

cin: đọc dữ liệu từ thiết bị chuẩn (bàn phím)

cout: ghi dữ liệu ra thiết bị chuẩn (màn hình)


Trong trường hợp muốn đọc, ghi dữ liệu ra file, các bạn cần khai báo đè các thiết bị chuẩn, bằng cách thêm các dòng lệnh sau ở đầu chương trình:

freopen(“input.txt”, “r”, stdin);

freopen(“output.txt”, “w”, stdout);

 

cin hoạt động với toán tử >>, cout hoạt động với toán tử <<. Bạn có thể coi cin là bàn phím, cout là màn hình, chiều của mũi tên là chiều đi của dữ liệu.

 

Ví dụ:

  • Đọc số:

long long a;

cin >> a;

 

  • Đọc chuỗi:

string s;

cin >> s;

cin hoạt động với cả string của C++ và mảng char của C, nghĩa là đoạn chương trình sau vẫn chạy đúng:

char s[100];

cin >> s;

 

Một chương trình đơn giản, đọc một chuỗi và in ra màn hình:

#include <iostream>

#include <string>

using namespace std;

 

int main()

{

    string s;

    cin >> s;

    cout << s;

    return 0;

}

 

Lưu ý: khác với lệnh read, hay readln của Pascal, việc đọc chuỗi bằng cin sẽ dừng lại khi bắt gặp khoảng trắng. Nghĩa là khi chạy chương trình trên nếu nhập vào “Free Pascal”, màn hình sẽ chỉ xuất hiện chuỗi “Free”.

 

Để đọc cả một dòng trong input, dùng lệnh getline:

string s;

getline(cin, s);

 

  • In

Việc in dữ liệu với cout khá dễ dàng. Để in ký tự xuống dòng bạn có thể dùng chỉ thị endl. Ví dụ:

cout << 5 << endl << “ioitrain”;

sẽ in ra kết quả

5

ioitrain

 

Lưu ý, cout không hỗ trợ tốt trong trường hợp cần in số thực với độ chính xác một số chữ số thập phân. Trong trường hợp này, bạn cần dùng printf.

Ví dụ:

printf(“%.2lf”, &x); sẽ in ra số thực x với 2 chữ số thập phân

 

Chuỗi

Chuỗi (string) là đối tượng rất thường được sử dụng trong C++. Một string có thể chứa số ký tự tùy ý.

Để sử dụng string, bạn cần khai báo thư viện với dòng lệnh

#include <string>

 

  • Khai báo chuỗi

string s=”ioitrain”;

  • Xác định ký tự tại vị trí i (vị trí được tính từ 0)

char c=s[i];

  • Độ dài chuỗi

int l=s.length();

  • Chuỗi con bắt đầu tự ví trí i, có độ dài k

string p=s.substr(i, k);

  • Đảo ngược một chuỗi: dùng hàm reverse của thư viện algorithm:

string p=reverse(s.begin(), s.end());

  • So sánh hai chuỗi: có thể dùng các toán tử >, <, =,... như Pascal.
  • Nối chuỗi: có thể dùng toán tự + như Pascal

string p=s+”.info/”+s;

(còn tiếp)

 
< Trước   Tiếp >