Tài liệu tham khảo

BÀI GIẢNG

 Trần Minh Thái, tập bài giảng KTLT, 2005

 Phạm Văn Ất: “ỹ thuật lập trình C: cơ sở và

LẬP TRÌNH C

nâng cao. NXB KHKT – 1996

 Nguyễn Đình Tê – Hoàng Đức Hải: Giáo trình lý

thuyết & Bài tập ngôn ngữ C. Nhà Xuất Bản Mũi

Cà Mau.

ThS. Nguyễn Thị Thúy Loan

 Huỳnh Tấn Dũng – Hoàng Đức Hải, Bài tập

ngôn ngữ C từ A đến Z, NXB Lao Động – Xã

Hội.

5/3/2013 2 Nguyễn Thị Thúy Loan

Cách đánh giá

Nội dung chương trình

 Lý thuyết: 50%

 Kiến thức cơ bản

 Thực hành: 30%

 Tổng quan về lập trình C.

 Bài tập: 20%

 Biểu thức, toán tử, vào ra dữ liệu.

 Cấu trúc điều kiển và lưu đồ thuật toán.

 Hàm

 Mảng – chuỗi kí tự.

1

5/3/2013 3 5/3/2013 4 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

NỘI DUNG

Chương I:

 Chuyển đổi cơ số

KIẾN THỨC CƠ BẢN

 Kỹ thuật để giải quyết bài toán

 Các bước để viết chương trình.

 Một chương trình đơn giản.

ThS. Nguyễn Thị Thúy Loan

5/3/2013 6 Nguyễn Thị Thúy Loan

Biểu diễn thông tin

Biểu diễn thông tin

 Đơn vị đo thông tin: bit- BInary digiT

 Biểu diễn số trong các hệ đếm:

 Một bit tương ứng với một chỉ thị hoặc một

 Hệ đếm là tập hợp các ký hiệu và qui tắc

thông báo nào đó về sự kiện, có 1 trong 2

sử dụng tập ký hiệu đó. Mỗi hệ đếm có

trạng thái là Tắt (Off) / Mở (On) hay Đúng

một số ký số (digits) hữu hạn. Tổng số ký

(True)/Sai (False).

số của mỗi hệ đếm gọi là cơ số (base hay

radix), ký hiệu là b.

2

5/3/2013 7 5/3/2013 8 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Biểu diễn thông tin

Biểu diễn thông tin

 Hệ đếm cơ số b (b ≥ 2, b là số nguyên

 Số N(b) trong hệ đếm cơ số (b) được biểu

dương) mang tính chất sau:

diễn bởi:

o Có b ký số để thể hiện giá trị số. Ký số nhỏ

o N(b)=anan-1an-2…a1a0a-1a-2…a-m

nhất là 0 và lớn nhất là b-1.

o Giá trị vị trí thứ n của một số trong hệ đếm

bằng cơ số b lũy thừa n: bn

5/3/2013 9 5/3/2013 10 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Biểu diễn thông tin

Biểu diễn thông tin

 Hoặc dưới dạng công thức tổng quát:

o Trong đó, số N(b) có n+1 ký số biểu diễn

n

cho phần nguyên và m ký số lẻ biểu diễn

i

. ba i

cho phần b_phân, và có giá trị là:

b )(

N

mi 

o N(b) = an.bn + an-1.bn-1 + an-2.bn-2 + …+

a1.b1+a0.b0 + a-1.b-1+a-2.b-2+…+a-m.b-m

3

5/3/2013 11 5/3/2013 12 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Biểu diễn thông tin

Hệ đếm thập phân (b = 10)

 Các hệ đếm:

 Hệ đếm thập phân b = 10 là một trong các

o Nhị phân

phát minh của người Ả rập cổ, bao gồm

o Bát phân

10 ký số theo ký hiệu sau: 0, 1, 2, 3, 4,

o Thập phân

5, 6, 7, 8, 9

o Thập lục phân

5/3/2013 13 5/3/2013 14 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Hệ đếm thập phân (b = 10)

Hệ đếm thập phân (b = 10)

 Bất kỳ số nguyên dương trong hệ thập

 Ví dụ:

phân có thể biểu diễn như là một tổng các

 Số 123 được biểu diễn như sau:

số hạng, mỗi số hạng là tích của một số

123 = 1 * 102 + 2 * 101 + 3*100

với 10 lũy thừa, trong đó số mũ lũy thừa

 Số 5246 có thể được biểu diễn như sau:

được tăng thêm 1 đơn vị kể từ số mũ lũy

5246 = 5 * 103 + 2 *102 + 4 * 101 + 6 * 100

thừa phía bên phải nó. Số mũ lũy thừa

= 5 * 1000 + 2 * 100 + 4 * 10 + 6 * 1

của hàng đơn vị trong hệ thập phân là 0.

4

5/3/2013 15 5/3/2013 16 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Hệ đếm thập phân (b = 10)

Hệ đếm nhị phân (b = 2)

 Phần thập phân trong hệ thập phân sau

 Với b = 2, là hệ đếm đơn giản nhất với 2

dấu chấm phân cách thập phân (theo qui

chữ số là 0 và 1. Mỗi chữ số nhị phân gọi

ước của Mỹ) thể hiện trong ký hiệu mở

là BIT.

 Cách chuyển đổi hệ nhị phân sang hệ

rộng bởi 10 lũy thừa âm, tính từ phải sang

thập phân:

trái kể từ dấu chấm phân cách.

 Ví dụ: 254.68 = 2 * 102 + 5 * 101 + 4 * 100

+ 6 * 10-1 + 8 * 10-2

5/3/2013 17 5/3/2013 18 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Hệ đếm nhị phân (b = 2)

Hệ đếm nhị phân (b=2)

11101.11(2)= ? (10)

 Ví dụ: 10101(2) = ? (10)  Số nhị phân :1

1

1

0

1

1

1

1

0

1.

1

1

 Số nhị phân

 Số vị trí :

4

3

2

1

0

4

3

2

1

0

-1

-2

 Số vị trí

 Trị vị trí :

24

23

22

21

20

24

23 22 21 20 2-1 2-2

 Trị vị trí

 Hệ 10 là :

16

8

4

2

1

16

8

4

2

1 0.5 0.25

 Hệ 10 là

10101(2) = 1*24 + 0*23 + 1*22 + 0*21 + 1*20

= 16 + 0 + 4 + 0 + 1 = 21(10)

11101.11(2) = 1*16 + 1*8 + 1*4 + 0*2 + 1*1 + 1*0.5 + 1*0.25 = 29.75 (10)

5

5/3/2013 19 5/3/2013 20 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Hệ đếm bát phân (b = 8)

Hệ đếm bát phân (b = 8)

 1 tập hợp 3 bit biểu diễn 8 trị : 000, 001,

 Tập hợp các chữ số này gọi là hệ bát

010, 011, 100, 101, 110, 111 tương

phân, là hệ đếm với b = 8 = 23. Trong hệ

đương với 8 trị trong hệ thập phân là 0, 1,

bát phân, trị vị trí là lũy thừa của 8.

2, 3, 4, 5, 6, 7.

 Ví dụ: 235(8) = 2*82 + 3*81 + 5*80 = 157(10)

5/3/2013 21 5/3/2013 22 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Hệ đếm thập lục phân(b=16)

Hệ đếm thập lục phân(b=16)

 Ví dụ:

 Hệ đếm thập lục phân là hệ cơ số b =16= 24,

tương đương với tập hợp 4 chữ số nhị phân

34F5C(16) = 3*164 + 4*163 + 15*162 + 5*161 + 12*160 = 216294(10)

(4 bit).

 Hexa-decimal gồm 16 ký tự : từ 0 đến 9, và 6

chữ in A, B, C, D, E, F với A là 10, B là 11,

C là 12, D là 13, E là 14, F là 15. Với hệ thập

lục phân, trị vị trí là lũy thừa của 16.

6

5/3/2013 23 5/3/2013 24 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Bài tập

Bảng qui đổi tương đương 16 chữ số đầu tiên của 4 hệ

 Thực hiện các phép chuyển đổi sau:

 100011011(2)= ? (10)

 277(8) = ?(10)

 19B116 (16) = ?(2)

 0011011111011111(2) = ?(16)

Hệ 16 0 1 2 3 4 5 6 7 8 9 A B C D E F

Hệ 8 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17

Hệ 2 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

Hệ 10 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

5/3/2013 25 5/3/2013 26 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Kỹ thuật để giải quyết bài toán

Kỹ thuật để giải quyết bài toán

 Một chương trình máy tính được thiết kế

 Các bước gồm:

o Xác định yêu cầu của bài toán

để giải quyết một bài toán nào đó. Vì vậy,

o Nghĩ ra 1 thuật toán (algorithm) để tìm

những bước cần để tìm kiếm lời giải cho

lời giải.

một bài toán cũng giống như những bước

o Thực hiện thuật toán đó.

cần để viết một chương trình.

o Kiểm tra kết quả để lời giải đó có theo

yêu cầu của bài không?

7

5/3/2013 27 5/3/2013 28 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Kỹ thuật để giải quyết bài toán

Các bước trong chu trình phát triển chương trình

 Viết 1 chương trình trên C, các bước đề

nghị:

 Soạn thảo 1 văn bản được dùng nhập mã

o Xác định mục đích của chương trình

nguồn (source code)

o Nghĩ ra thuật toán để giải quyết bài toán

 Mã nguồn được biên dịch (compile) để

(dùng mã giả, lưu đồ, ….)

tạo nên tập tin đối tượng (object file)

o Cài đặt (viết) thuật toán dùng ngôn ngữ lập

trình C.

o Thực thi chương trình và kiểm thử (testing)

5/3/2013 29 5/3/2013 30 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các bước trong chu trình phát triển chương trình

Các bước trong chu trình phát triển chương trình

 Các tập tin đối tượng được liên kết (link)

để tạo nên tập tin có thể thực thi được

(executable file).

 Thực hiện (run) chương trình để chỉ ra

chương trình có làm việc giống như kết

quả đã định không?

8

5/3/2013 31 5/3/2013 32 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các bước trong chu trình phát triển chương trình

Các bước trong chu trình phát triển chương trình

 Biên dịch mã nguồn (compile)

 Nhập mã nguồn (source code)

o Chương trình viết bằng ngôn ngữ cấp cao

o Mã nguồn là tập lệnh dùng để chỉ dẫn máy

C/C++ được biên dịch sang mã máy

tính thực hiện công việc do người lập trình

(machine language) bằng một chương trình

đưa ra.

dịch (trình biên dịch -compiler)

o Tập tin mã nguồn có phần mở rộng .cpp

o Mã đối tuợng (object code) và tập tin chứa

(C++)

chúng gọi là tập tin đối tuợng .obj.

5/3/2013 33 5/3/2013 34 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các bước trong chu trình phát triển chương trình

Các bước trong chu trình phát triển chương trình

o Tập tin đối tượng do trình biên dịch tạo ra

 Liên kết các tập tin đối tượng tạo các tập

kết hợp với mã đối tượng để tạo tập tin thực

tin thực thi (executable file).

thi, quá trình này được tạo bởi bộ liên kết

o C có một thư viện chứa mã đối tượng cho

(Linker)

những hàm được tạo sẵn.

Ví dụ: clrscr(), gets(), sqrt(),

9

5/3/2013 35 5/3/2013 36 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các bước trong chu trình phát triển chương trình

Các bước trong chu trình phát triển chương trình

 Thực hiện chương trình (run)

o Quá trình 4 bước sẽ được lập lại cho đến

o Chương trình nguồn được biên dịch và liên

khi tập tin thực thi thực hiện đúng yêu cầu

kết sẽ tạo nên tập tin thực thi và thực thi tại

bài toán.

dấu nhắc hệ thống.

o Nếu chương trình có lỗi phải được chỉnh

sửa và biên dịch lại.

5/3/2013 37 5/3/2013 38 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Chương trình C đơn giản

Chương II:

#include

#include

void main()

TỔNG QUAN VỀ LẬP TRÌNH C

{ clrscr();

printf (“ Hello! ”);

ThS. Nguyễn Thị Thúy Loan

//cout<<“Hello!”;

getch();

}

10

5/3/2013 39 Nguyễn Thị Thúy Loan

Khái niệm cơ bản về lập trình

NỘI DUNG

 Các khái niệm cơ bản.

Lập trình?

 Khảo sát một chương trình C đơn giản.

Ngôn ngữ Lập trình

 Từ khóa, quy tắc đặt tên trong C

 Kiểu dữ liệu, hằng, biến.

Giải thuật

 Các thao tác trên Borland C.

5/3/2013 41 5/3/2013 42 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ngôn ngữ lập trình là gì?

Ngôn ngữ lập trình là gì?

 Phân loại:

 Khái niệm: Ngôn ngữ lập trình là ngôn

o Ngôn ngữ máy: Ngôn ngữ riêng của từng

ngữ dùng để trình bày các thuật toán

máy và là loại ngôn ngữ mà máy tính có

trong máy tính mà máy tính có thể hiểu

thể hiểu được một cách trực tiếp.

được.

11

5/3/2013 43 5/3/2013 44 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ngôn ngữ lập trình là gì?

Ngôn ngữ lập trình là gì?

o Hợp ngữ: Tương tự ngôn ngữ máy, nhưng

o Ngôn ngữ cấp cao: Chương trình thường dễ

hợp ngữ khác với ngôn ngữ máy ở chỗ,

viết hơn so với Ngôn ngữ máy và Hợp ngữ.

thay vì viết chương trình dưới dạng nhị

Mỗi lệnh của ngôn ngữ cấp cao tương

phân, người ta sử dụng một số ký hiệu

đương với một lệnh của thuật toán.

tượng trưng dễ nhớ.

o Ví dụ: C, Pascal, Java, C++, Visual Basic, …

5/3/2013 45 5/3/2013 46 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Các đặc điểm của CT

 Đúng đắn, chính xác (correctness).

#include

 Chắc chắn (robustness).

#include

 Thân thiện (user friendliness).

void main()

 Khả năng

thích nghi

(adapability):

{ clrscr();

Chương trình có khả năng phát triển theo

printf(“Hello!”);//cout<<“Hello!”;

yêu cầu.

getch();

}

12

5/3/2013 47 5/3/2013 48 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các đặc điểm của CT

Tập ký tự dùng trong C Ngôn ngữ C được xây dựng trên bộ ký tự sau:

 Tính tái sử dụng (reuseability): Chương

 Ký tự chữ: 26 chữ cái hoa: A B C .. Z, 26 chữ

trình có thể dùng để làm một phần trong

cái thường: a b c .. z

một chương trình lớn khác.

 Ký tự số: 0 1 2 .. 9

 Tính hiệu quả (efficiency).

 Ký tự gạch chân: _

 Tính khả chuyển (porability): Khả năng

 Các ký tự đặc biệt:

chuyển đổi giữa các môi trường.

o Các ký hiệu toán học: + - * / = ( )

 Tính dừng (halt).

o Các ký tự khác: . , : ; [ ] {} ! \ & % # $ ...

5/3/2013 49 5/3/2013 50 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Cấu trúc của một CT C

Khối khai báo

Khảo sát chương trình C đơn giản

Hàm main()

Các hàm con (nếu có)

13

5/3/2013 51 5/3/2013 52 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Chương trình C đơn giản

 #include là tập tin header

/*Tính tổng hai số*/ // Mô tả mục đích của chương trình #include // khai báo thư viện int Tong(int a, int b); // khai báo prototype void main() // hàm chính của chương trình {

chuẩn của C, chứa các định nghĩa về

nhập và xuất.

 #include là tập tin header

int a,b,t; printf(“nhap a, b”);//cout <<“Nhap a,b”; scanf(“%d%d”,&a,&b);cin>>a,b; t = Tong(a,b); printf(“Tong a +b = %d”, t);//cout<<“Tong a +b”<

chuẩn của C, chứa các thư viện chuẩn.

} int Tong(int a, int b)// Hàm con {

int t =0; t = a+b; return t;

}

5/3/2013 54 Nguyễn Thị Thúy Loan

Chương trình C đơn giản

Chương trình C đơn giản

 Hàm main() là thành phần bắt buộc của

 Chương trình C phải tồn tại một hàm

chương trình.

main()

 Hàm main() là nơi chương trình C bắt đầu

 Nội dung của hàm main() được thực hiện

đầu tiên và đặt trong cặp dấu ngoặc { }.

thực hiện.

 Hàm main() không phụ thuộc vào vị trí

của hàm.

14

5/3/2013 55 5/3/2013 56 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các thư viện thông dụng

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:

 Thư viện stdio.h: chứa các định nghĩa macro và các hàm nhập xuất như printf(), scanf(), gets(), fflush(), fwrite(), scanf()...  Thư viện conio.h: chứa các hàm màn hình như getch(), putch(), clrscr(), gotoxy(), ...

o Chú thích trên 1 dòng: dùng cặp dấu //.

 Thư viện math.h: chứa các hàm tính toán

o Chú thích khối (chú thích trên nhiều

như: sin, cos, sqrt, …

dòng) dùng cặp /* ... */.

5/3/2013 57 5/3/2013 58 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Từ khóa

 Từ khoá là những từ được sử dụng để

khai báo các kiểu dữ liệu, để viết các toán

#include "stdio.h" void main() {

tử và các câu lệnh.

 Không được dùng các từ khóa để đặt tên

cho các hằng, biến, mảng, hàm... Các từ

int x,y; x = 1; //Gán hằng số 1 cho biến x y = 3 + x; //Gán giá trị 3 + x cho y

khóa được viết bằng chữ thường.

}

 Bảng dưới đây liệt kê các từ khoá của C:

15

5/3/2013 59 5/3/2013 60 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Từ khóa

Quy tắc đặt tên trong C

 Tên là một dãy các ký tự bao gồm chữ cái,

case

số và gạch nối.

 Ký tự đầu tiên của tên phải là chữ hoặc gạch

nối (không bắt đầu bằng số).

 Tên không được trùng với từ khoá.

break continue default else for interrupt short

enum goto long signed

asm const double float int return

char do extern if register sizeof

 Tên được dùng để đặt cho tên hằng, tên

struct

switch

static

typedef

biến, tên mảng, tên hàm, tên con trỏ, tên

tệp,...

unsigned void

union

while

5/3/2013 61 5/3/2013 62 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Kiểu dữ liệu

Ví dụ

 Các tên đúng: a_1, delta, x1, _step, GAMA

 Kiểu ký tự: Một giá trị kiểu char chiếm 1

 Các tên sai: 3MN Ký tự đầu tiên là số

byte (8 bit) và biểu diễn được một ký tự

m#2

Sử dụng ký tự #

thông qua bảng mã ASCII

f(x)

Sử dụng các dấu ( )

Ký tự Mã ASCII Ký tự Mã ASCII

do

Trùng với từ khoá

te ta

Sử dụng dấu trắng

Y-3

Sử dụng dấu gạch ngang -

0 1 2 9

48 49 50 57

A B a b

65 66 97 98

16

5/3/2013 63 5/3/2013 64 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Kiểu dữ liệu

Kiểu dữ liệu

 Kiểu số nguyên:

 Có hai kiểu dữ liệu ký tự: kiểu char và

Kiểu

Phạm vi biểu diễn

unsigned char.

Kích thước

Mã định dạng

int

-32768 đến 32767

2 byte

%d

định

Kiểu

Phạm vi biểu diễn

Số ký tự

Kích thước

Mã dạng

%u

0 đến 65535

2 byte

unsigned int

char

-128 đến 127

256

1 byte %c or %d

long

4 byte

%ld

-2147483648 đến 2147483647

0 đến 255

256

1 byte

%d

unsigned char

0 đến 4294967295

4 byte

%lu

unsigned long

5/3/2013 65 5/3/2013 66 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Hằng và biến

Kiểu dữ liệu

 Hằng: là các đại lượng mà giá trị của nó

 Kiểu số thực (dấu chấm động):

không thay đổi trong quá trình tính toán.

Kiểu

Cú pháp: #define

Số chữ số có nghĩa

Kích thước

Mã đinh dạng

Float

7 đến 8

4 byte %f

 Ví dụ:

#define MAX 1000 // MAX là tên hằng,

Double

15 đến 16 8 byte %lf

MAX có giá trị 1000

17 đến 18

%lf

long double

Phạm vi biểu diễn 3.4E-38 đến 3.4E+38 1.7E-308 đến 1.7E+308 3.4E-4932 đến 1.1E4932

10 byte

17

5/3/2013 67 5/3/2013 68 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Hằng và biến

Hằng và biến

 Hằng long: là số nguyên có giá trị trong

 Hằng int: là số nguyên có giá trị trong khoảng

khoảng từ -2,1 tỷ đến 2,1 tỷ.

từ -32768 đến 32767.

 Hằng long được viết theo cách: 14L hoặc

 Ví dụ:

14l (thêm L hoặc l vào đuôi)

#define so -50// hằng so có giá trị là -50

 Một số nguyên vượt ra ngoài miền xác

#define so_ng 262// hằng so_ng có giá trị là 262

định của int cũng được xem là long.

#define sothuc 262.0// hằng sothuc có giá trị là

262.0 (float)

5/3/2013 69 5/3/2013 70 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Hằng và biến

Hằng và biến

 Hằng ký tự: là một ký tự riêng biệt được

 Ví dụ:

viết trong hai dấu nháy đơn, ví dụ 'a'. Giá trị

#define n1 33000L // Định nghĩa hằng long

của 'a' chính là mã ASCII của chữ a. Như

n1 có giá trị là 33000

vậy giá trị của 'a' là 97.

#define n2 33000 // Định nghĩa hằng long

 Hằng ký tự có thể tham gia vào các phép

n2 có giá trị là 33000

toán như mọi số nguyên khác.

Ví dụ: '9' - '0' = 57 – 48 = 9

 #define kt 'a' // hằng ký tự kt có giá trị là 97

18

5/3/2013 71 5/3/2013 72 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Hằng và biến

Hằng và biến

 Biến: là tên tượng trưng trong một vùng

 Hằng chuỗi ký tự: là một dãy ký tự bất kỳ đặt

trong hai dấu nháy kép.

nhớ mà dữ liệu có thể lưu trữ trên đó, mỗi

 Ví dụ: #define s1 "Ha noi"

biến cần phải được khai báo trước khi

 Chuỗi ký tự được lưu trữ trong máy dưới dạng

đưa vào sử dụng.

một mảng có các phần tử là các ký tự riêng

Cú pháp: ;

biệt. Trình biên dịch tự động thêm ký tự null

(\0) vào cuối mỗi xâu (ký tự \0 được xem là

dấu hiệu kết thúc của một xâu ký tự ).

5/3/2013 73 5/3/2013 74 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Cách xây dựng chương trình

Hằng và biến

 Ví dụ:

B1: Phân tích bài toán và vẽ lưu đồ thuật

int a = 10, b; // biến a, b chứa các số

toán.

nguyên

B2: Xây dựng thuật toán.

long m , n; // biến m, n chứa giá trị long

B3: Viết chương trình.

B4: Chạy và kiểm tra chương trình.

B5: Bảo trì.

19

5/3/2013 75 5/3/2013 76 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Đặc điểm ngôn ngữ C

Môi trường hỗ trợ lập trình  C được tạo bởi Dennis Ritchie ở Bell

 Bộ lệnh phù hợp với phương pháp lập

Telephone Laboratories vào năm 1972.

trình cấu trúc.

 Vào năm 1983, học viện chuẩn quốc

 Kiểu dữ liệu phong phú, cho phép định

gia Mỹ (American National Standards

nghĩa kiểu dữ liệu mới.

Institute - ANSI) thành lập một tiểu ban để

 Gồm một hoặc nhiều hàm rời nhau.

chuẩn hóa C được biết đến như ANSI

 Linh động về cú pháp.

Standard C

5/3/2013 77 5/3/2013 78 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các khái niệm

Qui ước viết lệnh trong C

 Mỗi lệnh nằm trên một dòng. Cuối dòng

 Lệnh

lệnh PHẢI có dấu chấm phẩy (;).

Lệnh thực hiện một chức năng nào đó

 Lệnh quá dài có thể được viết thành

(khai báo, gán, xuất, nhập, …) và được

nhiều dòng sao cho mỗi lệnh phải được

kết thúc bằng dấu chấm phẩy (;)

quan sát trọn vẹn trong pham vi cửa sổ

 Khối lệnh

lệnh.

Khối lệnh gồm nhiều lệnh và được đặt

trong cặp dấu ngoặc { }

20

5/3/2013 79 5/3/2013 80 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các thao tác trên Borland C

Qui ước viết lệnh trong C

 Màn hình làm việc

 Không nên đặt nhiều lệnh trên cùng một

dòng, ngay cả các khai báo biến, nếu các

biến có khác kiểu cũng nên đặt trên các

dòng khác nhau.

5/3/2013 81 5/3/2013 82 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các thao tác trên Borland C

Các thao tác trên Borland C

Các phím chức năng chính:

 F3: Mở file có sẵn.

 F2: Lưu file

 F4: Chạy từng bước tại vị trí con trỏ hiện

hành.

 Chú ý: Chọn đường dẫn và đặt tên file

cho đúng. Tên có tối đa 8 ký tự, phần mở

 F5: Phóng to hoặc thu nhỏ màn hình soạn

rộng không cần nhập vào (mặc định là

thảo.

*.cpp).

 F6: Chuyển qua lại các cửa sổ soạn thảo.

21

5/3/2013 83 5/3/2013 84 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các thao tác trên Borland C

Các thao tác trên Borland C

 F7: Chạy từng bước, từ đầu chương trình

 F9: Biên dịch chương trình. Mục đích là

và vào từng lệnh của hàm con (nếu có gọi

kiểm tra lỗi chương trình.

hàm).

 Ctr + F9: Thực thi chương trình (Run) khi

chương trình không có lỗi.

 F8: Chạy từng bước, từ đầu chương trình

không vào chi tiết từng lệnh khi gọi đến

hàm con (chỉ đưa ra kết quả của hàm

con).

5/3/2013 85 5/3/2013 86 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các thao tác trên Borland C

Các thao tác trên Borland C

 Alt + F5: Xem lại màn hình kết quả

 Biên dịch và sửa lỗi:

chương trình đã chạy trước đó.

 Sau khi soạn thảo xong chương trình

 Ctrl + F1: Xem hàm này được chứa trong

nhấn F2 đặt tên chương trình. Để đảm

thư viện nào.

bảo chương trình có thể thực thi được, ta

phải nhấn F9 để biên dịch.

 Nếu không có lỗi, ta có thể nhấn Ctr + F9

để thực thi chương trình.

22

5/3/2013 87 5/3/2013 88 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các thao tác trên Borland C

Các thao tác trên Borland C

 Ví dụ chương trình sau có 3 lỗi thì C sẽ

báo như sau:

 Nếu chương trình chạy hoài không dừng

(bị loop) nhấn Ctrl+Break+Enter để trở về

màn hình soạn thảo.

5/3/2013 89 5/3/2013 90 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các thao tác trên Borland C

Bài tập

 Khi hiển thị màn hình báo lỗi, ta phải nhấn

 Viết chương trình cho phép nhập vào 2

phím Enter để xuất hiện cửa sổ mô tả lỗi.

số nguyên a,b. Xuất ra tổng, hiệu, tích

thương của 2 số.

 Viết chương trình tính diện tích và chu vi

của hình chữ nhật với chiều dài và chiều

rộng được nhập từ bàn phím.

23

5/3/2013 91 5/3/2013 92 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

NỘI DUNG

Chương III:

 Biểu thức

 Các phép toán

 Hàm xuất/ nhập

BIỂU THỨC, TOÁN TỬ, VÀO, RA DỮ LIỆU

ThS. Nguyễn Thị Thúy Loan

5/3/2013 94 Nguyễn Thị Thúy Loan

Biểu thức

Biểu thức

 Biểu thức là một sự kết hợp giữa các

 Trong C, ta có hai khái niệm về biểu thức:

o Biểu thức gán.

phép toán và các toán hạng để diễn đạt

một công thức toán học nào đó.

o Biểu thức điều kiện.

 Biểu thức dùng để diễn đạt một công

 Biểu thức được phân loại theo kiểu giá trị:

thức, một qui trình tính toán, vì vậy nó là

nguyên và thực.

một thành phần không thể thiếu trong

chương trình.

24

5/3/2013 95 5/3/2013 96 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các phép toán

Biểu thức

 Biểu thức thường được dùng trong:

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

o Vế phải của câu lệnh gán.

 Các phép toán quan hệ và logic.

 Phép toán tăng giảm.

o Làm tham số thực sự của hàm.

 Thứ tự ưu tiên các phép toán.

o Làm chỉ số.

 Chuyển đổi kiểu giá trị.

o Trong các toán tử của các cấu trúc điều

khiển.

5/3/2013 97 5/3/2013 98 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

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

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

 Ví dụ:

 Các phép toán hai ngôi số học là.

11/3 = 3; 11%3 = 2; -(2+6) = -8

Phép toán Ý nghĩa

Ví dụ

 Các phép toán +, - có cùng thứ tự ưu

+

Phép cộng

a+b

tiên, nhỏ hơn các phép *, /, % và cả ba

-

Phép trừ

a-b

phép này lại có thứ tự ưu tiên nhỏ hơn

*

Phép nhân

a*b

phép trừ một ngôi.

/

Phép chia

a/b

 Các phép toán số học được thực hiện từ

%

a%b

Phép lấy phần dư

trái sang phải.

25

5/3/2013 99 5/3/2013 100 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các phép toán quan hệ và logic

Các phép toán quan hệ và logic  Các phép toán quan hệ là:

 Phép toán quan hệ và logic cho ta giá trị

Ý nghĩa

Ví dụ

đúng (khác 0) hoặc giá trị sai (0). Nói

So sánh lớn hơn

4 > 5 có giá trị 0

Phép toán >

cách khác, khi các điều kiện nêu ra là

6 >= 2 có giá trị 1

>=

đúng thì ta nhận được giá trị khác 0, trái

lại ta nhận giá trị 0.

So sánh lớn hơn hoặc bằng So sánh nhỏ hơn

6 <= 7 có giá trị 1

<

<=

8 <= 5 có giá trị 0

So sánh nhỏ hơn hoặc bằng So sánh bằng nhau

6 == 6 có giá trị 1

==

So sánh khác nhau

9 != 9 có giá trị 0

!=

5/3/2013 101 Nguyễn Thị Thúy Loan

Các phép toán quan hệ và logic

Các phép toán quan hệ và logic  Các phép toán logic: có ba phép toán

 Hai phép toán == và != có độ ưu tiên thấp

logic:

hơn bốn phép toán >, >=, <, <=. Bốn

 Phép toán một ngôi (phủ định !)

phép toán này có độ ưu tiên bằng nhau.

 Phép hai ngôi: và (AND) && hay hoặc (OR) ||

 Các phép toán quan hệ có số thứ tự ưu

a && b a || b

tiên thấp hơn so với các phép toán số

a 1

b 1

1

1

học, cho nên biểu thức: i < n-1 được hiểu

1

0

0

1

a 1 0

!a 0 1

là i < (n - 1).

0 0

1 0

0 0

1 0

26

5/3/2013 103 5/3/2013 104 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Phép toán tăng giảm

Các phép toán quan hệ và logic

 C đưa ra hai phép toán một ngôi để tăng

 Các phép toán quan hệ có số ưu tiên nhỏ

và giảm giá trị các biến (nguyên và thực).

hơn so với phép phủ định (!) nhưng lớn

Toán tử tăng là ++ sẽ cộng 1 vào toán

hơn so với &&, ||. Vì vậy biểu thức sau:

hạng của nó, toán tử giảm -- thì sẽ trừ toán

(ad)

hạng đi 1.

có thể viết lại thành: ad

 Ta có thể viết phép toán ++ và -- trước

hoặc sau toán hạng như sau: ++n, n ++, --

n, n --.

5/3/2013 105 5/3/2013 106 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Phép toán tăng giảm

Thứ tự ưu tiên các phép toán

Ví dụ:

n = 5;

 Các phép toán có độ ưu tiên khác nhau,

điều này có ý nghĩa trong cùng một biểu

 ++ n; Cho ta n = 6

thức sẽ có một số phép toán này được

 -- n;

Cho ta n = 4

thực hiện trước một số phép toán khác.

 x = ++ n;

Cho ta x = 6 và n = 6

 x = n ++;

Cho ta x = 5 và n = 6

 Thứ tự ưu tiên của các phép toán được

trình bày trong bảng sau:

27

5/3/2013 107 5/3/2013 108 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Thứ tự ưu tiên các phép toán

 Các phép toán trên một dòng có cùng thứ

tự ưu tiên, các phép toán ở hàng trên có

số ưu tiên cao hơn các số ở hàng dưới.

 Đối với các phép toán cùng mức ưu tiên

thì trình tự tính toán có thể từ trái qua

phải hay ngược lại được chỉ ra trong cột

trình tự kết hợp.

Phép toán () [] -> ! ~ & * - ++ -- (type ) sizeof * ( phép nhân ) / % + - <<, >> (dịch trái/ phải trên bit) <, <= , >, >= == != & (and trên bit) ^ (xor trên bit) | (or trên bit) && || ?:

Trình tự KH Trái qua phải Phải qua trái Trái qua phải Trái qua phải Trái qua phải Trái qua phải Trái qua phải Trái qua phải Trái qua phải Trái qua phải Trái qua phải Trái qua phải Phải qua trái Phải qua trái Trái qua phải

TT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 = += -= *= /= %= <<= >>= &= ^= |= 15

,

5/3/2013 110 Nguyễn Thị Thúy Loan

Thứ tự ưu tiên các phép toán

Thứ tự ưu tiên các phép toán

Ví dụ:

 Toán tử[ ] dùng để biểu diễn phần tử mảng.

Ví dụ: a[i];

 *--px = *(--px) (Phải qua trái)

 Toán tử .dùng để biểu diễn thành phần cấu

 8/4*6 = (8/4)*6 (Trái qua phải)

trúc.

Ví dụ: sv.ten

 Toán tử -> Dùng để biểu diễn thành phần cấu

trúc thông qua con trỏ.

Ví dụ: p -> info

28

5/3/2013 111 5/3/2013 112 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Chuyển đổi kiểu giá trị

Thứ tự ưu tiên các phép toán

 Việc chuyển đổi kiểu giá trị thường diễn

 * dùng để khai báo con trỏ, và lấy giá trị

ra một cách tự động trong hai trường hợp

tại địa chỉ mà con trỏ đến.

sau:

 & phép toán lấy địa chỉ.

 Khi gán biểu thức gồm các toán hạng

Ví dụ: &x

khác kiểu.

 Toán tử , thường dùng để viết một dãy

 Khi gán một giá trị kiểu này cho một biến

biểu thức trong toán tử for

kiểu khác.

Ví dụ: for (i = 0, j = 0; i

5/3/2013 113 5/3/2013 114 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Chuyển đổi kiểu giá trị

Chuyển đổi kiểu giá trị  Chuyển từ một kiểu giá trị sang một kiểu

 Khi hai toán hạng trong một phép toán có

bất kỳ mà ta muốn bằng phép chuyển

kiểu khác nhau thì kiểu thấp hơn sẽ được

sau:

nâng thành kiểu cao hơn trước khi thực

() biểu thức

hiện phép toán.

 Ví dụ: (float) (a+b)

o Giữa int và long thì int chuyển thành long.

o Giữa int và float thì int chuyển thành float.

29

5/3/2013 115 5/3/2013 116 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Chuyển đổi kiểu giá trị

Chuyển đổi kiểu giá trị

Ví dụ:

 Chú ý: Muốn có giá trị chính xác trong

 1.5*(11/3) = 4.5

phép chia hai số nguyên cần dùng phép

 1.5*11/3 = 5.5

ép kiểu: ((float)a)/ b

 (11/3)*1.5 = 4.5

 Để đổi giá trị thực r sang nguyên, ta dùng:

(int)(r + 0.5)

 (int)1.4*10 = 1*10 = 10

 (int)(1.4*10) = (int)14.0 = 14

5/3/2013 117 5/3/2013 118 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Hàm nhập, xuất

Nhập giá trị cho biến

 Để sử dụng các hàm nhập xuất cần khai

 Là hàm cho phép đọc dữ liệu từ bàn phím

báo ở đầu chương trình sử dụng thư viện

và gán cho các biến trong chương trình

stdio.h

khi chương trình thực thi. Trong ngôn ngữ

C, đó là hàm scanf nằm trong thư viện

 #include

.

30

5/3/2013 119 5/3/2013 120 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Nhập giá trị cho biến

Nhập giá trị cho biến

 Cú pháp:

Ví dụ:

scanf(“mã định dạng”, địa chỉ của các

 scanf(“%d”, &a); //a co kieu nguyen

biến);

 scanf(“%f”, &b); // b co kieu thưc

 Giải thích: Mã định dạng: dùng để qui

 Hoặc scanf(“%d%f”, &a, &b);

định kiểu dữ liệu, cách biểu diễn, độ rộng,

 scanf(“%d%f%c”,&bien1,&bien2, &bien3);

số chữ số thập phân,...

/*bien1 co kieu nguyen, bien2 co kieu

thuc, bien3 co kieu char*/

5/3/2013 121 5/3/2013 122 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Nhập giá trị cho biến

Nhập giá trị cho biến

 Để nhập vào một chuỗi ký tự (không chứa

 Để nhập giá trị kiểu char được chính xác,

khoảng trắng hay kết thúc bằng khoảng

nên dùng hàm fflush(stdin) để loại bỏ

trắng), chúng ta phải khai báo kiểu mảng

các ký tự còn nằm trong vùng đệm bàn

ký tự hay con trỏ ký tự, sử dụng định

phím trước hàm scanf().

dạng %s và tên biến thay cho địa chỉ

biến.

31

5/3/2013 123 5/3/2013 124 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Xuất giá trị của biểu thức

Nhập giá trị cho biến

 Hàm printf (trong thư viện stdio.h) dùng để

 Để đọc vào một chuỗi ký tự có chứa

xuất giá trị của các biểu thức lên màn hình.

khoảng trắng (kết thúc bằng phím Enter)

 Cú pháp:

thì phải dùng hàm gets().

printf (“mã định dạng”, Các biểu thức);

Ví dụ:

int biennguyen;

 Giải thích: Mã định dạng: dùng để qui định

float bienthuc;

kiểu dữ liệu, cách biểu diễn, độ rộng, số chữ

char bienchar;

số thập phân,...

char chuoi1[20], *chuoi2;

Chương IV:

5/3/2013 125 5/3/2013 126 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Xuất giá trị của biểu thức  Một số định dạng đối với int, số thực, ký tự.

Ý nghĩa

CẤU TRÚC ĐIỀU KIỂN & LƯU ĐỒ THUẬT TOÁN

ThS. Nguyễn Thị Thúy Loan

Định dạng %d %[.số chữ số thập phân]f %o %x %c %s %e or %E or %g or %G

Xuất số nguyên Xuất số thực có theo quy tắc làm tròn số. Xuất số nguyên hệ bát phân Xuất số nguyên hệ thập lục phân Xuất một ký tự Xuất chuỗi ký tự Xuất số nguyên dạng khoa học (nhân 10 mũ x)

32

5/3/2013 127 Nguyễn Thị Thúy Loan

NỘI DUNG

Lệnh và khối lệnh

 Lệnh và khối lệnh.

 Mỗi câu lệnh thực hiện một chức năng

nào đó (có thể viết trên nhiều dòng) và

 Cách trình bày code chương trình.

kết thúc bằng dấu chấm phẩy (;).

 Các ký hiệu lưu đồ.

 Cấu trúc rẽ nhánh

 Khối lệnh bao gồm nhiều lệnh, được nằm

trong cặp dấu ngoặc nhọn ({}).

 Cấu trúc lặp

 Cấu trúc switch…case.

5/3/2013 129 5/3/2013 130 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Cách trình bày code CT

Cách trình bày code CT

 Canh theo lề trái.

 Mỗi lệnh/ khối lệnh con phải nằm lùi sang

phải 1 tab (thông thường 1 tab = 4 ký tự).

void main() { int a; printf(“Nhap vao a:”); scanf(“%d”, &a); if(a>0)  printf(“Ban vua nhap so duong”); else  if(a<0)   printf(“Ban vua nhap so am”);  else   printf(“Ban nhap so 0”); getch(); }

33

5/3/2013 131 5/3/2013 132 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Khái niệm

Các ký hiệu lưu đồ

 Khái niệm.

 Lưu đồ thuật toán là công cụ dùng để

biểu diễn thuật toán, việc mô tả nhập

 Phương pháp duyệt

(input), xuất (output) dữ liệu và luồng xử

 Các ký hiệu

lý thông qua các ký hiệu hình học.

5/3/2013 133 5/3/2013 134 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các ký hiệu

Phương pháp duyệt

STT

ký HIỆU

DIỄN GIẢI

 Duyệt từ trên xuống.

Bắt đầu chương trình

1

 Duyệt từ trái sang phải.

Kết thúc chương trình

2

3

4

5

6

7

Luồng xử lý Điều khiển lựa chọn Nhập Xuất xử lý, tính toán hoặc gán trả về giá trị (return)

8

9

Điểm nối liên kết tiếp theo (Sử dụng khi lưu đồ vượt quá trang)

34

5/3/2013 135 Nguyễn Thị Thúy Loan

Cấu trúc tuần tự

Cấu trúc tuần tự

 Ví dụ: Nhập vào 3 số nguyên a, b, c và

 Tuần tự thực thi tiến trình. Mỗi lệnh được

xuất ra màn hình với giá trị của mỗi số

thực thi theo một chuỗi từ trên xuống,

tăng lên 1.

xong lệnh này rồi chuyển xuống lệnh kế

tiếp.

5/3/2013 137 5/3/2013 138 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Cấu trúc tuần tự

void main()

{

int a, b, c;

printf(“Nhap vao 2 so a, b,c: ”);

scanf(“%d%d%d”, &a, &b, &c);

a++;

b++;

c++;

printf(“a=%d, b=%d, c=%d”,a,b,c);

}

35

5/3/2013 5/3/2013 139 140 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Cấu trúc if

Cấu trúc if

 Chỉ xét trường hợp đúng.

 Cú pháp:

if (biểu thức điều kiện)

;

{

}

 Nếu biểu thức điều kiện cho kết quả đúng

thì thực hiện khối lệnh.

5/3/2013 141 5/3/2013 142 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Cấu trúc if

Cấu trúc if

 Ví dụ: Nhập vào số nguyên n. Kiểm tra

nếu n>0 thì tăng giá trị n lên 1. Xuất kết

quả.

n > 0

36

5/3/2013 143 5/3/2013 144 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Cấu trúc if…else

Cấu trúc if

void main()

 Xét trường hợp đúng và trường hợp sai.

{

int n;

printf(“Nhap vao n: ”);

scanf(“%d”, &n);

if(n>0)

n=n+1;

printf(“n=%d”,n);

}

5/3/2013 145 5/3/2013 146 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Cấu trúc if…else

Cấu trúc if…else

 Ví dụ: Nhập vào số nguyên n. Kiểm tra

 Cú pháp:

nếu n chẵn xuất ra màn hình “n chẵn”,

if (biểu thức điều kiện)

ngược lại xuất “n lẻ”.

;

{

}

else

{

;

}

37

5/3/2013 147 5/3/2013 148 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Cấu trúc if…else

Cấu trúc if…else

void main()

{

int n;

printf(“Nhap vao n: ”);

scanf(“%d”, &n);

n %2 = 0

if(n%2==0)

printf(“n chan”);

else

printf(“n le”);

}

5/3/2013 5/3/2013 149 150 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Cấu trúc lặp

for/ while

 Thực hiện liên tục 1 lệnh hay tập lệnh với

 Kiểm tra điều kiện trước khi lặp.

số lần lặp dựa vào điều kiện. Lặp sẽ kết

thúc khi điều kiện được thỏa.

for

 while

 do … while

38

5/3/2013 151 5/3/2013 152 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

for

while

 Cú pháp:

 Cú pháp:

for (;;

;

nhảy>)

while ()

{

;

;

{

Bước nhảy;

}  Bất kỳ biểu thức nào trong 3 biểu thức nói

}

trên đều có thể vắng nhưng phải giữ dấu

chấm phẩy (;).

5/3/2013 153 5/3/2013 154 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

while

 Ví dụ: Nhập vào số nguyên n. Xuất ra

màn hình từ 1 đến n.

39

5/3/2013 155 5/3/2013 156 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

#include

#include

void main()

{

int n;

printf(“Nhap vao n: ”);

scanf(“%d”, &n);

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

printf(“%d\t”, i);

}

5/3/2013 5/3/2013 157 158 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

do … while

Ví dụ

 Thực hiện lặp trước khi kiểm tra điều kiện

#include #include void main() {

int n, i=1; printf(“Nhap vao n: ”); scanf(“%d”, &n); while(i<=n) {

printf(“%d\t”, i); i++;

}

}

40

5/3/2013 159 5/3/2013 160 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

do … while

Ví dụ

 Cú pháp:

 Nhập vào số nguyên dương n. Nếu nhập

sai yêu cầu nhập lại.

do{

< khối lệnh> ;

} while (biểu thức điều kiện);

 Thực hiện khối lệnh cho đến khi biểu thức

có giá trị bằng 0.

5/3/2013 161 5/3/2013 162 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

#include #include void main() {

int n; do{ printf(“Nhap vao n: ”); scanf(“%d”, &n);

}while(n<=0);

}

41

5/3/2013 163 5/3/2013 164 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Cấu trúc switch … case

Cấu trúc switch … case

switch (biểu thức)  case n1:

 Cú pháp: Kết hợp nhiều cấu trúc if tuần tự

; break ;

case n2:

; break ;

case nk:

; break ;

[default: các câu lệnh]

5/3/2013 165 5/3/2013 166 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

 Tạo menu cấp 1 cho phép chọn menu

#include #include int Menu()  int chon;

bằng số nhập từ bàn phím.

printf ("Thuc Don"); printf ("\n1. Sup ga!"); printf ("\n2. Com chien!"); printf ("\n3. Lau thai!"); printf ("\n Xin moi ban chon mon an!"); scanf ("%d",&chon); return chon;

42

5/3/2013 167 5/3/2013 168 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

void main()

void Xuly_Menu (int chon)  switch (chon)  case 1:

printf ("\nBan chon sup ga!");

clrscr() ;

break; case 2:

printf ("\nBan chon com chien!");

int c ;

break ; case 3:

c = Menu();

printf ("\nBan chon lau thai!");

Xuly_Menu(c);

break; default:

getch();

printf ("\nBan chon khong dung!");

}

}

5/3/2013 169 5/3/2013 170 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

break và continue

 Dùng để kết thúc lặp (break) hay để bỏ

qua một lần lặp (continue).

#include #include void main()  while(1)

 Ví dụ 1: Cho phép người dùng nhập liên

tục giá trị n cho đến khi nhập âm thì

{ printf(“\nNhap n: ”); scanf(“%d”, &n); if(n<0)

dừng.

break;

} getch ();

43

5/3/2013 5/3/2013 171 172 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Ví dụ  In ra màn hình giá trị từ 10 đến 20 trừ đi

số 13 và số 17.

#include #include void main() 

for(int i=10 ; i<=20; i++) {

if(i==13||i==17) continue; printf(“%d\t”, i);

} getch ();

5/3/2013 5/3/2013 173 174 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Kết luận

Bài tập

 Lưu đồ thuật toán rất hữu ích trong việc mô tả

1. Nhập vào hai số x, y. Xuất ra màn hình

cách giải quyết của một bài toán.

tổng, hiệu, tích, thương của hai số trên.

 Khi xây dựng lưu đồ thuật toán, chúng ta cần

2. Nhập vào số nguyên n, kiểm tra xem n chẵn

chú ý một vài điểm sau:

hay lẻ và xuất ra màn hình.

o Một lưu đồ phải có điểm bắt đầu và điểm kết thúc.

3. Nhập vào ba cạnh a, b, c của tam giác. Xuất

o Phải có dữ liệu vào, ra sau khi xử lý tính toán.

ra màn hình tam giác đó thuộc loại tam giác

o Tại mỗi vị trí quyết định lựa chọn rẽ nhánh phải ghi

gì? (Thường, cân, vuông, đều hay vuông

rõ điều kiện đúng hoặc sai thì đi theo nhánh nào.

cân).

44

5/3/2013 175 5/3/2013 176 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Bài tập

Bài tập

4. Nhập vào số nguyên n. Nếu n>5 thì tăng n

lên 2 đơn vị và trả về giá trị n, ngược lại trả

về giá trị 0.

5. Tính n!,với n ≥ 0

Cho biết kết quả của đoạn chương trình sau: int a=9, b=6; a++; a=a+b--; a=a+(--b); if(a%2==0)

6. Tính P(n) = 1.3.5…(2n+1), với n ≥ 0

printf("Gia tri cua a la chan”);

7. Tính S(n)= 1+1.2+1.2.3+…+1.2.3…n, với n>0

printf(“Tong cua a va b la: %d”, a+b) ;

8. Tính S(n) =1+1/2+1/3+…+1/n, với n > 0

Chương V:

5/3/2013 177 5/3/2013 178 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

NỘI DUNG

 Ý nghĩa

 Định nghĩa hàm

HÀM

 Cách xây dựng hàm, nguyên tắc và cách

gọi hàm

 Hàm đệ qui

ThS. Nguyễn Thị Thúy Loan

45

5/3/2013 180 Nguyễn Thị Thúy Loan

Ý nghĩa

 Trong những chương trình lớn, có thể có

Ý nghĩa  Hàm là một đoạn chương trình độc lập

những đoạn chương trình viết lặp đi lặp lại

thực hiện trọn vẹn một công việc nhất

nhiều lần, để tránh rườm rà và mất thời gian

định sau đó trả về giá trị cho chương trình

khi viết chương trình; người ta thường phân

gọi nó, hay nói cách khác hàm là sự chia

chia chương trình thành nhiều module, mỗi

nhỏ của chương trình.

module giải quyết một công việc nào đó.

Các module như vậy gọi là các chương trình

con.

5/3/2013 181 5/3/2013 182 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Định nghĩa hàm

Định nghĩa hàm

 Một hàm được viết theo mẫu sau:

 Kiểu dữ liệu trả về có thể int, float, long, cấu

trúc, … .

(danh sách các

tham số hình thức)

 Tham số: là tham số truyền dữ liệu vào cho

{

hàm, một hàm có thể có hoặc không có

tham số.

[return [biểu thức];]

}

46

5/3/2013 183 5/3/2013 184 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Định nghĩa hàm

Định nghĩa hàm  Lệnh return dùng để thoát khỏi một hàm

 Khai báo các tham số có dạng:

và có thể trả về một giá trị nào đó.

( , ...,

 Cú pháp:

dữ liệu> )

 return ; /*không trả về giá trị chỉ để dừng

chương trình*/

 return ; /*Trả về giá trị của

biểu thức*/

5/3/2013 185 5/3/2013 186 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Định nghĩa hàm

Cách xây dựng hàm, nguyên tắc và cách gọi hàm

 Quy tắc hoạt động của hàm:

Một hàm phải được khai báo trước khi sử

 Kiểu dữ liệu của hàm.

dụng.

 Tham số.

 Cú pháp gọi hàm:

[ =] ([Danh sách

các tham số thực]);

47

5/3/2013 187 5/3/2013 188 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Kiểu dữ liệu của hàm

Kiểu dữ liệu của hàm

 void: Hàm không trả về giá trị. Những

void Tên_hàm (danh sách các tham số)

hàm loại này thường rơi vào những nhóm

{

chức năng: Nhập/ xuất dữ liệu, thống kê,

Khai báo các biến cục bộ;

sắp xếp, liệt kê, tạo mảng.

Các câu lệnh/ khối lệnh hay lời gọi đến

hàm khác;

}

5/3/2013 189 5/3/2013 190 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Kiểu dữ liệu của hàm

Kiểu dữ liệu của hàm

 Kiểu dữ liệu cơ bản (rời rạc/ liên tục) hay

Tên_hàm([danh sách các tham số])

kiểu dữ liệu có cấu trúc: Kiểu dữ liệu tùy

{ kq;

theo mục đích của hàm cần trả về giá trị

Khai báo các biến cục bộ;

Các câu lệnh / khối lệnh hay lời gọi đến hàm

gì thông qua việc phân tích bài toán.

khác;

Những hàm loại này thường được sử

return kq;

dụng trong các trường hợp: Đếm, kiểm

}

tra, tìm kiếm, tính trung bình, tổng, tích,

48

5/3/2013 191 5/3/2013 192 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Tham số

Tham số

 Tham trị: Khi truyền tham số theo kiểu

 Tham chiếu: Có sự thay đổi giá trị của tham

tham trị cho hàm, các giá trị thực (tham

số trong quá trình thực hiện và cần lấy lại

giá trị đó sau khi ra khỏi hàm.

số thực) không bị thay đổi giá trị khi kết

 Khi gọi hàm ta phải truyền 1 biến cùng kiểu

thúc hàm (cho dù bên trong hàm có bất

tham số và ta truyền bản thân biến đó cho

kỳ lệnh nào làm thay đổi giá trị của tham

hàm, nên bất kỳ thay đổi gì trên tham số

số)

chính là thay đổi trên biến được truyền.

5/3/2013 193 5/3/2013 194 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Tham số

 Ta xét chương trình sau đây:

 Tham chiếu:

#include

 Ứng dụng của tham số loại này có thể là

#include

void Hoanvi1(int a, int b)

dữ liệu đầu ra (kết quả) hoặc cũng có thể

{

int t=a;

vừa là dữ liệu đầu vào vừa là dữ liệu đầu

a=b;

ra.

b=t;

&

printf("\Ben trong ham a=%d , b=%d", a, b);

}

49

5/3/2013 195 196 5/3/2013 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

void Hoanvi2(int &a, int &b)

{

int t=a;

a=b;

b=t;

printf("\Ben trong ham a=%d ,b=%d", a, b);

void main() int a, b; { clrscr(); printf("\n Nhap vao 2 so nguyen a, b:"); scanf("%d%d",&a,&b); printf("\nTruoc khi goi ham a=%d,b=%d",a, b); Hoanvi1(a,b); printf("\n Sau khi goi ham a=%d ,b=%d",a,b); Hoanvi2(a,b); printf("\n Sau khi goi ham a=%d ,b=%d",a,b); getch();

}

}

5/3/2013 197 5/3/2013 198 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Tên hàm

 Đặt tên theo quy ước sao cho tên gọi

 Ví dụ 1: Viết chương trình nhập số

đúng với chức năng hay mục đích thực

nguyên dương n và in ra màn hình các

hiện của hàm và gợi nhớ.

ước số của n.

 Phân tích bài toán:

50

5/3/2013 199 5/3/2013 200 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Ví dụ

 Input: n (Để xác định tham số)

 Xác định tên hàm: Hàm này dùng in ra

o Kiểu dữ liệu: số nguyên (int).

các ước số của n nên có thể đặt là

o giá trị n không bị thay đổi trong quá trình tìm

Lietke_uocso

ước số → Tham số của hàm không là con trỏ.

 Ta có nguyên mẫu hàm:

 Output: In ra các ước số của n (Để xác

void Lietke_uocso(int n );

định kiểu dữ liệu hàm)

o Không trả về giá trị.

o Kiểu dữ liệu của hàm là void.

void Lietke_uocso (int n)

{

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

if (n%i = =0)

printf(“%d\t”, i);

}

#include #include //Khai bao prototype void Lietke_uocso (int n ); void main() int n; { printf(“Nhap n = ”); scanf(“%d”,&n); printf("Cac uoc so cua n: " ); Lietke_uocso (n); getch( );

}

5/3/2013 201 5/3/2013 202 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

51

5/3/2013 203 5/3/2013 204 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Ví dụ

 Viết chương trình nhập số nguyên dương

 Input: n (Để xác định tham số)

n và tính tổng

o Kiểu dữ liệu: số nguyên dương (unsigned

int).

S = 1+2+3+ …+n, với n>0

o giá trị n không bị thay đổi trong quá trình tính

 Phân tích bài toán:

tổng → Tham số của hàm không là con trỏ.

5/3/2013 205 5/3/2013 206 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Ví dụ

 Xác định tên hàm: Hàm này dùng tính

 Output: Tổng S (Để xác định kiểu dữ liệu

tổng S nên có thể đặt là Tong_s.

hàm)

 Ta có nguyên mẫu hàm:

o Trả về giá trị của S.

o S là tổng các số nguyên dương nên S cũng

long Tong_s (int n);

là số nguyên dương → Kiểu trả về của hàm

là unsigned int (hoặc unsigned long cho

trường hợp giá trị của tổng lớn hơn 2 bytes).

52

5/3/2013 207 5/3/2013 208 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Hàm đệ qui

Ví dụ

 C không những cho phép từ hàm này gọi

 Xét một ví dụ về tính giai thừa của số

tới hàm khác, mà nó còn cho phép từ một

nguyên dương n. Ta nhận thấy rằng n! có

điểm trong thân của một hàm gọi tới

thể tính theo công thức truy hồi sau:

chính hàm đó. Hàm như vậy gọi là hàm

n!=1

nếu n=0 or n =1

đệ qui.

n!=n*(n-1)!

nếu n>1

 Vì thế hàm tính giai thừa một số nguyên

dương có thể viết theo 2 cách như sau:

5/3/2013 209 5/3/2013 210 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Hàm đệ qui  Hàm ĐQ thường được xây dựng theo cách sau:

if ( trường hợp suy biến) {

// viết đệ qui long Gth(int n) {

// viết kg đệ qui long Gt(int n) { long s=1;

Trình bày cách giải bài toán khi suy biến

if (n==0 || n==1)

return 1;

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

return(n*Gth(n-1));

} else /* Trường hợp tổng quát */ {

}

s*=i; return s;

}

Gọi đệ qui tới hàm (đang viết) với các giá trị khác của tham số

}

53

5/3/2013 5/3/2013 211 212 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Ví dụ

#include "stdio.h"

 Bài toán dùng đệ qui tìm USCLN của hai

int Uscln(int a, int b ); // khai báo prototype

số nguyên dương a và b.

void main()

{

int m,n;

 Trường hợp suy biến: khi a =b thì USCLN

printf("\n Nhap cac gia tri cua a va b :");

của a và b chính là giá trị của chúng.

scanf("%d%d",&m,&n);

 Trường hợp chung:

printf("\nUSCLN cua a=%d va b=%d la :%d", m,

o USCLN(a, b) = USCLN(a-b, b) nếu a > b

m,

Uscln (m,n))

o USCLN(a, b) = USCLN(a, b-a) nếu a < b

}

5/3/2013 213 214 5/3/2013 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

int Uscln (int a,int b)

Biến toàn cục và biến cục bộ  Biến cục bộ: là biến khai báo trong 1 hàm

{

hay một khối. Phạm vi sử dụng là bên

if (a==b)

trong hàm hay khối mà nó khai báo.

return a;

if (a>b)

return USCLN(a-b,b);

return USCLN(a,b-a);

}

54

5/3/2013 215 5/3/2013 216 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Biến toàn cục và biến cục bộ

 Biến toàn cục: là biến khai báo bên ngoài

tất cả các hàm của chương trình trong đó

#include int x = 1, y = 2, a=20; void Demo(void); int main() { printf("Truoc khi goi ham Demo x =%d,

có cả hàm main(). Có thể được sử dụng

ở bất kì đâu trong chương trình, ngay sau

khi nó được khai báo. Phạm vi sử dụng

của biến toàn cục là bắt đầu từ vị trí khai

y=%d va a=%d",x,y,a); Demo(); printf("\nSau khi goi ham Demo x=%d, y=%d va a=%d", x, y, a); return 0;

}

báo đến cuối chương trình.

5/3/2013 217 5/3/2013 218 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Bài tập

void Demo(void)

 Nhập số nguyên dương n (n>0). Liệt kê tất

{

int x = 88, y = 99;

cả các số nguyên tố nhỏ hơn n.

a=a+5;

 Nhập số nguyên dương n (n>0). Liệt kê n số

printf("\nTrong hàm demo x=%d, y= %d

chính phương đầu tiên.

va a=%d.", x, y, a);

 Viết chương trình nhập số nguyên dương n

}

tính tổng các ước số dương của n

55

5/3/2013 219 5/3/2013 220 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Chương VI:

NỘI DUNG

 Mảng một chiều

 Chuỗi ký tự.

 Mảng hai chiều

MẢNG VÀ CHUỖI KÝ TỰ

ThS. Nguyễn Thị Thúy Loan

5/3/2013 222 Nguyễn Thị Thúy Loan

Khái niệm

Mảng một chiều

 Khái niệm:

 Do đó để truy xuất các biến thành phần,

ta dùng cơ chế chỉ mục.

 Mảng thực chất là một biến được cấp

phát bộ nhớ liên tục và bao gồm nhiều

Chỉ số

0

1

2

3

4

biến thành phần.

 Các thành phần của mảng là tập hợp các

Phần tử A[0] A[1] A[2] A[3] A[4]

biến có cùng kiểu dữ liệu và cùng tên.

56

5/3/2013 223 5/3/2013 224 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Khái niệm

Khái niệm

Ví dụ:

 Để khai báo một mảng, ta có 2 cách khai

 int a[100];//Khai báo mảng a gồm 100

báo sau:

phần tử

 Cách 1: Con trỏ hằng

 float b[50];//Khai báo mảng b gồm 50

[< Số phần tử

phần tử

tối đa của mảng>];

5/3/2013 225 5/3/2013 226 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Khai báo

Khai báo

 Cách 2: Con trỏ

Ví dụ:

 Ý nghĩa: Khi ta khai báo một mảng với

 int *a; // khai báo con trỏ a

kiểu dữ liệu bất kỳ (int, float, char,…) thì

 int b[100];

tên của mảng thực chất là một hằng địa

 a = b;

// a trỏ vào phần tử 0 của mảng b

chỉ của phần tử đầu tiên.

 Với cách viết như trên thì ta có thể hiểu

 < Kiểu dữ liệu > *< Tên mảng >;

các cách viết sau là tương đương

 a[i]  *(a + i)  b[i]  *(b+i)

57

5/3/2013 227 5/3/2013 228 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Khai báo

Khai báo  Chú ý: Khi sử dụng biến con trỏ để truy xuất

 Ví dụ:

mảng theo cách như trên thì thực chất con

 Cách 1: dùng malloc

trỏ a chỉ chiếm 2 byte bộ nhớ để chứa địa

int *px; //Khai báo con trỏ px

chỉ mà thôi. Để tạo mảng chứa dữ liệu thành

px = (int *) malloc (100); //Cấp phát 100 ô

phần thì ta phải cấp phát vùng nhớ cho con

nhớ kiểu int cho px

trỏ a.

 Dùng hàm: malloc, calloc trong thư viện

để cấp phát vùng nhớ.

5/3/2013 229 5/3/2013 230 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Thao tác trên mảng

Khai báo

 Cách 2: dùng calloc

 Nhập xuất mảng một chiều.

int *p;

//khai báo con trỏ p

 Tính tổng/ tích

p = (int *) calloc (100, sizeof (int)); //cấp

 Kỹ thuật đặt cờ hiệu

phát 100 ô nhớ mỗi ô 2 bytes

 Đếm

 Sau khi sử dụng xong thì nên giải phóng

 Tìm kiếm, kỹ thuật đặt lính canh

 Sắp xếp

vùng nhớ bằng hàm free

 Xóa/ chèn

 Ví dụ : free (p); // giải phóng vùng nhớ cho

 Tách/ ghép mảng

con trỏ p.

58

5/3/2013 231 5/3/2013 232 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Nhập mảng một chiều

Nhập mảng một chiều

void Nhap_mang (int a[], int n)

void Nhap_mang_dk(int a[], int n)

{

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

{

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

{

do{

printf (“ a [%d] = “, i);

printf (“ a [%d] = “, i);

scanf (“ %d “, &a[i]);

scanf (“ %d “, &a[i]);

}

}while (a[i] chua thoa dk);

}

}

5/3/2013 233 5/3/2013 234 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Tính tổng/ tích

Xuất mảng một chiều

void Xuat_mang (int a[], int n)

long Tong_mang(int a[], int n)// không điều

{

kiện

printf (“\nNoi dung mang: “);

{

long tong =0;

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

for(int i=0; i

printf (“ %d \t “, a[i]);

tong += a[i];

}

return tong;

}

59

5/3/2013 235 5/3/2013 236 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Ví dụ

Tính tổng/ tích

 Viết hàm tính tổng các số nguyên chẵn

long Tong_đk(int a[], int n)// có điều kiện

lớn hơn 10.

{

long tong =0;

for(int i=0; i

if (a[i] thỏa điều kiện)

tong += a[i];// tich *= a[i]

return tong;

}

5/3/2013 237 5/3/2013 238 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Đếm

Tìm kiếm

int Dem_dk (int a[], int n )// có điều kiện

int Tim_x(int x, int a[], int n)

{

int dem = 0;

{

int i=0;

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

while (i

if(a[i] thỏa điều kiện)

i++;

dem++;

if(i< n) return i;

return dem;

return -1;

}

}

60

5/3/2013 239 5/3/2013 240 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Kỹ thuật đặt lính canh

Kỹ thuật đặt lính canh

int Tim_x (int x, int a[], int n)

 Kỹ thuật này thường được áp dụng cho

{ a[n] = x; // đặt lính canh

những bài tập về “tìm kiếm”, “liệt kê” theo

int i = 0;

một điều kiện nhất định nào đó.

while ( a[i] != x ) i++;

 Viết hàm tìm phần tử x có xuất hiện trong

if (i

mảng một chiều các số nguyên hay

return -1;

không? Nếu có trả về vị trí của x trong

}

mảng, ngược lại trả về -1.

5/3/2013 241 5/3/2013 242 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Kiểm tra

int Ktra_tontai(int a[], int n)

Kiểm tra int Ktra_voimoi(int a[], int n)

{

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

{

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

if (a[i] thoa dieu kien)

if (a[i] khong thoa dieu kien)

return 1;

return 0;

return 0;

return 1;

}

}

61

5/3/2013 243 5/3/2013 244 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Kỹ thuật đặt cờ hiệu

Kỹ thuật đặt cờ hiệu

 Kỹ thuật này thường được áp dụng cho

int Ktra_tang (int a[ ], int n) {

những bài toán “kiểm tra” hay “đánh dấu”.

int flag = 1; for (int i = 0; i < n-1; i ++ )

 Ví dụ: Viết hàm kiểm tra xem mảng các

số nguyên có thứ tự tăng dần không?

if(a[i] > a[i+1]) //Vi phạm ĐK tăng dần {

(Hàm này trả về 1 nếu mảng tăng dần,

flag = 0; break;

}

ngược lại trả về 0).

return flag;

}

5/3/2013 245 5/3/2013 246 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Min/ Max

Sắp xếp

void Sap_tang (int a[], int n)

int Tim_min(int a[], int n)

{

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

{

int min = a[0];

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

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

if (a[i] > a [j])

if (a[i] < min)

Hoanvi (a[i], a[j]);

min = a[i];

}

return min;

}

62

5/3/2013 247 5/3/2013 248 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Xóa

Sắp xếp

void Sap_giam (int a[], int n)

 Duyệt mảng từ trái sang phải. Xuất phát

{

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

từ vị trí cần xóa tiến hành dời lần lượt các

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

phần tử về phía trước cho đến khi kết

if (a[i] < a [j])

thúc mảng, sau đó giảm kích thước

Hoanvi (a[i], a[j]);

mảng.

}

 Vấn đề đặt ra là tìm vị trí cần xóa theo

điều kiện bài toán rồi thực hiện xóa.

5/3/2013 249 5/3/2013 250 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Xóa

Xóa

 Viết hàm xóa phần tử đầu tiên của mảng.

 Viết hàm xóa phần tử tại vị trí (vitri) cho

void Xoa_dau (int a[], int &n)

trước trong mảng.

{

void Xoa_taivitri (int a[], int &n, int vitri)

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

{

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

a[i] = a[i+1];

a[i] = a[i+1];

n--;

n--;

}

}

63

5/3/2013 251 5/3/2013 252 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Chèn

Chèn

 Thêm phần tử có giá trị X vào cuối mảng.

 Duyệt mảng từ phải sang trái. Xuất phát

void ThemCuoi (int a[], int &n, int X)

từ cuối mảng tiến hành đẩy lần lượt các

{

phần tử về phía sau cho đến vị trí cần

a[n]=X;

chèn, chèn phần tử cần chèn vào vị trí

n++;

chèn và tăng kích thước mảng.

}

 Trước khi chèn ta phải xác định vị trí cần

chèn theo điều kiện bài toán.

5/3/2013 253 5/3/2013 254 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Chèn

Tách/ ghép mảng

 Chèn phần tử có giá trị X vào mảng tại vị

 Cho mảng a kích thước n (n chẵn). Tách

trí k cho trước

mảng a thành 2 mảng b và c sao cho: b

void Chenx (int a[], int &n, int X, int k)

có ½ phần tử đầu của mảng a, ½ phần tử

{

for (int i = n; i >k ; i--)

còn lại đưa vào mảng c.

a[i] = a[i-1] ;

a[k] = X;

n++;

}

64

5/3/2013 255 5/3/2013 256 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Tách/ ghép mảng

Tách/ ghép mảng  Cho 2 mảng số nguyên a và b kích thước

void Tachmg(int a[], int n, int b[], int &m, int c[], int &l)

lần lượt là n và m. Viết chương trình nối

{

int k=n/2;

mảng b vào cuối mảng a.

m = l = 0;

void Noi_mang(int a[], int &n, int b[], int m)

for(int i=0; i

{

for(int i=0; i

{ b[m++] = a[i];

a[n+i]= b[i];

c[l++] = a[k+i]

n = n + m;

}

}

}

5/3/2013 5/3/2013 257 258 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Chuỗi ký tự

Khái niệm

 Khái niệm

 Chuỗi ký tự là một dãy các phần tử, mỗi

phần tử có kiểu ký tự.

 Khai báo

 Các thao tác trên chuỗi

 Lưu ý: Chuỗi ký tự được kết thúc bằng ký

tự ‘\0’. Do đó khi khai báo độ dài của

 Các hàm thư viện (string.h)

chuỗi luôn luôn khai báo dư 1 phần tử để

chứa ký tự ‘\0’.

65

5/3/2013 259 5/3/2013 260 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Khai báo

Khái niệm

 Để khai báo một chuỗi, ta có 2 cách khai

 Ví dụ: char S[5] = “CNTT” //khai báo chuỗi

báo sau:

có 5 phần tử kiểu char và gán dãy ký tự

 Cách 1: Con trỏ hằng

CNTT vào chuỗi.

C

N

T

T

\0

char < Tên chuỗi > [< Số ký tự tối đa của

Phần tử

Phần tử

Phần tử

Phần tử

Phần tử

chuỗi >] ;

S[0]

S[1]

S[2]

S[3]

S[4]

 Ví dụ: char S[25];

 Chuỗi rỗng là chuỗi chưa có ký tự nào

trong mảng ký hiệu “”

5/3/2013 261 5/3/2013 262 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Khai báo

Các thao tác trên chuỗi

 Cách 2: Con trỏ

 Nhập chuỗi

char *< Tên chuỗi >;

 Cú pháp:

 Ví dụ: char *S;

char *gets(char *s);

 Nhận các ký tự nhập từ phím cho đến khi

nhấn phím Enter và đưa vào s.

66

5/3/2013 263 5/3/2013 264 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Xuất chuỗi

Nhập chuỗi

 Cú pháp:

 Ví dụ:

int puts (const char *s); //Xuất chuỗi s ra

void main()

màn hình.

{ char chuoi[80];

 Ví dụ:

printf("Nhap vao chuoi:");

void main()

gets(chuoi);

{ char chuoi[] = "Vi du xuat chuoi\n";

printf("Chuoi vua nhap la: %s\n", chuoi);

puts(chuoi);

}

}

5/3/2013 5/3/2013 265 266 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan

Các hàm thư viện (string.h)

Các hàm thư viện (string.h)

TÊN HÀM

CHỨC NĂNG

int strlen(char s[]);

trả về độ dài của chuỗi s.

TÊN HÀM strncat(char s1[],char s2[],int n)

strcpy(char dest[], char src[]);

Sao chép nội dung chuỗi src vào chuỗi dest.

int strcmp(char s1[],char s2[])

strncpy(char dest[], char src[], int n);

Chép n ký tự từ chuỗi src sang chuỗi dest. Nếu chiều dài src < n thì hàm sẽ điền khoảng trắng cho đủ n ký tự vào dest.

Nối chuỗi s2 vài chuỗi s1.

strcat(char s1[], char s2[]);

int strncmp(char s1[],char s2[], int n)

CHỨC NĂNG Nối n ký tự đầu tiên của chuỗi s2 vào chuỗi s1. So sánh 2 chuỗi s1 và s2 theo nguyên tắc thứ tự từ điển. Phân biệt chữ hoa và thường. trả về: 0 : nếu s1 bằng s2. >0: nếu s1 lớn hơn s2. <0: nếu s1 nhỏ hơn s2. Tương tự như strcmp(), nhưng chỉ so sánh n ký tự đầu tiên của hai chuỗi.

67

5/3/2013 267 Nguyễn Thị Thúy Loan

Các hàm thư viện (string.h)

Các hàm thư viện (string.h)

TÊN HÀM

CHỨC NĂNG

TÊN HÀM int stricmp(char s1[],char s2[])

CHỨC NĂNG Tương tự như strcmp(), nhưng không phân biệt hoa thường.

Tìm sự xuất hiện đầu tiên của

chuỗi s2 trong chuỗi s1. trả

int strnicmp(char s1[],char s2[], int n);

về:

char *strstr(char s1[],

Tương tự như stricmp(), nhưng chỉ so sánh n ký tự đầu tiên của hai chuỗi.

char s2[]);

NULL: nếu không có.

Ngược lại: Địa chỉ bắt đầu

char *strchr(char s[], char c);

chuỗi s2 trong s1.

Tìm lần xuất hiện đầu tiên của ký tư c trong chuỗi s. trả về: NULL: nếu không có. Địa chỉ c: nếu tìm thấy.

68

5/3/2013 269 5/3/2013 270 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan