Mục đích của môn học là cung cấp cho sinh viên những kiến thức cơ bản về kỹ thuật lập trình nói chung và kỹ thuật sử dụng công cụ lập trình C/C++ trong việc giải quyết bài toán bằng chương trình phần mềm máy tính. Giúp sinh viên trang bị kiến thức về cách thức giải quyết một bài toán trên mát tính, ngôn ngữ lập trình C/C++, một số cấu trúc dữ liệu và giải thuật điển hình.
HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA CÔNG NGHỆ THÔNG TIN Bài giảng KỸ THUẬT LẬP TRÌNH Biên soạn Hà Đại Dương Nguyễn Mậu Uyên Hà Nội - 11/2010 MỤC LỤC HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA CÔNG NGHỆ THÔNG TIN MỤC LỤC Bài - TỔNG QUAN I Giới thiệu I Giới thiệu .7 Mục đích, Yêu cầu Nội dung môn học Tài liệu học tập tham khảo 10 Hình thức đánh giá kết môn học .10 II Bài toán việc giải toán máy tính .10 Phương pháp tổng quát để giải tốn máy tính 10 Xác định toán 11 Cấu trúc liệu Giải thuật .12 Chương trình 18 III Công cụ lập trình .18 Ngơn ngữ lập trình 18 Cơng cụ lập trình 19 Cơng cụ lập trình Dev-C++ 20 IV Tóm tắt nội dung học 21 V Bài tập 22 Bài - NGÔN NGỮ LẬP TRÌNH C/C++ 23 I Giới thiệu 23 II Một số khái niệm 24 Bộ ký tự 24 Từ khóa 24 Kiểu liệu 25 Tên, Biến, 26 Biểu thức 29 III Cấu trúc chương trình đơn giản 34 Cấu trúc chung .34 Khai báo sử dụng thư viện .35 Khai báo hằng, biến, kiểu 35 Một số lệnh đơn 35 Chú thích 36 Chương trình 36 IV Nhập/Xuất liệu 36 Nhập liệu từ bàn phím – Hàm scanf() .36 Xuất liệu hình - Hàm printf() 38 Ví dụ .40 V Tóm tắt nội dung học 41 VI Bài tập .42 Bài - Bài thực hành: MƠI TRƯỜNG LẬP TRÌNH VÀ CÁC LỆNH VÀO/RA .43 I Làm quen môi trường Dev-C++ 43 Khởi động Dev-C++ 43 Giao diện 43 II Thực ví dụ sau 43 Tính diện tích tam giác 43 Tính tổng, hiệu, tích, thương số 45 III Bài tập tự làm 46 Bài - ĐIỀU KHIỂN CHỌN VÀ LẶP 49 I Điều khiển chọn 49 Khối lệnh 49 2 Cấu trúc IF 51 Cấu trúc SWITCH 54 II Điều khiển lặp 58 Cấu trúc FOR .58 Cấu trúc WHILE 60 Cấu trúc DO WHILE 62 Lệnh break continue 65 III Tóm tắt nội dung học 65 IV Bài tập .65 Bài - Bài thực hành: ĐIỀU KHIỂN CHỌN VÀ LẶP 66 I Thực ví dụ sau .66 Giải phương trình bậc .66 Tìm USCNLN hai số 67 II Bài tập tự làm .69 Bài - MẢNG, CON TRỎ VÀ XÂU KÝ TỰ 71 I Mảng 71 Mảng C 71 Mảng chiều 71 Mảng nhiều chiều 75 II Con trỏ 78 Khai báo sử dụng biến trỏ 78 Con trỏ mảng 82 Con trỏ tham số hình thức hàm 86 III Xâu ký tự 87 Khai báo .87 Các thao tác chuỗi ký tự 88 IV Tóm tắt nội dung học 92 V Bài tập 93 Bài - Bài thực hành: MẢNG, CON TRỎ VÀ XÂU KÝ TỰ 94 I Thực ví dụ sau .94 Tìm phần tử lớn mảng .94 Lấy Tên từ họ tên người Việt 95 II Bài tập tự làm .96 Mảng 96 Con trỏ 98 Xâu ký tự 98 Bài - HÀM VÀ CẤU TRÚC CHƯƠNG TRÌNH 100 I Tổ chức chương trình 100 Ví dụ .100 Cấu trúc chương trình 101 Hàm xây dựng sẵn 104 II Hàm người dùng định nghĩa 104 Khai báo định nghĩa Hàm .105 Lời gọi Hàm 107 Hàm với đối mặc định 108 Khai báo hàm trùng tên 109 Truyền tham số 110 Hàm mảng .116 III Con trỏ hàm 123 Khai báo .123 Sử dụng trỏ hàm 124 Mảng trỏ hàm 124 IV Đệ qui .125 Khái niệm .125 Lớp toán giải đệ qui .127 Các ví dụ 128 V Tóm tắt nội dung học 129 VI Bài tập 130 Bài - Bài thực hành: HÀM VÀ CẤU TRÚC CHƯƠNG TRÌNH .131 I Thực ví dụ sau .131 Xác định vị trí tương đối điểm với tam giác ABC .131 Viết hàm đếm số từ xâu ký tự 132 II Bài tập tự làm 133 Bài 10 - CẤU TRÚC DỮ LIỆU DO NGƯỜI DÙNG TỰ ĐỊNH NGHĨA 135 I Cấu trúc liệu người dùng tự định nghĩa 135 Khái niệm 135 Khai báo biến cấu trúc .137 Các thao tác biến kiểu cấu trúc 138 Con trỏ cấu trúc 140 Cấu trúc với thành phần kiểu bit 144 Câu lệnh typedef 145 Hàm sizeof() 145 II Ngăn xếp 145 Khái niệm .146 Cài đặt ngăn xếp sử dụng mảng 146 Cài đặt ngăn xếp sử dụng trỏ liên kết 147 Một số ứng dụng ngăn xếp 149 III Hàng đợi 151 Khái niệm .151 Cài đặt hàng đợi sử dụng mảng 151 Cài hàng đợi sử dụng trỏ .153 Một số ứng dụng hàng đợi 154 IV Kiểu hợp 154 Khai báo .154 Truy cập .155 V Kiểu liệt kê .155 VI Tóm tắt nội dung học 156 VII Bài tập 156 Bài 11 - Bài thực hành: CẤU TRÚC DỮ LIỆU DO NGƯỜI DÙNG TỰ ĐỊNH NGHĨA 157 I Thực ví dụ sau .157 Biểu diễn thực phép toán phân số .157 Chuyển biểu thức trung tố dạng hậu tố 159 II Bài tập tự làm 162 Bài 12 - LÀM VIỆC VỚI FILE 164 I Một số khái niêm .164 II Các thao tác tập tin 165 Khai báo biến tập tin 165 Mở tập tin 165 Đóng tập tin 166 Kiểm tra đến cuối tập tin hay chưa? 166 Di chuyển trỏ tập tin đầu tập tin - Hàm rewind() 166 III Truy cập tập tin văn 167 Ghi liệu lên tập tin văn 167 Đọc liệu từ tập tin văn 168 IV Truy cập tập tin nhị phân 169 Ghi liệu lên tập tin nhị phân - Hàm fwrite() 170 Đọc liệu từ tập tin nhị phân - Hàm fread() .171 Di chuyển trỏ tập tin - Hàm fseek() Error! Bookmark not defined Ví dụ .171 V Tóm tắt nội dung học 174 VI Bài tập 174 Bài 13 - ĐỒ HỌA .175 I Khởi động đồ hoạ 175 II Các hàm đồ hoạ 178 Mẫu màu 178 Vẽ tô màu .180 Vẽ đường gấp khúc đa giác .181 Vẽ điểm, miền .184 Hình chữ nhật .184 Cửa sổ (Viewport) 186 III Xử lý văn hình đồ hoạ .187 Hiển thị văn hình đồ hoạ 187 Sử dụng Fonts chữ 188 Bề rộng chiều cao kí tự 189 IV Tóm tắt nội dung học 189 V Bài tập 192 Bài 14 - Bài thực hành: LÀM VIỆC VỚI FILE VÀ ĐỒ HỌA 193 I Thực ví dụ sau .193 Ví dụ 193 Ví dụ - 194 II Bài tập tự làm 194 Bài 15 - ÔN TẬP 196 Bài - Tổng quan 196 Bài Ngơn ngữ lập trình C/C++ 196 Bài - Bài thực hành: Mơi trường lập trình lệnh vào/ra 196 Bài - Điều khiển Chọn Lặp 196 Bài - Bài thực hành: Các cấu trúc điều khiển 196 Bài - Mảng, Con trỏ xâu ký tự 196 Bài - Bài thực hành: Mảng, Con trỏ Xâu ký tự .196 Bài - Cấu trúc liệu người dùng tự định nghĩa 196 Bài - Bài thực hành: Cấu trúc liệu người dùng tự định nghĩa 196 Bài 10 - Hàm .196 Bài 11 - Bài thực hành: Hàm 197 Bài 12 - Làm việc với File 197 Bài 13 - Đồ Họa 197 Bài 14 - Bài thực hành: Làm việc với File Thuật toán nâng cao 197 Giới thiệu giáo viên Giáo viên: Nguyễn Mậu Uyên Email: uyennm@mta.edu.vn Bộ môn: HTTT – Khoa CNTT (Tầng – A2) Địa tài liệu môn học: http://nguyenitt2005.wordpress.com/programmingbasic/ Bài - TỔNG QUAN Nội dung học I Giới thiệu Mục đích, u cầu Nội dung mơn học Tài liệu học tập tham khảo Hình thức đánh giá kết mơn học II Bài tốn việc giải tốn máy tính Xác định toán Cấu trúc liệu Giải thuật Chương trình III Cơng cụ lập trình Ngơn ngữ lập trình Cơng cụ lập trình Cơng cụ lập trình Dev-C++ IV Bài tập I Gi i thi u Mục đích, u cầu Mục đích mơn học cung cấp cho sinh viên kiến thức kỹ thuật lập trình nói chung kỹ sử dụng cơng cụ lập trình C/C++ việc giải tốn chương trình phần mềm máy tính Kết thúc mơn học sinh viên trang bị kiến thức về: - Cách thức giải tốn máy tính; - Cơng cụ, kiếm thức việc thuật tốn hóa tốn; - Ngơn ngữ lập trình C/C++; - Một số cấu trúc liệu giải thuật điển hình Yêu cầu sinh viên - Có hiểu biết cấu trúc máy tính; - Có hiểu biết hệ điều hành; - Biết sử dụng phần mềm hệ thống việc quản lý tài nguyên, chép/copy liệu; - Biết sử dụng phần mền ứng dụng công cụ soạn thảo văn bản, truy cập internet, web - Nghe giảng làm tập Nội dung mơn học Cấu trúc chương trình: 32 tiết lý thuyết, 24 tiết thực hành, tiết ôn tập, tổng 60 tiết Chi tiết nội dung chương trình cho bảng sau: STT Bài/Nội dung Số tiết Tổng quan I Giới thiệu II Bài toán việc giải tốn máy tính III Cơng cụ lập trình IV Tóm tắt nội dung học V Bài tập Ngơn ngữ lập trình C/C++ I Giới thiệu II Một số khái niệm III Cấu trúc chương trình đơn giản C IV Nhập/Xuất liệu V Tóm tắt nội dung học VI Bài tập Bài thực hành: Môi trường lập trình lệnh vào/ra I Làm quen với mơi trường lập trình Dev-C++ II Thực ví dụ III Bài tập tự làm Điều khiển Chọn Lặp I Điều khiển chọn II Điều khiển lặp III Tóm tắt nội dung học 4 IV Bài tập Bài thực hành: Các cấu trúc điều khiển I Thực ví dụ II Bài tập tự làm Mảng, Con trỏ Xâu ký tự I Mảng II Con trỏ III Xâu ký tự IV Tóm tắt nội dung học 4 V Bài tập Bài thực hành: Mảng, Con trỏ Xâu ký tự I Thực ví dụ II Bài tập tự làm Cấu trúc liệu người dùng tự định nghĩa I Cấu trúc liệu người dùng tự định nghĩa II Kiểu ngăn xếp III Kiểu hàng đợi IV Tóm tắt nội dung học 4 V Bài tập 10 Bài thực hành: Cấu trúc liệu người dùng tự định nghĩa I Thực ví dụ II Bài tập tự làm Hàm I Khái niệm II Hàm tự tạo III Truyền tham số cho hàm IV Kỹ thuật đệ qui V Tóm tắt nội dung học 4 VI Bài tập 11 12 Bài thực hành: Hàm I Thực ví dụ II Bài tập tự làm Làm việc với File I Một số khái niệm II Các thao tác tập tin III Truy cập tập tin văn IV Truy cập tập tin nhị phân 4 V Tóm tắt nội dung học VI Bài tập 13 Đồ họa I Khởi động chế độ đồ họa II Các hàm đồ họa III Xử lý văn IV Tóm tắt nội dung học V Bài tập 14 Bài thực hành: Làm việc với File Đồ họa I Thực ví dụ II Bài tập tự làm 15 Ôn tập Tài liệu học tập tham khảo Hà Đại Dương, Nguyễn Mậu Uyên, Tập Bài giảng Kỹ thuật lập trình, HVKTQS 2010; Trần Đức Huyên, Phương pháp giải toán tin học, Nhà xuất giáo dục 1997; Đào Thanh Tĩnh, Hà Đại Dương, Tin học đại cương, Học viện KTQS, 2003; Đỗ Xuân Lôi, Cấu trúc liệu giải thuật, NXB Giáo dục, 1997; Robert Sedgewick, Algorithns in C++, Addison-Wesley 1992; Niklaus Wirth Bản dịch Nguyễn Quốc Cường, Cấu trúc liệu + Giải thuật = Chương trình, , NXB KHKT, 2001; Giáo trình Tin Học Đại Cương A, Nguyễn Văn Linh, Khoa Công Nghệ Thông Tin, Đại học Cần Thơ, 1991 Giáo trình lý thuyết tập ngơn ngữ C; Nguyễn Đình Tê, Hoàng Đức Hải, Nhà xuất Giáo dục, 1999 C - Tham khảo toàn diện, Nguyễn Cẩn, Nhà xuất Đồng Nai, 1996 10 Giúp tự học Lập Trình với ngôn ngữ C, Võ Văn Viện, Nhà xuất Đồng Nai, 2002 11 The C Programming Language, Brain W Kernighan & Dennis Ritchie, Prentice Hall Publisher, 1988 Hình thức đánh giá kết môn học Thang điểm 10, thành phần điểm xác định nội dung sau: STT Nội dung % Chuyên cần 10% Thường xuyên: Kiểm tra trực tiếp thực hành tất sinh viên 20% Thi kết thúc môn: Thi vấn đáp 70% Tổng cộng 100% II Bài toán vi c gi i tốn máy tính Phương pháp tổng qt để giải tốn máy tính Để giải tốn máy tính cần thực bước sau: Xác định toán; Xác định cấu trúc liệu để mơ tả tốn; 10 (x,y): điểm vẽ đến từ trỏ đồ họa Vẽ đường thẳng: đường thẳng từ điểm trỏ đồ họa đến điểm cách điểm khoảng Cú pháp: void linerel(int dx, int dy); (dx,dy): khoảng cách với trỏ đồ họa tại, điểm (x,y) điểm cần vẽ (x+dx, y+dy) Di chuyển chạy đồ hoạ: Để di chuyển chạy đến vị trí Cú pháp: void moveto(int x, int y); + (x,y): điểm trỏ đồ họa Ví dụ: moveto(200,100); line(100,100,1,1); lineto(100,200); linerel(100,100); Chọn kiểu đường: kiểu đường để vẽ đường thẳng, đa giác ,… Cú pháp : void setlinestyle(int linestyle, int par, int thin); + linestyle : kiểu đường, miêu tả + par : tham số thứ USERBIT_LINE tuân thủ theo bit tham số để tạo điểm vẽ + thin : độ dày đường miêu tả Bảng 13-4 Mô tả kiểu đường Tên Giá trị số Kiểu đường SOLID_LINE Nét liền DOTTED_LINE Nét chấm CENTER_LINE Nét chấm gạch DASHED_LINE Nét gạch USERBIT_LINE Mẫu tự tạo Bảng 13-5 Mô tả độ dày đường Tên Giá trị số Bề dày NORM_WIDTH Bề dày bình thường THICK_WIDTH Bề dày gấp ba Ví dụ: Chương trình vẽ đường gấp khúc đoạn thẳng Đường gấp khúc qua đỉnh sau: (20,20),(620,20),(620,180),(20,180) (320,100) 183 #include "graphics.h" #include "stdio.h" #include "conio.h" main() { int mh=0, mode; initgraph(&mh,&mode,"C:\\TC\\BGI"); setbkcolor(BLUE); setcolor(YELLOW); setlinestyle(SOLID-LINE,0,THICK_WIDTH); moveto(320,100); /* ch?y ? v? trí ( 320,100 ) */ line(20,20,620,20); /* ch?y v?n ? v? trí ( 320,100 ) */ linerel(-300,80); lineto(620,180); lineto(620,20); getch(); closegraph(); } Vẽ điểm, miền Vẽ điểm: vẽ điểm ảnh hình với màu xác định Cú pháp: void putpixel(int x, int y, int color); + (x,y): tọa độ điểm cần vẽ + color: màu vẽ Lấy màu điểm vẽ: xác định màu điểm hình Cú pháp: unsigned getpixel(int x, int y); + (x,y): Tọa độ điểm cần lấy màu + giá trị trả vè màu điểm hình Tơ miền: Tơ màu cho miền kín xác định màu biên, vùng khơng kín tô màu hết vùng làm việc Cú pháp: void floodfill(int x, int y, int border); +(x,y): tọa độ xác định điểm tô màu + border: màu vùng biên Ví dụ: Vẽ đường trịn màu đỏ hình màu xanh Toạ độ (x,y) điểm gieo nạp từ bàn phím Tuỳ thuộc giá trị cụ thể x,y chương trình tơ màu vàng cho hình trịn phần hình bên ngồi hình tròn #include "graphics.h" #include "stdio.h" #include main() { int mh=0,mode=0, x, y; printf("\nVao toa x,y:"); scanf("%d%d",&x,&y); initgraph(&mh,&mode,""); 184 setbkcolor(BLUE); setcolor(RED); setfillstyle(11,YELLOW); circle(320,100,50); moveto(1,150); floodfill(x,y,RED); getch(); closegraph(); } Hình chữ nhật Vẽ hình chữ nhật: xác định hai đỉnh góc trái cùng, góc phải hình chữ nhật Cú pháp: void rectangle(int x1, int y1, int x2, int y2); + (x1,y1) : tọa độ góc trái, phía hình chữ nhật + (x2,y2) : tọa độ góc phải phía hình chữ nhật Vẽ hình chữ nhật to kín: vẽ hình chữ nhật với miền tơ màu Cú pháp : void bar(int x1, int y1, int x2, int y2); + (x1,y1) : tọa độ góc trái, phía hình chữ nhật + (x2,y2) : tọa độ góc phải phía hình chữ nhật Vẽ hình chữ nhật có tơ bóng: vẽ hình chữ nhật có tơ bóng 3D Cú pháp: void bar3d(int x1, int y1, int x2, int y2, int depth, int top); + (x1,y1) : tọa độ góc trái, phía hình chữ nhật + (x2,y2) : tọa độ góc phải phía hình chữ nhật + depth: độ sâu tơ bóng + top: vẽ đỉnh (0: khơng vẽ, 1: vẽ) Ví dụ: Chương trình tạo nên hình chữ nhật, khối hình chữ nhật hình hộp có nắp: #include "graphics.h" main() { int mh=0,mode=0; initgraph(&mh,&mode,""); setbkcolor(GREEN); setcolor(RED); setfillstyle(CLOSE_DOT_FILL,YELLOW); rectangle(5,5,300,160); bar(3,175,300,340); bar3d(320,100,500,340,100,1); getch(); closegraph(); } 185 Cửa sổ (Viewport) Thiết lập viewport: tạo cửa sổ làm việc ảo hình Cú pháp: void setviewport(int x1, int y1, int x2, int y2, int clip); + (x1,y1) : tọa độ góc bên trái + (x2,y2) : tọa độ góc bên phải + clip : : cho phép vẽ ngồi viewport, : khơng cho phép vẽ ngồi viewport Ví dụ: setviewport(100,50,200,150,0); line(-20,-20,50,50); Lập nên vùng viewport hình chữ nhật có toạ độ góc trái cao (100,50) toạ độ góc phải thấp (200,150) (là toạ độ trước đặt viewport) Chú ý: Sau lập viewport, ta có hệ toạ độ mà góc bên trái có toạ độ (0,0) Nhận diện viewport hành: thông tin viewport hành Cú pháp : void getviewsetting(struct viewporttype *vp); vp: thông tin viewport thời, cấu trúc viewport struct viewporttype { int left,top,right,bottom; int clip; }; Xóa viewport: xóa đối tượng vẽ viewport Cú pháp: void clearviewport(void); Xố hình, đưa chạy tạo độ (0,0) hình: Cú pháp: void cleardevice(void); Toạ độ âm dương: Với chế độ cho phép vẽ ngồi viewport, hàm đồ họa vẽ viewport với tọa độ âm int xc,yc; xc=getmaxx()/2; yc=getmaxy()/2; setviewport(xc,yc,getmaxx(),getmaxy(),0); Như thế, hình chia làm bốn phần với toạ độ âm dương sau: Phần tư trái trên: x âm, y âm x: từ -getmaxx()/2 đến y: từ -getmaxy()/2 đến Phần tư trái dưới: x âm, y dương 186 x: từ -getmaxx()/2 đến y: từ đến getmaxy()/2 Phần tư phải trên: x dương, y âm x: từ đến getmaxx()/2 y: từ -getmaxy()/2 đến Phần tư phải dưới: x dương, y dương x: từ đến getmaxx()/2 y: từ đến getmaxy()/2 Ví dụ: Chương trình vẽ đồ thị hàm sin x hệ trục toạ độ âm dương Hoành độ x lấy giá trị từ -4π đến 4π Trong chương trình có sử dụng hai hàm settextjustify outtextxy ta đề cập phần sau #include "graphics.h" #include "conio.h" #include "math.h" #define TYLEX 20 #define TYLEY 60 main() { int mh=0,mode=DETECT; int x,y,i; initgraph(&mh,&mode,""); setviewport(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy(),0); setbkcolor(BLUE); setcolor(YELLOW); line(-getmaxx()/2,0,getmaxx()/2,0); line(0,-getmaxy()/2,0,getmaxy()/2); settextjustify(1,1); setcolor(WHITE); outtextxy(0,0,"(0,0)"); for (i=-400;i