Tin học cơ sở 3 (NGÔN NGỮ LẬP TRÌNH C)

Tài li uệ ậ ậ

t,

• Ph m Văn  ạ

ậ ả

ơ ở Ấ  K  thu t l p trình C C  s   i,

ỹ và nâng cao, NXB Giao thông V n t 2006.

ả ớ ộ

ế ạ ọ

• Bùi Th  Duy, L p trình căn b n v i C,  ố NXB Đ i h c Qu c gia Hà n i, 2012.

2

ữ ậ

ề Bài 1: T ng quan v  ngôn ng  l p  trình C • Ngôn ng  C có m t s  các đ c đi m n i  ổ ộ ố

ữ ậ

ữ ậ b t sau : – C là ngôn ng  l p trình có c u trúc và phân  ữ ườ

t ch  Hoa – ch  th

bi

ệ – M t ch ộ ặ

ữ ươ ề

ấ ng. ồ ờ  cũng g m m t  ng trình C bao gi ờ ho c nhi u hàm và các hàm r i nhau.

3

ướ

ườ

ế ợ

I. H ng d n cài đ t môi tr

ng k t h p Dev C

ặ ả ạ

1. Download b n Dev C++ 4.9.9.2 full 2. Cài đ t: ặ Ch y file cài đ t DEV­C++ (file

devcpp.exe)

3. Vào menu "Tools" ch n "ọ Compiler Options".

­

Linker"

ấ ổ

­

Vào tab "Settings" tab, nh n vào " ố ở  khung bên trái và thay đ i thông s   "Generate debugging information" sang  "Yes": Nh n ấ OK

4

ẫ ử ụ

ướ

ươ

ế ợ

II. H ng d n s  d ng môi tr

ng k t h p Dev C

ớ File ­> New ­> Source File

ở ộ 1. Kh i đ ng ở 2. M  File ở ở

M  file m i :  M  file đã có:

File ­> Open

1. Ghi File

File\ Save (Ctrl+S) : Ghi t p m i đang so n th o

vào đĩa

File\ Save as : Ghi t p đang so n th o vào đĩa

ạ ệ

ệ ặ theo tên m i ho c đe lên t p đã có

5

ươ

ng trình

ộ ị

Execute\ Compile (Ctrl+F9) ươ Execute\ Run

ng trình:

• Ch y m t ch –  Biên d ch:  – Th c thi ch ự (Ctrl+F10) • Thoát kh i Dev C ỏ – Thoát h n kh i C:  ẳ

File \ Exit

6

ướ ậ

III. Các b

c l p trình

• B ướ ặ

ậ ử

ề ị c 1: Phân tích v n đ  và xác đ nh các  ị đ c đi m. (xác đ nh I­P­O : Input­Pprocess­ ấ ) Output (Quy trình nh p­x  lý­xu t) ả

ư i pháp. (đ a ra thu t

Đ a ư ra gi

c 2:

ng trình)

ươ ế ặ t ch c 3: Cài đ t. (vi ươ ng trình D ch ch c 4:  ệ ứ ể Ch y kạ i m ch ng và hoàn thi n  c 5:  ề ố ệ ử ng trình. (th  nghi m b ng nhi u s

• B ướ i)ả gi • B ướ • B ướ • B ướ ươ ch ệ li u và đánh giá)

7

ướ ậ

III. Các b

c l p trình

• Ví dụ

– Thu t toán gi ậ

ấ i PT b c nh t: ax + b = 0

ả ố ự

(a, b là các s  th c).

Đầu vào: a, b thuộc R Đầu ra: nghiệm phương trình ax + b = 0

• Nếu a = 0

• b = 0 thì phương trình có nghiệm bất kì. • b ≠ 0 thì phương trình vô nghiệm.

• Nếu a ≠ 0

• Phương trình có nghiệm duy nhất x = -b/a

Sử dụng lưu đồ - sơ đồ khối

Bắt đầu

Đọc a,b

Đ

S

a = 0

Đ

S

b = 0

Tính x = -b/a

Xuất x

Xuất “Vô số nghiệm”

Xuất “Vô nghiệm”

Kết thúc

ử ụ

ể ể

ượ

S  d ng mã gi • Vay m n ngôn ng  nào đó đ  bi u di n  ữ

thu t toán.

Đầu vào: a, b thuộc R Đầu ra: nghiệm phương trình ax + b = 0

If a = 0

If b = 0

Xuất “Phương trình vô số nghiệm”

Else

Xuất “Phương trình vô nghiệm”

Else

Xuất “Phương trình có nghiệm x = -b/a”

Bài t pậ

ươ

ng

ổ ừ ề

ti n VND sang ti n USD. ể

ề ủ ọ

ươ

ng trình b c 2: ax

2  + bx + c = 0

ả ể

Xác đ nh Input, Process, Output c a các ch trình sau: 1. Đ i t 2. Tính đi m trung bình c a h c sinh g m các môn  Toán, Lý, Hóa. ậ i ph 3. Gi ố 4. Ki m tra 2 s  a, b gi ng nhau hay khác nhau.

11

ữ ậ

i thi u ngôn ng  l p trình C

IV. Gi 1. Các thành ph n c a NNLT C

ệ ầ ủ ự

+ ­ * / = ( )

ố ặ

ư

t khác nh  : . , ; : [ ] { } ? ! \ & | % # $,…

là các t

ể ử ụ

– T p các ký t ậ • Ch  cái: A .. Z, a .. z ữ • Ch  s   ữ ố Ả ậ  r p: 0..9 • Ký hi u toán h c : ệ • Ký t ự ạ  g ch n i: _ • Các ký hi u đ c bi – T  khóa ừ => Không th  s  d ng t

để đặt tên cho bi n, hàm, tên ch

ồ ạ ướ ạ i d

ữ  dành riêng trong ngôn ng . ừ ế  khóa  i d ng hàm

, không t n t

ồ ạ ướ ạ i d

ương  ủ i d ng th

trình con (t n t t c).ụ

• Char, do, int, float, for, do, While,…

ữ ố

ư

các ch  cái và các ch  s  , nh ng b t

dùng đ  ch  tên. ừ c t o thành t ữ

ể ỉ ữ ặ ấ

bu c ch  đ u ph i là ch  cái ho c d u _.

12

ả ủ

i đa c a m t tên là 255 ký t

, và

không cho phép có

– Tên file (t p)ệ   • Tên file là m t dãy ký t • Tên t p đ ệ ượ ạ ữ ầ ộ • S  ký t ự ố ố  t ắ

kho ng tr ng.

• Ví d  tên t p ệ ụ – Các tên h p l ợ ệ : GiaiPhuongTrinh, Bai_Tap1 – Các tên không h p l ợ ệ : 1A, Giai Phuong Trinh – Tên cũng phân bi ữ ườ , do  ữ ệ

t ch  hoa ch  th

ng

đó các tên sau đây khác nhau: • BaiTap khác baitap, …

ữ ậ

Gi

i thi u ngôn ng  l p trình C

V. C u trúc m t ch

ng trình trong NNLT

ươ ườ

ươ C ậ ng là t p h p

• M t ch ộ ng trình th ợ các câu l nhệ , có th  ể

ặ có ho c không có các ghi chú.

ượ ữ ặ ế ặ • Trong C, ghi chú đ c đ t gi a c p /* và */, n u chú thích

cho dòng dùng 2 d u //ấ

ươ ể ỉ ẫ ề ị • Ch ng  trình  còn  có  th   có các  ch   d n  ti n  biên  d ch

ượ ự ệ ướ ươ ượ ị (đ c  th c  hi n  tr c  khi  ch ng  trình  đ c  biên  d ch,

14

ư ệ ử ụ ể VD: ch  d n ỉ ẫ #include đ  khai báo s  d ng th  vi n.

Cấu trúc chương trình C

// Khai báo thư viện // Hàm chính

#include “…” int main() {

// Khai báo biến hàm

int x; int Nhap(); // Khai báo hàm … // Các lệnh

}

ừ include, stdio.h, void, main, printf,…  ế ằ t b ng ch  th

ng. là chu i ỗ c n in ra "B n có

ể ế

t ch  HOA, th

ng tùy

ý".

ế

ế

, hay //

c bao b i c p

Chú ý:  Các t ữ ườ ả ph i vi  Chu i trong nháy kép  ườ ữ th  vi  K t thúc câu l nh ph i có d u ch m ph y ẩ  (;).  K t thúc tên hàm không có d u ch m ph y ho c  ặ ẩ ấ ứ ấ b t c  d u gì.  Ghi chú ph i đ t trong c p /* …. */ ả ặ  Thân hàm ph i đ ở ặ { }. ả ượ

16

Ví dụ

#include #include

int main() {

int x, y, tong; printf(“Nhap hai so nguyen: ”); scanf(“%d %d”, &x, &y); tong = x + y; printf(“Tong hai so la %d”, tong); getch();

ữ ậ

Gi

i thi u ngôn ng  l p trình C

}

ộ ố ư ệ

M t s  th  vi n trong Dev C

ra màn hình.

ệ ệ

ế

system(“cls”),…

ỗ Char,…

­ stdio.h  : Ch a các hàm vào/ ra chu n (standard  input/output). G mồ :  printf(), scanf(), getc(), putc(), gets(), puts(), … ự ể + L nh printf:  dùng đ  in ký t ể + l nh scanf:  dùng đ  nh p giá tr  vào cho bi n. ứ getch(), getche(), putch(), … ­ conio.h  : Ch a hàm  ­math.h: Th  vi n ch a các hàm tính toán g m các hàm  ứ ư ệ abs(), sqrt(), log(),… ứ ­ windows.h: Ch a hàm xóa màn hình:  ­String.h: Ch a các hàm v  chu i:

ữ ậ

Gi

i thi u ngôn ng  l p trình C

&

VC

ữ ệ

ơ ở

ể Bài 2. Các ki u d  li u c  s

BB

C có 4 kiểu cơ sở như sau:

 Kiểu số nguyên (int): giá trị của nó là các số

nguyên như : -2, 10,…

 Kiểu số thực(float): giá trị của nó là các số

thực như 3.14, 29.12, -17.06, …

 Kiểu logic(bool): giá trị đúng hoặc sai.  Kiểu ký tự(char): 256 ký tự trong bảng mã

ASCII.

1919

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

ướ

ữ ệ

ơ ở

Kích th

ể c c a các ki u d  li u c  s

BB

2020

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

1. Ki u Logic (bool)

BB

Đặc điểm

 C ngầm định một cách không tường minh:

Ví dụ

1 > 2 => trả về (0, false), 1 < 2 => trả về (1, true)

2121

ữ ệ

ơ ở

Các ki u d  li u c  s

• false (sai): giá trị 0. • true (đúng): giá trị khác 0, thường là 1.

&

VC

ể 2. Ki u ký t

(char)

BB

Đặc điểm

 Tên kiểu: char  Miền giá trị: 256 ký tự trong bảng mã ASCII.  Kiểu ký tự chính là kiểu số nguyên do:

• Lưu tất cả dữ liệu ở dạng số. • Không lưu trực tiếp ký tự mà chỉ lưu mã ASCII của

Ví dụ

 Lưu số 65 tương đương với ký tự ‘A’…  Lưu số 97 tương đương với ký tự ‘a’.

2222

ữ ệ

ơ ở

Các ki u d  li u c  s

ký tự đó.

&

VC

3. Bi nế

BB

Cú pháp khai báo biến ; , ;

2323

ữ ệ

ơ ở

Các ki u d  li u c  s

Ví dụ int i; int j, k; char dem; float ketqua, delta;

&

VC

ằ 4.H ng s

BB

Cú pháp khai báo = ;

2424

ữ ệ

ơ ở

Các ki u d  li u c  s

Ví dụ int a = 1506; float d = 15.06;

&

VC

ằ 4.H ng s

BB

Cú pháp định nghĩa #define hoặc sử dụng từ khóa const.

//hoặc

2525

ữ ệ

ơ ở

Các ki u d  li u c  s

Ví dụ #define MAX 100 #define PI 3.14 const int MAX = 100; const float PI = 3.14;

&

VC

ể 5. Bi u th c

BB

Khái niệm

 Biểu thức được tạo thành từ các toán tử (Operator) và các toán hạng (Operand).

 Toán tử: +, –, *, /, % (lấy phần dư)….  Toán hạng: hằng, biến, lời gọi hàm...

Ví dụ

 2 + 3, a / 5, (a + b) * 5, …

2626

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

a. Toán t

gán

BB

Khái niệm

 Toán tử gán thường được sử dụng trong lập

trình. Dùng để gán giá trị cho biến.

Cú pháp

= ; a=10;  = ; b=a;  = ; thuong=a/b;  Có thể thực hiện liên tiếp phép gán. a=b=c=d=12;

2727

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

b. Các toán t

toán h c

BB Toán tử 1 ngôi

 Chỉ có một toán hạng trong biểu thức.  ++ (tăng 1 đơn vị), -- (giảm 1 đơn vị)  Toán tử đặt trước toán hạng => thực hiện

trước. • Ví dụ ++x hay --x: thực hiện tăng/giảm trước.  Toán tử đặt sau toán hạng=> thực hiện sau: • Ví dụ x++ hay x--: thực hiện tăng/giảm sau.

Ví dụ

 x = 10; y = x++;  x = 10; y = ++x;

// y = 10 và x = 11 // x = 11 và y = 11

2828

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

ườ

c. Các toán t

quan h  (th

ng đi v i if)

BB

Các toán tử quan hệ

 So sánh 2 biểu thức với nhau  Cho ra kết quả 0 (hay false nếu sai) hoặc 1

(hay true nếu đúng)

 ==, >, <, >= , <=, != VD: if (a==b)

Ví dụ

 s1 = (1 == 2);  s3 = (1 > 2);  s5 = (1 < 2);

s2 = (1 != 2); s4 = (1 >= 2); s6 = (1 <= 2);

2929

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

d. Các toán t

logic

BB

Các toán tử Logic

 Tổ hợp nhiều biểu thức quan hệ với nhau.  && (and), || (or), ! (not)

0

1

0

1

||

&&

0

0

0

0

0

1

1

1

0

1

1

1

 Ví dụ

3030

ữ ệ

ơ ở

Các ki u d  li u c  s

• s1 = (1 > 2) && (3 > 4); • s2 = (1 > 2) || (3 > 4); • s3 = !(1 > 2);

&

VC

5. Câu l nhệ

BB

Khái niệm

 Câu lệnh là một chỉ thị trực tiếp, nhằm ra lệnh cho máy tính thực hiện một số tác vụ nhất định nào đó.

 Trình biên dịch bỏ qua các khoảng trắng (hay

tab hoặc xuống dòng) chen giữa lệnh.

Ví dụ sau cho kết quả như nhau

a=2912; a = 2912; a = 2912;

3131

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

ế

ệ 5. Câu l nh (ti p)

BB

Phân loại

 Câu lệnh đơn: chỉ gồm một câu lệnh.  Câu lệnh phức (khối lệnh): gồm nhiều câu

lệnh đơn được bao bởi { và }

Ví dụ

a = 2912;

// Câu lệnh đơn

// Câu lệnh phức/khối lệnh

{

a = 2912; b = 1706;

}

3232

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

a. Câu l nh ệ

xu tấ

BB  Câu lênh xuất thuộc thư viện stdio.h

 #include (standard input/output)

 Cú pháp

 printf([, <đối số1>, <đối số 2>, …]);  là cách trình bày thông tin xuất và

- Xác định kiểu của biến/giá trị muốn xuất. - Các đối số chính là các biến/giá trị muốn xuất, được liệt kê theo thứ tự cách nhau dấu phẩy.

3333

được đặt trong cặp nháy kép “ ” gồm: • Văn bản thường: printf(“Hello ”); • Ký tự điều khiển: printf(“\t Hello”); printf(“\n Hello”); • Đặc tả: - Gồm dấu % và một ký tự.

&

VC

ặ ả

B ng mô t

các đ c t

BB

Đ c tặ ả

Ý nghĩa

Ki uể

%c : %d, %ld : %f, %lf : %s : %u :

Ký tự ố S  nguyên ố ự S  th c ự ỗ Chu i ký t S  nguyên không d u

char int, long float, double char, string unsigned

3434

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

ỗ ị

Chu i đ nh d ng

BB

 Ví dụ

 int a = 10, b = 20;  printf(“%8d”, a); Xuất ra 10 và có 8 ô nhớ để lưu a.  printf(“%d và %d”, a, b);  Xuất ra “10 và 20”

 float x = 15.06567;  printf(“%10.2f”, x); Xuất ra 15.06, có 10 ô nhớ chứa

x, lấy sau dấu phẩy 2 số.

3535

ữ ệ

ơ ở

Các ki u d  li u c  s

 printf(“%.2f”, x);  Xuất ra 15.06

&

VC

b. Câu l nh ệ

nh pậ

BB

 Câu lênh nhập thuộc thư viện stdio.h

 #include (standard input/output)

 Cú pháp

 scanf([, <đối số 1>, <đối số 2>,…]);  giống định dạng xuất nhưng chỉ

có các đặc tả.

 Các đối số: là tên các biến sẽ chứa giá trị nhập và

3636

ữ ệ

ơ ở

Các ki u d  li u c  s

được đặt trước bởi dấu &

&

VC

Câu l nh nh p

BB

 Ví dụ, cho a và b kiểu số nguyên

// Nhập giá trị cho biến a

 scanf(“%d”, &a);  scanf(“%d%d”, &a, &b);  Chú ý: Khi nhập xâu kí tự thì không có dấu & trước

biến, vì bản thân tên xâu đã là con trỏ.

printf(“Cho mot xau ki tu: “); scanf(“%s”,st);

 Các câu lệnh sau đây sai

// Thiếu dấu &

// a là biến kiểu số nguyên

3737

ữ ệ

ơ ở

Các ki u d  li u c  s

• scanf(“%d”, a); • scanf(“%d”, &a, &b);// Thiếu %d cho biến b • scanf(“%f”, &a); • scanf(“%9d”, &a); // không được định dạng • scanf(“a = %d, b = %d”, &a, &b”);

&

VC

Bài t pậ

BB

Bài 1: Viết chương trình in ra màn hình các câu

chào khác nhau, mỗi câu trên một dòng.

Bài 2: Viết chương trình nhập vào 2 số nguyên dương rồi đưa ra: tổng, tích, hiệu của 2 số đó. Bài 3: Giả sử ta có x = 10; y = 20; z = 30; Hãy cho biết giá trị các biểu thức sau. Viết chương trình kiểm tra.  Bt1 = 2*(x – y++) + z*(++z – x*y);  Bt2 = (--x + --y + z--) * 2 + ++y*2;  Bt3 = (x << 2) + (y | 3 + z | 8) + 2;  Bt4 = ((x == y) && (x != z))

3838

&

VC

Bài t pậ

BB

5. Nhập năm sinh của một người và tính tuổi của người đó. 6.Nhập 2 số a và b. Tính tổng, hiệu, tính và thương của hai số đó. 7.Nhập tên sản phẩm, số lượng và đơn giá. Tính tiền và thuế giá trị gia tăng phải trả, biết:

a. b.

tiền = số lượng * đơn giá thuế giá trị gia tăng = 10% tiền

3939

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

Bài t pậ

BB

8. Nhập điểm thi 3 môn Toán, Lý, Hóa của một sinh viên. Tính điểm trung bình của chúng. 9.Nhập bán kính của đường tròn. Tính chu vi và diện tích của hình tròn đó.

4040

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

Bài t p 5ậ

BB

#include #include

int main() {

int NamSinh, Tuoi; printf(“Nhap nam sinh: ”); scanf(“%d”, &NamSinh); Tuoi = 2014 – NamSinh; printf(“Tuoi cua ban la %d\n”, Tuoi); getch();

}

4141

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

Bài t p 6ậ

BB

#include #include

int main() {

int a, b, Tong, Hieu, Tich, Thuong; printf(“Nhap hai so nguyen: ”); scanf(“%d%d”, &a, &b); Tong = a + b; Hieu = a – b; Tich = a * b; Thuong = a / b; printf(“Tong cua a va b: %d\n”, Tong); printf(“Hieu cua a va b: %d\n”, Hieu); printf(“Tich cua a va b: %d\n”, Tich); printf(“Thuong cua a va b: %d\n”, Thuong);

}

4242

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

Bài t p 7ậ

BB

#include #include

int main() {

int SoLuong, DonGia, Tien; float VAT;

printf(“Nhap so luong va don gia: ”); scanf(“%d%d”, &SoLuong, &DonGia); Tien = SoLuong * DonGia; VAT = Tien * 0.1; printf(“Tien phai tra: %d\n”, Tien); printf(“Thue phai tra: %.2f\n”, VAT);

}

4343

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

Bài t p 8ậ

BB

#include #include

int main() {

float T, L, H, DTB; int HsT, HsL, HsH; printf(“Nhap diem Toan, Ly, Hoa: ”); scanf(“%f%f%f”, &T, &L, &H); printf(“Nhap he so Toan, Ly, Hoa: ”); scanf(“%d%d%d”, &HsT, &HsL, &HsH); DTB = (T * HsT + L * HsL + H * HsH) /

(HsT + HsL + HsH);

printf(“DTB cua ban la: %.2f\n”, DTB);

}

4444

ữ ệ

ơ ở

Các ki u d  li u c  s

&

VC

Bài t p 9ậ

BB

#include #include #define PI 3.14

int main() {

float R, ChuVi, DienTich; printf(“Nhap ban kinh duong tron: ”); scanf(“%f”, &R); ChuVi = 2*PI*R; DienTich = PI*R*R; printf(“Chu vi: %.2f\n”, ChuVi); printf(“Dien tich: %.2f\n”, DienTich);

}

4545

ữ ệ

ơ ở

Các ki u d  li u c  s

Bài 3:  C u trúc đi u khi n

ấ ố ệ

• Câu l nh, kh i l nh

– Câu l nh: m i câu l nh th c hi n m t công vi c

ượ ế

ở ấ

và đ

c k t thúc b i d u ;

ắ ầ

ố ệ

– Kh i l nh: là t p h p các câu l nh b t đ u b ng

ế

ấ d u “{“ và k t thúc b ng d u “}”

46

I. C u trúc đi u khi n if ạ

1. C u trúc if d ng 1 (thi u)

ế if (bt) ứ ể

i s đ s ; ệ ơ ệ s, ng ị true thì th c hi n

Cú pháp:  ứ ặ ệ Ý nghĩa: bt là bi u th c lôgic,  s là l nh đ n ho c l nh ph c.  ượ ỏ ượ ạ ự ậ n u ế bt nh n giá tr   c b   c l qua ấ ạ

Cú pháp:

ủ 2. C u trúc if d ng 2 (đ ) if(bt)   s; else

s1 ;

ị true thì th c hi n s

ệ ậ

ể Ý nghĩa: bt là bi u th c lôgic,  ậ i n u  ể ơ

Chú ý : trong C cho phép s  d ng các c u trúc ự ế ỏ ệ  và b  qua s1 ,             ­ n u bt nh n giá tr   và b  ỏ ự ị flase thì th c hi n s1  ượ ạ ế bt nh n giá tr   c l            ­ ng ứ ặ ệ ệ qua s(s và s1 có th  là l nh đ n ho c l nh ph c) ể ồ ấ ử ụ if l ng nhau đ

47

ả ế gi i quy t bài toán

Ví dụ

{ int a, b; printf("Nhap vao so a: "); scanf("%d", &a); printf("Nhap vao so b: "); scanf("%d", &b); if (a>b)

printf("a lon hon b.\n"); else if (a

48

getch(); }

ự ố

Bài t pậ ừ  bàn phím. Tìm và in ra màn hình  ấ

ấ ươ

ậ ừ

i ph

ng trình b c nh t: ax+b=0; a,b nh p t

bàn

2+bx+c=0.

ươ ươ

ả ế

ủ hình c u đó.

ươ

ế

i ph t ch ệ t ch

ớ ổ

ậ ị

ố ậ 1.Nh p 2 s   th c a, b t ố ớ s  l n nh t và s  bé nh t. ả 2.Gi phím ậ 3. Gi ng trình b c hai: ax ậ 4. Vi ng trình nh p vào bán kính hình c u,  tính và   ầ in ra di n  tích, th  tích c a  ế ố 5. Vi ng trình nh p vào 2 s  nguyên a, b. N u a l n  ượ ạ ổ ơ h n b thì hoán đ i giá tr  a và b, ng i không hoán đ i.  c l In ra giá tr  a, b.

49

Bài t p (ti p)

ậ ố ế ươ

ỏ ơ ế

ế ng trình nh p vào 2 s  nguyên a, b. In ra thông báo  ế  a>b, in ra thông báo "a nh  h n b" n u a

ằ ế .

ộ ọ ủ ế ươ ng trình nh p vào đi m c a m t h c sinh. In ra

50

t ch 6. Vi ơ ớ "a l n h n b" n u  in ra thông báo "a b ng b" n u a=b ể ậ 7. Vi t ch ế ạ ọ ậ ủ ọ x p lo i h c t p c a h c sinh đó.  ạ :  ế Cách x p lo i ế ể ấ ắ N u đi m >= 9, Xu t s c.  ế ế ậ ừ ể i.  N u  đi m t  8 đ n c n 9, Gi ế ế  c n 8, Khá.  ừ ể ậ  7 đ n  N u đi m t ế ế ậ ừ ể  6 đ n c n 7, TBKhá.  N u đi m t ế ậ ừ ể ế  5 đ n c n 6, TBình.  N u đi m t ế   ạ i là Y u. Còn l

ẽ II. C u trúc r  nhánh switch ổ

ấ 1. C u trúc t ng quát Cú pháp:

switch (bt) {       case n1 : s1;

break;

case n2 : s2;      break; ....

case nk : sk;     break;

ể ặ default : printf(“Ko biet doc”); // có th  có ho c không

51

}

ị ể ể

,

Ý nghĩa: • Bt: là bi u th c toán h c có giá tr  ki u nguyên ọ • Ni(i=1..k): là các s  ki u nguyên, ki u h ng ký t ố ể

ứ ể ho c bi u th c

ơ

ặ ệ ệ

si sau case ni; ự

ng trình thoát kh i l nh switch sau khi th c

• Si(i=1..k): là các l nh đ n ho c l nh ph c ứ ệ • Giá tr  ị bt = ni thì th c hi n câu l nh  ự • Đ  ch ể ươ ệ

ệ ỏ ệ ợ

ộ ườ

hi n xong m t tr

ng h p, ta dùng l nh break. ườ

ợ ng h p

• default : g m các câu l nh th c hi n các tr

còn l

i.ạ

52

Ví dụ

ư ệ

{ int i; System(“cls”); /* l nh xóa màn hình trong th  vi n windows.h*/ printf("Nhap vao so 1, 2 ho c 3: "); scanf("%d", &i); switch(i) { case 3: printf("***"); break; case 2: printf("**"); break; case 1: printf("*"); break; } printf("An phim bat ky de ket thuc!\n"); getch(); }

53

Bài t pậ ừ

ộ ố 1. Vi bàn phím m t mã s  nguyên

ầ ng trình nh p vào t ộ

ươ t ch ư ộ ơ ấ 1: trình đ  s  c p ấ ộ 2 : trình đ  trung c p ộ ạ ọ 3: trình đ  Đ i h c ọ ộ 4: trình đ  Cao h c ộ ế ỹ 5: trình đ  Ti n s

ế ậ và đ a ra đánh gía trình đ  theo yêu c u: – – – – – – Các s  khác: Không xác đ nh ậ ố ộ ố ự ọ ủ ố nhiên, in ra màn hình tên g i c a s  trên

54

Nh p vào m t s  t lên màn hình.

Bài t pậ

ươ ứ ng  ng.

ậ ậ ươ ươ ng trình nh p vào tháng, in ra quý t ng trình nh p vào tháng, in ra tháng đó có bao

ậ t ch

ươ ế ố ng trình nh p vào 2 s  x, y và 1 trong 4 toán t ả ế

ế ế

ượ

ả ậ ậ

ế ờ ượ ạ c l

ườ ư ề ợ

55

ế t ch 2. Vi ế t ch 3. Vi nhiêu ngày. ử ế   4. Vi ế +, ­, *, /. N u là + thì in ra k t qu  x + y, n u là – thì in ra x  ế – y, n u là * thì in ra x * y, n u là / thì in ra x / y (n u y = 0  c). thì thông báo không chia đ ế ậ ươ t  ch 5.  Vi ng  trình  nh p  vào  đi m  3  môn  thi:  Toán,  Lý,  ủ ọ ế ổ Hóa c a h c sinh. N u t ng đi m >= 15 và không có môn  ề ế ướ nào  d i  4 thì  in k t qu   đ u. N u  đ u  mà các  môn đ u  ọ ề ơ ớ i in  i phê "H c đ u các môn", ng l n h n 5 thì in ra l ọ ng  h p  khác  là  "Thi  ra  "H c  ch a  đ u  các  môn",  các  tr ỏ h ng".

ố ậ

56

{ int x,y; char t; Nh p vào 2 s  x,y; ị fflush(stdin); dùng tránh b  trôi l nh; ậ  printf(“Nh p vào toán t  t: +, ­ ,* , / “); scanf("%c", &t); switch(t) { case '+': printf("%d + %d = %d", x, y, x+y); case '­': printf("%d ­ %d = %d", x, y, x­y); case '*': printf("%d * %d = %d", x, y, x*y); case '/':  {if(y!=0) printf("%d / %d = %.2f", x, y, (x/y)); else printf("Ko chia dc do y =0"); }} getch(); }

ệ III. Câu l nh l p for

1. Cú pháp:

for( ;  ; )  S ;

ặ ệ ộ ệ

ở ạ

ườ

ế

ơ ng là m t l nh gán kh i t o cho bi n đi u

Ý nghĩa:   S là l nh đ n ho c l nh ph c ứ ệ  bt1 : th

khi n (ể i=0).

ị ủ

 bt2: là bi u th c logic, giá tr  c a bi u th c lôgic này  ế ụ

ế ị

ế

ứ quy t đ nh vòng l p ti p t c hay k t thúc (

i

ị ụ ng là l nh gán có tác d ng làm thay đ i giá tr

 bt3: th ườ ề ế ủ c a bi n đi u khi n (

ể i++)

57

ệ bt1

ặ ị ủ bt2 ế bt2  có  giá  tr  ị false  thì  thoát  kh i  vòng  l p.

ự ệ ỏ ệ

ạ ộ Ho t đ ng: • B c 1: Th c hi n  ướ ự • B c 2: Tính toán, xác đ nh giá tr  c a  ướ • B c  3:  N u  ướ c l

Ng i ượ ạ bt2 có giá tr  ị true thì th c hi n câu l nh S.

ự ự ạ • B c  4:  sau  khi  th c  hi n i ệ ệ S  =>    th c  hi n  bt3  và  quay  l

ỉ ượ ắ ầ ộ ầ ự ệ ấ c th c hi n duy nh t m t l n khi b t đ u vòng ướ ướ c 2. b ậ Nh n xét:   ch  đ

l pặ

ể ượ ệ ặ ự    và  S  có  th   đ c  tính  toán  và  th c  hi n  l p

58

ề ầ nhi u l n .

ử ụ ặ

ể ắ ư ề ặ ả ẫ Chú ý khi s  d ng vòng l p for •  đ u có th  v ng m t nh ng v n ph i gi ữ

; ) ợ ệ ậ l • Tr

ạ ấ i d u (  ườ ng h p đ c bi ị ặ ố t  không có, thì luôn đ ặ ả ượ ệ c xem là nh n  break,

ỏ giá tr  true, mu n thoát kh i vòng l p ph i dùng l nh  ặ goto ho c return

ấ ồ

ể ặ ệ ươ ẽ ỏ ng trình s  thoát kh i vòng for sâu

ứ ệ ấ • Có th  dùng c u trúc các vòng for l ng nhau • Khi g p l nh break thì ch nh t còn ch a l nh break

ể ớ ệ ể • Trong vòng for có th  s  d ng l nh continue đ  chuy n t i chu

59

ớ ủ ể ử ụ ặ trình m i c a vòng l p

Ví dụ /* Chuong trinh in ra cau "Vi du su dung vong lap for" 3  l n*/ầ #include  #include  #define MSG "Vi du su dung vong lap for.\n" int main() { int i; for(i = 1; i<=3; i++) /hoac for(i = 1; i<=3; i+=1) printf("%s", MSG); getch(); }

60

ệ IV. Câu l nh while

1. Cú pháp :

While (bt) S; ể ề ệ ọ

ộ ệ ứ ặ ệ Ý nghĩa: bt là bi u th c lôgic (hay còn g i là đi u ki n  ộ l p),ặ  S là m t l nh  ho c m t dãy l nh

ạ ộ   Ho t đ ng ­ ướ

ể ế ị ủ bt.  N u  giá  tr   c a  ng c  l ị ủ bt=  ượ ạ  thì  thoát  i c  2,

­

ệ ượ c 1(L nh S có  ự c  th c

ế ề ướ ặ ề ầ ho c  không  đ ừ ầ ).  đ u

­ ệ ặ while => ta có th  dùng câu

61

ặ ị B c  1:  Xác  đ nh  giá  tr   c a  ướ true(<>0)  thì  chuy n  sang  b ỏ ặ kh i vòng l p ệ S sau đó quay v  b ự ướ B c 2: Th c hi n  ể ượ ệ ự th   đ c  th c  hi n  nhi u  l n,  ệ ầ hi n l n nào n u bt =false ngay t ể Chú ý : trong câu l nh l p  ố ỏ ể ệ l nh break đ  thoát kh i vòng l p theo ý mu n

Ví dụ

62

/* Chuong trinh tính tong cac so nguyen tu 1 den n */ #include  #include  int main() { int i = 0, n, tong = 0; printf("Nhap vao so n: "); scanf("%d", &n); while (i++ < n) tong = tong + i; //hoac tong += i; printf("Tong: %d", tong); getch(); }

V. Câu l nh do.. while

1. Cú pháp

do    S; while (bt); ộ

ơ

ứ bt là bi u ể

ệ ặ

ệ ệ

S

ế ị ủ bt. N u giá tr  c a  ượ ạ ướ c l c (1), ng

ị ủ bt = true  i thì thoát kh i

­

ượ

ấ c th c hi n ít nh t 1 l n trong câu

S luôn đ

ệ Ý nghĩa: S là m t câu l nh đ n ho c ph c,  ọ ứ th c lôgic (hay còn g i là đi u ki n l p) ạ ộ Ho t đ ng:  ­ (1) Th c hi n l nh  ­ ị (2) Xác đ nh giá tr  c a  ể thì chuy n sang b vòng l pặ L nh ệ l nhệ

63

Ví dụ

/* Chuong trinh kiem tra mat khau */ #include  # define PASSWORD  12345 int main() { int in; do { printf("Nhap vao password: "); scanf("%d", &in); } while (in != PASSWORD); }

64

So sánh các vòng l pặ

ườ ử ụ ế ượ ố ầ ặ ng s  d ng khi bi c s  l n l p xác t đ ­ Vòng l p ặ for th

ị đ nh.

ặ ử ụ ế ­ Vòng l p th ườ while, do…while s  d ng khi không bi ng t rõ

ố ầ ặ s  l n l p.

ứ ể ọ ­ Khi g i vòng  l p ế ặ while,  do…while:  N u bi u  th c  sai vòng

ẽ ượ ệ ầ ự ư ặ l p ặ while  s  không đ c th c hi n l n nào nh ng vòng l p

65

ệ ượ ự do…while th c hi n đ ầ c 1 l n.

ế ươ ố ủ 1. Vi t ch ng trình tính t ng c a n s  đ u tiên c a dãy s  sau:

ớ bàn phím.

ậ ừ ủ ố ế ế ươ 2. Vi 3. Vi d ng đ u ầ

ậ ừ

ố ẻ ừ

Bài t pậ ố ầ ủ ổ S = 1+1/2+1/3+1/4+...+1/n. ng trình tính n!. V i n nh p t ậ ổ ng trình tính t ng b c 3 c a N s  nguyên   bàn phím. ổ ng trình tính t ng bình ph

t 1 đ n ế n.

ế 4. Vi ớ ươ ng các s  l ấ ươ t ch ươ t ch ớ tiên. V i n nh p t ươ t ch V i n nh p t

ậ ừ  bàn phím (hàm mod là d u %). ẽ

ữ ậ ặ ậ ế ố 5. Dùng d u * v  hình ch  nh t đ c. 6.  Vi ng  trình  nh p  vào  N  s   nguyên,  đ m  xem  có  bao

nhiêu s  âm, bao nhiêu s  d

7.  Vi bàn phím có

66

ế ả ố ấ ươ t  ch ố ươ t ch ố ph i là s  nguyên t ế ố ươ ố không. ng và bao nhiêu s   ậ ừ ố ể ng  trình  ki m  tra  s  nguyên  n  nh p  t  hay không.

G i ý bài 7

int main() { int n, i; bool SNT = false; printf("\nNhap vao N: ");  scanf("%d",&n); if (n > 1) { SNT = true; for (i = 2; i <= n/2; i++) if(n % i == 0) { SNT = false; break; } }

67

if (SNT == true) printf("%d la so nguyen to!",n); else printf("%d khong la so nguyen  to."); return 0; }

ươ

Bài 4: Hàm và ch

ng trình

1. Khái ni m ệ

ươ ươ ề ặ ộ ồ ng trình C bao g m m t ho c nhi u Ch ng trình ộ : M t ch

ủ ắ ầ ộ ươ hàm.  Hàm  main()  là  thành  ph n  b t  bu c  c a  ch ng  trình.

ươ ắ ầ ệ ừ ự ủ ệ ầ Ch ng trình b t đ u th c hi n t câu l nh đ u tiên c a hàm

ủ ặ ố ế main( ) cho đ n khi g p d u ấ } cu i cùng c a hàm này.

ạ ươ ộ ậ ự ệ ẹ ọ ng trình đ c l p th c hi n tr n v n ộ Hàm: Là m t đo n ch

ả ề ộ ệ ồ ộ ị ươ ọ m t công vi c r i tr  v  m t giá tr  cho ch ng trình đã g i

nó.

ủ ể ặ Đ c đi m c a hàm:

68

ị ộ ậ ủ ộ ơ ươ – Là m t đ n v  đ c l p c a ch ng trình.

ự ộ ộ – Không  cho  phép  xây  d ng  m t  hàm  bên  trong  m t  hàm

khác.

ướ

t hàm

ế c vi Các b • C n xác đ nh các thông tin sau đây: ị

Đầu vào 1

Tên hàm

Đầu vào 2

Đầu ra (nếu có)

Đầu vào n

Các công việc sẽ thực hiện

ầ ầ – Tên hàm. – Hàm s  th c hi n công vi c gì. ệ ẽ ự – Các đ u vào (n u có). ế ầ – Đ u ra (n u có). ế

ầ t hàm

ằ ọ • Lý do c n vi ­ Cho phép s  d ng hàm

ả ế ở ử ụ ầ hàm (không c n ph i vi ỗ ề  nhi u ch  khác nhau b ng cách g i  ế ạ t l i hàm)

ự ắ ầ ồ ộ M t hàm g m có các thành ph n 2. Quy t c xây d ng hàm:

sau:

ẫ ủ Bao g mồ ­ Khái báo nguyên m u c a hàm:

ủ ố ể  ;

ấ ả ủ ẫ ­ T t  c   nguyên  m u  c a  các hàm  (khác  hàm  main())  có

ươ ặ ướ ế trong  ch ng  trình  nên  đ t  tr c  hàm main(),  n u  hàm

ượ ế đ c  vi t  sau  hàm ầ main()  thì  không  c n  khai  báo  nguyên

70

m u.ẫ

Ngôn ngữ lập trình C

71

ủ C u trúc c a m t hàm

ể ả ề ố ố ố

ế ụ ộ   () {

; ; ả ề [return];

}

ể char, int, long, float,

­ ki u tr  v  : ế ấ ỳ ủ …). N u không tr  v  thì là void

ể ả ề  ki u b t k  c a C ( ả ề ố ố là các đ i s  đ ố ố ượ ấ ừ ỗ  ch c l y t ­ ds tham s  hay đ i s :  ố

72

khác (hàm khác: VD hàm main( )).

ề ố ố

3. Các cách truy n đ i s ể

ị ế ế ề ề ị ố Ki u tham s : ị ề + Tham tr  : truy n theo giá tr . ỉ + Tham bi n : truy n theo đ a ch ỉ + Tham chi u : truy n theo đ a ch

d ng giá tr

ị.

ỉ ẽ

ị a. Truy n tham tr   – Truy n đ i s  cho hàm  ở ạ ố ố – Có th  truy n h ng, bi n, bi u th c nh ng  ế ề

ư hàm ch  s  nh n

ề ể giá trị.

ị ủ

không có nhu c u thay đ i giá tr  c a tham

– Đ c s  d ng khi  ượ ử ụ ệ

ự số sau khi th c hi n hàm.

int TruyenThamTri(int x) x được nhập từ hàm khác {

… x++;

}

ề ố ố

ế ị

ố địa chỉ (con tr ).ỏ

ề ố

ầ nhu c u thay ị ủ đổi giá tr  c a tham s ố

3. Các cách truy n đ i s ỉ ề b. Truy n Tham bi n – đ a ch – Truy n ề đối s  cho hàm  ở ạ  d ng  – Không được truy n giá tr ị cho tham s  này. – Được s  d ng khi có  ử ụ ự sau khi th c hi n hàm.

int TruyenDiaChi(int *x) {

… *x++;

}

Hàm

ề ố ố

3. Các cách truy n đ i s

ế ề

ở ạ ị ượ d ng đ a ch ỏ ỉ (con tr ). Đ c

ượ ượ ử ụ ố ổ ầ ủ c. Truy n Tham chi u  – Truy n đ i s  cho hàm  ố ố ề ằ & trong khai báo. ắ ầ b t đ u b ng  – Không đ ề c truy n giá tr – Đ c s  d ng khi ị cho tham s  này. có nhu c u thay đ i giá tr ố ị c a tham s

ệ ự sau khi th c hi n hàm.

int TruyenThamChieu(int &x) {

… x++;

}

Hàm

ề ố ố

ư

L u ý khi truy n đ i s

• Lưu ý

ề ể ề ộ ố – Trong m t hàm, các tham s  có th  truy n theo nhi u

ộ ị ủ cách. – S  d ng  ử ụ

ố ử ụ

ộ ố ạ

Hàm

ề để tr  v  giá tr  c a  ả ề tham chi u ế là m t cách   giá tr  ị c a ủ hàm cho chương trình. Mu n s  d ng các   HÀM  sau  khi  ch y  HÀM  cho  m t  s   hàm  khác  => ế . dùng truy n tham chi u

ờ ọ

ị L i g i hàm (tham tr ) ố ố

 (<đ i s  1>

ố ố ,… , <đ i s  n>

);

a,b được lấy từ hàm main => truyền vào đối số của hàm HoanVi

#include #include int HoanVi(int a, int b);

int HoanVi(int a, int b) {

int tam;

tam = a; a = b; b = tam; printf("\sau khi hoan vi ta co x=%d , y=%d",a,b); return 0; }

int main() { int x,y; printf("nhap x:"); scanf("%d",&x); printf("nhap y:"); scanf("%d",&y); HoanVi(x, y); printf(“%d va %d”,x,y); getch(); }

ờ ọ

ế

L i g i hàm (tham chi u)

int HoanVi(int &a, int &b);

int HoanVi(int &a, int &b) {

int tam;

tam = a; a = b; b = tam; In giá trị a,b;

}

int main() { int x,y; printf("nhap x:"); scanf("%d",&x); printf("nhap y:"); scanf("%d",&y); HoanVi(x, y); printf("%d va %d",x,y); getch(); }

Hàm

79

Hàm

• Ví d  1ụ

ấ ổ

không có

– Tên hàm: XuatTong – Công vi c: ệ tính và xu t t ng 2 s  nguyên – Đ u vào:  ầ hai s  nguyên x và y – Đ u ra:  ầ void XuatTong(int x, int y) {

int s; s = x + y; printf(“%d cong %d bang %d”, x, y, s);

}

Hàm

Hàm

• Ví d  2ụ

ả ề ổ

– Tên hàm: TinhTong – Công vi c: ệ tính và tr  v  t ng 2 s  nguyên – Đ u vào:  ố ầ hai s  nguyên x và y – Đ u ra:  ộ ố ầ

m t s  nguyên có giá tr :  s= x + y

int TinhTong(int x, int y) {

int s; s = x + y; return s;

}

Hàm

Hàm

• Ví d  3ụ

ấ ổ

không có

– Tên hàm: NhapXuatTong – Công vi c: ệ nh p và xu t t ng 2 s  nguyên – Đ u vào:  ầ – Đ u ra:  ầ

không có

void NhapXuatTong() {

int x, y; printf(“Nhap 2 so nguyen: ”); scanf(“%d%d”, &x, &y); printf(“%d cong %d bang %d”, x, y, x + y);

}

Hàm

Bài t pậ

ế 1. Vi t hàm tính n!

ế ổ 2. Vi t hàm tính t ng S = 1+2+….+n.

ế 3. Vi t hàm tính n!+m!

3+y3. v i x,y nh p t

ớ 4. Vi

83

ăng d n.ầ ươ i ph i ph ế ổ ế ế ế ế ẻ ố ế 5. Vi 6. Vi 7. Vi 8. Vi ậ ừ  bàn phím. t hàm tính S=x ấ ậ ương trình b c nh t. ả t hàm gi ậ ương trình b c hai. ả t hàm gi ắ t hàm s p x p 4 s  nguyên t t hàm tính t ng các s  nguyên d ng l .

Bài 5: M ngả

• Ví dụ

ố – Chương trình c n lầ ưu tr  ữ 3 s  nguyên?

=> Khai báo 3 bi n ế int a1, a2, a3; ố

ể ố ố ố – Chương trình c n lầ ưu tr  ữ 100 s  nguyên? ế => Khai báo 100 bi n ki u s  nguyên! ậ n s  nguyên?

ự ệ được!

• Gi

– Người dùng mu n nh p  => Không th c hi n  ả i pháp ả ố – M ng cho phép ữ ộ lưu tr  m t dãy các s  nguyên và ễ d  dàng

84

truy xu tấ .

M ngả

1. Khái ni m:ệ • M ng đ ượ ả

ộ ậ ằ

ế

có cùng ki u d  li u n m liên ti p nhau

ữ ể ữ ệ ủ

trong m ng

ướ ủ

ị ể c hi u là m t t p h p các giá tr   ể ữ ệ • M ng có nh ng thành ph n sau: – Ki u d  li u c a các ph n t ầ ử – Tên m ngả – S  chi u và kích th ề

ề ỗ c c a m i chi u

10

15

16

18

2

6

85

ế

2. Cách khai báo bi n m ng

ề ủ

 

VD:

ầ ử ể ố

ki u s  nguyên

ầ ử

// M ng 2 chi u B g m 2 hàng và 3 c t, các ph n t

int A[10];  ồ ề //m ng 1 chi u A g m 10 ph n t float B[2] [3]; ề ả ể ố ự ki u s  th c

86

ở ạ

ị Kh i t o giá tr  cho m ng lúc  khai báo

• G m các cách sau ở ạ

ầ ử ủ

ồ – Kh i t o giá tr  cho m i ph n t ị

c a m ng

int a[4] = {2912, 1706, 1506, 1904};

0

1

2

3

a

2912

1706

1506

1904

int a[4] = {2912, 1706};

0

1

2

3

a

2912

1706

0

0

ộ M ng m t chi u

m ng

3. Cách t •

ị ả ướ ủ

ả ầ ượ

c c a m ng

ầ ử ả ấ ế ổ ứ  ch c và truy xu t đ n ph n t ượ ỉ ố ầ ử ủ c xác đ nh thông qua ch  s .   c a m ng đ Ph n t ộ ố ử ỉ ố ủ   trong  m ng  luôn  là  m t  s   Ch   s   c a  ph n  t nguyên không v t qua kích th ỉ Cách truy c p theo đ a ch

&tên_bi n[ế i]

ỉ ố ủ

ầ ử

trong đó i là ch  s  c a ph n t  VD:   b= &a[0] ỉ ớ ị

ầ ử ầ

ỉ i đ a ch  ph n t

ả //Tên m ng ch  t

đ u tiên c a m ng

88

ầ ử

Gán ph n t

trong m ng

89

int a[5], b[5]; b = a; // Sai for (int i = 0; i < 3; i++) b[i] = a[i]; // đúng

ậ ữ ệ

90

4. Cách xu t nh p d  li u trên  m ngả ụ Ví d  /* Tinh trung binh cong n so nguyen */ #include  #include  int main() { int a[50], i, n, sum = 0; printf("Nhap vao gia tri n: "); scanf("%d", &n); //Nhap du lieu vao mang for(i = 0; i < n; i++) { printf("Nhap vao phan tu thu %d: ", i + 1); scanf("%d", &a[i]); //Nhap gia tri cho phan tu thu i }

ầ ử ủ

c a m ng

//in các ph n t for(i=0;i

//Tinh tong gia tri cac phan tu for(i = 0; i < n; i++) sum = sum + a[i]; //cong don tung phan tu vao sum printf("Trung binh cong: %.2f \n", (float) sum/n); getch(); }

91

• L i g i hàm ờ ọ

int NhapMang(int a[], int &n); // Khai báo

mẫu

int XuatMang(int a[], int n);

int main()

{

int a[100], n;

NhapMang(a, n); // gọi hàm NhapMang

ộ M ng m t chi u

XuatMang(a, n); // gọi hàm XuatMang

}

ơ ả

ộ ố

ế

• Vi

ả ả

ế

ả  trong m ng ấ ủ

ắ ế

ầ ăng d nầ ầ ử

ả ộ

M t s  bài toán c  b n ự ệ ừ t hàm th c hi n t ng yêu c u sau – Nh p m ng ậ – Xu t m ng ấ – Tìm ki m m t ph n t ầ ử – Tìm giá tr  nh  nh t/l n nh t c a m ng ị ỏ ấ ớ – S p x p m ng gi m d n/t ả – Thêm/Xóa/S a m t ph n t ử

ả  vào m ng,…

ộ M ng m t chi u

Nh p m ng

• Yêu c uầ

• Ý tưởng

ậ – Cho phép nh p m ng ả a, s  lố ượng n ph n tầ ử

ố ượng ph n t

ủ ả ầ ử MAX.  là  ầ ử ự ự  c a m ng. th c s  n

ầ ử ậ ừ ả – Cho trước m t m ng có s  l ộ – Nh p ậ s  lố ượng ph n t – Nh p t ng ph n t ả ừ ỉ ố 0 đến n – 1. ch  s cho m ng t

n ­1

0

1

2

MAX ­ 1

3

ộ M ng m t chi u

Hàm Nhập Mảng

int NhapMang(int a[], int &n) { printf(“Nhap so luong phan tu n: ”); scanf(“%d”, &n);//nếu để ở hàm main => ko cần &n

for (int i = 0; i < n; i++) {

printf(“Nhap phan tu thu %d: ”, i); scanf(“%d”, &a[i]);

}

}

int NhapMang(int a[], int &n); int main() {

int a[100], n; NhapMang(a, n); Gọi hàm

}

ộ M ng m t chi u

Xu t m ng

• Yêu c uầ

– Cho trước m ng ả a, s  lố ượng ph n t ấ ộ ầ ử n. Hãy xu t n i

• Ý tưởng

dung m ng ả a ra màn hình.

ị ừ ầ ử ủ ả – Xu t giá tr  t ng ph n t c a m ng t ừ ỉ ố 0 đến ch  s

ấ n­1.

n ­ 1

0

1

2

MAX ­ 1

ộ M ng m t chi u

Hàm Xuất Mảng

int XuatMang(int a[], int n) {

printf(“Noi dung cua mang la: ”);

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

printf(“%d ”, a[i]);

printf(“\n”);

}

ộ M ng m t chi u

ầ ử

ế

Tìm ki m m t ph n t

trong

ộ m ngả

• Yêu c uầ

ằ ầ ử x có n m trong m ng ả a kích thước n

• Ý tưởng

– Tìm xem ph n t ế ằ ở ị hay không? N u có thì nó n m v  trí nào.

ừ – Xét t ng ph n c a m ng ế ả a. N u ph n t

ả ề ị đó. N u không tìm ầ ử đang xét b ng ằ được thì tr  v ả ề ­1.

ầ ủ x thì tr  v  v  trí  ị ế v  trí = 1

xx

n ­ 1

0

1

2

MAX ­ 1

aa

xx

bb

xx

ộ M ng m t chi u

Hàm Tìm Kiếm (dùng for)

int TimKiem(int a[], int n, int x) {

for (int vt = 0; vt < n; vt++)

if (a[vt] == x)

return vt;

return -1;

}

ộ M ng m t chi u

ấ ủ

ị ớ

Tìm giá tr  l n nh t c a m ng

• Yêu c uầ

ầ ử ị ớ ấ – Cho trước m ng ả a có n ph n t . Tìm giá tr  l n nh t

trong a (g i là ọ max)

• Ý tưởng – Gi ả ử

s  giá tr ị max hi n t ệ ạ  là giá tr  ph n t ầ ử đầu tiên i

a[0]

ầ ử – L n lầ ượt ki m tra các ph n t ể còn l ậ ạ để c p nh t ậ max. i

7788 ??

max

n – 1

0

1

2

MAX ­ 1

77

22

88

88

ộ M ng m t chi u

Hàm tìm Max

int TimMax(int a[], int n) {

int max = a[0];

for (int i = 1; i < n; i++) if (a[i] > max)

max = a[i];

return max;

}

ộ M ng m t chi u

ắ ế

ả S p x p m ng tăng d n

• Yêu c uầ

ắ ế – Cho trước m ng ả a kích thước n. Hãy s p x p m ng ả a

• Ý tưởng

ầ ử đó sao cho các ph n t có giá tr ị tăng d nầ .

– S  d ng 2 bi n ế i và j để so sánh t ầ ử

ị ử ụ ớ v i nhau và hoán v  các c p ặ theo th  t ấ ả ặ t c  c p ph n t .ứ ự

88 55

t mạ

n – 1

0

1

MAX ­ 1

22

11 55

55 11

66 88

88 66

ộ M ng m t chi u

j

j

j

i

j

Hàm Sắp Xếp Tăng

int SapXepTang(int a[], int n) {

int i, j;

for (i = 0; i < n – 1; i++) {

for (j = i + 1; j < n; j++) {

if (a[i] > a[j])

HoanVi(a[i], a[j]);//gọi hàm HV

}

}

}

ộ M ng m t chi u

ầ ử

ộ Thêm m t ph n t

vào m ng

• Yêu c uầ

• Ý tưởng

ạ ị – Thêm ph n t ầ ử x vào m ng ả a kích thước n t i v  trí vt.

ạ ị ị ẩ ầ ử ắ đầu t  b t i v  trí vt sang ph i ả 1 v  trí .

ị vt trong m ng.ả

– “Đ y” các ph n t – Đưa x vào v  trí  – Tăng n lên 1 đơn vị.

xx

chèn?

n – 1

n

0

1

MAX ­ 1

2

3

aa

bb

zzzz

cc cc

… ……

ộ M ng m t chi u

vt

Hàm Thêm

int Them(int a[], int &n, int vt, int x) {

if (vt >= 0 && vt <= n) {

for (int i = n; i > vt; i--) a[i] = a[i - 1];

a[vt] = x; n++;

}

} Cách 2: Xem phần Bản ghi, mục bổ sung học sinh

ộ M ng m t chi u

ầ ử

ộ Xóa m t ph n t

trong m ng

ầ ử ạ ị trong m ng ả a kích thước n t i v  trí vt

• Yêu c uầ – Xóa m t ph n t ộ • Ý tưởng

ầ ử ả ị ị bên ph i v  trí vt sang trái 1 v  trí .

– “Kéo” các ph n t – Gi m ả n xu ng ố 1 đơn vị.

xóa?

n ­ 1

n – 1

0

2

1

MAX ­ 1

a

x

b bb

z zz

… ……

ộ M ng m t chi u

vt

Hàm Xóa

int Xoa(int a[], int &n, int vt) {

if (vt >= 0 && vt < n) {

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

a[i] = a[i + 1];

n--;

}

}

ộ M ng m t chi u

Bài t pậ

ế

1. Vi

ả ả

ớ ấ t hàm v i các thao tác nh p xu t ậ a. Nh p m ng ấ b. Xu t m ng

ố 2. Nh p vào m ng s  nguyên, hãy ki m tra: ả ả

ố ẵ ố ẻ

ậ ả ả

ả ả ả

a. M ng có ph i là m ng toàn s  ch n b. M ng có ph i là m ng toàn s  l

ộ M ng m t chi u

Bài t pậ

3. Nh p vào m ng s  nguyên. Hãy tính t ng,

4. Nh p vào m ng s  nguyên. Hãy:

ố ỏ ấ

ỏ ấ ầ

ắ ế

ả tích các s  có trong m ng ả a. Tìm s  nh  nh t trong m ng b. Tìm s  dố ương nh  nh t trong m ng c. S p x p m ng tăng d n

ộ M ng m t chi u

Bài t pậ

ế

ươ

5. Vi

t ch

ng trình nh p vào n s  nguyên

ươ

ầ ử ớ

d

ng. Hãy tìm ph n t

l n nh t và bé nh t.

ươ

ồ 6. Nh p vào dãy g m n s  nguyên d

ng, hãy

ắ ế s p x p chu i theo chi u tăng d n.

110

ắ ế ợ ầ G i ý s p x p tăng d n

int main()

{  int a[100], i, j, n, temp;

printf("Nhap so phan tu:");

scanf("%d",&n);

for (i=0;i

{

printf("\nNhap a[%d]=",i);

scanf("%d",&a[i]);

111

}

printf("\n");

ắ ế  // s p x p

for (i = 0; i < n ­ 1; i++)

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

{     if (a[i] > a[j])        {   temp = a[i];

a[i] = a[j];

a[j] = temp;

ể ọ         }   // có th  g i hàm hoanvi

}

for (j=0; j

printf("\n %d ",a[j]);

112

getch();

}

ề M ng 2 chi u ­ Ma Tr n ế

ả ả Khai báo bi n m ng 2 chi u • Ví dụ – T ườ

ng minh

ườ

int a[10][20], b[10][20]; int c[5][10]; int d[10][20]; – Không t

ng minh (thông đ nh nghĩa)

typedef int MaTran10x20[10][20]; typedef int MaTran5x10[5][10];

MaTran10x20 a, b; MaTran11x11 c; MaTran10x20 d;

M ng hai chi u

ấ ế

ầ ử

Truy xu t đ n m t ph n t

• Thông qua ch  sỉ ố

[][]

• Ví dụ

0

1

2

3

0

– Cho m ng 2 chi u nh

ư sau

1

2

int a[3][4]; – Các truy xu tấ

M ng hai chi u

• H p lợ ệ: a[0][0],  a[0][1], …, a[2][2], a[2][3] • Không h p lợ ệ: a[­1][0], a[2][4], a[3][3]

ữ ệ

ượ

Gán d  li u ki u m ng ử ụ ả

ế

c  s   d ng  phép  gán  thông  ng  mà  ph i  gán  tr c  ti p  gi a  các

• Không  đ ườ th ph n tầ ử

• Ví dụ

int a[5][10], b[5][10];

// Sai

b = a; int i, j; for (i = 0; i < 5; i++)

for (j = 0; j < 10; j++) b[i][j] = a[i][j];

M ng hai chi u

ộ ố

ơ ả

M t s  bài toán c  b n

ế

• Vi

t hàm th c hi n các yêu c u sau ậ ấ

ầ ử

trong ma tr n

ự – Nh p ma tr n ậ – Xu t ma tr n ậ – Tìm ki m m t ph n t ộ ế – …

M ng hai chi u

ộ ố

M t s  quy

ướ c

• S  dòng và s  c t ố ộ

#define MAXD 50 #define MAXC 100

M ng hai chi u

Nh p Ma Tr n

• Yêu c uầ

• Ý tưởng

ậ – Cho phép nh p m ng ả a, m dòng, n c tộ

ộ ề i ố đa là

– Cho trước m t m ng 2 chi u có dòng t ả i MAXD, s  c t t

ố ộ ố đa là MAXC. ầ ử ự ự ủ ề th c s  m, n ỗ  c a m i chi u.

M ng hai chi u

ậ ừ – Nh p ậ s  lố ượng ph n t – Nh p t ng ph n t ầ ử ừ 0][0] đến [m­1][n­1]. t [

Hàm Nhập Ma Trận

Do sử dụng m,n cho hàm XuatMaTran => dùng tham chiếu int NhapMaTran(int a[][MAXC], int &m, int &n) { printf(“Nhap so dong, so cot cua ma tran: ”); scanf(“%d%d”, &m, &n);// có thể để ở hàm main

int i, j; for (i=0; i

for (j=0; j

printf(“Nhap a[%d][%d]: ”, i, j); scanf(“%d”, &a[i][j]);

}

}

Xu t Ma Tr n

• Yêu c uầ

• Ý tưởng

ậ – Cho phép nh p m ng ả a, m dòng, n c tộ

ấ ị ừ ả – Xu t giá tr  t ng ph n t c a m ng 2 chi u t dòng

ỗ ấ ề ừ ị ủ ộ 0

M ng hai chi u

ầ ử ủ 0 đến dòng m­1, m i dòng xu t giá giá tr  c a c t  đến c t ộ n­1 trên dòng đó.

Hàm Xuất Ma Trận

int XuatMaTran(int a[][MAXC], int m, int n) {

int i, j; for (i=0; i

for (j=0; j

printf(“%d ”, a[i][j]);

printf(“\n”);

}

}

M ng hai chi u

ế

ầ ử

Tìm ki m m t ph n t trong Ma Tr nậ

• Yêu c uầ

ằ – Tìm xem ph n t ầ ử x có n m trong ma tr n ậ a kích

thước mxn hay không?

• Ý tưởng ệ ừ

ầ ủ ả ề ế ậ a. N u ph n t ạ ả ề ược l ầ ử đang    i tr  v  không có

M ng hai chi u

– Duy t t ng ph n c a ma tr n  xét b ng ằ x thì tr  v  có (1), ng (0).

Hàm Tìm Kiếm

int TimKiem(int a[][MAXC], int m, int n, int x) {

int i, j; for (i=0; i

for (j=0; j

if (a[i][j] == x)

return 1;

return 0;

}

M ng hai chi u

Bài 6. Kiểu chuổi ký tự

Khái niệm: •Chuỗi có thể được định nghĩa như là một mảng kiểu ký tự, được kết thúc bằng ký tự null •Mỗi ký tự trong chuỗi chiếm một byte và ký tự cuối cùng của chuỗi là “\0” (null) •Được khai báo và truyền tham số như mảng một chiều.

s[100]; s[100];

char char unsigned char s1[1000]; unsigned char s1[1000];

ấ ớ

ỗ Nh p/Xu t v i chu i

1. Khai báo theo m ngả ế

ế

chi m 1 ô

i đa] ự char Ten[12]; // 12 ô, m i ký t

bàn phím

ử ụ

ự ừ  t

bàn phím, ta s  d ng hàm

ế

ỗ gets(Ten);

ố Cú pháp: char  [Chi u dài t ỗ Ví d : ụ nhớ ậ ỗ ừ 2. Nh p chu i t ộ ể Đ  nh p m t chu i ký t gets()  Cú pháp: gets() Ví d :    char Ten[20];    ể Cũng có th  dùng hàm scanf. VD scanf(“%s”,Ten); 3. Xu t chu i lên màn hình ộ

125

ấ ỗ ấ ể Đ  xu t m t chu i (bi u th c chu i) lên màn hình, ta  ử ụ puts(). s  d ng hàm  ể Cú pháp: puts() puts(Ten);  Ví d :    ụ

ụ ỗ ừ

ỗ Ví d : Nh p vào m t chu i và hi n th  trên màn hình  chu i v a nh p. #include  #include  #include  int main()  {    char Ten[12];

ệ ; gets(queQuan);

char queQuan[15];  printf("Nhap Ten: ");     fflush(stdin);     gets(Ten);  printf("Nhap Que Quan: "); ị fflush(stdin); dùng tránh b  trôi l nh printf("Chuoi vua nhap: ");  puts(Ten);  puts(queQuan);  getch();  return 0;

126

}

ộ ố ộ

ườ

ỗ ậ

i, sau đó

ụ ả ọ

ọ ủ ọ

M t s  hàm x  lý chu i (trong string.h) C ng chu i ­ Hàm strcat() Ví d : Nh p vào h  lót và tên c a m t ng in c  h  và tên c a h  lên màn hình. #include  #include  #include  int main()  {    char HoLot[30], Ten[12];

printf("Nhap Ho Lot: ");gets(HoLot);  printf("Nhap Ten: ");gets(Ten);  strcat(HoLot,Ten); /* Ghep Ten vao HoLot*/  printf("Ho ten la: ");puts(HoLot);  getch();  return 0;

127

}

ộ ố ị

ộ ụ ử ụ

ậ ừ

128

M t s  hàm x  lý chu i (trong string.h) ỗ Xác đ nh đ  dài chu i ­ Hàm strlen() ộ Ví d : S  d ng hàm strlen xác đ nh đ  dài m t chu i   bàn phím. nh p t #include  #include  #include  int main(){  char Chuoi[255];  int Dodai;  printf("Nhap chuoi: ");gets(Chuoi);  Dodai = strlen(Chuoi) ; printf("Chuoi vua nhap: ");puts(Chuoi);  printf("Co do dai %d",Dodai);  getch();  return 0;  }

ộ ố

M t s  hàm x  lý chu i (trong string.h)

­ Hàm

ế

­So sánh 2 chu iỗ  có b ng nhau hay không ằ strcmp() (dùng khi tìm ki m tên,…)

đ u

ữ ế

ủ ng c a cùng m t ký t

­So sánh 2 chu i ỗ strnicmp (s1, s2, n); so sánh n ký t ự ầ ữ t ch  hoa, ch   tiên c a chu i s1 và s2, không phân bi ắ ườ  (dùng khi s p x p tên theo  th alphable)

129

ể ấ

Bài 7: Ki u c u trúc – ki u b n ghi

Khái ni mệ ­Ki u c u trúc (ki u b n ghi)  ấ

ữ ệ là ki u d  li u bao g m

nhi u  thành  ph n  có  ki u  khác  nhau

,  m i  thành  ph n

ượ

ộ ườ

đ

c  g i  là  m t  tr

ng  (field)

.  Các  thành  ph n ầ đ

c ượ

truy nh p thông qua m t t

ộ ên.

­ 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  khác ki u nhau.

Minh h aọ

ư

M ng l u các s  nguyên

10

15

16

18

2

6

ư

M ng l u các b n ghi

Họ tên

Ngày sinh

Toán

Hóa

St t

Quê quan

1

10/3/1999

Hà nội

8

7

9

Nguyễn Văn B

2

Trần Văn C

20/10/1998 Hà nội

8

6

7

ể ấ

Cách 1: struct

{

ườ

; ; …….. ;

};

ườ

ng:

ượ

ả  ph i  là  ặ c đ t theo

Khai báo ki u c u trúc :  là  m t ộ ấ ­  Tên  c u  trúc ặ ượ tên  đ c  đ t  theo  quy  ặ ắ t c  đ t  tên  và  là  tên  ể ấ ki u c u trúc.  ườ  ­    ủ ể (i=1..n):  là  ki u  c a  ấ ỗ ng  trong  c u  m i  tr trúc  ­  Tên  tr m t tên đ ắ ặ quy t c đ t tên.

ể ấ

Khai báo ki u c u trúc Cách 2: Sử dụng từ khóa typedef để định nghĩa kiểu: typedef struct

{

; ; …….. ; } ;

Ví d  1ụ ộ ủ ể ấ

Đ  qu n lý ngày, tháng, năm c a m t ngày  trong năm ta có th  khai báo ki u c u trúc g m  3 thông tin: ngày, tháng, năm.

struct NgayThang  {    int Ngay;    int Thang;    int Nam;  };

typedef struct   {     int Ngay;    int Thang;    int Nam;    } NgayThang;

Ví d  2ụ

ỗ ả ở

ọ ớ ố ỉ ườ ị i  tính,  đ a  ch   th

ể ồ ộ

ầ ượ M i sinh viên c n đ c qu n lý b i các thông tin: mã s  sinh  ng  viên,  h   tên,  ngày  tháng  năm  sinh,  gi trú. Lúc này ta có th  khai báo m t struct g m các thông tin  trên.

typedef struct  {     char MSSV[10];     char HoTen[40];     NgayThang NgaySinh;     int Phai;     char DiaChi[40];    } SinhVien; struct SinhVien  {   char MSSV[10];   char HoTen[40];    struct NgayThang NgaySinh;   int Phai;   char DiaChi[40];  };

CÁC THAO TÁC TRÊN BI N KI U C U TRÚC

1. Truy xuất đến từng trường của biến cấu trúc

ườ ế ấ Cú pháp: .

Ví d   : ụ

ế ươ Vi t  ch ng  trình

ọ ữ cho  phép  đ c  d

ừ ệ li u  t bàn  phím #include  #include  #include    typedef struct

ế ẩ cho  bi n  m u  tin

SinhVien  và in

ế ẩ bi n  m u  tin đó

lên màn hình: {     int Ngay;    int Thang;    int Nam;  }NgayThang;

typedef struct { char MSSV[10]; char HoTen[40]; NgayThang NgaySinh; int Phai; char DiaChi[40]; } sinhvien;

ụ ế Ví d  (ti p)     /* Hàm in lên màn hình 1 m u tin  SinhVien*/  int InSV(SinhVien s)  {     printf("MSSV:  |  Ho va ten   |  Ngay Sinh   |   Dia chi\n");     printf("%s  |  %s |  %d­%d­%d |  %s\n",  s.MSSV, s.HoTen, s.NgaySinh.Ngay,  s.NgaySinh.Thang, s.NgaySinh.Nam,  s.DiaChi);  }

ụ ế Ví d  (ti p)

int main() { SinhVien SV; printf("Nhap MSSV: "); gets(SV.MSSV); printf("Nhap Ho va ten: "); gets(SV.HoTen); printf("Sinh ngay: "); scanf("%d",&SV.NgaySinh.Ngay); printf("Thang: "); scanf("%d",&SV.NgaySinh.Thang); printf("Nam: "); scanf("%d",&SV.NgaySinh.Nam); printf("Gioi tinh (0: Nu), (1: Nam): "); scanf("%d",&SV.Phai); fflush(stdin); printf("Dia chi: "); gets(SV.DiaChi); InSV(SV); getch(); }

Ví d  2ụ Viết chương trình nhập danh sách học viên gồm các trường họ tên, tuổi, điểm, và nhập vào một tên để tìm kiếm tên này trong danh sách.

#include  #include #include

typedef struct

{ char Ten[30];   int tuoi ;   float diem ; } HV ;

ế

Ví d  2 (ti p)

int nhap(HV hvs[], int &n) {      int i ;  printf(“nhap vao so hoc sinh: “); scanf(“%d”,&n); for ( i = 0 ; i < n ; i++) // Nh p các h c viên   {        printf ("\n Nhap so lieu cho HV thu %d", i+1 ) ;         printf (" Ho va ten = " ) ;          gets( hvs[i].Ten);         fflush(stdin);         printf ("tuoi = ");          scanf ( "%d" , &hvs[i].tuoi);         fflush(stdin);         printf("diem = ");          scanf ("%f", &hvs[i].diem );         fflush(stdin);        }

141

int hienthi(HV hvs[], int n) { int i; printf(“Danh sach hoc sinh vua nhap la: \n”); for (i=1; i

ế

Ví d  2 (ti p)

int timkiem(HV hvs[ ], int n) Tim kiem ten, có n, và hvs phải lấy từ hàm main() { char tentim[30]; printf("Nhap vao ten can tim: "); gets(tentim); fflush(stdin);  // ch ng trôi l nh ố bool thay; thay = 0 ; i = 0 ; /* thay = 0 : không thay, thay = 1 : tim thay */ while ((!thay)&&(i

ắ ế S p x p

int sapxep(HV hvs[], int n) { int j;  HV tam;  // float diem1, diem2;     for ( i = 0 ; i < n ; i++)     {  for ( j =i+1 ; j < n ; j++)      {           if (hvs[i].diem > hvs[j].diem)     {       tam =hvs[i];              hvs[i] =hvs[j];              hvs[j]= tam;              }              }              } }

144

int main() { int n; HV hs[100]; nhap(hs,n); hienthi(hs,n); timkiem(hs,n); sapxep(hs,n); getch(); }

scanf(“%d”, &chon); switch(chon) { case 1: nhap(hs,n); case 2: hienthi(hs,n); case 3: timkiem(hs,n);  case 4: sapxep(hs,n); } getch(); }

145

Ho cặ int main() { int n, chon; Printf(“Hay nhap cac so sau de thuc  hien: \n”); Printf(“ so 1: nhap\n”); Printf(“ so 2: in danh sach vua nhap  \n”); Printf(“ so 3: tim kiem ten trong  danh sach vua nhap \n”); Printf(“ so 4: sap xep danh sach  vua nhap theo diem \n”);

Bài t pậ

1. Viết hàm nhập vào họ tên, điểm của n học sinh. In ra

danh sách các học sinh vừa nhập.

2. Viết hàm nhập vào họ tên, điểm của n học sinh. Sắp

xếp lại điểm của các HV từ thấp đến cao và in ra

danh sách các học sinh vừa nhập.

3. Viết hàm nhập vào vào, họ và họ lót, tên, địa chỉ, sắp

xếp tên và địa chỉ theo thứ tự alphabet, sau đó hiển

thị danh sách đã được sắp xếp.

4. Tiếp

Bài t pậ

ộ ớ ỗ

ả ầ ử ấ

ả i ta dùng m t m ng 1 chi u g m   g m có:

• Đ  qu n lý h c sinh c a m t l p, ng ọ ủ , c u trúc c a m i ph n t

́ ́

có n ph n t ọ ọ ệ

̣

ự    ự

̣

ể ể

̣

̀  co  đô da i 10 ky  t ̀  co  đô da i 20 ky  t ́ ̀ ự  co  đô da i 10 ky  t    ́ ̀ ự  co  đô da i 10 ky  t

ớ ể ể ể ể

ể ố ự

ượ

ườ ầ ử ồ • Mã h c sinh (MHS) ki u xâu ky  t ́ ́ ự ể • H  đ m (HODEM) ki u xâu ky  t ́ ́ ể ự • Tên (TEN) ki u xâu ky  t ́ ́ ự • L p (LOP) ki u xâu ky  t ́ ́ ự • Đi m toán (TOAN) có ki u s  th c ể ố ự • Đi m lý (LY) có ki u s  th c ể ố ự • Đi m hóa (HOA) có ki u s  th c ể ố ự • Đi m trung bình(DTB) có ki u s  th c (đ

c tính

b ng trung bình c ng

ủ c a 3 đi m toán, lý, hóa)

147

̣

ợ ọ

.

t ế hàm nhap() đ  ể nh p ậ n h c sinh ế

ể ự ầ  theo c u trúc trên ậ

ọ ọ

ừ ọ ệ

t hàm in() đ  in ra danh sách các h c sinh v a nh p, m i h c  ể

ế

ế

theo th  ứ

ế

alphabet

ế

ấ ả

ề ọ

ư

ế

t hàm timkiemtenhs() đ  tìm tên h c sinh trong danh sách v a  t c  thông tin v  h c sinh

ư

ế

ế ọ t hàm main() ch a l

ế

ằ Yêu c u : L p trình b ng ngôn ng  C đ  th c hi n công vi c sau: ể ữ ệ 1.Khai báo ki u d  li u phù h p theo đ u bài.  ấ 2.Vi ỗ ọ 3.Vi ớ sinh hi n th  trên m t dòng (g m: Mã h c sinh, h  đ m, tên, l p,  ể ể ể đi m toán, đi m lý, đi m hóa, đi m trung bình). ủ ọ ể ắ t hàm sapxeptenhs() đ  s p x p tên c a h c sinh theo  4.Vi ừ ắ ọ ự  và in ra danh sách h c sinh v a s p x p. t ọ 5.Vi ậ nh p. N u tìm th y thì đ a ra màn hình t ấ này, n u không tìm th y thì đ a ra màn hình thông báo “không tìm  ậ ừ ấ th y h c sinh có tên v a nh p trong danh sách”. ứ ờ ọ ủ i g i c a các hàm trên và cho phép l a  6.Vi ớ ề ầ ọ i khi muôn k t thúc. ch n các hàm trên nhi u l n cho t

148

#include #include #include #include struct hs {     char MHS[10];     char HODEM[20];     char TEN[10];     char LOP[10];     float TOAN;     float LY;     float HOA;     float DTB ; };

149

void nhap(hs s[],int &n) {     printf("  Nhap n = "); scanf("%d",&n);     for(int i=0;i

150

void in(hs s[],int n) {     printf("  Mahs\tHodem\tTen\tLop\tToan\tLy\tHoa\tDiemtb\n");     for(int i=0;i

151

void sapxeptenhs(hs s[],int n) {     int i,j;     hs tam;     for(i=0;i 0)               {       tam =s[i];                        s[i]= s[j];                        s[j]= tam;                }          }      }     printf("  Danh sach sap xep ten la:\n");     in(s,n); }

152

153

void timkiemtenhs(hs s[],int n) {   int i;     char ten[10];     printf("  \nNhap ten hoc sinh can tim :"); fflush(stdin);   gets(ten);     bool thay;     thay = 0; i=0;     while((!thay) && (i

154

int menu(void) {     int c;     printf(" Nhap 1: nhap”);      printf(" Nhap 2: in”);      printf(" Nhap 3: sap xep”);      printf(" Nhap 4: tim kiem ten”);      printf(" Nhap 5: ket thuc”); do     {         printf("  \nNhap ham can goi :");         scanf("%d",&c);     }     while((c<0) || (c>5));     return c; }

int main() {     int n,c,i;     char ten[10];     hs s[200];     for( ; ; )     {         switch(menu())         {             case 1 : nhap(s,n); break;             case 2 : in(s,n); break;             case 3 : sapxeptenhs(s,n); break;             case 4 : timkiemtenhs(s,n); break;             case 5 : exit(0); break;         }     } }

155