Giáo trình Lập trình căn bản bao gồm những kiến thức từ đơn giản đến phức tạp. Nội dung của giáo trình được chia thành bảy chương. Trong mỗi chƣơng đều có phần giới thiệu lý thuyết, phần bài tập mẫu và cuối cùng là phần bài tập tự giải để sinh viên tự mình kiểm tra những kiến thức và kinh nghiệm đã đƣợc học. Mời các bạn cùng tham khảo phần 1 để nắm vững nội dung các bài học nhé.
lOMoARcPSD|16991370 BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ TH.S TRẦN THỊ HOA GIÁO TRÌNH LẬP TRÌNH CĂN BẢN Hà Nội, 2013 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ TH.S TRẦN THỊ HOA GIÁO TRÌNH LẬP TRÌNH CĂN BẢN Hà Nội, 2013 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 MỤC LỤC MỤC LỤC i DANH MỤC CÁC BẢNG vii DANH MỤC CÁC HÌNH viii LỜI NĨI ĐẦU ix CHƢƠNG 1: CÁC THÀNH PHẦN CƠ BẢN CỦA NGƠN NGỮ C 1.1 Giới thiệu ngơn ngữ C 1.2 Tập ký tự, từ khóa, tên gọi 1.2.1 Tập ký tự 1.2.2 Từ khóa 1.2.3 Tên gọi 1.3 Câu lệnh, khối lệnh, lời giải thích 1.3.1 Câu lệnh 1.3.2 Khối lệnh 1.3.3 Lời giải thích 1.4 Chỉ thị tiền biên dịch 1.5 Cấu trúc chƣơng trình C 1.6 Một vài chƣơng trình C đơn giản 1.7 Vận hành chƣơng trình máy 1.7.1 Tạo tệp chƣơng trình gốc 1.7.2 Dịch chƣơng trình 1.7.3 Chạy chƣơng trình 10 Bài tập cuối chƣơng 11 CHƢƠNG 2: KIỂU DỮ LIỆU, HẰNG, BIẾN, MẢNG VÀ BIỂU THỨC 12 2.1 Kiểu liệu 12 i Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 2.1.1 Các kiểu liệu đơn giản thông dụng 12 2.1.2 Kiểu liệu liệt kê 13 2.2 Hằng, biến 14 2.2.1 Hằng 14 2.2.2 Biến 16 2.2.3 Kiểu mảng 17 2.2.4 Toán tử sizeof 19 2.3 Định nghĩa kiểu liệu 20 2.4 Biểu thức 20 2.4.1 Khái niệm biểu thức 20 2.4.2 Các phép toán 21 2.4.3 Chuyển đổi kiểu giá trị 24 2.4.4 Câu lệnh gán Biểu thức gán 25 2.4.5 Biểu thức điều kiện 25 2.4.6 Thứ tự ƣu tiên phép toán 26 Bài tập cuối chƣơng 28 CHƢƠNG 3: VÀO - RA DỮ LIỆU 29 3.1 Hàm printf 29 3.1.1 Khai báo hàm 29 3.1.2 Chuỗi điều khiển 29 3.1.3 Đặc tả 30 3.1.4 Ký tự chuyển dạng 31 3.1.5 Danh sách đối 32 3.1.6 Giá trị hàm printf 33 3.2 Hàm scanf 33 ii Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 3.2.1 Khai báo hàm 34 3.2.2 Danh sách đối 34 3.2.3 Dòng vào trƣờng vào 34 3.2.4 Chuỗi điều khiển 34 3.2.5 Ký tự chuyển dạng 35 3.2.6 Giá trị hàm scanf 37 3.3 Dòng vào stdin hàm scanf, gets, getchar 37 3.3.1 Hàm gets 37 3.3.2 Hàm getchar 38 3.4 Các hàm xuất ký tự puts, putchar 39 3.4.1 Hàm puts 39 3.4.2 Hàm putchar 39 3.5 Các hàm vào hình, bàn phím 39 3.5.1 Hàm getch 39 3.5.2 Hàm getche 39 3.5.3 Hàm putch 40 3.5.4 Hàm kbhit 40 3.5.5 Hàm xóa hình 41 3.5.6 Hàm di chuyển trỏ 41 Bài tập cuối chƣơng 42 CHƢƠNG 4: CÁC CÂU LỆNH ĐIỀU KHIỂN 44 4.1 Các câu lệnh rẽ nhánh 44 4.1.1 Câu lệnh if 44 4.1.2 Câu lệnh switch 48 4.1.3 Nhãn Câu lệnh goto 53 iii Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 4.2 Các câu lệnh có cấu trúc lặp 56 4.2.1 Câu lệnh for 56 4.2.2 Câu lệnh while 62 4.2.3 Câu lệnh do…while 65 4.3 Câu lệnh break câu lệnh continue 68 4.3.1 Câu lệnh break 68 4.3.2 Câu lệnh continue 69 Bài tập cuối chƣơng 71 CHƢƠNG 5: CON TRỎ VÀ HÀM 74 5.1 Con trỏ 74 5.1.1 Địa 74 5.1.2 Con trỏ 74 5.2 Hàm 76 5.2.1 Cách tổ chức hàm 77 5.2.2 Biến/mảng tự động 80 5.2.3 Biến/mảng 81 5.2.4 Cách truyền tham số gọi hàm 82 5.2.5 Hàm có đối trỏ 84 5.2.6 Con trỏ mảng chiều 86 5.2.7 Con trỏ mảng nhiều chiều 88 5.2.8 Hàm kiểu trỏ 91 5.2.9 Con trỏ tới hàm (Con trỏ hàm) 92 5.2.10 Hàm có đối trỏ hàm 94 5.2.11 Hàm đệ quy 95 Bài tập cuối chƣơng 99 iv Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 CHƢƠNG 6: KIỂU CẤU TRÚC, KIỂU HỢP 101 6.1 Kiểu cấu trúc 101 6.1.1 Định nghĩa kiểu cấu trúc 101 6.1.2 Khai báo biến cấu trúc 103 6.1.3 Truy nhập tới thành phần cấu trúc 104 6.1.4 Sử dụng cấu trúc 105 6.1.5 Mảng cấu trúc 107 6.1.6 Khởi đầu cho cấu trúc phép gán cấu trúc 109 6.2 Kiểu Hợp 110 6.2.1 Định nghĩa kiểu hợp 110 6.2.2 Khai báo biến kiểu hợp 110 6.3 Cấu trúc tự trỏ danh sách liên kết 114 6.3.1 Cấp phát nhớ động 114 6.3.2 Cấu trúc tự trỏ danh sách liên kết 114 6.3.3 Các phép toán danh sách liên kết 116 6.3.4 Ngăn xếp 126 6.3.5 Hàng đợi 129 Bài tập cuối chƣơng 132 CHƢƠNG 7: THAO TÁC TRÊN CÁC TỆP TIN 134 7.1 Giới thiệu chung 134 7.2 Kiểu nhập xuất nhị phân văn 135 7.2.1 Kiểu nhập xuất nhị phân 135 7.2.2 Kiểu nhập xuất văn 135 7.3 Các hàm xử lý tệp cấp 136 7.3.1 Các hàm dùng chung cho hai kiểu nhập xuất 136 v Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 7.3.2 Các hàm nhập xuất ký tự 139 7.3.3 Các hàm nhập xuất theo kiểu văn 141 7.3.4 Các hàm nhập xuất theo kiểu nhị phân 147 Bài tập cuối chƣơng 153 PHỤ LỤC I-1 PHỤ LỤC II-1 PHỤ LỤC III-1 TÀI LIỆU THAM KHẢO 153 vi Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 DANH MỤC CÁC BẢNG Bảng 1.1 Danh sách từ khóa ngơn ngữ C Bảng 2.1 Các phép tốn hai ngơi 21 Bảng 2.2 Các phép toán với bit 22 Bảng 2.3 Các phép toán so sánh 22 Bảng 2.4 Các phép toán logic 23 Bảng 2.5 Thứ tự ưu tiên phép toán 26 Bảng 3.1 Danh sách ký tự chuyển dạng hàm printf 32 Bảng 3.2 Danh sách ký tự chuyển dạng kiểu đối hàm scanf 35 136 Bảng 7.1 Các kiểu truy nhập tệp vii Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 DANH MỤC CÁC HÌNH Hình 1.1 Màn hình soạn thảo Turbo C Hình 4.1 Sơ đồ khối câu lệnh if dạng (nhánh else nối tắt) lệnh if dạng 45 Hình 4.2 Sơ đồ khối câu lệnh switch…case 50 Hình 4.3 Sơ đồ khối câu lệnh goto kết hợp với câu lệnh if 54 Hình 4.4 Sơ đồ khối câu lệnh for 57 Hình 4.5 Sơ đồ khối câu lệnh while 63 Hình 4.6 Sơ đồ khối câu lệnh do… while 66 viii Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 tham số thực x y cho đối px py phải dùng cách viết &x, &y, không đƣợc viết x, y Phân loại đối: Nhƣ vậy, đối hàm đƣợc chia thành hai loại: - Loại thứ dùng để chứa giá trị biết, gọi đối vào - Loại thứ hai dùng để chứa kết nhận đƣợc, gọi đối Vậy từ ví dụ ta đặt câu hỏi sử dụng đối trỏ? câu trả lời là: Khi cần thay đổi giá trị tham số thực đối tƣơng ứng phải trỏ hay nói cách khác đối phải trỏ 5.2.6 Con trỏ mảng chiều Phép tốn lấy địa chỉ: Giả sử có khai báo float a[10]; phép tốn &a[i] cho địa phần tử a[i] mảng Tên mảng địa chỉ: Với mảng a đƣợc khai báo nhƣ máy bố trí 10 khoảng nhớ liên tiếp (mỗi khoảng nhớ byte) Nhƣ biết địa phần tử mảng a dễ dàng suy địa phần tử lại Tên mảng địa chỉ, địa phần tử mảng Nhƣ vậy, cách viết sau tƣơng đƣơng: - a tƣơng đƣơng với &a[0] - a + i tƣơng đƣơng với &a[i] - *(a+i) tƣơng đƣơng với a[i] Khi gán tên mảng a cho trỏ p kiểu phép gán p = a; thì: - p trỏ tới phần tử mảng, tức a[0] - p+i trỏ tới phần tử a[i] - *(p+i) tƣơng đƣơng với p[i] Chú ý: - Nếu muốn truyền tên mảng chiều (tên mảng địa chỉ) vào chƣơng trình lời gọi chƣơng trình đối phải trỏ kiểu với kiểu phần tử mảng - Con trỏ đƣợc khai báo thơng qua mảng hình thức chiều nhƣ sau: int *p, q[]; //q[] tƣơng đƣơng với *q 86 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 Ví dụ 5.11: Viết chƣơng trình minh họa cách dùng trỏ để nhập vào hai dãy số theo chiều tăng dần, sau trộn hai dãy thành dãy theo chiều tăng dần In ba dãy hình #include “stdio.h” #include”conio.h” void nhap_day(int a[], int *n, char ten) { int i; print(“Nhap so phan tu cua day %c:”, ten); scanf(“%d”,n); for (i = 0; ib? a:b); } int max_ba_so(int a, int b, int c, int (*pmax_hai_so)(int, int)) { return(a>pmax_hai_so(b, c) ? a : pmax_hai_so(b, c)); } void main() { int x, y, z; printf(“Nhap gia tri x, y, z = “); scanf(“%d%d%d”, &x, &y, &z); 94 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 printf(“\Gia tri lon nhat cua ba so %d,%d,%d la ”, x, y, z); printf(“%d”,max_ba_so(x,y,z, max_hai_so)); getch(); } 5.2.11 Hàm đệ quy 5.2.11.1 Định nghĩa Trong C cho phép từ điểm thân hàm gọi tới hàm Hàm nhƣ gọi hàm đệ quy Khi hàm gọi đệ quy đến lần gọi, máy tạo tập biến cục hoàn toàn độc lập với tập biến cục đƣợc tạo lần gọi trƣớc Có lần gọi tới hàm có nhiêu lần khỏi hàm lần khỏi hàm tập biến cục bị xóa Sự tƣơng ứng lần gọi tới hàm lần khỏi hàm đƣợc thực theo thứ tự ngƣợc lại 5.2.11.2 Bài toán dùng đệ quy Phƣơng pháp đệ quy thƣờng áp dụng cho toán phục thuộc tham số có hai đặc điểm sau: - Bài tốn dễ dàng giải số trƣờng hợp riêng ứng với giá trị đặc biệt tham số Ta gọi trƣờng hợp suy biến - Bài toán quy tốn dạng nhƣng gíá trị tham số bị thay đổi Và sau số hữu hạn bƣớc biến đổi đệ quy dẫn tới trƣờng hợp suy biến Ta gọi trƣờng hợp tổng quát 5.2.11.3 Cách xây dựng hàm đệ quy Hàm đệ quy thƣờng đƣợc viết theo thuật toán sau: if (trƣờng hợp suy biến) { cách giải(thƣờng có cách giải) } else { 95 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 gọi đệ quy tới hàm với giá trị khác tham số } Ví dụ 5.19: Viết chƣơng trình tính giai thừa số n Ta thấy n! đƣợc tính theo cơng thức truy hồi sau: n! = n = n = (trƣờng hợp suy biến) n! = n*(n-1)! n>0) (gọi đệ quy với giá trị tham số n – 1) Chƣơng trình đƣợc viết nhƣ sau: #include”stdio.n” #include”conio.h” long giai_thua(int n) { if (n=0 || n=1) return 1; else return (n*giai_thua(n – 1)); } void main() { int n; printf(“Nhap so n = “); scanf(“%d”,&n); printf(“\n Giai thua cua %d la %ld”, n, giai_thua(n)); } Ví dụ 5.20: Bài tốn tháp Hà nội đƣợc đặt nhƣ sau: Có tháp m tầng đạt vị trí (x1, y1), cần chuyển đến vị trí (x2, y2) Khi chuyển cho phép dùng vị trí (x3, y3) làm vị trí trung gian Khi chuyển có quy ƣớc sau: - Số tầng m >= - Số thứ tự tầng đánh từ đến m từ đỉnh xuống đáy - Mỗi bƣớc chuyển đƣợc chuyển tầng từ vị trí đến vị trí khác - Tại thời điểm, tầng ln nhỏ tầng dƣới Thuật tốn chuyển tháp diễn đạt nhƣ sau: 96 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 - Trƣờng hợp suy biến: Nếu m = 1, cần chuyển tầng từ (x1, y1) - Trƣờng hợp tổng quát (m>1): + chuyển m – tầng tháp phía từ (x1, y1) đến (x3, y3), dùng (x2, y2) làm vị trí trung gian + chuyển tầng m lại từ (x1, y1) đến (x2, y2) + chuyển m – tầng tháp (x3, y3) đến (x2, y2) dùng (x1, y1) làm vị trí trung gian #include”stdio.n” #include”conio.h” Chƣơng trình đƣợc viết nhƣ sau: void chuyen_thap(int m, int x1, int y1, int x2, int y2, int x3, int y3) { if ( m == 1) printf(“Chuyen tang %d tu (%d, %d) đen (%d, %d)”, m, x1, y1, x2, y2); else { chuyen_thap(m-1, x1, y1-1, x3, y3, x2, y2); printf(“chuyen tang %d tu (%d, %d) đen (%d, %d)”, m, x1, y1, x2, y2); chuyen_thap(m-1, x3, y3, x2, y2 -1, x1, y1); } } void main() { int st; printf(“Nhap so tang cua thap:”); scanf(“%d”, &st); chuyen_thap(st, 10, 25, 30, 25, 50, 25); 97 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 getch(); } 98 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 Bài tập cuối chƣơng Câu Viết chƣơng trình sử dụng hàm để giải hệ phƣơng trình bậc ax + by = c dx + ey = f Câu Viết chƣơng trình sử dụng hàm để nhập dãy số, sau đó: - In dãy số hình - In hình giá trị lớn giá trị nhỏ dãy số - Sắp xếp dãy số theo chiều tăng dần Sau in hình dãy số sau xếp Câu Viết chƣơng trình sử dụng để thực công việc sau: - Nhập vào dãy số có n phần tử - Đếm xem dãy số có số nguyên tố Câu Viết chƣơng trình gồm có hàm nhập vào hệ số đa thức, hàm tính giá trị đa thức, hàm in hệ số đa thức Sau - Nhập vào hệ số hai đa thức: P=anxn + an-1xn-1 + + a1x + a0 ; Q=bmxm + bm-1xm-1 + + b1x + b0 - Nhập giá trị x sau in hình giá trị hai đa thức P Q - Tính hệ số đa thức tổng T = P + Q; - In hình hệ số ba đa thức Câu Viết chƣơng trình sử dụng hàm để - Nhập hai ma trận Am*n Bn*p - Tính ma trận Cm*p tích hai ma trận A B - In ba ma trận hình Câu Viết chƣơng trình tính hàm số sau phƣơng pháp đệ quy f(x, n) = xn s(n) = (2n)!! Câu Có n ngƣời n việc Biết ngƣời i làm việc j đạt hiệu a[i][j] Hãy lập phƣơng án phân công ngƣời việc cho tổng hiệu lớn Yêu cầu toán trên: 99 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) lOMoARcPSD|16991370 - xây dựng hàm ứng với toán đề - viết thêm hàm main để sử dụng hàm - chạy máy theo liệu tự chọn Câu 8: Làm lại tập chƣơng có sử dụng hàm 100 Downloaded by nguyenphuong Phuong nguyen (Kimphuongrio@gmail.com) ... lOMoARcPSD |16 9 913 70 Bảng 0.2 Các phép toán với bit Phép toán & | ^ Ý nghĩa Giải thích Phép (and) 1& 1 =1 0&0=0 1& 0=0 0 &1= 0 Phép (or) Phép loại trừ (xor) 1| 1 =1 0|0=0 1| 0 =1 0 |1= 1 1^ 1=0 0^0=0 1^ 0 =1 0 ^1= 1