• Khi cin được gọi thực hiện nó kiểm tra vùng đệm dành cho dữ liệu nhập nếu đã có dữ liệu thì nó lấy đúng phần dữ liệu mà nó cần phụ thuộc vào kiểu dữ liệu của biến mà nó đang nhập giá t
Trang 1TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG PHÒNG TRUNG CẤP CHUYÊN NGHIỆP & DẠY NGHỀ
-# " -
MÔN HỌC
GIẢNG VIÊN: ThS LÊ VĂN HẠNH
Trang 2TỔNG QUAN 1
I MỞ ĐẦU:
1/- Lập trình: (Programming) là một quá trình viết chương trình bằng một ngôn ngữ nào đó mà máy tính có thể thực hiện và những người lập trình khác có thể hiểu
2/- Các bước trong giai đoạn lập trình:
Bước 1 : GIẢI THUẬT
• Nghĩ ra cách giải ( giải thuật)
• Làm rõ ràng giải thuật : bằng cách phân đoạn giải thuật thông qua các hình vẽ, sơ đồ Thông thường, người ta dùng lưu đồ (Flow Chart) để trình bày giải thuật
Bước 2 : VIẾT CHƯƠNG TRÌNH
• Viết phần lõi của thân chương trình
• Thêm các phần nhập và xuất
• Thêm các phần khai báo
Bước 3 : CHẠY THỬ, SỬA CHỮA
• Chạy thử chương trình trình nhiều lần, sửa chữa những lỗi nhỏ
• Sửa chữa, cải tiến chương trình
Bước 4 : TỔNG KẾT
• Thêm những ghi chú cho chương trình như :
Mục đích của cả chương trình
Mục đích của 1 đoạn chương trình hay 1 phát biểu
3/- Thuật toán (Algorithm):
a/- Thuật toán: là một dãy các bước chặt chẽ và rõ ràng, xác định một trình tự các thao tác trên một số đối tượng nào đó sao cho một số hữu hạn lần thực hiện ta thu được kết quả như mong đợi
b/- Các đặc trưng của thuật toán:
Tính dừng (tính kết thúc): Một thuật toán bao giờ cũng phải dừng sau một số hữu hạn các bước thực hiện
Tính phổ dụng : thuật toán có thể giải bất kỳ bài toán nào trong một lớp các bài toán Cụ thể là thuật toán có thể làm việc với các dữ liệu khác nhau và luôn dẫn đến một kết quả mong muốn
Ví dụ : chương trình Giải phương trình bậc hai phải cho kết quả luôn đúng với các dữ liệu số nhập vào cho a,b,c là bất kỳ (số nguyên, số thực, số dương, số âm .)
Trang 3Lê Văn Hạnh – Nguyễn Việt Hùng Feb09 2
c/- Một thuật toán không phải là một chương trình, nó có thể được mô tả bởi một trong ba cách
• Mã giả (pseudocode)
• Dùng các phương trình toán học (formula)
• Dùng các biểu tượng được quy định để biểu diễn giải thuật (flowchart) Trong đó pseudocode thường được sử dụng
4/- Giải thuật:
a/- Giải thuật:
Trong khi tìm kiếm lời giải cho các bài toán trong thực tế, người ta nhận ra rằng:
• Có những bài toán đến nay vẫn chưa xác định được liệu có tồn tại một thuật toán để giải quyết hay không?
• Có những bài toán đã có thuật toán đễ giải nhưng, nhưng không chấp nhận được do:
Thời gian để giải bài toán theo thuật toán đó quá lớn
Các điều kiện kỹ thuật cho thuật toán khó đáp ứng
• Có những bài toán có thể giải được một cách hữu hiệu bằng một lời giải nào đó, nhưng lời giải này lại vi phạm một số tính chất của thuật toán
Trong thực tiễn, có rất nhiều trường hợp người ta chấp nhận các cách giải thường cho kết quả tốt (tất nhiên không phải lúc nào cũng tốt) nhưng ít phức tạp, hiệu quả và khả thi
Do đó, người ta mở rộng khái niệm thuật toán (giúp cho thuật toán bớt
“cứng nhắc”) bằng một khái niệm mới là giải thuật Giải thuật là những cách giải không hoàn toàn đáp ứng đầy đủ các tính chất của một thuật toán nhưng vẫn cho kết quả gần đúng Hiện nay đã có những giải thuật đệ quy, giải thuật ngẫu nhiên, giải thuật Heuristic,
Để thuận tiện, trong tài liệu này sẽ sử dụng khái niệm giải thuật để chỉ chung cho thuật toán và giải thuật
5/- Lưu đồ chương trình:
a)- Khái niệm : Còn được gọi là sơ đồ khối Là sơ đồ thể hiện các bước của giải thuật liên quan đến một vấn đề nào đó được đưa vào giải quyết bằng máy tính
b)- Các ký hiệu dùng trong lưu đồ:
nhập xuất
Chức năng của công việc vào ra dữ liệu
xử lý Nhóm lệnh để thự hiện một chức năng nào đó của
chương trình
Trang 4chương trình con
chương trình con đã định nghĩa
quyết định
Quyết định rẽ nhánh nào căn cứ vào điều kiện chỉ định được ghi trong khối Trong một số trường hợp, hình thoi được mở rộng thành 1 hình đa giác có nhiều đường ra, ứng với các giá trị của biểu thức bên trong
Hướng xử lý của lưu đồ
nối trang Điểm vào hay điểm ra của từng trang trong lưu đồ
chương trình
điểm cuối
Điểm đầu hay điểm cuối của lưu đồ
Nối Điểm vào hay điểm ra của từng phần trong lưu đồ
chương trình
c)- Một số ví dụ biểu diễn thuật toán bằng lưu đồ:
c.1.- Thuật toán không phân nhánh:
Ví dụ: Tính A=b2+c2 Với b và c được nhập vào từ bàn phím (hình 1) c.2.- Thuật toán có phân nhánh:
Ví dụ 1: Cho nhập 3 số, in ra giá trị lớn nhất trong 3 số (hình 2)
Begin Nhập b, c A=b 2 +c 2
Xuất A End (Hình 1)
Begin Nhập a, b, c
Xuất Max
a > b Max = b Max = a
Max < c Max = c
Trang 5Lê Văn Hạnh – Nguyễn Việt Hùng Feb09 4
Ví dụ 2: Giải phương trình bậc 1 ax+b=0 Với a,b được nhập vào(hình 3)
Ví dụ 3: Giải phương trình bậc 2 ax2 + bx + c =0 Với a, b, c được nhập vào (hình 4)
c.3.- Thuật toán lặp có chu trình:
Ví dụ 4: Nhập n Tính tổng các số từ 1 đến n Ví dụ này có thể thực hiện bằng 2 cách (cách 1: hình 5, cách 2: hình 6)
Xuất x 1 = -b+sqrt(delta)/2*a Xuất x 2 = -b-sqrt(delta)/2*a
Xuất “PTVN”
delta=b*b -4ac
delta = 0
S Xuất –b/2a
Đ
Đ
Begin Nhập n I=1; S=0
Trang 66/- Mã giả (pseudocode):
a)- Khái niệm:
• Là viết nội dung chương trình bằng ngôn ngữ tự nhiên giản lược
• Thông thường, người ta dùng lưu đồ hay mã giả để diễn đạt thuật toán thay cho diễn đạt bằng bản thân ngôn ngữ lập trình
b)- Quy ước :
• Phải dễ hiểu, dễ nhớ, nhất quán và không có sự hiểu lầm
• Có thể dùng các từ khóa của ngôn ngữ đang dùng, hoặc có thể sử dụng một số từ khóa đã được quy ước trước
c)- Ví dụ : viết chương trình cho người dùng nhập 1 số nguyên dương (n) Tính tổng các số từ 1 đến n
B1: Nhập số n B2: Tổng=0 B3: Số đang xét=1 B4: Thực hiện khi Số đang xét <=n Cộng dồn Số đang xét vào biến Tổng Tăng số đang xét lên 1 đơn vị kỳ
Ngôn ngữ lập trình có thể phân loại theo hai cách:
• Ngôn ngữ bậc cao – ngôn ngữ bậc thấp
• Ngôn ngữ hướng thủ tục – ngôn ngữ hướng đối tượng
C++ là một ngôn ngữ bậc cao có chứa các đặc trưng của cả hai loại ngôn ngữ hướng thủ tục – ngôn ngữ hướng đối tượng
2/- Cấu trúc đơn giản của chương trình C++:
// Các chỉ thị tiền xử lý
#include <tên tập tin h>
#define // Hàm main Void main() a)- Các chỉ thị tiền xử lý:
#include <tên tập tin h>: dùng để chèn nội dung của một file khác vào chương trình nguồn tại đúng vị trí mà chỉ thị include xuất hiện
Trang 7Lê Văn Hạnh – Nguyễn Việt Hùng Feb09 6
#define: dùng để định nghĩa các tên hằng số (constant) và các macro có phạm vi sử dụng trong toàn chương trình hoặc cho đến khi được định nghĩa lại sau chỉ thị #undef
b)- Hàm main():
Các dạng của hàm main:
return 0;
} 3)- Viết chương trình với C++:
Mỗi chương trình trong C++ phải có một và duy nhất một hàm main Hàm này được xem như hàm điều khiển, bởi vì nó điểu khiển (gọi thực hiện) các module khác
Các lệnh của một hàm phải đặt giữa cặp dấu {}
Cuối mỗi lệnh trong hàm phải có dấu chấm phẩy (;)
Trên một dòng có thể chứa nhiều lệnh
Trong ngôn ngữ C++, có phân biệt ký tự hoa/thường đối với các hằng chuỗi, danh định, và từ khóa
Một lệnh có thể viết trên nhiều dòng, ngoại trừ các hằng chuỗi, danh định, và từ khóa
Tuy nhiên ta nên trình bày chương trình một cách rõ ràng để dễ đọc và sửa chữa, ví dụ sau đây cũng là một chương trình có thể thực hiện được nhưng nó là điển hình cho một cách trình bày chương trình vô cùng kém:
#include <iostream.h>
int main() { cout <<
“Hello” ; return 0;
}
4/- Các lỗi thường gặp khi viết chương trình:
Bỏ sót cặp ngoặc đơn -( )- sau từ khóa main
Bỏ sót hoặc đánh không chính xác dấu { ở tại vị trí bắt đầu thân của một hàm
Bỏ sót hoặc đánh không chính xác dấu } ở tại vị trí kết thúc của một hàm
Trang 8Gõ thiếu hoặc sai tên của một đội đối tượng hoặc hàm ví dụ cot hay Cout (chữ C viết hoa) thay vì cout
Không đặt hằng chuỗi vào cặp dấu nháy kép “”
Thiếu dấu chấm phẩy (;) sau mỗi câu lệnh
Dư dấu chấm phẩy (;) sau từ khóa main ”main();“
III BIẾN VÀ KHAI BÁO BIẾN:
1/- Khái niệm về biến:
Biến là tên do người lập trình đặt ra dùng để tham khảo tới một vùng nhớ trong máy tính
Một biến có thể chứa một giá trị phù hợp với kiểu dữ liệu mà ta đã khai báo cho nó
Giá trị trong biến có thể thay đổi được trong chương trình
Tên biến gồm chữ cái, ký số, dấu nối (_) và không được bắt đầu bằng ký số
Biến khai báo trong một khối được gọi là biến cục bộ, biến không thuộc khối nào gọi là biến toàn cục
Biến có tác dụng trong toàn khối kể từ lúc được khai báo
2/- Cú pháp:
<data type> variable_name1, variable_name2;
Ví dụ: int sum;
long int datenum;
Ví dụ:
#include <iostream.h>
void main() { float dmon1,dmon2,d_tb;
dmon1=9.5;
dmon2=8.0;
Trang 9Lê Văn Hạnh – Nguyễn Việt Hùng Feb09 8
IV CÁC ĐỐI TƯỢNG NHẬP – XUẤT:
1/- Đối tượng xuất (cout )
a)- Công dụng: xuất dữ liệu ra màn hình
c)- Định dạng kết quả khi in lên màn hình:
C++ cung cấp một số công cụ để định dạng kết quả khi in lên màn hình là:
• endl : dùng khi muốn xuống dòng
• setw(n) : ấn định độ rộng để in một số là n
• setprecision(n) : ấn định số chữ số thập phân sẽ hiển thị
• dec : hiển thị giá trị số ở hệ thập phân
• hec : hiển thị giá trị số ở hệä thập lục phân
• oct : hiển thị giá trị số ở hệä bát phân
Lưu ý: ngoại trừ endl, muốn sử dụng các định dạng thì trong chương trình ta phải khai báo :
{ cout <<setw(5) <<12 //kết quả “ 12”
cout <<setw(10) <<setiosflags(ios::left) <<12 // 12
cout <<hex <<15 //kết quả F
cout <<oct <<10 // kết quả 12
cout <<dec <<0x10 /* kết quả 16 (để trình bày
một số trong hệ thập lục ta đặt thêm 0x phía trước)*/
Trang 10cout <<dec <<012 /* kết quả 10 (để trình bày
một số trong hệ bát phân ta đặt //thêm 0 phía trước) */ }
2/- Đối tượng nhập (cin):
a)- Công dụng: cho phép chúng ta nhập giá trị vào biến từ bàn phím khi chương trình thực hiện
b)- Cú pháp:
cin >> variable_name1 >> variable_name2 ;
c)- Ví dụ: chương trình sau khi thực hiện cho phép nhập vào 2 số nguyên sau đó in ra tích của hai số nguyên này
#include <iostream.h>
void main(void) { int so1,so2,tich;
cout << "Nhap so thu 1: ";
Ví dụ : lệnh sau dùng để nhập giá trị cho hai biến num1 và num2
cin >>num1 >>num2;
Khi chương trình thực hiện giả sử ta muốn nhập 5 cho num1 và 10 cho num2 thì ta phải nhập như sau: 5∪10 ↵ hoặc 5↵10↵
#include <iostream.h>
void main(void) {
Trang 11Lê Văn Hạnh – Nguyễn Việt Hùng Feb09 10
Hai đặc điểm của cin:
• Tự động chuyển đổi dữ liệu của giá trị nhập vào cho phù hợp với kiểu dữ liệu của biến khi cần thiết
• Khi cin được gọi thực hiện nó kiểm tra vùng đệm dành cho dữ liệu nhập nếu đã có dữ liệu thì nó lấy đúng phần dữ liệu mà nó cần (phụ thuộc vào kiểu dữ liệu của biến mà nó đang nhập giá trị), nếu như chưa có thì nó sẽ chờ cho đến khi dữ liệu đã nhập
Do hai đặc điểm trên khi nhập dữ liệu nếu ta nhập không chính xác sẽ ảnh hưởng đến giá trị của những biến được nhập sau đó Xét các chương trình ví dụ sau:
Ví dụ 1:
#include <iostream.h>
void main(void) { char kt1,kt2;
//giả sử ta nhập vào a1 rồi enter thì màn hình sẽ hiện tiếp Nhap so: Nhap ky tu thu 2: c ↵
// Tại đây ta thấy không thể nhập được giá trị cho biến so // mà chỉ có thể nhập giá trị cho biến kt2 giả sử ta nhập ký tự c // rồi enter thì bước kế tiếp trên màn hình xuất hiện a 1 c
Như vậy có nghĩa biến kt1 có giá trị là a biến so có giá trị là 1 còn biến kt2 có giá trị là c
Nguyên nhân là tại thời điểm nhập giá trị cho biến kt1 ta gỏ a1 ↵ thì chỉ có ký tự a được lưu vào biến kt1 còn giá trị 1 vẫn còn trên vùng đệm Khi gặp lệnh nhập giá trị cho biến số (cin >>so) do vùng đệm vẫn còn lưu lại giá trị số
1 nên lấy giá trị này lưu vào biến số rồi cho thực hiện tiếp các lệnh còn lại
Trang 12Ví dụ 2:
#include <iostream.h>
void main(void) {
float so1,so3;
int so2;
cout << "Nhap 3 so ";
cin >> so1 >>so2 >> so3;
cout <<so1 <<" " <<so2 <<" " <<so3;
} giả sử khi chương trình thực hiện ta nhập dữ liệu như sau:
2.6:4.5:6.2 thì kết quả in lên màn hình sẽ là: 2.6 4 0.5
Tóm lại khi nhập dữ liệu cho biến ta phải cẩn thận để tránh tình trạng dữ liệu không chính xác
V CÁC KIỂU DỮ LIỆU:
Có ba loại dữ liệu cơ bản được dùng trong C++: số nguyên (integer), số thực (floating point numbers) và ký tự (character)
2/- Số thực:
Là bất kỳ một giá trị số nào có phần thập phân phía sau
Ví dụ: 0.0; 2.5179; 5.0123;
Trang 13Lê Văn Hạnh – Nguyễn Việt Hùng Feb09 12
Phân loại kiểu dữ liệu số thực trong C++:
Tên kiểu Kích
thước Miền giá trị Nhỏ nhất Lớn nhất
long double 10 1.2E +/- 4932 (19 digits) LDBL_MIN LDBL_MAX
Khi ghi một số thực trong chương trình ta có sự phân biệt như sau:
• Có ký hiệu f phía sau là giá trị thuộc kiểu float
• Có ký hiệu l phía sau là giá trị thuộc kiểu long double
• Ví dụ: 9.234 thuộc kiểu double
9.234f thuộc kiểu float 9.234l thuộc kiểu long double
Các cách trình bày số thực:
Dạng thập phân chuẩn Dạng số mũ Dạng khoa học
1652
63421
.00731 000625
1.625e36.3421e47.31e-3 6.25e-4
1.625x103 6.3421x104 7.31x10-36.25x10-4
3/- Ký tự:
Kiểu ký tự bao gồm 256 ký tự trong đó bao gồm các chữ cái (chữ thường và chữ hoa), chữ số, các dấu, một số các ký hiệu
Phân loại kiểu dữ liệu ký tự trong C++:
Tên kiểu Bytes Tên gọi khác Miền giá trị
Trong chương trình, để trình bày một hằng ký tự ta đặt vào dấu nháy đơn:
‘a’ , ‘D’ , …
Các ký tự với ý nghĩa đặc biệt:
Trang 14VI TOÁN TỬ TRONG C++:
1/- Toán tử số học:
Mỗi phép toán số học sẽ kết hợp 2 toán hạng
% Phép chia lấy phần dư Chỉ áp dụng cho hai số nguyên
- Phép trừ
a/- Xác định kiểu dữ liệu của kết quả trong phép toán số học:
Nếu cả hai toán hạng là số nguyên thì kết quả thuộc kiểu nguyên
Nếu có một toán hạng nào là kiểu số thực thì kết quả thuộc kiểu thực
b/- Sự kết hợp và độ ưu tiên của các toán tử:
Hai phép toán 2 ngôi không bao giờ đứng cạnh nhau
Phần biểu thức được đặt trong ngoặc sẽ được ưu tiên tính toán trước
Có thể có nhiều cặp dấu ngoặc được sử dụng lồng vào nhau, khi đó biểu thức đặt ở ngoặc trong cùng có ưu tiên cao nhất
Độ ưu tiên của các phép toán theo thứ tự liệt kê ở bảng trên Nếu có 2 phép toán giống nhau trong cùng biểu thức thì thứ tự xét độ ưu tiên là từ trái sang phải
Dấu ngoặc không thể thay thế cho ký hiệu trong phép nhân
Ví du:ï không thể viết (3+4)(5+1) mà phải viết (3+4)*(5+1)
2/- Các toán tử quan hệ (relational operators):
Công dụng: tạo ra các điều kiện mà dựa vào đó một chương trình có thể giải quyết vấn đề mềm dẻo, linh hoạt
Các biểu thức sử dụng toán tử quan hệ gọi là biểu thức quan hệ (relation expression)
Một biểu thức quan hệ đơn giản gồm một toán tử quan hệ kết hợp với hai biến hoặc hai giá trị hằng Các toán tử này có thể áp dụng trên các kiểu dữ liệu: số nguyên, số thực, ký tự
Các toán tử quan hệ trong C++ sau:
<= So sánh nhò hơn hoặc bằng trongluong<=80
>= So sánh nhò hơn hoặc bằng soluong>=100
Trang 15Lê Văn Hạnh – Nguyễn Việt Hùng Feb09 14
Một biểu thức quan hệ chỉ dùng 1 phép toán quan hệ gọi là biểu thức quan hệ đơn giản
Ví dụ: #include <iostream.h>
void main(void) { char ch1,ch2;
ch1='a';
ch2='b';
cout << (ch1>ch2) ; }
Giá trị của biểu thức ghép được cho trong bảng sau Trong đó true =1 và false
=0:
False False False False True True False False True False False True False True True True True True True False
Ví dụ: Ta có biểu thức sau:
• (tuoi<=30) && (cao>1.50) // biểu thức trên có giá trị bằng 1 khi
// giá trị của biến tuoi >30 và giá trị của biến cao phải >1.5
4/- Toán tử một ngôi:
Trong chương trình chúng ta cũng thường sử dụng các lệnh tăng hoặc giảm giá trị của biến đếm đi 1
ví dụ như:
i=i+1; hoặc i=i-1;
Thay vì viết như trên ta có thể viết:
i++(hay ++i) hoặc i hay( i )
Các phép toán ++, như trên gọi phép toán một ngôi
Việc đặt phép toán một ngôi trước hoặc sau tên biến có sự khác nhau khi sử dụng phép toán này chung với các phép toán khác:
• Nếu phép toán một ngôi đặt trước tên biến thì giá trị của biến sẽ tăng/giảm
1 trước khi thục hiện những phép toán khác
• Nếu phép toán một ngôi đặt sau tên biến thì giá trị những phép toán khác sẽ được thực hiện trước sau đó mới tăng/giảm giá trị biến đi 1
Trang 165/- Toán tử trên bit:
Toán tử trên bit chỉ có tác dụng trên các kiểu số nguyên
>> Shift phải A << n = A*(2n)
<< Shift trái A >> n = A/(2n)
6/- Toán tử sizeof:
Dùng để xác định kích thước của một loại dữ liệu hoặc một biến
Ví dụ:
cout <<”kich thước kiểu int là:” <<sizeof(int);
7/- Độ ưu tiên của các phép toán:
Toán tử Độ ưu tiên Trình tự kết hợp
! ~ ++ - + * & sizeof 2 Từ phải qua trái
< <= >= > 6 Từ trái qua phải
Trang 17Lê Văn Hạnh – Nguyễn Việt Hùng Feb09 16
8/- Các lỗi thường gặp:
Quên khai báo các biến sử dụng trong chương trình
Lưu một giá trị vào một biến nhưng không cùng kiểu dữ liệu với biến
Sử dụng biến trong một biểu thức khi nó chưa có giá trị Lỗi này thí không được phát hiện bởi rình biên dịch, khi đó giá trị của biến là một giá trị bất kỳ và kết quả của biểu thức là vô nghĩa
Sử dụng giá trị của phép chia không chính xác Lỗi này thường xuất hiện trong các biểu thức có nhiều toán hạng và lỗi này rất khó phát hiện
Ví dụ: 3.2+ 2/3+ 1.5 thì kết quả sẽ bằng 4.7 thay vì phải bằng 5.3
Sử dụng một biểu thức mà trong đó chứa nhiều loại dữ liệu nhưng lại không biết chắc chắn kiểu dữ liệu của kết quả
Quên ký hiệu << trước mỗi nội dung muốn xuất bởi cout
VII LỆNH GÁN – HẰNG:
• Khi dùng biến trong biểu thức bên phải dấu =
Biến này trước đó phải được gán các giá trị hợp lệ
Chỉ dùng một biến mà thôi
Ví dụ:
#include <iostream.h>
void main() { float fdai, frong, fdientich;
fdientich =fdai * frong;
fdai=27.2;
frong=13.6;
cout << “Dien tich hinh chu nhat la: “ << fdientich;
} Chương trình trên sẽ cho kết quả không chính xác vì biến fdai và frong chưa có giá trị khi dùng trong biểu thức gán
• Lệnh sau là không hợp lệ: amount + 128 = 1000 + 10 + 5;
• Giá trị của biểu thức gán: chính là giá trị gán cho biến
Ví dụ: nếu ta có biểu thức gán: a=5;
thì bản thân biểu thức (a=5) có giá trị là 5 Vì vậy câu lệnh sau sẽ in lên màn hình số 5:
cout << (a=5);
• Trong một biểu thức gán có thể có nhiều toán tử gán, khi đó biểu thức sẽ được thực hiện từ phải qua trái:
Trang 18Các dạng biến đổi của lệnh gán:
• Khi viết chương trình chúng ta thường sử dụng các lệnh gán có dạng như sau:
2/- Các phép biến đổi kiểu (cast):
Chúng ta đã tìm hiểu việc chuyển đổi dữ liệu trong hai trường hợp:
• Trong một biểu thức chứa nhiều loại dữ liệu
• Chuyển đổi dữ liệu trong biểu thức gán
Hai trường hợp chuyển đổi trên tự động diễn ra một cách ngấm ngầm bên trong
Ngoài ra C++ cũng cung cấp cho người lập trình các toán tử biến đổi kiểu trực tiếp gọi là cast operator Đây là những toán tử một ngôi
datatype là kiểu dữ liệu mà ta muốn áp đặt cho cho biểu thức
Ví dụ:
#include <iostream.h>
void main(void) { float a=3.5f,b=3.0f;
cout << int (a*b);
return;
Trang 19Lê Văn Hạnh – Nguyễn Việt Hùng Feb09 18
3/- Hằng (const):
a)- Literal data:
Là bất kỳ những dữ liệu nào trong chương trình mà giá trị của nó cũng chính là tên của nó Ví dụ như có đoạn lệnh sau:
void main()
{ float fchuvi, fbankinh;
cout <<”Nhap ban kinh hinh tron: “ ;
trong chương trình trên thì 2 và 3.1416 là các literal data
Nếu một literal data được sử dụng nhiều nơi trong một chương trình, thì có khả năng chứa các lỗi tiềm ẩn, ví dụ giá trị của một literal data ghi không thống nhất tại các vị trí trong chương trình, hoặc khi cần thay đổi giá trị của một literal data nào đó người lập trình phải sửa ở nhiều vị trí trong chương trình Vì vậy vừa làm mất thời gian vừa dễ sai sót Để tránh tình trạng này
C++ cung cấp cơ chế đặt tên cho một literal data thông qua từ khóa const gọi là khai báo hằng
b)- Hằng:
Chứa dữ liệu, dữ liệu này không thể thay đổi được trong chương trình
Muốn sử dụng phải khai báo
Phải có kiểu (tương tự như biến)
Khai báo hằng có kiểu long int thì phải thêm vào cuối “L” (450000L)
Cú pháp: const <data type> <name_const> = <value>;
Ví dụ: const float PI=3.1416;
Vị trí khai báo hằng trong chương trình:
void main() { //các khai báo hằng;
//các khai báo biến;
//các lệnh khác;
}
VIII CÁC HÀM TOÁN HỌC TRONG C++:
Mặc dù có cung cấp các toán tử số học như + - * / nhưng vẫn không đủ để dùng; ví dụ như không có toán tử để tính lũy thừa hay căn của một số Thay vào đó C++ cung cấp một số hàm toán học để có thể sử dụng trong chương trình
Trước khi dùng một hàm ta cần phải biết:
• Tên của hàm muốn sử dụng
Trang 20• Công dụng của hàm
• Loại dữ liệu sẽ cung cấp cho hàm
• Kiểu dữ liệu của kết quả trả về bởi hàm
Cú pháp chung của một hàm là:
Function_name (danh sách các đối số)
Khi sử dụng hàm toán học cần khai báo prototype:
# include <math.h>
Một số hàm thường dùng:
abs(x) Tính trị tuyệt đối của số x (x có kiểu là int) int
fabs(x) Tính trị tuyệt đối của số x (x có kiểu là double) double
labs(x) Tính trị tuyệt đối của số x (x có kiểu là long int) long int
• Đối số của những hàm trên có thể là:
Số nguyên hoặc số thực
Nó có thể là hằng, biến hoặc một biểu thức
Ví dụ: #include <iostream.h>
#include <math.h>
void main() { int x=5, x=2;
cout <<” x luy thua y= “ <<pow(x,y) <<endl;
}
Trang 21Lê Văn Hạnh – Nguyễn Việt Hùng Feb09 20
I CẤU TRÚC if – else:
1/- Công dụng: Cấu trúc if – else chỉ cho máy tính chọn thực hiện một trong hai dãy lệnh dựa vào kết quả của một điều kiện (biểu thức quan hệ hay biểu thức so sánh)
2/- Cú pháp:
if (biểu thức điều kiện) {Nhóm Lệnh 1; } else
cout <<”Nhap một so bat ky: “;
cin >>num;
if (num>=0) cout<< “So ”<<num <<” la so duong;
else cout<< “So ”<<num <<” la so am;
}
3/- Cấu trúc if không else:
Đây là dạng biến đổi của cấu trúc trên, ở dạng này không có phần else
Cú pháp: if (biểu thức điều kiện)
Lệnh;
Giải thích: khi điều kiện có giá trị khác 0 thì lệnh sẽ được thực hiện Ngược lại sẽ không làm gì và thực hiện các lệnh sau đó (nếu có) Cũng như trên, lệnh cũng có thể là một lệnh ghép
Ví du1: Chương trình sau cho phép nhập 3 số nguyên, sau đó cho biết số lớn nhất trong
3 số vừa nhập
#include <iostream.h>
Trang 22void main() { int num1, num2, num3, max;
cout <<” Nhap so thu nhat: “;
if (max<num3) max=num3;
cout <<”so lon nhat trong so vua nhap la: ”<<max;
} 4/- Cấu trúc if lồng nhau:
Cho phép trong mỗi phần của if hoặc else có thể chứa một cấu trúc if – else khác Toàn bộ một cấu trúc if – else được xem như một câu lệnh đơn
Chương trình sau đây cho nhập điểm,
in ra xếp loại Biết cáchxếp loại dựa
trên bảng sau:
>=9 Giỏi
#include <iostream.h>
#include <iomanip.h>
void main() { float diem;
cout <<”Nhap diem:: “;
cin >> diem;
if (diem <5) cout<<”Yeu”;
else
if (diem <=7) cout<<”Trung binh”;
else
if (diem <=9) cout<<”Kha”;
else
cout<<”Kha”;
}
Trang 23Lê Văn Hạnh – Nguyễn Việt Hùng Feb09 22
II CẤU TRÚC switch:
1/- Công dụng: Với các bài toán phải chọn một trong nhiều trường hợp nếu viết theo cấu trúc if – else ta nhận thấy khó khăn khi đọc và theo dõi mạch chương trình, trong trường hợp này ta nên sử dụng cấu trúc switch
2/- Cú pháp:
switch (biểu thức) {
Trong cấu trúc switch có 1 biểu thức, 2 từ khóa (case, default) và 1 lệnh (break)
Giải thích:
• Biểu thức: có thể là biến hoặc biểu thức
• case: Nếu kết quả của biểu thức sau switch bằng với giá trị đi sau case nào thì thực hiện các lệnh thuộc về case đó (bắt đầu từ dòng lệnh ngay dưới case cho đến khi gặp lệnh break)
• Default: Nếu như giá trị của biểu thức không bằng một giá trị nào trong các giá trị có trong cấu trúc switch thì các lệnh thuộc default sẽ được thực hiện :
• Lệnh break: có công dụng thoát khỏi một cấu trúc tại thời điểm nó được gọi Trong trường hợp này nó được dùng để thoát khỏi switch sau khi đã thực hiện một nhóm lệnh thuộc về một nhãn nào đó Nếu không có lệnh này thì sau khi thực hiện xong các lệnh cần thiết nó sẽ thực hiện tiếp các lệnh của các trường hợp bên dưới
4/- Ví dụ:
Chương trình nhập vào một số nguyên (0<=so<=7), sau đó in lên màn hình tên gọi của số này:
Trang 24#include <iostream.h>
void main()
{ unsigned short int num;
cout <<"Nhap mot so nguyen: ";
} }
Chương trìnhï sau cho phép nhập một ký tự, sau đó cho biết ký tự vừa nhập có phải là một nguyên âm hay không
#include <iostream.h>
void main() { char ch;
cout <<"Nhap mot ky tu: ";
cin >> ch;
switch (ch) {
} }
5/- Các lỗi thường gặp:
Dùng toán tử gán trong biểu thức quan hệ
Khi có nhiều lệnh thuộc về if hoặc else không đặt giữa cặp ngoặc { }
Trong cấu trúc switch thiếu break ở những vị trí cần thiết
Trang 25Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 24
III CÁC CẤU TRÚC LẶP
1/- Cấu trúc while:
a)- Cú pháp:
while (Biểu thức ĐiềuKiện) {
NhómLệnh;
} b)- Giải thích:
Biểu thức ĐiềuKiện phải được đặt trong cặp ngoặc đơn
NhómLệnh bên dưới biểu thức ĐiềuKiện sẽ được thực hiện lặp đi lặp lại khi mà biểu thức ĐiềuKiện vẫn có giá trị khác không Như vậy tất nhiên ở đâu đó trong đoạn lệnh của while phải có một lệnh làm thay đổi giá trị của biểu thức ĐiềuKiện
Câu lệnh bên dưới ĐiềuKiện phải là một lệnh duy nhất hoặc là một lệnh ghép (nhiều lệnh đặt vào trong {})
c)- Hoạt động của while như sau:
Kiểm tra giá trị của biểu thức ĐiềuKiện
Nếu biểu thức ĐiềuKiện có giá trị khác không
• Thực hiện lệnh bên dưới
• Quay lại kiểm tra biểu thức ĐiềuKiện
Ngược lại: kết thúc cấu trúc while
Hình minh họa tiến trình hoạt động của while
d)- Cấu trúc while thường được dùng khi:
Cần thực hiện nhiều lần (lặp đị, lặp lại) một nhóm lệnh
Trước khi cho nhóm lệnh thực hiện, cần kiểm tra một số điều kiện
Điểm vào vòng lặp while
Kiểm Tra giá trị của BTDK
Giá trị của BTĐK bằng 0 (sai) Kết thúc
vòng lặpwhile Giá trị của BTĐK
khác 0 (đúng) Thực hiện
NhómLệnh của while
Trang 262/- Cấu trúc for :
a)- Công dụng:
Cũng có chức năng giống như while là lặp đi lặp lại một đoạn lệnh nào đó nhưng theo một mẫu khác
Trong các trường hợp số lần lặp của vòng lặp là cố định thì việc sử dụng for sẽ thuận lợi và dễ dàng hơn Ví dụ chương trình in n số nguyên dương đầu tiên lên màn hình (với n là một số nguyên) thì dùng for phù hợp hơn
c)- Hoạt động của for:
d)- Cấu trúc for thường được dùng khi:
Cần thực hiện nhiều lần (lặp đị, lặp lại) một nhóm lệnh
Số lần lặp đã được xác định trước
3/- Cấu trúc do-while:
a)- Công dụng:
Cả hai vòng lặp while và for điều kiểm tra BTĐK trước khi bắt đầu thực hiện lệnh của vòng lặp Vì vậy, có khả năng lệnh của vòng lặp không được thực hiện lần nào vì ngay lần kiểm tra đầu tiên kết quả của BTĐK đã bằng 0
Thực hiện các lệnh khởi tạo
Kiểm Tra giá trị của BTDK
Giá trị của BTĐK bằng 0 (sai)
Kết thúc vòng lặp for Giá trị của BTĐK
Điểm vào vòng lặp for
Thực hiện các lệnh tác
động đến BTĐK
Trang 27Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 26
Ví dụ: #include <iostream.h>
#include <iomanip.h>
void main() { char tiep;
if (so%2==0) cout <<”\nso vua nhap la so chan”;
else cout <<”\nso vua nhap la so le”;
cout <<“\nco nhap so khac hay khong (c/k): “;
cin >>tiep;
} } Chương trình trên do dùng vòng lặp while ta phải có lệnh tiep=’c’ trước vòng lặp để bảo đảm vòng lặp sẽ thực hiền được một lần Muốn bỏ lệnh này thì việc kiểm tra BTĐK phải được thực hiện ở cuối vòng lặp và vòng lặp
do – while là vòng lặp có đặc tính trên
b)- Cú pháp: do
{ NhómLệnh;
}while (biểu thức điều kiện);
c)- Hoạt động của do – while:
Điểm vào vòng lặp do - while
Kiểm Tra giá trị của BTDK
Giá trị của BTĐK bằng 0 Kết thúc
vòng lặp do-while Giá trị của BTĐK khác 0
Thực hiện lệnh của do-while Quay lại
lệnh đầu
tiên ngay
sau từ
khóa do
Trang 28d)- Cấu trúc do-while thường được dùng khi:
Cần thực hiện nhiều lần (lặp đị, lặp lại) một nhóm lệnh
Việc kiềm tra điều kiện chỉ thực hiện sau khi người dùng cung cấp một số thông tin nhất định (có trong điều kiện kiểm tra)
4/- Các cấu trúc lồng nhau:
Toàn bộ một cấu trúc while, for, do-while được xen như một câu lệnh vì vậy ta có thể lồng ghép các cấu trúc này vào nhau
Ví dụ: in các bảng cửu chương 2,3,4 lên màn hình
• Cách 1:
void main() { int i,j;
for (i=1;i<=9;i++) { for (j=2;j<=4;j++) cout <<setw(3)<<j<<" * " <<setw(2)<<i<<"="<< setw(4)<<i*j; cout <<endl;
} }
Cú pháp : break;
Ví dụ: Viết chương trình tính tổng các số nguyên được nhập từ bàn phím chương trình kết thúc khi có một số âm được nhập
Trang 29Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 28
#include <iostream.h>
#include <conio.h>
void main() { int so,tong=0;
clrscr();
while (1) { cout <<"Nhap mot so nguyen: ";
so=0;
while (so>=0) { cout <<"Nhap mot so nguyen: ";
cin >>so;
if (so>=0) tong +=so;
} b)- continue:
Công dụng: được sử dụng trong các vòng lặp như while, for ,do-while Khi lệnh continue được gọi thì chương trình sẽ quay trở về đầu vòng lặp để bắt đầu lần lặp mới Nếu có các lệnh còn lại (cùng trong vòng lặp) đặt sau continue sẽ không được thực hiện
Ví dụ: Viết chương trình tính tổng các số nguyên dương được nhập từ bàn phím chương trình kết thúc khi có một số =0 được nhập
#include <iostream.h>
#include <conio.h>
void main() { int so,tong=0;
while (1) { cout <<"Nhap mot so nguyen>=0: ";
cin >>so;
if (so=0) break;
if (so<0) { cout <<”Du lieu khong hop le”;
continue;
} tong +=so;
} cout <<"\nTong cac gia tri da nhap la: "<<tong;
getch();
}
Trang 306/- Các lỗi thường gặp:
Lưu ý đến phần khởi tạo giá trị và phần biểu thức điều kiện tránh tình trạng vòng lặp có thể thực hiện thiếu hoặc dư một lần
Ví dụ: for (i=1; i<11 ; i++) // sẽ thực hiện 10 lần
for (i=1; i<=10 ; i++) // cũng thực hiện 10 lần for (i=0; i<11 ; i++) // thực hiện 11 lần
Sử dụng toán tử gán (=) thay vì toán tử quan hệ bằng (==) trong các biểu thức điều kiện, hay ngược lại với biểu thức khởi tạo trong for
Sử dụng dấu phẩy (,) ngăn cách giữa 3 nhóm lệnh trong ngoặc của for thay vì chấm phẩy (;)
Quên dấu chấm phẩy sau while (BTĐK) của do - while
Trang 31Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 30
2 Khái niệm
Hàm là một đoạn chương trình độc lập thực hiện trọn vẹn một công việc nhất định sau khi thực hiện xong, hàm có thể sẽ trả về giá trị cho chương trình gọi nó
3 Mục đích khi sử dụng các hàm con
Một chương trình thông thường sẽ có nhiều chức năng ta nên thiết kế mỗi chức năng như vậy là một hàm Trong mỗi hàm này có thể sẽ được chia nhỏ thành nhiều hàm nữa Khi các hàm chức năng đã được xây dựng hoàn chỉnh tất cả những hàm này sẽ được kết nối bởi hàm main, tại thời điểm này chúng ta sẽ không quan tâm đến chi tiết của các hàm chức năng nữa mà chỉ cần biết đầu ra (kết quả thực hiện) của những hàm này
Tóm lại:
• Khi có một công việc giống nhau cần thực hiện ở nhiều vị trí
• Khi cần chia một chương trình lớn phức tạp thành các đơn thể nhỏ (hàm con) để chương trình được trong sáng, dễ hiểu trong việc xử lý, quản lý việc tính toán và giải quyết vấn đề
Lưu ý: khi tạo một hàm trong C++ chúng ta phải quan tâm hai điều:
• Nội dung của hàm
• Sự tương tác của nó với những hàm khác, bao gồm việc truyền dữ liệu chính xác vào trong hàm khi gọi hàm thực hiện và giá trị mà hàm sẽ trả về khi thực hiện xong
4 Cấu trúc một chương trình C++
a Khối khai báo: Bao gồm các khai báo về:
• Sử dụng thư viện
• Hằng số sẽ sử dụng trong chương trình
• Hàm con (các nguyên mẫu hàm -
prototype)
• Các biến toàn cục
• Các kiểu dữ liệu tự định nghĩa
Khối khai báo Hàm main() Các hàm con (nếu có)
Trang 32b Hàm chính (main())
Chứa các biến, các lệnh và các lời gọi hàm cần thiết trong chương trình
c Các hàm con:
• Được sắp xếp riêng rẽ, mỗi hàm nằm trên 1 đoạn riêng
• Các hàm nằm rời nhau Không đặt nội dung của hàm này chứa trong hàm khác, hoặc nội dung của 2 hàm có phần giao nhau
• Không cần quan tâm thứ tự sắp xếp trước/sau của các hàm
//Khai báo biến toàn cục và nguyên mẫu hàm
void ThayThe(char * S, char *St );
TimVaThayThe(S,St,buf);
cout<<"\n Thanh cong.";
getch();
}
//Cài đặt các hàm con
void ThayThe(char * S, char *St )
{ int l=strlen(St);
for(int i=0;i<l;i++)
S[i]=St[i];
}
Trang 33Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 32
void Doc1Sector(int vt, char buf[512])
void Ghi1Sector(int vt, char buf[512])
void TimVaThayThe(char * S, char *St, unsigned char buf[])
{ for(int i=33;i<=500;i++)
{ Doc1Sector(i, buf);
char * p=strstr(buf, S);
if(p) { ThayThe(p, St);
Ghi1Sector(i, buf);
} } }
II TRIỂN KHAI CÁC HÀM TRONG CHƯƠNG TRÌNH:
1/- Đặt tên cho hàm:
Mỗi hàm có một tên để phân biệt, tên hàm trong C++ được đặt theo quy tắc sau:(cũng là quy tắc đặt tên cho các danh định sau này)
Chỉ được dùng chữ cái, chữ số hoặc dấu _ để đặt tên hàm
Ký tự đầu tiên phải là một chữ cái hoặc dấu _
Tên hàm không được trùng tên với từ khóa
Có phân biệt chữ hoa, chữ thường Thông thường ta dùng chữ thường để đặt tên cho hàm, biến và chữ hoa đặt tên cho hằng
Số ký tự tối đa là 31
2/- Khai báo nguyên mẫu hàm (prototypes):
a)- Công dụng:
Nguyên mẫu của hàm dùng để mô tả :
• Kiểu dữ liệu trả về của hàm
• Tên hàm
• Số lượng tham số
Trang 34• Trật tự của các tham số
• Kiểu dữ liệu của những tham số mà nó sẽ nhận khi được gọi thực hiện
Ngoại trừ hàm main tất cả các hàm khác (không phải hàm có sẵn của C++) có trong chương trình đều phải khai báo nguyên mẫu Điều này giúp cho trình biên dịch phát hiện ra các lỗi sai sót về kiểu dữ liệu trả về của hàm cũng như số giá trị và kiểu dữ liệu của các giá trị truyền cho hàm khi nó được gọi thực hiện
b)- Cú pháp khai báo một nguyên mẫu:
<Kiểu dữ liệu của hàm> Tên hàm ([ danh sách các tham số]);
int fmax(int, int); // phải có dấu chấm phẩy cuối khai
float swap(int, char, char, double); // báo của mỗi hàm
void display(double, double);
3/- Cách xây dựng một hàm con
a Kiểu dữ liệu của hàm
Xác định dựa vào kết quả của bài toán (Output) Gồm 2 loại :
• void: Hàm không trả về giá trị Những hàm loại này thường rơi vào những nhóm chức năng: Nhập / xuất dữ liệu , thống kê, sắp xếp, liệt kê
void Tên_hàm (danh sách các tham số) { Khai báo các biến cục bộ
Các câu lệnh / khối lệnh hay lời gọi đến hàm khác
}
• Kiểu dữ liệu cơ bản (rời rạc/ liên tục) hay kiểu dữ liệu có cấu trúc: Kiểu dữ liệu tùy theo mục đích của hàm cần trả về giá trị gì thông qua việc phân tích bài toán Những hàm loại này thường được sử dụng trong các trường hợp: Đếm, kiểm tra, tìm kiếm, tính trung bình, tổng, tích,
<Kiểu dữ liệu> Tên_hàm ([danh sách các tham số]) { <Kiểu dữ liệu> kq;
Khai báo các biến cục bộ
Trang 35Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 34
b Lưu ý
Đối với những hàm trả về nhiều loại giá trị cho từng trường hợp cụ thể (chẳng hạn như kiểm tra: đúng hay sai, so sánh: bằng, lớn hơn hay nhỏ hơn, ) thì cần ghi chú rõ giá trị trả về là gì cho từng trường hợp đó
4/- Định nghĩa hàm:
Định nghĩa hàm là viết nội dung của hàm đó Mỗi hàm sẽ được định nghĩa một lần trong chương trình và có thể được gọi thực hiện bởi một hàm khác có trong chương trình
Giống như hàm main mỗi hàm trong C++ gồm hai phần: phần tiêu đề của hàm (Function Header) và phần thân hàm (Function Body)
Nên đặt tên hàm theo quy ước đặt tên trong C sao cho tên gọi đúng với chức năng hay mục đích thực hiện của hàm và gợi nhớ
Data_type function_name(parameter list) D(ịnh nghĩa hàm
(không có dấu ; ở cuối) {
}
Ví dụ: Các khai báo nguyên mẫu hàm và tiêu đề hàm tương ứng;
• int fmax(int , int);
int fmax(int x, int y)
• void display(double , char );
void display(double m, char s)
• Tên các tham số hình thức do người lập trình đặt, và nó dùng để nhận các giá trị truyền từ bên ngoài vào khi hàm thực hiện
Thân hàm: Bao gồm các lệnh các phép toán sẽ tác động lên các giá trị được truyên cho hàm thông qua các tham số hình thức, để tạo ra kết quả
tên tham số hình thức
tên tham số hình thức
Trang 36Ví dụ: Xem xét chương trình sau, chương trình in lên màn hình giá trị lớn nhất của hai số nguyên được nhập từ bàn phím, trong chương trình có một hàm findmax dùng để tìm giá trị lớn nhất trong hai số:
#include <iostream.h>
int findmax(int, int); //prototype void main()
{ int num1, num2;
cout <<”Nhập số thứ nhất: “;
if (x>=y) return x; // Function body else return y; // Function body }
5/- Lời gọi hàm:
Lời gọi hàm giống như một lệnh, nó xuất hiện trong chương trình khi có yêu cầu gọi thực hiện một hàm nào đó thực hiện Lời gọi hàm bao gồm tên hàm các dữ liệu truyền cho hàm được gọi Nếu nguyên mẫu của hàm có tham số thì khi gọi hàm phải truyền giá trị
Trong ví dụ trên dòng lệnh findmax(num1,num2) trong hàm main là một lời gọi hàm Trong đó:
• findmax : Tên hàm được gọi
• num1,num2 : Dữ liệu truyền cho hàm
Số lượng dữ liệu truyền cho hàm phải bằng số lượng tham số khi khai báo nguyên mẫu và đúng thứ tự đã khai báo (cùng kiểu dữ liệu của tham số)
III PHÂN LOẠI THAM SỐ TRUYỀN CHO HÀM:
1/- Sử dụng tham số của hàm là tham trị
Tham số dạng này chỉ mang ý nghĩa là dữ liệu đầu vào
Đặc điểm của cách dùng tham số này là: Khi hàm gọi truyền giá trị cho các tham số của hàm được gọi (trực tiếp bằng hằng hoặc thông qua các biến), thì những tham số này sẽ nhận giá trị được truyền cho nó và lưu ở một vị trí khác trong bộ nhớ Do đó việc tác động lên các tham số của
Trang 37Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 36
• Hàm gọi (chẳng hạnï như hàm main trong ví dụ trên) có thể dùng hằng hoặc biến để truyền giá trị cho tham số của chương trình được gọi, ví dụ như ta có thể gọi hàm findmax như sau: findmax(10,5) (giá trị truyền cho tham số x,y là hằng)
• Hàm được gọi (chẳng hạn như hàm findmax trong ví dụ trên) sẽ nhận giá trị truyền cho nó và lưu những giá trị này vào một vùng nhớ gọi là vùng nhớ tạm Khi đó mọi lệnh tác động lên tham số trong chương trình con này sẽ tác động lện vùng nhớ tạm Vùng nhớ tạm sẽ bị xóa ngay sau khi hàm được gọi (findmax) kết thúc
2/- Sử dụng tham số của hàm là tham chiếu:
Có sự thay đổi giá trị của tham số trong quá trình thực hiện và cần lấy lại giá trị đó sau khi ra khỏi hàm Ứng dụng của tham số loại này có thể là dữ liệu đầu ra (kết quả) hoặc cũng có thể vừa là dữ liệu đầu vào vừa là dữ liệu đầu ra
Theo cách này thì khi gọi thực hiện một hàm có tham số thì hàm gọi phải dùng biến để truyền dữ liệu cho các tham số của hàm được gọi Lúc này tham số sẽ nhận địa chỉ trong bộ nhớ RAM của biến đã truyền cho nó, và mọi tác động lên tham số của hàm được gọi sẽ tác động trực tiếp lên biến tương ứng của chương trình gọi
Cú pháp để khai báo một tham số dạng tham chiếu trong dòng prototype và dòng function header của hàm như sau:
data_type& //khai báo trên dòng prototype
data_type& reference_name //Khai báo trên function header
Ví dụ: chương trình sau sử dụng hàm swap có công dụng nhận giá trị của hai biến và đổi giá trị của hai biến cho nhau:
#include <iostream.h>
#include <conio.h>
void swap(int&, int&);
void main() { int i=5,j=10;
clrscr();
cout <<"\n Truoc khi goi ham swap\n"
<<"i= "<<i<<" " <<"j= "<<j <<endl; //I=5 j=10 swap(i,j);
cout <<"Sau khi goi ham swap\n"
<<"i= "<<i<<" " <<"j= "<<j <<endl; //I=10 j=5 getch();
}
Trang 38void swap(int& x,int& y) { int tam;
tam=x;
x=y;
y=tam;
} Chương trình trên nếu không sử dụng tham chiếu thì kết quả sẽ như thế nào?
Xem xét một ví dụ khác Chương trình sau có một hàm tính tổng và tích của ba số thực Hàm có năm tham số trong đó có ba tham trị dùng để nhận các giá trị muốn tính tổng và tích, hai tham số còn lại là tham chiếu dùng để kết quả tổng và tích tính được
#include <iostream.h>
#include <conio.h>
void calc(float, float, float ,float&, float&);
void main() { float n1,n2,n3,sum,product;
3/- Ví dụ về trình tự khi xây dựng hàm:
Ví dụ 1: Viết CT nhập số nguyên dương n và in ra màn hình các ước số của n
Phân tích bài toán:
• Input: n (Để xác định tham số)
- Kiểu dữ liệu: số nguyên dương (unsigned int)
- Giá trị n không bị thay đổi trong quá trình tìm ước số Tham số của hàm không là con trỏ
• Output: In ra các ước số của n (Để xác định kiểu dữ liệu hàm)
- Không trả về giá trị
Trang 39Lê Văn Hạnh – Nguyễn Việt Hùng - Trần Đình Nghĩa - Ngô Tân Khai Feb09 38
Ta có nguyên mẫu hàm:
void LietKeUocSo ( unsigned int n );
Ví dụ 2: Viết chương trình nhập số nguyên dương n và tính tổng
n
S = 1 + 2 + 3 + L + , với n>0 Phân tích bài toán:
• Input: n (Để xác định tham số)
- Kiểu dữ liệu: số nguyên dương (unsigned int)
- Giá trị n không bị thay đổi trong quá trình tính tổng Tham số của hàm không là con trỏ
• Output: Tổng S (Để xác định kiểu dữ liệu hàm)
- Trả về giá trị của S
- S là tổng các số nguyên dương nên S cũng là số nguyên dương Kiểu trả về của hàm là unsigned int (hoặc unsigned long cho trường hợp giá trị của tổng lớn hơn 2 bytes)
Trang 40• Xác định tên hàm: Hàm này dùng tính tổng S nên có thể đặt là TongS
Ta có nguyên mẫu hàm:
unsigned long TongS ( unsigned int n );
i++;
} return S;
}
IV PHẠM VI CỦA BIẾN:
1/- Biến cục bộ: Là các biến được khai báo trong thân của một hàm nào đó Các biến này chỉ có giá trị trong phạm vị hàm khai báo nó
2/- Biến toàn cục: Là các biến được khai báo bên ngoài các hàm Những biến này có giá trị với tất cả các hàm được khai báo sau nó
3/- Ví dụ:
#include <iostream.h>
#include <conio.h>