P. 1
GiaotrinhC_HC

GiaotrinhC_HC

|Views: 563|Likes:
Published by Tú Phùng

More info:

Published by: Tú Phùng on Nov 01, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

11/05/2011

pdf

text

original

Sections

  • I.1.1.Lập trình
  • I.1.2.Một chương trình C++ đơn giản
  • I.1.3.Các chú thích
  • I.2.1.Identifiers (Định danh)
  • I.2.2.Keyword (Từ khóa)
  • I.2.3.1.Kiểu số nguyên
  • I.2.3.2.Kiểu số thực
  • I.2.3.3.Kiểu boolean:
  • I.2.4.Khai báo biến
  • I.2.5.Khởi tạo các biến
  • I.2.6.Phạm vi hoạt động của các biến
  • I.2.7.2.Phân loại:
  • I.2.7.3.Các hằng số nguyên
  • I.2.7.4.Hằng long int
  • I.2.7.5.Các hằng số thập phân (dạng dấu phẩy động)
  • I.2.7.6.Kí tự và xâu kí tự
  • I.2.8.Định nghĩa các hằng (#define)
  • I.2.9.Khai báo các hằng (const)
  • I.3.1.Lệnh xuất (cout) Cú pháp:
  • I.3.2.Nhập dữ liệu (cin)
  • I.3.3.Lệnh nhập trong ngôn ngữ C: hàm scanf (đọc thêm)
  • I.3.4.Lệnh xuất trong ngôn ngữ C: hàm printf (đọc thêm)
  • I.3.5.Định dạng kết quả xuất:
  • I.4.1.Tiền xử lý và biên dịch
  • I.4.2.Cấu trúc một chương trình C++
  • I.4.3.Các tập tin thư viện thông dụng
  • II.1GIỚI THIỆU
  • II.2.1.Toán tử gán (assignment operator):
  • II.2.2.Các toán tử số học (number operator)
  • II.2.3.Các toán tử gán phức hợp (complex operator)
  • II.2.4.Tóan tử tăng và giảm (increase/descrease operator)
  • II.2.5.Toán tử quan hệ (relation operator):
  • II.2.6.Toán tử logic (logic operator):
  • II.2.7.Toán tử điều kiện (condition operator):
  • II.2.8.Toán tử lấy kích thước (size operator)
  • II.2.9.Toán tử BITWISE (Bit operator)
  • II.2.10.Toán tử con trỏ & và * (pointer operator)
  • II.3CHUYỂN ĐỔI KIỂU DỮ LIỆU:
  • II.4ĐỘ ƯU TIÊN CỦA CÁC TOÁN TỬ:
  • III.1GIỚI THIỆU
  • III.2CẤU TRÚC RẼ NHÁNH
  • III.3CẤU TRÚC LỰA CHỌN (switch):
  • III.4.1.Vòng lặp while
  • III.4.2.Vòng lặp do… while
  • III.4.3.Vòng lặp for:
  • III.5.1.Lệnh continue
  • III.5.2.Lệnh break
  • III.5.3.Lệnh goto
  • III.5.4.Lệnh return
  • IV.1KHÁI NIỆM VỀ HÀM TRONG C++
  • IV.2.1.Định nghĩa hàm
  • IV.2.2.Sử dụng hàm
  • IV.2.3.Nguyên tắc hoạt động của hàm
  • IV.2.4.2.Tham số tham chiếu (pass reference parameter):
  • IV.2.5.2.Biến toàn cục (global variables):
  • IV.2.5.3.Toán tử phạm vi (scope resolution)
  • IV.2.6.1.Lớp lưu trữ cục bộ
  • IV.2.6.2.Các lớp lưu trữ biến toàn cục:
  • V.1Mảng (Array)
  • V.2.1.2.Khai báo mảng với số phần tử không xác định (khai báo không tường minh)
  • V.2.1.3.Vừa khai báo vừa gán giá trị
  • V.2.1.4.Khai báo mảng là tham số hình thức của hàm:
  • V.2.2.Truy xuất từng phần tử của mảng
  • V.3.1.2.Khai báo mảng 2 chiều không tường minh
  • V.3.2.Truy xuất từng phần tử của mảng 2 chiều
  • V.3.3.Khai báo mảng 2 chiều như một tham số:
  • V.3.4.2.Sắp xếp:
  • VI.1Giới thiệu dữ liệu kiểu dữ liệu:
  • VI.2.1.Khai báo biến con trỏ
  • VI.2.2.2.Toán tử tham chiếu (*)
  • VI.2.3.1.Phép gán con trỏ:
  • VI.2.3.2. Cộng, trừ con trỏ với một số nguyên
  • VI.2.4.1.Truy cập các phần tử mảng theo dạng con trỏ
  • VI.2.4.2.Truy xuất từng phần tử đang được quản lý bởi con trỏ theo dạng mảng
  • VI.2.5.Truyền địa chỉ cho tham số bởi con trỏ:
  • VI.3.1.Toán tử new
  • VI.3.2.1.NULL
  • VI.3.2.2.Bộ nhớ động trong ANSI-C
  • VII.1KHÁI NIỆM
  • VII.2.1.Khai báo theo mảng
  • VII.2.2.Khai báo theo con trỏ
  • VII.2.3.Vừa khai báo vừa gán giá trị
  • VII.3.1.Nhập xuất
  • VII.3.2.Truy xuất từng ký tự trong chuỗi:
  • VII.4.1.Con trỏ và chuỗi
  • VII.4.2.Các hàm thao tác trên chuỗi:
  • VIII.1Định nghĩa
  • VIII.2.1.Đệ quy tuyến tính
  • VIII.2.2.Đệ quy nhị phân
  • VIII.2.3.Đệ quy phi tuyến
  • VIII.2.4.Đệ quy hỗ tương
  • VIII.3Đặc điểm cần lưu ý khi viết hàm đệ quy
  • IX.1.1.Khái niệm
  • IX.1.2.Định nghĩa kiểu cấu trúc
  • IX.1.3.Khai báo biến cấu trúc
  • IX.2.1. Truy xuất đến từng trường của biến cấu trúc
  • IX.2.2.Khởi tạo giá trị cho biến cấu trúc
  • IX.2.3.Mảng cấu trúc:
  • IX.2.4.Tham số kiểu cấu trúc:
  • IX.3UNION:

Giáo trình Phương pháp lập trình

Trung tâm Công Nghệ Thông Tin

CHƯƠNG I: TỔNG QUAN VỀ NGÔN NGỮ C++
I.1 CÁC KHÁI NIỆM CƠ BẢN
Nội dung chương này giới thiệu những phần cơ bản của một chương trình C++. Một số ví dụ đơn giản để trình bày cấu trúc các chương trình C++ và cách thức biên dịch chúng. Các khái niệm cơ bản như là hằng, biến, và việc lưu trữ chúng trong bộ nhớ…

I.1.1. Lập trình
Máy tính số là một công cụ để giải quyết hàng loạt các bài toán lớn. Một lời giải cho một bài toán nào đó được gọi là một giải thuật (algorithm), nó mô tả một các bước cần thực hiện để giải quyết bài toán Giải thuật được diễn giải bằng các thuật ngữ trừu tượng mang tính chất dễ hiểu. Ngôn ngữ thật sự được hiểu bởi máy tính là ngôn ngữ máy. Một chương trình được viết bằng bất kỳ một ngôn ngữ nào khác thì trước hết cần được dịch sang ngôn ngữ máy để máy tính có thể hiểu và thực thi nó. Ngôn ngữ máy rất khó hiểu đối với lập trình viên vì thế họ không thể sử dụng trực tiếp ngôn ngữ máy để viết chương trình. Một sự trừu tượng khác là ngôn ngữ assembly. Nó cung cấp những tên dễ nhớ cho các lệnh và một ký hiệu dễ hiểu hơn cho dữ liệu. Bộ dịch được gọi là assembler chuyển ngôn ngữ assembly sang ngôn ngữ máy. Ngay cả những ngôn ngữ assembly cũng khó sử dụng. Những ngôn ngữ cấp cao như C++ cung cấp các ký hiệu thuận tiện hơn nhiều cho việc thi hành các giải thuật. Chúng giúp cho các lập trình viên không phải nghĩ nhiều về các thuật ngữ cấp thấp, và giúp họ chỉ tập trung vào giải thuật. Trình biên dịch (compiler) sẽ đảm nhiệm việc dịch chương trình viết bằng ngôn ngữ cấp cao sang ngôn ngữ assembly. Mã assembly được tạo ra bởi trình biên dịch sau đó sẽ được tập hợp lại để cho ra một chương trình có thể thực thi.

I.1.2. Một chương trình C++ đơn giản
Ví dụ :xuất ra màn hình dòng chữ Hello World // my first program in C++ #include <conio.h> //Kết quả: Hello #include <iostream.h> int main () { cout << "Hello World!"; getch(); return 0; }

World!

Đây là chương trình đơn giản nhưng nó đã bao gồm những phần cơ bản mà mọi chương trình C++ đều có. Với ý nghĩa của từng dòng như sau:

Tổ tin học Cơ sở

1

Giáo trình Phương pháp lập trình // my first program in C++

Trung tâm Công Nghệ Thông Tin

Đây là dòng chú thích. Tất cả các dòng bắt đầu bằng hai dấu // được coi là chú thích mà nó không ảnh hưởng đến hoạt động của chương trình, dùng để giải thích mã nguồn của chương trình, dòng chú thích thường là một giải thích ngắn gọn những ý nghĩa của dòng lệnh tương ứng. #include Các câu bắt đầu bằng dấu # được dùng cho chỉ thị tiền xử lý (preprocessor). Trong ví dụ này, câu lệnh #include báo cho trình dịch biết cần phải "include" thư viện iostream.h là tập tin header chuẩn của C++, chứa các định nghĩa cho xuất và nhập int main () Định nghĩa hàm main. Hàm main là điểm mà tất cả các chương trình C++ bắt đầu thực hiện. Nó không phụ thuộc vào vị trí của hàm, nội dung của nó luôn được thực hiện đầu tiên khi chương trình thực thi. một chương trình C++ đều phải tồn tại một hàm main(). Hàm main() có thể có hoặc không có tham số. Nội dung của hàm main tiếp ngay sau phần khai báo chính thức được đặt trong các ngoặc { }. cout << "Hello World"; Đây là nội dung chính của chương trình. cout là một dòng (stream) output chuẩn trong C++ được định nghĩa trong thư viện iostream.h, khi dong lệnh này được thực thi, thì kết quả là xuất kí tự "Hello World" ra màn hình. Dòng lệnh được kết thúc bằng dấu chấm phẩy ( ; ). getch(); Lệnh này tạm dừng màn hình để xem kết quả. return 0; Lệnh return kết thúc hàm main và trả về mã đi sau nó, trong trường hợp này là 0. Đây là một kết thúc bình thường của một chương trình không có một lỗi nào trong quá trình thực hiện. Chương trình trên có thể viết lại như sau: int main () { cout << " Hello World "; getch(); return 0; } cũng cho một kết quả chính xác như nhau.

I.1.3. Các chú thích.
Các chú thích được các lập trình viên sử dụng để ghi chú hay mô tả trong các phần của chương trình. Trong C++ có hai cách để chú thích: − // Chú thích theo dòng : bắt đầu từ cặp dấu // cho đến cuối dòng. − /* Chú thích theo khối */ : bắt đầu bằng /* và kết thúc bằng */ Ví dụ: /* my second program in C++ with more comments */ #include <conio.h> #include <iostream.h> int main ()

Tổ tin học Cơ sở

2

Giáo trình Phương pháp lập trình {

Trung tâm Công Nghệ Thông Tin

cout << "Hello World! "; // says Hello World! cout << "I'm a C++ program"; // says I'm a C++ program getch(); return 0; } Kết quả của chương trình: Hello World! I'm a C++ program

I.2

BIẾN – KIỂU DỮ LIỆU – HẰNG
Một tên (indentifiers) hợp lệ là một gồm các chữ cái, chữ số hoặc kí tự gạch dưới. Chiều dài của một tên là không giới hạn Tên dùng làm tên hằng, tên biến , nhãn , tên hàm.... Ví dụ : - Tên đúng : _abc, Delta_1, BETA. - Tên sai : 1xyz ( vì bắt đầu là 1 chữ số ) A#B ( vì có dâu #) X-1 (vì sử dụng dấu gạch ngang). Tên không được chứa khoảng trắng, tên biến luôn phải bắt đầu bằng một chữ cái, kí tự gạch dưới ( _ ) . Không bắt đầu bằng một chữ số, các tên không được trùng với khoá của ngôn ngữ hay của trình dịch.

I.2.1. Identifiers (Định danh)

I.2.2. Keyword (Từ khóa)
Một số từ được giữ bởi C++ cho một số mục đích riêng và không thể được dùng cho các định danh gọi là từ khóa. Dưới đây là danh sách từ khoá theo chuẩn ANSI-C++

asm auto break case catch char class const

continue default delete do double Else Enum extern

float for friend goto if inline int long

new operator private protected public register return short

signed sizeof static struct switch template this throw

try typedef union unsigned virtual void volatile while

Ngoài ra, một số biểu diễn khác của các toán tử (operator) cũng không được dùng làm tên vì chúng là những từ được dành riêng trong một số trường hợp như: and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq Trình dịch có thể thêm một từ dành riêng đặc trưng khác. Ví dụ, rất nhiều trình dịch 16 bit (như các trình dịch cho DOS) còn có các từ khoá far, huge và near.

Tổ tin học Cơ sở

3

Một byte có thể dùng để lưu trữ một loại dữ liệu nhỏ như là kiểu số nguyên từ 0 đến 255 hay một kí tự. Tuy nhiên. phân biệt chữ hoa chữ thường. ta lưu trữ dữ liệu trong bộ nhớ của máy tính.3. như số nguyên dài hay số thập phân. kiểu số thực.1.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Chú ý: Ngôn ngữ C++. Long integer. 2bytes 4bytes 4bytes Tổ tin học Cơ sở 4 . Short Integer. các kiểu dữ liệu khác nhau sẽ cần dung lượng bộ nhớ khác nhau. Bộ nhớ của máy tính được tổ chức thành các đơn vị lưu trữ nhỏ nhất là byte.2. Do vậy biến RESULT khác với result cũng như Result. I.2. Integer. máy tính có thể xử lý các kiểu dữ liệu phức tạp hơn bằng cách gộp nhiều byte lại với nhau. Kiểu số nguyên Name char short int (short) int long int (long) Description Size Range* signed: -128 to 127 unsigned: 0 to 255 signed: -32768 to 32767 unsigned: 0 to 65535 signed: -2147483648 to 2147483647 unsigned: 0 to 4294967295 signed: -2147483648 to 2147483647 unsigned: 0 to 4294967295 Character or small 1byte integer. Ngôn ngữ C++ có các kiểu dữ liệu cơ bản: kiểu số nguyên.3. Các kiểu dữ liệu Khi lập trình. kiểu boolean I.

vì vậy trong khai báo thứ hai ta có thể viết lại: int MyAccountBalance. Ví dụ : int a. long và int) có thể là số có dấu hay không dấu tuỳ theo miền giá trị mà chúng ta cần biểu diễn.308 (15 digits) 1. c.4932 (19 digits) I. int c. Size 1byte Range* true or false I. cũng hoàn toàn tương đương với dòng khai báo ở trên.2.2e +/. mỗi biến có 1 tên và địa chỉ vùng nhớ dành riêng cho nó. Vì vậy khi xác định một kiểu số nguyên. signed int MyAccountBalance.2.2. Range* 3. ta có thể khai báo chúng trên một dòng.2. Để có thể sử dụng một biến trong C++. Ví dụ: unsigned short NumberOfSons. b. // Khai báo một biến a kiểu int float mynumber. It can take one of two values: true or false. Khai báo biến Biến đại lượng thay đổi. Kiểu số thực Name float double long double Description Floating point number.4. ngăn cách các tên bằng dấu phẩy. Tổ tin học Cơ sở 5 . Ví dụ int a.3. short.// khai báo một biến kiểu float với tên mynumber Nếu khai báo nhiều biến có cùng một kiểu. Các kiểu số nguyên (char.Giáo trình Phương pháp lập trình I.38 (7 digits) 1. Long double precision floating point number.b và c) tương đương với: int a. Trung tâm Công Nghệ Thông Tin Size 4bytes 8bytes 10bytes Double precision floating point number. Kiểu boolean: Name bool Description Boolean value.3. //khai báo ba biến kiểu int (a. Cú pháp: < Kiểu dữ liệu > < Danh sách các biến >.7e +/. int b. Nếu không chỉ rõ signed hay unsigned thì biến đó sẽ được coi là có dấu. trước hết ta phải khai báo biến.4e +/. ta đặt từ khoá signed hoặc unsigned trước tên kiểu dữ liệu.3.

Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Trong thực tế. I. // print out the result: cout << result. Khởi tạo các biến Khi khai báo một biến. // terminate the program: getch(). Ngoại lệ duy nhất của luật này là kiểu char. } I.h> int main () { // declaring variables: int a. return 0.b. rất ít khi dùng đến từ khoá signed. Ví dụ: int a = 0. Một điểm khác biết giữa Cvà C++ là trong C++ có thể khai báo biến ở bất kì vị trí nào trong chương trình.vì nó sẽ rất hữu dụng khi cần sửa chữa một chương trình có tất cả các phần khai báo được gộp lại với nhau. // process: a = 5.5. a = a + 1.h> #include <iostream. Ví dụ: int a (0). Trong chuẩn ANSI-C++ nó là kiểu dữ liệu khác với signed char và unsigned char.2. int result. b = 2. b. giá trị mặc định của biến là không xác định. Ngoài ra trong C++ cũng có thể khởi tạo biến bằng cách khác như sau: type identifier (initial_value) . Tổ tin học Cơ sở 6 . ngoài tất cả các hàm (biến toàn cục). result = a . Tuy nhiên ta nên khai báo trước và đặt nó trong phần bắt đầu của mỗi hàm (biến cục bộ) hay trực tiếp trong thân chương trình. Nếu muốn biến mang một giá trị xác định nào đó thì phải khởi tạo nó Cú pháp: type identifier = initial_value .2. Phạm vi hoạt động của các biến Tất cả các biến sẽ sử dụng trong chương trình đều phải được khai báo trước.6. Ví dụ: // operating with variables #include <conio.

5. Nếu chúng được khai báo ở đầu một hàm main() thì tầm hoạt động sẽ là toàn bộ hàm main.7.7.3. Biến cục bộ (local variables) :Tầm hoạt động của biến bị giới hạn trong hàm mà nó được khai báo. Các hằng số nguyên − Có giá trị từ -32768 đến 32767 − Có thể viết theo hệ 16 bằng cách thêm tiền tố Ox − Hoặc theo cơ số 8 bằng cách thêm tiền tố O Ví dụ : // Cơ số 10 // cơ số 8 // cơ số 16 0 1 2 O3068 =6 * 8 +0*8 + 3* 8 = 198 trong hệ 10 0 1 2 O3458 = 5*8 +4*8 + 3*8 = 29 trong hệ 10 0 1 2 Ox147 = 7*16 +4*16 + 1*16 =327 trong hệ 10 I.1.2. hằng chuỗi. Các hằng số (Constants): I. Định nghĩa: Hằng là một đại lượng mà giá trị của nó không đổi.2. các biến được khai báo trong hàm main() chỉ có thể được dùng trong hàm đó.7.2. Các biến này không những được dùng trong một file mã nguồn mà còn trong tất cả các file được liên kết trong chương trình. Các hằng số thập phân (dạng dấu phẩy động) Tổ tin học Cơ sở 7 . không được dùng ở bất kì đâu khác.2.7.4. hằng số thực. Điều đó có nghĩa là trong ví dụ trên. I..2. Phân loại: Có thể chia ra các loại hằng sau: hằng số nguyên. … I. Nếu nó được khai báo trong một hàm tầm hoạt động sẽ là hàm đó. Trong C++ tầm hoạt động của một biến chính là khối lệnh mà nó được khai báo (một khối lệnh là một tập hợp các lệnh được đặt trong cặp dấu ngoặc nhọn { } ). Ví dụ: 75u 75l 75ul // unsigned int // long // unsigned long 75 0113 0x4b I.2.7. Hằng long int Giống như hằng số nguyên..2. I.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Biến toàn cục (Global variables ): là biến mà có thể được sử dụng ở bất kì đâu trong chương trình.7. ngay sau khi nó được khai báo. còn nếu được khai báo trong vòng lặp thì tầm hoạt động sẽ chỉ là vòng lặp đó. Ngoài ra còn có các biến ngoài (external).. chỉ khác thêm L hoặc l ở cuối.

).6. Các kí tự đơn và các xâu kí tự có một tính chất riêng biệt là các mã điều khiển. Khi viết các kí tự đơn hay các xâu kí tự cần phải đặ chúng trong các dấu nháy để phân biệt với các tên biến hay các từ khoá.34. dấu chấm thập phân và phần phân Ví dụ : Ví dụ : 214. . Sau đây là danh sách các mã điều khiển đó: \n \r \t \v \b \f \a \' \" \ \\ Ví dụ: '\n' '\t' Tổ tin học Cơ sở 8 Cách 2 : Viết theo dạng khoa học xuống dòng lùi về đầu dòng kí tự tab căn thẳng theo chiều dọc backspace sang trang Kêu bíp dấu nháy đơn dấu nháy kép dấu hỏi kí tự xổ ngược ... Kí tự và xâu kí tự Trong C++ còn tồn tại các hằng không phải kiểu số như: Ví dụ: 'z' 'p' "Hello world" "How do you do?" Hai biểu thức đầu tiên biểu diễn các kí tự đơn.543e7 = 15430000 123.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Hằng thập phân biểu diễn các số với phần thập phân và/hoặc số mũ. các kí tự được đặt trong dấu nháy đơn (').456E-4 = 0.7. 1. Có 2 cách viết Cách 1 : dạng thập phân: phần nguyên.234. hai biểu thức tiếp theo biểu thức các xâu kí tự được đặt trong dấu nháy kép ("). Chúng có thể bao gồm phần thập phân và kí tự e (biểu diễn 10 mũ. Tất cả đều bắt đầu bằng dấu xổ ngược (\).123456 ( 123.456/105) I.35 . như là mã xuống dòng (\n) hay tab (\t).2.

đó là lý do trình dịch coi cả dòng là một chỉ thị và dòng đó không cần kết thúc bằng dấu chấm phẩy. cần sử dụng kí tự xổ ngược (\) tiếp theo đó là mã ASCII viết trong hệ cơ số 8 hay cơ số 16.2. Trường hợp 1: mã ASCII được viết ngay sau dấu sổ ngược \ Trường hợp 2: để sử dụng số trong hệ cơ số 16 ta cần viết kí tự x trước số đó Ví dụ: \x20 hay \x4A Các hằng kí tự có thể được viết trên nhiều dòng nếu mỗi dòng được kết thúc bằng một dấu sổ ngược (\) Ví dụ: "string expressed in \ two lines" I.Giáo trình Phương pháp lập trình "Left \t Right" "one\ntwo\nthree" Trung tâm Công Nghệ Thông Tin Ngoài ra.14159265 #define NEWLINE '\n' #define WIDTH 100 Sau khi định nghĩa ta có thể sử dụng chúng như bất kì các hằng số nào khác ví dụ circle = 2 * PI * r. cout << NEWLINE.9. PI. nó là chỉ thị tiền xử lý (preprocessor). NEWLINE hay WIDTH) bằng giá trị mà chúng được định nghĩa. Khai báo các hằng (const) Cú pháp: const <kiểu dữ liệu> tên hằng = giá trị Ví dụ: Tổ tin học Cơ sở 9 . để biểu diễn một mã ASCII. Vì vậy các hằng số #define được coi là các hằng số macro Chỉ thị #define không phải là một lệnh thực thi.2. Cú pháp #define identifier value Ví dụ: #define PI 3. Định nghĩa các hằng (#define) Định nghĩa các hằng với tên tùy ý do lập trình viên tự đặt để có thể sử dụng thường xuyên mà không mất tài nguyên cho các biến. Trong thực tế việc duy nhất mà trình dịch làm khi nó tìm thấy một chỉ thị #define là thay thế các tên hằng tại bất kì chỗ nào chúng xuất hiện (như trong ví dụ trước.8. nó sẽ được coi là một phần của giá trị định nghĩa hằng. Nếu bạn thêm dấu chấm phẩy vào cuối dòng. I.

h được sử dụng với toán tử << (overloaded) trong đó biểu thức có thể là hằng.3 Các lệnh xuất nhập chuẩn Cú pháp: cout<<biểu thức.3. Trong ví dụ trên nó chèn "Output sentence". cout trong thư viện iostream. " << "I am " << "a C++ sentence". Trung tâm Công Nghệ Thông Tin Nếu kiểu không được chỉ rõ (như trong ví dụ cuối) trình dịch sẽ xem nó là kiểu int I. const to char tab = '\t'. const zip = 12440. Lệnh xuất (cout) Tổ tin học Cơ sở 10 . cout << "Second sentence.This is another sentence.1. trong C++ là: \n Ví dụ: cout << "First sentence. // Hiển thị Output sentence lên màn hình cout << 120. cout << "This is another sentence.Giáo trình Phương pháp lập trình const int width = 100. − cout không nhảy xuống dòng sau khi xuất dữ liệu. − Vì vậy khi muốn xuống dòng chúng ta phải sử dụng kí tự xuống dòng. Sự tiện lợi của việc sử dụng lặp lại toán tử chèn (<<) thể hiện rõ khi chúng ta muốn hiển thị nhiều biến và hằng.\n ".\nThird sentence. Kết quả trên màn hình như sau: First sentence. hằng số 120 và biến x vào dòng dữ liệu ra cout. vì vậy hai câu lệnh sau : cout << "This is a sentence. I. Ví dụ: cout << "Output sentence". − Toán tử chèn (<<) có thể được sử dụng nhiều lần trong một câu lệnh: Ví dụ: cout << "Hello. sẽ được hiển thị trên màn hình: This is a sentence.". I am a C++ sentence lên màn hình.". // Hiển thị số 120 lên màn hình cout << x. biến.". // Hiển thị nội dung biến x lên màn hình − Toán tử << được gọi là toán tử chèn vì nó chèn dữ liệu đi sau nó vào dòng dữ liệu đứng trước. biểu thức. I am "<<age<<"years old and my email address is " << email_add. Ví dụ: cout << "Hello. Câu lệnh trên sẽ in thông báo Hello.

Ví dụ: Int age." << endl." << endl. Kết quả là chương trình sẽ chạy sai vì đó không phải là những gì mà chương trình mong đợi từ người dùng. − endl có một tác dụng đặc biệt khi nó được dùng với các dòng dữ liệu sử dụng bộ đệm: các bộ đệm sẽ được flushed (chuyển toàn bộ thông tin từ bộ đệm ra dòng dữ liệu). Ví dụ: cin >> a >> b. Người sử dụng chương trình có thể là một trong những nguyên nhân gây ra lỗi trong một chương trình đơn giản sử dụng cin. Nhập dữ liệu (cin) Thao tác nhập chuẩn trong C++ được thực hiện bằng cách sử dụng toán tử >> với dòng cin (trong thư viện iostream.3. Trong khi bạn muốn nhận một số nguyên thì người sử dụng lại nhập vào một xâu kí tự. Có thể dùng cin để nhập một lúc nhiều dữ liệu từ người dùng. Second sentence. Cú pháp: cin>>tên biến.Giáo trình Phương pháp lập trình Second sentence.h) Theo sau toán tử này là biến sẽ lưu trữ dữ liệu được đọc vào. cin >> age. tương đương với 11 Tổ tin học Cơ sở . cin chỉ bắt đầu xử lý dữ liệu nhập từ bàn phím sau khi phím Enter được gõ. cout << "Second sentence. I. để xuống dòng ta có thể sử dụng endl. Third sentence. Vì vậy dù bạn chỉ nhập một kí tự thì cin vẫn sẽ chờ cho đến khi bạn gõ phím Enter. Ví dụ cout << "First sentence. theo mặc định cout không sử dụng bộ đệm. Tuy nhiên. Trung tâm Công Nghệ Thông Tin − Ngoài ra. sẽ in ra màn hình: First sentence.2. Khai báo biến age có kiểu int và đợi nhập dữ liệu từ cin (bàn phím) để lưu trữ nó trong biến kiểu nguyên này. Vì vậy khi bạn sử dụng dữ liệu nhập vào từ cin bạn phải tin chắc rằng người dùng sẽ hoàn toàn hợp tác và rằng anh ta sẽ không nhập tên của mình khi chương trình yêu cầu nhập số nguyên.

&bien1. Trung tâm Công Nghệ Thông Tin Trong cả hai trường hợp người sử dụng phải cung cấp hai dữ liệu. địa chỉ của các biến). nếu nhập nhiều hơn 4 ký số thì chỉ nhận được 4 ký số đầu tiên %f : Nhập số thực %6f : Nhập số thực tối đa 6 ký số (tính luôn dấu chấm).3. Lệnh nhập trong ngôn ngữ C: hàm scanf (đọc thêm) Là hàm cho phép đọc dữ liệu từ bàn phím và gán cho các biến trong chương trình khi chương trình thực thi.3. số chữ số thập phân. /*Doc gia tri cho bien2 co kieu thưc*/ scanf(“%d%f”. cin >> b. dấu tab hay kí tự xuống dòng. . I.Các định dạng: %[số ký số]d :Nhập số nguyên có tối đa <số ký số> %[số ký số] f :Nhập số thực có tối đa <số ký số> tính cả dấu chấm %c : Nhập một ký tự Ví dụ: %d : Nhập số nguyên %4d : Nhập số nguyên tối đa 4 ký số. Lệnh xuất trong ngôn ngữ C: hàm printf (đọc thêm) Hàm printf (trong thư viện stdio. Cú pháp: scanf(“ định dạng”. Trong ngôn ngữ C.. độ rộng. Ví dụ: scanf(“%d”.định dạng: dùng để qui định kiểu dữ liệu. Được viết như sau: &<tên biến>. Một số định dạng khi nhập kiểu số nguyên.h) dùng để xuất giá trị của các biểu thức lên màn hình. ký tự. đó là hàm scanf() nằm trong thư viện stdio. Giải thích: . Các biểu thức). I. Giải thích: Tổ tin học Cơ sở 12 ./*Doc gia tri cho bien1 co kieu nguyen*/ scanf(“%f”. Cú pháp: printf(“ định dạng ”.Địa chỉ của các biến: là địa chỉ (&) của các biến mà ta cần nhập giá trị cho nó.&bien1). một cho biến a và một cho biến b và được ngăn cách bởi một dấu trống hợp lệ: một dấu cách.h.Giáo trình Phương pháp lập trình cin >> a.. cách biểu diễn.4.&bien2). số thực.&bien2). nếu nhập nhiều hơn 6 ký số thì chỉ nhận được 6 ký số đầu tiên (hoặc 5 ký số với dấu chấm) .3.

float bien_thuc=123. . số thực.456703. } I. printf(“Gia tri thuc cua bien thuc =%f\n”.3..bien_thuc).Các định dạng: Định dạng %c %[n]d %[n]ld %[n]u %[n]o %[n]x %[n. printf(“Truoc khi lam tron=%f \n Sau khi lam tron=%.bien_nguyen). số chữ số thập phân.5. Ngôn ngữ C++. ký tự..m]f %s %e %E %g %G Kiểu dữ liệu char int long int int int int float char Công dụng Xuất một ký tự có mã ASCII tương ứng Xuất một số nguyên có chiều dài tối đa n Xuất một số nguyên dài có chiều dài tối đa n Xuất một số nguyên ở hệ 10 không dấu có chiều dài tối đa n Xuất một số nguyên ở hệ 8 tương ứng không dấu có chiều dài tối đa n Xuất một số nguyên ở hệ 16 tương ứng không dấu có chiều dài tối đa n Xuất một số thực có chiều dài tối đa n và làm tròn m chữ số phần thập phân Xuất nhiều ký tự (một chuỗi ký tự) Xuất số nguyên dạng khoa học Ví dụ: %d // In ra số nguyên %4d //In số nguyên tối đa 4 ký số. Định dạng kết quả xuất: Khi xuất dữ liệu ra màn hình. printf(“Gia tri nguyen cua bien nguyen =%d\n”. i=65.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin . nếu số cần in nhiều hơn 6 ký số thì in hết Ví dụ: include<stdio. nếu số cần in nhiều hơn 4 ký số thì in hết %f //In số thực %6f // In số thực tối đa 6 ký số (tính luôn dấu chấm). Một số định dạng khi đối với số nguyên. bien_thuc). độ rộng.2f”.h> void main() { int bien_nguyen=1234. cách biểu diễn.định dạng: dùng để qui định kiểu dữ liệu. đôi khi ta cần định dạng theo một yêu cầu nào đó.bien_thuc. • dec: hiển thị giá trị số ở hệ thập phân Tổ tin học Cơ sở 13 . cung cấp cho người lập trình một số cách để định dạng dữ liệu xuất như sau: • 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ị.

việc dịch (translation) một tập tin nguồn được tiến hành trên hai bước hoàn toàn độc lập với nhau: . //kết quả “.12” cout <<setw(10). Nói chung. cout <<hex <<15 // kết quả f cout <<oct <<10.h> hoặc #include<iostream.Chỉ thị việc định nghĩa các macros hoặc ký hiệu: #define Chỉ thị thứ nhất được sử dụng trước hết là nhằm gộp vào nội dung của các tập tin cần có (header file). . // kết quả 16 return..Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin • 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 Ví dụ: #include <iostream.Tiền xử lý. các chỉ thị này được nhận biết bởi chúng bắt đầu bằng ký hiệu #. phổ biến nhất là: #include <stdio. Hai bước này trong phần lớn thời gian được nối tiếp với nhau một cách tự động mà ta có cảm giác rằng nó đã được thực hiện như là một xử lý duy nhất. chủ yếu dựa trên việc diễn giải các mã lệnh rất đặc biệt gọi là các chỉ thị dẫn hướng của bộ tiền xử lý (destination directive of preprocessor). Tiền xử lý và biên dịch I. Bước tiền xử lý tương ứng với việc cập nhật trong văn bản của chương trình nguồn.4.1..h> void main() { cout <<setw(5) <<12. // kết quả 12 cout <<dec <<0x10. việc tồn tại của một bộ tiền xử lý (preprocessor?) nhằm chỉ rõ chương trình thực hiện việc xử lý trước.Biên dịch.h> #include <iomanip. Cấu trúc một chương trình C++ Tổ tin học Cơ sở 14 .2.Chỉ thị sự gộp vào của các tập tin nguồn khác: #include .h> Chỉ thị thứ hai rất hay được sử dụng trong các tập tin thư viện (header file) đã được định nghĩa trước đó và thường được khai thác bởi các lập trình viên trong việc định nghĩa các ký hiệu như là: #define NB_COUPS_MAX 100 #define SIZE 25 I.4 Cấu trúc của một chương trình C++ Trong C/C++. } I. không thể thiếu trong việc sử dụng một cách tốt nhất các hàm của thư viện chuẩn. Hai chỉ thị quan trọng nhất là: .4.

Cấu trúc có thể như sau: Các chỉ thị tiền xử lý (Preprocessor directives) #include <Tên tập tin thư viện> #define … Định nghĩa kiểu dữ liệu (phần này không bắt buộc): dùng để đặt tên lại cho một kiểu dữ liệu nào đó để gợi nhớ hay đặt 1 kiểu dữ liệu cho riêng mình dựa trên các kiểu dữ liệu đã có. không phải là phần định nghĩa hàm. khai báo biến ngoài. Khai báo các biến ngoài (các biến toàn cục) phần này không bắt buộc: phần này khai báo các biến toàn cục được sử dụng trong cả chương trình. Chương trình chính phần này bắt buộc phải có <Kiểu dữ liệu trả về> main() { Các khai báo cục bộ trong hàm main: Các khai báo này chỉ tồn tại trong hàm mà thôi. Các câu lệnh dùng để định nghĩa hàm main return <kết quả trả về>. các hàm tự tạo. kiểu kết quả trả về. Các câu lệnh dùng để định nghĩa hàm return <kết quả trả về>. chương trình chính (hàm main). các tham số. // Kiểu SoNguyen là kiểu int Khai báo các prototype (tên hàm.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Một chương trình C/C++ bao gồm các phần như: Các chỉ thị tiền xử lý. } … Tổ tin học Cơ sở 15 . Cú pháp: typedef <Tên kiểu cũ> <Tên kiểu mới> Ví dụ: typedef int SoNguyen. … của các hàm sẽ cài đặt trong phần sau. có thể là khai báo biến hay khai báo kiểu. phần này không bắt buộc): phần này chỉ là các khai báo đầu hàm. // Hàm phải trả về kết quả } Cài đặt các hàm <Kiểu dữ liệu trả về> function1( các tham số) { Các khai báo cục bộ trong hàm.

eof(). fclose().h hoặc iostream. clreol(). farcalloc().h: Tập tin định nghĩa các hàm tính toán gồm các hàm abs().3.… 6) graphics. … Còn nhiều tập tin khác nữa. … 5) io. cputs(). farmalloc(). putch().4. Gồm các hàm calloc(). getw(). log10(). _creat(). log().h: Tập tin định nghĩa các hàm liên quan đến việc quản lý bộ nhớ. in ký tự ra màn hình (putc()). muốn sử dụng các hàm trong các tập tin header này thì phải khai báo #include <Tên tập tin> ở phần đầu của chương trình 1) stdio. farfree(). putchar(). line(). getche(). getpass().h : Tập tin định nghĩa các hàm vào ra trong chế độ DOS (DOS console). fwrite(). free(). putpixel(). _read(). sqrt(). in ký tự ra màn hình (puts()). malloc(). Gồm các hàm in dữ liệu (printf())/cout.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin I. read(). pow(). putw()… 2) conio. filelength(). tan(). getchar(). circle().h (C++) Tập tin định nghĩa các hàm vào/ra chuẩn (standard input/output). fopen(). setcolor(). creat().… 4) alloc. sin(). Gồm initgraph(). xóa vùng đệm bàn phím (fflush()).… 3) math. getpixel(). _open(). Các tập tin thư viện thông dụng Đây là các tập tin chứa các hàm thông dụng khi lập trinh C/C++. nhập giá trị cho biến (scanf())/cin. atan(). lock(). close(). Tổ tin học Cơ sở 16 . Gồm các hàm clrscr(). creatnew(). fread(). cos(). acos(). asin(). cgets(). _close(). realloc(). Gồm các hàm open().h: Tập tin định nghĩa các hàm vào ra cấp thấp.h: Tập tin định nghĩacác hàm liên quan đến đồ họa. nhận một dãy ký tự từ bàm phím (gets()). nhận ký tự từ bàn phím (getc()). exp(). getch().

//Gán giá trị nguyên 5 cho biến a. biến hay kết quả của một biểu thức. một biến hoặc một biểu thức khác. a = 2 + b. − Một thuộc tính của toán tử gán trong C++ góp phần giúp nó vượt lên các ngôn ngữ lập trình khác là việc cho phép vế phải có thể chứa các phép gán khác. và điều kiện. Một biểu thức là bất kỳ sự tính toán nào mà cho ra một giá trị. Toán tử gán luôn được thực hiện từ trái sang phải. các biểu thức C++ thì khác với các biểu thức toán học. quan hệ. − Vế trái bắt buộc phải là một biến còn vế phải có thể là bất kì hằng.1 GIỚI THIỆU Chương này giới thiệu các toán tử xây dựng sẵn cho việc soạn thảo các biểu thức. Ví dụ: a = b. trong một vài trường hợp. luận lý. Khi thảo luận về các biểu thức. Biểu thức là một sự kết hợp giữa các toán tử (operator) và các toán hạng (operand) theo đúng một trật tự nhất định. Tuy nhiên. Vì vậy biểu thức sau cũng hợp lệ trong C++ a = b = c = 5.2 TOÁN TỬ II. ta thường sử dụng thuật ngữ ước lượng. và giảm. Ví dụ. Thường thì giá trị sau cùng chỉ là lý do cho việc ước lượng biểu thức. biểu thức cũng có thể cho các kết quả phụ. //gán giá trị của biến a bằng giá trị đang chứa trong biến b. Nó cũng cung cấp các toán tử cho ra các kết quả phụ hữu dụng như là gán. tương đương với b = 5. Ví dụ: a = 2 + (b = 5). b và c Toán tử gán dùng để gán một giá trị nào đó cho một biến Tổ tin học Cơ sở 17 . Các kết quả này là sự thay đổi lâu dài trong trạng thái của chương trình. Chương này lần lượt giới thiệu từng loại toán tử. − Chú ý rằng chúng ta chỉ gán giá trị của b cho a và sự thay đổi của b sau đó sẽ không ảnh hưởng đến giá trị của a.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin CHƯƠNG II:BIỂU THỨC II. C++ cung cấp các toán tử cho việc soạn thảo các biểu thức toán học. II. Trong trường hợp này. trên bit. chúng ta nói rằng một biểu thức ước lượng một giá trị nào đó. //gán giá trị 5 cho cả ba biến a. luật ưu tiên mà nó ảnh hưởng đến thứ tự ước lượng của các toán tử trong một biểu thức có nhiều tóan tử. Mỗi toán hạng có thể là một hằng. Toán tử gán (assignment operator): Ví dụ: a = 5.1. tăng.2.

5/2 bằng 2 trong phép chia nguyên. a = b.8 9 / 2. -.h> int main () { int a. • Nếu cả hai toán hạng là số nguyên thì kết quả sẽ là một số nguyên. // tương đương với a=a+2 cout << a. Các toán tử số học (number operator) Trong ngôn ngữ C/C++.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin II. Khi ta áp dụng phép / cho một số nguyên hay một ký tự.2. Chẳng hạn. return 0. • Một hoặc cả hai toán hạng là số thực thì kết quả sẽ là một số thực (real hay double) II. các toán tử +. bất kỳ phần dư nào cũng bị cắt bỏ.5 13 % 3 // kết quả 1 − Trừ toán tử lấy phần dư (% ) thì tất cả các toán tử số học có thể chấp nhận pha trộn các toán hạng số nguyên và toán hạng số thực.3.4 // kết quả 6. *.4 // kết quả -0.02 2 * 3.98 . / làm việc tương tự như khi chúng làm việc trong các ngôn ngữ khác. } Ví dụ n += 25 n -= 25 n *= 25 n /= 25 n %= 25 Tương đương với n = n + 25 n = n – 25 n = n * 25 n = n / 25 n = n % 25 Tổ tin học Cơ sở 18 .9 3. Các toán tử gán phức hợp (complex operator) Một đặc tính của ngôn ngữ C++ làm cho nó nổi tiếng là một ngôn ngữ súc tích chính là các toán tử gán phức hợp cho phép chỉnh sửa giá trị của một biến với một trong những toán tử cơ bản sau: Toán Tử += -= *= /= %= Ví dụ: #include <iostream. Toán tử + * / % Cộng Trừ Nhân Chia (chia nguyên) Lấy phần dư Tên Ví dụ 12 + 4. b=3.0 // kết quả 4.9 // kết quả 16.2.2. Ta có thể áp dụng chúng cho đa số kiểu dữ liệu có sẵn được cho phép bởi C. a+=2.

Chúng tương đương với +=1 hoặc -=1. Kết quả: A chứa giá trị 3. B chứa giá trị 4 Ví dụ 2: B=3. Kết quả: A chứa giá trị 4.4.2. các dòng sau là tương đương: a++. tuỳ theo biểu thức kết quả là đúng hay sai. Ví dụ 1: B=3.5 // kết quả 0 6. Toán tử == != < <= > >= Tên So sánh bằng So sánh không bằng So sánh nhỏ hơn So sánh nhỏ hơn hoặc bằng So sánh lớn hơn So sánh lớn hơn hoặc bằng Ví dụ 5 == 5 // kết quả 1 5 != 5 // kết quả 0 5 < 5.5.2. a+=1. B chứa giá trị 4 II. Ví dụ : 'A' < 'F' // kết quả là 1 //(tương đương với 65 < 70) Tổ tin học Cơ sở 19 . Theo chuẩn ANSI-C++ thì giá trị của thao tác quan hệ chỉ có thể là giá trị logic chúng chỉ có thể có giá trị true hoặc false. Vì vậy.5 // kết quả 1 5 <= 5 // kết quả 1 5 > 5. A=B++. − Toán tử tăng/giảm có 2 dạng: Tiền tố :++a Hậu tố: a++ Trường hợp toán tử được sử dụng như là một tiền tố ++a: giá trị của a tăng trước khi biểu thức được tính và giá trị đã tăng được sử dụng trong biểu thức Trong trường hợp toán tử được sử dụng như là một hậu tố a++ : giá trị trong biến a được tăng sau khi đã tính toán. A=++B.3 >= 5 //kết quả1 − Các toán hạng của một toán tử quan hệ phải ước lượng về một số. Toán tử quan hệ (relation operator): Để có thể so sánh hai biểu thức với nhau ta sử dụng các toán tử quan hệ.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin II. Tóan tử tăng và giảm (increase/descrease operator) − Toán tử tăng (++) và toán tử giảm (--) có tác dụng làm tăng hoặc giảm 1 giá trị lưu trong biến. a=a+1. Các ký tự là các toán hạng hợp lệ vì chúng được đại diện bởi các giá trị số.

Ví dụ: X = 10 Y = X > 9 ? 100 : 200 − Phép toán điều kiện cũng là một biểu thức nên nó có thể được sử dụng như một toán hạng của phép toán điều kiện khác. II. Tổ tin học Cơ sở 20 . Kết quả của chúng phụ thuộc vào mối quan hệ của hai đối số. Toán tử điều kiện (condition operator): Toán tử điều kiện yêu cầu 3 toán hạng. p =3. n = 2. Toán tử logic && và || được sử dụng khi tính toán hai biểu thức để lấy ra một kết quả duy nhất. Kết quả trả về là kích thước của kiểu dữ liệu đã chỉ định theo byte.2. chỉ có một đối số ở phía bên phải và có tác dụng làm là đổi ngược giá trị của đối số từ true sang false hoặc ngược lại.7. E3 được ước lượng và giá trị của nó là kết quả sau cùng. int min =(m < n ? (m < p ? m : p) : (n < p ? n : p)). Ngược lại. Toán tử logic (logic operator): Toán tử ! && || Ý nghĩa Phủ định và Hoặc Ví dụ !(5 == 5) // kết quả là 0 5 < 6 && 6 < 6 // kết quả là 0 5 < 6 || 6 < 5 // kết quả là 1 Toán tử ! tương đương với toán tử logic NOT.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin II. Cú pháp: E1?E2:E3 − E1 được ước lượng đầu tiên và được xem như là một điều kiện. Đối số thứ nhất Đối số thứ hai Kết quả a b a && b true true true true false false false true false false false false Kết quả a || b true true true false II. Chúng tương ứng với các toán tử logic AND và OR.2.2.6. Ví dụ: int m = 1. Nếu kết quả là 1 (true) thì E2 được ước lượng và giá trị của nó là kết quả sau cùng. Toán tử lấy kích thước (size operator) Sizeof(data_Type) Chức năng: dùng để tính kích thước của bất kỳ hạng mục dữ liệu hay kiểu dữ liệu nào.8.

cout << "double size = " << sizeof(double) << " bytes\n". cout << "float size = " << sizeof(float) << " bytes\n". Ta không thể sử dụng các toán tử Bitwise với dữ liệu thuộc các kiểu float. cout << "char* size = " << sizeof(char*) << " bytes\n". cout << "short size = " << sizeof(short) << " bytes\n". gán hay sự thay đổi các Bit thật sự trong 1 Byte của Word.55 size = 8 bytes 1. cout << "long size = " << sizeof(long) << " bytes\n".55L size = 10 bytes HELLO size = 6 bytes II. long double. mà trong C chuẩn là các kiểu dữ liệu và biến char. cout << "1.55 size = " << sizeof(1. Tổ tin học Cơ sở 21 .55) << " bytes\n". double. cout << "1.h> int main (void) { cout << "char size = " << sizeof(char) << " bytes\n".9.2. } Kết quả: char size = 1 bytes char* size = 2 bytes short size = 2 bytes int size = 2 bytes long size = 4 bytes float size = 4 bytes double size = 8 bytes 1. int. cout << "HELLO size = " << sizeof("HELLO") << " bytes\n". void hay các kiểu phức tạp khác Toán tử Tên Ví dụ ~ & | ^ << >> Phủ Định Bit Và bit Hoặc bit Hoặc exclusive bit Dịch trái bit Dịch phải bit ~'\011' // được '\366' '\011' & '\027‘ // được '\001' '\011' | '\027‘ // được '\037' '\011' ^ '\027‘ // được '\036' '\011' << 2 // được '\044' '\011' >> 2 // được '\002' − Phủ định bit(~) là một toán tử đơn hạng thực hiện đảo các bit trong toán hạng của nó.55L) << " bytes\n".Giáo trình Phương pháp lập trình Ví dụ: Trung tâm Công Nghệ Thông Tin #include <iostream. cout << "int size = " << sizeof(int) << " bytes\n".55L size = " << sizeof(1. Toán tử BITWISE (Bit operator) Các toán tử Bitwise ý nói đến kiểm tra.

Toán tử *: là một bổ sung cho &. Ví dụ: m = &count − Đặt vào biến m địa chỉ bộ nhớ của biến count. o Toán tử dịch phải cho kết quả là một bit sau khi thực hiện dịch n bit trong bit của toán hạng trái về phía phải. Toán tử &: là một toán tử quy ước trả về địa chỉ bộ nhớ của hệ số của nó.14 sang int để được 3 Tổ tin học Cơ sở 22 . o Toán tử dịch trái cho kết quả là một bit sau khi thực hiện dịch n bit trong bit của toán hạng trái về phía trái. Ví dụ : 105 & 7 = 1// 01101001 & 0000 0111= 00000001 105 | 7 = 127//01101001 | 0000 0111= 01101111 0x60 = 0x96 /* 0110 1001 = 1001 0110 */ II.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin − Và bit(&): so sánh các bit tương ứng của các toán hạng của nó và cho kết quả là 1 khi cả hai bit là 1.10. Bây giờ q sẽ có giá trị là 100 vì 100 được lưu trữ tại địa chỉ 2000 II. ngược lại là 1.14 // chuyển 3. Ta sẽ tìm hiểu kỹ hơn về con trỏ trong chương về con trỏ. ngược lại là 0. − XOR bit(^): so sánh các bit tương ứng của các toán hạng của nó và cho kết quả 0 khi cả hai bit là 1 hoặc cả hai bit là 0.2. Cách cơ bản nhất được thừa kế từ ngôn ngữ C là : (Kiểu dữ liệu)<biểu thức> Ví dụ: (int) 3.Chẳng hạn. Ví dụ: q = *m − Sẽ đặt giá trị của count vào q. ngược lại là 1. giả sử count có giá trị là 100. − Hoặc bit(|): so sánh các bit tương ứng của các toán hạng của nó và cho kết quả là 0 khi cả hai bit là 0. biến count ở vị trí bộ nhớ 2000.3 CHUYỂN ĐỔI KIỂU DỮ LIỆU: Một giá trị thuộc về những kiểu xây dựng sẵn mà chúng ta biết đến thời điểm này đều có thể được chuyển về bất kỳ một kiểu nào khác. Các bit trống sau khi dịch được đặt tới 0. Toán tử con trỏ & và * (pointer operator) Một con trỏ là địa chỉ trong bộ nhớ của một biến. Sau câu lệnh trên m sẽ nhận giá trị 2000. Một biến con trỏ là một biến được khai báo riêng để chứa một con trỏ đến một đối tượng của kiểu đã chỉ ra nó. đây là một toán tử quy ước trả về giá trị của biến được cấp phát tại địa chỉ theo sau đó. − Toán tử dịch trái bit và dịch phải bit: lấy một bit làm toán hạng trái của chúng và một số nguyên dương n làm toán hạng phải. Trong phần này chỉ đề cập ngắn gọn đến hai toán tử được sử dụng để thao tác với các con trỏ.

14 // chuyển 3.0 (char) 122 // chuyển 122 sang char có mã là 122 (unsigned short) 3. /= Ví dụ: Trong biểu thức: a = = b + c * d 23 Độ ưu tiên 1 2 3 4 5 6 7 1 8 9 10 11 12 13 14 Tổ tin học Cơ sở .Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin (long) 3. II. <<. +=. C++ cũng thực hiện chuyển kiểu không tường minh khi các giá trị của các kiểu khác nhau được trộn lẫn trong một biểu thức.14 // được 3 như là một unsigned short Các kiểu xây dựng sẵn có thể được sử dụng như các toán tử kiểu.4 ĐỘ ƯU TIÊN CỦA CÁC TOÁN TỬ: Thứ tự các toán tử được thực hiện trong một biểu thức là rất quan trọng. >> <.5. Các luật này chia các toán tử trong C++ ra thành các mức độ ưu tiên khác nhau. vì thế trước hết. *=.0 int i = 10.14 sang long để được 3L (double) 2 // chuyển 2 sang double để được 2. Khi tên kiểu chỉ là một từ thì có thể đặt dấu ngoặc xung quanh toán hạng Ví dụ: int(3. Điều này được gọi là chuyển kiểu tường minh. vì thế nó được chuyển thành int (hạ cấp) trước khi được gán cho i. ++. // nghĩa là: i = int(double(i) + d) Trong ví dụ cuối. // d nhận 1. Các toán tử ở mức cao sẽ có độ ưu tiên cao hơn so với các toán tử có độ ưu tiên thấp hơn. % +. Toán tử () !. -=.14 Trong một vài trường hợp. i được chuyển thành double (thăng cấp) và sau đó được cộng vào d.14) // như là: (int) 3. i + d bao hàm các kiểu không hợp nhau. /. Các toán tử kiểu là đơn hạng (chỉ có một toán hạng) và xuất hiện bên trong các dấu ngoặc về bên trái toán hạng của chúng. != () & ^ | && || ?: =. >. Ví dụ: double d = 1. --. >= = =. <=. và được xác định theo các luật ưu tiên. sizeof() *. Kết quả là double không hợp kiểu với i trên phía trái của phép gán. // i nhận 10 i = i + d.

• Sau đó kết quả được cộng tới b vì toán tử + có độ ưu tiên cao hơn toán tử = = • Sau cùng toán tử = = được ước lượng. Tổ tin học Cơ sở 24 . Ví dụ: Biểu thức trên được viết lại như sau a == (b + c) * d • Làm cho toán tử + được ước lượng trước toán tử *. Nếu muốn viết một biểu thức phức tạp mà lại không chắc lắm về thứ tự ưu tiên của các toán tử thì nên sử dụng các ngoặc đơn. − Các luật ưu tiên có thể được cho quyền cao hơn thông qua việc sử dụng các dấu ngoặc. − Các toán tử với cùng mức độ ưu tiên được ước lượng theo thứ tự ước lượng là từ phải sang trái Ví dụ: Trong biểu thức a = b += c vì thế b += c được ước lượng trước và kế đó là a = b. thực hiện điều này vì nó sẽ giúp chương trình dễ đọc hơn.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin • c * d được ước lượng trước vì toán tử * có độ ưu tiên cao hơn toán tử + và = =.

14*r.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Bài tập 1.14 //Phan khai bao thu vien #include<conio. //Phan xuat du lieu cout<<"Chu vi duong tron ban kinh "<<r<<" la "<< cv<<endl.hoặc dùng hằng M_PI trong thư viện <math. diện tích đường tròn tương ứng. . Nhập bán kính đường tròn r.hoặc khai báo hằng PI. cin>>r.h> void main() { clrscr(). //Phan nhap du lieu cout<<"Ban hay nhap ban kinh duong tron: ".14*r*r. getch(). Tính và xuất chu vi. //Lenh xoa man hinh //Phan khai bao bien float r.Dùng π =3. .h> #include<iostream. dt=3. (Hướng dẫn: cv=2*π *r và dt=π *r2 .14.dt. cout<<"Dien tich duong tron ban kinh "<<r<<" la "<<dt. //Phan xu ly tinh toan cv=2*3.h> của ngôn ngữ lập trình) Cách 1: dùng π =3. //Lenh dung man hinh } Tổ tin học Cơ sở 25 .cv.

//Lenh dung man hinh } Cách 3: dùng hằng M_PI do ngôn ngữ lập trình cung cấp sẵn trong thư viện math.dt.cv. cin>>r.dt. dt= PI*r*r.h> #include<iostream. //Phan xu ly tinh toan cv=2* PI*r. //Phan nhap du lieu cout<<"Ban hay nhap ban kinh duong tron: ". cout<<"Dien tich duong tron ban kinh "<<r<<" la "<<dt.h> #include<math. //Lenh xoa man hinh //Phan khai bao bien float r.cv.h //Phan khai bao thu vien #include<conio.Giáo trình Phương pháp lập trình Cách 2: dùng hằng PI tự định nghĩa //Phan khai bao thu vien #include<conio.h> void main() { clrscr().h> //Phan khai bao hang so const float PI=3. //Phan xuat du lieu Trung tâm Công Nghệ Thông Tin cout<<"Chu vi duong tron ban kinh "<<r<<" la "<< cv<<endl. getch(). //Lenh xoa man hinh //Phan khai bao bien float r.14159264. //Phan nhap du lieu cout<<"Ban hay nhap ban kinh duong tron: ".h> #include<iostream. cin>>r. void main() { clrscr(). Tổ tin học Cơ sở 26 .

h> void main() { clrscr(). dt=M_PI*r*r. //Lenh dung man hinh } Chú ý: muốn làm tròn số thì ta dùng hàm setprecision(n). cout<<"Dien tich duong tron ban kinh "<<r<<" la "<<dt. getch(). dt=M_PI*r*r.b. getch().cv.h> #include<iomanip. HD: cv=4*a và dt=a2 3. Tính và xuất chu vi. Tổ tin học Cơ sở 27 . Tính và xuất chu vi. với n là số chữ số lẻ //Phan khai bao thu vien #include<conio. Nhập cạnh a. Nhập cạnh a. cin>>r. //Lenh dung man hinh } 2.dt.Giáo trình Phương pháp lập trình //Phan xu ly tinh toan cv=2*M_PI*r. Nhập cạnh a.h> #include<iostream.h1. Tính và xuất chu vi. //Phan xu ly tinh toan cv=2*M_PI*r. diện tích hình thoi. HD: cv=2*(a+b) và dt=a*b 4. //Phan xuat du lieu Trung tâm Công Nghệ Thông Tin cout<<"Chu vi duong tron ban kinh "<<r<<" la "<< cv<<endl. diện tích hình vuông.h2. //Lenh xoa man hinh //Phan khai bao bien float r.h> #include<math. //Phan xuat du lieu cout<<"Chu vi duong tron ban kinh "<<r<<" la "<<setprecision(2)<<cv<<endl. cout<<"Dien tich duong tron ban kinh "<<r<<" la "<<setprecision(2)<<dt. //Phan nhap du lieu cout<<"Ban hay nhap ban kinh duong tron: ". diện tích hình chữ nhật.

b. 20. tích. HD: dùng hàm sqrt(a)= a 11.yA). B(xB. x là các số thực nhập vào từ bàn phím. Tính và xuất sinx. In ra ngày tháng năm theo dạng dd/mm/yy.h. Nhập vào hai số nguyên dương a. diện tích hình tam giác. minute=(t%3600)/60. Nhập 1 số n. In ra điểm trung bình của học sinh đó với hai số lẻ thập phân. Nhập 2 số nguyên a. cosx. 19.c. thương. năm. Viết chương trình nhập vào điểm ba môn Toán. yy : năm.y)=xy 9. 8. Ví dụ: 20/11/99 ) 17. b) In ra ký tự kế tiếp của nó.xA) 14. mm: tháng. Viết chương trình nhập vào số nguyên n và số thực x. HD: dùng hàm abs(a)=|a| 10.b. Nhập cạnh a. Nhập cạnh a.0/2*h1*h2 Trung tâm Công Nghệ Thông Tin 5. diện tích hình thang. Viết chương trình đảo ngược một số nguyên dương có đúng 3 chữ số. Nhập toạ độ 2 điểm A(xA. cos. HD: cv=(a+b+c+d) và dt=1.b.yA).yB). Nhập 1 số n. (dd: ngày.0/2*h*(a+b) 6. HD: các hàm sin. cotgx=1/tgx 12.c. Viết chương trình nhập vào một ký tự: a) In ra mã ASCII của ký tự đó. second=(t%3600)%60 16. HD: cv=a+b+c và dt= p * ( p −a ) * ( p −b) * ( p −c) với p=cv/2 7. HD: |AB|=dAB= ( x B − x A ) 2 + ( y B − y A ) 2 ) 13. Nhập 1 góc x. HD: dùng hàm pow(x. Tính và xuất ab. cotgx. Nhập toạ độ 2 điểm A(xA. tháng. Viết chương trình tính logax với a. Tính và xuất chu vi. Tổ tin học Cơ sở 28 . cosx=cos(t). Tính và xuất căn bậc hai của n. Hóa của một học sinh.yA) /(xB .yB). và x>0. Tính và xuất ra dạng Giờ:Phút:Giây Ví dụ: Nhập 3750 thì xuất ra 1:2:30 AM Nhập 51100 thì xuất ra 2:11:40 PM HD: hour=(t/3600)%24. Tính và xuất chu vi. Nhập vào số giây bất kỳ t. Tính và xuất giá trị tuyết đối. Tính hệ số góc của đường thẳng đi qua hai điểm đó theo công thức: Hệ số góc = (yB . tan chỉ tính theo đơn vị radian nên chúng ta phải đổi từ độ x sang độ radian t như sau: t=x*π /180 => sinx=sin(t). tgx. B(xB. Tính và xuất tổng. hiệu. Viết chương trình nhập vào ngày.Giáo trình Phương pháp lập trình HD: cv=4*a và dt=1. Lý. Tính và in ra biểu thức A = ( x 2 + x + 1) n + ( x 2 − x + 1) n 15. a>0. Tính và xuất độ dài đoạn AB. tgx=tan(t). a != 1.b.d.( dùng logax=lnx/lna) 18.

2 CẤU TRÚC RẼ NHÁNH Cấu trúc rẽ nhánh là một cấu trúc được dùng rất phổ biến trong các ngôn ngữ lập trình nói chung. khi CPU hoàn thành sẽ được chuyển giao tới một lệnh khác. Lệnh if cung cấp cách để thực hiện công việc này. Giống nhiều ngôn ngữ thủ tục khác. III. vì thế làm ảnh hưởng đến kết quả toàn bộ của chương trình.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin CHƯƠNG III: III. Lưu đồ cú pháp: Tổ tin học Cơ sở 29 . nhưng có thể chuyển hướng tới đường dẫn khác bởi các lệnh rẽ nhánh.1 GIỚI THIỆU CẤU TRÚC ĐIỀU KHIỂN Một chương trình đang chạy dành toàn bộ thời gian để thực thi các câu lệnh. Dòng điều khiển là một sự xem xét quan trong vì nó quyết định lệnh nào được thực thi và lệnh nào không được thực thi trong quá trình chương trình thực thi. − Các lệnh gán được sử dụng cho các tính toán đại số đơn giản. Khi lập trình. − Các lệnh rẽ nhánh được sử dụng để chỉ định đường dẫn của việc thực thi phụ thuộc vào kết quả của một điều kiện luận lý. Các lệnh điều khiển được sử dụng để làm chuyển đường dẫn thực thi tới một đường dẫn khác của chương trình. Thuật ngữ này phản ánh việc các câu lệnh đang thực thi hiện thời có sự điều khiển của CPU. C++ cung cấp những cấu trúc điều khiển khác nhau cho các mục đích khác nhau. Đặc trưng dòng điều khiển trong một chương trình là tuần tự. − Các lệnh lặp được sử dụng để chỉ định các tính toán cần được lặp cho tới khi một điều kiện luận lý nào đó được thỏa. đôi khi một lệnh thực hiện phụ thuộc vào một điều kiện nào đó cần được thỏa. − Các lệnh khai báo được sử dụng cho định nghĩa các biến. Thứ tự mà các câu lệnh được thực hiện được gọi là dòng điều khiển (flow control). Có hai dạng: Dạng 1: if (<biểu thức điều kiện>) lệnh.

xuất ra màn hình số lớn nhất #include <iostream. Ví dụ : Viết chương trình nhập vào một số thực a. getch(). } Giải thích: − Nếu nhập một số a ≠0 thì câu lệnh cout<<"Nghich dao cua “<<a<<”la ”<<1/a. cout<<”a =”<<a<<endl.h> int main () { int a. Ngược lại. Ví dụ : Viết chương trình nhập 2 số a và b. cout<<"Nhap a = ". cout<<”b=”<<b.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Ý nghĩa: Trước hết <biểu thứcđiều kiện> được ước lượng. Nếu kết quả là 0 (true) thì <lệnh> được thực thi.h> int main () { float a. if (a !=0 ) cout<<"Nghich dao cua “<<a<<”la ”<<1/a. cin>>a. b". không làm gì cả. return 0.h> #include<conio. return 0. if (a>b) { cout<<"Gia tri cua a lon hon gia tri cua b")<<endl.h> #include <conio. } getch(). ngược lại câu lệnh này không được thực hiện. − Lệnh getch() luôn luôn được thực hiện vì nó không phải là “lệnh liền sau” điều kiện if. cin>>a>>b.b. In ra màn hình kết quả nghịch đảo của a khi a ≠ 0 #include <iostream. } Dạng 2: if (<Biểu thức điều kiện>) <lệnh 1> else <lệnh 2> Tổ tin học Cơ sở 30 . cout<<”Nhap gia tri cua 2 so a. được thực hiện.

5. 6. getch(). Ngược lại. return 0. 9.h> void main () Tổ tin học Cơ sở 31 . Biết rằng . cin>>a. 7. 8.h> int main () { float a. } Ví dụ Viết chương trình nhập vào một số nguyên dương là tháng trong năm và in ra số ngày của tháng đó.Tháng có 28 hoặc 29 ngày : 2 #include <iostream. 10. 12 . khi a =0 in ra thông báo “Khong the tim duoc nghich dao cua a” #include <iostream. thì <lệnh 2> được thực thi.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Lưu đồ cú pháp: Ý nghĩa: Trước hết <biểu thức điều kiện> được ước lượng. Ví dụ : Viết chương trình nhập vào một số thực a. Nếu kết quả là 0 (true) thì <lệnh1> được thực thi.h> #include <conio.Tháng có 30 ngày: 4.h> #include<conio. 3. 11 .Tháng có 31 ngày: 1. In ra màn hình kết quả nghịch đảo của a khi a ≠0. cout<<"Nhap a = ". else cout<<“Khong the tim duoc nghich dao cua a”. if (a !=0 ) cout<<"Nghich dao cua “<<a<<”la”<<1/a.

else kind = special. else cout<<"Khong co thang”<<m. else if (m= =4||m= =6||m= =9||m= =11) cout<<"Thang “<<m<<”co 30 ngay". else { if (ch >= 'a' && ch <= 'z') kind = lowerLetter. getch().Ta có thể sử dụng các câu lệnh if…else lồng nhau. Trong trường hợp if…else lồng nhau thì else sẽ kết hợp với if gần nhất chưa có else. else { if (ch >= 'A' && ch <= 'Z') kind = upperLetter. Ví dụ: if (ch >= '0' && ch <= '9') kind = digit. Tổ tin học Cơ sở 32 . if (m= =1||m= =3||m= =5||m= =7||m= =8||m= =10||m= =12) cout<<"Thang “<<m<<”co 31 ngay ". else if (m= =2) cout<<"Thang “<<m<<”co 28 hoac 29 ngay". cin>>m.Trong trường hợp câu lệnh if “bên trong” không có else thì phải viết nó trong cặp dấu {} (coi như là khối lệnh) để tránh sự kết hợp else if sai. III.3 CẤU TRÚC LỰA CHỌN (switch): Lệnh switch cung cấp phương thức lựa chọn giữa một tập các khả năng dựa trên giá trị của biểu thức. else if (ch >= 'A' && ch <= 'Z') kind = capitalLetter.Giáo trình Phương pháp lập trình { Trung tâm Công Nghệ Thông Tin int m. cout<<"Nhap vao thang trong nam !". } Lưu ý: . else kind = special. else if (ch >= 'a' && ch <= 'z') kind = smallLetter. } } Để cho dễ đọc có thể sử dụng hình thức sau: if (ch >= '0' && ch <= '9') kind = digit. .

Ví dụ : Tổ tin học Cơ sở 33 . − Không bắt buộc phải có default. …). − Nếu giá trị của biểu thức bằng giá trị 1 thì thực hiện lệnh 1 rồi thoát. long. break. [default : Khối lệnh thực hiện công việc mặc định. so sánh tới giá trị n. … case giá trị n: Khối lệnh thực hiện công việc n. Lưu ý: − Biểu thức trong switch() phải có kết quả là giá trị kiểu số nguyên (int. break. Lưu đồ: Giải thích: − Trước hết tính giá trị của biểu thức.Giáo trình Phương pháp lập trình Cú pháp: Trung tâm Công Nghệ Thông Tin switch (<Biểu thức>) { case giá trị 1: Khối lệnh thực hiện công việc 1. nếu bằng giá trị 2 thì thực hiện lệnh 2 rồi thoát…. − Nếu tất cả các phép so sánh trên đều sai thì thực hiện công việc mặc định của trường hợp default. char. − Nếu giá trị của biểu thức khác giá trị 1 thì so sánh với giá trị 2.. − Các giá trị sau case cũng phải là kiểu số nguyên.

h> void main () { clrscr(). } Ví dụ : Nhập vào 2 số nguyên và 1 phép toán. Tổ tin học Cơ sở 34 . chia số nguyên này cho 2 lấy phần dư. ngược lại thì in ra thông báo “khong chia cho 0”. − Nếu phép toán là ‘+’.h> int main () { int a. break. clrscr(). } getch(). cout<<” Nhap vao 2 so nguyen :".“<<b<<” =”<<a-b. nếu số dư bằng 1 thì in thông báo “số lẻ”. fflush(stdin).h> #include<conio. − Nếu phép toán là ‘/’ thì kiểm tra xem số thứ 2 có khác không hay không? Nếu khác không thì in ra thương của chúng. Kiểm tra nếu phần dư bằng 0 thì in ra thông báo “số chẵn”.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Nhập vào một số nguyên. case '*': cout<<a<<” * “<<b<<” =”<<a*b. break. cin>>pheptoan. phandu. cout<<” Nhap vao so nguyen : ". int n. break. phandu=(songuyen % 2).//Xóa ký tự enter trong vùng đệm trước khi nhập phép toán cout<<” Nhap vao phep toan ". tích của 2 số. ‘-‘. break. switch(phandu) { case 0: cout<<n<<” la so chan ". break. case 1: cout<<n<<” la so le ". #include <iostream.h> #include<conio. switch(pheptoan) { case '+': cout<<a<<” + “<<b<<” =”<<a+b. b. case '-': cout<<a<<” . cin>>a>>b. cin>>n. hiệu. char pheptoan. ‘*’ thì in ra kết qua là tổng. float thuong. #include <iostream.

5. 6. break. 11 . 9. . cout<<" Nhap vao thangs trong nam ".h> #include<conio. break. } Ví dụ : Yêu cầu người thực hiện chương trình nhập vào một số nguyên dương là tháng trong năm và in ra số ngày của tháng đó. 3.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin case '/': if (b!=0) { thuong=(float)a/b.Tháng có 31 ngày: 1. switch(thang) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: cout<<"Thang”<<thang<<”co 31 ngay ". case 4: case 6: case 9: case 11: cout<<"Thang”<<thang<<”co 30 ngay ". break. cin>>thang. return 0.Tháng có 28 hoặc 29 ngày : 2 . } else cout<<"Khong chia duoc cho 0".h> int main () { int thang. 8. 12 . default : Tổ tin học Cơ sở 35 . 10. case 2: cout<<" Thang 2 co 28 hoac 29 ngay". cout<<a<<” / “<<b<<” =”<<thuong. clrscr(). } getch(). #include <iostream.Nếu nhập vào số <1 hoặc >12 thì in ra câu thông báo “không có tháng này “. break. 7.Tháng có 30 ngày: 4.

Nếu kết quả là 1(true) thì thực hiện lệnh (thân vòng lặp) và toàn bộ quá trình được lặp lại. Ví dụ : viết chương trình tính tổng của tất cả các số nguyên từ 1 tới n.h> #include<conio.4. 2 5 1 3 cout<<”Nhap n =”. Hai Ba 3 5 1 6 cin>>n. break. Sáu 6 5 0 while (i <= n) Tổ tin học Cơ sở 36 . Ngược lại.4 CẤU TRÚC LẶP (reiterate structure) Cấu trúc vòng lặp cho phép lặp lại nhiều lần 1 công việc (được thể hiện bằng 1 câu lệnh hay 1 khối lệnh) nào đó cho đến khi thỏa mãn 1 điều kiện cụ thể.1. #include <iostream.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin cout<<” Khong co thang”<<thang . sum. III. n. return 0. Bốn 4 5 1 10 i = 1. có thể làm thay đổi điều kiện. Vòng lặp while Vòng lặp while cho phép lặp một lệnh cho đến khi biểu thức điều kiện được thỏa. Cú pháp: while (<biểu thức điều kiện>) lệnh. Năm 5 5 1 15 sum = 0. − Khối lệnh thực hiện có thể rỗng. } getch(). Lưu đồ cú pháp: − Biểu thức điều kiện lặp: được ước lượng đầu tiên. } III. nếu ước lượng biểu thức điều kiện là 0 (false) thì vòng lặp được kết thúc.h> int main () lần lặp i n i <= n sum += i++ { Một 1 5 1 1 int i.

tong=0. } Ví dụ : Viết chương trình in ra trên màn hình một ma trận có n dòng m cột: 1 2 3 4 5 6 7 2 3 4 5 6 7 8 3 4 5 6 7 8 9 Tổ tin học Cơ sở 37 .h> #include<conio. clrscr().h> void main () { unsigned int n. Tính tổng của các số nguyên từ 1 đến n. i=1. cinn>>n. } } Trung tâm Công Nghệ Thông Tin Ví dụ : Viết đoạn chương trình in dãy số nguyên từ 1 đến 10. i+=1. getch(). #include <iostream. cout<<” Day so tu 1 den 10 :". while (i<=n) { tong+=i. #include <iostream.Giáo trình Phương pháp lập trình { sum += i.tong.h> #include<conio.i. } Cout<<” Tong tu 1 den “<<n<<”=”<<tong. cout<<” Nhap vao so nguyen duong n:". clrscr(). while (i<=10) { cout<<setw(3) <<i. i++. } Ví dụ : Viết chương trình nhập vào một số nguyên n. i++.h> void main () { int i. } getch(). i=1.

while (cot<=m) { cout<<setw<<dong+cot. cot. cot=1. } getch(). cin>>n>>m. dong=0. Vòng lặp do… while Vòng lặp do … while giống như vòng lặp while.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin #include <iostream. III. } dong++. n. dùng để lặp lại một công việc nào đó khi điều kiện còn đúng. clrscr(). while (dong<n) { cout<<"\n". m. vì vậy bên trong vòng lặp phải cung cấp một phương thức nào đó để buộc <biểu thức điều kiện> trở thành sai nếu không thì chương trình sẽ lặp vô tận. Cú pháp: do <Lệnh> while (<Biểu thức điều kiện>) Lưu đồ: Tổ tin học Cơ sở 38 .4.2. cot++. } Lưu ý: vòng lặp phải kết thúc ở một điểm nào đó.h> #include<conio.h> void main () { unsigned int dong. cout<<” Nhap vao so dong va so cot :".

h> #include<conio. i=1. − Trong vòng lặp do…while thì <lệnh> được thực hiện ít nhất 1 lần. do { cout<<setw(3)<<i. cout<<” Nhap vao so nguyen duong n:". } Ví dụ : Viết chương trình nhập vào một số nguyên n. ngay cả khi điều kiện sai − Vòng lặp dừng lại khi điều kiện sai.  Nếu điều kiện sai thì thoát khỏi vòng lặp do …while. tong=0. Ví dụ : Viết đoạn chương trình in dãy số nguyên từ 1 đến 10.h> void main () { int i. } while (i<=10). Tính tổng của các số nguyên từ 1 đến n. getch().Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin − Trước hết <lệnh> được thực hiện trước. clrscr(). có thể làm thay đổi điều kiện. cin>>n. − Khối lệnh thực hiện công việc có thể rỗng. i=1.i. } while (i<=n). cout<<” Tong tu 1 den”<<n<<”=”<<tong. sau đó kiểm tra <Biểu thức điều kiện>. i++. } Tổ tin học Cơ sở 39 .tong. do { tong+=i.h> #include<conio. cout<<"Day so tu 1 den 10 :". #include <iostream.h> void main () { unsigned int n.  Nếu điều kiện còn đúng thì thực hiện công việc rồi quay lại kiểm tra điều kiện tiếp. i+=1. getch(). #include <iostream. clrscr().

Cú pháp: for (biểu thức khởi tạo.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin III.3. Vòng lặp for: Chức năng chính của vòng lăp for là lặp lại một đọan lệnh nào đó đến khi nào biểu thức điều kiện còn mang giá trị đúng. Lệnh này được thực hiện chỉ một lần. vòng lặp for thường sử dụng trong những chương trình mà số lần lặp lại một đọan lệnh nào đó được biết trước.h> void main () Tổ tin học Cơ sở 40 . #include <iostream. Ví dụ: Viết chương trình tính tổng của các số nguyên từ 1 tới n. − Lệnh: được thực hiện khi điều kiện thỏa. nếu nó là đúng vòng lặp tiếp tục còn nếu không vòng lặp kết thúc và lệnh được bỏ qua. nó gán một giá trị khởi tạo ban đầu cho biến điều khiển. − Các lệnh tác động đến biểu thức điều kiện: được thực hiện để tăng/giảm biến điều khiển và vòng lặp quay trở lại bước 2.4.h> #include<conio. biểu thứcđiều kiện. Lưu đồ cú pháp: Lưu ý: Vòng lặp for thường được sử dụng trong các trường hợp mà có một biến được tăng hay giảm ở mỗi lần lặp. − Biểu thứcđiều kiện: được kiểm tra. Nó có thể là một lệnh đơn hoặc là một khối lệnh được đặt trong một cặp ngoặc nhọn {}. các lệnh tác động đến btđiều kiện) L Cách hoạt động của vòng lặp for như sau: − Biểu thức khởi tạo: được thực hiện.

getch().. Ví dụ. i <= n. n. if (num < 0) continue. ++i) sum += i. Tổ tin học Cơ sở 41 . − Trái với sự xuất hiện. vòng lặp kế tiếp mở đầu từ điều kiện lặp. for (. sum.) // tương đương với: while (I != 0) { Lệnh… } − Xóa tất cả các biểu thức cho chúng ta một vòng lặp vô hạn. cin>>n. Nó áp dụng tức thì cho vòng lặp gần với lệnh continue. xóa biểu thức đầu và biểu thức cuối cho chúng ta dạng giống như vòng lặp while: for (. và dừng khi số là 0. cout<<” tong cua “<<n<<”so nguyen la : ”<<sum. i <= n.5 CÁC LỆNH RẼ NHÁNH VÀ LỆNH NHẢY III. cout<<”Nhap so nguyen n:”.5. i != 0. Không sử dụng lệnh continue bên ngoài vòng lặp. sum = 0. lần lặp kế tiếp khởi đầu từ biểu thức thứ ba của vòng lặp. // xử lý số ở đây … } while (num != 0). phạm vi của I không ở trong thân của vòng lặp mà là chính vòng lặp. Trong vòng lặp while và vòng lặp do-while. − Bất kỳ biểu thức nào trong 3 biểu thức của vòng lặp for đều có thể rỗng.Giáo trình Phương pháp lập trình { Trung tâm Công Nghệ Thông Tin int i. Lệnh continue Lệnh continue dừng lần lặp hiện tại của một vòng lặp và nhảy tới lần lặp kế tiếp.1. } − C++ cho phép biểu thức đầu tiên trong vòng lặp for là một định nghĩa biến. Trong vòng lặp for.) // vòng lặp vô hạn { Lệnh… } III. có thể diễn giải như sau: do { cin >> num. Ví dụ trong vòng lặp trên thì I có thể được định nghĩa bên trong vòng lặp: for (int i = 1. Ví dụ: một vòng lặp thực hiện đọc một số. Điều kiện của vòng lặp này được giả sử luôn luôn là đúng. for (i = 1. i++) sum += i. xử lý nó nhưng bỏ qua những số âm.

lệnh continue áp dụng cho vòng lặp for và không áp dụng cho vòng lặp while: while (more) { for (i = 0. do..2.Giáo trình Phương pháp lập trình Điều này tương đương với: do { cin >> num. i < attempts. if (num >= 0) { // xử lý số ở đây … } } while (num != 0).5. Giống như lệnh continue. Không sử dụng lệnh break bên ngoài vòng lặp hay lệnh switch. if (num < 0) continue. Nó gây ra bước nhảy ra bên ngoài những lệnh này và vì thế kết thúc chúng. Ví dụ: Đọc vào một mật khẩu người dùng nhưng không cho phép một số hữu hạn lần thử: for (i = 0. i++) { cin >> num. hay for) hoặc một lệnh switch. if (num < 0) continue. // làm cho nhảy tới: i++ // xử lý số ở đây … } Khi lệnh continue xuất hiện bên trong vòng lặp được lồng vào thì nó áp dụng trực tiếp cho vòng lặp gần nó chứ không áp dụng cho vòng lặp bên ngoài. Lệnh break Lệnh break có thể xuất hiện bên trong vòng lặp (while. lệnh break chỉ áp dụng cho vòng lặp hoặc lệnh switch gần nó nhất.. i < n. // làm cho nhảy tới: i++ // process num here.. ++i) { cout << "Please enter your password: ". } III. Tổ tin học Cơ sở 42 . } //etc. Ví dụ: trong một tập các vòng lặp được lồng nhau sau đây. i < n. i++) { cin >> num. Trung tâm Công Nghệ Thông Tin − Một biến thể của vòng lặp này là để đọc chính xác một số n lần (cho tới khi số đó là 0) có thể được diễn giải như sau: for (i = 0..

Tuy nhiên. cin >>so.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin cin >> password. goto có một vài (dù cho hiếm) sử dụng chính đáng. Cú pháp: Goto Nhãn. Ví dụ: Tổ tin học Cơ sở 43 . }while (so>=0). } Ở đây phải giả sử rằng có một hàm Verify để kiểm tra một mật khẩu và trả về true nếu như mật khẩu đúng và ngược lại là false. getch(). Phần lớn các lập trình viên ngày nay tránh sử dụng nó để làm cho chương trình rõ ràng. } Chương trình trên nếu không dùng break có thể đuợc viết lại như sau: do { cout <<"Nhap mot so nguyen: ". if (so<0) break.tong=0. tong +=so. 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.h> #include <conio. trong đó nhãn là một định danh (identify) được dùng để đánh dấu đích cần nhảy tới. if (so>=0) tong +=so. Nhãn cần được theo sau bởi một dấu hai chấm (:) và xuất hiện trước một lệnh bên trong hàm như chính lệnh goto. // thoát khỏi vòng lặp cout << "Incorrect!\n".3. Lệnh goto Lệnh goto cung cấp một hình thức nhảy tự do không có cấu trúc (không giống như lệnh break và continue) nên dễ làm gãy đổ chương trình. clrscr(). } cout <<"\nTong cac gia tri da nhap la: "<<tong.h> void main() { int so. while (1) { cout <<"Nhap mot so nguyen: ". chương trình được kết thúc khi nhập số âm. #include <iostream. if (Verify(password)) // kiểm tra mật khẩu đúng hay sai break. return. cin >>so. III.5.

++i) { cout << "Please enter your password: ".5. Cú pháp: return biểu thức. Kiểu của giá trị này phải hợp với kiểu của hàm. cin >> password.. Ví dụ: int main (void) { cout << "Hello World\n". kiểu trả về của nó là kiểu int. Trường hợp kiểu trả về của hàm là void. Ngược lại. − Trong đó biểu thức chỉ rõ giá trị được trả về bởi hàm. Giá trị trả về của hàm main là những gì mà chương trình trả về cho hệ điều hành khi nó hoàn tất việc thực thi. i < attempts. nếu không trả về một giá trị sẽ mang lại một cảnh báo trình biên dịch. // drop out of the loop cout << "Incorrect!\n". biểu thức sau lệnh return rỗng: return.4. III. − Tổ tin học Cơ sở 44 . } Khi một hàm có giá trị trả về không là void (như trong ví dụ trên). if (Verify(password)) // check password for correctness goto out. Lệnh return Lệnh return cho phép một hàm trả về một giá trị cho thành phần gọi nó. Chẳng hạn dưới UNIX qui ước là trả về 0 từ hàm main khi chương trình thực thi không có lỗi. nó sẽ là bất cứ giá trị nào được giữ trong vị trí bộ nhớ tương ứng của nó tại thời điểm đó). } out: //etc. một mã lỗi khác 0 được trả về.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin for (i = 0. − Hàm mà được chúng ta thảo luận đến thời điểm này chỉ có hàm main. return 0.. Giá trị trả về thực sự sẽ không được định nghĩa trong trường hợp này (nghĩa là.

Nhập vào tháng t (với 1<=t<=12). Nhập vào một năm dương lịch. 8. năm). c. b. Kiểm tra số nguyên dương n có phải là số chính phương hay không? Tổ tin học Cơ sở 45 . Nhập vào tháng t (với 1<=t<=12). diện tích hình tam giác. Tính và xuất ra dạng Giờ:Phút:Giây Nhập 3750 thì xuất ra 1:2:30 AM Nhập 51100 thì xuất ra 2:11:40 PM HD: hour=(t/3600)%24. tháng. Kiểm tra xem chúng có cùng dấu hay không. Trung bình. Giải và biện luận phương trình bậc 1: ax+b=0. năm).Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin BÀI TẬP 1. tháng. hoặc chia hết cho 400). 5. 6. Nhập 3 số thực a. b. Cho biết t thuộc quí mấy trong năm. minute=(t%3600)/60. 19. Tìm ngày kế trước ngày vừa nhập (ngày/tháng/năm). Nhập 2 số a. Tính và xuất chu vi. Nhập vào hai số nguyên dương a. Nhập một số n bất kỳ. Nhập một số n có tối đa 2 chữ số. Nhập vào một ngày (ngày. Nhập vào một ngày (ngày. (vd: n=235 => Hai trăm ba mươi lăm. n=5 => năm). So sánh giá trị của chúng (lớn hơn. Cho biết ngày đó là ngày thứ bao nhiêu trong năm.. bằng). nhỏ hơn. Khá. a 3. Hãy cho biết cách đọc ra dạng chữ. (vd: n=2007 => Đinh Hợi) 16. Cho biết tháng t có bao nhiêu ngày. Tìm số lớn nhất. năm). Kiểm tra n là số chẵn hay số lẻ. c>=0. 12. 14. b>=0. Nhập một số n có tối đa 3 chữ số. second=(t%3600)%60 4. HD: cv=a+b+c và dt= HD: dùng hàm sqrt(a)= Ví dụ: p * ( p −a ) * ( p −b) * ( p −c ) với p=cv/2 2. 13. 10. Nhập 1 số n>=0. Yếu). 15. Giỏi. 20. Nhập cạnh a>=0. Tìm ngày kế sau ngày vừa nhập (ngày/tháng/năm). 9. 7. Lý. 11. Riêng tháng 2 thì phải kiểm tra năm nhuận (Năm nhuận là năm chia hết cho 4 mà không chia hết cho 100. n=305 => Ba trăm lẻ năm) 18. Nhập n. 17. Tính và xuất căn bậc hai của n. Hãy cho biết năm âm lịch. Hãy tính ĐTB và Cho biết sinh viên đó xếp loại gì (Xuất sắc. b. Hãy cho biết cách đọc ra dạng chữ. (vd: n=35 => Ba mươi lăm. Hãy cho biết cách đọc ra dạng chữ. Nhập vào một ngày (ngày. Nhập vào điểm Toán. tháng. Nhập vào số giây bất kỳ t>=0. Giải và biện luận phương trình bậc 2: ax2+bx+c=0. Hoá.

27. ch là “–“ thì thực hiện phép tính a . 25. Tính S(n)=1+2+3+ … + n. Saturday) ra màn hình. Viết chương trình nhập vào một số có 3 chữ số. Viết chương trình nhập từ bàn phím 2 số a.. phút. Tính tiền điện phải trả biết rằng cách thức tính tiền theo qui định như sau: • • • • 100 kwh định mức đầu tiên có đơn giá trung bình là 600đ/kwh Các kwh từ 101 đến 150 có đơn giá là 700đ/kwh Các kwh từ 151 đến 200 có đơn giá là 900đ/kwh Các kwh từ 201 trở đi có đơn giá là 1100đ/kwh 23. Tùy theo n=1. giây dạng (hh:mm:ss ).Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin 21.. diện tích của tam giác với yêu cầu sau khi nhập 3 số a.. c có tạo thành một tam giác không? Nếu có thì tính chu vi và diện tích. 9 và A.( if ) 26. Cộng thêm một số giây vào và in ra kết quả dưới dạng ( hh:mm:ss ).. Nhập vào số Kwh tiêu thụ điện.. 28.7 hãy in tương ứng các từ (Sunday. C. Viết chương trình nhập vào một số nguyên dương n với 1<=n<=7.. từ bàn phím. Tuesday. Một số nguyên dương chia hết cho 3 nếu tổng các chữ số của nó chia hết cho 3.. . '9' Các ký tự khác.. Viết chương trình tính chu vi. Tổ tin học Cơ sở 46 . C.. E .. b. D. ch là “*” thì thực hiện phép tính a * b và in kết quả lên màn hình. 22. Viết chương trình nhận vào giờ. Nhập n>=0.'Z' Các ký tự chữ thường: 'a' .2... Nếu không thì in ra câu " Không tạo thành tam giác". B. b và một ký tự ch. Hệ thập lục phân dùng 16 ký số bao gồm các ký tự 0 . 24. kiểm tra số đó có chia hết cho 3 dùng tính chất trên. Nếu: − − − − ch là “+“ thì thực hiện phép tính a + b và in kết quả lên màn hình. Các ký số A.b và in kết quả lên màn hình. 'z' Các ký tự chữ số : '0' . c phải kiểm tra lại xem a.. E. F có giá trị tương ứng trong hệ thập phân như sau: A 10 B 11 C 12 D 13 E 14 F 15 Hãy viết chương trình cho nhập vào ký tự biểu diễn một ký số của hệ thập lục phân và cho biết giá trị thập phân tương ứng.. ch là “/” thì thực hiện phép tính a / b và in kết quả lên màn hình. Trường hợp ký tự nhập vào không thuộc các ký số trên.F. đưa ra thông báo lỗi: "Hệ thập lục phân không dùng ký số này" 21. B.. b. Monsday. D. Kiểm tra một ký tự nhập vào thuộc tập hợp nào trong các tập ký tự sau: − − − − Các ký tự chữ hoa: 'A' .

. Nhập n>=0. Tính S ( x. Nhập x. + 1 3 1 5 1 2 1 4 1 2n Trung tâm Công Nghệ Thông Tin 1 2 1 3 1 n 28. n) = x + 42. Tính S(n)=1+1 × 2+1 × 2 × 3+ … +1 × 2 × 3 × … × n 36. Nhập n.n.. Liệt kê tất cả các ước số lẻ của số nguyên dương n. n) = x + 44. n) = x + 41. + 1 + 2 1 + 2 +3 1 + 2 + . Tính S (n) = n x ×n 33. Nhập n>=0.. Nhập n>=0..n)=xn 35. Nhập n. Tính S(n)=12+22+32+ … + n2. Tính S(n)=12+22+32+ … + n2. có n dấu căn lồng nhau. + 3! 5! ( 2n +1)! 40. S (n) = 1 + 2 + 3 + + (n − ) + n . + 1 1 1 2n +1 1 29. + 2! 3! n! x2 x4 x 2n + + .n. + n x2 x3 xn + + ... Tính S (n) = + + . 47 Tổ tin học Cơ sở . Nhập x. Tính S(x.n. Nhập n>=0.. Tính 45. Tính S(n)=1+3+ … + (n+1). Nhập n>=0.. n) = x + 43.n. + 1+ 2 1 + 2 +3 1 + 2 + . 47. Tính S(x.n.n. Nhập x. + n x2 x3 xn + + . + 31. Nhập n>=0. Tính S ( n) = 2 + 2 + 2 + + 2 . Tính S ( x. Tính T(n)=1 × 2 × 3 × … 34.n)=x2+x4+x6+ … +x2n 38. có n dấu căn lồng nhau.. 48. + 1 2 3 4 1 2 2 3 n n +1 2n +1 2n + 2 32.Giáo trình Phương pháp lập trình 22..... Tính S ( x....n. Nhập n>=0.. 1 . Nhập x..n)=x+x3+x5+ … +x2n+1 39.. Tính S ( n) = + + ... Nhập n. 25.n. 26. Nhập n>=0.. + 2! 4! 2n! x3 x5 x 2 n +1 + +. Tính S(n)=2+4+ … + (n+2).. Tính S (n) = 1 + + + . Tính S (n) = 1 + 1 1 1 + + . Nhập n>=0.. 23.. Liệt kê tất cả các ước số của số nguyên dương n. Tính T(x. Nhập x. Nhập n>=0.. Nhập x. Tính S ( n) =1 + + + .. Nhập n>=0.. Tính S(x.n. Nhập n. Tính 46. + n ×(n +1) 30. S (n) = n + (n − ) + (n − ) + + 2 + 1 1 2 . Tính S ( x. Tính S (n) = 1×2 + 2 ×3 +. .. + 27... Nhập x. .. Nhập x. Nhập n>=0. 24.n)=x+x2+x3+ … +xn 37. Nhập x. có n dấu căn lồng nhau. Tính S (n) = + + .

Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin 49. Vd: 12 có các ước số là 1. Kiểm tra n có phải là số nguyên tố hay không? 55. Kiểm tra số nguyên dương n có các chữ số toàn là chữ số lẻ hay không? 73. Tính tích các chữ số chẵn của số nguyên dương n. Tính tổng tất cả các ước số của số nguyên dương n. 57. Tính tích các chữ số lẻ của số nguyên dương n. 67. 76. 51. 52. Tìm Bội số chung lớn nhất của 2 số nguyên dương a.3 và 6=1+2+3  6 là số hoàn thiện) 69. Tìm ước số chung lớn nhất của 2 số nguyên dương a. 58. 50. Kiểm tra số nguyên dương n có các chữ số toàn là chữ số chẵn hay không? 72. Kiểm tra số nguyên dương n có các chữ số tăng dần từ trái qua phải hay không? 74.4. Tính tích các chữ số là số nguyên tố của số nguyên dương n. Vd: 9 có các ước số là 1. Kiểm tra số nguyên dương n có phải là số hoàn thiện (Pefect number) hay không? (Số hoàn thiện là số có tổng các ước số của nó (không kể nó) thì bằng chính nó. Vd: 6 có các ước số là 1. Tính tổng các chữ số chẵn của số nguyên dương n. Tính tồng các chữ số là số nguyên tố của số nguyên dương n. 53.3. Liệt kê các số nguyên tố nhỏ hơn hay bằng số nguyên dương n. 54. Tính tổng các chữ số lẻ của số nguyên dương n. 56. Tính tích tất cả các ước số của số nguyên dương n. 66. b. Liệt kê tất cả các ước số chẵn của số nguyên dương n. Đếm số lượng các chữ số lẻ của số nguyên dương n.3 và 9>1+3  9 là số không trọn vẹn) 71. 63. Tìm số nguyên dương m lớn nhất sao cho 1+2+3+…+m<n. a->z. Tìm số nguyên dương m nhỏ nhất sao cho 1+2+3+…+m>n. Xuất số đảo của số nguyên dương n. Xuất ra các ký tự từ A->Z. Nhập n>0. Kiểm tra số nguyên dương n có phải là số đối xứng hay không? 68. Liệt kê các chữ số là số nguyên tố của số nguyên dương n. Nhập n>0. 78. z->a. Z->A. 77.2. 64. 61. 59. Đếm số lượng các ước số của số nguyên dương n. 62. Kiểm tra số nguyên dương n có phải là số thịnh vượng (Abundant number) hay không? (Số thịnh vượng là số có tổng các ước số của nó (không kể nó) thì lớn hơn nó. Kiểm tra số nguyên dương n có phải là số không trọn vẹn (Deficient number) hay không? (Số không trọn vẹn là số có tổng các ước số của nó (không kể nó) thì nhỏ hơn nó. Tổ tin học Cơ sở 48 . b. 60.6 và 12<1+2+3+4+6  12 là số thịnh vượng) 70. 65. Đếm số lượng các chữ số chẵn của số nguyên dương n.2. Kiểm tra số nguyên dương n có các chữ số giảm dần từ trái qua phải hay không? 75. Tìm ước số lớn nhất của số nguyên dương n.

80. 37. Nhập n>0. + Nếu Sốnhập nhỏ hơn Sốmáy thì thông báo “Số bạn nhỏ hơn số máy”.100] là số của máy: Sốmáy (sử dụng hàm random).Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin 79. 25.Người nhập vào một số (Sốnhập) + Nếu Sốnhập lớn hơn Sốmáy thì thông báo “Số bạn lớn hơn số máy”. Tổ tin học Cơ sở 49 . Xuất ra các số lẻ nhỏ hơn 50 trừ các số 11. Hãy tìm số trâu mỗi loại? biết: Trăm trâu tăm cỏ Trâu đứng ăn năm Trâu nằm ăn ba Trâu già ba con một bó 83. . Xuất ra màn hình các hình có chiều cao h>0. ví dụ h=4 ta có các hình như sau: 84. Viết chương trình thực hiện trò chơi đoán số như sau: Máy lấy ra một số ngẫu nhiên n∈[1. 82. 81. Hãy tìm số gà và số chó? biết: Vừa gà vừa chó bó lại cho tròn ba mươi sáu con một trăm chân chẵn. Xuất ra bảng cửu chương n.

Trò chơi kết thúc khi: + Hoặc Bạn đã đoán trúng: thông báo “Ha ha bạn tài thật”. Cuối cùng thì thông báo kết quả của ván chơi. 85. người nào mà lấy được viên bi cuối cùng thì người đó bị thua” . hai người chơi lần lượt lấy đi các viên bi sao cho số viên bi lấy ít nhất là 1 và nhiều nhất là 3. + Hoặc Bạn đã đoán sai 7 lần: thông báo “Bạn đã thua rồi” và hiển thị Sốmáy. .Người chơi cần nhập vào số viên bi M và chọn lượt lấy bi trước (máy lấy trước hay bạn lấy trước) sau đó cứ thay phiên nhau lấy. Hãy viết chương trình mô phỏng trò chơi này sao cho máy có cơ hội thắng nhiều nhất.Giả sử bạn chơi với máy. Trò chơi lấy bì: “Có M viên bi. Tổ tin học Cơ sở 50 .Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin .

cout<<”so lon nhat la:”<<max(a. Trong C/C++. b ". b. chương trình con được gọi là hàm.b và xuất ra màn hình số lớn nhất trong 2 số (sử dụng chương trình con) #include <iostream.h> Muốn sử dụng các hàm toán học thì trong chương trình ta phải khai báo: #include <math. Ví dụ : Viết chương trình nhập vào 2 số nguyên a. Trong chương này. để tránh sự lặp đi lặp lại và mất thời gian khi viết chương trình. người ta thường phân chia chương trình thành nhiều module. mỗi module giải quyết một công việc nào đó. Hàm có thể trả về kết quả thông qua tên hàm hay có thể không trả về kết quả. Một chương trình bắt đầu thực thi bằng hàm main.h> #include <conio.1.h> Cú pháp chung của một hàm là: functionName (arguments). Một hàm khi được định nghĩa thì có thể sử dụng ở bất kỳ vị trí nào trong chương trình. Danh sách các hàm toán học thường dùng: Tổ tin học Cơ sở 51 . ta chú trọng đến cách định nghĩa hàm và cách sử dụng các hàm đó. Khi sử dụng các hàm toán học ta cần khai báo thư viện <math.1. Hàm có hai loại: hàm chuẩn và hàm tự định nghĩa. getch(). Các module như vậy gọi là các chương trình con. return 0. cin>>a>>b. } IV. int b) { return (a>b) ? a:b. } int main() { int a. Một tiện lợi khác của việc sử dụng chương trình con là ta có thể dễ dàng kiểm tra xác định tính đúng đắn của nó trước khi ráp nối vào chương trình chính và do đó việc xác định sai sót để tiến hành hiệu đính trong chương trình chính sẽ thuận lợi hơn.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin CHƯƠNG IV: CHƯƠNG TRÌNH CON IV. cout<<” Nhap vao 2 so a. có thể có những đoạn chương trình viết lặp đi lặp lại nhiều lần. b).h> int max(int a. Hàm toán học: C++ cung cấp một số hàm số học để có thể sử dụng trong chương trình.1 KHÁI NIỆM VỀ HÀM TRONG C++ Trong những chương trình lớn.

/*không trả về giá trị*/ • return <biểu thức>.2. Định nghĩa hàm Cấu trúc của một hàm tự thiết kế: <kiểu kết quả> Tên hàm ([<kiểu tham số> <tham số>][. − Tham số: là tham số truyền dữ liệu vào cho hàm.2 XÂY DỰNG HÀM IV. có thể là : int.] } Giải thích: − Kiểu kết quả: là kiểu dữ liệu của kết quả trả về. khi gọi hàm chúng ta phải truyền cho nó các tham số thực tế (actual variable).Giáo trình Phương pháp lập trình Tên Hàm abs(x) fabs() labs(x) pow(x1. − Khi định nghĩa hàm. /*Trả về giá trị của biểu thức*/ Lưu ý: Nếu hàm có kết quả trả về. • return . Tham số này gọi là tham số hình thức (formal variable). char. ta bắt buộc phải sử dụng câu lệnh return để trả về kết quả cho hàm.x2) sqrt(x) sin(x) cos(x) tan(x) log(x) log10(x) exp(x) Công Dụng Tính trị tuyệt đối của x Trung tâm Công Nghệ Thông Tin Kiểu dữ liệu trả về Int Double long int Double Double Double Double Double Double Double Double tính x1 lũy thừa x2 tính căn bậc 2 của x tính sin x (x tính bằng radian) tính cos x (x tính bằng radian) tính tan x (x tính bằng radian) ln(x) logarit cơ số 10 của x Ex IV. Tổ tin học Cơ sở 52 . − Kiểu tham số: là kiểu dữ liệu của tham số. float. mỗi tham số phân cách nhau dấu phẩy (. … Một hàm có thể có hoặc không có kết quả trả về.…]]) { [Khai báo biến cục bộ và các câu lệnh thực hiện hàm] [return [<Biểu thức>]. − Bên trong thân hàm (phần giới hạn bởi cặp dấu {}) là các khai báo cùng các câu lệnh xử lý. Nếu có nhiều tham số. ta thường sử dụng câu lệnh return để trả về kết quả thông qua tên hàm. Trong trường hợp hàm không có kết quả trả về ta nên sử dụng kiểu kết quả là void.1. một hàm có thể có hoặc không có tham số. − Lệnh return dùng để thoát khỏi một hàm và có thể trả về một giá trị nào đó. void. byte. /*Trả về giá trị của biểu thức*/ • return (<biểu thức>). Các khai báo bên trong hàm được gọi là các khai báo cục bộ trong hàm và các khai báo này chỉ tồn tại bên trong hàm.).

h> unsigned int uscln(unsigned int a. getch().2. Cú pháp gọi hàm: <Tên hàm>([Danh sách các tham số]) Ví dụ: Viết chương trình cho phép tìm ước số chung lớn nhất của hai số tự nhiên.b: ”. USC). int uscln(int a. USC = ucsln(a. //hoặc return b.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Ví dụ : Viết hàm tìm ước chung lớn nhất của 2 số nguyên a. b. #include<conio. } return a. cin>>a>>b. while(a!=b) { if(a>b) a-=b. cout<<“Uoc chung lon nhat la: ”. b. else b-=a. } IV. //hoặc return b. while(a!=b) { if(a>b) a-=b. b=abs(b). } void main() { unsigned int a.2. hàm chỉ được thực thi khi trong chương trình có một lời gọi đến hàm đó. int b) { a=abs(a). } return a.b). cout<<“Nhap a. else b-=a. USC. } Tổ tin học Cơ sở 53 .h> #include<iostream. unsigned int b) { a=abs(a). Sử dụng hàm Một hàm khi định nghĩa thì chúng vẫn chưa được thực thi. b=abs(b).

y=3.3. trước tiên các tham số sẽ được gán giá trị thực tương ứng.4. khi gặp một lời gọi hàm thì hàm bắt đầu thực hiện bằng cách chuyển các lệnh thi hành đến hàm được gọi.2.2. Trong trường hợp này khi gọi hàm addition thì các giá trị 5 and 3 được truyền cho hàm.1. không phải là bản thân các biến. i++) cout<<ch. nghĩa là khi gọi hàm có các tham số.h> #include <conio. vì chỉ có giá trị của chúng được truyền mà thôi. Truyền tham số cho hàm Mặc định. i<=25. } void main() Tổ tin học Cơ sở 54 . z. IV.2. Tham số giá trị (pass value parameter): Khi thay đổi giá trị của các biến a hay b bên trong hàm thì các biến x và y vẫn không thay đổi. Quá trình diễn ra như sau: − Nếu hàm có tham số. IV. Ví dụ: Giả sử chúng ta gọi hàm addition như sau: int x=5. − Chương trình sẽ thực hiện tiếp các câu lệnh trong thân hàm bắt đầu từ lệnh đầu tiên đến câu lệnh cuối cùng. z = addition ( x . mỗi dòng 25 ký tự nào đó. cout<<“\n”. y ). Để đơn giản ta viết một hàm. ta truyền các giá trị cho hàm.h> void InKyTu(char ch) { int i. chương trình sẽ thoát khỏi hàm để trở về chương trình gọi nó và thực hiện tiếp tục những câu lệnh của chương trình này. Hàm này có tên là InKyTu. việc truyền tham số cho hàm trong C/C++ là truyền theo giá trị. nhiệm vụ của hàm này là in ra trên một dòng 25 ký tự nào đó. IV. for(i=1. Nguyên tắc hoạt động của hàm Trong chương trình. Ví dụ Viết chương trình in ra nhiều dòng. không phải là một phát biểu.4. #include <iostream.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Lưu ý: Việc gọi hàm là một phép toán. − Khi gặp lệnh return hoặc dấu } cuối cùng trong thân hàm.

} Trong ví dụ trên. Khi hàm được gọi và x được truyền tới nó. } void main (void) { clrscr(). InKyTu(c). IV.4.Giáo trình Phương pháp lập trình { Trung tâm Công Nghệ Thông Tin char c = ‘A’. getch().2. } void main () Tổ tin học Cơ sở 55 . c*=2. Chương trình cho kết quả như sau: num = 0. InKyTu(‘*’).h> void Foo (int num) { num = 0. num nhận một bản sao chép giá trị của x. getch(). // In ra 25 dau * InKyTu(‘+’). Vì vậy cần phải truyền tham số dưới dạng tham chiếu (hay tham biến) như ở trong hàm duplicate trong ví dụ dưới đây: // passing parameters by reference #include <iostream. Foo(x). cout << "num = " << num << '\n'. int& c) { a*=2.h> #include<conio.2. tham số duy nhất của hàm Foo là một tham số giá trị. } Ví dụ: #include <iostream. Kết quả là mặc dù num được đặt về 0 bởi hàm nhưng vẫn không có gì tác động lên x. b*=2. x = 10. cout << "x = " << x << '\n'.h> void duplicate (int& a. int& b. Khi hàm được thực thi thì num được sử dụng như là một biến cục bộ bên trong hàm. Tham số tham chiếu (pass reference parameter): Xét trường hợp cần thao tác với một biến ngoài ở bên trong một hàm.h> #include <conio. int x = 10.

n2=20. z=" << z. c và z.Giáo trình Phương pháp lập trình { Trung tâm Công Nghệ Thông Tin clrscr().2. khai báo của hàm duplicate. cout << "x=" << x << ". y. int x=1. z=7.2. Phạm vi của biến (scope variables) IV.5. IV. y=" << y << ".5.2. //20 sub_fun(). z). cout <<"Trong ham main() n1= "<<n1<<endl //10 <<"Trong ham main() n2= "<<n2<<endl. b và c với các tham số khi gọi hàm x. Khi truyền tham số dưới dạng tham biến. y và z và mọi sự thay đổi với a bên trong hàm sẽ ảnh hưởng đến giá trị của x và hoàn toàn tương tự với b và y.5. Biến toàn cục (global variables): Biến toàn cục là biến được khai báo bên ngoài các hàm.h> int n1. void sub_fun(). bên trong hàm nếu có bất kì sự thay đổi giá trị nào được thực hiện với tham số đó sẽ ảnh hưởng trực tiếp đến giá trị của biến tương ứng với tham số đó. getch(). } Trong ví dụ trên. các biến này chỉ được hiểu bên trong phạm vi của hàm khai báo nó. Trong ví dụ trên. n1=10. những biến này được dùng chung cho tất cả các hàm được khai báo sau nó. Vì vậy. clrscr(). Tổ tin học Cơ sở 56 . y=3. ta đang truyền bản thân biến đó. void main() { int n2. IV. Ví dụ: #include <iostream.1. ta đã liên kết a. để chứng tỏ rằng các tham số này được truyền theo tham biến.h> #include <conio. Biến cục bộ (local variables): Biến cục bộ là biến được khai báo trong thân của một hàm nào đó. duplicate (x. theo sau tên kiểu của mỗi tham số đều là dấu và (&).2.

//30 n1=40.//40 cout<<"Trong ham main() sau khi goi sub_fun n2= "<<n2<<endl. } Trong ví dụ trên n1 là biến toàn cục. } void sub_fun() { int n2. //20 getch(). cout <<"Trong ham sub_fun() n1= " <<n1<<endl //10 <<"Trong ham sub_fun() n2= " <<n2<<endl. n2 là biến cục bộ có cả trong hàm main() và hàm sub_fun(). n2=30. return.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin cout <<"Trong ham main() sau khi goi sub_fun n1= "<<n1<<endl. Hai dòng lệnh cout đầu của hàm main sẽ in kết quả : Trong ham main() n1= 10 Trong ham main() n2= 20 giá trị này là của n2 trong hàm main Khi hàm sub_fun được gọi nó sẽ in kết quả: Trong ham sub_fun() n1= 10 Trong ham sub_fun() n2= 30 giá trị này là của n2 trong sub_fun Hai dòng lệnh cout cuối của hàm main sẽ in kết quả: Trong ham main() sau khi goi sub_fun n1= 40 (n1 đã bị đổi trong hàm sub_fun) Trong ham main() sau khi goi sub_fun n2= 20 (n2 của hàm main) Hình dưới minh hoạ việc lưu trữ và phạm vi của các biến trong chương trình trên: n1 Löu tröõ n1 main() n2 Löu tröõ n2 trong main sub_fun() n2 Löu tröõ n2 trong sub_fun Tổ tin học Cơ sở 57 .

Ví dụ: #include <iostream. //42. − Không gian bộ nhớ cho các biến toàn cục được dành riêng trước khi sự thực hiện của chương trình bắt đầu nhưng ngược lại không gian bộ nhớ cho các biến cục bộ được cấp phát ở thời điểm thực hiện chương trình. void sub().3.2. void sub().5. getch(). và NULL nếu là kiểu ký tự. trong khi các biến cục bộ chỉ tồn tại trong thời gian hàm khai báo nó thực thi.5. void main() { float n=30. float n=30. sub(). } void sub().8 } Trong trường hợp trên nếu muốn hàm main in ra giá trị của biến toàn cục thì phải sử dụng toán tử scope resolution :: ngay trước tên biến. cout <<”Giá trị của n= “ <<::n<<endl. − Thời gian sống của một biến bị giới hạn bởi phạm vi của nó.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin − Các biến toàn cục không được khởi tạo.h> #include <conio.h> float n=42. return.8. − Biến hay hàm toàn cục có thể được truy xuất từ mọi nơi trong chương trình. Tổ tin học Cơ sở 58 . //30. − Các biến hoặc hàm toàn cục không được định nghĩa nhiều hơn một lần ở mức toàn cục.8.5. cout <<”Giá trị của n= “ <<n<<endl.5. Toán tử phạm vi (scope resolution) Phạm vi cục bộ ghi chồng lên phạm vi toàn cục nên một biến cục bộ có cùng tên với biến toàn cục làm cho biến toàn cục không thể truy xuất được tới phạm vi cục bộ.8. //42. IV. Ví dụ: #include <iostream. { cout <<”trong sub n= “<<n <<endl. sẽ được khởi tạo tự động là 0 nếu là kiểu số. void main() { clrscr().h> #include <conio.h> float n=42. các biến toàn cục tồn tại suốt thời gian thực hiện chương trình. Vì thế.

static int mile. Các biến cục bộ thuộc lớp auto sẽ xuất hiện trong bộ nhớ khi hàm khai báo nó được gọi thực hiện và xóa khỏi bộ nhớ khi hàm thực hiện xong. i<5.8 } Không nên lạm dụng biến toàn cục. IV.6. register int volts. getch().i++) sub(). IV. getch(). } Tổ tin học Cơ sở 59 . { cout <<”trong sub n= “<<n <<endl. auto float yrs. void main() { int i. do đó làm cho việc phát hiện những lỗi giải thuật có trong chương trình là rất khó. clrscr(). return. Trong C++ có 4 lớp lưu trữ: auto. phải chỉ rõ lớp lưu trữ của biến. //42. Lớp lưu trữ cục bộ Biến cục bộ có thể lưu trữ trong 3 lớp:auto.Giáo trình Phương pháp lập trình sub(). và giá trị trả về của hàm Ngoài ra giá trị của biến toàn cục có thể thay đổi bởi bất cứ hàm nào khai báo sau nó. mỗi biến còn thuộc về một lớp lưu trữ nào đó.2.6. extern và register.h> void sub(). Ví dụ auto int num. Trung tâm Công Nghệ Thông Tin } void sub(). − Nếu một biến khi khai báo mà không mô tả lớp lưu trữ thì xem như biến này thuộc lớp auto.h> #include <conio. for (i=0. return. biến cục bộ. register.1. static.2. Ví dụ #include <iostream. vì nó sẽ phá vở sự an tòan mà C++ đã cung cấp. Khi khai báo biến. Lớp lưu trữ các biến Ngoài việc mỗi biến phải có một kiểu dữ liệu và phạm vi có hiệu lực của nó. đó là sự độc lập của các hàm. nó cũng làm mất đi sự cẩn thận cần thiết của người lập trình là phải xác định rõ kiểu dữ liệu của tham số. static.

biến register được lưu trữ trong vùng nhớ trực tiếp của CPU vì vậy việc truy xuất biến register nhanh hơn các biến khác..2. cout <<num<<" ". i<5. num++.i++) sub(). nếu có thì vùng nhớ dành lư trữ biến cũng nhỏ.h> #include <conio.6.h> void sub(). for (i=0. return. từ đó nó tồn tại trong bộ nhớ với giá trị được tạo ra bởi lần gọi hàm (hàm khai báo nó) gần nhất Ví dụ #include <iostream. } void sub() { static int num=1. getch(). chỉ khác nơi lưu trữ.2. return. các biến này tồn tại torng bộ nhớ từ khi chương trình bắt đầu thực hiện cho đến khi chương trình kết thúc. cout <<num<<" ".Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin void sub() { int num=0. Tuy nhiên không phải bất kỳ máy nào cũng hổ trợ biến này. IV. return. Các lớp lưu trữ biến toàn cục: Biến tòan cục là những biến đựơc khai báo bên ngoài hàm. clrscr(). }// chương trình xuất ra màn hình 0 0 0 0 0 Giải thích: mỗi lần được gọi thực hiện sub() thì biến num sẽ được khởi tạo lại do đó giá trị của biến num trước đó không còn nữa − Một biến cục bộ static được tạo ra và khởi tạo giá ttrị một lần tại thời điểm biên dịch. }// chương trình xuất ra kết quả : 1 2 3 4 5 − Nếu trong chương trình lúc khai báo ta không khởi tạo giá trị cho biến cục bộ static thì biến này sẽ được khởi tạo bằng 0 − Lớp lưu trữ biến cục bộ register cũng giống như biến cục bộ thuộc lớp auto. Tổ tin học Cơ sở 60 . void main() { int i. nơi lưu trữ tất cả các biến trừ biến register là RAM. num++.. vì vậy biến được khai báo register sẽ tự động chuyển sang lớp auto nếu máy tính không hổ trợ.

extern int volts. ở lần khai báo thứ hai trong file2 có extern với mục đích báo cho trình biên dịch đây không phải là biến mới mà là biến đã tồn tại trong bộ nhớ. các lớp extern hoặc static chỉ ảnh hưởng đến phạm vi mà không ảnh hưởng đến thời gian tồn tại của biến. static double power. void fun3(). Lớp static dành cho biến toàn cục thì dùng ngăn chặn việc mở rộng phạm visử dụng của biến này ra một file khác. ta thấy nội dung chương trình được lưu trữ trênn 2 tập tin. { . . } Theo hình minh họa. fun2(). } extern double factor. } void fun2() { . . fun3(). } void fun4() { . . Tổ tin học Cơ sở 61 . void fun1().Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Một biến toàn cục có thể thuộc lớp extern hoặc static. } File 2 double factor. . Biến volts ở lần khai báo đầu tiên trong file1 không có extern (đây là quy định). float current. void main() { fun1(). Ví dụ: Có 2 chương trình lưu thành 2 file: File 1 int volts. . . Mục đích của biến toàn cục extern là mở rộng việc sử dụng một biến toàn cục sang một tập tin chương trình khác (khi chương trình lưu trữ trên nhiều file) Khi khai báo extern trước tên một biến thì bắt buộc biến này đã được khai báo trước ở nơi khác trong chương trình và chỉ một lần mà thôi đồng thời không có từ extern ở phía trước. . fun4(). . { .

Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin BÀI TẬP Viết lại tất cả bài tập chương 3 và 4 dưới dạng hàm. Tổ tin học Cơ sở 62 .

kiểu khai báo này thường được áp dụng trong các trường hợp: vừa khai báo vừa gán giá trị. Có thể chia mảng làm 2 loại: mảng 1 chiều và mảng nhiều chiều V. − Số phần tử: là một hằng số nguyên.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin CHƯƠNG V: MẢNG V.1 Mảng (Array) Mảng là một tập hợp các phần tử cố định có cùng một kiểu được đặt liên tiếp trong bộ nhớ . Khai báo mảng minh) Cú pháp: <Kiểu> <Tên mảng ><[số phần tử]> V.2.2.1. Kích thước của mảng là cố định và phải được xác định trước. cho biết số lượng phần tử tối đa trong mảng (kích thước của mảng). ký tự….2.1. số.1. Nều mảng có n phần tử thì chỉ số của các phần tử có giá trị từ 0 đến n-1. //Khai báo một mảng a gồm 10 phần tử có kiểu số nguyên − Biểu diễn mảng a[10] trong bộ nhớ: V. nó không thể thay đổi trong suốt quá trình thực hiện chương trình. − Kiểu: kiểu dữ liệu của mỗi phần tử trong mảng. Khai báo mảng với số phần tử không xác định (khai báo không tường minh) Cú pháp: <Kiểu> <Tên mảng> <[ ]> Khi khai báo. khai báo mảng là tham số hình thức của hàm. gọi là kiểu phần tử. Kiểu phần tử có thể là các kiểu bất kỳ: ký tự.2 Mảng 1 chiều V. Khai báo mảng với số phần tử xác định (khai báo tường Ý nghĩa: − Tên mảng: đây là một tên đặt đúng theo quy tắc định danh (identify). Số lượng phần tử trong mảng được gọi là kích thước của mảng.1.2. Tổ tin học Cơ sở 63 . Tên này cũng mang ý nghĩa là tên biến mảng. Mỗi phần tử được xác định bởi một chỉ số biểu thị vị trí của phần tử trong mảng. không cho biết rõ số phần tử của mảng. Ví dụ: int a[9].

h> void printarray (int arg[]. 4. Vừa khai báo vừa gán giá trị Cú pháp: Trung tâm Công Nghệ Thông Tin <Kiểu> <Tên mảng> [ ]= {Các giá trị cách nhau bởi dấu phẩy} Ví dụ: char str[] = "HELLO".1. n++) cout << arg[n] << " ".4.3). 6. // không khai báo tường minhkích cỡ của mảng − Nếu vừa khai báo vừa gán giá trị thì mặc nhiên C++ sẽ hiểu số phần tử của mảng là số giá trị mà chúng ta gán cho mảng trong cặp dấu {}.h> Tổ tin học Cơ sở 64 . int nums[] = {5. cout << "\n". 15}.Giáo trình Phương pháp lập trình V. việc này cũng tạo ra kết quả thực tế giống thao tác ở trên nhưng nhanh hơn và hiệu quả hơn. Khai báo mảng là tham số hình thức của hàm: − Trong một số trường hợp ta cần phải truyền một mảng tới một hàm như là một tham số.1. 15}. việc truyền theo tham số giá trị một khối nhớ là không hợp lệ. tên mảng và cặp ngoặc vuông trống. int secondarray[] = {2. Tuy nhiên chúng ta lại được phép truyền địa chỉ của nó. printarray (firstarray. printarray (secondarray. int length) { for (int n=0. } Ví dụ 3: #include <iostream. 8. } int main () { int firstarray[] = {5. 10. − Để có thể nhận mảng là tham số thì khi khai báo hàm ta chỉ định trong phần tham số kiểu dữ liệu của mảng. return 0.3.2. Ví dụ 1: void procedure (int arg[ ])//tham số kiểu "mảng của int" và có tên arg. 10. n<length.2. ngay cả khi nó được tổ chức thành một mảng. Ví dụ 2: // araysas parameters #clude <iostream. 10}. Trong C++. − Sử dụng hàm sizeof() để lấy số phần tử của mảng như sau: Số phần tử=sizeof(tên mảng)/ sizeof(kiểu) V.5).

clrscr(). void input(int arr[SIZE]). return.h> const int SIZE=5. 65. i<SIZE. input(a). In mảng số nguyên này lên màn hình. getch(). randomize(). M[1][5]. clrscr(). Ví dụ : Vừa khai báo vừa gán trị cho 1 mảng 1 chiều các số nguyên. #include <iostream.h> #include <conio. } V.h> #include <iomanip. M[2].2.i++) Tổ tin học Cơ sở 65 . for (i=0.tam. for (i=0. i++) cout <<setw(3)<<a[i]. 68. //Lấy số phần tử cout<< " Noi dung cua mang ". n=sizeof(dayso). 70}.i<n. Với cách truy xuất thì này thì có thể coi như là một biến có kiểu dữ liệu là kiểu được chỉ ra trong khai báo biến mảng. int dayso[ ]={66. 67. for (i=0.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin #include <conio. i++) arr[i]=random(100).2. } void input(int arr[SIZE]) { int i. Cú pháp: <array_Name>[<index1>][<index2>][…]{<indexN>] Ví dụ M[0]. void main() { int i.h> #include <stdlib.a[SIZE].i. Truy xuất từng phần tử của mảng Mỗi phần tử của mảng được truy xuất đến thông qua Tên biến mảng theo sau là chỉ số nằm trong cặp dấu ngoặc vuông [ ].j. 69.h> int main() { int n.… − − Chỉ số của phần tử mảng là một biểu thức có giá trị là kiểu số nguyên. cout <<"\n Mang da nhap \n". i<SIZE.

cin>>N. /* Tăng K lên để lần kế lưu vào vị trí kế*/ N = N/2. } while(N>0). cứ tiếp tục như vậy cho đến phần tử thứ n-1. Việc chuyển đổi này được thực hiện bằng cách lấy số đó chia liên tiếp cho 2 cho tới khi bằng 0 và lấy các số dư theo chiều ngược lại để tạo thành số nhị phân. NhiPhan[K]=Du. for(i=K-1. return 0. Chương trình cụ thể như sau: #include<iostream. cout<<"Nhap vao so nguyen N= ".h> #include<stdio.h> int main() { unsigned int N.i. do { Du=N % 2. Sau đó tiếp tục so sánh phần tử thứ tiếp theo với các phần tử từ thứ ba trở đi .Giáo trình Phương pháp lập trình cout<<dayso[i]. Trước hết. for(i=0.h> void Nhap(int a[ ]. #include<iostream. /* Lưu số dư vào mảng ở vị trí K*/ K++. i< N.int N) { int i. nếu nó lớn hơn một phần tử đang so sánh thì đổi chỗ hai phần tử cho nhau. Ta sẽ dùng mảng một chiều để lưu lại các số dư đó.K=0. i++) { Cout<<"Phan tu thu “<<i<<=<<&a[i]).. return 0. unsigned int NhiPhan[20]. Trung tâm Công Nghệ Thông Tin } Ví dụ Đổi một số nguyên dương thập phân thành số nhị phân.h> #include<conio. Cout<<"Dang nhi phan la: ".i>=0.i--) cout<<setw(3)<<NhiPhan[i]. getch(). } Tổ tin học Cơ sở 66 .. unsigned int Du. } Ví dụ Nhập vào một dãy n số và sắp xếp các số theo thứ tự tăng. ta đưa phần tử thứ nhất so sánh với các phần tử còn lại.

3 Mảng nhiều chiều. } V. int N) { int i. cout<<"Mang vua nhap: " . Khai báo Cú pháp: <Kiểu> <Tên mảng><[Số dòng]><[Số cột]> Ví dụ: int a[3][4]. // Gọi hàm sắp xếp Cout<<"Mang sau khi sap xep: ".3. } void SapXep(int a[ ].i++) cout<<setw(4)<<a[i].i<N-1.N).1. SapXep(b. Nhap(b.j<N. cout<<"\n". getch(). một mảng hai chiều có thể được xem như là một bảng hai chiều gồm các phần tử có kiểu dữ liệu cụ thể và giống nhau. a[j]=t. cout<<"So phan tu thuc te cua mang N= ".1.i.N). i<N. Mảng nhiều chiều có thể được coi như mảng của mảng. V. Khai báo mảng 2 chiều tường minh Tổ tin học Cơ sở 67 .N).Giáo trình Phương pháp lập trình } Trung tâm Công Nghệ Thông Tin void InMang(int a[ ]. for(i=0. cin>>N.N). V. InMang(b. N. a[i]=a[j]. int N) { int t. for (i=0.3. } } void main() { int b[20].j++) if (a[i]>a[j]) { t=a[i].i++) for(int j=i+1.1. InMang(b.

n<HEIGHT. } return 0.n++) for (m=0. int n.2. Cú pháp: <Kiểu> <Tên mảng> <[ ]><[Số phần tử chiều 2]> Cách khai báo này cũng được áp dụng trong trường hợp vừa khai báo. Khai báo mảng 2 chiều không tường minh Để khai báo mảng 2 chiều không tường minh. int main () { for (n=0. Ví dụ : #define WIDTH 5 #define HEIGHT 3 int arr [HEIGHT][WIDTH]. }// kết quả: Tổ tin học Cơ sở 68 . V.1. vừa gán trị hay đặt mảng 2 chiều là tham số hình thức của hàm.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin V.m.3.m++) { a[n][m]=(n+1)*(m+1).2.m<WIDTH.3. Truy xuất từng phần tử của mảng 2 chiều Để truy xuất một phần tử của mảng hai chiều dùng cú pháp: Tên mảng[Chỉ số 1][Chỉ số 2] Ví dụ: int a [3][5]. ta vẫn phải chỉ ra số phần tử của chiều thứ hai (chiều cuối cùng).

} int main () { int firstarray[] = {5.3). printarray (secondarray.h> void Nhap(int a[][10]. 10}.5).i++) 69 Tổ tin học Cơ sở . 10. n<length.j. for(i=0.int N) { int i.j. Trong C++ không thể truyền toàn bộ một khối bộ nhớ bằng một giá trị như là một tham số đến một hàm. Để chấp nhận những mảng như là những tham số của hàm thì khi khai hàm phải chỉ rõ trong các tham số của nó loại phần tử của mảng Ví dụ: //arrays as parameters #include <iostream> using namespace std. 6. j<N.h> #include<conio.b và in ma trận kết quả lên màn hình (sử dụng hàm) #include<iostream. 8. for(i=0. n++) cout << arg[n] << " ". return 0. cin>>a[i][j].int M. 4. cout << "\n".3.i<M. } } void InMaTran(int a[ ][10]. int M. int length) { for (int n=0. int secondarray[] = {2. void printarray (int arg[]. thực hiện phép toán cộng hai ma trận a. Khai báo mảng 2 chiều như một tham số: Trong một số trường hợp. 15}. } Ví dụ : Viết chương trình cho phép nhập 2 ma trận a. int N) { int i.3. printarray (firstarray.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin V. nhưng được phép truyền địa chỉ của nó. điều này rất hiệu quả. cần truyền một mảng cho một hàm như là một tham số.i++) for(j=0.i<M. b có m dòng n cột. j++) { cout<<"Phan tu o dong ”<<i<<”cot: “<<j.

Giáo trình Phương pháp lập trình { for(j=0. Nhap(b.N).M. } Ví dụ : Nhập vào một ma trận 2 chiều gồm các số thực. congMaTran(a. in ra tổng của các phần tử trên đường chéo chính của ma trận này. return 0. cin>>N.N.N). for(i=0.cin>>N. j++) c[i][j]=a[i][j]+b[i][j]. N cột thì các phần tử của đường chéo chính là các phần tử có dạng: a[i][i] với i thuộc [0…min(M. clrscr(). i.N)-1]. InMaTran(c. cin>>M.N). int c[10][10]. getch(). InMaTran(a. Nhap(a. cout<<"Nhap ma tran B"<<endl. j++) cout<<setw(3)<<a[i][j].M.h> int main() { float a[10][10].M.M. cout<<"Ma tran A: "<<endl. } Trung tâm Công Nghệ Thông Tin } /* Cong 2 ma tran A & B ket qua la ma tran C*/ void CongMaTran(int a[ ][10]. b[10][10].i<M. int M.int c[ ][10]) { int i. N./* Ma tran tong*/ cout<<"So dong M= ".c). cout<<"Nhap so cot? ". Tổ tin học Cơ sở 70 . InMaTran(b.j. j< N.M. } int main() { int a[10][10].int b[][10]. cout<<"Nhap ma tran A: “<<endl.int N.M.N). M.j. cout<<"\n". cout<<"So cot M= ". N. Min.b. cout<<"Ma tran tong C: "<<endl. cout<<"Ma tran B: "<<endl. T=0.i++) for(j=0. cin>>M . cout<<"Nhap so dong: ".h> #include<stdio. j<N. Nhận xét: ma trận a có M dòng.N). #include<conio.int M.

j++) { cout<<"Phan tu o dong “<<i<<”cot” <<j.h> #include <iomanip. int x). for(i=0. cout<<endl.n) dể sắp xếp một mảng n phần tử theo thứ tự tăng. } V. Kết quả của hàm trả về vị trí tìm thấy.h> #include <conio. b) Tìm kiếm trên mảng hai chiều: Xây dưng một hàm int search2(int a[][COLS}. } Min=(M>N) ? N: M.int n.h> #include <stdlib.4.i<M. cin>>a[i][j]. j< N. j<N. Ví dụ #include <iostream. Sắp xếp: a) Sắp xếp trên mảng một chiều: Viết hàm sort(a[ ].i<M.3. j++) cout<<setw(3)<<a[i][j]. Tìm một giá trị x trên mảng a có n phần tử. Tìm kiếm: V. Kết quả của hàm trả về vị trí tìm thấy.3. Viết hàm sort2(a[] [COLS].3.4. int x). cout<<"Tong cac phan tu o duong cheo chinh la:” <<T. getch().COLS cột phần tử theo thứ tự tăng. hàm <0 khi không tìm thấy.i<Min. tiếp theo sắp xếp trên mảng một chiều này và cuối cùng là đưa các giá trị từ mảng một chiều vào mảng hai chiều. /* Tìm giá trị nhỏ nhất của M & N*/ for(i=0.1.i++) { for(j=0. Tìm một giá trị x trên mảng a có n dòng và COLS cột . V.i++) for(j=0. } cout<<"Ma tran vua nhap:"<<endl. const int COLS=5.h> const int ROWS=5.i++) T=T+a[i][i]. hàm <0 khi không tìm thấy.2.4. Tổ tin học Cơ sở 71 .int n.n) dể sắp xếp một mảng n dòng .Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin for(i=0. return 0. Các phương pháp tìm kiếm và sắp xếp trên mảng: a) Tìm kiếm trên mảng một chiều: Xây dưng một hàm int search(int a[ ]. b) Sắp xếp trên mảng một chiều: Nguyên tắc sắp xếp mảng hai chiều là đưa toàn bộ giá trị của mảng hai chiều ra một mảng một chiều.

b[j]=tam.j<COLS.i++) for(j=0. output(a. } Tổ tin học Cơ sở 72 . void sort(int a[ROWS][COLS]).j++) b[j+i*COLS]=a[i][j].i<ROWS*COLS-1.a[ROWS][COLS].j++) a[i][j]=b[j+i*COLS].j. input(a. getch(). for (i=0. void main() { int i.tam. clrscr(). } void sort(int a[ROWS][COLS]) { int i.ROWS).i++) for (j=i+1. output(a.ROWS). } for (i=0.int). b[i]=b[j]. void output(int a[][COLS]. randomize(). cout<<"\nMang sau khi sap xep tang:\n".Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin void input(int a[][COLS].j. cout <<"\n Mang da nhap \n". for (i=0. return.j<ROWS*COLS.i<ROWS.i++) for(j=0. int b[ROWS*COLS].j<COLS.int).ROWS). sort(a).j++) if (b[i]>b[j]) { tam=b[i].i<ROWS.

In ma trận đó lên màn hình. 3) Viết chương trình nhập vào một mảng. 8) Viết chương trình tính tổng bình phương của các số âm trong một mảng các số nguyên. Ví dụ: 12341291 25582545 94203528 15864806 7) Viết chương trình nhập vào một mảng số tự nhiên.. 11)Viết chương trình nhập vào hai ma trận A có cấp m.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin BÀI TẬP 1) Viết chương trình nhập vào một dãy n số thực a[0]. Sau đó viết cho ma trận tổng quát cấp m*n...n-1) Tính ma trận tích C và in kết quả lên màn hình. 4) Viết chương trình nhập vào một dãy các số theo thứ tự tăng.1.. 5) Viết chương trình nhập vào một ma trận (mảng hai chiều) các số nguyên.2. n.Dòng 3 : gồm các số nguyên tố. k và B có cấp k. a) In các số nguyên tố có trong mảng a. . tổng cộng có bao nhiêu số lẻ. 12)Nhập số phần tử và các phần tử nguyên dương của mảng a. .. In dãy số sau khi đã nhập xong...Tính tổng của các phần tử trong mảng . In hai ma trận lên màn hình.Dòng 4 : gồm các số không phải là số nguyên tố.Dòng 2 : gồm các số chẵn. Xuất ra dãy số sau khi sắp xếp.. hãy xuất ra màn hình: . ..1. 2) Viết chương trình sắp xếp một mảng theo thứ tự tăng dần sau khi đã loại bỏ các phần tử trùng nhau.m-1. In hai ma trận lên màn hình.m-1... a[n-1]. gồm m hàng. Tổ tin học Cơ sở 73 .1.n-1) Tính ma trận tổng C và in kết quả lên màn hình.Dòng 1 : gồm các số lẻ. Ví dụ : 1 2 3 4 5 7 9 10 đảo thành 10 9 7 5 4 3 2 1 . Tổng hai ma trận A và B là ma trận C được tính bởi công thức: cij= aij +bij ( i=0..Phần tử nhỏ nhất của mảng. sắp xếp dãy số theo thứ tự giảm dần. j=0. 13)Viết chương trình nhập vào mảng a a) Viết hàm kiểm tra mảng đối xứng không? Nếu có trả về 1 ngược lại trả về 0..j=0. Hãy xuất ra màn hình: ... 10)Viết chương trình nhập vào hai ma trận A và B có cấp m. n. tổng cộng có bao nhiêu số chẵn.1.2. + aik *bkj (i=0. 6) Viết chương trình để chuyển đổi vị trí từ dòng thành cột của một ma trận (ma trận chuyển vị) vuông 4 hàng 4 cột.. a[1]. . .2.2.Phần tử lớn nhất của mảng. nếu nhập sai quy cách thì yêu cầu nhập lại. n cột. Tích hai ma trận A và B là ma trận C được tính bởi công thức: cij= ai1*b1j + ai2 *b2j + ai3 *b3j + . 9) Viết chương trình thực hiện việc đảo một mảng một chiều. b) Sắp xếp các số chẵn trong mảng theo thứ tự tăng dần.

21)Nhập vào một dãy số nguyên dương ngẫu nhiên (random) có n phần tử. 20)Viết chương trình nhập ngẫu nhiên một mảng có n số nguyên dương. 26)Hãy nhập dãy n số nguyên dương có giá trị trong khoảng từ 1->100. c) Nối hai mảng này lại thành một mảng duy nhất sao cho mảng vẫn tăng. 23)Hãy nhập dãy n số nguyên dương có giá trị trong khoảng từ 1->100. các số chẵn nằm phía sau dãy số. Sắp xếp lại dãy số trên theo chiều tăng dần. c) Tính tổng các số nguyên tố trong mảng. Hãy cho biết số nào trong mảng có giá trị gần với trung bình cộng của toàn mảng. 25)Hãy nhập dãy n số nguyên dương có giá trị trong khoảng từ 1 -> 100. 22)Viết chương trình nhập vào mảng số nguyên có n phần tử. b) Nhập vào một số x. b) Xếp theo thứ tự tăng dần hai mảng a. 16)Nhập vào mảng a. 19)Nhập vào một mảng có n số nguyên dương khác nhau. Hãy tìm số chẵn lớn nhất và số lẻ nhỏ nhất. b theo kiểu cấp phát động. b) Sắp xếp mảng thực theo thứ tự tăng dần. 14)Viết chương trình theo dạng hàm: nhập vào mảng nguyên a có n phần tử với : a) Các số nguyên tố (nếu có) trong mảng phải < 100. Viết chương trình in ra số lớn hơn số nhỏ nhất của dãy và nhỏ hơn hay bằng với mọi số còn lại (nghĩa là tìm số nhỏ thứ hai trong dãy). Với: a) Các phần tử của a và b không trùng nhau. 15)Viết chương trình thực hiện các bước sau: a) Nhập mảng thực. 27)Viết chương trình thực hiện các công việc sau: a) Nhập vào một ma trận các giá trị thực kích thước mxn. các số 0 nằm giữa. với n được nhập từ bàn phím. hãy tìm số nguyên tố trong a bé hơn và gần với x nhất. 28)Viết chương trình thực hiện các công việc sau: a) Nhập vào một ma trận các giá trị thực kích thước nxn. c) In phần tử có số lần xuất hiện nhiều nhất trong mảng. 17)Nhập vào một mảng a. Nếu n phần tử đều bằng nhau thì thông báo: không tồn tại số cần tìm. Sắp xếp lại dãy số trên theo chiều tăng dần và loại bỏ các phần tử trùng nhau (chỉ giữ lại một giá trị trong số đó) 24)Hãy nhập dãy n số nguyên dương có giá trị trong khoảng từ 1->100. Chèn x vào dãy sao cho thứ tự của dãy không thay đổi.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin b) Nhập mảng b. b) Không có phần tử trùng nhau trong mảng. b. Nhập vào một số x nguyên dương. In ra giá trị trung bình cộng của các số chẵn xuất hiện trong dãy. Thực hiện sắp xếp sau: a) Tất cả các số lẻ nằm phía trước dãy số. kiểm tra mảng b có phải là mảng con của mảng a không? Nếu có trả về số lần mảng b xuất hiện trong mảng a. In ra màn hình các số chẵn xuất hiện trong dãy theo thứ tự tăng dần. với n và m được nhập từ bàn phím. 18)Viết chương trình nhập vào mảng một chiều có n số nguyên dương. b) Tính tổng các số dương có trong mảng. Tổ tin học Cơ sở 74 . Hãy tính trung bình cộng của các phần tử trong mảng có giá trị lớn hơn hay bằng k. Nhập vào một số nguyên dương k. Hãy in ra tất cả các phần tử trong mảng có giá trị nhỏ hơn giá trị lớn nhất và lớn hơn giá trị nhỏ nhất của mảng.

Nếu không có phải có thông báo. Tổ tin học Cơ sở 75 . 29)Viết chương trình thực hiện công việc sau: a) Nhập vào số nguyên dương N. b) Tìm số nguyên tố lớn nhất có trong mảng. Thực hiện việc nhập giá trị cho mảng này.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin b) Tìm tất cả các vị trí trong ma trận thỏa yêu cầu sau: giá trị của ma trận tại vị trí đó là giá trị lớn nhất của ma trận. với N nhập vào từ bàn phím. 30)Viết chương trình nhập vào ma trận vuông A(NxN). Cấp phát động một mảng nguyên A có N phần tử. a) In ra tổng các giá trị trong tam giác vuông trên của ma trận A (kể cả các phần tử trên đường chéo của ma trận A) b) In ma trận tích AxA ra màn hình.

Ví dụ : int *pa . một kiểu int. Để tránh những hạn chế trên.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin CHƯƠNG VI: KIỂU CON TRỎ VI. Gán địa chỉ của biến cho biến con trỏ (&) Tổ tin học Cơ sở 76 . một lượng ô nhớ cho các biến này sẽ được cấp phát mà không cần biết trong quá trình thực thi chương trình có sử dụng hết lượng ô nhớ này hay không. − Kích thước của biến con trỏ không phụ thuộc vào kiểu dữ liệu.2. ngôn ngữ C++ cung cấp cho người lập trình một loại biến đặc biệt đó là biến con trỏ (pointer) với các đặc điểm: − Chỉ phát sinh trong quá trình thực hiện chương trình − Khi chạy chương trình. Khi khai báo biến tĩnh. Một số hạn chế có thể gặp phải khi sử dụng các biến tĩnh: − Cấp phát ô nhớ dư. float *pf.2. kích thước của biến.1 Giới thiệu dữ liệu kiểu dữ liệu: Các biến mà chúng ta đã biết và sử dụng trước đây đều là biến có kích thước và kiểu dữ liệu xác định. Tác dụng của khai báo này là dành ra 2 bytes bộ nhớ để cấp phát cho biến con trỏ pa. một kiểu float.2. VI. nhưng dữ liệu mà chúng trỏ tới không chiếm lượng bộ nhớ như nhau.2. Khai báo biến con trỏ <Kiểu> * <Tên con trỏ> − Cú pháp: Ý nghĩa: Khai báo một biến có tên là <Tên con trỏ> dùng để chứa địa chỉ của các biến có kiểu là <Kiểu>. − Sau khi sử dụng xong có thể giải phóng để tiết kiệm chỗ trong bộ nhớ. ta có thể khai báo: void *pa. − Khi cần. − Cấp phát ô nhớ thiếu. Mặt khác. − Giá trị của một biến con trỏ là địa chỉ mà nó trỏ tới.2. VI. − Nếu chưa muốn khai báo kiểu dữ liệu mà con trỏ pa đang chỉ đến.2 Khai báo và sử dụng biến con trỏ VI. chương trình thực thi bị lỗi.1. ta cho con trỏ pa chỉ đến kiểu dữ liệu muốn khai báo.1. gây ra lãng phí ô nhớ. gọi là các biến biến tĩnh. // Khai báo biến con trỏ pf kiểu float Mỗi biến đầu trỏ tới một kiểu dữ liệu khác nhau nhưng cả hai đều là con trỏ và chúng đều chiếm một lượng bộ nhớ như nhau. các biến tĩnh dạng này sẽ tồn tại trong suốt thời gian thực thi chương trình dù có những biến mà chương trình chỉ sử dụng 1 lần. vùng nhớ và địa chỉ vùng nhớ được cấp phát cho biến có thể thay đổi. luôn có kích thước cố định là 2 byte (tùy thuộc vào hệ điểu hành). // Khai báo biến con trỏ pa kiểu int. Các thao tác trên con trỏ VI.

//gán địa chỉ của biến a cho con biến y VI. y=&a. Cú pháp: *<Tên biến con trỏ> − Với cách truy cập này thì *<Tên biến con trỏ> có thể coi là một biến có kiểu được mô tả trong phần khai báo biến con trỏ. Ví dụ: a=*p .2. x. Toán tử tham chiếu (*) Toán tử (*) để truy cập đến nội dung của ô nhớ mà con trỏ chỉ tới. y. x= a.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Toán tử & dùng để định vị con trỏ đến địa chỉ của một biến đang làm việc.2. Ví dụ: int a=25. // biến a mang giá trị trong ô nhớ p :1776 a = *p.2. Giải thích: biến a chứa giá trị trong ô nhớ 1776 mà con trỏ p trỏ tới mang giá trị 25 a = p. Cú pháp: <Tên biến con trỏ>=&<Tên biến> Ý nghĩa: Gán địa chỉ của biến <Tên biến> cho con trỏ <Tên biến con trỏ>. . //Gán giá trị của biến a cho biến x. // biến a mang giá trị của ô nhớ do p trỏ tới: 25 Ví dụ: Tổ tin học Cơ sở 77 .

/* đúng */ Tổ tin học Cơ sở 78 . getch(). getch().h> #include<conio. a = p . int *p1. // p1 = địa chỉ của value1 p2 = &b. − Hai con trỏ cùng kiểu có thể gán cho nhau Ví dụ: int a. b = 15. // giá trị trỏ bởi p1 = 20 cout << "a = " << a << endl. // con trỏ p chứa địa chỉ của a *p = 10.h> void main () { int a = 5.//gán giá trị 10 cho ô nhớ do p trỏ tới p = &b.2. // p1 = p2 (phép gán con trỏ) *p1 = 20. b=20 Ví dụ // more pointers #include <iostream. *a . //biến con trỏ p kiểu int p = &a.2.3. return 0. // giá trị trỏ bởi p1 = 10 *p2 = *p1. // p2 = địa chỉ của value2 *p1 = 10. cout<<”b =" << b.h> int main () { int a = 5. *p. } VI. p = &a . Một số phép toán trên con trỏ Việc thực hiện các phép tính số học với con trỏ hơi khác so với các kiểu dữ liệu số nguyên khác vì kết quả phụ của các phép tính phụ thuộc vào kích thước của kiểu dữ liệu mà biến con trỏ trỏ tới.// con trỏ p chứa địa chỉ của a *p = 20.//gán giá trị 10 cho ô nhớ do p trỏ tới cout << "a =" << a << endl.h> #include<conio. Phép gán con trỏ: . *p2. a=5.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin // my first pointer #include <iostream. VI. cout<<"b = " << b. // giá trị trỏ bởi p2 = giá trị trỏ bởi p1 p1 = p2. int *p.3. } // kết quả a=10.1. p1 = &a. float *f. b = 15.

pb = pa + 7. /* đúng */ f = (float*)p.2. pa = (int*) malloc(20). Ví dụ : pc-pa=4. Ví dụ: int *pa.3.2. Cộng. long *mylong. Tổ tin học Cơ sở 79 . Đây chính là khoảng cách (số phần tử) giữa 2 con trỏ đó. *a . *pc. p = &a .Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin f = p . *p. /* sai do khác kiểu */ − Ta cũng có thể ép kiểu con trỏ theo cú pháp: (<Kiểu kết quả>*)<Tên con trỏ> Chẳng hạn. trừ con trỏ với một số nguyên − Ta có thể cộng (+). trừ (-) 1 con trỏ với 1 số nguyên N nào đó. float *f. /* Đúng nhờ ép kiểu*/ VI. − Phép trừ 2 con trỏ cùng kiểu sẽ trả về 1 giá trị nguyên (int). − Ta cũng có thể áp dụng các phép toán tăng/giảm (++/--) một ngôi trên biến con trỏ Ví dụ : char *mychar. /* Cấp phát vùng nhớ 20 byte=10 số nguyên*/ int *pb. q = p .3. short *myshort. pc = pb . ví dụ trên được viết lại: int a. a=5. kết quả trả về là 1 con trỏ. − Lưu ý: không thể cộng 2 con trỏ với nhau. và chúng lần lượt trỏ tới ô nhớ 1000. 2000 and 3000. Con trỏ này chỉ đến vùng nhớ cách vùng nhớ của con trỏ hiện tại N phần tử.

87. } Cả 3 đoạn lệnh (a). Lưu ý: − Cách ghi *(point+i) không làm thay đối giá trị trong point − Cách ghi *point++ thì làm thay đổi giá trị của point sau mỗi lần thực hiện. (c) getch().i++) cout<<*(point)++<<" ". Ta có thể thu được kết quả như trên nếu viết: mychar = mychar + 1. cả hai toán tử tăng (++) đều được thực hiện sau khi giá trị của *q được gán cho *p và sau đó cả q và p đều tăng lên 1. (b). for (i=0.i<SIZE. int i. *point. (c) đều có công dụng in giá trị các phần tử trong mảng a.i<SIZE. p++.h> #include <conio. a[SIZE]={98. Lưu ý: cả hai toán tử tăng (++) và giảm (--) đều có quyền ưu tiên lớn hơn toán tử tham chiếu (*). return.i++) cout<<*(point+i)<<" ". clrscr(). // point=grade for (i=0. vì vậy biểu thức sau đây có thể dẫn tới kết quả sai: *p++. (b) cout<<endl. mylong = mylong + 1. for (i=0. myshort = myshort + 1. − Lệnh *p++ = *q++. q++. Tổ tin học Cơ sở 80 . *p++ = *q++.h> void main() { const int SIZE=5.i++) cout<<*(a+i)<<" ". point=&a[0]. Lệnh này tương đương với: *p = *q.76. Ví dụ : #include <iostream.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Điều này đúng với cả hai phép toán cộng và trừ đối với con trỏ.i<SIZE.65. − Lệnh *p++ tương đương với *(p++) : thực hiện là tăng p (địa chỉ ô nhớ mà nó trỏ tới chứ không phải là giá trị trỏ tới). (a) cout<<endl.54}.

4. p = numbers + 3. dùng dấu ngoặc vuông để chỉ ra phần tử của mảng cần truy xuất đến. Cặp ngoặc vuông này được coi như là toán tử offset và ý nghĩa của chúng không đổi khi được dùng với biến con trỏ. nhưng chúng cũng có thể được xác định qua biến con trỏ. Con trỏ và mảng. n<5. Giữa mảng và con trỏ có một sự liên hệ rất chặt chẽ. ". sự khác biệt duy nhất là ta có thể gán một giá trị khác cho con trỏ p trong khi numbers luôn trỏ đến phần tử đầu tiên trong số 20 phần tử kiểu int mà nó đã được định nghĩa. p = numbers. // pointed by (a+5) = 0 Tổ tin học Cơ sở 81 . return 0. Ở đây p và numbers là tương đương và chúng có cùng thuộc tính. p = &numbers[2]. *p = 10. vì numbers là một mảng (con trỏ hằng) và không có giá trị nào có thể được gán cho các hằng. p = numbers. vì vậy numbers là một biến con trỏ hằng. p++. Ví dụ: int numbers [20]. n++) cout << numbers[n] << ". int * p. vì vậy thực tế chúng hoàn toàn như nhau. *p = 40. *p = 30. Những phần tử của mảng được xác định bằng chỉ số trong mảng. // a [offset of 5] = 0 *(a+5) = 0. for (int n=0. } Trong bài "mảng". giống như một con trỏ tương đương với địa chỉ của phần tử đầu tiên mà nó trỏ tới. *(p+4) = 50. Do đó lệnh gán sau đây là không hợp lệ: numbers = p.h> int main () { int numbers[5]. int * p. Vì con trỏ cũng có mọi tính chất của một biến nên tất cả các biểu thức có con trỏ trong ví dụ dưới đây là hoàn toàn hợp lệ: Ví dụ: // more pointers #include <iostream.2. Tên của một mảng tương đương với địa chỉ phần tử đầu tiên của nó.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin VI. p = numbers. *p = 20. Ví dụ: a[5] = 0.

truy cập các phần tử theo kiểu mảng và theo kiểu con trỏ. for(i=0. /* NhapContro(a.i++) cout<<setw(3)<<a[i].i++) { cout<<"a["<<i<<" ]=".i++) cout<<setw(3)<<*(a+i).N). for(i=0. } Tổ tin học Cơ sở 82 .i. for(i=0.i++) { cout<<"a["<<i<<"] =".i<N.i<N. } } /* Nhập mảng theo dạng con trỏ*/ void NhapContro(int a[ ]. cout<<"So phan tu N= ". Truy cập các phần tử mảng theo dạng con trỏ Để truy cập các phần tử của mảng theo dạng con trỏ ta dùng cú pháp sau: &<Tên mảng>[0] tương đương với <Tên mảng> &<Tên mảng> [<Vị trí>] tương đương với <Tên mảng> + <Vị trí> <Tên mảng>[<Vị trí>] tương đương với *(<Tên mảng> + <Vị trí>) Ví dụ: Cho mảng 1 chiều a có 5 phần tử kiểu số nguyên. for(i=0.i<N.i<N. int N) { int i.2.1. getch().N)*/ cout<<"Truy cap theo kieu mang: ".h> #include <conio.N.4.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Hai dòng lệnh trên hoàn toàn tương đương và hợp lệ với a là mảng hay là con trỏ. clrscr(). int N) { int i. cin>>N. NhapMang(a. VI. cin>>a[i]. } } void main() { int a[20].h> /* Nhập mảng bình thường*/ void NhapMang(int a[ ]. cout<<"Truy cap theo kieu con tro: ". cin>>a+i. #include <iostream.

clrscr(). Truy xuất từng phần tử đang được quản lý bởi con trỏ theo dạng mảng Cú pháp: <Tên biến>[<Vị trí>] tương đương với *(<Tên biến> + <Vị trí>) &<Tên biến>[<Vị trí>] tương đương với (<Tên biến> + <Vị trí>) Trong đó <Tên biến> là biến con trỏ. (b) getch().i<SIZE. addr=&a[0].h> #include <conio.76. for (i=0. <Vị trí> là 1 biểu thức số nguyên.87. − Nếu sử dụng chỉ số thì máy tính sẽ dựa vào chỉ số này và địa chỉ bắt đầu của vùng nhớ dành cho mảng để xác định địa chỉ của phần tử mà ta muốn truy xuất tới − Để truy xuất phần tử a[3] thì máy tính sẽ xác định địa chỉ của phần tử này như sau: &a[3]= a[0] + (3*2) //giả sử kiểu int chiếm 2 byte trong bộ nhớ. Ví dụ: Có mảng a gồm các phần tử kiểu số nguyên.65.i++) cout<<*(addr+i)<<" ".i++) cout<<a[i]<<" ".Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin VI. Ví dụ : #include <iostream.h> void main() { const int SIZE=5. *addr.2. khi viết: a[3] . return. int i. a[SIZE]={98. //truy xuất đến phần tử thứ 4 trong mảng a.2. (a) cout <<endl. Theo cách trên ta cũng có thể dùng một con trỏ lưu địa chỉ bắt đầu của một mảng sau đó dựa vào cách làm của máy để truy xuất đến một phần tử của mảng. for (i=0.i<SIZE.54}.4. } Tổ tin học Cơ sở 83 .

i<SIZE. a[SIZE]={98. for (i=0.i<SIZE. (a) cout <<endl.i++) cout<<a[i]<<" ".2. Truyền địa chỉ cho tham số bởi con trỏ: Chúng ta đã biết một phương pháp truyền địa chỉ cho tham số đó là sử dụng tham chiếu.87. Vì vậy đoạn lệnh (b) của chương trình trên được viết lại như sau: #include <iostream. addr=&a[0] // địa chỉ bắt đầu của mảng được gán vào con trỏ addr. (addr+i) // lưu địa chỉ của phần tử thứ i trong mảng và *(addr+i) // giá trị của phần tử thứ i trong mảng.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin Trong chương trình trên cả hai đoạn lệnh (a) và (b) đều có công dụng in các giá trị của mảng lên màn hình. − *(addr+3)= giá trị phần tử a[3] − *addr+3= giá trị của phần tử grade[0]+3 Qua chương trình trên ta thấy hoàn toàn có thể truy xuất mảng thông qua một con trỏ. int i.h> #include <conio.76. } VI. bởi nó có thể được thay thế bởi tên mảng a. clrscr().h> void main() { const int SIZE=5. (b) getch(). Tuy nhiên việc khai báo con trỏ addr để sử dụng trong việc này thật sự không cần thiết.i++) cout<<*(a+i)<<" ".65. Trong C++ khi ta khai báo một mảng thì tên của mảng sẽ chứa địa chỉ khởi đầu của mảng đó và ta không thể thay đổi địa chỉ chứa trong tên mảng này vì vậy tên mảng được gọi là một hằng con trỏ. phương pháp này có một nhược điểm là lời gọi hàm Tổ tin học Cơ sở 84 . Tuy nhiên. for (i=0. Bảng ý nghĩa giữa các hình thức truy xuất trên: Phần tử thứ i của mảng a 0 1 2 3 4 Địa chi của phần tử thứ i Sử dụng toán Sử dụng tử con trỏ addr tham chiếu & &a[0] addr &a[1] addr+1 &a[2] addr+2 &a[3] addr+3 &a[4] addr+4 Giá trị của phần tử thứ i Sử dụng chỉ số a[0] a[1] a[2] a[3] a[4] Sử dụng con trỏ a *(addr) *(addr+1) *(addr+2) *(addr+3) *(addr+4) Lưu ý : − *(addr+3) hoàn toàn có ý nghĩa khác với *addr+3. return.5.54}.

j truyền cho tham số loại nào.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin không cho ta biết là dữ liệu truyền cho hàm là truyền tham chiếu hay cho tham trị. Một số trường hợp ta cần một lượng bộ nhớ mà kích cỡ của nó chỉ có thể được xác định khi chương trình chạy. Ví dụ: Hàm swap để đổi giá trị của hai biến truyền cho nó.h> void swap(int*. int*).j) ta không thể biết i.3 Bộ nhớ động Cho đến nay. #include <iostream. phương pháp truyền địa chỉ cho tham số bằng con trỏ được thể hiện rỏ ràng trong cả nguyên mẫu lẫn lời gọi hàm.int* y) { int tam. ví dụ như trong trường hợp chúng ta nhận thông tin từ người dùng để xác định lượng bộ nhớ cần thiết. mà chỉ biết khi nhìn vào dòng nguyên mẫu: void swap(int& . int& y) Ngược lại. Heap được sử dụng cho việc cấp phát động các khối bộ nhớ trong Tổ tin học Cơ sở 85 . void main() { int i=5. clrscr(). Ví dụ như dựa vào lời gọi hàm swap(i. các tham số của hàm được khai báo theo dạng con trỏ và lời gọi hàm trong trường hợp này phải sử dụng toán tử & trước tên biến truyền cho hàm. } void swap(int* x. //I=5 j=10 swap(&i. *x=*y. Chỉ khi nào nhìn vào nguyên mẫu hoặc dòng tiêu đề của hàm ta mới phát hiện được.j=10. return. Kích cỡ của chúng là cố định và không thể thay đổi trong thời gian chương trình chạy. *y=tam. return. //I=10 j=5 getch(). tất cả những phần bộ nhớ chúng ta có thể sử dụng là các biến các mảng và các đối tượng khác mà chúng ta đã khai báo.h> #include <conio. } Hãy lưu ý các dòng in đậm trong chương trình để thấy được cách sử dụng và khai báo con trỏ VI. int&) hay dòng tiêu đề void swap(int& x. tam=*x.&j). trong các chương trình của chúng ta. cout <<"\n Truoc khi goi ham swap\n" <<"i= "<<i<<" " <<"j= "<<j <<endl. cout <<"Sau khi goi ham swap\n" <<"i= "<<i<<" " <<"j= "<<j <<endl. Một vùng bộ nhớ khác gọi là heap được cung cấp.

Giáo trình Phương pháp lập trình

Trung tâm Công Nghệ Thông Tin

thời gian thực thi chương trình. Vì thế heap cũng được gọi là bộ nhớ động (dynamic memory). Có hai toán tử được sử dụng cho việc cấp phát và thu hồi các khối bộ nhớ trên heap: Toán tử new và delete

VI.3.1.

Toán tử new

Toán tử new nhận một kiểu như là một đối số và được cấp phát một khối bộ nhớ cho một đối tượng của kiểu đó. Nó trả về một con trỏ tới khối đã được cấp phát. Cú pháp:

pointer = new type hoặc pointer = new type [elements]
− Lệnh thứ nhất được dùng để cấp phát bộ nhớ chứa một phần tử có kiểu type. − Lệnh thứ hai được dùng để cấp phát một khối nhớ (một mảng) gồm các phần tử kiểu type. Ví dụ: int *ptr = new int; // cấp phát tương ứng một khối cho lưu trữ một số nguyên char *str = new char[10]; //khối đủ lớn cho lưu trữ một mảng 10 ký tự Ví dụ: int * bobby; bobby = new int [5]; Trong trường hợp này hệ điều hành dành chỗ cho 5 phần tử kiểu int trong bộ nhớ và trả về một con trỏ trỏ đến đầu của khối nhớ. Vì vậy lúc này bobby trỏ đến một khối nhớ hợp lệ gồm 5 phần tử int.

Sự khác nhau giữa việc khai báo một mảng với việc cấp phát bộ nhớ cho một con trỏ: − Khai báo một mảng :kích thước của một mảng phải là một hằng, điều này giới hạn kích thước của mảng đến kích thước mà chúng ta chọn khi thiết kế chương trình − Cấp phát bộ nhớ động cho phép cấp phát bộ nhớ trong quá trình chạy với kích thước bất kì. Bộ nhớ động được quản lý bởi hệ điều hành và trong các môi trường đa nhiệm có thể chạy một lúc vài chương trình, có một khả năng có thể xảy ra là hết bộ nhớ để cấp phát. Nếu điều này xảy ra và hệ điều hành không thể cấp phát bộ nhớ như chúng ta yêu cầu với toán tử new, một con trỏ null (zero) sẽ được trả về. Vì vậy khi dùng bộ nhớ động ta cần phải kiểm tra xem con trỏ trả về bởi toán tử new có bằng null hay không

Tổ tin học Cơ sở

86

Giáo trình Phương pháp lập trình int * bobby; bobby = new int [5]; if (bobby == NULL) {

Trung tâm Công Nghệ Thông Tin

// error assigning memory. Take measures. };

VI.3.2.

Toán tử delete.

Vì bộ nhớ động chỉ cần thiết trong một khoảng thời gian nhất định, khi nó không cần dùng đến nữa thì nó sẽ được giải phóng để có thể cấp phát cho các nhu cầu khác trong tương lai. Để thực hiện việc này ta dùng toán tử delete. Cú pháp delete pointer; hoặc delete [ ] pointer; − Lệnh thứ nhất: dùng để giải phóng bộ nhớ được cấp phát cho một phần tử bởi toán tử new. − Lệnh thứ hai dùng để giải phóng một khối nhớ gồm nhiều phần tử (mảng). được cấp phát bởi toán tử new Ví dụ: // rememb-o-matic #include <iostream.h> #include <stdlib.h> int main () { char input [100]; int i,n; long * l, tong = 0; cout << "How many numbers do you want to type in? "; cin.getline (input,100); i=atoi (input); l= new long[i]; if (l == NULL) exit (1); for (n=0; n<i; n++) { cout << "Enter number: "; cin.getline (input,100); l[n]=atol (input); } cout << "You have entered: "; for (n=0; n<i; n++) cout << l[n] << ", "; delete[] l; return 0; } Kết quả : How many numbers do you want to type in? 5 Enter number : 75

Tổ tin học Cơ sở

87

Giáo trình Phương pháp lập trình

Trung tâm Công Nghệ Thông Tin

Enter number : 436 Enter number : 1067 Enter number : 8 Enter number : 32 You have entered: 75, 436, 1067, 8, 32, Ví dụ : Viết chương trình tạo giá trị cho một mảng động và in mảng lên màn hình. Số phần tử của mảng được nhập vào khi thực hiện chương trình. #include <iostream.h> #include <conio.h> #include <stdlib.h> void main(void) { long int num_arr,i; int* arr; clrscr(); cout <<"\n cho biet so phan tu muon su dung"; cin >>num_arr; if (num_arr>0) { arr=new int[num_arr]; if (arr!=NULL) { randomize; for (i=0;i<num_arr;i++) arr[i]=random(100); for (i=0;i<num_arr;i++) cout <<*(arr+i)<<" "; delete(arr); } else cout <<"khong du bo nho"; getch(); return; } VI.3.2.1. NULL Null là một hằng số được định nghĩa trong thư viện C++ dùng để biểu thị con trỏ null. Trong trường hợp hằng số này chưa định nghĩa bạn có thể tự định nghĩa nó:

#define NULL 0
Dùng 0 hay NULL khi kiểm tra con trỏ là như nhau nhưng việc dùng NULL với con trỏ được sử dụng rất rộng rãi và điều này được khuyến khích để giúp cho chương trình dễ đọc hơn. VI.3.2.2. Bộ nhớ động trong ANSI-C

Tổ tin học Cơ sở

88

Giáo trình Phương pháp lập trình

Trung tâm Công Nghệ Thông Tin

Toán tử new và delete là độc quyền C++ và chúng không có trong ngôn ngữ C. Trong ngôn ngữ C, để sử dụng bộ nhớ động phải sử dụng thư viện stdlib.h. Cách này cũng hợp lệ trong C++ và nó vẫn còn được sử dụng trong một số chương trình. − Hàm malloc: Đây là một hàm tổng quát để cấp phát bộ nhớ động cho con trỏ.
Cấu trúc của nó như sau:

void * malloc (size_t nbytes); trong đó nbytes là số byte muốn gán cho con trỏ. Hàm này trả về một con trỏ kiểu void*, vì vậy phải chuyển đổi kiểu sang kiểu của con trỏ đích. Ví dụ: char * ronny; ronny = (char *) malloc (10); Đoạn mã này cấp phát cho con trỏ ronny một khối nhớ 10 byte. Khi muốn cấp phát một khối dữ liệu có kiểu khác char (lớn hơn 1 byte) thì phải nhân số phần tử mong muốn với kích thước của chúng. Để lấy kích thước ta sử dụng toán tử sizeof, toán tử này trả về kích thước của một kiểu dữ liệu cụ thể. int * bobby; bobby = (int *) malloc (5 * sizeof(int)); Đoạn mã này cấp phát cho bobby một khối nhớ gồm 5 số nguyên kiểu int, kích cỡ của kiểu dữ liệu này có thể bằng 2, 4 hay hơn tùy thuộc vào hệ thống mà chương trình được dịch. − Hàm calloc: calloc hoạt động rất giống với malloc, sự khác nhau chủ yếu là khai báo mẫu của nó: void * calloc (size_t nelements, size_t size); Trong khai báo sử dụng hai tham số thay vì một. Hai tham số này được nhân với nhau để có được kích thước tổng cộng của khối nhớ cần cấp phát. Thông thường tham số thứ nhất (nelements) là số phần tử và tham số thức hai (size) là kích thước của mỗi phần tử. Ví dụ: int * bobby; bobby = (int *) calloc (5, sizeof(int)); Một điểm khác nhau nữa giữa malloc và calloc là calloc khởi tạo tất cả các phần tử của nó về 0. − Hàm realloc: thay đổi kích thước của khối nhớ đã được cấp phát cho một con trỏ. void * realloc (void * pointer, size_t size); Tham số pointer nhận vào một con trỏ đã được cấp phát bộ nhớ hay một con trỏ null. Tham số size chỉ định kích thước của khối nhớ mới. Hàm này sẽ cấp phát size byte bộ nhớ cho con trỏ. Nó có thể phải thay đổi vị vị trí của khối nhớ để có thể đủ chỗ cho kích thước mới của khối nhớ, trong trường hợp này nội dung hiện
89

Tổ tin học Cơ sở

void free (void * pointer). − Hàm free: Hàm này giải phóng một khối nhớ động đã được cấp phát bởi malloc. Con trỏ mới trỏ tới khối nhớ được hàm trả về. Tổ tin học Cơ sở 90 . Nếu không thể thay đổi kích thước của khối nhớ thì hàm sẽ trả về một con trỏ null nhưng tham số pointer và nội dung của nó sẽ không bị thay đổi. calloc hoặc realloc.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin thời của khối nhớ được copy tới vị trí mới để đảm bảo dữ liệu không bị mất.

7.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin BÀI TẬP 1. Viết hàm hoán vị hai biến thực a. Viết chương trình tính tích phân của f(x) trên đoạn [a. b] bằng công thức hình thang. b. Sử dụng hàm trên để tính tích phân trong đoạn [-1. 4. tích phân của f(x) trên [a. 5. s là tổng tất cả các f(a+i*h) với i từ 1 tới n. Sử dụng hàm trên để đổi chỗ a và b. 6. Viết chương trình chính nhập hai số thực a. c. b] bằng: h * s. Viết hàm cộng hai ma trận vuông a và b cấp n (sử dụng con trỏ). Viết hàm tính giá trị đa thức: f(x) = a0xn + … + an-1x + an. b] thành n khoảng. e. và 2 đối ra là x và y. Tổ tin học Cơ sở 91 . Viết chương trình nhập vào một mảng a gồm n phần tử nguyên. d. Hãy dùng một vòng for để nhập vào một ma trận vuông cấp n với các phần tử thực và tìm phần tử Max của ma trận này. b bằng cách sử dụng con trỏ (đối vào là hai con trỏ). 4] của: f(x) = (ex-2sin(x2))/ (1+x4). Theo đó. với đối vào là biến nguyên n và mảng thực a. Trong đó: h là độ dài khoảng phân hoạch đoạn [a. Sắp xếp mảng theo chiều giảm dần (lưu ý sử dụng tên mảng như con trỏ và sử dụng con trỏ). 3. 2. b. (nghiên cứu cách đưa con trỏ vào giải quyết bài toán). Viết hàm giải hệ phương trình bậc nhất với sáu đối ào l a.

Ví dụ : Chuỗi “Chao ban” được trong bộ nhớ như sau: C h A o b a n \0 VII.2.3. bộ nhớ sẽ cung cấp 12+1 bytes để lưu trữ nội dung của ký tự Ten. Khai báo theo con trỏ Cú pháp: char *<Biến> Ví dụ: char *Ten. bộ nhớ sẽ dành 2 byte để lưu trữ địa chỉ của biến con trỏ Ten đang chỉ đến. Vừa khai báo vừa gán giá trị Cú pháp: char <Biến>[ ]=<”Hằng ”> Ví dụ: #include<iostream.1 KHÁI NIỆM CHUỖI KÝ TỰ ký tự là một dãy gồm các ký tự hoặc một mảng các ký tự được kết thúc bằng ký tự ‘\0’ (còn được gọi là ký tự NULL trong bảng mã Ascii). Ghi chú: − Chiều dài tối đa của biến là một hằng nguyên nằm trong khoảng từ 1 đến 255 bytes.2 KHAI BÁO VII.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin CHƯƠNG VII: VII. byte cuối cùng lưu trữ ký tự ‘\0’ để chấm dứt . VII.h> #include<conio. chưa cung cấp nơi để lưu trữ dữ liệu. Các hằng ký tự được đặt trong cặp dấu nháy kép “”. Trong khai báo này. Trong khai báo này.1. VII.2.2. − Chiều dài tối đa không nên khai báo thừa để tránh lãng phí bộ nhớ.2. Khai báo theo mảng Cú pháp: char <Biến> [Chiều dài tối đa] Ví dụ: char Ten[12].h> 92 Tổ tin học Cơ sở . nhưng cũng không nên khai báo thiếu.

char st[MAX]. Ví dụ : #include <iostream.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin void main() { char Chuoi[]="Mau nang hay la mau mat em” . getch(). VII. cout <<"Nhap mot chuoi toi da “<<(MAX-1)<<” ky tu ".h> #include <conio.h> void main() { const int MAX=10. Tổ tin học Cơ sở 93 .n) Hàm cho phép nhập vào biến st (st là một mảng char) n-1 ký tự. cout <<”Chuoi vua nhap la :” <<a. cout<<"Vua khai bao vua gan trị :”<<Chuoi .3 CÁC THAO TÁC TRÊN CHUỖI KÝ TỰ VII.get() //Dùng để nhập một ký tự từ bàn phím //chờ nhận ký tự từ bàn phím − Nhập một chuỗi ký tự tối đa n-1 ký tự từ bàn phím dùng hàm getline() Cú pháp: cin.1. Nhập xuất − Để nhập dữ liệu kiểu ký tự hoặc chuỗi từ bàn phím ta dùng hàm get() Cú pháp: cin. nếu nhập hơn thì phần ký tự còn lại sẽ để trên vùng đệm Ta cũng có thể dùng cin để nhập ký tự hoặc chuỗi nhưng trong trường hợp này nó không cho phép nhập ký tự trắng hoặc chuỗi có ký tự trắng.get(<biến >) hoặc cin.3.MAX).getline(st. } Lưu ý: − Khi nhập dữ liệu nếu chúng ta nhập quá số ký tự qui định (MAX-1) thì có thể ảnh hưởng đến những lệnh nhập sau hoặc có thể làm ảnh hưởng đến hoạt động của máy tính. in. } Lưu ý: được khai báo là một mảng các ký tự nên các thao tác trên mảng có thể áp dụng đối với ký tự. getch().getline(st. return.

getline(b.ignore: Cú pháp : cin. trong đó có một hàm số nhận được truyền thông qua tham số khi hàm được gọi. Ví dụ : Viết chương trình nhập .Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin − Để tránh tình trạng này thường sau khi nhập dữ liệu bằng cin.h> #include <string. #include <iostream.ignore(int n. char a[MAX]. cout <<"nhap mot chuoi".getline(a. //(1) cin. clrscr(). cin.i.h> void main() { const int MAX=5.5).h> #include <conio.getline ta sử dụng hàm cin.h> #include <conio. Truy xuất từng ký tự trong chuỗi: Do chuỗi là một mảng ký tự vì vậy ta có thể truy xuất chuỗi bằng chỉ số như truy xuất mảng.h> int vowels(char str[]).'\n').get.2. Tổ tin học Cơ sở 94 . } − Nếu ta nhập cho chuỗi a với nội dung: abcdefg và chuỗi b với nội dung hijkm thì chương trình in lên màn hình abcd hijk − Thông thường ta chọn n là một số >=127 (bởi ta chỉ có thể nhập từ bàn phím tối đa 127 ký tự vào biến) fflush(stdin) VII. cin. getch().h> #include <iomanip.ignore(100. Hoặc Ví dụ : #include <iostream.5).3. Hàm trả về số nguyên âm của này. ‘\n’) Công dụng của hàm là bỏ qua tối đa n trong vùng đệm hoặc khi gặp phím enter (\n)thì kết thúc lệnh cin. cout <<"nhap mot chuoi".b[MAX]. được nhập từ bàn phím. in. cin. //(2) cout<<a<<” “<<b.h> #include <stdlib.

getch(). char st[MAX]. st[i]='\0'.c.getline(st.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin void main() { const int MAX=80. cout<<"So nguyen am la: "<<vowels(st). Ví dụ : Viết chương trình nhập giá trị cho một biến chuỗi bằng cin. int i=0. getch().get())!='\n') st[i++]=c.ignore(100.h> #include <string. } int vowels(char str[]) { int count=0. } return count. cout <<"nhap mot chuoi".'\n'). clrscr(). cout<<"Chuoi vua nhap la: "<<st. char st[MAX].h> #include <conio.i=0. clrscr(). } 95 Tổ tin học Cơ sở . while (i<MAX &&(c=cin.MAX). } Lưu ý Hàm vowels trong trường hợp này không cần khai báo tham số để nhận số phần tử đang có trong vì ta có thể nhận biết thông qua ký tự kết thúc . } i++. while (str[i]!='\0') { switch(str[i]) { case 'a': case 'e': case 'i': case 'o': case 'u': count++. cout <<"nhap mot chuoi \n".h> void main() { const int MAX=80. cin.get() #include <iostream. cin.

h> void strcopy(char st1[]. char st2[]) { int i=0. Tổ tin học Cơ sở 96 . } VII.str1[MAX]. char st2[]). i++. void strcopy(char st1[]. clrscr(). char st2[]) { while (*st1++ = *st2++). while (st2[i] != ‘\0’) { st1[i]=st2[i].1.4. } Ví dụ: Viết một chương trình đầy đủ có sử dụng hàm strcopy được thể hiện như sau: #include <iostream. void main() { const int MAX=80.h> #include <string. Khi sử dụng con trỏ để truy xuất chuỗi thay vì dùng chỉ số thì chương trình sẽ cô đọng và hiệu quả hơn. } Chương trình trên có thể viết lại cô động và hiệu quả hơn như sau: void strcopy(char st1[].'\n'). cin. } st1[i]=’\0’. Ví dụ: Viết lại hàm strcopy bằng cách sử dụng con trỏ.h> #include <conio.getline(str2.4 CON TRỎ VÀ CÁC HÀM TRÊN CHUỖI: VII.MAX). char st2[]) { int i=0. int i=0. char str2[MAX].c. cin. void strcopy(char st1[]. while (st2[i] = st1[i]) i++.Giáo trình Phương pháp lập trình Ví dụ: Trung tâm Công Nghệ Thông Tin Xây dựng hàm có hai tham số để nhận hai chuỗi sau đó copy nội dung chuỗi thứ hai sang chuỗi thứ nhất. cout <<"nhap mot chuoi \n". Con trỏ và chuỗi Con trỏ đặc biệt hữu ích trong việc xây dựng các hàm xử lý chuỗi.ignore(100.

Kết quả trả về của hàm giống ”.h> #include <conio. int n.str2.Giáo trình Phương pháp lập trình strcopy(str1.h> #include <stdlib. char st2[]) { while (*st1++=*st2++).5) Nếu str_exp vượt quá n ký tự thì ký tự ‘\0’ sẽ không được chèn vào cuối chuỗi str_var strncmp(str_exp1. hàm có kết quả NULL nếu char_exp không có trong str_exp Ví dụ : #include <iostream.MAX).char_exp) Trả về địa chỉ của ký tự đầu tiên trong chuỗi strchr(“Hello”. không tính strlen(“Hello”) ký tự ‘\0’ strcmp(str_exp1.”Lan”) của hàm là: .số âm nếu str_exp1<str_exp2 .n) so sánh n ký tự đầu của hai chuỗi str_exp1 strncmp(“Hey”. Các hàm thao tác trên chuỗi: − Để sử dụng các hàm thao tác với chuỗi ta khai báo thư viện string. string_exp) Copy nội dung của chuỗi string_exp (biểu strcpy(st.str1[MAX].số dương nếu str_exp1<str_exp2 strncpy(str_var.str2). clrscr(). cout <<"Nhap chuoi thu 1: ". } Trung tâm Công Nghệ Thông Tin VII. string_exp) Ghép nội dung của chuỗi str_exp vào cuối strcat(test.getline(str1.h> void main() { const int MAX=80.”abcd”) thức chuỗi) sang chuỗi string_var (biến chuỗi) strcat(string_var.c. cin.’e’) str_exp giống với char_exp. cout<<"\n"<<str1.h> #include <string.”abcd”) chuỗi string_var strlen(str_exp) Trả về chiều dài thực của chuỗi.str_exp2.str_exp.”Head và str_exp2.n) Copy n ký tự của string_exp sang str_var. strncpy(str1.số =0 nếu str_exp1=str_exp2 . char str2[MAX].4. } void strcopy(char st1[].2) như hàm strcmp strchr(str_exp.2. getch().h − Danh sách các hàm thao tác với chuỗi thông dụng: Tên hàm Công dụng Ví dụ Strcpy(string_var.str_exp2) So sánh chuỗi str_exp1 và str_exp2. if (strlen(str1)>=MAX-1) Tổ tin học Cơ sở 97 . kết quả strcmp(“Anh”.

//Sau khi noi chieu dai k0 duoc vuot qua pham vi cout<<"Sau khi noi str2 vao str1 \n"<<"chuoi 1 la: "<<str1<<endl. } − Các hàm thao tác trên ký tự trong thư viện ctype.str2). cin.str2).Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin cin. if (n<0) cout <<str1 <<" nho hon " <<str2<<endl.str2). strcat(str1. cout <<"Nhap chuoi thu 2: ".MAX). strcpy(str1. else cout <<str1 <<" lon hon " <<str2<<endl. cout<<"Chieu dai chuoi thu 2 la: "<<strlen(str2)<<endl. getch().h: Tên hàm Công dụng Ví dụ kết quả của hàm có giá trị khác 0 khi isalpha(‘x’) int isalpha(char_exp) char_exp là một chữ cái kết quả của hàm có giá trị khác 0 khi isupper(‘a’) int isupper(char_exp) char_exp là một chữ cái hoa Trả về chiều dài thực của chuỗi. cout <<"Chieu dai chuoi thu 1 la: "<<strlen(str1)<<endl . cout <<"Sau khi copy noi dung str2 vao str1 \n" cout<<"chuoi 1 la: "<<str1<<endl. else if (n= =0) cout <<str1 <<" == " <<str2<<endl. n= strcmp(str1.ignore(100. không islower(‘a’) int islower(char_exp) tính ký tự ‘\0’ kết quả của hàm có giá trị khác 0 khi isdigit(‘a’) int isdigit(char_exp) char_exp là một ký số kết quả của hàm có giá trị khác 0 nếu isascii(‘a’) int isascii(char_exp) char_exp là một ký tự có mã ascii <128 kết quả của hàm có giá trị khác 0 khi isspace(‘ ’) int isspace(char_exp) char_exp là một khoảng trắng kết quả của hàm có giá trị khác 0 khi isprint(‘a’) int isprint(char_exp) char_exp là một ký tự có thể in được kết quả của hàm có giá trị khác 0 khi iscntrl(‘a’) int iscntrl(char_exp) char_exp là một ký tự điều khiển kết quả của hàm có giá trị khác 0 khi ispunct(‘!’) int ispunCt(char_exp) char_exp là một ký tự dấu Kết quả của hàm là ký tự hoa tương ứng toupper(‘a’) int toupper(char_exp) với char_exp Kết quả của hàm là ký tự thường tương tolower(‘a’) int tolower(char_exp) ứng với char_exp Tổ tin học Cơ sở 98 .'\n').getline(str2.

Việc double atof(char_exp) chuyển đổi sẽ dừng khi gặp ký tự không thể chuyển sang dạng double được Chuyển già trị số nguyên sang dạng chuởi char* itoa(int value. ký tự in được. clrscr(). cout <<setw(3)<<"MaKT"<<setw(8)<<"KT ASCII"<<setw(8) <<"KT DK"<<setw(8)<<"KT IN"<<setw(8) <<"KT DAU"<<setw(8)<<"KY TU"<<endl. ký tự điều khiển.h> int test_int(char*). Việc atoi(‘123a45’) int atoi(str_exp) chuyển đổi sẽ dừng khi gặp ký tự không phải là ký số Chuyển một chuỗi sang số double. if (isprint(char(i))) cout<<setw(7)<<char(i). cout <<endl. của 256 ký tư trong bảng mã #include <iostream.h> #include <conio.h> #include <ctype. ký tự dấu. Tổ tin học Cơ sở 99 .h> #include <ctype. st là một con trỏ kiểu ký tự Ví du Viết chương trình gồm hai hàm kiểm tra việc nhập số nguyên và số thực #include <iostream.h> void main() { const int MAX=80.Giáo trình Phương pháp lập trình Ví dụ Trung tâm Công Nghệ Thông Tin Viết chương trình in lên màn hình cho biết các đặc tính ascii. int radix) đến. } − Các hàm chuyển đổi chuỗi trong thư viện stdlib.h> #include <stdlib.i++) { if (i%22==0) { getch(). và gán vào vùng nhớ mà con trỏ st đang trỏ char *st. clrscr(). int i. for (i=0.h> #include <iomanip.h: Chuyển một chuỗi sang số nguyên.i<=255. } getch().h> #include <conio. } cout <<setw(3)<<i<<setw(8)<<isascii(char(i))<<setw(10) <<iscntrl(char(i))<<setw(7)<<isprint(char(i))<<setw(8)<<ispunct(char(i)).

Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin int test_float(char *st).' ) st++. } int test_int(char *st) { while (isdigit(*(st))) st++. char str2[MAX]. cin. if (test_float (str2)) { x=atof(str2). if (test_int(str2)) { n=atoi(str2).getline(str2.MAX).MAX). } else cout <<"Nhap sai". } else cout <<"Nhap sai". } Tổ tin học Cơ sở 100 .ignore(100. cin. return !int(*(st)). cout<<'\n'<<x<<endl.'\n'). return !int(*(st)). cout <<"nhap mot so nguyen \n". } int test_float(char *st) { while (isdigit(*(st))|| *(st)=='. getch(). double x. cout<<'\n'<<n<<endl. void main() { const int MAX=10.getline(str2. clrscr(). if (strlen(str2)>=MAX-1) cin. cout <<"nhap mot so double \n". int n.

Viết chương trình nhập một ký tự từ bàn phím. Ví dụ đảo của “abcd egh” là “hge dcba”. đổi các chữ cái đầu của họ. Ví dụ : ABCDEDCBA là đối xứng. Ví dụ: “Nguyễn Văn Minh” in ra thành: Nguyễn Văn Minh b) In ra màn hình từ bên phải nhất và phần còn lại của . Chú ý đến trường hợp cả họ và tên chỉ có một từ. Ví dụ: “Nguyễn Văn Minh” in ra thành: Minh Nguyễn Văn 6. cắt bỏ các khoảng trắng bên phải. tách tên từng người ra khỏi họ và tên rồi sắp xếp danh sách tên theo thứ tự từ điển.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin BÀI TẬP 1. Viết chương trình nhập một chuỗi ký tự và kiểm tra xem chuỗi đó có đối xứng không. In kết quả lên màn hình. Viết chương trình nhập vào họ và tên của một người. Viết chương trình nhập vào một chuỗi ký tự. tên và chữ lót của mỗi người thành chữ hoa. 4. Tổ tin học Cơ sở 101 . Viết chương trình nhập vào họ và tên của một người. xuất ra màn hình đảo ngược của đó. hãy đếm số lần xuất hiện của mỗi loại ký tự. tách tên ra khỏi họ và tên. 3. in ra đảo ngược của chuỗi đó theo từng từ. 11. 5. chữ thường. Nhập vào một chuỗi ký tự bất kỳ. cắt bỏ các khoảng trống không cần thiết (nếu có). Viết chương trình nhập một chuỗi ký tự từ bàn phím. a) In ra màn hình từ bên trái nhất và phần còn lại của . Viết chương trình nhập vào một danh sách họ và tên của n người theo kiểu chữ thường. xuất ra màn hình mã Ascii của từng ký tự có trong . Viết chương trình nhập vào một chuỗi. Ví dụ : “Nguyễn Văn Minh” đảo thành “Minh Văn Nguyễn” 8. 12. 2. Ví dụ: “Nguyễn Văn Minh” In ra : Nguyễn Văn Minh 7. Viết chương trình nhập vào một danh sách họ và tên của n người. In ra màn hình toàn bộ họ tên người đó dưới dạng chữ hoa. Viết chương trình đổi số tiền từ số thành chữ. in tên lên màn hình. trái và các khoảng trắng không có nghĩa trong . In danh sách họ và tên sau khi đã sắp xếp. 9. Viết chương trình nhập vào một chuỗi rồi xuất chuỗi đó ra màn hình dưới dạng mỗi từ một dòng. 10.

cout<<” Nhap so n can tinh giai thua ".i. đệ quy phi tuyến. cout<<"Goi ham khong de quy: "<<giaithua_khongdequy(n). đệ quy nhị phân.h> /*Hàm tính n! bằng đệ quy*/ unsigned int giaithua_dequy(int n) { if (n= =0) return 1.h> #include <conio.1 Ví dụ: Định nghĩa giai thừa của một số nguyên dương n như sau: n!=1* 2 * 3 *…* (n-1) *n = (n-1)! *n (với 0!=1) Như vậy. clrscr(). } Định nghĩa Một hàm được gọi là đệ quy nếu bên trong thân hàm có lệnh gọi đến chính nó. } /*Hàm tính n! không đệ quy*/ unsigned int giaithua_khongdequy(int n) { unsigned int kq. cin>>n . } void main() { int n. đệ quy tương hỗ Tổ tin học Cơ sở 102 .i<=n. for (i=2. VIII.i++) kq=kq*i.2 Phân loại đệ quy: Các hàm đệ quy thường gặp có thể thuộc một trong bốn loại hàm đệ quy Đệ quy tuyến tính. else return n*giaithua_dequy(n-1). cout<<"Goi ham de quy: "<<giaithua_dequy(n). return kq. để tính n! ta thấy nếu n=0 thì n!=1 ngược lại thì n!=n * (n-1)! Với định nghĩa trên thì hàm đệ quy tính n! được viết: #include <iostream. kq=1. getch().Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin CHƯƠNG VIII: ĐỆ QUY VIII.

1. } Tổ tin học Cơ sở 103 .Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin VIII. n ) = USCLN(n . m mod n ) khi n ≠ 0 USCLN(m . } Ví dụ Chương trình con tính USCLN của 2 số dựa vào thuật toán Euclide : + Dạng hàm trên ngôn ngữ toán học : USCLN(m . … } Giải thích: P ≡ { NẾU thỏa <điều kiện dừng > thì thực hiện S . ngược lại { thực hiện S*. int n ) { if(n == 0 ) return (m) . m mod n ) . m mod n)) . else return ( USCLN( n . 0) = m + Dạng hàm trong ngôn ngữ mã giả : Nếu n = 0 thì USCLN = m Ngược lại USCLN = USCLN( n . else return ( n * FAC(n-1 )) . /* trường hợp neo */ Ngược lại FAC = n*FAC(n-1) } + Dạng hàm trong ngôn ngữ C++ : int FAC( int n ) { if ( n == 0 ) return 1 . S* là các thao tác không đệ quy . Ví dụ Hàm FAC(n) tính số hạng n của dãy n! + Dạng hàm trong ngôn ngữ mã giả : { Nếu n = 0 thì FAC = 1 .2. } … …TenHam(<Danh sách tham số>). Đệ quy tuyến tính Chương trình con đệ quy tuyến tính là chương trình con đệ quy trực tiếp đơn giản nhất có dạng : Cú pháp: KDL TenHam(<Danh sách tham số>) { if(<Điều kiện dừng>) { … return <Giá trị trả về>. gọi P} } Với S . +Dạng hàm trong C++ : int USCLN( int m .

… …TenHam(<Danh sách tham số>). n>1 long int Fibonaci(int n) { if(n= =0 || n= =1) return 1. P ≡ { for giá tri đầu to giá trị cuối do thực hiện S . } Trung tâm Công Nghệ Thông Tin VIII. if ( thỏa điều kiện dừng ) then thực hiện S* else gọi P end . Ngược lại { thực hiện S* . Đệ quy nhị phân Chương trình con đệ quy nhị phân là chương trình con đệ quy trực tiếp có dạng: P ≡ { NẾU thỏa điều kiện dừng thì thực hiện S .2. } //Với S . Đệ quy phi tuyến Chương trình con đệ quy phi tuyến là chương trình con đệ quy trực tiếp mà lời gọi đệ quy được thực hiện bên trong vòng lặp . } Ví dụ: Tính số hạng thứ n của dãy Fibonaci được định nghĩa như sau: f(0)=f(1)=1 f(n)=f(n-1)+f(n-2). return (Fibonaci(n-1)+Fibonaci(n-2)). S* là các thao tác không đệ quy Cú pháp: KDL TenHam(<Danh sách tham số>) { if(<Điều kiện dừng>) { … return <Giá trị trả về>.Giáo trình Phương pháp lập trình Ví dụ: Tính S(n)=1+2+3+…+n long int TongSn(int n) { if(n==0) return 0. } VIII. gọi P } } Với S . gọi P . S* là các thao tác không đệ quy Tổ tin học Cơ sở 104 .2. return (TongSn(n-1)+n).3.2. } … …TenHam(<Danh sách tham số>).

Giáo trình Phương pháp lập trình . Cú pháp:

Trung tâm Công Nghệ Thông Tin

KDL TenHam(<Danh sách tham số>) { for(int i=1; i<=n; i++) { … if(<Điều kiện dừng>) { … } else { … TenHam(<Danh sách tham số>); … } } }

Ví dụ: Tìm số hạng thứ n của dãy: x(0)=0 x(n)=n2x(0)+(n-1)2x(0)+(n-1)2x(0)+ +22x(n-2)+12x(n-1) long int TinhXn(int n) { if(n==0) return 1; long int s=0; for(int i=1; i<=n; i++) s+=i*i*TinhXn(n-i); return s; }

VIII.2.4. Đệ quy hỗ tương
Cú pháp: KDL TenHam2(<Danh sách tham số>); KDL TenHam1(<Danh sách tham số>) { … TenHam2(<Danh sách tham số>); … } KDL TenHam2(<Danh sách tham số>) { … TenHam1(<Danh sách tham số>); … }

Tổ tin học Cơ sở

105

Giáo trình Phương pháp lập trình

Trung tâm Công Nghệ Thông Tin

Ví dụ: Tìm số hạng thứ n của dãy sau: x(0)=1 y(0)=0 x(n)=x(n-1)+y(n-1) khi n>0 y(n)=3*x(n-1)-2*y(n-1) khi n>0 long int TinhYn(int n); long int TinhXn(int n) { if(n==0) return 1; return TinhXn(n-1)+TinhYn(n-1); } long int TinhYn(int n) { if(n==0) return 0; return 3*TinhXn(n-1)-2*TinhYn(n-1); }

VIII.3

Đặc điểm cần lưu ý khi viết hàm đệ quy
Hàm đệ quy phải có 2 phần: − Phần dừng hay phải có trường hợp nguyên tố. Trong ví dụ ở trên thì trường hợp n=0 là trường hợp nguyên tố. − Phần đệ quy: là phần có gọi lại hàm đang được định nghĩa. Trong ví dụ trên thì phần đệ quy là n>0 thì n! = n * (n-1)! Sử dụng hàm đệ quy trong chương trình sẽ làm chương trình dễ đọc, dễ hiểu và vấn đề được nêu bật rõ ràng hơn. Tuy nhiên trong đa số trường hợp thì hàm đệ quy tốn bộ nhớ nhiều hơn và tốc độ thực hiện chương trình chậm hơn không đệ quy. Tùy từng bài có cụ thể mà người lập trình quyết định có nên dùng đệ quy hay không (có những trường hợp không dùng đệ quy thì không giải quyết được bài toán).

Tổ tin học Cơ sở

106

Giáo trình Phương pháp lập trình 1. 2. 3. 4. BÀI TẬP Nhập n>=0. Tính S(n)=2+4+ … + (n+2). Nhập n>=0. Tính S(n)=1+3+ … + (n+1). Nhập n>=0. Tính S(n)=12+22+32+ … + n2. Nhập n>=0. Tính S(n)=12+22+32+ … + n2.

Trung tâm Công Nghệ Thông Tin

5. Nhập n>=0. Tính S (n) = 1 + + + ... + 6. Nhập n>=0. Tính 7. Nhập n>=0. Tính 8. Nhập n>=0. Tính 9. Nhập n>=0. Tính 10. Nhập n>=0. Tính

11. Tính T(n)=1*2*3*…*n 12. Nhập n>=0. Tính S(n)=1+1 × 2+1 × 2 × 3+ … +1 × 2 × 3 × … × n 13. Nhập x,n. Tính T(x,n)=xn 14. Nhập x,n. Tính S (n) = n x 15. Nhập x,n. Tính S(x,n)=x+x2+x3+ … +xn 16. Nhập x,n. Tính S(x,n)=x2+x4+x6+ … +x2n 17. Nhập x,n. Tính S(x,n)=x+x3+x5+ … +x2n+1 18. Nhập n. Tính S (n) = 1 + 19. Nhập x,n. Tính 20. Nhập x,n. Tính 21. Nhập x,n. Tính 22. Nhập x,n. Tính 23. Nhập n. Tính 24. Nhập n. Tính
1 1 1 + + ... + 1 + 2 1 + 2 +3 1 + 2 + ... + n x2 x3 xn S ( x, n ) = x + + + ... + 1 + 2 1 + 2 +3 1 + 2 + ... + n 2 3 n x x x S ( x, n ) = x + + + ... + 2! 3! n! x2 x4 x 2n S ( x, n ) = x + + + ... + 2! 4! 2n! 3 5 x x x 2 n +1 S ( x, n ) = x + + +... + 3! 5! ( 2n +1)!

1 1 1 2 3 n 1 1 1 S ( n) = + + ... + 2 4 2n 1 1 1 S ( n) =1 + + + ... + 3 5 2n +1 1 1 1 S ( n) = + +... + 1 ×2 2 ×3 n ×( n +1) 1 2 n S ( n) = + + ... + 2 3 n +1 1 3 2n +1 S (n) = + + ... + 2 4 2n + 2

S ( n) = 2 + 2 + 2 + + 2 ...

, có n dấu căn lồng nhau. , có n dấu căn lồng nhau.

S (n) = n + (n − ) + (n − ) + + 2 + 1 1 2 ...

1 25. Nhập n. Tính S (n) = 1 + 2 + 3 +... + (n − ) + n , có n dấu căn lồng nhau. 26. Hãy đếm số lượng chữ số của số nguyên dương n. 27. Hãy đếm tính tổng các chữ số của số nguyên dương n. 28. Hãy đếm tính tích các chữ số của số nguyên dương n. 29. Hãy đếm số lượng chữ số lẻ của số nguyên dương n. 30. Hãy đếm tính tổng các chữ số lẻ của số nguyên dương n. 31. Hãy đếm tính tích các chữ số lẻ của số nguyên dương n. 32. Hãy đếm số lượng chữ số chẵn của số nguyên dương n. 33. Hãy đếm tính tổng các chữ số chẵn của số nguyên dương n. 34. Hãy đếm tính tích các chữ số chẵn của số nguyên dương n. 35. Có 3 cột đánh số 1, 2 và 3. Đầu tiên cột 1 có n đĩa được xếp sao cho đĩa lớn nằm bên dưới và hai cột còn lại không chứa đĩa nào. Yêu cầu: Chuyển tất cả các đĩa từ

Tổ tin học Cơ sở

107

43. mỗi lần chỉ chuyển một đĩa và phải tuân thủ nguyên tắc đĩa lớn hơn nằm bên dưới. Viết hàm đệ qui kiểm tra mảng có thoả tính chất “toàn giá trị dương”. Viết hàm đệ qui tính tổng các giá trị lớn hơn giá trị đứng trước có trong mảng. Viết hàm đệ qui đếm số lượng các giá trị nguyên dương có trong mảng. Cho mảng 1 chiều có n số thực. 51. 48. a2. 46. Cho mảng 1 chiều có n số thực. Một hoán vị của tập hợp A là một dãy a1. …. 49. Hãy di chuyển quân mã trên khắp bàn cờ sao cho mỗi ô đi qua đúng 1 lần. 36. Viết hàm đệ qui sắp xếp các giá trị lẻ của mảng theo thứ tự giảm dần còn các giá trị chẵn vẫn giữ nguyên vị trí của nó. Viết hàm đệ qui xuất mảng ngược. Viết hàm đệ qui tìm vị trí của giá trị lớn nhất có trong mảng. Viết hàm đệ qui tính tổng các giá trị chẵn có trong mảng. Viết hàm đệ qui tính tổng các giá trị âm có trong mảng. 50. 2. Cho mảng 1 chiều có n số nguyên. Viết hàm đệ qui tính tổng các giá trị dương có trong mảng. Cho mảng 1 chiều có n số thực. 41. 37. Viết hàm đệ qui tìm giá trị lớn nhất có trong mảng. 38. 44. 54. 3. được phép sử dụng cột 2 làm trung gian. Cho mảng 1 chiều có n số thực. Viết hàm đệ qui xuất mảng. 52. 45. Viết hàm đệ qui sắp xếp các giá trị của mảng theo thứ tự giảm dần. Viết hàm đệ qui sắp xếp các giá trị chẵn của mảng theo thứ tự tăng dần còn các giá trị lẻ vẫn giữ nguyên vị trí của nó. Viết hàm đệ qui đếm số lượng các giá trị phân biệt có trong mảng. Viết hàm đệ qui sắp xếp các giá trị của mảng theo thứ tự tăng dần. Cho mảng 1 chiều có n số thực. Cho mảng 1 chiều có n số thực. 47. n. Cho tập hợp A có n phần tử được đánh số từ 1. Cho mảng 1 chiều có n số thực. Hãy viết hàm xuất ra tất cả các hoán vị của A. Trong đó ai∈A và chúng đôi một khác nhau. 42. an. Cho mảng 1 chiều có n số thực. 55. 39. Cho mảng 1 chiều có n số thực. Viết hàm đệ qui tính tổng các giá trị có trong mảng. Hãy sắp 8 quân hậu vào bàn cờ sao cho không có bất kỳ 2 quân hậu nào có thể ăn nhau. Cho mảng 1 chiều có n số nguyên. …. 53. Cho mảng 1 chiều có n số thực.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin cột 1 sang cột 3. (Bài toán mã đi tuần) Cho bàn cờ vua kích thước 8× 8. Viết hàm đệ qui kiểm tra mảng có thoả tính chất “toàn giá trị âm”. 56. Viết hàm đệ qui tính tổng các giá trị lẻ có trong mảng. Cho mảng 1 chiều có n số thực. (Bài toán 8 hậu) Cho bàn cờ vua kích thước 8× 8. 40. Cho mảng 1 chiều có n số nguyên. Cho mảng 1 chiều có n số thực. Cho mảng 1 chiều có n số thực. Tổ tin học Cơ sở 108 . Cho mảng 1 chiều có n số thực. Cho mảng 1 chiều có n số thực.

Định nghĩa kiểu cấu trúc struct <Tên cấu trúc> { <Kiểu> <Trường 1> . Ví dụ: struct products { char name [30].1. products orange.. họ tên.. IX. }danh sách tên biến cấu trúc.1. <Kiểu> <Trường n> . ……. Cú pháp: Ví dụ: Mỗi sinh viên cần được quản lý bởi các thông tin: mã số sinh viên. ngày tháng năm sinh.3. Khái niệm KIỂU CẤU TRÚC (STRUCTURE) IX. Cú pháp: Ví dụ: products apple. mỗi thành phần được gọi là một trường (field) Sự khác biệt giữa kiểu cấu trúc và kiểu mảng là: các phần tử của mảng là cùng kiểu còn các phần tử của kiểu cấu trúc có thể có kiểu khác nhau. …….1 KIỂU CẤU TRÚC Kiểu cấu trúc (coøn goïi kieåu caáu truùc laø kieåu record) là kiểu dữ liệu bao gồm nhiều thành phần có kiểu khác nhau. địa chỉ thường trú.1. float price. IX. }. <Kiểu> <Trường n> .1.2. <Kiểu> <Trường 2> . melon.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin CHƯƠNG IX: IX. giới tính. <Kiểu> <Trường 2> . Khai báo biến cấu trúc struct <Tên cấu trúc> { <Kiểu> <Trường 1> . Tổ tin học Cơ sở 109 . Ta có thể khai báo một struct gồm các thông tin trên. }.

h> #include<string.2. orange và melon. products trở thành một tên kiểu hợp lệ giống các kiểu cơ bản như int.<Tên trường> − Khi sử dụng cách truy xuất này thì các thao tác trên <Biến cấu trúc>. Truy xuất đến từng trường của biến cấu trúc <Biến cấu trúc>. float price. orange và melon trong ví dụ trên.<Tên trường> giống như các thao tác trên các biến của kiểu dữ liệu của <Tên trường> Ví dụ: Viết chương trình cho phép đọc dữ liệu từ bàn phím cho biến mẩu tin SinhVien và in biến mẩu tin đó lên màn hình: #include<iostream. − Sau khi được khai báo.HoTen<<endl. }. /* Hàm in lên màn hình 1 mẩu tin SinhVien*/ void InSV(SinhVien sv) { cout<<"MSSV: “<<sv. } apple.2 CÁC THAO TÁC TRÊN BIẾN KIỂU CẤU TRÚC IX. unsigned int NamSinh . ta cũng có thể làm theo cách sau: struct products { char name [30]. char DiaChi[40]. orange. dùng để khai báo trực tiếp đối tượng có kiểu cấu trúc.1.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin − Chúng ta đã định nghĩa cấu trúc products với hai trường: name và price. mỗi trường có một kiểu khác nhau. − Trường tuỳ chọn <danh sách tên biến cấu trúc> có thể nằm ở cuối của phần khai báo cấu trúc. IX. Ví dụ: Để khai báo các đối tượng apple. Cú pháp: Tổ tin học Cơ sở 110 . char HoTen[40]. cout<<”Ho va ten: “<<sv.h> struct SinhVien { char MSSV[10].h> #include<conio. char hay short. melon. − Chúng ta cũng đã sử dụng tên của kiểu cấu trúc products để khai báo ba đối tượng có kiểu đó : apple.MSSV<<endl.

cout<<"Nam sinh: ". s.DiaChi.2.NamSinh <<endl. unsigned int Nam. cout<<”Dia Chi: “<<sv. cin>>SV. điểm môn hóa. Ví dụ: struct NgayThang { unsigned char Ngay. cout<<"Nhap MSSV: ".NamSinh.2. chúng được phân cách nhau bởi dấu phẩy (. 8. Khởi tạo biến cấu trúc NgaySinh: NgayThang NgaySinh ={29. thì biến cấu trúc là một công cụ rất thuận lợi. IX. cin>>SV. } IX.HoTen. điểm môn toán.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin cout<<“ Nam Sinh:”<<sv. Mảng cấu trúc: Khi cần lưu trữ thông tin của nhiều đối tượng. Ta có thể khai báo một mảng cấu trúc như sau: struct danhsach{ int sbd. float toan. Khởi tạo giá trị cho biến cấu trúc Việc khởi tạo giá trị cho biến cấu trúc được thực hiện trong lúc khai báo biến cấu trúc.MSSV. Để làm công việc trên. Ví dụ: Cần lưu trữ thông tin họ tên. InSV(SV). } danhsach bangdiem[50].hoa. 1986}. } void main() { SinhVien SV.3. điểm môn lý của các thí sinh trong một kỳ thi.ly. }.2.). cout<<"Nhap Ho va ten: ". cin>>SV. Ví dụ: Viết chương trình cho phép nhập và in bảng điểm của thí sinh lên màn hình. cout>>SV. thay vì phải sử dụng 3 mảng một chiều để lưu trữ ta có thể dùng một mảng một chiều kiểu cấu trúc để lưu trữ các thông tin này Khi đó mỗi phần tử của mảng là một biến kiểu cấu trúc.DiaChi. Tổ tin học Cơ sở 111 . unsigned char Thang. char hoten[25]. cout<<"Dia chi: ". getch(). Các trường của cấu trúc được khởi tạo đặt giữa 2 dấu { }.

if(strlen(bangdiem[i]. int i.h> #define N_MOVIES 5 Tổ tin học Cơ sở 112 .toan. cout <<"So bao danh Ho ten Diem toan Diem ly Diem hoa\n". cout <<"Diem hoa ". char hoten[MAXNAME]. cin >> bangdiem[i].hoten. cout <<"NHAP BANG DIEM CUA SINH VIEN\n".getline(bangdiem[i]. void main() { danhsach bangdiem[NUMREC]. }. cin >> bangdiem[i]. cin. } Ví dụ: // array of structures #include <iostream.h> #include <conio.ly. cout <<"Diem ly: ". cout <<"Ho va ten: ".sbd<<setw(20) <<bangdiem[i].hoten<<setw(10) <<bangdiem[i]. float toan. } getch(). cin>> bangdiem[i].ignore(100.NUMREC=3.h> const int MAXNAME=25. for (i=0.Giáo trình Phương pháp lập trình #include <iostream. clrscr().ignore(100.hoa.hoa<<endl.ly<<setw(14) << bangdiem[i].'\n').'\n'). cin. cin >> bangdiem[i]. for (i=0.i<NUMREC.ly.toan<<setw(12) <<bangdiem[i].hoa.sbd.i++) { cout <<"So bao danh: ". Trung tâm Công Nghệ Thông Tin struct danhsach { int sbd.MAXNAME). cout <<" ------BANG DIEM CUA SINH VIEN-----\n". } clrscr().h> #include <iomanip.h> #include <string. cout <<"Diem toan: ".h> #include <stdlib.hoten)>=MAXNAME-1) cin.i++) { cout <<setw(5)<<bangdiem[i].i<NUMREC.

void main () { char buffer [50]. } cout << "\nYou have entered these movies:\n". for (n=0. n<N_MOVIES.title. cout << " (" << movie.50).year << ")\n". films[n].Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin struct movies_t { char title [50]. Tổ tin học Cơ sở 113 .2.getline (films[n]. int year.4. cin.50). } films [N_MOVIES]. n<N_MOVIES.title. n++) printmovie (films[n]). } void printmovie (movies_t movie) { cout << movie. Tham số kiểu cấu trúc: Việc truyền và nhận tham số kiểu cấu trúc cũng tương tự như cách truyền và nhận tham số của các loại dữ liệu vô hướng. n++) { cout << "Enter title: ". } //Kết quả: Enter title: Alien Enter year: 1979 Enter title: Blade Runner Enter year: 1982 Enter title: Matrix Enter year: 1999 Enter title: Rear Window Enter year: 1954 Enter title: Taxi Driver Enter year: 1975 You have entered these movies: Alien (1979) Blade Runner (1982) Matrix (1999) Rear Window (1954) Taxi Driver (1975) IX.year = atoi (buffer). cin. for (n=0. cout << "Enter year: ". void printmovie (movies_t movie).getline (buffer. int n.

cout <<" ------BANG DIEM CUA SINH VIEN-----\n".ignore(100.sbd. clrscr(). − Dùng con trỏ.hoa.NUMREC=3. cout <<"Ho va ten: ". clrscr().hoten)>=MAXNAME-1) cin. cout <<"Diem ly: ".h> const int MAXNAME=25.i<NUMREC. Trung tâm Công Nghệ Thông Tin Ví dụ: Viết chương trình cho phép nhập và in bảng điểm của thí sinh lên màn hình. cin.MAXNAME).Giáo trình Phương pháp lập trình Có ba hình thức truyền nhận tham số: − Tham trị − Tham chiếu. cin. char hoten[MAXNAME]. }.'\n'). getch().i++) output(bangdiem[i]). cin>> bd. cout <<"NHAP BANG DIEM CUA SINH VIEN\n". for (i=0.ly. struct danhsach { int sbd. float toan. cout <<"So bdanh Ho ten Diem toan Diem ly Diem hoa\n". cin >> bd.ignore(100.hoa. void output(danhsach).toan.i<NUMREC. cout <<"Diem toan: ".h> #include <conio. if (strlen(bd. void input(danhsach&).hoten. cin >> bd.getline(bd.h> #include <iomanip.h> #include <string. Trong đó hàm input sử dụng tham chiếu kiểu danhsach còn hàm output thì dùng tham trị kiểu danhsach #include <iostream. } void input(danhsach& bd) { cout <<"So bao danh: ". int i.ly. cout <<"Diem hoa ". cin >> bd. } void output(danhsach bd) { Tổ tin học Cơ sở 114 .i++) input(bangdiem[i]). for (i=0. void main() { danhsach bangdiem[NUMREC].'\n'). bằng cách xây dựng hai hàm input và output để nhập và in bảng điểm của sinh viên.

3 UNION: Union là một loại dữ liệu có đặc điểm sử dụng cùng một vùng nhớ cho nhiều biến.sbd<<setw(20)<<bd. Các biến có thể khác loại dữ liệu. //lời gọi hàm trong main void input(danhsach *bd) //nội dung hàm input { cout <<"So bao danh: ".hoten.toan.. cin >> (*bd). cout <<"Diem toan: ".ly.ly<<setw(14)<<bd. void input(danhsach *). sbd. //biến val có kiểu union union datetime //datetime là một kiểu dữ liệu union { long int days. ……. //dòng nguyên mẫu for (i=0.ignore(100. } IX. Ví dụ: union { char key. cout <<"Diem hoa ".MAXNAME).toan<<setw(12)<<bd. <Kiểu> <Trường 2> .hoa<<endl. cin >> (*bd). double price. <Kiểu> <Trường n> . } tên biến. Tuy nhiên tại một thời điểm chỉ sử dụng được một trong những biến dùng chung vùng nhớ này. cout <<"Diem ly: ". Loại này được sử dụng cho các biến ít dùng trong chương trình và các biến này không sử dụng cùng lúc với nhau nhằm tiết kiệm bộ nhớ. cout <<"Ho va ten: ".ignore(100. int num.'\n'). Ta có thể xem một unoin như một cấu trúc nhưng các trường của nó có chung vùng nhớ. //luu y (*bd). } val.hoa. if (strlen((*bd).hoten)>=MAXNAME-1) cin. cin. cin>> (*bd).i<NUMREC. cin >> (*bd).hoten<<setw(10) <<bd. Cú pháp union { <Kiểu> <Trường 1> .sbd cin.'\n'). Tổ tin học Cơ sở 115 .getline((*bd).Giáo trình Phương pháp lập trình cout } /*Thủ tục input khi sử dụng con trỏ:*/ Trung tâm Công Nghệ Thông Tin <<setw(5)<<bd.i++) input(&bangdiem[i]).

bankinh*dg.rong).} cn. }. cin >>dg. case 'R': cout <<"Cho biet ban kinh: ".bankinh*3. clrscr(). Khi chương trình thực hiện người sử dụng sẽ cho biết loại hình muốn tính diện tích. hình tròn. Hãy xét ví dụ sau: Ví dụ Viết chương trình có thể tính diện tích của hình chữ nhật. datetime first. cout <<"Cho biet loai hinh muon tinh dien tich(c(chu nhat)/t(thang)/r(tron)".th.bankinh. struct { float dai.cao. cout <<"Dien tich la: "<<(dg.dai.cao. break.h> union dagiac { char loai. switch (toupper(dg.14). cout <<"Cho biet chieu rong: ".h> #include <conio.th.th.dai*dg. hình thang. cin >>dg.daylon+dg.tr.th.cao/2).} th. } tr.tr.second. } getch(). Trung tâm Công Nghệ Thông Tin }. cout <<"Dien tich la: "<<(dg. #include <iostream. cout <<"Dien tich la: " <<((dg.loai.h> #include <ctype.daylon.th. cin >>dg. struct {float daylon.loai)) { case 'C': cout <<"Cho biet chieu dai: ".daynho. break.cn. second là hai biến kiểu datetime Ta cũng có thể định nghĩa kiểu dữ liệu union và struct lồng vào nhau.cn. struct {float bankinh. void main() { dagiac dg.daynho)*dg. break. cout <<"Cho biet chieu cao: ".cn. cin >>dg.th.Giáo trình Phương pháp lập trình double time. case 'T': cout <<"Cho biet day lon: ". // first.daynho.tr. cout <<"Cho biet day nho: ". default: cout <<"Du lieu khong chin xac".rong.cin >>dg.cin >>dg. } Tổ tin học Cơ sở 116 .cin >>dg.rong.cn.

(b) Nhập vào thông tin của n nhân viên và n được nhập từ bàn phím. CBQL: có giá trị 1 nếu nhân viên này là cán bộ quản lý. Địachỉ: kiểu chuỗi. Nhập thêm thông tin của một nhân viên và nhập một số nguyên k. 3 Cho cấu trúc NHANVIEN như sau: MaNV: kiểu số nguyên có giá trị trong khoảng 0…65535 Họtên: kiểu chuỗi. CBQL: có giá trị 1 nếu nhân viên này là cán bộ quản lý. Viết chương trình thực hiện: (a) Nhập vào thông tin của một nhân viên. CBQL: có giá trị 1 nếu nhân viên này là cán bộ quản lý. Cho cấu trúc NHANVIEN như sau: MaNV: kiểu số nguyên có giá trị trong khoảng 0…65535 Họtên: kiểu chuỗi. Tổ tin học Cơ sở 117 . Cho cấu trúc NHANVIEN như sau: MaNV: kiểu số nguyên có giá trị trong khoảng 0…65535 Họtên: kiểu chuỗi.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin BÀI TẬP 1. Địachỉ: kiểu chuỗi. Thực hiện việc chèn nhân viên mới vào danh sách tại vị trí k. Xóa các nhân viên không là cán bộ quản lý ra khỏi danh sách. 2. (b) Nhập vào thông tin của n nhân viên và n được nhập từ bàn phím. Viết chương trình thực hiện: (a) Nhập vào thông tin của một nhân viên. (b) Nhập vào thông tin của n nhân viên và n được nhập từ bàn phím. Địachỉ: kiểu chuỗi. Viết chương trình thực hiện: (a) Nhập vào thông tin của một nhân viên. In ra họ tên của các nhân viên là cán bộ quản lý.

Chạy từng bước 1 chương trình là thi hành từng dòng lệnh của chương trình.Sử dụng phím tắt này khi cần chạy chương trình từng bước để phát hiện lỗi chi tiết bên trong 1 hàm.Điểm dừng vô điều kiện: Chương trình sẽ dừng khi gặp lệnh có điểm dừng này mà không kiểm tra một điều kiện gì.Điểm dừng có điều kiện Chương trình sẽ dừng lại khi gặp lệnh có điểm dừng mà điều kiện đi kèm với điểm dừng đó được thỏa. .Chạy từng dòng lệnh và thực hiện lời gọi hàm mà không đi vào bên trong hàm đó_ Phím tắt F8. . ta di chuyển con trỏ soạn thảo đến nơi "nghi ngờ" có lỗi và nhấn F4. chương trình sẽ được thực hiện cho đến dòng lệnh có con trỏ soạn thảo. Sau đó ta tiếp tục sử dụng phím F7/F8 để debug. . Tổ tin học Cơ sở 118 .Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin PHỤ LỤC I. CHẠY CHƯƠNG TRÌNH TỪNG BƯỚC. CHẠY CHƯƠNG TRÌNH ĐẾN VỊ TRÍ CON TRỎ _ SỬ DỤNG PHÍM TẮT F4 Khi cần thi hành một đoạn lệnh mà không cần phải nhấn phím (F7/F8) để chạy từng lệnh ta sử dụng chức năng chạy chương trình đế khi gặp dòng lệnh nơi con trỏ soạnn thảo đang đứng. Để tạo điểm dừng loại này ta di chuyển con trỏ đến dòng lệnh cần dừng rồi nhấn tổ hợp phím Ctrl+F8. Khi biết chắc 1 đoạn lệnh không có lỗi. mà không đi vào chi tiết từng lệnh trong hàm. có 2 cách: Cách1: Tạo điểm dừng vô điều kiện rồi điều chỉnh nó trong menu Debug/Breakpoint -> danh sách các điểm dừng. Khi dòng lệnh là 1 lời gọi đến 1 hàm thì vệt sáng sẽ dời đến dòng lệnh kế tiếp theo lời gọi hàm đó.Chạy từng dòng lệnh và đi vào bên trong hàm _ Phím tắt F7 . Để tạo điểm dừng loại này. . II. III. Ví dụ: Tại dòng lệnh sau ta đặt điểm dừng với Condition là i = 4.Sử dụng phím này khi cần chạy từng bước mà không cần chạy chi tiết bên trong 1 hàm vì biết chắc chắn hàm đó không có lỗi. ĐIỂM DỪNG_PHÍM TẮT CTRL+F8 Điểm dừng là nơi chương trình sẽ dừng lại khi thỏa mãn điều kiện đi kèm với điểm dừng đó. Có 2 cách chạy chương trình từng bước: . . hiệu chỉnh xong nhấn Modify. Có 2 loại điểm dừng: . Pass Count = 2: ……………………………. .Mỗi lần nhấn F7 sẽ thực hiện lệnh tại dòng có vệt sáng và di chuyển vệt sáng đến dòng kế tiếp. Khi dòng lệnh là 1 lời gọi đến 1 hàm thì vệt sáng sẽ dời đến dòng lệnh đầu tiên trong hàm đó. Trong khi tạo điểm dừng có một tham số Pass Count cho phép chỉ định số lần bỏ qua không dừng khi gặp đúng điều kiện đó. rồi tạo xong nhấn New. Cách 2: Vào thẳng menu Debug/Breakpoint/Edit. chọn điểm dừng cần hiệu chỉnh rồi nhấn Edit.Mỗi lần nhấn F8 sẽ thực hiện lệnh tại dòng có vệt sáng và di chuyển vệt sáng đến dòng kế tiếp. Một vệt sáng màu đỏ sẽ xuất hiện báo cho biết đây là 1 điểm dừng.

Nếu cần theo dõi biến. Nếu cần theo dõi biểu thức. n là số chữ số sau dấu thập phân (không bắt buộc phải có) H/X: số nguyên dạng thập lục.. lần thứ 2 vẫn không dừng và chỉ dừng lại ở lần thứ 3. XEM GIÁ TRỊ CỦA BIẾN/BIỂU THỨC TRONG KHI CHẠY CHƯƠNG TRÌNH _ PHÍM CTRL+F7 Trong quá trình chạy từng bước 1 chương trình sử dụng các phím: F 7/F8/F4/Điểm dừng. nhập biến/biểu thức có trong cửa sổ bằng phím Enter/Delete. F(n): số thực. khi đó. }sv[100]. Nghĩa là i=4 đã xãy ra 3 lần. nếu điều kiện i=4 thỏa mãn. chương trình vẫn không dừng. Repeat: số lần lặp – áp dụng cho dữ liệu dạng mảng. Chương trình dừng tại câu lệnh này khi giá trị i = 4 đã xãy ra 2 lần …………………………….để chọn biểu thức hoặc tự thay đổi biểu thức rồi nhấn Enter.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin I = (10*k)%5. P : hiện dạng con trỏ far segment:offset R : hiện các thành phần của một struct. int MSSV. a[20]. Sử dụng điểm dừng khi cần "bắt" chương trình dừng tại đầu đoạn code "nghi ngờ" có lỗi để debug. Cách 2: Đứng trong cửa sổ Watch nhấn Insert để thêm 1 biến/biểu thức. M: hiện giá trị trong bộ nhớ từng byte một. trong cửa sổ Watch nhập vào: Tổ tin học Cơ sở 119 . Ghi chú: Để bỏ điểm dừng. union. Format characters: định dạng các dạng sau đây: C: ký tự D : số nguyên. ta có thể đặt các biến/ biểu thức vào cửa sổ Watch để tiện theo dõi giá trị của chúng.[repeat]<<format characters>> Trong đó: Expression: có thể là biến hoặc biểu thức. Có hai cách để thêm một biến/biểu thức vào cửa sổ Watch: Cách 1: Di chuyển con trỏ soạn thảo đến biến/biểu thức và nhấn Ctrl+F7.31) dạng ‘\n’ Ví dụ: Có các khai báo như sau: int k. S : hiện ký tự điều khiển (mã ASCII 0. struct SV { char HoTen[40]. Định dạng cho biến/biểu thức: Công thức: Expression. nhấn nhiều lần phím -> và <. Khi chương trình chạy qua dòng lệnh này đầu tiên. nhấn Enter. di chuyển con trỏ soạn thảo đến dòng có vệt đỏ và nhấn Ctrl+F8 IV.

Muốn định dạng kết quả xuất hiện của biến/biểu thức thì xem phần định dạng trong mục 4.10h: hiện giá trị 10 phần tử đầu tiên của mảng ở dạng Hexa. Trong cửa sổ này các lời gọi hàm được hiển thị theo dạng ngăn xếp. số phần tử. các đối tượng trong lập trình hướng đối tượng. hoặc tính toán giá trị một biểu thức trong lúc viết chương trình. XEM GIÁ TRỊ CỦA BIẾN/BIỂU THỨC – THAY ĐỔI GIÁ TRỊ CỦA BIẾN TRONG KHI CHẠY (PHÍM TẮT CTRL+F4. Nếu cần theo dõi biểu thức. thậm chí thay đổi giá trị biến một cách thủ công trong lúc chạy từng bước một chương trình ta sử dụng của sổ Evaluate and Modify thông qua phím tắt Ctrl+F4. Dùng các phím di chuyển như Tab. nhấn Enter. THEO VẾT MỘT BIẾN/LỚP – PHÍM TẮT ALT+F4(CHỈ CÓ TRONG BORLAND C++3. hàm gọi lâu nhất sẽ ở dưới cùng.->. các tham số truyền vào cho hàm cũng được hiển thị ở đây. sv[1]. Cách 2: Nhấn Ctrl+F4 ở đâu cũng được. cây…). Có 2 cách để nhập biến/biểu thức vào cửa sổ Evaluate and Modify: Cách 1: Di chuyển con trỏ soạn thảo đến biến/biểu thức và nhấn Ctrl+F4.<.1) Trong môi trường BC++3.r: hiện tên và giá trị tương ứng của từng thành phần trong struct SV của sv[1]. Nhấn Alt+I để giới hạn khoảng cần xem (thường áp dụng với mảng. VIII. các chương trình có đệ quy. Nếu chấp nhận biến/lớp đó. hàm hiện hành sẽ ở trên cùng. nhất là các chương trình có nhiều lời gọi hàm lồng nhau.để chọn biểu thức.để chọn đối tượng trong cửa sổ. VI. để biết chương trình đang chạy trong hàm nào ta nhấn Ctrl+F3 để vào cửa sổ Call Stack. Trong cửa sổ Inspect.1 có một công cụ rất tốt để debug khi viết các chương trình có sử dụng con trỏ (danh sách liên kết. con trỏ): vị trí bắt đầu. nhấn Enter. V. ta sẽ có toàn bộ thông tin về biến/lớp. nhấn nhiều lần phím -> và <. NGẮT QUÁ TRÌNH CHẠY TỪNG BƯỚC_PHÍM TẮT CTRL+F2 Ta nhấn tổ hợp phím này trong lúc chạy từng bước 1 chương trình để ngắt debug và trở về trạng thái soạn thảo (vệt sáng biến mất) CÁC PHÍM TẮT TIỆN DỤNG: Tổ tin học Cơ sở 120 . VII. rồi nhập biến/biểu thức vào. và nhấn Enter để "Inspect" đối tượng đó nếu dòng trạng thái cuối màn hình có: Inspect. NGĂN XẾP CÁC LỜI GỌI HÀM CALL STACK_PHÍM TẮT CTRL+F3 Trong lúc chạy từng bước một chương trình. Cách 2: nhấn Alt+F4 ở đâu cũng được. Có 2 cách để sử dụng chức năng này (chú ý chỉ dùng trong khi đang chạy từng bước một chương trình): Cách 1: Di chuyển con trỏ soạn thảo đến biến nhấn Alt+F4. Nếu chấp nhận biến đó. rồi nhập tên biến/lớp vào.) Nếu cần xem giá trị của một biến/biểu thức trong khi chạy từng bước một chương trình. có thể thay đổi giá trị như ở cửa sổ Evaluate and Modify bằng cách nhấn Alt+M.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin a.

() Selected text: tìm trong khối văn bản đánh dấu. [] Whole words only: tìm đoạn text đứng độc lập.Đến thông báo lỗi trước đó hoặc kế tiếp. Phím Alt+F7/ Alt+F8 Sau khi dịch có lỗi. nhưng sai -> thiếu dấu ngoặc tương ứng. Trong danh sách này có cả các file đã đóng. Khi chương trình bị lặp không lối thoát. () Global: tìm toàn bộ văn bản. thêm bớt. Di chuyển con trỏ soạn thảo đến một trong các loại dấu ngoặc trên rồi nhấn một trong 2 tổ hợp phím. Để tìm và thay thế ta nhấn Ctrl+Q+A. () From cursor: tìm từ vị trí con trỏ soạn thảo. Ta chỉ cần nhấn Alt+Backspace liên tục cho đến khi đoạn code cần tìm hiện ra. nếu con trỏ soạn thảo: Không di chuyển -> thiếu dấu ngoặc tương ứng hoặc thừa dấu tại vị trí con trỏ đang đứng. () Entire scope: tìm từ đầu đến cuối. . .Kiểm tra đã đủ dấu: {. Lưu ý nếu gặp các lỗi phát sinh do ảnh hưởng lẫn nhau thì nên dịch lại để nhận thông báo lỗi mới. rồi nhấn Enter 2 lần. chỉ định thông số: [] Prompt on replace: nhắc thay thế mỗi khi tìm thấy. Nếu cần làm lại thao tác đã thực hiện trước khi nhấn Alt+ Backspace ta nhấn Alt+Shift+ Backspace. Chú ý.(. Nếu muốn hiện cửa sổ này trong môi trường soạn thảo nhấn Alt+W rồi nhấn O. hay gây ra thông báo lỗi đĩa mềm -> vào đây xoá những cửa sổ đó đi. Sau đó chọn thêm một số thông số: [] Case – sensitive : có phân biệt chữ hoa/ chữ thường. .}. Xem xong nhấn Enter để trở về màn hình soạn thảo. () Forward : tìm xuôi. Phím Ctrl+Break. Di chuyển đến một dấu ngoặc. thường có những file được mở từ ổ A: mà không đóng.) hay chưa: Phím Ctrl+Q+] hoặc Ctrl+Q+[ Đây là phím rất tiện dụng để phát hiện các lỗi thiếu các dấu ngoặc tương ứng. Tất cả các cửa sổ sẽ được hiện lên màn hình. hoặc bị treo ta nhấn Ctrl+Break sau đó nhấn Enter 2 lần để trở về màn hình soạn thảo. thậm chí xóa đi. . .Undo thao tác trước hoặc làm lại thao tác trước khi undo_Phím Alt+Backspace/Alt+Shift+ Backspace Chức năng này rất quan trọng. thêm vào đoạn text sẽ thay thế đoạn text tìm thấy. Nhấn phím này để xem kết quả xuất ra ở màn hình DOS.1 trở đi. nhập các thông tin như phần trên.Ngắt chương trình bị lặp/treo.Xem cửa sổ kết quả_Phím Alt+F5. ta nhấn Ctrl+Q+F (thao tác nhập tương tự cửa sổ Evaluate and Modify).Tìm kiếm/Tìm kiếm và thay thế/Lặp lại thao tác tìm kiếm trước đó: Phím Ctrl+Q+F/ Ctrl+Q+A/ Ctrl+L Để tìm một đoạn text trong chương trình. Lưu ý: chức năng này chỉ có trong BC++3. () Backward: tìm ngược. Phím Alt+W.Danh sách các cửa sổ: Phím Alt+0 Hiện danh sách các cửa sổ đang mở để chọn cửa sổ làm việc (active). ]. Để tìm và thay thế tất cả chọn Change All thay vì chọn OK. . Để lặp lại thao tác Tìm/Tìm thay thế lần cuối cùng ta nhấn Ctrl+L. rồi nhấn T.Sắp xếp hiện hết các cửa sổ. Tổ tin học Cơ sở 121 . . ta dùng 2 phím này để duyệt qua từng lỗi mà không cần dịch lại. giúp ta lấy lại những đoạn code trước đó mà do vô tình hay cố ý đã thay đổi.[.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin .

Để chọn cửa sổ thứ 5 ta nhấn Alt+5. khối văn bản sẽ bị xóa luôn khỏi màn hình. Các cửa sổ không active sẽ được vẽ bằng nét đơn _____. Nếu nhấn Shift+phím dịch chuyển thì sẽ có dãn cửa sổ. Sao chép: sau khi đánh dấu nhấn Ctrl+Insert để chép khối văn bản vào ClipBoard của BC. Ở một thời điểm chỉ có một cửa sổ gọi là cửa sổ làm việc (active) – đó là cửa sổ có đường biên là nét đôi ===.Đánh dấu/sao chép/cắt/dán khối. Phím Alt+n(n=1…9) Mỗi cửa sổ đều được đánh một con số ở góc trên bên phải (tất nhiên ngoại trừ các cửa sổ được mở lần thứ 10 trở lên vì chỉ có 9 con số). xong thì nhấn Enter để trở lại chế độ soạn thảo. Tổ tin học Cơ sở 122 .Chọn cửa sổ làm việc. Phím Ctrl+F5 Để di chuyển cửa sổ làm việc ta nhấn Ctrl+F5. PgDn (Có thể kết hợp với Ctrl) để xác định khối văn bản. End. Dán: nhấn Shift+Insert để chép khối văn bản trong ClipBoard vào cửa sổ văn bản tại dấu nháy. . PgUp. Đánh dấu khối: nhấn giữ Shift. Home. dùng các phím dịch chuyển để di chuyển cửa sổ.Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin . <-. . dùng các phím dịch chuyển: ->. Phím Shift + Dịch chuyển/Ctrl+Insert/Shift + Delete/Shift+Insert. Cắt: sau khi đánh dấu khối nhấn Shift + Delete để cắt khối văn bản vào ClipBoard của BC.Di chuyển và thay đổi kích thước cửa sổ.

. . x 86 87 88 89 90 91 92 93 94 95 96 97 98 99 12 6 12 7 13 0 13 1 13 2 13 3 13 4 13 5 13 6 13 7 14 0 14 1 14 2 14 3 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 Char V W X Y Z [ \ ] ^ _ ` a b c d 100 14 4 Tổ tin học Cơ sở 123 . x 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 53 54 55 56 57 60 61 62 63 64 65 66 67 70 71 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 Cha r + .Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin BẢNG MÃ ASCII Dec Oct He . . x 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 0 1 2 3 4 5 6 7 8 9 a b c d e Cha r NUL SOH STX ETX EOT ENQ ACK BEL BS TAB LF VT FF CR SO Dec Oct He . . / 0 1 2 3 4 5 6 7 8 9 Dec Oct He .

Giáo trình Phương pháp lập trình 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 17 20 21 22 23 24 25 26 27 30 31 32 33 34 35 36 37 f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 72 73 74 75 76 77 10 0 10 1 10 2 10 3 10 4 10 5 10 6 10 7 11 0 11 1 11 3a 3b 3c 3d 3a 3f 40 41 42 43 44 45 46 47 48 49 4a : . < = > ? Trung tâm Công Nghệ Thông Tin 101 14 5 102 14 6 103 14 7 104 15 0 105 15 1 106 15 2 107 15 3 108 15 4 109 15 5 110 15 6 111 15 7 112 16 0 113 16 1 114 16 2 115 16 3 116 16 4 117 16 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 e f g h i j k l m n o p q r s t u @ A B C D E F G H I J Tổ tin học Cơ sở 124 .

Giáo trình Phương pháp lập trình 2 32 33 34 35 36 37 38 39 40 41 42 40 41 42 43 44 45 46 47 50 51 52 20 21 22 23 24 25 26 27 28 29 2a SP ! " # $ % & ‘ ( ) * 75 76 77 78 79 80 81 82 83 84 85 11 3 11 4 11 5 11 6 11 7 12 0 12 1 12 2 12 3 12 4 12 5 4b 4c 4d 4e 4f 50 51 52 53 54 55 K L Trung tâm Công Nghệ Thông Tin 5 118 16 6 119 16 7 120 17 0 121 17 1 122 17 2 123 17 3 124 17 4 125 17 5 126 17 6 127 17 7 76 77 78 79 7a 7b 7c 7d 7e 7f v w x y z { | } ~ DEL M N O P Q R S T U Tổ tin học Cơ sở 125 .

...................6 I.......2...1 I....................Toán tử BITWISE (Bit operator).......................................Khai báo các hằng (const)...............................9 I.......................3 I............................Nhập dữ liệu (cin)....................................2......Tóan tử tăng và giảm (increase/descrease operator).....Cấu trúc một chương trình C++..........Các kiểu dữ liệu..4 I..................................1..............20 II...................................................................................................................17 II...........2...........................29 III...................4...4..............2.....9 I.......2.................................................................................3.......3CẤU TRÚC LỰA CHỌN (switch):.......17 II.........Định dạng kết quả xuất:.........3 I.............................11 I.1 I..9............36 III......1..........3.......................2...18 II................Các toán tử số học (number operator).............Toán tử con trỏ & và * (pointer operator)..................................19 II.......3.....................................1GIỚI THIỆU...............................................2.......................................18 II.........4..8..Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin MỤC LỤC CHƯƠNG I:TỔNG QUAN VỀ NGÔN NGỮ C++..32 III...................................................Các chú thích............2..................................................Toán tử lấy kích thước (size operator)........................17 II.......1GIỚI THIỆU......................................2..............................................7 I.......................................................................................................................................................................................................5..............Lập trình...Toán tử gán (assignment operator):...........................................6 I..2 I...5............3 I..............14 I.......Tiền xử lý và biên dịch..................Identifiers (Định danh)....19 II.......1...............20 II.................3CHUYỂN ĐỔI KIỂU DỮ LIỆU:...............2.............................6..............................................4CẤU TRÚC LẶP (reiterate structure)............................................................7......1.................1...............................................2....................12 I................................23 CHƯƠNG III:CẤU TRÚC ĐIỀU KHIỂN....2.......3...............................2..............Khởi tạo các biến.........38 Tổ tin học Cơ sở 126 .........................................2.......Phạm vi hoạt động của các biến..................1.......................................Các hằng số (Constants): .2TOÁN TỬ............Một chương trình C++ đơn giản..............5......3Các lệnh xuất nhập chuẩn....Lệnh xuất (cout)................2.................................................2..........9..........................17 II.................2...........2......................20 II..................................Vòng lặp while..................4ĐỘ ƯU TIÊN CỦA CÁC TOÁN TỬ:...4.4...6...............2..........................................................36 III...................Keyword (Từ khóa) .Các toán tử gán phức hợp (complex operator)....2.....................1 I..............................................4Cấu trúc của một chương trình C++.........................Lệnh xuất trong ngôn ngữ C: hàm printf (đọc thêm)................1...........1CÁC KHÁI NIỆM CƠ BẢN..2.......................................29 III.............14 I..2CẤU TRÚC RẼ NHÁNH .......Khai báo biến....................Toán tử điều kiện (condition operator):.....13 I..............................4......2...................................2...........4.........................Định nghĩa các hằng (#define)........14 I...........................................................................10 I.....5 I.......10 I.............Lệnh nhập trong ngôn ngữ C: hàm scanf (đọc thêm) .......................3......12 I.3..22 II................................................1........16 CHƯƠNG II:BIỂU THỨC...................................................................................3...3..............7.....................................4...3.....................21 II.....................................................2BIẾN – KIỂU DỮ LIỆU – HẰNG ......1.........................................................Toán tử quan hệ (relation operator):................................1 I........................................................29 III............................................................3.............................2...............................................................................................................22 II............Vòng lặp do… while.........Toán tử logic (logic operator):.............................................................10...................8...................................................2.......Các tập tin thư viện thông dụng.....................

...............................................................................3.....Khai báo mảng..........................................................63 V.......................................................96 VII....76 VI.5....................................97 Tổ tin học Cơ sở 127 .................63 V............................................92 VII......3.................63 V...................63 V..94 VII.......78 VI.............2.......92 VII...............................................................................................................Lệnh break........................2XÂY DỰNG HÀM....................................................1KHÁI NIỆM .....................................2...........Định nghĩa hàm...................................5........................2..............76 VI...................Một số phép toán trên con trỏ ..............71 CHƯƠNG VI:KIỂU CON TRỎ .....2..........................................1........................................................Lệnh return..................1..93 VII.68 V.................Khai báo theo con trỏ ..2........2.................................5............................................2Khai báo và sử dụng biến con trỏ..................................................Khai báo biến con trỏ ..................1............................................41 III..................................................3.......................................................3.....................................................................5CÁC LỆNH RẼ NHÁNH VÀ LỆNH NHẢY.....................................Lệnh continue................................................................2............................92 VII......................................................................Truy xuất từng ký tự trong chuỗi: ...................59 CHƯƠNG V:MẢNG....................56 IV...Con trỏ và mảng........................Khai báo theo mảng ................................Các phương pháp tìm kiếm và sắp xếp trên mảng:..Lệnh goto....Vừa khai báo vừa gán giá trị .......................92 VII........................................2........Hàm toán học:.......2.....................................................76 VI...........81 VI.........3....Nguyên tắc hoạt động của hàm...................................................................43 III.........1................Truyền địa chỉ cho tham số bởi con trỏ:.Toán tử delete............................................................85 VI....................................Toán tử new .........4CON TRỎ VÀ CÁC HÀM TRÊN CHUỖI:.......3Bộ nhớ động......................4.51 IV.............Lớp lưu trữ các biến.2...............................................Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin III....................................3...... Các thao tác trên con trỏ ....................2Mảng 1 chiều.........92 VII....................2.........................................2................5..................92 VII..................3.......................3........................1Mảng (Array)..53 IV.................................................3Mảng nhiều chiều.87 CHƯƠNG VII:CHUỖI KÝ TỰ ......................................................................86 VI.........3................................3...93 VII.....................................................................Các hàm thao tác trên chuỗi:..........Sử dụng hàm...............................................................1................................................................................6...............................1......51 IV...96 VII..................................2...............2....4.................3....................................3CÁC THAO TÁC TRÊN CHUỖI KÝ TỰ .....Con trỏ và chuỗi....2...................................................69 V.....................................................................................................................................54 IV........................................................................2.............Khai báo mảng 2 chiều như một tham số:.......1...2.................2....52 IV..2.....3...............1KHÁI NIỆM VỀ HÀM TRONG C++...........................................................................................................44 CHƯƠNG IV:CHƯƠNG TRÌNH CON...1...........3......Truy xuất từng phần tử của mảng..........2.............84 VI............51 IV......Khai báo.Truyền tham số cho hàm......40 III.........................2KHAI BÁO .............2....4.........Vòng lặp for:...........................65 V................................4...1.........................67 V...........76 VI.....................................................................................67 V....................1..................41 III...................................................................54 IV.....5.......4...............1....................5..Phạm vi của biến (scope variables)......................................................Truy xuất từng phần tử của mảng 2 chiều ...........................................76 VI...........42 III........................52 IV............................................Nhập xuất .....2.................................................4.................1Giới thiệu dữ liệu kiểu dữ liệu:......4.....3....................2..............2.....................2.......

...110 IX.............103 VIII................2..........Đệ quy nhị phân..........105 VIII.........................Khái niệm........................................4....115 Tổ tin học Cơ sở 128 ..................................................3Đặc điểm cần lưu ý khi viết hàm đệ quy..................2........................110 IX...............Tham số kiểu cấu trúc: ................1.......1................................1.....................109 IX.1................................2CÁC THAO TÁC TRÊN BIẾN KIỂU CẤU TRÚC .....................104 VIII.........................3................1.....................................109 IX...............................................109 IX...........................................2.....................Đệ quy tuyến tính...............Mảng cấu trúc: ........................102 VIII.....4.............2.....2..............................................................2....................Khởi tạo giá trị cho biến cấu trúc ...............................................................................................3.........2.........................................106 CHƯƠNG IX:KIỂU CẤU TRÚC (STRUCTURE).102 VIII........................................................Giáo trình Phương pháp lập trình Trung tâm Công Nghệ Thông Tin CHƯƠNG VIII:ĐỆ QUY.................2.....................................................Định nghĩa kiểu cấu trúc....................................................2Phân loại đệ quy:.........................................Khai báo biến cấu trúc ........104 VIII.2....................1Định nghĩa..................109 IX..Đệ quy hỗ tương.....................109 IX................................111 IX.......1..........................................................1KIỂU CẤU TRÚC........2.....................3........................................................................................................113 IX....................................................3UNION:.............2..102 VIII......................................111 IX.. Truy xuất đến từng trường của biến cấu trúc ...............Đệ quy phi tuyến...

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->