Giáo trình Lập trình căn bản (Bản đẹp)
1. Giới thiệu
a. Tổng quan về ngôn ngữ lập trình C
C là ngôn ngữ lập trình cấp cao, được sử dụng rất phổ biến để lập
trình hệ thống cùng với Assembler và phát triển các ứng dụng.
Vào những năm cuối thập kỷ 60 đầu thập kỷ 70 của thế kỷ XX,
Dennish Ritchie (làm việc tại phòng thí nghiệm Bell) đã phát triển ngôn ngữ
lập trình C dựa trên ngôn ngữ BCPL (do Martin Richards đưa ra vào năm
1967) và ngôn ngữ B (do Ken Thompson phát triển từ ngôn ngữ BCPL vào
năm 1970 khi viết hệ điều hành UNIX đầu tiên trên máy PDP-7) và được cài
đặt lần đầu tiên trên hệ điều hành UNIX của máy DEC PDP-11.
Năm 1978, Dennish Ritchie và B.W Kernighan đã cho xuất bản quyển
“Ngôn ngữ lập trình C” và được phổ biến rộng rãi đến nay.
Lúc ban đầu, C được thiết kế nhằm lập trình trong môi trường của hệ
điều hành Unix nhằm mục đích hỗ trợ cho các công việc lập trình phức tạp.
Nhưng về sau, với những nhu cầu phát triển ngày một tăng của công việc lập
trình, C đã vượt qua khuôn khổ của phòng thí nghiệm Bell và nhanh chóng
hội nhập vào thế giới lập trình để rồi các công ty lập trình sử dụng một cách
rộng rãi. Sau đó, các công ty sản xuất phần mềm lần lượt đưa ra các phiên
bản hỗ trợ cho việc lập trình bằng ngôn ngữ C và chuẩn ANSI C cũng được
khai sinh từ đó.
Ngôn ngữ lập trình C là một ngôn ngữ lập trình hệ thống rất mạnh và
rất “mềm dẻo”, có một thư viện gồm rất nhiều các hàm (function) đã được
tạo sẵn. Người lập trình có thể tận dụng các hàm này để giải quyết các bài
toán mà không cần phải tạo mới. Hơn thế nữa, ngôn ngữ C hỗ trợ rất nhiều
phép toán nên phù hợp cho việc giải quyết các bài toán kỹ thuật có nhiều
công thức phức tạp. Ngoài ra, C cũng cho phép người lập trình tự định nghĩa
thêm các kiểu dữ liệu trừu tượng khác. Tuy nhiên, điều mà người mới vừa4
học lập trình C thường gặp “rắc rối” là “hơi khó hiểu” do sự “mềm dẻo” của
C. Dù vậy, C được phổ biến khá rộng rãi và đã trở thành một công cụ lập
trình khá mạnh, được sử dụng như là một ngôn ngữ lập trình chủ yếu trong
việc xây dựng những phần mềm hiện nay.
Ngôn ngữ C có những đặc điểm cơ bản sau:
o Tính cô đọng (compact): C chỉ có 32 từ khóa chuẩn và 40 toán tử
chuẩn, nhưng hầu hết đều được biểu diễn bằng những chuỗi ký tự ngắn gọn.
o Tính cấu trúc (structured): C có một tập hợp những chỉ thị của lập
trình như cấu trúc lựa chọn, lặp Từ đó các chương trình viết bằng C được
tổ chức rõ ràng, dễ hiểu.
o Tính tương thích (compatible): C có bộ tiền xử lý và một thư viện
chuẩn vô cùng phong phú nên khi chuyển từ máy tính này sang máy tính
khác các chương trình viết bằng C vẫn hoàn toàn tương thích.
o Tính linh động (flexible): C là một ngôn ngữ rất uyển chuyển và cú
pháp, chấp nhận nhiều cách thể hiện, có thể thu gọn kích thước của các mã
lệnh làm chương trình chạy nhanh hơn.
o Biên dịch (compile): C cho phép biên dịch nhiều tập tin chương
trình riêng rẽ thành các tập tin đối tượng (object) và liên kết (link) các đối
tượng đó lại với nhau thành một chương trình có thể thực thi được
(executable) thống nhất.
Ngày nay có một số ngôn ngữ lập trình cấp cao khác như C++, C#,
Đây là các ngôn ngữ lập trình hướng đối tượng và có thể xem là ngôn ngữ C
nâng cấp. Do đó, toàn bộ những gì bạn học được trong ngôn ngữ C đều có
thể áp dụng cho các ngôn ngữ nâng cấp đó.
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Giáo trình Lập trình căn bản (Bản đẹp)
ần tử. Bạn dùng lệnh break để thoát khỏi vòng lặp dowhile trước khi bước sang phần tử thứ 51. Thêm đoạn lệnh sau vào trước dòng 11: if(i >= MAX) //kiem tra phan tu buoc sang 51 { printf("Mang da day!\n"); //thong bao "Mang da day" i++; //tang i len 1 do dong 14 giam i xuong 1 break; //thoat khoi vong lap dowhile } 1.6. Khởi tạo mảng Ví dụ 5 : Có 4 loại tiền 1, 5, 10, 25 và 50 đồng. Hãy viết chương trình nhập vào số tiền sau đó cho biết số số tiền trên gồm mấy loại tiền, mỗi loại bao nhiêu tờ. Phác họa lời giải: Số tiền là 246 đồng gồm 4 tờ 50 đồng, 1 tờ 25 đồng, 2 tờ 10 đồng, 0 tờ 5 đồng và 1 tờ 1 đồng, Nghĩa là bạn phải xét loại tiền lớn trước, nếu hết khả năng mới xét tiếp loại kế tiếp. Chương trình /* Nhap vao so tien va doi tien ra cac loai 50, 25, 10, 5, 1 */ #include #include #define MAX 5 90 void main(void) { int itien[MAX] = {50, 25, 10, 5, 1}; //Khai bao va khoi tao mang voi 5 phan tu int i , isotien, ito; printf("Nhap vao so tien: "); scanf("%d", &isotien); //Nhap vao so tien for (i = 0; i < MAX; i++) { ito = isotien/itien[i]; //Tim so to cua loai tien thu i printf("%4d to %2d dong\n", ito, itien[i]); isotien = isotien%itien[i]; //So tien con lai sau khi da loai tru cac loai tien da co } getch(); } Kết quả in ra màn hình Nhap vao so tien: 246 4 tờ 50 đồng 1 tờ 25 đồng 2 tờ 10 đồng 0 tờ 5 đồng 1 tờ 1 đồng _ * Điều gì sẽ xảy nếu số phần tử mảng lớn hơn số mục, số phần tử dôi ra không được khởi tạo sẽ điền vào số 0. Nếu số phần tử nhỏ hơn số mục khởi tạo trình biên dịch sẽ báo lỗi. Ví dụ 6 : int itien[5] = {50, 25}, phần tử itien[0] sẽ có giá trị 50, itien[1] có giá trị 25, 91 itien[2], itien[3], itien[4] có giá trị 0. int itien[3] = {50, 25, 10, 5, 1} → trình biên dịch báo lỗi 1.7. Khởi tạo mảng không bao hàm kích thước Trong ví dụ trên giả sử ta khai báo int itien[] = {50, 25, 10, 5, 1}. Khi đó trình biên dịch sẽ đếm số mục trong danh sách khởi tạo và dùng con số đó làm kích thước mảng. 1.8. Mảng nhiều chiều Ví dụ 7 : khai báo mảng 2 chiều int ia[5][10]; với int là kiểu mảng, ia là tên mảng, số phần tử mảng là 5 x 10. Ý nghĩa: Khai báo một mảng 2 chiều số nguyên gồm 50 phần tử, mỗi phần tử có kiểu int. 1.9. Tham chiếu đến từng phần tử mảng 2 chiều Sau khi được khai báo, mỗi phần tử trong mảng 2 chiều đều có 2 chỉ số để tham chiếu, chỉ số hàng và chỉ số cột. Chỉ số hàng bắt đầu từ 0 đến số hàng – 1 và chỉ số cột bắt đầu từ 0 đến số cột – 1. Tham chiếu đến một phần tử trong mảng 2 chiều ia: ia[chỉ số hàng][chỉ số cột] 92 ia[3][2] là phần tử tại hàng 3 cột 2 trong mảng 2 chiều xem như là một biến kiểu int. 1.10. Nhập dữ liệu cho mảng 2 chiều for (i = 0; i < 5; i++) //vòng for có giá trị i chạy từ 0 đến 4 cho hàng for (ij = 0; ij < 10; ij++) //vòng for có giá trị ij chạy từ 0 đến 9 cho cột { printf("Nhap vao phan tu ia[%d][%d]: ", i + 1, ij + 1); scanf("%d", &ia[i][ij]); } * Thứ tự nhập dữ liệu vào mảng 2 chiều 2. Chuỗi Chuỗi được xem như là một mảng 1 chiều gồm các phần tử có kiểu char như mẫu tự, con số và bất cứ ký tự đặc biệt như +, -, *, /, $, # Theo quy ước, một chuỗi sẽ được kết thúc bởi ký tự null ('\0' : kí tự rỗng). Ví dụ: chuỗi "Infoworld" được lưu trữ như sau: 93 2.1. Cách khai báo chuỗi Ví dụ 8 : char cname[30]; Ý nghĩa: Khai báo chuỗi cname có chiều dài 30 kí tự. Do chuỗi kết thúc bằng kí tự null, nên khi bạn khai báo chuỗi có chiều dài 30 kí tự chỉ có thể chứa 29 kí tự. Ví dụ 9 : Nhập vào in ra tên Chương trình /* Chuong trinh nhap va in ra ten*/ #include #include void main(void) { char cname[30]; printf("Cho biet ten cua ban: "); scanf("%s", cname); printf("Chao ban %s\n", cname); getch(); } Kết quả in ra màn hình Cho biet ten cua ban: Minh Chao ban Minh Lưu ý: không cần sử dụng toán tử địa chỉ & trong cname trong lệnh scanf("%s", fname), vì bản thân fname đã là địa chỉ. Dùng hàm scanf để nhập chuỗi có hạn chế như sau: Khi bạn thử lại chương trình trên với dữ liệu nhập vào là Mai Lan, nhưng khi in ra bạn chỉ nhận được Mai. Vì hàm scanf nhận vào dữ liệu đến khi gặp khoảng trắng thì kết thúc. 94 2.2. Hàm nhập (gets), xuất (puts) Sử dụng hàm gets, puts phải khai báo #include - Hàm gets dùng để nhập một chuỗi kí tự từ bàn phím thông qua stdin Dạng hàm: char * gets(char *s); Hoạt động: Hàm tiến hành nhận một dãy kí tự từ stdin cho đến khi gặp kí tự ‘\n’ (do đó nếu trong stdin đã có sẵn kí tự ‘\n’ rồi thì hàm gets sẽ không chờ người sử dụng nhập dữ liệu vào nữa, ta nói hàm gets đã bị trôi). Kí tự ‘\n’ sẽ loại khỏi stdin nhưng không được đặt vào chuỗi. Chuỗi nhận được sẽ tự động bổ sung thêm kí tự ‘\0’ để đánh dấu sự kết thúc chuỗi rồi được đặt vào vùng nhớ do con trỏ s trỏ tới. Hàm trả về địa chỉ của chuỗi nhận được. Ví dụ để nhập từ bàn phím một chuỗi kí tự rồi lưu vào biến HoTen ta viết như sau: Char HoTen[25]; gets(HoTen); - Hàm puts dùng để đưa một chuỗi kí tự ra ngoài màn hình thông qua stdout. Dạng hàm: int puts(const char *s); Hoạt động: Hàm sẽ đưa chuỗi do con trỏ s quản lý và một kí tự ‘\n’ lên stdout. Nếu thành công hàm sẽ trả về kí tự cuối cùng được xuất (chính là kí tự ‘\n’), ngược lại hàm trả về EOF. Ví dụ câu lệnh puts(“Hello”);, sẽ đưa ra màn hình dòng chữ “Hello” sau đó xuống dòng. Tương tự câu lệnh printf(“Hello\n”); Ví dụ 10 Chương trình /* Chuong trinh nhap va in ra ten*/ #include #include void main(void) { 95 char cname[30]; puts("Cho biet ten cua ban: "); gets(cname); puts("Chao ban "); puts(cname); getch(); } Kết quả in ra màn hình Cho biet ten cua ban: Mai Lan Chao ban Mai Lan _ Lưu ý: Đối với hàm puts kí tự kết thúc chuỗi null (\0) được thay thế bằng kí tự newline (\n). Hàm gets và puts chỉ có 1 đối số và không sử dụng dạng thức trong nhập liệu cũng như xuất ra màn hình. 2.3. Khới tạo chuỗi Ví dụ 11 Chương trình /* Chuong trinh nhap va in ra ten*/ #include #include void main(void) { char cname[30]; char chao[] = "Chao ban"; printf("Cho biet ten cua ban: "); gets(cname); 96 printf("%s %s.\n", chao, cname); getch(); } Kết quả in ra màn hình Cho biet ten cua ban: Mai Lan Chao ban Mai Lan _ Lưu ý: Chiều dài tối đa của chuỗi khởi tạo bằng số kí tự + 1 (kí tự null). Với chuỗi chao có chiều dài là 9. 2.4. Mảng chuỗi Ví dụ 12 Chương trình /* Chuong trinh nhap thang (so) và in ra thang (chu) tuong ung*/ #include #include void main(void) { char cthang[12][15] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; int ithang; printf("Nhap vao thang (1-12): "); scanf("%d", &ithang); printf("%s.\n", cthang[ithang-1]); getch(); } Kết quả in ra màn hình 97 Nhap vao thang (1-12): 2 February _ 98 Bài tập hết chương Bài 1. Viết hàm tìm số lớn nhất, nhỏ nhất trong một mảng n số nguyên. Bài 2. Viết hàm sắp xếp tăng dần, giảm dần của một dãy số cho trước. Bài 3. Viết hàm tách tên và họ lót từ một chuỗi cho trước. Bài 4. Viết hàm cắt bỏ khoảng trắng thừa ở giữa, hai đầu. Bài 5. Viết hàm chuyển đổi 1 chuỗi sang chữ thường và 1 hàm chuyển đổi sang chữ HOA. Bài 6. Viết hàm chuyển đổi 1 chuỗi sang dạng Title Case (kí tự đầu của mỗi từ là chữ HOA, các kí tự còn lại chữ thường) Bài 7. Viết chương trình nhập vào 1 chuỗi và in ra chuỗi đảo ngược. Ví dụ: Nhập vào chuỗi "Lap trinh C can ban" In ra "nab nac C hnirt paL" Bài 8. Viết chương trình nhập vào một chuỗi ký tự rồi đếm xem trong chuỗi đó có bao nhiêu chữ 'th'. Bài 9. Biết rằng năm 0 là năm Canh thân (năm kỵ nhau có chu kì là 3, năm hợp nhau có chu kì là 4). Hãy viết chương trình cho phép gõ vào năm dương lịch (ví dụ 1997), xuất ra năm âm lịch (Đinh sửu) và các năm kỵ và hợp. Có 12 chi: Tý, Sửu, Dần, Mão, Thìn, Tỵ, Ngọ, Mùi, Thân, Dậu, Tuất, Hợi. Có 10 can: Giáp, Ất, Bính, Đinh, Mậu, Kỷ, Canh, Tân, Nhâm, Quý. 99 Mục lục Chương I. Giới thiệu về ngôn ngữ C ...................................................................... 1 1. Giới thiệu ......................................................................................................................... 3 2. Khởi động và thoát chương trình ...................................................................................... 9 Chương II. Các thành phần trong ngôn ngữ C ..................................................... 11 1. Từ khóa ......................................................................................................................... 11 2. Tên ................................................................................................................................ 11 3. Kiểu dữ liệu ................................................................................................................... 12 4. Ghi chú .......................................................................................................................... 15 5. Khai báo biến ................................................................................................................. 16 6. Nhập/ xuất dữ liệu.......................................................................................................... 21 Chương III. Cấu trúc rẽ nhánh có điều kiện .......................................................... 27 1. Lệnh và khối lệnh .......................................................................................................... 27 1.1. Lệnh ....................................................................................................................... 27 1.2. Khối lệnh ................................................................................................................ 27 2. Lệnh if ........................................................................................................................... 27 2.1. Dạng 1 (if thiếu) ..................................................................................................... 27 2.2. Dạng 2 (if đủ) ......................................................................................................... 31 2.3. Cấu trúc else if ........................................................................................................ 35 2.4. Cấu trúc if lồng nhau............................................................................................... 37 3. Lệnh switch ................................................................................................................... 40 3.1. Cấu trúc switch.case (switch thiếu) ..................................................................... 41 3.2. Cấu trúc switch.case (switch đủ) ......................................................................... 44 3.3. Cấu trúc switch lồng nhau ....................................................................................... 46 Chương IV. Cấu trúc vòng lặp.............................................................................. 53 1. Lệnh for ......................................................................................................................... 53 2. Lệnh break ..................................................................................................................... 59 3. Lệnh continue ................................................................................................................ 60 4. Lệnh while ..................................................................................................................... 62 5. Lệnh dowhile ............................................................................................................. 64 6. Vòng lặp lồng nhau ........................................................................................................ 67 7. So sánh sự khác nhau của các vòng lặp .......................................................................... 69 Chương V. Hàm ................................................................................................... 71 100 1. Các ví dụ về hàm ........................................................................................................... 71 2. Tham số dạng tham biến và tham trị ............................................................................... 80 3. Sử dụng biến toàn cục .................................................................................................... 81 4. Dùng dẫn hướng #define ................................................................................................ 84 Chương VI. Mảng và chuỗi .................................................................................. 86 1. Mảng ............................................................................................................................. 86 1.1. Cách khai báo mảng ................................................................................................ 86 1.2. Tham chiếu đến từng phần tử mảng ........................................................................ 86 1.3. Nhập dữ liệu cho mảng ........................................................................................... 87 1.4. Đọc dữ liệu từ mảng................................................................................................ 87 1.5. Sử dụng kỹ thuật Sentinal ....................................................................................... 89 1.6. Khởi tạo mảng ........................................................................................................ 90 1.7. Khởi tạo mảng không bao hàm kích thước .............................................................. 92 1.8. Mảng nhiều chiều ................................................................................................... 92 1.9. Tham chiếu đến từng phần tử mảng 2 chiều ............................................................ 92 1.10. Nhập dữ liệu cho mảng 2 chiều ........................................................................... 93 2. Chuỗi ............................................................................................................................. 93 2.1. Cách khai báo chuỗi ................................................................................................ 94 2.2. Hàm nhập (gets), xuất (puts) ................................................................................... 95 2.3. Khới tạo chuỗi ........................................................................................................ 96 2.4. Mảng chuỗi ............................................................................................................. 97 101
File đính kèm:
- giao_trinh_lap_trinh_can_ban_ban_dep.pdf