Bài giảng Ngôn ngữ lập trình C/C++ - Phạm Hồng Thái - Chương 1: Các khái niệm cơ bản của C++
Một ngôn ngữ lập trình (NNLT) bậc cao cho phép người sử dụng (NSD) biểu hiện ý tưởng của mình để giải quyết một vấn đề, bài toán bằng cách diễn đạt gần với ngôn ngữ thông thường thay vì phải diễn đạt theo ngôn ngữ máy (dãy các kí hiệu 0,1). Hiển nhiên, các ý tưởng NSD muốn trình bày phải được viết theo một cấu trúc chặt chẽ thường được gọi là thuật toán hoặc giải thuật và theo đúng các qui tắc của ngôn ngữ gọi là cú pháp hoặc văn phạm. Trong giáo trình này chúng ta bàn đến một ngôn ngữ lập trình như vậy, đó là ngôn ngữ lập trình C++ và làm thế nào để thể hiện các ý tưởng giải quyết vấn đề bằng cách viết thành chương trình trong C++.
Trước hết, trong mục này chúng ta sẽ trình bày về các qui định bắt buộc đơn giản và cơ bản nhất. Thông thường các qui định này sẽ được nhớ dần trong quá trình học ngôn ngữ, tuy nhiên để có một vài khái niệm tương đối hệ thống về NNLT C++ chúng ta trình bày sơ lược các khái niệm cơ bản đó. Người đọc đã từng làm quen với các NNLT khác có thể đọc lướt qua phần này.
Ví dụ 2 : Từ các thảo luận trên ta có thể viết một cách đầy đủ chương trình tính diện tích và chu vi của một hình chữ nhật. Để chương trình có thể tính với các bộ giá trị khác nhau của chiều dài và rộng ta cần lưu giá trị này vào trong các biến (ví dụ cd, cr). #include // khai báo tệp nguyên mẫu để dùng được cin, cout void main() // đây là hàm chính của chương trình { float cd, cr ; // khai báo các biến có tên cd, cr để chứa độ dài các cạnh cout > cd ; // nhập dữ liệu cout > cr ; cout << "Diện tích = " << cd * cr << '\n' ; // in kết quả cout << "Chu vi = " << 2 * (cd + cr) << '\n'; return ; } Chương trình này có thể gõ vào máy và chạy. Khi chạy đến câu lệnh nhập, chương trình dừng để chờ nhận chiều dài và chiều rộng, NSD nhập các giá trị cụ thể, chương trình sẽ tiếp tục thực hiện và in ra kết quả. Thông qua câu lệnh nhập dữ liệu và 2 biến cd, cr NSD có thể yêu cầu chương trình cho kết quả của một hình chữ nhật bất kỳ chứ không chỉ trong trường hợp hình có chiều dài 23 và chiều rộng 11 như trong ví dụ cụ thể trên. Định dạng thông tin cần in ra màn hình Một số định dạng đơn giản được chúng tôi trình bày trước ở đây. Các định dạng chi tiết và phức tạp hơn sẽ được trình bày trong các phần sau của giáo trình. Để sử dụng các định dạng này cần khai báo file nguyên mẫu ở đầu chương trình bằng chỉ thị #include . endl: Tương đương với kí tự xuống dòng '\n'. setw(n): Bình thường các giá trị được in ra bởi lệnh cout << sẽ thẳng theo lề trái với độ rộng phụ thuộc vào độ rộng của giá trị đó. Phương thức này qui định độ rộng dành để in ra các giá trị là n cột màn hình. Nếu n lớn hơn độ dài thực của giá trị, giá trị sẽ in ra theo lề phải, để trống phần thừa (dấu cách) ở trước. setprecision(n): Chỉ định số chữ số của phần thập phân in ra là n. Số sẽ được làm tròn trước khi in ra. setiosflags(ios::showpoint): Phương thức setprecision chỉ có tác dụng trên một dòng in. Để cố định các giá trị đã đặt cho mọi dòng in (cho đến khi đặt lại giá trị mới) ta sử dụng phương thức setiosflags(ios::showpoint). Ví dụ sau minh hoạ cách sử dụng các phương thức trên. Ví dụ 3 : #include // để sử dụng cout << #include // để sử dụng các định dạng #include // để sử dụng các hàm clrscr() và getch() void main() { clrscr(); // xoá màn hình cout << "CHI TIÊU" << endl << "=======" << endl ; cout << setiosflags(ios::showpoint) << setprecision(2) ; cout << "Sách vở" << setw(20) << 123.456 << endl; cout << "Thức ăn" << setw(20) << 2453.6 << endl; cout << "Quần áo lạnh" << setw(15) << 3200.0 << endl; getch(); // tạm dừng (để xem kết quả) return ; // kết thúc thực hiện hàm main() } Chương trình này khi chạy sẽ in ra bảng sau: CHI TIÊU ======== Sách vở 123.46 Thức ăn 2453.60 Quần áo lạnh 3200.00 Chú ý: toán tử nhập >> chủ yếu làm việc với dữ liệu kiểu số. Để nhập kí tự hoặc xâu kí tự, C++ cung cấp các phương thức (hàm) sau: cin.get(c): cho phép nhập một kí tự vào biến kí tự c, cin.getline(s,n): cho phép nhập tối đa n-1 kí tự vào xâu s. các hàm trên khi thực hiện sẽ lấy các kí tự còn lại trong bộ nhớ đệm (của lần nhập trước) để gán cho c hoặc s. Do toán tử cin >> x sẽ để lại kí tự xuống dòng trong bộ đệm nên kí tự này sẽ làm trôi các lệnh sau đó như cin.get(c), cin.getline(s,n) (máy không dừng để nhập cho c hoặc s). Vì vậy trước khi sử dụng các phương thức cin.get(c) hoặc cin.getline(s,n) nên sử dụng phương thức cin.ignore(1) để lấy ra kí tự xuống dòng còn sót lại trong bộ đệm. Ví dụ đoạn lệnh sau cho phép nhập một số nguyên x (bằng toán tử >>) và một kí tự c (bằng phương thức cin.get(c)): int x; char c; cin >> x; cin.ignore(1); cin.get(c); Vào/ra trong C Trong phần trên chúng tôi đã trình bày 2 toán tử vào/ra và một số phương thức, hàm nhập và định dạng trong C++. Phần này chúng tôi trình bày các câu lênh nhập xuất theo khuôn dạng cũ trong C. Hiển nhiên các câu lệnh này vẫn dùng được trong chương trình viết bằng C++, tuy nhiên chỉ nên sử dụng hoặc các câu lệnh của C++ hoặc của C, không nên dùng lẫn lộn cả hai vì dễ gây nhầm lẫn. Do đó mục này chỉ có giá trị tham khảo để bạn đọc có thể hiểu được các câu lệnh vào/ra trong các chương trình viết theo NNLT C cũ. In kết quả ra màn hình Để in các giá trị bt_1, bt_2, …, bt_n ra màn hình theo một khuôn dạng mong muốn ta có thể sử dụng câu lệnh sau đây: printf(dòng định dạng, bt_1, bt_2, ..., bt_n) ; trong đó dòng định dạng là một dãy kí tự đặt trong cặp dấu nháy kép (“”) qui định khuôn dạng cần in của các giá trị bt_1, bt_2, …, bt_n. Các bt_i có thể là các hằng, biến hay các biểu thức tính toán. Câu lệnh trên sẽ in giá trị của các bt_i này theo thứ tự xuất hiện của chúng và theo qui định được cho trong dòng định dạng. Ví dụ, giả sử x = 4, câu lệnh: printf(“%d %0.2f”, 3, x + 1) ; sẽ in các số 3 và 5.00 ra màn hình, trong đó 3 được in dưới dạng số nguyên (được qui định bởi “%d”) và x + 1 (có giá trị là 5) được in dưới dạng số thực với 2 số lẻ thập phân (được qui định bởi “%0.2f”). Cụ thể, các kí tự đi sau kí hiệu % dùng để định dạng việc in gồm có: d in số nguyên dưới dạng hệ thập phân o in số nguyên dạng hệ 8 x, X in số nguyên dạng hệ 16 u in số nguyên dạng không dấu c in kí tự s in xâu kí tự e, E in số thực dạng dấu phẩy động f in số thực dạng dấu phẩy tĩnh Các kí tự trên phải đi sau dấu %. Các kí tự nằm trong dòng định dạng nếu không đi sau % thì sẽ được in ra màn hình. Muốn in % phải viết 2 lần (tức %%). Ví dụ câu lệnh: printf(“Tỉ lệ học sinh giỏi: %0.2f %%”, 32.486) ; sẽ in câu “Tỉ lệ học sinh giỏi: “, tiếp theo sẽ in số 32.486 được làm tròn đến 2 số lẻ thập phân lấp vào vị trí của “%0.2f”, và cuối cùng sẽ in dấu “%” (do có %% trong dòng định dạng). Câu được in ra màn hình sẽ là: Tỉ lệ học sinh giỏi: 32.49% Chú ý: Mỗi bt_i cần in phải có một định dạng tương ứng trong dòng định dạng. Ví dụ câu lệnh trên cũng có thể viết: printf(“%s %0.2f” , “Tỉ lệ học sinh giỏi: “, 32.486); trong câu lệnh này có 2 biểu thức cần in. Biểu thức thứ nhất là xâu kí tự “Tỉ lệ học sinh giỏi:” được in với khuôn dạng %s (in xâu kí tự) và biểu thức thứ hai là 32.486 được in với khuôn dạng %0.2f (in số thực với 2 số lẻ phần thập phân). Nếu giữa kí tự % và kí tự định dạng có số biểu thị độ rộng cần in thì giá trị in ra sẽ được gióng cột sang lề phải, để trống các dấu cách phía trước. Nếu độ rộng âm (thêm dấu trừ - phía trước) sẽ gióng cột sang lề trái. Nếu không có độ rộng hoặc độ rộng bằng 0 (ví dụ %0.2f) thì độ rộng được tự điều chỉnh đúng bằng độ rộng của giá trị cần in. Dấu + trước độ rộng để in giá trị số kèm theo dấu (dương hoặc âm) Trước các định dạng số cần thêm kí tự l (ví dụ ld, lf) khi in số nguyên dài long hoặc số thực với độ chính xác gấp đôi double. Ví dụ 4 : main() { int i = 2, j = 3 ; printf(“Chương trình tính tổng 2 số nguyên:\ni + j = %d”, i+j); } sẽ in ra: Chương trình tính tổng 2 số nguyên: i + j = 5. Nhập dữ liệu từ bàn phím scanf(dòng định dạng, biến_1, biến_2, ..., biến_n) ; Lệnh này cho phép nhập dữ liệu vào cho các biến biến_1, …, biến_n. Trong đó dòng định dạng chứa các định dạng về kiểu biến (nguyên, thực, kí tự …) được viết như trong mô tả câu lệnh printf. Các biến được viết dưới dạng địa chỉ của chúng tức có dấu & trước mỗi tên biến. Ví dụ câu lệnh: scanf(“%d %f %ld”, &x, &y, &z) ; cho phép nhập giá trị cho các biến x, y, z trong đó x là biến nguyên, y là biến thực và z là biến nguyên dài (long). Câu lệnh: scanf(“%2d %f %lf %3s”, &i, &x, &d, s); cho phép nhập giá trị cho các biến i, x, d, s, trong đó i là biến nguyên có 2 chữ số, f là biến thực (độ dài tùy ý), d là biến nguyên dài và s là xâu kí tự có 3 kí tự. Giả sử NSD nhập vào dãy dữ liệu: 12345 67abcd ¿ thì các biến trên sẽ được gán các giá trị như sau: i = 12, x = 345, d = 67 và s = “abc”. Kí tự d và dấu enter (¿) sẽ được lưu lại trong bộ nhớ và tự động gán cho các biến của lần nhập sau. Cuối cùng, chương trình trong ví dụ 3 được viết lại với printf() và scanf() như sau: Ví dụ 5 : #include // để sử dụng các hàm printf() và scanf() #include // để sử dụng các hàm clrscr() và getch() void main() { clrscr(); // xoá màn hình printf("CHI TIÊU\n=======\n") ; printf("Sách vở %20.2f\n" , 123.456) ; printf("Thức ăn %20.2f\n" , 2453.6) ; printf(“Quần áo lạnh %15.2f\n" , 3200.0) ; getch(); // tạm dừng (để xem kết quả) return ; // kết thúc thực hiện hàm main() } BÀI TẬP Những tên gọi nào sau đây là hợp lệ: - x - 123variabe - tin_hoc - toan tin - so-dem - RADIUS - one.0 - number# - Radius - nam2000 Bạn hãy thử viết một chương trình ngắn nhất có thể được. Tìm các lỗi cú pháp trong chương trình sau: #include (iostream.h) void main(); / Giải phương trình bậc 1 { cout << 'Day la chương trình: Gptb1.\nXin chao cac ban'; getch(); } Viết chương trình in nội dung một bài thơ nào đó. Viết chương trình in ra 4 dòng, 2 cột gồm các số sau và gióng cột: - thẳng theo lề trái 0.63 64.1 - thẳng theo lề phải 12.78 -11.678 - thẳng theo dấu chấm thập phân -124. 6 59.002 65.7 -1200.654 Hãy viết và chạy các chương trình trong các ví dụ 3, 5. Chương trình sau khai báo 5 biến kí tự a, b, c, d, e và một biến số nam. Hãy điền thêm các câu lệnh vào các dòng … để chương trình thực hiện nhiệm vụ sau: Nhập giá trị cho biến nam Nhập giá trị cho các biến kí tự a, b, c, d, e. In ra màn hình dòng chữ được ghép bởi 5 kí tự đã nhập và chữ "năm" sau đó in số đã nhập (nam). Ví dụ nếu 5 chữ cái đã nhập là 'H', 'A', 'N', 'O', 'I' và nam được nhap là 2000, thì màn hình in ra dòng chữ: HANOI năm 2000. Nhập chương trình đã sửa vào máy và chạy để kiểm tra kết quả. #include #include main() { int nam; char a, b, c, d, e; clrscr(); cin >> nam ; … ; cin.get(a); cin.get(b); cin.get(c); … ; … ; // in kết quả cout << a << … << … << … << … << " nam " << … ; getch(); }
File đính kèm:
- Bài giảng Ngôn ngữ lập trình CC++ - Phạm Hồng Thái - Chương 1 Các khái niệm cơ bản của C++.doc