23 thg 10, 2010

HƯỚNG DẪN C++

[C++] 1.1 Viết chương trình đầu tiên

Đăng ngày: 21:09 22-08-2010
Thư mục: C++
OnlineXanh hướng dẫn bạn viết chương trình đầu tiên in ra màn hình một lời chào: "Xin chao".

Bước 1
. Tải Dev C++ 4.9 về, cài đặt và sử dụng hoàn toàn miễn phí tại đây (8.89 Mb).

Bước 2. Mở Dev C++ bằng cách vào Start | All Programs | Bloodshed C++ | Dev C++. Trong cửa sổ làm việc của Dev C++, tạo một dự án mới bằng cách vào File | New | Source File rồi gõ vào đoạn code sau:

#include<iostream.h>
#include<conio.h>

main()
{
cout<<"Xin chao";
getch();
}


Lưu mã nguồn thành tập tin có đuôi mở rộng .CPP bằng cách bấm tổ hợp phím Ctrl + S (chú ý vị trí lưu tập tin). Chẳng hạn lưu tập tin mã nguồn có tên "xinchao.cpp".

Bước 3. Biên dịch (compile) mã nguồn thành chương trình có đuôi mở rộng .EXE bằng cách bấm phím F9 hoặc vào Execute | Compile & Run. Nếu biên dịch thành công (chương trình không có lỗi) thì có nghĩa là bạn đã xây dựng thành công chương trình của mình như sau:

Nhưng có phải chương trình của mình chỉ chạy được trên Dev ++? Không phải vậy, Dev C++ đã tạo ra tập tin chương trình của bạn nằm ngay trong thư mục chứa tập tin mã nguồn, trong trường hợp này tập tin chương trình có tên "xinchao.exe".

Giờ đây, bạn có thể copy tập tin chương trình của mình đến bất kỳ đâu và chạy ở bất kỳ máy tình nào mà không cần đến Dev C++.


Giải thích những dòng lệnh trong code chương trình:
#include<iostream.h>
#include<conio.h>

main()
{
cout<<"Xin chao";
getch();
}

1.  Trước hết khung chương trình bao giờ cũng phải có hàm main(), đây là điều bắt buộc. Về sau, khi chương trình có nhiều hàm, nhưng hàm main sẽ được dịch đầu tiên. Khung chương trình:
main
{

}

2. Khi chương trình dịch biên dịch đến dòng lệnh
 cout<<"Xin chao";
cout là hàm có tác dụng in ra một thông báo nằm trong dấu " ", ở đây chính là câu "xin chao". Hàm này nằm trong thư viện iostream.h được lưu trong tập tin iostream.h, và tập tin này được lưu trong iclude trong thư mục cài đặt của Dev C++. Vì vậy, khi sử dụng hàm cout bạn phải khai báo thư viện chứa nó bằng câu lệnh #include<iostream.h> nằm trên cùng ngoài hàm main()

3. Tiếp đến dòng lệnh
 getch();
getch() là hàm có chức năng dừng màn hình để người xem có thể quan sát được kết quả. Nếu không có hàm này thì thông báo của bạn ngay sau khi được in ra nó sẽ biến mất ngay tức khắc. Hàm này nằm trong thư viện conio.h vì vậy bạn phải khai báo thư viện này bằng câu lệnh #include<conio.h> nếu không chương trình dịch sẽ báo lỗi.


Những chú ý khi viết chương trình:
1.
Bất kỳ chương trình nào cũng phải có hàm main(), chương trình bắt đầu chạy từ hàm này.
2. Muốn sử dụng hàm chuẩn nào, phải khai báo thư viện chứa hàm đó.
3. C++ là một ngôn ngữ có phân biệt chữ hoa và chữ thường trong cách viết, chẳng hạn "cout" và "Cout" là hai chữ hoàn toàn khác nhau.
4. Các câu lệnh có thể viết trên một hoặc nhiều dòng nhưng kết thúc mỗi lệnh phải có dấu ";".
5. Nếu muốn gộp nhiều lệnh thành một khối lệnh thì viết các lệnh này giữa hai dấu "{" và "}".

[C++] 1.2 Biến

Đăng ngày: 22:58 23-08-2010
Thư mục: C++
1) Khái niệm biến
Biến là nơi để lưu trữ thông tin trong bộ nhớ máy tính (thường là bộ nhớ RAM). Khi khai báo biến, máy tính sẽ cung cấp một vùng nhớ. Vùng nhớ này có địa chỉ, kích cỡ và dữ liệu xác định:


    - Địa chỉ vùng nhớ
: Mỗi khi bạn sử dụng một biến, máy tính sẽ cung cấp cho bạn một vị trí để lưu trữ biến đó và nó sẽ có địa chỉ xác định. Dựa vào địa chỉ mà máy tính có thể dễ dàng truy cập đến dữ liệu của biến. Địa chỉ là cái mà máy tính quan tâm, còn cái mà người lập trình quan tâm chính là dữ liệu (hay giá trị) của biến.
    - Kích cỡ vùng nhớ. Tất nhiên để có thể lưu trữ được thì vùng nhớ lưu trữ biến cũng phải có kích cỡ (hay độ rộng) nhất định. Kích cỡ này tính bằng đơn vị byte và phụ thuộc vào kiểu dữ liệu của biến. Ví dụ biến kiểu nguyên thì kích cỡ vùng nhớ cho biến này là 2 bytes.
    - Dữ liệu vùng nhớ: Dữ liệu vùng nhớ hay giá trị của biến chính là thông tin được lưu trong vùng nhớ của biến. Dữ liệu này có thể được thay đổi tùy thuộc vào người lập trình. Giá trị của biến chính là cái mà người lập trình quan tâm nhất khi sử dụng biến.

Biến chỉ tồn tại trong phạm vi của một hàm hoặc một chương trình.  Khi hàm hoặc chương trình kết thúc thì vùng nhớ của biến cũng được giải phóng.


2) Khai báo biến

Để sử dụng được một biến ta phải khai báo biến đó. Khi khai báo biến, trước tiên ta khai báo từ khóa cho biết kiểu dữ liệu của biến, tiếp theo đó là một hoặc nhiều dấu cách, tiếp theo nữa là tên biến và cuối cùng là dấu ";". Ví dụ sau là khai báo một biến có kiểu nguyên và có tên là n:

    int n;

trong đó, int là từ khóa ứng với kiểu số nguyên.

Khai báo có khởi tạo:

    int n = 5;

Khi đó biến n được khai báo và có giá trị là 5. Việc khởi tạo giá trị cũng cần phải chú ý đến kiểu dữ liệu của biến để tránh xảy ra lỗi không như mong muốn. Ví dụ khai báo:

    int n = 3.125;

Kết quả giá trị của n nhận được là 3. Dưới đây là một số kiểu dữ liệu trong ngôn ngữ C++.


3) Kiểu dữ liệu

Sau đây là một số kiểu dữ liệu chuẩn của C++:
Loại dữ liệu Kiểu dữ liệu Kích cỡ Miền giá trị
Kiểu Bool bool 1 byte true hoặc false
Kiểu ký tự char 1 byte 256 ký tự
Kiểu số nguyên int 2 bytes - 32768 đến 32767
unsigned int 2 bytes 0 đến 65535
long 4 bytes -2,147,483,648 đến 2,147,483,647
unsigned long 4 bytes 0 đến 4,294,967,295
Kiểu số thực float 4 bytes 1.2e-38 đến 3.4e38
double 8 bytes 2.2e-308 đến 1.8e308

(còn tiếp)

[C++] 1.3 Một số phép toán trong C++

Đăng ngày: 14:59 27-08-2010
Thư mục: C++
1. Phép gán

Như ta đã biết, mỗi biến bao gồm 3 thuộc tính: địa chỉ, kích thước ô nhớ và giá trị của biến. Trong đó, địa chỉ và kích thước ô nhớ được giữ cố định trong suốt thời gian tồn tại của biến, chỉ có giá trị của biến mới có thể thay đổi được. Để thay đổi giá trị biến ta sử dụng một phép toán gọi là phép gán.

Phép gán được thực hiện nhờ sử dụng dấu = (bạn lưu ý đây không phải là phép so sánh bằng), trong đó biến cần gán đặt trước dấu = và giá trị cần gán cho biến đặt sau dấu =. Sau khi thực hiện phép gán thì giá trị cũ của biến sẽ mất đi và giá trị mới sẽ được thay vào đó.

+ Gán giá trị của một hằng số cho một biến. Ví dụ:

    n = 5;

Khi đó, giá trị của hằng số 5 được copy vào giá trị của n (5 → n).

+ Gán giá trị của một biến cho một biến. Ví dụ

    n = 5;
    m = n;

Giá trị của biến n (bằng 5) được copy vào giá trị của m (n → m).


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

Các phép toán số học được định nghĩa trong C++ bao gồm: + (cộng), - (trừ), * (nhân), / (chia) và % (lấy phần dư). Trong đó phép lấy phần dư không được sử dụng trong số thực. Ta có ví dụ sau:

    int n = 5;            //n = 5
    n = 5 / 2;            //n = 2
    n = 5 % 2;            //n = 1    n = 2*3 + (10 - 2)/4; //n = 8


3. Phép gán kết hợp với phép toán số học

Ví dụ ta có biểu thức gán.

    m = n + 1;
Trong biểu thức này xuất hiện hai phép toán, đó là = (phép gán) và + (phép cộng). Tuy nhiên phép toán nào được thực hiện trước?

Trong biểu thức chứa các phép toán số học và phép gán thì máy tính sẽ thực hiện các phép toán số học rồi mới đến thực hiện phép gán.

Trong biểu thức này, phép cộng được thực hiện trước (n + 1). Tuy nhiên, ở đây giá trị của n được lấy ra rồi cộng với 1 chứ giá trị của nó hoàn toàn không được thay đổi. Sau khi thực hiện phép cộng, thì giá trị của biểu thức (n + 1) được gán vào giá trị của n.

Ta có ví dụ khác:

    n = 5;
    n = n + 1;
Ở dòng thứ nhất, n có giá trị là 5.
Ở dòng thứ hai, trước tiên biểu thức vế phải được thực hiện trước và giá trị của n được "lôi" ra rồi cộng với 1 (trong phép cộng: n + 1). Sau đó giá trị của n + 1 ( 5 + 1 = 6 ) lại được gán vào biến n. Cuối cùng n có giá trị là 6. Như vậy n ở vế phải là giá trị cũ và n ở vế trái là giá trị mới (ta có thể đọc như sau cho dễ hiểu: n bằng n cũ cộng 1).

+ Các phép toán: +=, -=, *=, /=.

    n += 1; là cách viết rút gọn của n = n + 1;
    n -= 1; là cách viết rút gọn của n = n - 1;
    n *= 1; là cách viết rút gọn của n = n * 1;
    n /= 1; là cách viết rút gọn của n = n / 1;
+ Các phép toán: ++ (tăng) và -- (giảm).
    n++ và ++n đều có nghĩa là n = n + 1.
    n-- và --n đều có nghĩa là n = n -1.
Tuy nhiên trong biểu thức gán cần chú ý đến thứ tự ưu tiên, ví dụ:

    m = n++; //m = n; rồi mới n++; (m gán trước rồi n mới tăng)
    m = n--; //m = n; rồi mới n--; (m gán trước rồi n mới giảm)
    m = ++n; //++n; rồi mới m = n; (n tăng trước rồi m mới gán)
    m = --n; //--n; rồi mới m = n; (n giảm trước rồi m mới gán)

Ví dụ:

    n = 2;
    m = n++; //Kết quả m = 2 và n = 3
    k = --m; // Kết quả m = 1 và k = 1

4. Các phép toán so sánh
Các phép toán so sánh được định nghĩa trong C++ bao gồm:

    ==    (bằng)
    !=    (khác)
    >     (lớn hơn)
    >=    (lớn hơn hoặc bằng)
    <     (nhỏ hơn)
    <=    (nhỏ hơn hoặc bằng)
Kết quả của phép toán so sánh là một giá trị bool (true hoặc false). Ví dụ:

    int m = 5, n = 3;
    bool b;
    b = m < n; //Kết quả b = false;
    b = 7 != 8; //Kết quả b = true;


5. Phép gán có điều kiện

Phép gán có điều kiện được thực hiện bởi cặp dấu ?(hỏi) và : (hai chấm). Nhiều người gọi là phép toán này là "hỏi hai chấm". Cách viết của phép toán này như sau:

    n = dieukien ? giatri1 : giatri2;

Khi xuất hiện câu lệnh này, trước tiên máy tính kiểm tra xem dieukien có đúng hay không. Nếu đúng thì giá trị của biểu thức vế phải bằng giatri1. Nếu sai, giá trị của biểu thức vế phải bằng giatri2. Cuối cùng giá trị của biểu thức vế phải được gán cho biến n ở vế trái. Ta có ví dụ sau tìm hai số lớn nhất trong a và b:

    max = (a > b) ? a : b;

Trước tiên máy tính kiểm tra xem biểu thức a > b có đúng hay không. Nếu đúng thì giá trị vế phải bằng a và max = a. Nếu sai, giá trị vế phải bằng b và max = b.


6. Các phép toán logic
Các phép toán logic bao gồm:

    &&    (và)
    ||    (hoặc)
    !     (phủ định)

Chú ý các phép toán này thường không đứng độc lập mà được kết hợp với các phép toán so sánh. Ví dụ:

    int n = 3;
    bool b = (n >= 1) && (n <= 5);

Kết quả ta được b = true.
Chú ý. Trong biểu thức chứa đồng thời phép so sánh và phép logic thì phép so sánh được ưu tiên thực hiện trước. Vì vậy câu lệnh trên cũng có thể được viết:

    int n = 3;
    bool b = n >= 1 && n <= 5;
Khi đó, máy tính sẽ thực hiện:
    1) kiểm tra n >= 1 được giá trị bool b1 (trường hợp này b1 = true)
    2) kiểm tra n <= 5 được giá trị bool b2 (trường hợp này b2 = true)
    3) kiểm tra b1 && b2. Nếu cả b1 và b2 bằng true thì b bằng true, còn không thì b bằng false. Trường hợp này b = true.

Như vậy chúng ta đã tìm hiểu một số phép toán trong C++. Ngoài ra, còn một số phép toán nữa (ví dụ phép toán liên quan đến con trỏ) chúng ta sẽ đề cập đến sau.


[C++] 1.4 Vào / ra dữ liệu

Đăng ngày: 13:33 14-10-2010
Thư mục: C++
1. In dữ liệu ra màn hình với lệnh cout

C++ cho phép in dữ liệu ra màn hình bằng cách dùng lệnh cout. Theo cách này, bạn có thể ra lệnh cho máy tính in ra màn hình một số nguyên, số thực, ký tự hay hỗn hợp nhiều giá trị thuộc nhiều kiểu dữ liệu khác nhau. Để in ra một giá trị nào đó (chẳng hạn một số nguyên hay một ký tự ...) bạn đặt giá trị đó sau lệnh cout và hai dấu <<. Chẳng hạn, để in ra một số 5, ta viết như sau:

    cout<<5;
In ra một chữ A, ta viết:

    cout<<'A';
In ra giá trị của một biến:

    int n = 5;
    cout<<n;
In ra một xâu ký tự:

    cout<<"hello world";

In ra hỗn hợp nhiều kiểu giá trị:

    int a = 5;
    int b = 7;
    cout<<"Tong cua a va b la: "<<a + b;

Như vậy, so với hàm printf() của ngôn ngữ C thì lệnh cout của C++ sử dụng đơn giản hơn nhiều. Bạn không cần phải quan tâm đến kiểu dữ liệu của biến mà chỉ cần đặt biến cần in sau hai dấu << (cặp dấu << có ý nghĩa chỉ chiều của dữ liệu từ biến ra màn hình).


Ký tự điều khiển:Ký tự điều khiển là những ký tự đặc biệt không thể gõ vào từ bàn phím mà phải sử dụng mã của chúng. Chẳng hạn, để tạo một dấu xuống dòng ta dùng mã \n. Khi bạn viết:

    cout<<"Ha Noi\nHai Phong\nHung Yen";

kết quả in ra màn hình sẽ được như sau:

Ha Noi
Hai Phong
Hung Yen
Mỗi khi gặp ký tự ' \ ' mà đằng sau nó là ký tự ' n ' thì máy tính sẽ xuống dòng rồi mới in tiếp. Lưu ý, ký tự ' \ ' là một ký tự đặc biệt. Một ký tự đặc biệt thì không thể viết ra như các kỳ tự bình thường được mà phải thêm ký tự ' \ ' đằng trước nó. Ta có bảng các ký tự đặc biệt:


Ký tự Mô tả
\a xóa trái
\b tiếng bíp
\t dấu cách ngang
\v dấu cách đứng
\n xuống dòng
\f xuống dưới
\r về đầu dòng
\" dấu "
\' dấu '
\? dấu ?
\\ dấu \
\0 mã null

Trình bày khi in
Chúng ta có thể trình bày kết quả in ra màn hình một cách nâng cao hơn bằng cách sử dụng các hàm của tập tin tiêu đề iomanip.h. Trước khi sử dụng các hàm dưới đây bạn nhớ phải khai báo:

    #include<iomanip.h>

1. Hàm setw (int n)
Khi gặp setw(n), máy tính sẽ tạo ra một khoảng trống có chiều dài bằng n ký tự rồi in tất cả những gì ngay sau cặp dấu "<<" vào khoảng trống này. Ví dụ:

    cout << "a =" << setw(10) << 123 << "\n";
    cout << "b =" << setw(10) << 12345;
Kết quả in ra màn hình:

   |← 10  →|
a =       123
b =     12345

2. Hàm setfill (char c)
Như vậy, hàm setw(int n) dùng để tạo ra một khoảng trống n ký tự. Nhưng nhiều khi khoảng trống này không được dùng hết, bạn muốn lấp đầy khoảng trống này bằng một ký tự nào đó thì dùng hàm setfill(char c). Ví dụ:

    cout << "a =" << setw(10) << setfill('x') << 123 << "\n";
Kết quả in ra màn hình:

   |← 10  →|
a =xxxxxxx123

3. Hàm setprecision (int n)
Ta dùng hàm setprecision(int n) khi muốn in ra một số thực có độ dài n số (có làm tròn).
    cout << "pi = " << setprecision(3) << 3.14159;

Kết quả in ra màn hình:
pi = 3.142

4. Hàm setbase (int n)
setbase (n) cho phép in ra một số trong cơ số n. Bạn lưu ý, n chỉ được phép nằm trong các giá trị: 8 (cơ số 8 oct), 10 (cơ số 10 dec), 16 (cơ số hex). Ví dụ:

    cout << "a = " << setbase(16) << 42;
Kết quả in ra màn hình:
a = 2d

Ngoài ra, còn một số hàm trình bày in nữa nhưng ít dùng.


2. Nhập dữ liệu vào từ bàn phím bằng lệnh cin
Ta dùng lệnh cin >> n; khi muốn người dùng nhập dữ liệu vào biến n. Khi xuất hiện lệnh này, việc đầu tiên là máy tính sẽ dừng lại màn hình để chờ người dùng nhập vào dữ liệu từ bàn phím. Người dùng bấm ký tự nào thì tại vị trí của con trỏ chuột nhấp nháy xuất hiện ký tự đó. Người dùng muốn kết thúc quá trình nhập dữ liệu thì bấm phím enter, khi đó giá trị trên màn hình sẽ chuyển vào giá trị của biến n, và tất nhiên giá trị của n sẽ thay đổi.

Như vậy, nếu bạn muốn người dùng nhập dữ liệu vào biến n nào đó thì bạn dùng lệnh cin >> n (cặp dấu >> có ý nghĩa chỉ chiều dữ liệu từ màn hình vào biến). Bạn in ra một thông báo trước đó để báo cho người dùng biết là họ sẽ cần phải nhập cái gì. Ta có ví dụ chương trình:

    #include<iostream.h>
    #include<conio.h>

    main()
    {
        int a, b;
        cout << "nhap a: " ; cin >> a;
        cout << "nhap b: " ; cin >> b;

        cout<<"Tong cua a va b la: " << a + b;
        getch();
    }



[Kết thúc Bài 1.4]


[C++] Bài 1.5: Điều khiển rẽ nhánh

Đăng ngày: 21:47 16-10-2010
Thư mục: C++
1. Điều khiển rẽ nhánh if

Trong cuộc sống có rất nhiều cái gọi là "nếu cái này thì cái kia". Chẳng hạn khi nếu điểm trung bình cuối năm của một học sinh lớn hơn hoặc bằng 5 thì cho phép học sinh đó được lên lớp, còn nếu không thì học sinh đó phải ở lại lớp.

Trong lập trình chúng ta cũng gặp rất nhiều trường hợp cần phải điều khiển cho máy tính chạy theo hướng này hay hướng kia nếu thỏa mãn một điều kiện nào đó. Ví dụ, khi tìm max của hai biến a và b. Đầu tiên, ta cho máy tính so sánh xem a có lớn hơn b hay không. Nếu có thì max = a, nếu không thì max = b.

    if(a > b) max = a;
    else max = b;


Như vậy, nếu a > b thì rẽ theo một hướng khác, nếu không thì lại rẽ theo một hướng khác. Cấu trúc của điều khiển IF:

    if(dieukien) lenh1;
    else lenh2;


Đầu tiên máy tính kiểm tra dieukien (là một biểu thức so sánh). Nếu dieukien có kết quả là true thì thực hiện lenh1, nếu không thì lenh1 không được thực hiện mà thực hiện lenh2. Trong trường hợp lenh1 hoặc lenh2 không phải là một lệnh mà là một khối lệnh gồm nhiều nhiều lệnh thì ta phải bao bọc các lệnh này bằng cặp dấu '{''}'. Ta lấy ví dụ trước nhưng tính thêm min của a và b:

    if(a > b)
    {
        max = a;
        min = b;
    }
    else    {
        max = b;
        min = a;
    }


Bạn lưu ý không nhiều khi chỉ cần if mà không cần else. Lưu ý nữa là khi viết if(a != 0) hoặc if(a != false) thì ta có thể viết tắt if(a).

Cấu trúc if lồng nhau
Trong nhiều trường hợp ta phải sử dụng các cấu trúc if lồng nhau. Ví dụ sau là chương trình giải và biện luận phương trình bậc hai ax2 + bx + c = 0

#include<iostream.h>
#include<conio.h>
#include<math.h>


main()
{
    float a, b, c, delta;
    cout << "Nhap a: "; cin >> a;
    cout << "Nhap b: "; cin >> b;
    cout << "Nhap c: "; cin >> c;

    delta = b*b - 4*a*c;  //Δ = b2 - 4ac

    if(delta < 0) cout << "\nPhuong trinh vo nghiem";
    else
    {
        if(delta == 0)
        {
            cout << "\nPhuong trinh co nghiem kep:";
            cout << "\nx1 = x2 = " << -b / (2 * a);
        }
        else
        {
            cout << "\nPhuong trinh co hai nghiem phan biet:";
            cout << "\nx1 = " << (-b - sqrt(delta)) / (2 * a);
            cout << "\nx2 = " << (-b + sqrt(delta)) / (2 * a);
        }
    }

    getch();
}
Trong ví dụ này ta gặp hàm sqrt(), hàm này thuộc thư viện math.h dùng để tính căn bậc hai.

Cấu trúc if ... else ifTrong nhiều trường hợp ta phải lựa chọn nhiều phương án nghĩa là phải điều khiển máy tính rẽ đi nhiều hướng khác nhau thì ta có thể dùng cấu trúc if ... else if. Trong ví dụ bài toán giải phương trình bậc hai ở trên ta có thể giải quyết theo cách này:

+ Nếu Δ < 0 thì phương trình vô nghiệm
+ Nếu Δ = 0  thì phương trình có nghiệm kép
+ Nếu Δ > 0 thì phương trình có hai nghiệm phân biệt

    if(delta < 0)
    {
        cout << "\nPhuong trinh vo nghiem";
    }
    else if(delta == 0)
    {
        cout << "\nPhuong trinh co nghiem kep:";
        cout << "\nx1 = x2 = " << -b / (2 * a);
    }
    else
    {
        cout << "\nPhuong trinh co hai nghiem phan biet:";
        cout << "\nx1 = " << (-b - sqrt(delta)) / (2 * a);
        cout << "\nx2 = " << (-b + sqrt(delta)) / (2 * a);
    }


Đến đây chắc chắn sẽ có nhiều bạn sẽ hỏi thế thì tại sao không viết như sau cho dễ hiểu:

    if(delta < 0)
    {
        cout << "\nPhuong trinh vo nghiem";
    }
    if(delta == 0)
    {
        cout << "\nPhuong trinh co nghiem kep:";
        cout << "\nx1 = x2 = " << -b / (2 * a);
    }
    if(delta > 0)
    {
        cout << "\nPhuong trinh co hai nghiem phan biet:";
        cout << "\nx1 = " << (-b - sqrt(delta)) / (2 * a);
        cout << "\nx2 = " << (-b + sqrt(delta)) / (2 * a);
    }


Viết như thế này cũng được nhưng như thế chúng ta đã bắt máy tính làm việc nhiều hơn (nghĩa là chạy lâu hơn). Theo cách viết này, máy tính sẽ phải kiểm tra đến 3 lần: if(delta < 0), if(delta == 0) và if(delta > 0). Còn trong cách viết ở trên, nếu trường hợp delta < 0 là đúng thì máy tính sẽ dừng lại mà không kiểm tra tiếp delta == 0 nữa. Chỉ khi nào kiểm tra delta < 0 là sai thì nó mới kiểm tra trường hợp tiếp theo: delta == 0 ...



2. Điều khiển rẽ nhánh switch
Trước khi tìm hiểu xem switch là gì thì bạn hãy quan sát ví dụ chương trình: nhập vào số hiệu nguyên tử của một nguyên tố trong bảng hệ thống tuần hoàn các nguyên tố hóa học, hãy in ra tên của nguyên tố đó:

#include<iostream.h>
#include<conio.h>


main()
{
    int Z;
    cout << "Nhap Z: "; cin >> Z;

    if(Z == 1) cout << "Hidro";
    else if(Z == 2) cout << "Heli";
    else if(Z == 3) cout << "Liti";
    else if(Z == 4) cout << "Beri";
    else cout << "Khong biet!!";

    getch();
}


Như bạn thấy trong ví dụ này ta phải so sánh Z với nhiều giá trị xác định với bằng so sánh ==. Ta có thể giải quyết bài toán này bằng điểu khiển switch.

Điều khiển rẽ nhánh switch được sử dụng khi phải lựa chọn một trong nhiều giá trị xác định. Cấu trúc:

switch ( a )
{
    case giatri1: lenh1; break;
    case giatri2: lenh2; break;
    ...
    case giatrin: lenhn; break;
    defalt: lenh0;
}


Quy trình máy tính thực hiện như sau:
Kiểm tra biến a:
+ Nếu a == giatri1 thì thực hiện lenh1 và thoát ngay (break), không kiểm tra tiếp nữa.
+ Nếu a == giatri2 thì thực hiện lenh2 và thoát ngay (break), không kiểm tra tiếp nữa.
...
+ Nếu a == giatrin thì thực hiện lenhn và thoát ngay (break), không kiểm tra tiếp nữa.
Trường hợp còn lại (defalt) thì thực hiện lenh0.

Trở về bài toán trên ta có thể viết:

#include<iostream.h>
#include<conio.h>


main()
{
    int Z;
    cout << "Nhap Z: "; cin >> Z;

    switch ( Z )
    {
        case 1: cout << "Hidro"; break;
        case 2: cout << "Heli"break;
        case 3: cout << "Liti"break;
        case 4: cout << "Beri"break;
        defalt: cout << "Khong biet!!";
    }

    getch();
}


Bạn thấy đấy, cấu trúc của switch sáng sủa hơn if ... else if, nhưng không phải lúc nào ta cũng dùng được switch. Ta có thể dùng if else để thay thế switch, nhưng ngược lại thì không. Đến đây ta kết thúc Bài 1.5.


[C++] Bài 1.6: Các vòng lặp

Đăng ngày: 10:58 17-10-2010
Thư mục: C++
1. Vòng lặp for
Cấu trúc:

    for(lenh1; dieukien; lenh2)
    {
        lenh3;
   
}

Qui trình:
1) Thực hiện lenh1. Lệnh này được thực hiện đầu tiên, nó là lệnh khởi tạo của vòng lặp nên chỉ được thực hiện duy nhất một lần trong quá trình lặp.
2) Kiểm tra dieukien. Nếu dieukien đúng thì chuyển sang bước 3, còn nếu không thì thoát khỏi vòng lặp.
3) Thực hiện lenh3. Đây là lệnh trung tâm của vòng lặp.
4) Thực hiện lenh2. Lệnh này là bước nhảy của vòng lặp.
Quay trở lại bước 2 ...

Như vậy, có thể tóm tắt như sau: lenh1 >> dieukien >> lenh3 >> lenh2 >> dieukien >> lenh3 >> lenh2 >> dieukien >> ... cứ như vậy cho đến khi nào dieukien sai thì dừng lại. Ta có ví dụ chương trình tính tổng S = 1 + 2 + ... + n:


#include<iostream.h>
#include<conio.h>


main()
{
    int S, n, i;
    cout << "Nhap n: "; cin >> n;
   
    S = 0;
    for(i = 1; i <= n; i++)
        S = S + i;

    cout << "Tong la: " << S;
    getch();
}

Giả sử với n = 3, quy trình máy tính thực hiện như sau:
0) S = 0;
1) i = 1;        kiểm tra i <= n đúng, S = S + i;(S = 0 + 1 = 1).
2) i++; (i = 2), kiểm tra i <= n đúng, S = S + i;(S = 1 + 2 = 3).
3) i++; (i = 3), kiểm tra i <= n đúng, S = S + i;(S = 3 + 3 = 6).
4) i++; (i = 4), kiểm tra i <=n sai, thoát vòng lặp
Kết quả được S = 6.

Để phục vụ cho vòng lặp for, người ta phải sử dụng đến một biến lặp (trong ví dụ trên là i). Nhưng nhiều khi biến này chỉ được sử dụng trong vòng for, khi đó bạn có thể khai báo biến ngay trong for, ví dụ:

    for(int i = 1; i <= n; i++)

Trong cú pháp vòng for có thể khuyết lenh1, dieukien, lenh2, nhưng dấu ; của lệnh đó thì không được khuyết, ví dụ:

#include<iostream.h>
#include<conio.h>


main()
{
    int S, n, i;
    cout << "Nhap n: "; cin >> n;
   
    S = 0; i = 1;
    for( ; i <= n; i++)
        S = S + i;

    cout << "Tong la: " << S;
    getch();
}


2. Vòng lặp while

Cấu trúc:

    while ( dieukien )
    {
        lenh;
    }


Quy trình máy tính thực hiện:
1) Kiểm tra dieukien, nếu dieukien đúng thì chuyển qua bước 2, còn nếu không thì thoát vòng lặp
2) Thực hiện lenh và quay trở lại bước 1.

Như vậy ta có thể tóm tắt quy trình thực hiện: dieukien >> lenh >> dieukien >> lenh ... cứ như vậy cho đến khi nào dieukien sai thì dừng lại. Quay trở lại bài toán tính tổng, ta có thể viết bằng vòng lặp while như sau:

#include<iostream.h>
#include<conio.h>


main()
{
    int S, n, i;
    cout << "Nhap n: "; cin >> n;
   
    S = 0; i = 1;
    while (i <= n)
    {
        S = S + i;
        i++;
    }

    cout << "Tong la: " << S;
    getch();
}

Quy trình máy tính thực hiện với n = 3:
0) S = 0; i = 1;
1) Kiểm tra i <= n đúng, S = S + i;(S = 0 + 1 = 1), i++;(i = 2).
3) Kiểm tra i <= n đúng, S = S + i;(S = 1 + 2 = 3), i++;(i = 3).
5) Kiểm tra i <= n đúng, S = S + i;(S = 3 + 3 = 6), i++;(i = 4).
7) Kiểm tra i <= n sai, thoát khỏi vòng lặp
Kết quả được S = 6.
Chú ý, trong trường hợp bạn muốn vòng lặp chạy mãi mãi mà không cần phải kiểm tra điều kiện nào thì bạn viết:

    while (1)
    {
        lenh;
    }



3. Vòng lặp do while

Nếu như vòng lặp while kiểm tra điều kiện trước rồi mới thực hiện lệnh thì ngược lại, vòng lặp do while thực hiện lệnh trước rồi mới kiểm tra điều kiện. Cấu trúc vòng lặp do while:

    do
    {
        lenh;
    }
    while ( dieukien );


Bạn chú ý dấu ; ở cuối cấu trúc này. Quy trình máy tính thực hiện:
1) Thực hiện lenh.
2) Kiểm tra dieukien, nếu đúng thì quay lại bước 1, còn nếu sai thì thoát vòng lặp.

Tóm tắt quy trình trình thực hiện: lenh >> dieukien >> lenh >> dieukien ... cứ như vậy cho tới khi dieukien sai thì dừng lại.

Cũng là chương trình tính tổng ở trên nhưng được viết theo vòng lặp do while như sau:

#include<iostream.h>
#include<conio.h>


main()
{
    int S, n, i;
    cout << "Nhap n: "; cin >> n;   

    S = 0; i = 1;
    do
    {
        S = S + i;
        i++;
    }
    while (i <= n);   

    cout << "Tong la: " << S;
    getch();
}

Quy trình máy tính thực hiện với n = 3:
0) S = 0;  i = 1;
1) S = S + i;(S = 0 + 1 = 1), i++;(i = 2), Kiểm tra i <= n đúng.
2) S = S + i;(S = 1 + 2 = 3), i++;(i = 3), Kiểm tra i <= n đúng.
3) S = S + i;(S = 3 + 3 = 6), i++;(i = 4), Kiểm tra i <= n sai.
Kết quả được S = 6.
Như vậy, bạn có thể sử dụng tùy ý một trong 3 vòng lặp, nhưng tùy vào từng bài toán mà ta nên sử dụng vòng nào cho code được sáng sủa.


4. Câu lệnh break và continue
Các lệnh break và continue được sử dụng trong các vòng lặp for, while, do while để giải quyết các bài toán một cách linh hoạt hơn. Khi gặp lệnh break, vòng lặp lập tức dừng lại mà không cần kiểm tra bất kỳ điều kiện nào. Ví dụ:

for(i = 1; i <= 5; i++)
{
    if(i == 3) break;
    cout << i << "\n";
}

Kết quả in ra màn hình:
1
2

Như trong ví dụ này, khi i == 3 sẽ thực hiện lệnh break và vòng for được dừng lại mà không in ra màn hình cout << i << "\n";

Nếu như break có tác dụng thoát khỏi vòng lặp tức khắc thì continue có tác dụng chuyển qua bước lặp tiếp theo. Ví dụ:

for(i = 1; i <= 5; i++)
{
    if(i == 3) continue;
    cout << i << "\n";
}

Kết quả in ra màn hình:
1
2
4
5

Khi kiểm tra i == 3 thì continue được gọi và chuyển qua bước lặp tiếp theo mà không thực hiện cout << i << "\n";
Như vậy, bạn có thể sử dụng các vòng lặp for, while, do while kết hợp các lệnh breakwhile để giải quyết rất nhiều các bài toán.

Không có nhận xét nào:

Đăng nhận xét