Đề cương bài giảng: Ngôn ngữ lập trình C

Tài liệu Đề cương bài giảng: Ngôn ngữ lập trình C: 1 Bài 1: Ngôn ngữ lập trình C I. Các khái niệm cơ bản 1. Bảng ký tự sử dụng trong C Bảng ký tự được sử dụng trong ngôn ngữ lập trình C bao gồm - Nhóm các chữ cái: chữ in hoa A,B,C,Z và chữ in thường a,b,c,,z - Nhóm các chữ số: 0,1,2,3,,9 - Nhóm các dấu: +,-,*,/,,& Chú ý: ngôn ngữ C phân biệt chữ hoa và chữ thường do đó chúng ta phải thận trọng khi sử dụng các chữ cái hoa và thường. 2. Tên và từ khoá Tên là một dãy các chữ cái, chữ số và dấu gạch nối. tên phải bắt đầu bằng chữ cái hoặc dấu gạch nối. Ví dụ: Tên đúng: baitap1,vidu1, Tên sai: ha noi, viet%nam Tên có thể do ngôn ngữ C sinh ra để nhằm hai mục đích: thứ nhất là định danh các thành phần có sẵn, thứ hai viết các lệnh trong chương trình. Tên chuẩn là những tên do ngôn ngữ lập trình C đặt ra để định danh các thành phần. Ví dụ: scanf,printf,getch() Từ khoá (key word) là các tên do ngôn ngữ lập trình sinh ra để viết các lệnh, để định danh các thành phần đặc biệt. Ví dụ: for,while, i...

pdf57 trang | Chia sẻ: honghanh66 | Lượt xem: 932 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Đề cương bài giảng: Ngôn ngữ lập trình C, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
1 Bài 1: Ngôn ngữ lập trình C I. Các khái niệm cơ bản 1. Bảng ký tự sử dụng trong C Bảng ký tự được sử dụng trong ngôn ngữ lập trình C bao gồm - Nhóm các chữ cái: chữ in hoa A,B,C,Z và chữ in thường a,b,c,,z - Nhóm các chữ số: 0,1,2,3,,9 - Nhóm các dấu: +,-,*,/,,& Chú ý: ngôn ngữ C phân biệt chữ hoa và chữ thường do đó chúng ta phải thận trọng khi sử dụng các chữ cái hoa và thường. 2. Tên và từ khoá Tên là một dãy các chữ cái, chữ số và dấu gạch nối. tên phải bắt đầu bằng chữ cái hoặc dấu gạch nối. Ví dụ: Tên đúng: baitap1,vidu1, Tên sai: ha noi, viet%nam Tên có thể do ngôn ngữ C sinh ra để nhằm hai mục đích: thứ nhất là định danh các thành phần có sẵn, thứ hai viết các lệnh trong chương trình. Tên chuẩn là những tên do ngôn ngữ lập trình C đặt ra để định danh các thành phần. Ví dụ: scanf,printf,getch() Từ khoá (key word) là các tên do ngôn ngữ lập trình sinh ra để viết các lệnh, để định danh các thành phần đặc biệt. Ví dụ: for,while, if, int, float Chú ý: tên do chúng ta đặt ra không được phép trùng với từ khoá, không nên trùng với các tên chuẩn. 3. Các kiểu dữ liệu Tên kiểu Miền giá trị độ lớn char một trong 256 ký tự thuộc bản mã ASCII 1 byte int -32.768 đến 32.767 2 byte float -3.4.E.38 đến 3.4.E38 4 byte 4. Khái niệm về hằng và biến nhớ 2 a, Hằng Hằng(const) là một đại lượng không thay đổi giá trị trong toàn chương trình. Hằng có thể là số nguyên, số thực, ký tự hoặc chuỗi ký tự. để biểu diễn các giá trị hằng ta viết như sau: Đối với số nguyên : viết bình thường như trong toán học Ví dụ: 100,150,350 Đối với số thực dùng dấu chấm để ngăn cách phần nguyên và phần thập phân, Ví dụ: 1.5, 2.3 Đối với kí tự: viết các ký tự vào trong hai nháy kép Ví dụ: “ngay 20 tháng 12 nam 2009” b, Biến nhớ Là một đại lượng có thể thay đổi trong chương trình, biến nhớ được sử dụng để lưu dữ liệu của chương trình, do vậy nó rất quan trọng trong lập trình, nếu không có biến nhớ thì chúng ta không thể lập trình được bởi vì không có chỗ chứa dữ liệu cho việc tính toán và sử lý. 5. Các phép toán Các phép toán trong C gọi là các toán tử (operator), bao gồm: a. Các phép toán số học - Ký hiệu: +, -,*, /,% - Ý nghĩa: cộng ,trừ, nhân, chia, chia dư - Dữ liệu tác động: kiểu số nguyên hoặc số thực - Kết quả: các phép toán số học cho kết quả là dữ liệu kiểu số Ví dụ: 2+5, 5*6, 3/2 Chú ý: đối với phép chia(/) nếu hai vế dữ liệu là số nguyên thì máy sẽ chia lấy phần nguyên, nếu một trong hai vế là số thực thì máy cho kết quả chính xác. Ví dụ: 7/4 sẽ cho kết quả là 1(là phần nguyên của 7 chia 4) 7.0/4 hoặc 7/4.0 sẽ cho kết quả là 1.75 7%4 sẽ cho kết quả là 3(là phân dư của 7 chia 4) b. Các phép toán quan hệ 3 - Ký hiệu: >, =, <=, ==, != - Ý nghĩa : lớn hơn, nhỏ hơn, lớn hơn hoặc bằng, nhơ hơn hoặc bằng, so sánh bằng, và khác - Dữ liệu tác động: là các dữ liệu kiểu số và chữ, nếu là chữ thì máy sẽ so sánh mã ASCII của các chữ đo. - Kết quả: phép toán cho kết quả là loogic(đúng hoặc sai) c. Các phép kết nối logic - Ký hiệu: &&, ||, ! - Ý nghĩa và, hoặc, phủ định - Kiểu dữ liệu tác động: là các dữ liệu có giá trị đúng hoặc sai(kiểu logic) - Kết quả: cho kết quả logic(đúng hoặc sai) Bảng kết quả: E1 E2 E1&&E2 E1|| E2 !E1 Đúng Đúng Đúng Đúng Sai Đúng Sai Sai Đúng Sai Sai Đúng Sai Đúng Đúng Sai Sai Sai Sai Đúng d. Phép gán Phép gán thực hiện tính toán và chuyển dữ liệu vào biến nhớ trong chương trình, cách thức như sau: Vế_trái = vế_phải; Máy sẽ thực hiện tính toán vế phải và đưa kết quả vào vế trái do đó vế trái luôn luôn là một biến nhớ. Ví dụ : a =1; b =1+6; 6 Dòng chú thích (Comment) Những chú thích thường được viết để mô tả công việc của một lệnh đặc biệt, một hàm hay toàn bộ chương trình. Trình biên dịch sẽ không dịch chúng. Trong C, chú thích bắt đầu bằng ký hiệu /* và kết thúc bằng */. Trong trường hợp chú thích chỉ trên một dòng ta có thể dùng //. II. Biểu thức, câu lệnh, khối lệnh và chương trình 4 Biểu thức là sự kết hợp giữa các toán tử(phép toán ) và các dữ liệu để thực hiện tính toán, khi máy thực hiện tính biểu thức sẽ tuân theo thứ tự ưu tiên của phép toán cũng giống như toán học. Ví dụ: (8+3*(2-4))/2 máy sẽ thực hiện phép trù trước, rồi đến phép nhân,cộng, chia và kết quả là 1. Để yêu cầu máy thực hiện các thao tác chúng ta phải viết ra các lệnh tương ứng, bằng cách sử dụng các tên chuẩn và từ khóa kết hợp với viết biểu thức. Kết thúc mỗi câu lệnh phải có dấu chấm phẩy(;) Một câu lệnh được viết trên một dòng, và trên một dòng có thể viết được nhiều câu lệnh. Thồng thường một câu lệnh chưa đủ để thực hiện một chức năng hay một thao tác nào đó được yêu cầu, do vậy chúng ta phải viết thành nhiều câu lệnh và tạo thành một khối lệnh. Khối lệnh phải được viết vào trong cặp dấu ngoặc nhọn { } Ví dụ: { a = 5*4-2; b=2/3+5; printf (“%d”,a+b); } III. Cấu trúc các thành phần một trương trình C a. Nạp thư viện b. Định nghĩa các hằng c. Khai báo các kiểu dữ liệu mới d. Khai báo các chương trình con e. Khai bào các biến nhớ toàn cục f. Viết chương trình chính g. Viết các chương trình con Trong đó - Phần a dùng để lạp các thư viện cần sử dụng cho chương trình được viết như sau: #include Ví dụ: include - Phần b dùng để định nghĩa các giá trị hằng cách viết như sau #define tên hằng giá_trị_cần đặt_cho_hằng Ví dụ: #define myname “abc” - Phần c khai báo biến nhớ trong chương trình thường được thực hiện ở phần đầu trong chương trình(hàm main), tuy nhiên trong môi trường TC3.0 có thể thực hiện bất cứ chỗ nào nhưng phải trước khi sử dụng chúng. 5 Cú pháp: tên_kiểu_dữ_liệu tên_biến_nhớ; Ví dụ: int a; float b; int a,b,c; float a=2.5,b=3; - Phần f viết trương trình chính, mỗi một chương trình có duy nhất một chương trình chính và nó sẽ điều khiển toàn bộ các hoạt động của chương trình. Chương trình chính được viết như sau: Void main() { Các câu lệnh } Cấu trúc một chương trình C đơn giản #include #include Void main() { Khai báo biến nhớ Các câu lệnh } IV. Cách thực hiện một chương trình trên máy Khi thực hiện chương trình thì máy tình sẽ thực hiện các câu lệnh trong chương trình chính. Quá trình thực hiện sẽ tuần tự từ trên xuống dưới và từ trái sang phải. Ví dụ ta có chương trình sau #include #include void main() { A1; A2; B1; B2; C1; A3; } Thì máy sẽ thực hiện các câu lệnh theo tuần tự sau: A1,A2,B1,B2,C1,A3 V. Môi trường lập trình TurboC 1 . Giới thiệu TurboC và khởi động 6 Sau khi cài đặt song ta có thư mục TC hoặc TC30 trong thư mục này có các thư mục con sau. Để khởi động chương trình này chúng ta chạy tệp tin TC.EXE trong thư mục Bin của TurboC Màn hình giao diện của TurboC có dạng sau: 2, Các thao tác lập trình trên TurboC TC BIN INCLUDE LIB Chứa các tệp tin chính của chýõng trình trong đó có tệp TC.EXE Chứa các tệp tin khai báo thý viện ( *.h) Chứa các tệp tin mã lệnh của các thý viện (*.LIB) 7 Tên phím Ý nghĩa Alt + F Tạo một tệp chương trình mới F2 Ghi lại chương trình lên tệp trên đĩa F3 Mở một tệp chương trình đã lưu trên đĩa Alt + X Thoát khỏi chương trình TC Shift + các phím mũi tên Đánh dấu khối lệnh Ctrl + insert Chép khối đang đánh dấu vào máy Shift + insert Dán khối đã chép ở trong máy vào cị trí con trỏ trên màn hình Shift + Delete Cắt khối đang đánh dấu và đưa vào máy F9 Dịch và kiểm tra lỗi chương trình Ctrl + F9 Thực hiện chương trình Alt + Backspace Hủy thao tác vừa thực hiện F5 Phóng to hoặc thu nhỏ cửa sổ đang mở F6 Chuyển đổi giữa các cửa sổ đang mở Alt + F5 Hiển thị màn hình kết quả chương trình vừa chạy lần cuối cùng Alt + 0 Hiển thị tất cả các cửa sổ đang mở lên màn hình Một số thông báo lỗi hay gặp khi lập trình bằng TC Thông báo tiếng Anh Ý nghĩa tiếng Việt Undefined symbol ‘’ Chưa khai báo tên trong nháy Unable to open include file ’’ Không mở được tệp thư viện(có thể viết sai tên thư viện hoặc đường dẫn đến thư viện chưa đúng) Undefined symbol_main in modul c0.asm Chưa viết chương trình chính hoặc viết tên chương trình chính bị sai Compound statement missing } Thiếu dấu đóng ngoặc của khối lệnh Unexpected Thừa dấu đóng ngoặc của khối lệnh Unterminated string or character Chưa có dấu nháy kép kết thúc viết hằng 8 constant chuỗi kí tự Statement missing ; Thiếu dấu chấm phẩy kết thúc câu lệnh Function call missing ) Thiếu đóng ngoặc khi viết lệnh If statement mising ( Lệnh if thiếu dấu mở ngoặc 9 Bài 2: CẤU TRÚC LỆNH ĐIỀU KHIỂN I. Các lệnh đơn giản 1. Lệnh hiện dữ liệu lên màn hình - Cú pháp: printf(“điều khiển”,các dữ liệu cần hiện); Trong đó: - Điều khiển : Là các cặp kí tự điều khiển để hiện dữ liệu lên màn hình và phải được viết trong cặp dấu nháy kép, mỗi cặp kí tự điều khiển bao gồm dấu “%” và sau đó là một ký tự định kiểu. Cách viết Ý nghĩa %d Hiện số nguyên %c Hiện ký tự trong bảng mã ASCII %f Hiện số thực %s Hiện chuỗi ký tự - Dữ liệu cần hiện: Là các biểu thức dữ liệu cần hiện ra màn hình,các biểu thức này cách nhau bởi dấu phẩy. Để sử dụng được lệnh hiện dữ liệu lên màn hình ta phải nạp thư viện Ví dụ: printf(“%d”,65); thì kết quả hiện ra màn hình sẽ là: 65 printf (“%c”,65); thì máy sẽ hiện ra ký tự có mã là 65 và đó là: chữ A Chú ý: - Để hiện dữ liệu có xuống dòng trên màn hình ta sử dụng \n trong điều khiển của lệnh printf Ví dụ printf(“yen bai \n ngày %d”,12); màn hình sẽ hiện ra như sau: yen bai ngay 12 - Để cách một khoảng trên màn hình như bấm phím Tab ta sử dụng \t trong điều khiển của lệnh printf. 10 Vidu: printf(“yen bai \n\t ngay %d”,12); Màn hình sẽ hiện ra như sau: Yen bai ngay 12 2. Lệnh nhập dữ liệu từ bàn phím Cú pháp : scanf(“điều khiển”,& tên biến nhớ); Trong đó - điều khiển : Để quy định dữ liệu nhập vào dưới dạng nào, cách viết như điều khiển trong lệnh printf . - Tên biến nhớ: Dùng để lưu trữ dữ liệu nhập vào từ bàn phím, phải có dấu & ở trước. Để sử dụng được lệnh nhập dữ liệu từ bàn phím ta phải nạp thư viện . Ví dụ: scanf(“%d”,&a); Nhập một số nguyên từ bàn phím vào cho biến nhớ a. Chú ý: - Có thể nhập nhiều dữ liệu vào nhiều biến trong một lệnh scanf.Ta phải điền vào các điều khiển nhập cùng với các biến nhớ tương ứng cách nhau bởi dấu phẩy. Ví dụ: scanf(“%d%f”,&a,&b); Sẽ nhập số nguyên vào biến nhớ a, số thực vào biến nhớ b - Có thể quy định độ rộng dữ liệu khi nhập, phải viết độ rộng đó vào giữa dấu % và kí tự định kiểu tương ứng. Nếu gõ thừa máy sẽ tự động cắt bỏ. Ví dụ: scanf(“%2d%5f”,&a,&b); nhập một số nguyên vào biến nhớ a tối đa là 2 chữ số, nhập số thực vào biến nhớ b, với độ rộng tối đa là 5 chữ số. Bài tậpvận dụng: Bài 2.1 Viết chương trình nhập vào từ bàn phím 2 số nguyên. Tính tổng hai số đó, hiện kết quả ra màn hình. #include #include Void main() { 11 int a,b; clrscr(); printf(“nhap so a =”); scanf(“%d”,&a); printf(“nhap so b =”); scanf(“%d”,&b); printf(“tong hai so %d va %d la: %d”,a,b,a+b); getch(); } Bài 2.2 Viết chương trình nhập vào từ bàn phím 5 số nguyên. Hiện 5 số vừa hập ra màn hình và trung bình cộng 5 số đó. #include #include void main() { int a1,a2,a3,a4,a5; clrscr(); printf("nhap so thu nhat a1= ");scanf("%d",&a1); printf("\nnhap so thu hai a2= ");scanf("%d",&a2); printf("\nnhap so thu 3 a3= ");scanf("%d",&a3); printf("\nnhap so thu 4 a4= ");scanf("%d",&a4); printf("\nnhap so thu 5 a5= ");scanf("%d",&a5); printf("5 so vua nhap la: %d\t%d\t%d\t%d\t%d\t",a1,a2,a3,a4,a5); printf("\ntrung binh cong 5 so vua nhap la:%f",(a1+a2+a3+a4+a5)/5.0); getch() ; } 2. Các lệnh toán học Các lệnh toán học cung cấp bởi thư viện do vậy phải khai báo nạp thư viện ở đầu chương trình. Tên lệnh Ý nghĩa sin(E); Tính sin của E cos(E); Tính cos của E pow(E1,E2); Tính lũy thừa E2 của E1 sqrt(E); Tính căn bậc hai của E abs(E); Tính trị tuyệt đối của E nguyên fabs(E); Tính trị tuyệt đối của E thực 12 E là một biểu thức hay giá trị. Ví dụ 1: printf(“hay nhap vao mot so nguyen”); scanf(“%d”,&a); printf(“can bac hai cua %d la:%f”,a,sqrt(a)); Ví dụ 2: Nhập x từ bàn phím, tính f(x), đưa kết quả ra màn hình. )(3)( 3 xtgxxf  Nội dung chương trình #include #include #include Void main() { int x; clrscr(); printf(“nhap so x =”); scanf(“%d”,&x); printf(“gia tri bieu thuc f(x) = %f ”,pow((x+3),1.0/3)+sin(x)/cos(x)); getch(); } Bài tập Lập chương trình đọc vào từ bàn phím tọa độ 3 điểm A,B,C. Tính độ dài các đoạn thẳng AB, BC, CA. #include #include #include void main() { int xa,ya,xb,yb,xc,yc,xab,yab,xbc,ybc,xac,yac; float ab,bc,ac; clrscr(); printf("nhap toa do diem A:\n xa= ");scanf("%d",&xa); 13 printf("\n ya= ");scanf("%d",&ya); printf("nhap toa do diem B:\n xb= ");scanf("%d",&xb); printf("\n yb= ");scanf("%d",&yb); printf("nhap toa do diem C:\n xc= ");scanf("%d",&xc); printf("\n yc= ");scanf("%d",&yc); xab=xa-xb;yab=ya-yb; xbc=xb-xc;ybc=yb-yc; xac=xa-xc;yac=ya-yc; ab=sqrt(xab*xab+yab*yab); bc=sqrt(xbc*xbc+ybc*ybc); ac=sqrt(xac*xac+yac*yac); printf("\ndo dai doan thang AB la: %f",ab); printf("\ndo dai doan thang BC la: %f",bc); printf("\ndo dai doan thang AC la: %f",ac); getch() ; } 3. Một số lệnh làm việc với màn hình và bàn phím Để sử dụng được lệnh làm việc với màn hình và bàn phím ta phải lạp thư viện ở đầu chương trình. Tên lệnh Ý nghĩa clrscr(); Xóa màn hình textcolor(m); Đặt mầu chữ textbackground(m) ; Đặt mầu nền cho chữ getch(); Chờ bấm một phím không hiện nên màn hình getche(); Chờ bấm một phím có hiện lên màn hình wherex(); Cho biết tọa độ cột hiện thời của con trỏ nháy wherey(); Cho biết tọa độ dòng hiện thời của con trỏ nháy textmode(m); Đặt chế độ văn bản hiển thị lên mà hình Ví dụ: textcolor(red); 14 printf (“Yen Bai ”); textcolor(blue); printf(“Ngay 12 thang 09 nam 2009”); hiện lên màn hình dòng chữ “Yen Bai” mầu đỏ, dòng chữ “Ngay 12 thang 09 nam 2009” mầu xanh. II. Lệnh rẽ nhánh Lệnh rẽ nhánh cho phép chương trình thực hiện các khối lệnh tùy theo từng trường hợp cụ thể. Ngôn ngữ C có các lệnh rẽ nhánh sau: 1. Lệnh if Lệnh rẽ nhánh này cho phép rẽ hai nhánh ứng với trường hợp đúng hoặc sai của biểu thức trọn, cách viết như sau: Cú pháp: if(điều_kiện_lựa_trọn) Hành_động_1; else hành_động_2; Trong đó: - Điều kiện lựa trọn: là biểu thức logic có giá trị đúng hoặc sai - Hành động 1 và 2: là các khối lệnh để thực hiện cho trường hợp 1 và 2 tương ứng. Sơ đồ khối: Biểu_thức lựa_Chọn Hành động 1 Hành động 2 đúng sai 15 Chức năng: Máy sẽ thực hiện hành động 1 nếu điều kiện lựa chọn có giá trị dúng, ngược lại máy sẽ thực hiện hành động 2 Ví dụ: if(x%2 = =0) printf(“ so x là so chan”); else printf(“so x la so le”); Chú ý: - Mỗi khối lệnh có thể có một hoặc nhiều lệnh, nếu nhiều lệnh phải có cặp dấu đóng mở ngoặc nhọn { } - Lệnh if này có thể không sử dụng hành động 2 và từ khóa else, khi đó nếu biểu thức trọn có giá trị sai thì máy sẽ bỏ qua(không làm gì cả). Bài tập: Viết chương trình giải bất phương trình bậc nhất: ax + b > 0 #include #include void main() { int a,b; clrscr(); printf("nhap he so a = ");scanf("%d",&a); printf("nhap he so b = ");scanf("%d",&b); if(a = =0) { if(b > 0) printf("\n BPT luon dung voi moi x"); else printf("\n BPT vo nghiem"); } if(a > 0) printf("\n Nghiem cua BPT la: x > %f",-b*1.0/a); if(a < 0) printf("\n Nghiem cua BPT la: x < %f",-b*1.0/a); getch() ; } Viết chương trình giải phương trình bậc hai 16 #include #include #include void main() { int a,b,c; float d,x1,x2; clrscr(); printf("nhap he so a= ");scanf("%d",&a); printf("nhap he so b= ");scanf("%d",&b); printf("nhap he so c= ");scanf("%d",&c); if(a = = 0) printf("\nkhong phai la phuong trinh bac hai "); else { d=b*b-4*a*c; if(d < 0) printf("\nphuong trinh vo nghiem"); else if(d = = 0) printf("\nphuong trinh co nghiem kep x1,2 = %f",-b/2.0*a); else { printf("\n Nghiem cua phuong trinh la:"); printf("\n x1= %f",(-b+sqrt(d))/2.0*a); printf("\n x2= %f",(-b-sqrt(d))/2.0*a); } } getch() ; } 2. Lệnh switch 17 Lệnh switch cho phép rẽ nhiều nhánh với các trường hợp bằng xảy ra khi so sánh biểu thức chọn với các giá trị trong từng trường hợp đó. Cú pháp: switch(biểu_thức_chọn) { case giá_trị_1: hành động 1;[break;] case giá_trị_2: hành động 2;[break;] . case giá_trị_k: hành động k;[break;] default: hành động x; } Trong đó: - Biểu thức trọn: là biểu thức dạng đếm được có thể là số nguyên hoặc ký tự, dùng để so sánh lựa trọn. - Các giá trị 1,2,,k là các giá trị số nguyên hoặc ký tự để so sánh. - Các hành động 1,2,,k là các khối lệnh để thực hiện ứng với từng trường hợp trên. - Từ khóa break sau mỗi hành động để kết thúc lệnh sau mỗi trường hợp sẩy ra. Có thể có hoặc không có các từ khóa break này. Sơ đồ khối: 18 Chức năng: Máy sẽ so sánh biểu thức trọn lần lượt với các giá trị 1, giá trị 2, giá trị 3, giá trị k. Nếu gặp một giá trị i(i=1,2,..,k) nào đó bằng giá trị biểu thức chọn thì máy sẽ thực hiện các hành động đứng sau giá trị i đó đến khi gặp từ khóa break hoăc hết mọi hành động có trong lệnh switch. Nếu tất cả các trường hợp từ 1 đến k không sẩy ra điều kiện bằng thì mặc định máy sẽ thực hiện hành động X sau từ khóa default. Chú ý: - Lệnh switch có thể không có phần từ khóa default và khối lệnh x, khi đó máy sẽ không làm gì trong trường hợp không xẩy ra điều kiện bằng giữa biểu thức trọn và giá trị tương ứng của case. 19 Ví dụ: switch(t) { case 1: printf(“chu nhat”);break; case 2: printf(“thu 2”);break; case 3: printf(“thu 3”);break; case 4: printf(“thu 4”);break; case 5: printf(“thu 5”);break; case 6: printf(“thu 6”);break; case 7: printf(“thu 7”);break; default: printf(“khong la mot ngay trong tuan”); } Bài tập: Viết chương trình đọc vào từ bàn phím một số nguyên n(1  n  10) rồi đưa ra tiếng anh của số đó. Chẳng hạn ,nếu gõ vào n = 2 thì đưa ra: 2 -> TWO #include #include void main() { int so; clrscr(); printf("hay nhap vao mot so:(tu 1->10): "); scanf("%d",&so); switch(so) { case 1:printf("\n so 1 tieng anh la ONE");break; case 2:printf("\n so 2 tieng anh la TWO");break; case 3:printf("\n so 3 tieng anh la THREE");break; case 4:printf("\n so 4 tieng anh la FOUR");break; case 5:printf("\n so 5 tieng anh la FIVE");break; case 6:printf("\n so 6 tieng anh la SIX");break; case 7:printf("\n so 7 tieng anh la SEVEN");break; case 8:printf("\n so 8 tieng anh la EIGHT");break; case 9:printf("\n so 9 tieng anh la NINE");break; 20 case 10:printf("\n so 10 tieng anh la TEN");break; default: printf("\n nhap du lieu sai"); } getch() ; } III.Lệnh lặp Lệnh lặp cho phép máy thực hiện một hành động nào đó lặp lại nhiều lần, mặc dù chúng ta chỉ viết một lần, ngôn ngữ C có các lệnh lặp sau đây. 1. Lệnh for Cú pháp: for (nhóm lệnh 1;biểu thức 2; nhóm lệnh3) Hành động lặp; Trong đó : - Các nhóm lệnh 1,2,3 là các lệnh điều khiển trong quá trình lặp của for - Hành động lặp là khối lệnh để máy tính thực hiện lặp lại nhiều lần. Sơ đồ khối: Chức năng: Máy thực hiện nhóm lệnh 1 duy nhất một lần đầu tiên, sau đó thực hiện tính biểu thức 2 và nếu kêt quả tương ứng với giá trị đúng thì máy thực hiện hành đông lặp, tiếp theo máy thực hiện nhóm lênh 3, và lặp lại kiểm tra biểu thức 2 cho đến khi kết quả tương ứng với giá trị sai. 21 Vi dụ: For(i=1;i<5;i++) printf(“\n i= %d”,i); Sẽ hiện ra các số nguyên từ 1 đến 4 ra màn hình. for (i = 4;i>=1;i--) printf(“\n i = %d”,i); sẽ hiện các số nguyên từ 4 xuống 1 ra màn hình. Chú ý : - Trong hành động lặp có thể có một lệnh hoặc nhiều lệnh, nếu có nhiều lệnh thì phải có cặp dấu mở đóng ngoặc nhọn {} để tạo khối - Trong lệnh này chỉ có nhóm lệnh 1 được thực hiện một lần đầu tiên, còn lại các biểu thức 2 và nhóm lệnh 3 và hành động lặp, sẽ thực hiện nhiều lần trong quá trình lặp. - Các nhóm lệnh 1,3 và biểu thức 2 có thể không xuất hiện trong lênh for nhưng phải có dấu chấm phẩy (;) khi đó nếu không có biểu thức 2 thì máy sẽ xem như điều kiện lặp luôn luôn đúng và sẽ lặp vô tận. - Trong mỗi nhóm lệnh 1 và 3 có thể có nhiều lệnh cách nhau bởi dấu phẩy đối với biểu thức 2 có thể thay đổi bằng một nhóm lệnh và khi đó máy sẽ lấy kết quả của lệnh cuối cùng làm điều kiện lặp hoặc dừng. Bài tập Nhập vào một số n từ bàn phím, hiện lên màn hình các số chẵn và lẻ từ 1 đến n (hiện hết số chẵn rồi mới hiện số lẻ). #include #include void main() { int n,i; clrscr(); printf("Nhap vao so n= ");scanf("%d",&n); printf("\n Cac so chan tu 1 den %d la: ",n); for(i=1; i<=n;i++) if(i%2 = =0)printf(" %d",i); 22 printf("\n Cac so le tu 1 den %d la:",n); for(i=1;i<=n;i++) if(i%2!=0)printf(" %d",i); getch() ; } Nhập n, tính tổng S=1+ n 1 ... 4 1 3 1 2 1  (n số hạng) #include #include void main() { int i, n; float s = 0; clrscr(); printf(“\n nhap n= ”); scanf(“%d”,&n); for(i=1;i<=n;i++) s = s + 1.0/i ; printf(“\n Tong la: %f”,s); printf(“\n nhan mot phim bat ki de thoat ”); getch(); } Lập chương trình xếp các dấu * thành một hình thoi n dòng với n nhập từ bàn phím #include #include void main() { int n,x=40,y=1; clrscr(); printf("nhap so luong dong n= "); scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=0;j<=20;j++) 23 { gotoxy(x,y) ; printf("*"); x++; } x=40-y; y++; } getch() ; } 2. Lệnh While Cú pháp while (điều kiện lặp) Hành động lặp; Trong đó: - Điều kiện lặp : là biểu thức so sánh hoặc biểu thức nguyên - Hành động lặp: là các lệnh sẽ được thực hiện hiều lần trong quá trình lặp, nếu có nhiều lệnh phải có dấu { } để đóng khối. Sơ đồ khối Chức năng: Trong khi điều kiện lặp vẫn có giá trị đúng thì máy sẽ lặp thực hiện khối lệnh, và sẽ dừng lại nếu điều kiện sai Ví dụ: x=1; y=10; while(x<y) { Điều kiện lặp Hành động lặp đúng sai 24 Printf(“\n x = %d va y = %d”,x,y); x +=2;y--; } Chú ý: nếu hành động sai ngay từ đầu thì máy sẽ không thực hiện hành động lặp dù chỉ một lần. 3. Lệnh do- while Cú pháp: do{ hành động lặp; }while(điều kiện lặp); Trong đó: hành động lặp và điều kiện lặp giống như lệnh while ở trên Sơ đồ khối Chức năng: máy sẽ thực hiện hành động lặp nhiều lần cho đến khi điều kiện lặp có giá trị sai. Ví dụ: x=1; y=10; do{ printf(“\n x=%d và y=%d”,x,y); x+=2;y--; } while(x<y); Điều kiện lặp Hành động lặp đúng sai 25 Chú ý: - Hành động lặp ít nhất được thưc hiện một lần dù cho điều kiện lặp luôn có giá trị sai vì máy kiểm tra điều kiện lặp sau khi thực hiện hành động lặp, điều này khác với lệnh while. Bài tập: Lập chương trình nhập một dãy các số nguyên vào từ bàn phím cho đến khi gặp số 0. tính tổng các số dương và trung bình cộng các số âm #include #include void main() { int i=1,so,dem = 0; float tong_duong = 0,tong_am = 0; clrscr(); printf("\nnhap vao mot day cac so nguyen:"); do { printf("\nnhap so thu %d: ",i); scanf("%d",&so); if(so>0)tong_duong = tong_duong+so; else { tong_am = tong_am + so; if(so!=0)dem++; } i++; }while(so!=0); printf("\ntong cac so duong la: %f",tong_duong); if(dem!=0) printf("\nTBC cac so am la: %f",tong_am/dem); getch() ; } 26 Lập chương trình tìm các số có 3 chữ số sao cho số đó bằng tổng lập phương các chữ số của nó #include #include #include void main() { int i =100, tram,chuc,donvi; clrscr(); printf("cac so tim duoc la:\n"); do{ tram=i/100; chuc=(i%100)/10; donvi=(i%100)%10; if(i==(pow(tram,3)+pow(chuc,3)+pow(donvi,3))) printf(" %d",i); i++; }while(i<1000); getch(); } 4. Lệnh break, continue, goto lệnh break có tác dụng dừng vòng lặp (for ,while, do-while) trong mọi trường hợp. Lệnh continue làm cho chương trình bỏ qua phần còn lại của vòng lặp và nhảy sang lần lặp tiếp theo. Những câu lệnh viết sau lệnh continue sẽ không được thực hiện. ví dụ: for(i=0; i <10;i++) { printf(“%d”,i); if(i>5) continue; i++; 27 } Lệnh goto: Lệnh này cho phép nhảy vô điều kiện tới bất kỳ điểm nào trong chương trình. Ví dụ: Nhập vào từ bàn phím 1 số bất kì. Kiểm tra số đó là chẵn hay lẻ, hiện kết quả lên màn hình. Sau khi hiện song hỏi người dùng có tiếp tục chương trình không. Nếu có thì lập lại hành động trước đó. Nếu không thì kết thúc chương trình. #include #include void main() { int x; char ch; L: clrscr(); printf("nhap mot so bat ki: "); scanf("%d",&x); if(x%2 = =0)printf(“\nso do la so chan”); else printf(“\nso do la so le”); printf("\n co tiep tuc truong trinh ko(c/k)?"); ch=getche(); if(ch = ='c')goto L; getch() } Bài tập: Nhập vào từ bàn phím 3 số bất kì. Hiện số lớn nhất trong 3 số đó lên màn hình. Sau khi hiện song hỏi người dùng có tiếp tục chương trình không. Nếu có thì lập lại hành động trước đó. Nếu không thì kết thúc chương trình. #include #include void main() { int a1,a2,a3; 28 int max; char ch; L: clrscr(); printf("nhap so thu nhat: "); scanf("%d",&a1); printf("nhap so thu hai: "); scanf("%d",&a2); printf("nhap so thu 3: "); scanf("%d",&a3); max = a1; if(a2>max)max =a2; if(a3>max)max =a3; printf("\n so lon nhat la: %d",max); printf("\n co tiep tuc truong trinh ko(c/k)?"); ch=getche(); if(ch = ='c')goto L; getch() ; } 29 Bài 4 CHƯƠNG TRÌNH CON I. Khái niệm Chương trình con là mô-đun chương trình độc lập, hoạt động dưới sự điều khiển của một mô-đun chương trình khác. Chương trình con được dùng để tôí ưu hóa việc tổ chức chương trình, chia một chương trình lớn thành nhiều công việc độc lập nhỏ. Dùng chương trình con thực hiện các công việc nhỏ, tạo thành mô-đun. Khi đó nhiệm vụ chương trình chính chỉ là cung cấp dữ liệu đầu vào cho các mô-đun để hoàn thành công việc của mình. Một chương trình viết theo cách này gọi là chương trình cấu trúc. Có thể minh họa chương trình con như hình sau : Để nhận các dữ liệu đưa vào cho chương trình con và nếu có thể chứa dữ liệu kết quả ra chúng ta phải sử dụng tham số (parameters) của chương trình con. Tham số tồn tại dưới hai hình thức đó là tham số thực và tham số hình thức. Tham số hình thức là tham số để khai báo và xây dựng trương trình con, còn tham số thực để xác định dữ liệu đưa vào khi gọi chương trình con. Trong một số ngôn ngữ lập trình cung cấp hai loại chương trình con riêng biệt đó là hàm(function) và thủ tục (procedures) nhưng trong C chỉ cung cấp một loại đó là hàm Để tạo một hàm chúng ta cần xác định - Hàm tạo ra sẽ thực hiện công việc gì ? - Sau khi thưc hiện song có cần trả về một dữ liệu hay nhiều dữ liệu không ? - Để thực hiện được công việc đó ta cần những dữ liệu nào ? Chương trình con thực hiện công việc A Dữ liệu đưa vào để thực hiện công việc A Dữ liệu kết quả của công việc A 30 II, Khai báo và xây dựng hàm 1. khai báo hàm Khai báo hàm được thực hiện ở phần đầu chương trình, khai báo để chỉ cho máy biết các thông tin về hàm bao gồm : kiểu dữ liệu trả về có hay không ,tên hàm, các tham số bao gồm kiểu và tên của từng tham số. Cú pháp khai báo như sau : Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1,kiểu2 tham_số2 ..... ) ; Trong đó : - Tên kiểu trả về : là một tên kiểu dữ liệu quy định kết quả trả về là khiểu gì. - Tên hàm : tự đặt theo quy định đặt tên của ngôn ngữ C. - Kiểu1 tham_số1 : xác định tên của tham số thứ nhất và kiểu của tham số đó,... Ví dụ : int sum(int a , int b) ; float max(float x, float y); Nếu trong hàm không có dữ liệu trả về thì viết kiểu trả về là void nếu không có tham số thì bỏ trống và phải có cặp dấu đóng mở ngoăc () sau tên hàm. Ví dụ: void hien(); 2. Xây dựng hàm Sau khi khai báo xong hàm chúng ta có thể viết lệnh thực hiện công việc đặt ra cho chương trình con. Cú pháp: Tên_kiểu_trả_về tên_hàm(kiểu1 tham_số1,kiểu2 tham_số2 ..... ) ; { Các câu lệnh thực hiện công việc đặt ra cho hàm. } Khi cần kết thúc thực hiện hàm và trả về dữ liệu nào đây, chúng ta viết lệnh return vào vị trí cần thiết nhất trong hàm. Cú pháp: return giá-trị-dữ-liệu-trả-về; Ví dụ: 31 int sum(int a, int b) { return a+b; } Hoặc float max(float x, float y) { if(x>y) return x; else return y; } Đối với hàm có kiểu void có thể không cần lệnh return Ví dụ: void hien() { printf(“ho va ten: Nguyen Van Nam”); printf(“Ngay sinh :12\08\2009”); printf(“que quan : Yen Bai”); } Chú ý: Thông thường với những chương trình đơn giản có ít chương trình con thì người ta viết lệnh cho hàm ngay tại nơi khai báo. 3. Lời gọi hàm Khi thực hiện chương trình máy sẽ thực hiện các lệnh trong chương trình chính(hàm main), do đó để yêu cầu máy thực hiện công việc của chương trình con ta phải viết lệnh gọi chương trình con với cú pháp sau. Tên-hàm(các-tham-số-thực-chuyền-vào); Lời gọi này có thể là một câu lệnh độc lập hoặc đặt trong biểu thức, nếu đặt trong biểu thức thì hàm đó phải có giá trị trả về để thực hiện tính toán biểu thức đó. Ví dụ: printf(“Tong hai so 5 va 6 la: %d”,tong(5,6)); hoặc : float x ; x = max(a,b) ; hoăc : hien(); 32 Chú ý: Thông thường lời gọi hàm được viết trong chương trình chính, tuy nhiên có thể viết trong chương trình con khác. Các chương trình con có thể gọi lẫn nhau. 4. Các vấn đề ở tham số - Biến toàn cục và biến cục bộ Biến toàn cục là biến nhớ được khai báo ở ngoài mọi hàm(thường được khai báo ở trên cùng sau khai báo thư viện), có tác dụng đến toàn bộ chương trình cả chương trình chính và chương trình con. Biến cục bộ là biến nhớ được khai báo bên trong một chương trình con, chỉ có tác dụng ở trong chương trình con đó. Bên ngoài chương trình con đó thì biến đó không được sử dụng nữa. Ví du: #include #include int a,b; int sum() { int c = a + b; return c; } int tich() { int c ; c =a*b; return c; } void main() { clrscr(); printf(“nhap vao so a = ”); scanf(“%d”,&a); printf(“nhap vao so b = ”);scanf(“%d”,&b); printf(“\n tong hai so: %d”,sum()); printf(“\n tich hai so la: %d”,tich()); getch(); } Trong ví dụ trên hai biến a và b là biến toàn cục được sử dụng trong cả 3 hàm sum, max và main. Trong hàm sum và max đều có biến cục bộ là c 33 nhưng biến c trong hàm sum sẽ độc lập và riêng biệt so với c trong hàm max. - Tham số hình thức và tham số thực Tham số hình thức là tham số được khai báo khi xây dựng hàm, nó mang ý nghĩa hình thức để nhận dữ liệu đầu vào cho một hàm. Tham số thực là tham số được xác định khi chúng ta gọi hàm, đó là các dữ liệu được truyền vào cho hàm thực hiện tính toán. Ví dụ: int sum(int a, int b) { return (a+b); } void main() { int x = 5; printf(“tong hai so la:”, sum(5,x*2-1)); } Trong ví dụ trên tham số a và b trong khai báo hàm sum là tham số hình thức, còn lời gọi hàm sum(5,x*2-1) thì 5 và x*2-1 là tham số thực, đó là các hằng số và biểu thức. Bài tập: Viết chương trình con tìm Max, Min 3 sô nguyên, chương trình chính nhập vào 3 số nguyên, hiện số lớn nhất và nhỏ nhất ra màn hình. #include #include int max(int a,int b,int c) { int max=a; if(max<b)max=b; if(max<c)max=c; return max; } int min(int a, int b, int c) { int min=a; if(min>b)min=b; if(min>c)min=c; return min; 34 } void main() { int a,b,c; clrscr(); printf("\nnhap vao 3 so nguyen:"); printf("\nso thu nhat: ");scanf("%d",&a); printf("\nso thu hai: ");scanf("%d",&b); printf("\nso thu ba : ");scanf("%d",&c); printf("\n so lon nhat la: %d",max(a,b,c)); printf("\n so nho nhat la: %d",min(a,b,c)); getch() ; } 35 Bài 5: KIỂU DỮ LIỆU MẢNG VÀ LIỆT KÊ I, Khai báo kiểu mảng 1 khái niệm và ý nghĩa của mảng Mảng là cấu trúc dữ liệu cho phép quản lý một danh sách hữu hạn các dữ liệu cùng kiểu có kí tự Ví dụ: Để chứa 5 dữ liệu số nguyên sau 10, 12, 25, 30, 40 Chúng ta có thể sử dụng 5 biến nhớ khác nhau a = 10, b = 12, c = 25, d = 30, e = 40 tuy nhiên nếu số lượng dữ liệu tăng thì cách này không phù hợp, và chúng ta sẽ sử dụng cấu trúc mảng, minh hoạ như sau: 10 12 25 30 40 .... Các dữ liệu trong mảng phải cùng kiểu(số nguyên, số thực, ký tự ... ). Mảng để chứa dữ liệu như trên là mảng 1 chiều, chúng ta có thể sử dụng mảng 2 chiều hoặc mảng nhiều chiều. Ví dụ về mảng 2 chiều: 10 2 5 .... 45 23 56 .... 8 5 20 .... .... .... .... .... Mảng hai chiều là một bảng các dữ liệu được xếp theo hàng và cột, mỗi dữ liệu sẽ chứa trong ô được xác định bằng cách chỉ ra ở hàng nào và cột nào. 2. Khai báo kiểu mảng và biến mảng cú pháp: tên_kiểu_dữ_liệu tên_mảng[số_lượng_phần_tử_tối_đa]; Trong đó: Tên kiẻu dữ liệu qui định mảng có thể chứa được dữ liệu có kiểu như thế nào(int, float, char...) Tên mảng do chúng ta đặt theo quy định đặt tên của ngôn ngữ C 36 Ví dụ: int a[20]; float b[50]; Để khai báo mảng hai hoặc nhiều chiều ta chỉ cần thêm kích thước(số phần tử) ở chiều tiếp theo Cách khai báo mảng hai chiều: Tên_kiểu_dữ_liệu tên_mảng[kích_thước_hàng] [kích_thước_cột]; int a[10] [15]; float b[100] [100]; 3, Cách tổ chức dữ liệu mảng tên máy và truy nhập các phần tử Đối với mảng một chiều các phần tử chứa dữ liệu được sắp xếp liên tục trong bộ nhớ máy, và mỗi phần tử sẽ có một chỉ số (là số thứ tự) của phần tử đó trong mảng. Phần tử đầu tiên có chỉ số là 0, tiếp theo là 1 và tiếp tục cho đến hết, vậy sẽ dừng lại ở chỉ số bằng số lượng phần tử -1. Minh hoạ bằng hình sau: 10 25 15 30 ..... 0 1 2 3 .... Kích thước của mảng (tính bằng byte) sẽ là: số lượng phần tử của mảng nhân với kích thước của kiểu dữ liệu của mảng đó. Ví dụ: int a[20]; Thì mảng sẽ chiếm kích thước bộ nhớ là: 20 x 2 = 40 byte Để truy nhập đến các phần tử ta sử dụng tên và các chỉ số của phần tử đó theo cú pháp sau: Tên_mảng[chỉ_số_phần_tử_cần_truy_nhập]; Ví dụ: a[0]=10; Nếu là mảng hai chiều thì các dữ liệu của mảng được lưu trữ tuần tự theo quy tắc ưu tiên hàng (lưu trữ hết hàng này đến hàng khác). Các hàng và cột có chỉ số bắt đầu từ 0 theo chiều từ trên xuống theo hàng và từ trái sang phải theo cột. 37 4 6 2 .... 0 8 9 45 .... 1 2 8 6 .... 2 6 9 2 .... 3 .... .... .... .... .... 0 1 2 ...... Để truy nhập đến các phần tử của mảng hai chiều ta sử dụng tên mảng và chỉ số hàng và chỉ số cột theo cú pháp sau: Tên_mảng_hai_chiều[chỉ_số_hàng] [chỉ_số_cột]; Ví dụ: a[1][2] = 5; Chú ý: Số lượng dữ liệu lưu trong mảng có thê ít hơn số lượng phần tử đã khai báo, nhưng không vượt quá số lượng phần tử đã khai báo đó. Thông thường sử dụng mảng sẽ có một số nguyên n để lưu số lượng dữ liệu được lưu trong mảng tương ứng. Danh sách các dữ liệu lưu trong mảng phải liên tục nhau để quản lý và sử lý dễ dàng. II- Các xử lý trên mảng 1, Nhập dữ liệu vào mảng chương trình: printf("nhap so luong phan tu cho mang n = "); scanf("%d",&n); for(i=0;i<n;i++) { printf("nhap du lieu a[%d]=",i); scanf("%d",&a[i]); } 2 , Hiện dữ liệu ra màn hình chương chình: 38 printf("\n du lieu trong mang la:\n"); for(i=0;i<n;i++) { printf("%5d",a[i]); } chú ý: Nếu muốn hiển thị dữ liệu các phần tử mảng ra màn hình theo điều kiện nào đó ta chỉ cần thêm điều kiện vào sau lệnh for ví dụ: printf("du lieu trong mang la:\n"); for(i=0;i<n;i++) { if(a[i]%2 = = 1) printf("&5d",a[i]); } 3 Tính toán trên các phần tử Tính tổng: Chương trình int tong = 0; for (i=0;i<n;i++) { tong = tong + a[i]; } printf("Tong cua cac phan tu trong mang la: %d",tong); Tính trung bình float t_binh = 0; for (i=0;i<n;i++) { t_binh = t_binh +a[i]; } t_binh = t_binh /n; printf("Trung binh cua cac phan tu trong mang la: %f",t_binh); Chú ý: Để tính toán các phần tử thoả mãn một điều kiện ta chỉ cần thêm lệnh if vào trước khối lệnh tính Ví dụ: tính tổng các số dương int tong = 0; 39 for (i=0;i<n;i++) if(a[i]>0) tong = tong + a[i]; printf("tong cua cac so duong trong mang la: %d",tong); 4 Tìm kiếm các phần tử Tìm min Sơ đồ thuật toán Chương trình int min =0; for (i = 0;i<n;i ++) { if(a[min] >a[i]) min = i; } printf("so nho nhat trong mang la :%d",a[min]); Tìm max, tương tự như tìm min chỉ thay điều kiện so sánh lớn hơn(a[min]>a[i]) bằng điều kiện nhỏ hơn (a[max]< a[i]). 5 sắp xếp các phần tử - Sắp xếp các phần tử theo chiều tăng hoặc giảm Chương trình for( i = 0; i < n;i + +) for(j = i+1;j<n-1;j++) if(a[i]>a[j]) { tg = a[i]; a[i] = a[j]; a[j] = tg; } Nếu chuyển thành sắp xếp không tăng(giảm dần) chỉ cần thay điều kiện sắp xếp thành a[i] < a[j] Bài tập: Lập trình đọc vào từ bàn phím hai dãy số nguyên. Dãy A có n số, dãy B có m số. Tính tổng của mỗi dãy, so sánh xem dãy nào có tổng lớn hơn. Đưa kết quả ra màn hình bao gồm: dãy A, dãy B, tổng dãy A,B, so sánh. 40 #include #include void nhap(int n,int C[]) { for(int i=0;i<n;i++) { printf("\n Nhap so thu %d ",i+1); scanf("%d",&C[i]); } } void hien(int n,int C[]) { for(int i=0;i<n;i++) { printf(" %d",C[i]); } } int tong(int n,int C[]) { int sum=0; for(int i=0;i<n;i++) sum=sum+C[i]; return sum; } void main() { clrscr(); int A[100],B[100],m,n; printf("\nnhap so luong phan tu day A: n= "); scanf("%d",&n); printf("\nnhap so luong phan tu day B: m= "); scanf("%d",&m); printf("\n Nhap gia tri cho day A:"); nhap(n,A); printf("\n Nhap gia tri cho day B"); nhap(m,B); printf("\n Day A vua nhap la:"); hien(n,A); printf("\n Day B vua nhap la:"); hien(m,B); printf("\n tong day A la: %d",tong(n,A)); printf("\n tong day B la: %d",tong(m,B)); 41 printf("\n Day lon hon la: "); if(tong(n,A)>tong(m,B)) printf("A"); else printf("B"); getch() ; } Nhập ma trận A có m hàng n cột đưa ra màn hình ma trận A vừa nhập để kiểm tra. #include #include void main() { int n,m,i,j,A[100][100]; clrscr(); printf("nhap so hang cua ma tran: n= "); scanf("%d",&n); printf("nhap so cot cua ma tran: m= "); scanf("%d",&m); //nhap gia tri cho ma tran for(i=0;i<n;i++) { for(j=0;j<m;j++) { printf("A[%d][%d]= ",i+1,j+1); scanf("%d",&A[i][j]); } } // hien ma tran vua nhap printf("\nMa tran ban vua nhap la:"); for(i=0;i<n;i++) { printf("\n"); for(j=0;j<m;j++) { printf("%d ",A[i][j]); } } getch(); } 42 Nhập vào từ bàn phím một dãy số nguyên. Tìm số lớn nhất, nhỏ nhất và vị trí của số đó trong mảng. #include #include void main() { int i,n,A[100],max=0,min=0; clrscr(); printf("nhap so luong phan tu cua day: "); scanf("%d",&n); //nhap gia tri cho day for(i=0;i<n;i++) { printf("\n Nhap A[%d] = ",i+1); scanf("%d",&A[i]); } //tim Max, Min for(i=1;i<=n;i++) { if(A[max]<A[i]) max=i; if(A[min]>A[i]) min=i; } printf("\nSo lon nhat trong day la: %d",A[max]); printf("\t Vi tri so do la: %d",max+1); printf("\nSo nho nhat trong day la: %d",A[min]); printf("\t Vi tri so do la: %d",min+1); getch(); } Nhập và từ bàn phím một dãy số nguyên, xắp xếp dãy đó theo chiều tăng dần và giảm dần. hiện lên màn hình: dãy số vừa nhập, dãy đã sắp xếp. #include #include void nhap(int n,int C[]) { for(int i=0;i<n;i++) { 43 printf("\n Nhap so thu %d ",i+1); scanf("%d",&C[i]); } } void hien(int n,int C[]) { for(int i=0;i<n;i++) { printf(" %d",C[i]); } } void tang(int n, int C[]) { int tg; for(int i=0;i<n;i++) for(int j=0;j<n-1;j++) if(C[j] >C[j+1]) { tg=C[j]; C[j]=C[j+1]; C[j+1]=tg; } } void giam(int n, int C[]) { int tg; for(int i=0;i<n;i++) for(int j=0;j<n-1;j++) if(C[j] <C[j+1]) { tg=C[j]; C[j]=C[j+1]; C[j+1]=tg; } } void main() { clrscr(); int A[100],n; printf("\nnhap so luong phan tu day : n= "); scanf("%d",&n); printf("\n Nhap gia tri cho day :"); 44 nhap(n,A); printf("\n Day vua nhap la:"); hien(n,A); //hien day da xap xep tang dan printf("\n Day da xap xep tang dan la:"); tang(n,A); hien(n,A); //hien day da xap xep giam dan printf("\n Day da xap xep giam dan:"); giam(n,A); hien(n,A); getch() ; } 45 Bài 6 QUẢN LÝ VÀ SỬ LÝ TRUỖI KÝ TỰ I, Khái niệm 1, Khai báo biến chứa chuỗi ký tự trong C không có kiểu xâu, do vậy ngôn ngữ C sử dụng mảng để lưu trữ chuỗi ký tự, mỗi phần tử của mảng sẽ là một kiểu dữ liệu kiểu char Cú pháp khai báo: char biến_xâu[n]; với n là số nguyên dương bất kỳ (<64kb),chỉ số tối đa các ký tự của xâu. Ví dụ: char s[100]; sẽ khai báo mảng s để lưu chuỗi ký tự 2 Cách tổ chức lưu trữ chuỗi ký tự trong mảng Các ký tự được lưu theo thứ tự từ trái sang phải của chuỗi và bắt đầu bằng phần tử có chỉ số 0 cho đến hết chuỗi. Kết thúc một chuỗi (ở sau ký tự cuối cùng) sẽ có dấu hiệu đặc biệt kết thúc đó là ký tự '\0'. Và đó cũng là để xác định độ dài thực của chuỗi ký tự có trong mảng. Để truy nhập đến từng ký tự của xâu ta viết biến_xâu[giá_trị_chỉ_số]; trong đó giá trị chỉ số xác định vị trí ký tự trong xâu Vì kết thúc mỗi chuỗi lưu trong mảng có thêm ký tự ' \0' nên số ký tự tối đa có thể lưu trong mảng sẽ là số phần tử của mảng -1. Ví dụ: char s[100]; thì mảng s sẽ lưu được 99 ký tự tối đa, còn phải trừ ra một phần tử cuối để chứa '\0' T R A N Y E N \0 ... ... 0 1 2 3 4 5 6 7 8 9 10 97 98 99 giả sử sâu s lưu chuỗi "TRAN YEN" thì sâu sẽ được tổ chức như hình trên, các ký tự có chỉ số 0 đến hết trên mảng s. 46 giả sử ta có 4 lệnh sau: s[0] = 'V'; s[1] = 'a'; s[2] = 'n'; s[3] = ' '; thì sẽ thay chữ "TRAN" trong mảng thành chữ "Van " II, Các sử lý trên chuỗi ký tự Ngôn ngữ C cung cấp các lệnh sử lý xâu trong thư viện , do đó ta phải khai báo thư viện này ở đầu chương trình 1, Nhập và hiện chuỗi ký tự Chúng ta có thể sử dụng lệnh scanf() để nhập chuỗi, tuy nhiên lệnh này chỉ thực hiện nhập chuỗi không dấu cách, để nhập chuỗi đúng đắn ta sử dụng lệnh sau: gets(tên_biến) Ví dụ: char s[100]; printf(“nhập một chuỗi ký tự:”); gets(s); Chú ý: Nếu trước lệnh nhập chuỗi có lệnh nhập số thì phải xóa vùng đệm bàn phím trước khi nhập chuỗi bằng lệnh sau: fflush(stdin); Ví dụ int n; char s[50]; printf(“nhap so n =”); scanf(“%d”,&n); printf(“nhap chuoi s = ”); fflush(stdin); gets(s); Để hiện chuỗi kí tự ra màn hình ta có thể sử dụng một trong các lệnh sau: printf(“%s”,xâu_cần_hiện); puts(xâu_cần_hiện); 2, Các lệnh sử lý chuỗi ký tự - Lệnh cho biết độ dài thực sự (số ký tự) của chuỗi ký tự lưu trong mảng int strlen(s); ví dụ: char s[100] = “Ha Noi Viet Nam”; int a = strlen(s); 47 sẽ trả về độ dài thực của sâu s gán vào biến nhớ a, cụ thể là a = 15 - Lệnh gán chuỗi từ sâu này vào sâu khác strcpy(s1, s2 ); sẽ thưc hiện chép chuỗi ký tự trong sâu s2 vào s1. Chú ý: Trong ngôn ngữ C không thể sử dung phép gán ( = ) để gán hai chuỗi do đó phải sử dụng lệnh strcpy này. Lệnh nối hai sâu lại với nhau strcat( s1,s2); sẽ thưc hiện nối sâu S2 vào sâu S1 ví dụ: char s1[100] = “Ha Noi”; char s2[100] =”Viet Nam”; strcat (s1,s2); kết quả xâu s1 sẽ thay đổi và đó là:”Ha NoiViet Nam” - Lệnh chuyển sâu thành chữ hoa strupr(s); - Lệnh chuyển sâu thành chữ thường. strlwr(s); 3, Đêm ký tự, đếm từ Cho một chuỗi s và đếm xem trong chuỗi có bao nhiêu chữ thỏa mãn một điều kiện nào đó: dem = 0 for( i =0; i<strlen(s);i++) if(s[i] thỏa mãn điều kiện) dem ++; printf(“so ky tu dem duoc la: %d”,dem) ; - Thuật toán đếm số từ co trong chuỗi s theo tiêu chuẩn nhận biết đầu từ( là cặp ký tự thỏa mãn ký tự trước là dấu cách, ký tự sau khác dấu cách). if(s[0] = = ‘ ’ ) dem = 0 ; else dem = 1; for( i = 1;i < strlen(s);i++ ) { if(s[i] = =’ ’&& s[i+1]!=’ ’) dem ++; } printf(“so tu dem duoc là: %d”,dem) ; 48 4. Chuẩn hóa chuỗi ký tự Một chuỗi ký tự ở dạng chuẩn nếu không có dấu cách ở đầu , không có dấu cách ở cuối và giữa hai từ có duy nhất một dấu cách. Thuật toán chuẩn hóa được chia làm 3 bước như sau Bước 1 : Xóa dấu cách ở đầu int i = 0 ; while (s[i] = =’ ’&&i < strlen(s)) i++ ; strcpy(&s[0],&s[i]); Bước 2: Xóa dấu cách thừa giữu hai từ int i = 0; while(i<strlen(s)-1) { if(s[i] = = ‘ ‘&& s[i+1] = = ‘ ‘ ) strcpy(&s[i],&s[i+1]); else i++ } Bước 3 xóa dấu cách ở cuối chuỗi while(s[strlen(s)-1] = =’ ’ ) s[strlen(s)-1]= ‘\0’; 5 Tách từ - Tách từ đầu tiên i=0; while(s[i] = =' ')i++; for(j=0;(i<strlen(s))&&(s[i]!=' ');i++,j++) tudau[j] = s[i]; tudau[j]='\0'; - Tách từ cuối cùng i = strlen(s)-1; while(s[i] = =' ')i--; j=i; while(s[i]!=' ')i--; i++; for(int x = 0;i<=j;i++) 49 { tucuoi[x] = s[i]; x++; } tucuoi[x] = '\0'; Bài tập Lập trình đọc vào một sâu. Đọc vào từ bàn phím một kí tự bất kì, rồi đếm xem số lần xuất hiện ký tự này trong sâu. Báo kết quả ra màn hình. #include #include #include int dem(char s[ ],char a) { int d=0;//so ki tu int l=strlen(s); for(int i=0;i<l;i++) { if(s[i] = = a) d++; } return d; } void main() { int i; char s[100],ch; clrscr(); printf("\n nhap vao mot cau: "); fflush(stdin);gets(s); printf("\n Nhap vao mot ki tu bat ki:"); ch = getche(); //dem so lan xuat hien cua ki tu printf("\nki tu %c xuat hien %d lan trong xau ",ch,dem(s,ch)); getch(); } 50 Viết chương trình đọc vào một xâu. Đếm số từ của một sâu. Từ được hiểu là xâu khác rỗng và không có dấu cách. #include #include #include int sotu(char S[]) { int dem=0,n; n=strlen(S); if(S[0]!=' ')dem=1; for(int i=1;i<n;i++) { if(S[i]= =' '&& S[i+1]!=' ')dem++; } return dem; } void main() { int i; char s[100]; clrscr(); printf("\n nhap vao mot sau ki tu: "); fflush(stdin);gets(s); //dem so tu cua mot sau printf("sau ban vua nhap co: %d tu",sotu(s)); getch(); } Lập trình đọc vào một câu từ bàn phím rồi đưa ra màn hình dưới dạng một cột. thí dụ đọc vào TIÊN HỌC LỄ HẬU HỌC VĂN kết quả đưa ra thành TIÊN HỌC LỄ HẬU HỌC VĂN #include 51 #include #include void hien(char s[]) { int l=strlen(s),n=0; while(s[n]= =' ')n++; for(int i = n ; i<l ; i++) { if(s[i]!=' ') printf("% c",s[i]); else printf("\n"); } } void main() { int i; char s[100]; clrscr(); printf("\n nhap vao mot cau: "); fflush(stdin);gets(s); printf("hien cau moi tu tren mot dong la:\n"); hien(s); getch(); } Nhập vào từ bàn phím họ tên của một người. Hiện tên và họ của người đó lên màn hình. #include #include #include void main() { char s[100],ten[10],ho[10]; int i=0,j=0; clrscr(); printf("\n nhap vao ten cua mot nguoi: "); fflush(stdin);gets(s); // tach ho while(s[i]= =' ')i++; 52 do{ ho[j]=s[i]; i++; j++; }while(s[i]!=' '); ho[j]='\0'; printf("\n ho cua nguoi nay la: %s",ho); // tach ten j=0; i=strlen(s); while(s[i]= =' ')i--; int i1=i; while(s[i1]!=' ')i1--; do{ ten[j]=s[i1]; i1++; j++; }while(i1<=i); ten[j]='\0'; printf("\n ten cua nguoi nay la: %s",ten); getch(); } 53 Bai 7 BIẾN CON TRỎ 1. Biến trỏ là gì: Biến trỏ là biến đặc biệt, dùng để lưu địa chỉ vùng nhớ của một biến khác, chứ không lưu trữ giá trị của biến đó. Khích thước của biến trỏ phụ thuộc vào cách khai báo. Được minh họa bằng hình sau. Có hai kiểu biến trỏ: Biến trỏ có kiểu và biến trỏ không kiểu Biến trỏ có kiểu : loại biến trỏ này chỉ chứa địa chỉ vùng nhớ của một kiểu dữ liệu nào đó, kiểu dữ liệu này được xác định khi khai báo biến trỏ. Và kiểu của biến trỏ xác định kích thước của vùng nhớ mà biến trỏ đến Ví dụ biến trỏ kiểu int sẽ trỏ đến vùng nhớ có kích thước là 2 bytes, kiểu floast sẽ trỏ đến vùng nhớ có kích thước là 4 bytes. Biến trỏ không kiểu: loại biến trỏ này có thể chứa địa chỉ vùng nhớ có kích thước bất kỳ. Vùng nhớ động: là vùng nhớ được cấp phát khi cần và giải phóng khỏi bộ nhớ khi sử dụng song. Để truy cập đến vùng nhớ động chúng ta phải dùng biến trỏ. 2 khai báo biến trỏ: - biến trỏ có kiểu kiểu_dữ_liệu_mà_biến_trỏ_đến *tên_biến_trỏ; - biến trỏ không kiểu: void *tên_biến_trỏ ví dụ: 54 int *p,*q; float *a,*b; void *i; 3 Các thao tác trên biến trỏ Xác định địa chỉ của vùng nhớ(hoặc biến nhớ) Ngôn ngữ C sử dụng toán tử & hoặc hàm để lấy địa chỉ vùng nhớ của một biến Cú pháp xác định địa chỉ vùng nhớ thông qua toán tử &. &tên_biến_lấy_địa_chỉ Hàm xác định địa chỉ. FP_SEG(đối_tượng_lấy_địa_chỉ) Ví dụ: int a = 5,*p; p = &a; Truy nhập dữ liệu của vùng nhớ qua biến trỏ Chúng ta sử dụng toán tử * để truy nhập dữ liệu trên vùng nhớ đang được trỏ bởi biến trỏ như sau: *tên-biến-trỏ Ví dụ: int a=5,*p; p = &a; a = *p+2; kết quả a = 7.  Các phép toán - Phép cộng trừ: +, - - Phép tăng giảm: ++, - -, +=, - = Phép tăng giảm tác động lên biến trỏ không thực hiện theo kiểu số học đơn thuần, mà máy sẽ thực hiện chuyển nơi trỏ của biến trỏ đến ô nhớ tiếp theo sau hoặc trước so với ô trỏ hiện tại. Ví dụ: 55 P - -; Sẽ cho biến trỏ P trỏ đến ô nhớ kế tiếp ô nhớ hiện tại. - Phép so sánh: ,= =,>=, <=, != Phép so sánh trên biến trỏ sẽ thực hiện so sánh địa chỉ được lưu ở trong biến trỏ và trả về kết quả dạng dúng hoặc sai tương ứng với phép so sánh được sử dụng. 4 Cấp phát bộ nhớ Để sử dụng bộ nhớ một cách tối ưu chúng ta thực hiện cấp phát động vùng nhớ khi cần và giải phóng chúng khi không sử dụng nữa. Cú pháp: Tên_biến = (tên_kiểu*)malloc(số_byte); Trong đó: Số_byte = số lượng * sizeof(kiểu) Ví dụ: int *a =(int*)malloc(100*sizeof(int)); sẽ tạo ra một vùng nhớ để chứa 100 số nguyên và được trỏ bởi biến trỏ a. Hàm giải phóng vùng nhớ free(tên_biến_trỏ); Bài tập Khai báo 1 biến nguyên a và biến trỏ kiểu nguyen p, cho p trỏ đến a. in ra màn hình địa chỉ của a, nội dung trong p, địa chỉ của biến trỏ p. #include #include #include void main() { int a, *p; clrscr(); p=&a; printf("\nDia chi cua bien nho a= %x",&a); printf("\nNoi dung cua bien tro p= %x",p); printf("\n dia chi cu bien tro p= %x",&p); getch(); 56 } Viết chương trình nhập vào từ bàn phím n số nguyên, cấp phát một vùng nhớ động để lưu trữ n số nguyên đó, hiện các số vừa nhập, tính tổng, trung bình cộng, max, min của dãy số đó. #include #include #include void main() { clrscr(); int *a,n ,i; printf("\n nhap so luong phan tu n= "); scanf("%d",&n); // cap phat bo nho a=(int*)malloc(n*sizeof(int)); //nhap du lieu for(i=0;i<n;i++) { printf("\n Nhap so thu %d ",i+1); scanf("%d",a+i); } // hien du lieu printf("\n day so vua nhap la: "); for(i=0; i<n; i++) { printf(" %d",*(a+i)); } //tinh tong int tong=0; for(i=0; i<n; i++) { tong=tong+ *(a+i); } printf("\n tong cua day so do la: %d",tong); //tinh tb cong 57 printf("\n Trung binh cong cua day do la: %f",tong/(n*1.0)); // tim max int max= *a; for(i=0; i<n; i++) { if(max< *(a+i)) max= *(a+i); } printf("\n so lon nhat la: %d",max); //tim min int min = *a; for(i=0; i<n; i++) { if(min >*(a+i)) min = *(a+i); } printf("\n so nho nhat la: %d", min); getch(); }

Các file đính kèm theo tài liệu này:

  • pdfde_cuong_ngon_ngu_c_827.pdf
Tài liệu liên quan