Chương trình của C bao gồm nhiều hàm nằm trong các tệp khác nhau, mỗi hàm được xây dựng độc lập và có thể gép nối với nhau một cách dễ dàng.. Chính vì thế mà hầu hết các hệ thống chương
Trang 1Ngôn ngữ lập trình C++
Chương 1 Giới thiệu ngôn ngữ C++
1.1 Xuất xứ của ngôn ngữ C
Ngôn ngữ lập trình C do Dennis Ritchie và Brian Kernighan xây dựng năm 1970, thể hiện được tất cả các đặc trưng của ngôn ngữ lập trình bậc cao nhưng cũng có khá đầy đủ các khả năng của ngôn ngữ lập trình bậc thấp
Cùng với sự phát triển mạnh mẽ của công nghệ thông tin (CNTT), ngôn ngữ C có rất nhiều phiên bản của các hãng khác nhau như C chuẩn, Turbo C, Microsoft C Sau ngôn ngữ C là C++ ngoài các tính năng như C, C++ còn
được bổ sung nhiều tính năng khác, một trong đó là kỹ thuật lập trình hướng
đối tượng, một hướng lập trình rất quan trọng
1.2 Một số đặc trưng của ngôn ngữ C
Khác với ngôn ngữ Pascal, trong ngôn ngữ C không có sự phân biệt giữa hàm và thủ tục Chương trình của C bao gồm nhiều hàm nằm trong các tệp khác nhau, mỗi hàm được xây dựng độc lập và có thể gép nối với nhau một cách dễ dàng
Trong ngôn ngữ C có nhiều mô hình tổ chức bộ nhớ, làm cho chương trình viết bằng C sử dụng bộ nhớ tiết kiệm và hiệu quả
Con trỏ trong C là một công cụ mạnh mẽ cho phép truy nhập vào mọi nguồn tư liệu và hệ thống một cách hiệu quả C cho phép phát triển giao diện
đồ hoạ rất tiện dụng
Chính vì thế mà hầu hết các hệ thống chương trình lớn đều được viết bằng C, và việc học ngôn ngữ C là bắt buộc đối với các sinh viên chuyên ngành CNTT và những người lập trình chuyên nghiệp
Trong tài liệu này chúng ta chủ yếu xét Turbo C Vr.3.0 của Borland, bởi
lẽ C++ đang được cài đặt phổ biến trên các máy vi tính, sử dụng tương đối dễ dàng và được trang bị kỹ thuật lập trình hướng đối tượng, vấn đề này sẽ được xét trong một chuyên đề tiếp theo
Trang 2• Tạo tệp mới : File New
• Mở tệp : File Open (F3)
• Ghi tệp : File Save (F2)
• Ghi với tên khác : File Save as
• Dịch chương trình : Compile (Alt + F9)
• Chạy chương trình : Run (Ctrl + F9)
• Thoát ra : File Quit (Alt + X)
• Thao tác với khối:
Đánh dấu dầu khối : Ctrl + K + B
Đánh dấu cuối khối : Ctrl + K + K Chuyển khối vào bộ nhớ đệm : Edit + Cut Sao chép khối vào bộ nhớ đệm : Edit + Copy Sao chép khối tới vị trí con trỏ : Edit + Paste
Trang 31.5 Ví dụ
Ví dụ chương trình 1.1: Hiện xâu Hello lên màn hình
// chuong trinh dau tien HELLO.CPP
# include <iostream.h>
void main() {
cout << "Hello !"; // hiện xâu Hello }
Ví dụ chương trình 1.2: Tính giai thừa n!
// Tinh giai thua GTHUA.CPP
# include <iostream.h>
// Hàm tính giai thừa long gthua(int &n) { int gt = 1;
for (int i = 1; i <= n; i++) gt = gt*i;
return gt;
}
// Chương trình chính void main()
{ int k;
cout << "\nNhap so n = "; cin >> k;
- Dấu { và } giống như Begin và End trong Pascal
- Kết thúc một lệnh có dấu chấm phẩy (;)
- Lời giải thích đặt sau cặp ký tự //, và có thể đặt trên một dòng hay sau một dòng lệnh
- C phân biệt tên viết bằng chữ thường với chữ hoa
- Khối lệnh (lệnh ghép) là các lệnh đặt trong cặp dấu ngoặc nhọn { }
Trang 4Chương 2 Các khái niệm cơ bản
Từ khoá là những từ được sử dụng để xác định những tên đã được quy
định sẵn trong C++, người sử dụng không thể đặt các tên trùng với từ khoá Sau đây là danh sách các từ khoá trong C++:
const extern long short throw while
Trang 5structure union class enumeration
Kiểu dẫn
array functionxuất
char int
Số thực
Ngoại trừ kiểu void, các kiểu dữ liệu cơ sở có thể sử dụng kết hợp với signed (có dấu), unsigned (không dấu), long (số dài), short (số ngắn) Bảng sau đây sẽ cho biết kích thước và miền xác định của các kiểu cơ sở:
unsigned short int 2 0 65535
signed short int 2 -32768 32767
signed long int 4 -214783648 214783647 unsigned long int 4 0 4294967295
long double 10 3.4E-4932 1.1E+4932
Trang 62.5 Khai báo biến
Mọi biến cần phải khai báo trước khi sử dụng Việc khai báo biến được thực hiện theo quy tắc chung như sau:
Ví dụ:
int a, b, c; // Khai báo 3 biến kiểu int
float x, y; //Khai báo 2 biến kiểu float
char ch1; // Khai bái 1 biến kiểu char
Khi khai báo các biến cũng có thể khởi tạo ngay giá trị cho chúng, ví dụ: int s1 = 5, s2, s3 = 10;
Vị trí khai báo biến: C++ cho phép khai báo các biến ở bất kỳ vị trí nào trong miền xác định Ví dụ, hãy xem việc khai báo các biến trong đoạn chương trình sau:
float x; // khai báo biễn x float s = 0; // khai báo biến s và khởi tạo giá trị 0 cho nó for (int i = 1; i<=10; i = i+1) // khai báo biến trong vòng lặp
Miền tác dụng của biến được xác định từ điểm biến được khai báo cho
đến cuối khối chứa khai báo đó Biến được khai báo bên trong của khối được gọi là biến cục bộ của khối đó, biến được khai báo ngoài cùng được gọi là biến tổng thể
2.6 Hằng
Hằng là các đại lượng mà giá trị của nó không thay đổi trong quá trình hoạt động của chương trình
Hằng số nguyên int: 45
Trang 7Hằng long: 4599L; 123l
Hằng float và double: 12.5; -0.001; 15 ; 1E-5; 1.327E+9
Hằng nguyên hệ 16: oxa9; OX15AF
Hằng ký tự: ‘A’ ; ‘a’; ‘0’
Hằng xâu ký tự: “Ha noi”; “DHSP”; “a”; “”
Khai báo hằng:
const n = 10; // khai báo hằng n = 10
# define pi 3.14159 // khai báo hằng pi = 3.14159 enum{A = 100; B = 150};
2.8 Nhập/xuất
2.8.1 Nhập xuất bằng lệnh cin, cout
Để viết dữ liệu ra màn hình có thể dùng lệnh cout như sau:
cout << <bt> [<< <bt> ] [ ];
Ví dụ:
cout << “Hello”;
int a = 5, b = 9;
cout << ”Tich ab = “ << a*b ;
Để nhập dữ liệu vào từ bàn phím có thể dùng lệnh cin như sau:
cin >> tên_biến [<< tên_biến] [<< ];
Ví dụ:
cin >> n1;
cin >> n2;
Có thể gộp hai lệnh trên lại như sau: cin >> n1 >> n2;
Chú ý rằng, để sử dụng được các lệnh cin và cout trên trong chương trình phải có lệnh # include <iostream.h> ở đầu chương trình
Ví dụ chương trình 2.1: Lập chương trình nhập hai số nguyên vào từ bàn phím rồi tính tổng của chúng
// chuong trinh vi du nhap xuat
# include <iostream.h>
Trang 8void main() {
2.8.2 NhËp xuÊt b»ng printf, scanf, gets
§Ó sö dông ®−îc c¸c hµm nµy ph¶i cã dÉn h−íng # include <stdio.h> ë
Trang 9Để xác định độ rộng của biểu thức in ra ta thêm chuỗi quy định độ rộng vào giữa, chẳng hạn như: “%5d”, “%7.3f”
Ví dụ: printf(“%5d %8.2f”,12, 759.23678);
thì sẽ in ra là: 12 759.24
Hàm scanf cho phép đọc thông tin từ thiết bị vào chuẩn (bàn phím), rồi lưu vào biến nhố Hàm có dạng như sau:
int scanf(const char *dk [, danh sách biến nhớ];
Trong hàm scanf có dùng toán tử địa chỉ & trước tên biến
Ví dụ:
int a, b;
printf(“\nNhap so a, b : “);
scanf(“%d %d”, &a, &b);
Khi dùng các lệnh cin hay scanf để nhập các chuỗi mà trong nó có chứa dấu cách, thì phần chuỗi nhập vào từ dấu cách trở đi sẽ bị bỏ qua, chẳng hạn nhập chuỗi “Lê Văn Hùng” thì biến nhập chỉ nhận được “Lê” Để khắc phục
printf("\nVao ho va ten : ");
gets(ht);
printf("\nBan da nhap %s",ht);
}
Trang 10Có thể viết gọn thành: i++; hay ++i;
++i tăng giá trị của biến rồi mới sử dụng, còn i++ dùng biến rồi mới tăng giá trị
Tương tự có các toán tử giảm
2.9.4 Toán tử quan hệ
Các toán tử quan hệ gồm có: < > <= >= == !=
Kết quả của các toán tử quan hệ là 1 (đúng), hoặc 0 (sai)
Các toán tử số học có độ ưu tiên cao hơn các toán tử quan hệ
2.9.5 Toán tử logic
Các toán tử logic gồm có:
&& logic AND
Trang 11|| logic OR
! logic NOT
^ logic XOR Bảng chân lý của các phép toán logic:
0 0 0 0 1 0
0 1 0 1 1 1
1 0 0 1 0 1
1 1 1 1 0 0 Các phép toán quan hệ có độ −u tiên nhỏ hơn so với ! nh−ng lớn hơn so với &&, || và ^
Trang 122.9.7 Thứ tự ưu tiên của các toán tử
3 prefix++ prefix postfix++ postfix
~ ! unnary+ unary- unary* unary&
(type) sizeof new delete
phải sang trái
7 << >> trái sang phải
8 < <= > >= trái sang phải
16 = += -= *= /= %= <<= >>= &=
^= |=
phải sang trái
Nhận xét:
• Các toán tử ở dòng trên có mức ưu tiên cao hơn dòng dưới
• Các phép toán cùng dòng có mức ưu tiên như nhau
• prefix và posfix là những từ xác định sử dụng ++, thực hiện trước hay sau Còn unary chỉ định các toán tử một ngôi
2.9.8 Biểu thức
Biểu thức là sự kết hợp giữa các toán tử (operator) và các toán hạng (operand) để diễn đạt một công thức toán học nào đó
Toán tử : là các phép toán (số học, logic, quan hệ )
Toán hạng : là đối tượng tác động của các toán tử (các hằng, biến,
hàm )
Trang 13Trong C có các loại biểu thức:
- Biểu thức số: giá trị của biểu thức là số
- Biểu thức logic: giá trị của biểu thức là đúng (1) hoặc sai (0)
- Biểu thức ký tự: giá trị của biểu là một ký tự thuộc bảng mã ASCII
- Biểu thức chuỗi ký tự: giá trị của biểu thức là một chuỗi ký tự
Trang 14Ch−¬ng 3 C¸c cÊu tróc ®iÒu khiÓn
thùc hiÖn <khèi lÖnh> råi ra khái cÊu
tróc, ng−îc l¹i <btL> cã gi¸ trÞ sai (0)
cout << "Vao so thu nhat: "; cin >> a;
cout << "Vao so thu hai : "; cin >> b;
Trang 15Nếu <btL> có giá trị đúng thì thực hiện <Khối lệnh 1> rồi ra khỏi cấu trúc, nếu <btL> có giá trị sai thì thực hiện <Khối lệnh 2> rồi ra khỏi cấu trúc
Ví dụ chương trình 3.2: Giải PT bậc hai (a#0) trên trường số thực
else { x1 = (-b+sqrt(d))/(2*a);
x2 = (-b-sqrt(d))/(2*a);
cout << "\nPT co 2 nghiem phan biet"
<< "\n X1 = " << x1 << "\n X2 = " << x2;
} getch();
Trang 16VÝ dô ch−¬ng tr×nh 3.3: NhËp 2 sè råi chän mét phÐp to¸n sè häc tÝnh 2
printf("TINH TOAN SO HOC\n");
cout << "a = "; cin >> a;
cout << "b = "; cin >> b;
cout << "Chon phep toan (+ - * :) ? "; cin >> PT;
switch (PT)
{ case '+':
cout << "\na + b = " << a+b;
Trang 17cout <<"\nBan chon phep toan sai.";
Giá trị của biểu thức điều kiện bằng giá trị của <bt1> nếu <bt> có giá trị
đúng (1), bằng giá trị của <bt2> nếu <bt> có giá trị sai (0)
Ví dụ:
max = (num1>num2)? num1: num2;
Tương đương với:
if (num1>num2) max = num1;
else max = num2;
3 Tính <bt tăng/giảm> rồi quay lại bước 2
Ví dụ: for (int i=1; i<=100; i++) s = s + i;
hoặc for (int i=100; i > 0; i ) s = s + i;
Ví dụ chương trình 3.4: Lập bảng nhân của 10 số tự nhiên đầu tiên
Trang 18clrscr();
gotoxy(20,3);
cout << "Bang tinh nhan\n\n";
for (i=1; i<=10; i++)
for (j=1; j<=10; j++) cout << setw(5) << i*j;
2 Tuỳ thuộc vào giá trị đúng hay sai của <btL>, máy sẽ:
- Nếu <btL> có giá trị sai thì thoát ra khỏi cấu trúc lặp
- Nếu <btL> có giá trị đúng thì thực hiện <khối lệnh>, rồi quay lại bước 1
Trang 19VÝ dô ch−¬ng tr×nh 3.6: NhËp 2 sè råi chän mét phÐp to¸n sè häc tÝnh 2
cout << "a = "; cin >> a;
cout << "b = "; cin >> b;
cout << "Chon phep toan (+ - * /) ? ";
cin >> PT;
switch (PT) {
else cout << "\nKhong chia duoc !";
break;
default:
cout <<"\nBan da chon sai !";
} char TL;
cout << "\n\nCo tinh nua khong (C/K) ? ";
cin >> TL;
if (TL == 'K' || TL == 'k') break;
}
Trang 202 Xác định giá trị của <btL> sau while:
- Nếu <blL> có giá trị sai thì thoát ra khỏi cấu trúc
- Nếu <btL> có giá trị đúng thì quay lại bước 1
Lệnh break trong cấu trúc witch để kết thúc một nhánh case Nếu cuối khối lệnh của một nhánh case không có lệnh break, khi thực hiện xong khối lệnh đó, máy sẽ thực hiện tiếp khối lệnh của case tiếp theo
Trang 213.2.5 Nhãn và lệnh goto
Tên nhãn được quy định giống tên biến và có dấu hai chấm (:) sau cùng
Có thể gán bất kỳ câu lệnh cho nhãn, chẳng hạn:
• Không được phép cho lệnh goto nhảy từ ngoài vào trong một khối lệnh Tuy nhiên việc nhảy từ trong một khối lệnh ra ngoài là hợp lệ
Ví dụ chương trình 3.8: Nhập 2 số rồi chọn một phép toán số học tính 2
printf("TINH TOAN SO HOC\n");
cout << "a = "; cin >> a;
Trang 221 Giải và biện luận phương trình ax + b = 0
2 Giải và biện luận hệ pt bậc nhất:
ax + by = c a1x + b1y = c1
3 Viết chương trình nhập 3 số x, y, z và tìm số lớn nhất và nhỏ nhất trong chúng
4 Lập chương trình tìm ƯSCLN của hai số nguyên dương a, b
5 Giải và biện luận phương trình aX4 + bX2 + c = 0
6 Lập chương trình in ra bảng căn bậc 2 và căn bậc 3 của 100 số tự nhiên đầu tiên
7 Lập chương trình nhập một số tự nhiên có ba chữ số và đổi thành chữ
Trang 23=
chan n neu n
le n neu n S
642
531
le n neu n
x x x x n
642
531
!
10 Lập chương trình tính S = 1 -1/2 + 1/3 - 1/4 + 1/5 - 1/6 + với độ chính xác 10-6
N đồng sau M tháng
14 Cho xâu ký tự ‘ABCD’, các xâu ‘ABCD’, ‘BACD’, ‘DABC’, ‘CDAB’
được gọi là các hoán vị của xâu ‘ABCD’ Lập trình tìm :
a Số lượng các hoán vị của xâu ‘ABCD’
b In ra màn hình các hoán vị của xâu ‘ABCD’
15 Số Mersen là số nguyên tố có dạng 2n -1, trong đó n cũng là một số nguyên tố Hãy lập trình tìm tất các các số Mersen không quá 10 chữ số
16 Số 36 có tính chất 36= 62 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8
Số tiếp theo có tính chất như vậy là 125 = 352 = 1 + 2 + 3 + + 49
Hãy tìm tất cả những số không vượt quá 7 chữ số có tính chất như trên
17 Lập chương trình in ra 1000 số nguyên tố đầu tiên
Trang 24Chương 4 Hàm và cấu trúc chương trình
Hàm đóng vai trò quan trọng trong chương trình C Chương trình được chia thành nhiều đơn thể chức năng theo cách tiếp cận trên-xuống, và được thiết kế theo phương pháp lập trình có cấu trúc Một chường viết trong ngôn ngữ C bao gồm một hàm chính (hàm main) và các hàm con (mỗi hàm là một chương trình con) Thứ tự của các hàm trong chương trình là bất kỳ, nhưng chương trình bao giờ cũng được thực hiện từ hàm main Trong C++ các hàm
được bổ sung nhiều đặc tính mới hỗ trợ cho lập trình hướng đối tượng
4.1 Chức năng của hàm
4.1.1 Hàm main()
Chương trình trong C là một tập các hàm trong đó có một hàm main(), đó
là nơi chương trình được bắt đầu và kết thúc Trong C hàm main() nhận trả lại giá trị kiểu int cho hệ thống, nó có dạng chung như sau:
Trong C++ hàm main() có thể là kiểu void, nên không cần trả lại giá trị
4.1.2 Tránh việc lặp lại các đoạn chương trình
Nếu chương trình có nhiều đoạn giống nhau, để tránh việc phải viết lại các đoạn giống nhau đó, hãy lập một chương trình con (hàm con), khi cần thiết chỉ việc nó ra cùng với các tham số cần thiết
}
Trang 254.1.3 Tổ chức chương trình
Phân tách chương trình lớn thành các modul chương trình nhỏ độc lập, mỗi modul là một hàm con giải quyết một công việc cụ thể Từng hàm sẽ
được hoàn chỉnh, kiểm tra sau đó lại kết nối lại thành một hệ thống chương trình
4.1.4 Tính độc lập
Tính độc lập cho phép các chương trình con độc lập với chương trình chính Chẳng hạn trong chương trình con có các biến cục bộ, không bị chương trình chính hay các chương trình con khác truy nhập đến Điều này sẽ làm hạn chế tới việc đụng chạm tên biến, kiểm soát được các hiệu phụ trong hệ thống chương trình
4.1.5 So sánh hàm trong C với hàm và thủ tục trong Pascal
Trong Pascal hàm và thủ tục là hai đối tượng riêng biệt, hàm trả về giá trị còn thủ tục thực hiện những tác vụ nào đó Trong C, hai khái niệm này nhập lại là một, nghĩa là hàm của C có thể trả về dữ liệu qua đối và cũng có thể trả
về giá trị
4.2.Xây dựng hàm
4.2.1 Quy tắc xây dựng hàm
Hàm có thể xem như một đơn vị độc lập của chương trình Các hàm có vai trò ngang nhau, cho nên trong ngôn ngữ C không cho phép xây dựng một hàm nằm bên trong một hàm khác
Trang 26Trong C++ có hàm kiểu void, đó là hàm không trả lại giá trị nào Khi hàm không có đối cũng có thể coi đối của nó là void, ví dụ:
void hamxyz(void)
4.2.2 Lời gọi hàm
tên_hàm([danh sách tham số thật])
Khi một hàm được gọi thì quá trình diễn ra như sau:
• Cấp phát bộ nhớ cho các đối và các biến cục bộ
• Gán giá trị của các tham số thật cho các đối tương ứng
else return y;
4.2.3 Khai báo nguyên mẫu hàm (prototype)
Nguyên mẫu của hàm là cách định nghĩa và khai báo hàm theo chuẩn ANSI, thực chất đó là dòng đầu tiên của hàm và có thêm dấu chấm phẩy (;) Mục đích của cách khai báo này là để tránh các lỗi do không đúng kiểu dữ liệu giữa trị truyền đến hàm và trị hàm momg muốn Với các chương trình lớn
và phức tạp thì việc khai báo nguyên mẫu hàm càng quan trọng
Trang 27float dtht(float r) { return r*r*PI; }
Ví dụ chương trình 4.3 Tìm ước số chung lớn nhất của 2 số nguyên dương
4.2.4 Truyền tham số cho hàm
Có 4 cách truyền một đối cho cho một tham số của hàm: truyền bằng giá trị, bằng giá trị const, bằng tham chiếu, và bằng tham chiếu const
• Truyền bằng giá trị:
Truyền bằng giá trị là là phương pháp đơn giản và thông dụng nhất Trong cách truyền này tham số là biến cục bộ, trong quá trình gọi thực hiện hàm sự thay đổi của tham số hình thức không làm thay đổi giá trị nguyên thuỷ của đối (biến) được truyền
Trang 28• Truyền bằng giá trị const
Truyền bằng giá trị const tương tự như truyền bằng giá trị nhưng có thêm
từ khoá const vào trước tên kiểu biến hình thức, làm cho tham số trở thành hằng và hàm không thể thay đổi được giá trị của nó
Ví dụ chương trình 4.5:
# include <iostream.h>
# include <conio.h>
// truyen tham so theo gia tri const
void func(const int x)
Trang 29• Truyền bằng tham chiếu
Truyền bằng tham chiếu (còn gọi là truyền theo địa chỉ) cho phép thay
đổi giá trị của đối, vì tham số của hàm chỉ là bí danh cho đối hiện có Trong cách truyền này phải thêm toán tử & vào trước tên tham số hình thức
Ví dụ chương trình 4.6:
# include <iostream.h>
# include <conio.h>
// truyen tham so bang tham chieu
void func1(int &x)
Trang 30clrscr();
cout << "\nHoan vi 2 so";
cout << "\nBan dau:" << endl
<< "a = " << a << endl << "b = " << b;
hoan_vi(a, b);
cout << "\nSau hoan vi:" << endl
<< "a = " << a << endl << "b = " << b;
getch();
}
• Truyền bằng tham chiếu const
Truyền bằng tham chiếu const tương tự như truyền bằng tham chiếu, nhưng hàm được truyền không thể làm thay đổi giá trị của đối được truyền Trong cách truyền này phải thêm từ khoá const vào trước tên kiểu của tham số hình thức
Ví dụ chương trình 4.8:
# include <iostream.h>
# include <conio.h>
// truyen tham so bang tham chieu const
void func1(const int &x)
number =45;
Trang 31Bạn yêu cầu trình biên dịch dịch dòng lệnh này ra mã máy, để chip vi xử
lý có thể thực hiện được Thay vì phải dịch ngay sang mã máy, các dẫn hướng tiền xử lý yêu cầu trình biên dịch phải xử lý chúng theo một yêu cầu nào đó của người lập trình trước khi bắt đầu trình biên dịch, vì đó mà có tên là tiền xử
lý Sau đây chúng xem xét hai dẫn hướng tiền xử lý rất hay được sử dụng, đó
là #define và #include
4.3.1 Dẫn hướng #define
• Dẫn hướng #define dùng để gán tên cho hằng, ví dụ:
#define PI 3.14159 Chuẩn ANSI cho phép khai báo hằng như sau:
const PI = 3.14159;
• Dẫn hướng #define thay thế cho câu lệnh, ví dụ:
#define ERROR cout << “\nError, division by zero !\n” Khi đó cần thông báo do lỗi, có thể gọi nó như sau:
Khi ta xây dựng các hệ thống chương trình lớn và phức tạp trên C, thường
có nhiều biểu thức, công thức tính toán, hàm tự tạo, hằng, macro, dẫn hướng
Trang 32được sử lại nhiều lần Ta có thể đặt tất những thứ đó vào một tệp tin nguồn riêng với phầm mở rộng là h (ví dụ progres.h) Khi viết chương trình cần phải
sử dụng các công việc xử lý trên, ta chỉ cần đưa phát biểu:
# include “progres.h”
vào đầu chương trình là được
4.3.3 Các tệp tin header chuẩn
Trong ngôn ngữ C có một số tệp header chuẩn, chứa các định nghĩa và macro rất hữu ích cho người lập trình Các tệp này thường được đặt trong thư mục TC\INCLUDE Nhiều hàm thông dụng trong thư viện C, thực sự là các macro được định nghĩa trong các tệp header chuẩn, chẳng hạn như : getch(), printf() trong tệp stdio.h; sqrt(x), sin(x), exp(x) trong tệp math.h
Muốn sử dụng được các hàm này, ta phải đặt các phát biểu sau trong chương trình:
# include <stdio.h>
# include <math.h>
4.3.3 Các tệp tin header và định nguyên mẫu
Một lý do khác phải dùng các tệp header là chúng cung cấp các nguyên mẫu các hàm thư viện của C Mỗi hàm thư viện của C đều liên quan đến một tệp tin header trong thư mục TC\INCLUDE Ví dụ nguyên mẫu cho hàm printf() được xác định trong tệp stdio.h
Để đẩm bảo không gọi nhầm một hàm thư viện với đối sai kiểu dữ liệu, ta chỉ cần đặt tệp tin header vào sau # include ở đầu chương trình Vấn đề này bạn đọc có thể xem chi tiết trong các tài liệu Reference C
Trang 33Hàm đệ quy thường được viết theo thuật toán sau:
if (trường hợp suy biến)
{
Trình bầy cách giải bài toán (giải định đã có cách giải) }
else // trường hợp chung
{
Gọi đệ quy tới hàm với các giá trị khác nhau của tham số }
Ví dụ: Hàm tìm USCLN của hai số nguyên dương
int USCLN(int x, int y)
{
if (x == y) return x;
else
if (x > y) return USCLN(x-y, y);
else USCLN(x, y-x);
Trang 35// Tim day Fibonacci bang PP lap
for (int i=2; i<=n; i++) {
} return f2;
//for (int i=0;i<=k; i++)
// cout << setw(5) << fibo2(i);
for (int i=0;i<=k; i++)
cout << setw(5) << fibodq(i);
getch();
}
Trang 364.4 Chú ý
• Ưu điểm của phép đệ quy là làm cho CTC trở nên gắn gọn và dễ hiểu Xong mỗi lần gọi đệ quy, trên Stack xuất hiện các tham biến trị và cục bộ mới, dẫn tới tốn nhiều ô nhớ và thời gian
• Chỉ nên dùng đệ quy với những bài toán và các cấu trúc dữ liệu
mà bản thân chúng được định nghĩa theo lối đệ qui Nói chung nên tránh dùng phép đệ quy khi có thể dùng phép lặp để tính toán
• Việc chuyển viết một hàm theo phương pháp đệ quy bằng phương pháp dùng các vòng lặp được gọi là sự khử đệ qui
Trang 37Ch−¬ng 4 M¶ng vµ chuçi
Trang 380 1 2
Số l−ợng các hằng trong danh sách khởi tạo phải nhỏ hơn hoặc bằng kích
cỡ của mảng, nếu nhỏ hơn thì các phần tử còn lại của mảng đ−ợc tự động khởi tạo giá trị 0 Ví dụ:
cin >> b[1][3]; // nhập giá trị từ bàn phím cho b[1][3]
Khai báo mảng nhiều chiều và khởi tạo giá trị cho chúng, ví dụ:
Ví dụ: Xây dựng hàm trả về tổng n phần tử đầu tiên của mảng:
s = a[0] + a[1] + + a[n-1]
Trang 39double TONG(double a[], int n)
for (int i=0; i<n; i++)
cout <<"\na[" << i+1 << "] = " << a[i];
for (int i=1; i<n; i++)
for (int j=1; j<=n-i; j++)
if (a[j-1]>a[j]) hoanvi(a[j-1], a[j]);
Trang 404.2 Chuỗi
4.2.1 Khai báo chuỗi
Chuỗi là dạng dữ liệu để lưu trữ và xử lý văn bản nhữ các từ, tên, câu Trong C không dữ liệu kiểu xâu (string) như trong Pascal hay Basic, mà thay bằng mảng kiểu char như sau:
char name[size];
Ví dụ:
char st[20] = “TIN HOC”;
Ta có thể biểu diễn chuỗi st trên như sau:
0 1 2 3 4 5 6 7 8 19
Hàm strlen(st) trả về độ dài thực của một chuỗi st
Hàm strcpy(st1, st2) sao chép xâu st2 sang xâu st1
Các chuỗi trong C có một số đặc tính sau:
• Một chuỗi C là một mảng char có thể truy nhập được bằng cách sử
đụng tên của nó và toán tử chỉ số, chẳng hạn như :
cout << st[2];
• Mỗi đối tượng chuỗi trong C có kiểu char*
• Các chuỗi trong C không thể được gán, thay vào đó dùng hàm strcpy(st1, st2) để sao chép chuỗi st2 sang chuỗi st1
• Toán tử nhập >> chỉ có thể dùng được nếu chuỗi không chứa khoảng trắng Để nhập từ bàn phím chuỗi có chứa khoảng trắng hãy dùng hàm gets(st)
• Cũng như mảng có thể khởi tạo chuỗi như ví dụ sau:
char th[] = { ‘T’, ‘I’, ‘N’, ‘ ‘, ‘H’, ‘O’, ‘C’, ‘\0’ };