Giáo trình Tổng quan Nhập môn lập trình - Ngô Hữu Dũng

Tài liệu Giáo trình Tổng quan Nhập môn lập trình - Ngô Hữu Dũng: Nhập môn lập trình Tổng quan TS. Ngô Hữu Dũng TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH Bài 1 – Giới thiệu Nhập môn lập trình - Tổng quan Blog ngohuudung.blogspot.com Email ngohuudung@iuh.edu.vn 2 Nội dung  Tổng quan lập trình  Các thành phần cơ bản  Nhập xuất dữ liệu và các thư viện  Các câu lệnh có cấu trúc  Lệnh lựa chọn - rẽ nhánh  Thuật toán  Vòng lặp  Hàm – chương trình con  Kiểu dữ liệu mảng  Chuỗi ký tự Nhập môn lập trình - Tổng quan3 Tài liệu Nhập môn lập trình - Tổng quan  Brian W. Kernighan and Dennis M. Ritchie. The C Programming Language (Second Edition). Prentice-Hall. Englewood Cliffs, New Jersey, 1988.  Slide, bài giảng  Bài tập thực hành  Bản dịch tiếng Việt: Giáo trình Ngôn ngữ lập trình C  Tham khảo thêm  Phạm Văn Ất. Kỹ thuật lập trình C. NXB Khoa học và Kỹ thuật, 1995  Randal E.Bryant and David R.O’Hallaron. Computer’s Perspective, 2001  Bjarne Stroustrup. The C++ Programming Language, AT&T Labs Murr...

pdf326 trang | Chia sẻ: quangot475 | Lượt xem: 961 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Giáo trình Tổng quan Nhập môn lập trình - Ngô Hữu Dũng, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Nhập môn lập trình Tổng quan TS. Ngô Hữu Dũng TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH Bài 1 – Giới thiệu Nhập môn lập trình - Tổng quan Blog ngohuudung.blogspot.com Email ngohuudung@iuh.edu.vn 2 Nội dung  Tổng quan lập trình  Các thành phần cơ bản  Nhập xuất dữ liệu và các thư viện  Các câu lệnh có cấu trúc  Lệnh lựa chọn - rẽ nhánh  Thuật toán  Vòng lặp  Hàm – chương trình con  Kiểu dữ liệu mảng  Chuỗi ký tự Nhập môn lập trình - Tổng quan3 Tài liệu Nhập môn lập trình - Tổng quan  Brian W. Kernighan and Dennis M. Ritchie. The C Programming Language (Second Edition). Prentice-Hall. Englewood Cliffs, New Jersey, 1988.  Slide, bài giảng  Bài tập thực hành  Bản dịch tiếng Việt: Giáo trình Ngôn ngữ lập trình C  Tham khảo thêm  Phạm Văn Ất. Kỹ thuật lập trình C. NXB Khoa học và Kỹ thuật, 1995  Randal E.Bryant and David R.O’Hallaron. Computer’s Perspective, 2001  Bjarne Stroustrup. The C++ Programming Language, AT&T Labs Murray Hill, New Jersey Addison-Wesley, 1997.  Andy Oram and Greg Wilson, Beautiful Code, 2007  cplusplus.com 4 Lịch trình Nhập môn lập trình - Tổng quan Tuần Nội dung Lý thuyết Thực hành Kiểm tra Tự học 1 Giới thiệu môn học 2 4 2 Các thành phần cơ bản của Ngôn ngữ C 2 4 Nhập xuất dữ liệu và các thư viện 4 3 Các câu lệnh có cấu trúc 2 6 10 4 Vòng lặp – thuật toán 2 6 TK 10 5 Hàm – chương trình con 2 6 GK 10 6 Mảng 2 6 10 7 Mảng và chuỗi 2 6 10 8 Ôn tập 1 6 8 9 6 6 10 6 6 11 6 6 12 6 6 15 60 94 5 Kiểm tra đánh giá Nhập môn lập trình - Tổng quan  Lý thuyết  Kiểm tra thường kỳ  Thực hành  Kiểm tra thường kỳ  Thi giữa kỳ  Thi cuối kỳ  Điểm liệt: <3  Số tín chỉ: 3  Lý thuyết: 15  Thực hành: 60  Tự học: 94 6 Thảo luận Nhập môn lập trình - Tổng quan7  What?  Why?  How? Một số gợi ý Nhập môn lập trình - Tổng quan8  Bám sát các nội dung thực hành (quan trọng!)  Đọc tài liệu, slide trước khi đến lớp  In tài liệu, slide, bài tập  Tự đặt câu hỏi và trả lời  Tự làm bài tập ở nhà  Tóm tắt các nội dung chủ yếu  Vắng học? Chương trình? Nhập môn lập trình - Tổng quan9 1. /* Xuất ra màn hình dòng chữ: 2. Hello world! 3. */ 4. #include 5. int main() 6. { 7. printf("Hello world! "); 8. return 0; 9. } Các bước lập trình Nhập môn lập trình - Tổng quan10  Xác định rõ yêu cầu của bài toán  Lựa chọn các biến và cấu trúc dữ liệu  Xây dựng giải thuật (cách giải) cho bài toán  Xây dựng trình tự để giải bài toán  Cài đặt (viết) chương trình và biên dịch  Chạy thử và sửa lỗi  Hoàn thiện và tối ưu hóa Ví dụ về các bước lập trình Nhập môn lập trình - Tổng quan11  Bài toán: Nhập, tính toán, xuất  Đề bài: Viết chương trình nhập vào hai số nguyên, xuất ra màn hình tổng của hai số nguyên đó.  Các bước chính để giải bài toán:  Xác định rõ yêu cầu của bài toán  Lựa chọn các biến và cấu trúc dữ liệu  Xây dựng giải thuật (cách giải) cho bài toán  Xây dựng trình tự để giải bài toán  Cài đặt (viết) và biên dịch chương trình  Chạy thử và sửa lỗi  Hoàn thiện và tối ưu hóa Các bước giải bài toán Nhập môn lập trình - Tổng quan12  Xác định yêu cầu,  Nhập 2 số nguyên, tính tổng, xuất ra tổng.  Lựa chọn dữ liệu,  Cần lưu hai số nguyên  Cần lưu tổng hai số nguyên  Xây dựng thuật toán và trình tự,  Khai báo các biến để lưu trữ, bao nhiêu biến? Kiểu gì?  Nhập vào 2 số nguyên  Tính tổng  Xuất kết quả  Viết và biên dịch chương trình,  Chạy thử và sửa lỗi Cấu trúc chương trình C 1. //Khai báo thư viện 2. //Chương trình chính 3. int main() 4. { 5. // Khai báo biến 6. // Nội dung chương trình 7. return 0; //Kết thúc 8. } 9. // Ghi chú: // là dấu chú thích, 10. // không ảnh hưởng đến chương trình Nhập môn lập trình - Tổng quan13 Khai báo thư viện 1. #include // Thư viện stdio.h 2. // Chứa các hàm nhập xuất cơ bản 3. // stdio : standard C input output 4. // .h : header 5. //Chương trình chính 6. int main() 7. { 8. // Khai báo biến 9. // Nội dung chương trình 10. return 0; //Kết thúc 11. } Nhập môn lập trình - Tổng quan14 Khai báo biến 1. #include // Thư viện 2. //Chương trình chính 3. int main() 4. { 5. // Khai báo biến 6. int x; // int: integer – số nguyên 7. int y; // Cú pháp: ; 8. int tong; // Hoặc: int x, y, tong; 9. // Nội dung chương trình 10. return 0; //Kết thúc 11. } Nhập môn lập trình - Tổng quan15 Trình tự của chương trình 1. #include // Thư viện 2. //Chương trình chính 3. int main() 4. { 5. int x, y, tong; //Khai báo biến 6. // Nhập giá trị cho x và y 7. // Tính tổng 8. // Xuất ra màn hình giá trị tổng 9. return 0; //Kết thúc 10. } Nhập môn lập trình - Tổng quan16 Lưu đồ thuật toán và Mã giả Nhập môn lập trình - Tổng quan17 Dùng để biểu diễn, mô tả giải thuật Problem Tính tổng Input x, y: Integer Output tong: Integer READ x, y tong = x + y WRITE tong END Start End Read x Read y tong = x + y Print tong Nhập giá trị cho biến 1. #include // Thư viện 2. int main() //Chương trình chính 3. { 4. int x, y, tong; //Khai báo biến 5. // Nhập giá trị cho x và y 6. scanf("%d", &x); //Nhập x 7. scanf("%d", &y); //Nhập y 8. // Tính tổng 9. // Xuất ra màn hình giá trị tổng 10. return 0; //Kết thúc 11. } Nhập môn lập trình - Tổng quan18 Tính toán – Xử lý 1. #include //Khai báo thư viện 2. int main() //Chương trình chính 3. { 4. int x, y, tong; //Khai báo biến 5. // Nhập giá trị cho x và y 6. scanf("%d", &x); //Nhập x 7. scanf("%d", &y); //Nhập y 8. // Tính tổng 9. tong = x + y; // Phép gán 10. // Cú pháp: = ; 11. // Xuất ra màn hình giá trị tổng 12. return 0; //Kết thúc 13. } Nhập môn lập trình - Tổng quan19 Xuất ra màn hình 1. #include //Khai báo thư viện 2. int main() //Chương trình chính 3. { 4. int x, y, tong; //Khai báo biến 5. // Nhập giá trị cho x và y 6. scanf("%d", &x); //Nhập x 7. scanf("%d", &y); //Nhập y 8. // Tính tổng 9. tong = x + y; // Phép gán 10. // Xuất ra màn hình giá trị tổng 11. printf("Tong la %d \n", tong); // Xuất 12. return 0; //Kết thúc 13. } Nhập môn lập trình - Tổng quan20 Chương trình tính tổng tham khảo 1. #include //Khai báo thư viện 2. int main() //Chương trình chính 3. { 4. int x, y, tong; //Khai báo biến 5. printf("Nhap x: "); 6. scanf("%d", &x); //Nhập x 7. printf("Nhap y: "); 8. scanf("%d", &y); //Nhập y 9. tong = x + y; //Tính tổng 10. printf("Tong la %d \n", tong); // Xuất 11. return 0; //Kết thúc 12. } Nhập môn lập trình - Tổng quan21 How’s it work? 22 1. #include 2. int main() 3. { 4. int x, y, tong; 5. printf("Nhap x: "); 6. scanf("%d", &x); 7. printf("Nhap y: "); 8. scanf("%d", &y); 9. tong = x + y; 10. printf("Tong la %d \n", tong); 11. return 0; 12. } 4 7 11 x y tong Nhap x: Nhap y: Tong la 11 4 7 Nhận xét – Thư viện Nhập môn lập trình - Tổng quan23  Thư viện  Chứa các hàm đã được định nghĩa sẵn  Khai báo  #include  #include // Nhập xuất  #include // Thư viện chuẩn  #include // Toán học  #include // Chuỗi ký tự  #include // Ký tự  #include // Thời gian Nhận xét – Chương trình chính main Nhập môn lập trình - Tổng quan24  Chương trình chính:  Nơi chương trình bắt đầu  Cần duy nhất một chương trình chính int main() { // nội dung chương trình return 0; // Kết thúc } Nhận xét – Biến (variable) Nhập môn lập trình - Tổng quan25  Biến  Lưu trữ dữ liệu cần thiết  Giá trị có thể thay đổi  Có kiểu dữ liệu cụ thể (nguyên, thực, ký tự)  Khai báo  , ;  int x, y, tong, hieu, tich;// Số nguyên  float thuong; // Biến kiểu số thực  char kyTu; // Biến kiểu ký tự  char chuoi[50]; // Biến kiểu chuỗi ký tự Nhận xét – Nhập dữ liệu Nhập môn lập trình - Tổng quan26  Nhập  Nhập từ bàn phím giá trị cho biến  Nhập đúng kiểu dữ liệu tương ứng với kiểu của biến  scanf("", &);  scanf("%d", &x); // d: decimal  scanf("%i", &y); // i: integral  scanf("%f", &thuong);// f: float  scanf("%c", &kyTu); // c: char  scanf("%s", &chuoi); // s: string  gets();  gets(chuoi); Nhận xét – Tính toán Nhập môn lập trình - Tổng quan27  Phép gán, biểu thức  = ;  tong = x + y;  tich = x * y;  thuong = (float)x/y;  trungBinhCong = (x + y)/2.0;  Toán tử số học  +: Cộng, -: Trừ, *: Nhân,  /: Chia,  %: Chia lấy dư (dành cho số nguyên) Nhận xét – Xuất Nhập môn lập trình - Tổng quan28  Xuất ra màn hình dòng chữ, giá trị của biến  printf("", ,);  printf("Tong: %d \n", tong);  printf("Thuong: %f \n", thuong);  printf("Ky tu: %c \n", kyTu);  printf("Chuoi: %s \n", chuoi); Nhận xét – Mã giả Nhập môn lập trình - Tổng quan29  Dùng để biểu diễn thuật toán  Không nhất thiết chính xác về cú pháp  Không nhất thiết tuân theo một ngôn ngữ cụ thể  Ví dụ một số từ khoá: READ, WRITE, IF, ELSE, ENDIF, FOR, ENDFOR, WHILE, ENDWHILE.  Mỗi lệnh hoặc mỗi bước chỉ nên viết trên một dòng  Dùng thụt đầu dòng cho các lệnh có cấu trúc  Kết thúc lệnh bằng ENDIF, ENDFOR Nhận xét – Lưu đồ thuật toán Nhập môn lập trình - Tổng quan30  Biểu diễn thuật toán bằng sơ đồ khối Hình dạng Tên gọi Hành động Terminator Bắt đầu hoặc kết thúc chương trình Data Nhập hoặc xuất dữ liệu Process Xử lý, thực hiện một thao tác Decision Quyết định hướng xử lý theo điều kiện Flow direction Hướng đi của luồng xử lý Connector Điểm kết nối Hằng số Nhập môn lập trình - Tổng quan31  Đề bài: Viết chương trình nhập vào bán kính hình tròn, xuất ra màn hình diện tích và chu vi hình tròn.  Gợi ý:  Hằng số PI?  #define PI 3.14  const int IP = 3.14; rDT = ? CV = ? Hằng số - tham khảo 1. #include 2. #define PI 3.14 // PI là hằng số 3. int main() 4. { 5. float r; // Bán kính 6. float DT, CV; // Diện tích, chu vi 7. printf("Nhap ban kinh hinh tron: "); 8. scanf("%f", &r); 9. DT = PI * r * r; 10. CV = 2 * PI * r; 11. printf("Dien tich hinh tron: %.2f\n", DT); 12. printf("Chu vi hinh tron: %.2f", CV); 13. return 0; 14. } Nhập môn lập trình - Tổng quan32 Một số khái niệm Nhập môn lập trình - Tổng quan33  Thư viện – Library  stdio.h, math.h  Chương trình chính  int main(){}  Kiểu biến – Data type  int, float  Tên biến – Variable name  xA, xB  Chú thích - Comment  // Lời chú thích  Nhập - Input  scanf(“%d”,&x);  Xuất - Output  printf(“hello!”);  Phép toán – Operation  tong = x + y;  Toán tử - Operator  +, -, *, /  Hằng số - Constant  #define PI 3.14  const float PI = 3.14  Hàm - Function  sqrt, pow, scanf, printf Công cụ lập trình Nhập môn lập trình - Tổng quan34  C-Free, Dev-C, CodeBlocks, Visual Studio Một số trình biên dịch khác  Codeblocks:  Dev-C++:  Visual studio: US/products/visual-studio-express-vs  TurboC: windows-7-windows-8-and-windows-xp/  Eclipse:  Netbeans: https://netbeans.org/downloads/index.html  Ideone: Biên dịch online, hỗ trợ nhiều ngôn ngữ lập trình https://ideone.com/ Nhập môn lập trình - Tổng quan35 Nhập môn lập trình - Tổng quan36 Giảng viên: Instructor Tự tìm hiểu nội dung môn học Nhập môn lập trình - Tổng quan37  Thuật toán? Algorithm  Cách giải bài toán  Lệnh lựa chọn? Selection  (Lệnh rẽ nhánh)  if .. else, switch .. case  Vòng lặp? Loop  for, while, do while  Hàm? Function  Chương trình con  Mảng? Array  Dãy số  Chuỗi ký tự  Các thao tác cơ bản  Nhập input  Xuất, output  Đếm, count  Tìm kiếm, search  Tính toán, calculation  Trích xuất, list  Liệt kê list  Thêm, add  Xóa, remove  Sắp xếp sort Bài tập 1.1 – Các thao tác lập trình Nhập môn lập trình - Tổng quan38 Bài tập 1.1 – Các thao tác lập trình Nhập môn lập trình - Tổng quan39  Khởi động: Kích đôi vào biểu tượng C-Free hoặc Dev-C++  Mở tập tin mới: File  New, hoặc kích vào Biểu tượng 2  Lưu file nguồn: File  Save, hoặc File  Save as, hoặc kích Biểu tượng 3  Gõ chương trình Hello world vào khu vực số 4  Biên dịch, chạy chương trình, dừng chương trình ở khu vực số 5  Kiểm tra và sửa lỗi biên dịch ở khu vực số 6  Xem và kiểm tra kết quả ở màn hình số 7 Bài tập 1.2 – Tính toán Nhập môn lập trình - Tổng quan40  Viết chương trình nhập vào hai số nguyên, xuất ra màn hình tổng, hiệu, tích, và thương của của số nguyên đó.  Gợi ý: #include /*Khai báo thư viện*/ int main() //Chương trình chính { . . . // Khai báo biến . . . // Nhập . . . // Biểu thức, tính toán . . . // Xuất return 0; //Kết thúc } Tính tổng, hiệu, tích, thương (tham khảo 1) Nhập môn lập trình - Tổng quan41 1. #include /*Khai báo thư viện*/ 2. int main() //Chương trình chính 3. { 4. int x, y, tong, hieu, tich; 5. float thuong; //Khai báo 6. printf("Nhap so nguyen x: "); 7. scanf("%d", &x); //Nhập x 8. printf("Nhap so nguyen y: "); 9. scanf("%d", &y); //Nhập y 10. tong = x + y; //Biểu thức tính tổng 11. hieu = x - y; //Biểu thức tính hiệu 12. tich = x * y; //Biểu thức tính tích 13. thuong = (float)x / y; //Biểu thức tính thương 14. printf("Tong la %d \n", tong); // Xuất tổng 15. printf("Hieu la %d \n", hieu); // Xuất hiệu 16. printf("Tich la %d \n", tich); // Xuất tích 17. printf("Thuong la %f \n", thuong); // Xuất thương 18. return 0; //Kết thúc 19. } Tính tổng, hiệu, tích, thương (tham khảo 2) Nhập môn lập trình - Tổng quan42 1. #include //Khai báo thư viện 2. int main() //Chương trình chính 3. { 4. int x, y, tong, hieu, tich; //Khai báo 5. float thuong; 6. printf("Nhap vao hai so nguyen: "); 7. scanf("%d%d", &x, &y); //Nhập x, y 8. tong = x + y; hieu = x - y; //Tính toán 9. tich = x * y; thuong = (float)x / y; 10. printf("%d + %d = %d \n", x, y, tong);// Xuất 11. printf("%d - %d = %d \n", x, y, hieu); 12. printf("%d * %d = %d \n", x, y, tich); 13. printf("%d / %d = %f \n", x, y, thuong); 14. return 0; //Kết thúc 15. } Bài tập 1.3 – Hình chữ nhật Nhập môn lập trình - Tổng quan43 Viết chương trình nhập vào hai cạnh của hình chữ nhật, xuất ra màn hình diện tích, chu vi và chiều dài đường chéo của hình chữ nhật.  Gợi ý:  Giả sử chiều dài đường chéo là c  c2 = a2 + b2  Tính căn bậc hai  Hàm sqrt(x) =  Hàm sqrt thuộc thư viện math.h a b DT = ? CV = ? c = ? Hình chữ nhật (tham khảo) 1. #include 2. #include 3. int main() 4. { 5. float a, b; // Hai cạnh 6. float c; // Đường chéo 7. float dienTich, chuVi; 8. printf("Nhap hai canh: "); 9. scanf("%f%f", &a, &b); 10. dienTich = a * b; 11. chuVi = (a + b)*2; 12. c = sqrt(a*a + b*b); 13. printf("Dien tich: %f\n", dienTich); 14. printf("Chu vi: %f\n", chuVi); 15. printf("Duong cheo: %f\n", c); 16. return 0; 17. } Nhập môn lập trình - Tổng quan44 Bài tập 1.4 – Khoảng cách Nhập môn lập trình - Tổng quan45  Đề bài: Viết chương trình nhập vào tọa độ của hai điểm A(xA, yA) và B(xB, yB), xuất ra màn hình khoảng cách giữa hai điểm.  Gợi ý:  Thư viện math.h?  Hàm sqrt tính căn bậc hai  sqrt(x):  Hàm pow tính lũy thừa  pow(x, 2): x2 A(xA, yA) B(xB, yB) Khoảng cách (tham khảo) 1. #include 2. #include 3. int main() 4. { 5. float xA, yA; // A(xA, yA) 6. float xB, yB; // B(xB, yB) 7. float KC; // Khoảng cách 8. printf("Nhap A(xA, yA): "); 9. scanf("%f%f", &xA, &yA); 10. printf("Nhap B(xB, yB): "); 11. scanf("%f%f", &xB, &yB); 12. KC = sqrt(pow(xA-xB,2) + pow(yA-yB,2)); 13. printf("Khoang cach: %f\n", KC); 14. return 0; 15. } Nhập môn lập trình - Tổng quan46 Bài tập 1.5 – Chữ số Nhập môn lập trình - Tổng quan47  Viết chương trình nhập vào một số nguyên có hai chữ số, xuất ra màn hình chữ số hàng chục và chữ số hàng đơn vị của số nguyên ấy.  Gợi ý:  Số hàng chục: Dùng phép chia lấy phần nguyên, ví dụ: chuc = so / 10;  Số hàng đơn vị: Dùng phép chia lấy dư, ví dụ donvi = so % 10;  Yêu cầu: Phân biệt hai phép chia lấy dư và chia lấy nguyên Nhập môn lập trình Các thành phần cơ bản TS. Ngô Hữu Dũng TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH Nội dung Nhập môn lập trình - Cơ bản49  Giới thiệu ngôn ngữ lập trình C  Trình biên dịch/thông dịch  Cấu trúc chương trình  Định dạng trong C  Biến, kiểu dữ liệu  Hằng số, từ khóa, toán tử  Thư viện  stdio.h, stdlib.h, math.h, string.h, ctype.h, time.h  Nhập xuất căn bản  Nhập: scanf, cin, gets  Xuất: printf, cout, puts Ngôn ngữ lập trình C Nhập môn lập trình - Cơ bản  Được phát triển bởi Dennis Ritchie tại phòng thí nghiệm AT&T Bell vào đầu thập niên 1970  C được dùng trong hệ điều hành UNIX và phát triển cùng với hệ điều hành này  C đã lan rộng ra nhiều hệ điều hành khác và trở thành ngôn ngữ phổ dụng nhất 50 Trình biên dịch/Trình thông dịch Nhập môn lập trình - Cơ bản Trình biên dịch Compiler Mã nguồn Source code Mã máy Machine Code Executable Program Input Output Trình biên dịch: Phân tích chương trình và biên dịch thành mã máy. Trình thông dịch Interpreter Source Code Input Output Trình thông dịch: Phân tích và thực thi chương trình cùng lúc. 51 Biên dịch và chạy chương trình Nhập môn lập trình - Cơ bản  IDE – Integrated Development Environment  Trình soạn thảo  Biên soạn mã nguồn  Trình biên dịch  Phân tích và biên dịch mã nguồn thành mã đối tượng  Trình liên kết  Kết hợp các mã đối tượng và thư viện thành mã thực thi Editor Compiler Linker Source code file.c Object code file.obj Executable code file.exe Libraries IDE (Integrated Development Environment) 52 Sửa lỗi - debug Nhập môn lập trình - Cơ bản  Lỗi cú pháp  Phát hiện bởi trình biên dịch  Lỗi về từ khóa, cú pháp, ngữ pháp  Lỗi ngữ nghĩa  Được phát hiện bởi người sử dụng  Lỗi về kết quả của chương trình  Lỗi xuất hiện trong quá trình thực thi chương trình  Đúng cú pháp nhưng sai kết quả Editor Compiler Linker Source code file.c Object code file.obj Executable code file.exe Libraries Syntactic Errors Semantic Errors 53 Quiz Nhập môn lập trình - Cơ bản54  Mục đích của việc “biên dịch” là chuyển đổi  A. Ngôn ngữ bậc thấp sang bậc cao  B. Chương trình thành mã nguồn  C. Mã nguồn sang mã máy  D. Mã máy sang mã nguồn  Trường hợp nào sau đây là “lỗi ngữ nghĩa”?  A. Lỗi khi biên dịch chương trình  B. Chương trình tính sai kết quả  C. Lỗi do gõ sai một câu lệnh  D. Lời chú thích không có nghĩa Định dạng trong C Nhập môn lập trình - Cơ bản  Có phân biệt giữa chữ in HOA và chữ in thường!  Các dòng trống, khoảng trắng, lời chú thích đều được trình biên dịch bỏ qua  Các dấu thụt dòng giúp chương trình dễ đọc, rõ ràng.  Có thể dùng tab hoặc dấu cách  Câu lệnh được kết thúc bằng dấu chấm phẩy ;  Chuỗi ký tự được đặt giữa hai dấu hai nháy "Chuỗi"  Một ký tự được đặt giữa hai dấu một nháy 's' 55 Lời chú thích Nhập môn lập trình - Cơ bản  Hai cách ghi chú thích  // chú thích dòng  /* chú thích khối*/  Ví dụ 1. /* Chương trình C 2. ** In ra màn hình dòng chữ Hello 2017!*/ 3. #include //Khai báo thư viện 56 Biến Nhập môn lập trình - Cơ bản  Biến được dùng để lưu trữ dữ liệu và kết quả tính toán  Kiểu dữ liệu: Nguyên, thực, ký tự, chuỗi, mảng, cấu trúc, con trỏ  Tên biến: Do người lập trình tự đặt  Biến phải được khai báo trước khi sử dụng  Cú pháp: ;  int year;  float score;  char kyTu;  char name[50]; 57 Biến (2) Nhập môn lập trình - Cơ bản  Giá trị của biến có thể thay đổi  Khởi tạo biến:  int year = 2016;  Phép gán:  year = last_year + 1;  Một vùng nhớ sẽ được cấp phát tương ứng với kích cỡ của biến  Mỗi ô nhớ có một địa chỉ riêng 2016year Biến Vùng nhớ int year; // Khởi tạo year = 2016;// Gán Kiểu dữ liệu? 58 Kiểu dữ liệu Nhập môn lập trình - Cơ bản  int: Kiểu số nguyên  2 hoặc 4 bytes (16 hoặc 32 bits)  -32,768 → 32,767 hoặc -2,147,483,648 → 2,147,483,647  float: Kiểu số thực  4 bytes (32 bits): 1.2E-38 → 3.4E+38, độ chính xác 24 bits  double: Kiểu số thực có độ chính xác cao hơn float  8 bytes (64 bits): 2.3E-308 → 1.7E+308, độ chính xác 53 bits  char: Kiểu ký tự  1 byte, ví dụ: char exit = 'e';  char []: Kiểu chuỗi  ví dụ: char name[10] = "Quang";  bool: Kiểu luận lý, có giá trị true hoặc false  1 byte, ví dụ: bool kt = true; //C++ Độ chính xác? 59 Số chấm động – floating-point numbers Nhập môn lập trình - Cơ bản  Biểu diễn số thực  Ví dụ: 12’345 = 1.2345 x 104  Hay 1.2345E+4  Trị số x hệ cơ số số mũ  Float: Độ chính xác đơn  Double: Độ chính xác đôi significand x base exponent Kiểu dữ liệu Dấu Mũ Trị số Tổng số bit Độ chính xác Float 1 bit 8 bits 23 bits 32 bits (4 bytes) 24 bits (Dấu + trị số) Double 1 bit 11 bits 52 bits 64 bits (8 bytes) 53 bits (Dấu + trị số) 60 Tên biến Nhập môn lập trình - Cơ bản  Phải bắt đầu bằng một chữ hoặc dấu gạch dưới (_), tiếp sau đó có thể kết hợp giữa chữ, số và dấu gạch dưới.  Không được trùng với từ khóa có sẵn của C  Hai biến không được trùng tên nhau  Có phân biệt giữa chữ hoa và chữ thường  Độ dài tùy thích, tuy nhiên không nên đặt tên quá dài  Nên đặt tên có nghĩa, dễ hiểu  Keywords  auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while 61 Quiz – Tên biến Nhập môn lập trình - Cơ bản  Những tên biến nào sau đây đúng hay sai? 1. 1ngoi_sao 2. bienDem1 3. phepNhân 4. donVi$ 5. ngoi_nha 6. int 7. kiem-tra 8. A&T 9. ____dien___tich 10. +hai_so 11. luy thua 62 12. _mot_Ngoi_Sao 13. T_T 14. ^_^ 15. edthbdl_mbcln2h 16. dienTich@ 17. Chu-Vi-Hinh-Tron 18. mayViTinh 19. Tong+Hieu 20. 24gio Quiz - khai báo biến Nhập môn lập trình - Cơ bản63  Hãy khai báo các biến phù hợp cho các nội dung sau 1. Mã ID 2. Năm sinh 3. Họ và tên 4. Chiều cao 5. Cân nặng 6. Giới tính: Chỉ cần lưu giá trị ‘F’ (female) hoặc ‘M’ (male) 7. Tuổi 8. Đã lập gia đình? Chỉ cần lưu có (true) hoặc không (false) 9. Địa chỉ email 10. Nghề nghiệp Quiz - khai báo biến (tham khảo) Nhập môn lập trình - Cơ bản 1. #include // Khai báo thư viện 2. int main() // Chương trình chính 3. { 4. int ID; // ID kiểu số nguyên 5. char ID_s[20]; // Hoặc ID kiểu chuỗi 6. int namSinh; // Ví dụ: 1999 7. char hoVaTen[100]; // Tên kiểu chuỗi 8. float chieuCao; // Kiểu số thực 9. float canNang; // Kiểu số thực 10. char gioiTinh; // Kiểu ký tự: ‘F’, ‘M’ 11. int tuoiTac; // Tuổi kiểu số nguyên 12. bool giaDinh; // Có: True, Chưa: False 13. char email[100]; // Email kiểu chuỗi 14. char ngheNghiep[50]; // Ví dụ: “Ky su CNTT” 15. // 16. return 0; 17.} 64 Chuyển đổi kiểu Nhập môn lập trình - Cơ bản  Đặt (Kiểu dữ liệu) phía trước biểu thức để chuyển đổi kiểu dữ liệu cho kết quả của biểu thức  f = (float) i1 / i2; i = (int)f;  Chia một số nguyên cho một số nguyên: Kết quả là số nguyên  i1=5; i2=10; f=i1/i2; //Cảnh báo, f=0.00  f=(float)i1/i2; // OK, f=0.50  Chia một số thực cho một số nguyên hoặc chia một số nguyên cho một số thực: Kết quả là số thực  i=5; f=10; i1 = i/f; // Cảnh báo, i1 = 0  f1=i/f; f2=i/10.0; // OK! f1=f2=0.50 65 Chuyển đổi kiểu (2) Nhập môn lập trình - Cơ bản66  Gán một số nguyên vào một biến kiểu thực  f = i; // Cảnh báo việc chuyển đổi  f1 = 10; // OK! f1 = 10.000000  f2 = (float)i; // OK!  Gán một số thực vào một biến kiểu nguyên: Mất phần thập phân (sau dấu chấm)  i1 = 9.5; i2 = f;//Cảnh báo, i1 = 9  i1 = (int)9.5; i2 = (int)f; // OK! Quiz – Chuyển đổi kiểu dữ liệu Nhập môn lập trình - Cơ bản67  Chuyển đổi kiểu dữ liệu phù hợp (nếu cần) 1. int a = 13 / 2; 2. float b = a / 4; 3. float c = 10 / a; 4. float d = 1 / 5; 5. float e = (3 / 5) * a; 6. float f = (7 + 3) / a; 7. float g = 5.4 * 3 / a; 8. float h = (a + 3) / 2; 9. float i = (5 / 9) * (a – 32); 10. float j = a / 2 + 10 / (2 * b); Quiz – Chuyển đổi kiểu dữ liệu (1) Nhập môn lập trình - Cơ bản68  Chuyển đổi kiểu dữ liệu phù hợp (nếu cần) 1. int a = 13 / 2; 2. float b = a / 4; 3. float c = 10 / a; 4. float d = 1 / 5; 5. float e = (3 / 5) * a; 6. float f = (7 + 3) / a; 7. float g = 5.4 * 3 / a; 8. float h = (a + 3) / 2; 9. float i = (5 / 9) * (a – 32); 10. float j = a / 2 + 10 / (2 * b); 1. int a = 13 / 2; 2. float b = (float)a / 4; 3. float c = 10.0 / a; 4. float d = 1.0 / 5; 5. float e = (3.0 / 5) * a; 6. float f = (float)(7 + 3) / a; 7. float g = 5.4 * 3 / a; 8. float h = (a + 3) / 2.0; 9. float i = (5 / 9.0) * (a – 32); 10. float j = a / 2.0 + 10 / (2 * b); Hằng số trong C Nhập môn lập trình - Cơ bản  Giá trị không đổi suốt chương trình  Hằng số có kiểu dữ liệu  Số nguyên  Số thực  Ký tự  Chuỗi  Khai báo hằng số  #define  const #define a 45 // int #define b 125u // unsigned int #define c 87l // long int #define d 23ul // unsigned long int #define e 057 // Cơ số 8 #define f 0xfee // Cơ số 16 #define g 3.14159 // float #define h 314159E-5 // float #define i 'a' // char #define j "morning" // string const int k = 2016; const float l = 2.016; const char m = '4'; const char n[] = "afternoon"; #define o 048 /* ERROR! Hệ cơ số 8 không có số 8 */ #define p 59E // ERROR! #define q .E59 // ERROR! 69 Toán tử Nhập môn lập trình - Cơ bản70 Gán assignment Tăng / Giảm increment decrement Toán học arithmetic Luận lý logical So sánh comparison member access a = b a += b a -= b a *= b a /= b a %= b a &= b a |= b a ^= b a <<= b a >>= b ++a --a a++ a-- +a -a a + b a - b a * b a / b a % b ~a a & b a | b a ^ b a << b a >> b !a a && b a || b a == b a != b a < b a > b a <= b a >= b a[b] *a &a a->b a.b Toán tử gán - assignment Nhập môn lập trình - Cơ bản  Cho a = 7, b = 2. Số trên bit: a = 00000111, b = 00000010 Toán tử Mô tả Kết quả a = b Gán giá trị của b cho biến a a = 2 a += b Phép cộng: a = a + b a = 7 + 2 = 9 a -= b Phép trừ: a = a – b a = 7 – 2 = 5 a *= b Phép nhân: a = a * b a = 7 * 2 = 14 a /= b Phép chia lấy nguyên: a = a / b a = 7 / 2 = 3 a %= b Phép chia lấy dư: a = a % b a = 7 % 2 = 1 a &= b Phép AND trên bit: a = a & b a = 0111&0010 = 2 a |= b Phép OR trên bit: a = a | b a = 0111|0010 = 7 a ^= b Phép XOR trên bit: a = a ^ b a = 0111^0010 = 5 a <<= b Phép dịch trái trên bit: a = a << b a = a<<2 =11100=28 a >>= b Phép dịch phải trên bit: a = a >> b a = a>>2 =0001 = 1 71 Toán tử toán học - arithmetic Nhập môn lập trình - Cơ bản  Cho a = 7, b = 2. Số trên bit: a = 00000111, b = 00000010 c = -a Trừ a c = -7 c = a + b Phép cộng c = 7 + 2 = 9 c = a - b Phép trừ c = 7 – 2 = 5 c = a * b Phép nhân c = 7 * 2 = 14 c = a / b Phép chia lấy nguyên c = 7 / 2 = 3 c = a % b Phép chia lấy dư c = 7 % 2 = 1 c = ~a Phép NOT trên bit c = 11111000 = –8 c = a & b Phép AND trên bit c = 0111&0010 = 2 c = a | b Phép OR trên bit c = 0111|0010 = 7 c = a ^ b Phép XOR trên bit c = 0111^0010 = 5 c = a << b Phép SHIFT LEFT trên bit c = a<<2 =11100=28 c = a >> b Phép SHIFT RIGHT trên bit c = a>>2 =0001 = 1 72 Toán tử trên bit – bitwise operations Nhập môn lập trình - Cơ bản  Các phép toán trên bit A 0 0 1 1 B 0 1 0 1 A & B 0 0 0 1 A | B 0 1 1 1 A ^ B 0 1 1 0 ~A 1 1 0 0 ~B 1 0 1 0 << Cho a = 00110100, a<<2= 11010000 >> Cho a = 00110100, a>>2= 00001101 #include int main() { int a = 52; // 0011 0100 int b = 29; // 0001 1101 int c; c = a & b; // 0001 0100 printf("%d & %d = %d\n", a, b, c); c = a | b; // 0011 1101 printf("%d | %d = %d\n", a, b, c); c = a ^ b; // 0010 1001 printf("%d ^ %d = %d\n", a, b, c); c = ~a; // 1100 1011 printf("~%d = %d\n", a, c); c = a << 2; // 1101 0000 printf("%d << 2 = %d\n", a, c); c = a >> 2; // 0000 1101 printf("%d >> 2 = %d\n", a, c); return 0; } 73 Toán tử tăng / giảm - increment / decrement Nhập môn lập trình - Cơ bản  Cho a = 7, b = 2 Phép toán Mô tả Kết quả b = ++a Cộng a lên một đơn vị trước khi tính Tương đương: a = a + 1; b = a; a = 8 b = 8 b = --a Trừ a đi một đơn vị trước khi tính Tương đương: a = a – 1; b = a; a = 6 b = 6 b = a++ Cộng a lên một đơn vị sau khi tính Tương đương: b = a; a = a + 1; a = 8 b = 7 b = a-- Trừ a đi một đơn vị sau khi tính Tương đương: b = a; a = a - 1; a = 6 b = 7 Ví dụ: c = ++a - b-- Tương đương: a = a + 1; c = a – b; b = b – 1; a = 8 b = 6 c = 1 74 Độ ưu tiên Nhập môn lập trình - Cơ bản Category Toán tử Postfix () [] -> . ++ --  Unary + - ! ~ ++ - - (type)* & sizeof  Multiplicative * / %  Additive + - Shift > Relational >= Equality == != Bitwise AND & Bitwise XOR ^ Bitwise OR | Logical AND && Logical OR || Conditional ?:  Assignment = += -= *= /= %=>>= <<= &= ^= |= Comma ,  75 Quiz – Phép toán Nhập môn lập trình - Cơ bản76  Hãy cho biết kết quả của các phép toán sau int main() { int a = 7, b = 2, c, d, e, f, g, h, i, j, k; b += 2; c = ++a; d = a--; e = a/2; f = a%2; g = a++ - 7%3; h = 11%3 + ++a; i = (a / 3) % 4; j = --a % 2; k = a/4*3 ; return 0; } Quiz – Phép toán (1) Nhập môn lập trình - Cơ bản77  Hãy cho biết kết quả của các phép toán sau int main() { int a = 7, b = 2, c, d, e, f, g, h, i, j, k; b += 2; // b = b + 2 = 4 c = ++a; // ++a = 8, c = a = 8 d = a--; // d = a = 8, a-- = 7 e = a/2; // e = 7 / 2 = 3 f = a%2; // f = 7 % 2 = 1 g = a++ - 7%3; // 7%3 = 1, g = a – 1 = 6, a++ = 8 h = 11%3 + ++a; // ++a = 9, 11%3 = 2, h = 2 + 9 = 11 i = (a / 3) % 4; // a / 3 = 3, i = 3 % 4 = 3 j = --a % 2; // --a = 8, j = 8 % 2 = 0 k = a/4*3 ; // a/4 = 2, k = 2 * 3 = 6 return 0; } Toán tử luận lý – logical Nhập môn lập trình - Cơ bản  Những phép toán luận lý Cho A = True, B = False Toán tử Mô tả Ví dụ && Toán tử AND, nếu và chỉ nếu cả hai toán hạng điều đúng thì kết quả phép toán là đúng A && B: False || Toán tử OR, nếu và chỉ nếu cả hai toán hạng đều sai thì kết quả phép toán là sai A || B: True ! Toán tử NOT, thực hiện phép phủ định !A: False !B: True !A || B: False A && !B: True 78 Toán tử so sánh – comparison Nhập môn lập trình - Cơ bản  Những phép so sánh Cho A = 10, B = 20 Toán tử Mô tả Ví dụ == Bằng nhau (A == B) sai != Khác nhau (A != B) đúng > Lớn hơn (A > B) sai < Nhở hơn (A < B) đúng >= Lớn hơn hoặc bằng (A >= B) sai <= Nhở hơn hoặc bằng (A <= B) đúng #include int main() { int A=10, B=20; if (A==B) printf("A = B"); if (A!=B) printf("A ≠ B"); if (A>B) printf("A > B"); if (A<B) printf("A < B"); if (A>=B) printf("A ≥ B"); if (A<=B) printf("A ≤ B"); return 0; } 79 Các thư viện Nhập môn lập trình - Cơ bản  Các thư viện định nghĩa sẵn các hàm hay kiểu dữ liệu  Cú pháp khai báo: #include  các hàm nhập xuất chuẩn, các thao tác với tập tin  getchar, putchar, printf, scanf, gets, fopen, fclose, remove,  các hàm chuyển đổi kiểu dữ liệu, cấp phát bộ nhớ  atof, atoi, atol, strtol, free, malloc, abs, rand, srand  các hàm về toán học  sqrt, pow, ceil, floor, trunc, abs, sin, cos 80 Các thư viện (2) Nhập môn lập trình - Cơ bản81  các hàm xử lý chuỗi ký tự  strcpy, strcat, strlen, strstr, strcmp, strchr, memset  các hàm xử lý ký tự  toupper, tolower  các hàm nhập xuất  gets, puts, cin, cout  các hàm xử lý về thời gian  time, clock, localtime, difftime, time_t, struct tm Hàm thường dùng ở thư viện stdio.h Nhập môn lập trình - Cơ bản82  Khai báo: #include  Hàm printf: Xuất ra màn hình  Nguyên mẫu hàm: int printf(const char * format, ... );  printf(“Hello world!”);  printf(“a = %d.\n”, so_nguyen);  Hàm scanf: Nhập dữ liệu từ bàn phím  Nguyên mẫu hàm: int scanf( const char * format, ... );  scanf("%d", &so_nguyen);  scanf("%f", &so_thuc);  scanf("%c", &ky_tu);  Hàm gets: Nhập chuỗi từ bàn phím  char name[50]; gets(name); Hàm thường dùng ở thư viện stdlib.h Nhập môn lập trình - Cơ bản83  Khai báo: #include  Hàm rand: Tạo số nguyên ngẫu nhiên  Nguyên mẫu hàm: int rand (void);  a = rand(); // a có giá trị từ 0 đến 32767  b = rand()%90; // b có giá trị từ 0 đến 89  c = rand()%90 + 10; // c có giá trị từ 10 đến 99  Hàm srand: Khởi tạo số ngẫu nhiên  Nguyên mẫu hàm: void srand (unsigned int seed);  Ví dụ:  srand(time(NULL));  d = rand() % 101 – 50; Hàm thường dùng ở thư viện math.h Nhập môn lập trình - Cơ bản84  Khai báo: #include  Hàm sqrt: Tính căn bậc hai  Nguyên mẫu hàm: double sqrt (double x);  x = sqrt(9); // Căn bậc hai của 9  y = sqrt(x + 1); // Căn bậc hai của x + 1  Hàm pow: Tính lũy thừa  Nguyên mẫu hàm: double pow (double base, double exponent);  x = pow(3, 2); // ba mũ hai  y = pow(x, 4); // x mũ bốn  Hàm floor, ceil: Làm tròn  z = floor(4.3); // z = 4.0  w = ceil(4.3); // w = 5.0 Hàm thường dùng ở thư viện string.h Nhập môn lập trình - Cơ bản85  Khai báo: #include  Hàm strlen: Tính chiều dài của chuỗi  Nguyên mẫu hàm: size_t strlen(const char * str)  a = strlen(“hello”); // a = 5  Hàm strcpy: Sao chép chuỗi  Nguyên mẫu hàm: char * strcpy(char * dest, const char * src)  char hello[50]; // Khai báo chuỗi  strcpy(hello, “Hello ”); // hello = “Hello ”  Hàm strcat: Nối chuỗi  Nguyên mẫu hàm: char * strcat( char * dest, const char * src)  char name[50] = “Tuan”;  strcat(hello, name); // hello = “Hello Tuan!”  Hàm strcmp: So sánh chuỗi  Nguyên mẫu hàm: int strcmp( const char * str1, const char * str2 )  a = strcmp(name, “Tuan”); // a = 0 Hàm thường dùng ở thư viện ctype.h Nhập môn lập trình - Cơ bản86  Khai báo: #include  Hàm tolower: Chuyển ký tự sang chữ thường  Nguyên mẫu int tolower ( int c );  char c = ‘N’; tolower(c); // c = ‘n’  Hàm toupper: Chuyển ký tự sang chữ in  Nguyên mẫu int toupper ( int c );  char c = ‘n’; toupper(c); // c = ‘N’  Các hàm kiểm tra ký tự  isalnum(c): Trả về true (khác 0) nếu c là số hoặc chữ  isalpha(c): Trả về true nếu c là chữ  islower(c): Trả về true nếu c là chữ thường  isupper(c): Trả về true nếu c là chữ in Quiz – Tính toán Nhập môn lập trình - Cơ bản87  Cho một biến số nguyên x, viết biểu thức tính:  a = ()  b = ()  c = ( 3)( + 1)  d = + 2  e = +  = ( + 2) ( 2)  g = + ( + 1) Quiz – Tính toán (tham khảo) Nhập môn lập trình - Cơ bản88  Cho một biến số nguyên x, viết biểu thức tính:  a = () a = (x+1)/2.0;  b = () b = 4*(x+2)/3.0;  c = ( 3)( + 1) c = (1/3.0)*(x-3)*(x+1);  d = + 2 d = sqrt(pow(x,2)+2);  e = + e = sqrt((x+4)/4.0 + (x-3)/2.0);  = ( + 2) ( 2) f = (x+2)*sqrt((5/3.0)*(pow(x,4)-2));  g = ( + 2) g = (x+1)/3.0*sqrt(pow(x+2,4)); Nhập dữ liệu Nhập môn lập trình - Cơ bản89  Chú ý nhập đúng kiểu dữ liệu  Nhập số nguyên  int a; scanf(“%d”, &a);  Nhập số thực  float b; scanf(“%f”, &b);  Nhập ký tự  char c; scanf(“%c”, &c);  Nhập chuỗi ký tự  char s[50];  fflush(stdin); // xoá bộ đệm đầu vào  gets(s);  scanf(“%s”, &s); // ký tự trắng  scanf(“%[^\n]s”, &s); // enter #include int main() { int a; float b; char c; char s[50]; scanf("%d", &a); scanf("%f", &b); scanf("%c", &c); fflush(stdin); gets(s); . . . return 0; } Xuất dữ liệu Nhập môn lập trình - Cơ bản90  Chú ý xuất đúng kiểu dữ liệu  Xuất số nguyên  printf(“%d”, a);  Xuất số thực  printf(“%f”, b);  Xuất ký tự  printf(“%c”, c);  Xuất chuỗi ký tự  printf(“%s”, s); 1. #include 2. int main() 3. { 4. int a; float b; 5. char c; char s[50]; 6. scanf("%d", &a); 7. scanf("%f", &b); 8. scanf("%c", &c); 9. fflush(stdin); 10. gets(s); 11. printf("a = %d\n", a); 12. printf("b = %f\n", b); 13. printf("c = %c\n", c); 14. printf("s = %s\n", s); 15. return 0; 16. } Định dạng biểu diễn dữ liệu Nhập môn lập trình - Cơ bản specifier Kết quả Ví dụ %d, %i Số nguyên có dấu -95, 23 %u Số nguyên không dấu 7235 %o Số bát phân không dấu 610 %x, %X Số thập lục phân không dấu 7fa, 7FA %f, %F Số thực 392.65 %e, %E Ký hiệu khoa học 3.92e+2, 3.92E+2 %c Ký tự a %s Chuỗi ký tự laptrinh %p Địa chỉ con trỏ b8000000 %% In dấu % % %a, %A Số thập lục phân kiểu thực 0xb.f3p-2, 0XB.F3P-2 %g, %G Dạng ngắn của %e, %E hoặc %f,%F 392.65 91  %[flags][width][.precision][length]specifier Định dạng biểu diễn dữ liệu Nhập môn lập trình - Cơ bản  %[flags][width][.precision][length]specifier flags Mô tả – Canh trái trong width + Buộc in dấu + hoặc – (space) Ký tự trống trước dữ liệu 0 In số 0 trước dữ liệu width Số ký tự tối thiểu được in ra .precision Số ký tự sau dấu chấm động length d i u o x (none) int unsigned int hh signed char unsigned char h short int unsigned short int l long int unsigned long int 92 Minh hoạ biểu diễn dữ liệu Nhập môn lập trình - Cơ bản 1. #include 2. int main() 3. { 4. printf("Char: %c %c \n", 'a', 65);//Char: a A 5. printf("Integer: %d \n", 1999); //Integer: 1999 6. printf("Space: %7d \n", 1999); //Space: 1999 7. printf("Zero: %07d \n", 1999); //Zero: 0001999 8. printf("Float: %.2f\n", 3.1416); //Float: 3.14 9. printf("Float: %6.2f\n", 3.1416); //Float: 3.14 10. printf("String: %s\n", "Chuoi"); //String: Chuoi 11. printf("Hexa: %x\n", 100); //Hexa: 64 12. printf("Octo: %o\n", 100); //Octo: 144 13. printf("Hexa: %#x\n", 100); //Hexa: 0x64 14. printf("Octo: %#o\n", 100); //Octo: 0144 15. return 0; 16.} 93 Mã escape Nhập môn lập trình - Cơ bản Escape code Description \n newline \r carriage return \t tab \v vertical tab \b backspace \f form feed (page feed) \a alert (beep) \' single quote (') \" double quote (") \? question mark (?) \\ backslash (\)  Mã escape dùng để đại diện cho những ký tự đặc biệt hoặc những chuỗi, thao tác khó trình bày trực tiếp  Mã escape được đặt trong chuỗi định dạng của lệnh printf  Ví dụ: printf(“A\tB\n”); 94 Kết thúc Bài 2 Nhập môn lập trình - Cơ bản  Giới thiệu ngôn ngữ lập trình C  Trình biên dịch/thông dịch  Cấu trúc chương trình  Định dạng trong C  Biến, kiểu dữ liệu  Hằng số, từ khóa, toán tử  Thư viện  stdio.h, stdlib.h, math.h, string.h, ctype.h, time.h  Nhập xuất căn bản  Nhập: scanf, cin, gets  Xuất: printf, cout, puts 95 Bài tập 2.1: Biến và kiểu biến Nhập môn lập trình - Cơ bản96  Viết chương trình nhập vào từ bàn phím và xuất ra màn hình các thông tin sau 1. Mã ID 2. Năm sinh 3. Họ và tên 4. Chiều cao 5. Cân nặng 6. Giới tính: Chỉ cần lưu giá trị ‘F’ (female) hoặc ‘M’ (male) 7. Tuổi 8. Đã lập gia đình? Chỉ cần lưu có (true) hoặc không (false) 9. Địa chỉ email 10. Nghề nghiệp Bài tập 2.2: Nhập, tính toán, xuất Nhập môn lập trình - Cơ bản97  Viết chương trình nhập vào một số nguyên x, tính toán và xuất ra màn hình giá trị các biểu thức sau:  a = ()  b = ()  c = ( 3)( + 1)  d = + 2  e = +  = ( + 2) ( 2)  g = + ( + 1) Bài tập 2.3: Chữ số Nhập môn lập trình - Cơ bản98  Viết chương trình tạo ra một số nguyên ngẫu nhiên gồm 3 chữ số, hãy xác định các chữ số hàng đơn vị, hàng chục và hàng trăm của số nguyên ấy.  Ví dụ: Nhập vào 365  Xuất ra: 3 tram, 6 chuc, 5 don vi.  Gợi ý:  Số hàng đơn vị: a % 10  Số hàng chục: (a % 100) / 10  Số hàng trăm: (a % 1000) / 100  Số hàng ngàn: (a % 10000) / 1000  Số hàng chục ngàn: (a % 100000) / 10000  Số hàng trăm ngàn: (a % 1000000) / 100000 Bài tập 2.4: Thời gian Nhập môn lập trình - Cơ bản99  Viết chương trình nhập vào tổng số giây, quy đổi và xuất ra màn hình ngày, giờ, phút, giây tương ứng.  Ví dụ:  Nhập vào tổng số giây là 90061  Xuất ra: 1 ngày, 1 giờ, 1 phút, 1 giây  Gợi ý:  Tương tự bài 2.3 Bài tập 2.5 – Số ngẫu nhiên Nhập môn lập trình - Cơ bản100  Viết chương trình xuất ra màn hình các số ngẫu nhiên sau  a có giá trị trong khoảng từ 0 đến 89  b có giá trị trong khoảng từ 10 đến 99  c có giá trị trong khoảng từ -30 đến 30  d có giá trị giữa a và b bất kỳ nhập từ bàn phím  Gợi ý:  rand()%10 tạo ra số có giá trị từ 0 đến 9 Nhập môn lập trình Lệnh rẽ nhánh/lựa chọn TS. Ngô Hữu Dũng TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH Nội dung Nhập môn lập trình - Rẽ nhánh  Rẽ nhánh/lựa chọn  Lệnh if..else  Lệnh switch..case 102 Statement(s) Statement(s) true false Condition Statement(s) Case 1 Expression Statement(s) Case 2 Statement(s) Default Statement(s) Case 3 If statement – Câu lệnh if Nhập môn lập trình - Rẽ nhánh103  Nếu Điều kiện đúng thì  Thực hiện Lệnh  pseudocode IF (Condition) THEN Statement(s); ENDIF; 1. // if syntax 2. if (Condition) 3. { 4. Statements; 5. ... 6. } Statement(s) true Condition false Khối lệnh - Block Nhập môn lập trình - Rẽ nhánh104  Khối lệnh: Gồm nhiều câu lệnh  Cần đặt giữa dấu {}  Cách gọi khác: Lệnh phức, lệnh ghép  Ví dụ: 1. if (Condition) 2. { 3. Statement 1; 4. Statement 2; 5. Statement 3; 6. Statement 4; 7. } Statement 1 Statement 2 Statement 3 Statement 4 true Condition false ifelse statement – Câu lệnh ifelse Nhập môn lập trình - Rẽ nhánh105 Statement(s) Statement(s) true false Condition 1. // if else syntax 2. if (Condition) 3. { 4. Statement(s); 5. ... 6. } 7. else 8. { 9. Statement(s); 10. ... 11.}  pseudocode IF (Condition) THEN Statement(s); ELSE Statement(s); ENDIF; Toán tử điều kiện Nhập môn lập trình - Rẽ nhánh106 1. // C code 2. if (Điều kiện) 3. Lệnh 1; 4. else 5. Lệnh 2; 1. // Conditional ternary operator (?) 2. (Điều kiện) ? Lệnh 1 : Lệnh 2; Lệnh 1 Lệnh 2 true false Điều kiện Lệnh ifelse ifelse Nhập môn lập trình - Rẽ nhánh107  Kiểm tra nhiều trường hợp 1. if (Condition 1) 2. { 3. Statement(s); 4. } 5. else if(Condition 2) 6. { 7. Statement(s); 8. ... 9. } 10.... 11.else 12.{ 13. Statement(s); 14. ... 15.} Statement(s) true false Condition 1 Condition 2 Statement(s) true false Statement(s) Condition 3 Statement(s) true false Ví dụ minh hoạ if Nhập môn lập trình - Rẽ nhánh108  Trị tuyệt đối  Nếu a < 0  a = -a  Xuất a 1. if (a < 0) 2. a = -a; 3. printf("%d", a); a = -a true a < 0 false Print a Ví dụ minh hoạ if else Nhập môn lập trình - Rẽ nhánh109  Kiểm tra chẵn lẻ  Nếu a chia chẵn cho 2 thì  Xuất a chẵn  Ngược lại thì  Xuất: a lẻ  pseudocode IF (a % 2 == 0) THEN Print a even; ELSE Print a odd; ENDIF; a chẵn a lẻ true false a%2==0 1. // C code 2. if (a % 2 == 0) 3. printf("a chan"); 4. else 5. printf("a le"); (a%2==0) ? printf("a chan") : printf("a le"); Ví dụ minh hoạ if else if Nhập môn lập trình - Rẽ nhánh110  Kiểm tra âm dương  Nếu a < 0  a âm  Ngược lại Nếu a > 0  a dương  Ngược lại  a bằng 0 1. if (a < 0) 2. printf("a am"); 3. else if(a > 0) 4. printf("a duong"); 5. else 6. printf("a bang 0"); a âm true false a < 0 a > 0 a dương true false a bằng 0 Ví dụ minh hoạ - Khối lệnh - Block Nhập môn lập trình - Rẽ nhánh111  Tìm max max = a Xuất a max max = b Xuất b max true false a > b 1. if (a > b) 2. { 3. max = a; 4. printf("a max"); 5. } 6. else 7. { 8. max = b; 9. printf("b max"); 10.} Lồng nhau – Nested if Nhập môn lập trình - Rẽ nhánh112  Một câu lệnh có thể nằm bên trong một câu lệnh khác  Các cấu trúc if được xem như một câu lệnh đơn  if  ifelse  Ví dụ 1. if(a % 2 == 0) 2. if(a < 0) 3. printf("a chan va am"); 4. else if(a > 0) 5. printf("a chan va duong"); 6. else 7. printf("a bang 0"); 8. else 9. if(a == 0) 10. printf("a bang 0"); 11. else{ 12. printf("a le "); 13. if (a < 0) printf("va am"); 14. else 15. printf("va duong"); 16. } Lỗi thường gặp Nhập môn lập trình - Rẽ nhánh113  Lỗi trong chương trình sau  Chấm phẩy ở dòng 2  Điều kiện sau else ở dòng 5  Dòng 8 và 9 cần nằm trong khối lệnh  Thêm {} 1. // Giai Phuong trinh ax + b = 0 2. if(a == 0); // “;” !? 3. if(b == 0) 4. printf("PT vo so nghiem"); 5. else (b != 0) // !? 6. printf("PT vo nghiem"); 7. else 8. x = -b/a; 9. printf("x = %d", x); // !? switch case statement Nhập môn lập trình - Rẽ nhánh114 1. // switch case syntax 2. switch(Expression) 3. { 4. case Value1: 5. Statement(s); 6. break; 7. case Value2: 8. Statement(s); 9. break; 10. case Value3: 11. Statement(s); 12. break; 13. ... 14. default : 15. Statement(s); 16.} Statement(s) Case 1 Expression Statement(s) Case 2 Statement(s) Default Statement(s) Case 3 Nhận xét Nhập môn lập trình - Rẽ nhánh115 1. switch(Biểu thức) 2. { 3. case : 4. Lệnh 1; 5. break; 6. case : 7. Lệnh 2; 8. break; 9. case : 10. Lệnh 3; 11. break; 12. ... 13. default : 14. Lệnh n; 15.}  Chia thành nhiều trường hợp để xử lý  Biểu thức có giá trị kiểu số nguyên  Giá trị là một số nguyên cụ thể  Các giá trị không được trùng nhau  Mỗi trường hợp kết thúc bằng lệnh break  Có thể khuyết phần default Ví dụ minh hoạ Nhập môn lập trình - Rẽ nhánh116 Xuất “khong” true false a = 0 a = 1 Xuất “mot” true false Xuất “Khong doc duoc” a = 9 Xuất “chin” true false 1. // Đọc số 2. switch(a) 3. { 4. case 0: 5. printf("khong"); 6. break; 7. case 1: 8. printf("mot"); 9. break; 10. ... 11. case 9: 12. printf("chin"); 13. break; 14. default : 15. printf("khong doc duoc"); 16.} Ví dụ minh hoạ - Khuyết default Nhập môn lập trình - Rẽ nhánh117 Xuất “khong” true false a%10= 0 a%10= 1 Xuất “mot” true false a%10= 2 Xuất “hai” true false a%10= 9 Xuất “chin” true 1. // Đọc số 2. switch(a%10) 3. { 4. case 0: 5. printf("khong"); 6. break; 7. case 1: 8. printf("mot"); 9. break; 10. case 2: 11. printf("hai"); 12. break; 13. ... 14. case 9: 15. printf("chin"); 16.} Ví dụ minh hoạ - Khuyết break !? Nhập môn lập trình - Rẽ nhánh118 true false a%10= 0 a%10= 2 true false a%10= 8 Xuất “chan” true false Xuất “le” 1. // Chẵn lẻ 2. switch(a%10) 3. { 4. case 0: 5. case 2: 6. case 4: 7. case 6: 8. case 8: 9. printf("chan"); 10. break; 11. default : 12. printf("le"); 13.} Ví dụ minh hoạ - Lồng nhau Nhập môn lập trình - Rẽ nhánh119 1. // Đọc tháng 2. switch(thang/10) // Số hàng chục 3. { 4. case 1: 5. printf("Thang muoi "); 6. switch(thang%10) // Số hàng đơn vị 7. { 8. case 1: printf("mot."); break; 9. case 2: printf("hai."); break; 10. } 11. break; 12. case 0: 13. switch(thang){ 14. case 1: printf("Thang mot."); break; 15. ... 16. } 17.} Lỗi thường gặp Nhập môn lập trình - Rẽ nhánh120 1. switch(a); // “;” !? 2. { 3. case 1.2: // “1.2” !? 4. printf("1.2"); break; 5. case >0: // “>0” !? 6. printf(">0"); break; 7. case 2: 8. printf("hai"); // Thiếu break;!? 9. case 3: 10. printf("ba"); break; 11. case 2: // Trùng “2” 12. printf("trung"); break; 13. default // Thiếu “:” 14. printf("bon"); 15.} if vs. switch Nhập môn lập trình - Rẽ nhánh121  Switch kiểm tra các giá trị số nguyên  If kiểm tra kết quả đúng/sai (True/False)  Toán tử so sánh,  Toán tử luận lý  Giá trị bằng 0: False  Giá trị khác 0: True 1. switch(a%2) 2. { 3. case 0: 4. printf("chan"); 5. break; 6. case 1: 7. printf("le"); 8. } 1. if (a>=10 && a<100) 2. printf("a:[10..99]"); 3. if (a) 4. printf("a khac 0"); 5. if (!a) 6. printf("a = 0"); 7. if (a>0) 8. printf("a > 0"); 9. if (!(a>0)) 10. printf("a <= 0"); Tiền xử lý và lệnh rẽ nhánh Nhập môn lập trình - Rẽ nhánh 1. #include 2. #define MAX(A, B) (A > B ? A : B) 3. // preprocessor 4. int largest(int a, int b, int c) 5. { 6. int result; 7. result = MAX(a, b); 8. result = MAX(result, c); 9. return result; 10. } 11. void main() 12. { 13. printf("%d ", MAX(1,4)); 14. printf("%d ", largest(7,3,8)); 15. } 122 Bài tập 3.1 – Kiểm tra số Nhập một số nguyên bất kỳ. Hãy kiểm tra xem số ấy có tính chất như thế nào?  Là số dương, âm hay bằng không?  Là số chẵn hay lẻ?  Có phải là số có 2 chữ số hay không? Ví dụ: Nhập vào số 9, xuất ra màn hình: “Ban vua nhap so duong, so le, va khong phai la so co hai chu so.” Gợi ý: Sử dụng lệnh if để kiểm tra từng điều kiện Nhập môn lập trình - Rẽ nhánh123 Tham khảo 3.1 – Kiểm tra số Nhập môn lập trình - Rẽ nhánh124 1. #include 2. int main() 3. { 4. int soNguyen; 5. printf("Nhap mot so nguyen: "); 6. scanf("%d", &soNguyen); 7. printf("Ban vua nhap so "); 8. if (soNguyen > 0) 9. printf("duong"); 10. else if (soNguyen < 0) 11. printf("am"); 12. else 13. printf("khong"); 14. if (soNguyen % 2 == 0) 15. ... Bài tập 3.2 – Đổi ký tự Nhập một ký tự. Nếu là chữ thường thì đổi sang chữ hoa, ngược lại đổi sang chữ thường, nếu không phải là chữ thì thông báo: “Khong phai chu”. Ví dụ: Nhập vào ký tự ‘a’, xuất ký tự ‘A’ Gợi ý:  Ký tự ‘a’ có mã 97, các ký tự ‘b’, ‘c’ sau đó tăng dần  Ký tự “A” có mã 65, các ký tự ‘B’, ‘C’ có mã tăng dần  Kiểm tra ký tự thường  if(kyTu >= ‘a’ && kyTu <=‘z’) // hoặc if (islower(kyTu))  Chuyển sang ký tự thường  kyTu = kyTu – ‘A’ + ‘a’; // hoặc kyTu = tolower(kyTu); Nhập môn lập trình - Rẽ nhánh125 Tham khảo 3.2 – Đổi ký tự Nhập môn lập trình - Rẽ nhánh126 1. #include 2. int main() 3. { 4. char kyTu; 5. printf("Nhap mot ky tu: "); 6. scanf("%c", &kyTu); 7. if (kyTu>='a' && kyTu <= 'z'){ 8. kyTu = kyTu - 'a' + 'A'; 9. printf("Chuyen sang chu hoa: %c", kyTu); 10. }else if (kyTu >= 'A' && kyTu <= 'Z'){ 11. kyTu = kyTu - 'A' + 'a'; 12. printf("Chuyen sang chu thuong: %c", kyTu); 13. }else 14. printf("Khong phai chu"); 15. ... Bài tập 3.3 – Phương trình bậc nhất Giải phương trình bậc nhất ax + b = 0. Gợi ý: Nhập giá trị cho a và b  Kiểm tra các trường hợp  a = 0  b = 0  PT có vô số nghiệm  b ≠ 0  PT vô nghiệm  a ≠ 0  PT có nghiệm x = -b/a Nhập môn lập trình - Rẽ nhánh127 Tham khảo 3.3 – Phương trình bậc nhất Nhập môn lập trình - Rẽ nhánh128 1. #include 2. int main() 3. { 4. float a, b, x; 5. // Nhập a, b 6. if (a == 0) 7. if (b == 0) 8. printf("PT vo so nghiem"); 9. else 10. printf("PT vo nghiem"); 11. else{ 12. x = -b/a; 13. printf("PT co Nghiem x = %f", x); 14. } 15. ... Bài tập 3.4 – Phương trình bậc hai Giải phương trình bậc hai ax2 + bx + c = 0. Gợi ý:  Kiểm tra các trường hợp  a = 0  Giải phương trình bậc nhất bx + c = 0  a ≠ 0  Tính Delta  Kiểm tra Delta  Delta > 0: Hai nghiệm  Delta = 0: Nghiệm kép  Delta < 0: Vô nghiệm Nhập môn lập trình - Rẽ nhánh129 Tham khảo 3.4 – Phương trình bậc hai Nhập môn lập trình - Rẽ nhánh130 1. #include 2. int main() 3. { 4. float a, b, c, Delta, x; 5. // Nhập a, b, c 6. if (a == 0) 7. // Giải phương trình bx + c = 0 8. else{ 9. Delta = b*b – 4*a*c; 10. if (Delta < 0) 11. printf("PT vo nghiem"); 12. else if (Delta > 0) 13. ... 14. } 15. ... Bài tập 3.5 – Tìm max Nhập vào 4 số, tìm số có giá trị lớn nhất. Ví dụ: Nhập 5, 9, 1, 8 max = 9 Gợi ý: Cho max giá trị ban đầu, lần lượt kiểm tra max với các số  Tạm cho max = a  Nếu max < b  max = b  Nếu max < c  max = c  Nếu max < d  max = d Nhập môn lập trình - Rẽ nhánh131 Tham khảo 3.5 – Tìm max Nhập môn lập trình - Rẽ nhánh132 1. #include 2. int main() 3. { 4. float a, b, c, d, max; 5. // Nhập a, b, c, d 6. max = a; 7. if (max < b) 8. max = b; 9. if (max < c) 10. max = c; 11. ... Bài tập 3.6 – Sắp xếp Nhập vào 4 số, hãy sắp xếp giá trị của 4 số theo thứ tự tăng dần. Ví dụ: Nhập vào 5, 9, 1, 8 xuất ra 1, 5, 8, 9. Gợi ý:  Cần hoán vị (x, y): tam = x; x = y; y = tam;  Tìm min (a, b, c, d)  Nếu a>b: hoán vị (a, b); nếu a>c: hoán vị (a, c); nếu a>d: hoán vị (a, d)  Tìm min (b, c, d)  Nếu b>c: hoán vị (b, c); nếu b>d: hoán vị (b, d)  Tìm min (c, d)  Nếu c > d: hoán vị (c, d) Nhập môn lập trình - Rẽ nhánh133 Tham khảo 3.6 – Sắp xếp Nhập môn lập trình - Rẽ nhánh134 1. #include 2. int main() 3. { 4. float a, b, c, d, tam; 5. // Nhập a, b, c, d 6. 7. if (a > b){ 8. tam = a; a = b; b = tam; 9. } 10. if (a > c){ 11. tam = a; a = c; c = tam; 12. } 13. if (a > d){ 14. tam = a; a = d; d = tam; 15. } 16. if (b > c){ 17. ... Bài tập 3.7 – Xếp loại Viết chương trình nhập điểm trung bình và xếp loại sinh viên theo tiêu chí sau:  9 <= ĐTB: Xuất sắc  8 <= ĐTB < 9: Giỏi  7 <= ĐTB < 8: Khá  5 <= ĐTB < 7: Trung bình  5 > ĐTB: Yếu  Gợi ý:  Kiểm tra các trường hợp dùng if else if else Nhập môn lập trình - Rẽ nhánh135 1. if (DTB >= 9) 2. printf("Xuat sac"); 3. else if (DTB >= 8) 4. printf("Gioi"); 5. else if (DTB >= 7) 6. printf("Kha"); 7. ... Tham khảo 3.7 – Xếp loại Nhập môn lập trình - Rẽ nhánh136 1. #include 2. int main() 3. { 4. float DTB; 5. // Nhập DTB 6. 7. if (DTB >=0 && DTB <=10){ 8. if (DTB >= 9) 9. printf("Xuat sac"); 10. else if (DTB >= 8) 11. printf("Gioi"); 12. ... 13. }else 14. printf("Nhap khong dung"); 15. ... Bài tập 3.8 – Tiền taxi Tính tiền đi taxi từ số km nhập vào. Biết:  1 km đầu giá 15000đ  Từ km thứ 2 đến km thứ 5 giá 13500đ  Từ km thứ 6 trở đi giá 11000đ  Nếu trên 120km được giảm 10% tổng tiền.  Gợi ý  Mỗi km có giá khác nhau, ví dụ số km là 3 thì số tiền gồm giá 1 km đầu và giá của 2 km sau đó: 15000 x 1 + 13500 x 2  Tính tiền theo các công thức khác nhau cho các trường hợp số km khác nhau Nhập môn lập trình - Rẽ nhánh137 Bài tập 3.9 – Tam giác Nhập vào 3 số, kiểm tra đó có phải là ba cạnh của tam giác hay không không? Nếu là tam giác thì đó là tam giác đều, tam giác cân, tam giác vuông hay tam giác thường? Ví dụ: Nhập vào 3, 4, 7: Xuất: “3, 4, 7 khong phai ba canh cua tam giac” Nhập vào 3, 4, 5: Xuất: “3, 4, 5 la ba canh tam giac vuong” Gợi ý:  Điều kiện tam giác: Tổng hai cạnh bất kỳ lớn hơn cạnh còn lại  a + b > c && b + c > a && a + c > b  Kiểm tra loại tam giác theo tính chất của từng loại Nhập môn lập trình - Rẽ nhánh138 Bài tập 3.10 – Thời gian Nhập môn lập trình - Rẽ nhánh139  Nhập vào 3 số nguyên tương ứng với giờ phút giây của một đồng hồ điện tử.  Kiểm tra xem 3 số có thoả mãn điều kiện giờ phút giây?  Giờ: [0..23], Phút: [0..59], Giây: [0..59]  Nếu thoả mãn điều kiện trên: Hãy cho biết sau một giây, thời gian sẽ hiện thị như thế nào?  Gợi ý: Số giây tăng lên một, có thể xảy ra các trường hợp:  Nếu số giây tăng đến 60: giây sẽ trở về 0 và tăng phút.  Nếu số phút tăng đến 60: phút sẽ trở về 0 và tăng giờ.  Nếu số giờ tăng đến 24: giờ sẽ trở về 0 (sang ngày mới). Bài tập 3.11 – Đọc số Nhập môn lập trình - Rẽ nhánh140 Nhập vào một số nguyên có 3 chữ số,  Kiểm tra xem số nguyên ấy có đúng 3 chữ số hay không?  Nếu đúng 3 chữ số: Xuất ra màn hình dạng chữ. Ví dụ:  Nhập vào số 36, xuất: “Khong phai so co ba chu so”  Nhập vào số 365, xuất: “Ba tram sau muoi lam”.  Nhập vào số 305, xuất: “Ba tram le nam”. Gợi ý:  Tính số hàng trăm, hàng chục và hàng đơn vị, hai cách:  tram = so/100; chuc = (so/10)%10; donVi = so%10;  t = so; donVi = t%10; t/=10; chuc = t%10; t/=10; tram=t%10;  Lần lượt xuất các số hàng trăm, chục, đơn vị dùng switch Nhập môn lập trình Vòng lặp TS. Ngô Hữu Dũng TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH Câu lệnh for Nhập môn lập trình - Vòng lặp // Syntax of for for (Initialization; Condition; Increment/Decrement) { Statement(s); . . . } Statement(s) True False Condition Initialization Increment/ Decrement 142 Vòng lặp for Nhập môn lập trình - Vòng lặp143  Thực hiện các lệnh lặp đi lặp lại  Bước 1: Bắt đầu vòng lặp – Initialization  Bước 2: Kiểm tra điều kiện lặp – Condition  Nếu điều kiện đúng sang Bước 3  Nếu điều kiện sai sang Bước 6  Bước 3: Thực hiện câu lệnh – Statement(s)  Bước 4: Lệnh tăng/giảm – Increment/Decrement  Để thay đổi điều kiện lặp  Bước 5: Trở lại bước 2  Bước 6: Kết thúc vòng lặp Ví dụ minh hoạ Nhập môn lập trình - Vòng lặp144 1. for (i = 0; i < 6; i++) 2. { 3. printf("%d\n", i); 4. }  Xuất ra màn hình các số từ 0 đến 5  Khởi đầu  i = 0  Điều kiện  i < 6  Kết thúc  i >= 6  Bước nhảy  i++  Lệnh  Xuất i Print i True False i < 6 i = 0 i++ How’s it work? – For loop Nhập môn lập trình - Vòng lặp145 1. for (i = 0; i < 6; i++) 2. { 3. printf("%d\n", i); 4. } True False 0 1 2 3 4 5 i 0123456 i = 0 i++ Print ii < 6 Initialization – Khởi đầu Nhập môn lập trình - Vòng lặp146  Phần khởi đầu có thể khuyết 1. // Xuất từ 9 đến 0 2. i = 9; 3. for ( ; i >= 0; i--) 4. printf("%d\n", i);  Phần khởi đầu có thể gồm nhiều phép gán  Cách nhau bởi dấu phẩy 1. // Xuất từ 9 đến 0 2. for (i = 0, j = 9 ; i <= j; j--) 3. printf("%d\n", j); Condition – Điều kiện Nhập môn lập trình - Vòng lặp147  Phần điều kiện có thể khuyết 1. // Xuất từ 0 đến 9 2. for ( i = 0; ; i++) 3. { 4. if (i >= 10) 5. break; // Thoát vòng lặp 6. printf("%d\n", i); 7. } 8. // Xuất từ 0 đến 9 9. for ( i = 0; i < 10; i++) 10. printf("%d\n", i); Increment/Decrement – Tăng/Giảm Nhập môn lập trình - Vòng lặp148  Phần tăng giảm có thể khuyết 1. // Xuất từ 0 đến 9 2. for ( i = 0; i < 10; ) 3. { 4. printf("%d\n", i); 5. i++; 6. }  Phần tăng/giảm có thể có nhiều phép toán  Cánh nhau bởi dấu phẩy 1. // 0 + 9 = 1 + 8 = 2 + 7 = = 9. 2. for ( i = 0, j = 9; i < j; i++, j--) 3. { 4. printf("%d + %d = ", i, j); 5. } 6. printf("%d.\n ", i+j); Nested loop – Vòng lặp lồng nhau Nhập môn lập trình - Vòng lặp149  Vòng lặp có thể được lồng trong vòng lặp 1. // Bảng cửu chương 2. for ( i = 1; i < 10; i++) 3. { 4. for ( j = 1; j <= 10; j++) 5. printf("%d x %d = %d\n", i, j, i*j); 6. printf("-----------\n"); 7. } 8. //1 x 1 = 1 9. //1 x 2 = 2 10.//... 11.//1 x 10 = 10 12.//----------- 13.//2 x 1 = 2 14.//... break vs. continue  Lệnh break làm kết thúc vòng lặp  Lệnh continue bỏ qua lần lặp hiện tại và tiếp tục lặp 1. // Xuất số chẵn từ 0 đến 9 2. for ( i = 0; ; i++) 3. { 4. if (i == 10) 5. break; // Kết thúc vòng lặp 6. if (i % 2) // i lẻ 7. continue; // Không xuất số lẻ 8. printf("%d, ", i); 9. } Nhập môn lập trình - Vòng lặp150 Lỗi thường gặp 1. // Dấu phẩy !? 2. for ( i = 0, i < 10, i++) 3. printf("%d, ", i); 4. // Dấu chấm phẩy !? 5. for ( i = 0; i < 10; i++); 6. printf("%d, ", i); 7. // Thiếu thành phần !? 8. for ( i = 0; i < 10) 9. printf("%d, ", i++); 10.// Lặp vô hạn: i luôn luôn < 10 !? 11.for ( i = 0; i < 10; i--) 12. printf("%d, ", i); Nhập môn lập trình - Vòng lặp151 Bài tập vận dụng Nhập môn lập trình - Vòng lặp  Viết vòng lặp dùng lệnh for xuất ra màn hình: 1. Các số nguyên từ 1 đến 10 2. Các số nguyên từ 20 đến 11 3. Các số nguyên từ 1 đến n, với n > 0 nhập từ bàn phím 4. Các số nguyên có hai chữ số 5. Các số chẵn có ba chữ số 6. Các số lẻ từ a đến a+10, với a nhập từ bàn phím 7. Các số nguyên dương là bội của 3 và nhỏ hơn 100 8. Các số nguyên dương là bội của 3 và 5 9. Các cặp số nguyên dương có tổng là 10 1. Ví dụ: 1 + 9 = 10, 2 + 8 = 10, 152 Hướng dẫn – Xuất dãy số liên tục 1. /* Cần xác định điểm bắt đầu? điểm kết thúc? điều kiện? bước nhảy? câu lệnh? */ 2. // Ví dụ: Xuất từ a đến b (a < b) 3. for ( i = a; i <= b; i++) 4. printf("%d, ", i); 5. // Ví dụ: Xuất từ b đến a (a < b) 6. for ( i = b; i >= a; i--) 7. printf("%d, ", i); Nhập môn lập trình - Vòng lặp153 Hướng dẫn – Xuất dãy số có điều kiện 1. /* Xuất các số thoả mãn điều kiện nào đó */ 2. for(khởi đầu; điều kiện; bước nhảy) 3. if (điều kiện) 4. printf("%d, ", i); 5. // Ví dụ: Xuất số chẵn có 2 chữ số 6. for ( i = 10; i <= 99; i++) 7. if (i%2 == 0) 8. printf("%d, ", i); Nhập môn lập trình - Vòng lặp154 Câu lệnh while Nhập môn lập trình - Vòng lặp155  Bước 1: Kiểm tra điều kiện – Condition  Nếu điều kiện đúng sang Bước 2  Nếu điều kiện sai sang Bước 4  Bước 2: Thực hiện lệnh – Statement(s)  Bước 3: Sang Bước 1  Bước 4: Kết thúc vòng lặp Statement(s) True False Condition // Syntax of while while (Condition) { Statement(s); . . . } Ví dụ minh hoạ Nhập môn lập trình - Vòng lặp156 1. // Xuất các số từ 0 đến 5 2. i = 0; 3. while(i < 6) 4. { 5. printf("%d\n", i); 6. i++; 7. } 8. // Lệnh for tương tự 9. for (i = 0; i < 6; i++) 10.{ 11. printf("%d\n", i); 12.} Initialization Condition Statement Increment/Decrement Condition – Điều kiện Nhập môn lập trình - Vòng lặp157  Phần điều kiện có thể là biến, biểu thức hoặc hằng số  0: false  #0: true 1. // Ví dụ: Xuất các số từ 9 đến 1 2. i = 9; 3. while(i) 4. { 5. printf("%d\n", i); 6. i--; 7. } Nested loop – Vòng lặp lồng nhau Nhập môn lập trình - Vòng lặp158  Vòng lặp có thể được lồng trong vòng lặp 1. // Ví dụ: Bảng cửu chương 2. i = 1; 3. while (i < 10) 4. { 5. j = 1; 6. while (j <= 10) 7. { 8. printf("%d x %d = %d\n", i, j, i*j); 9. j++; 10. } 11. printf("-----------\n"); 12. i++; 13.} break vs. continue  Lệnh break làm kết thúc vòng lặp  Lệnh continue bỏ qua lần lặp hiện tại và tiếp tục lặp 1. //Ví dụ: Xuất số chẵn từ 0 đến 9 2. i = 0; 3. while(1) // Luôn đúng 4. { 5. if (i == 10) 6. break; // Kết thúc vòng lặp 7. if (i % 2) // i lẻ 8. continue; // Không xuất số lẻ 9. printf("%d, ", i); 10. i++; 11.} Nhập môn lập trình - Vòng lặp159 Lỗi thường gặp 1. // Dấu chấm phẩy !? 2. i = 0; 3. while (i < 10); 4. printf("%d, ", i++); 5. // Lặp vô hạn !? 6. i = 0; 7. while (i < 10) 8. printf("%d, ", i); 9. // Thiếu điều kiện !? 10.while () Nhập môn lập trình - Vòng lặp160 Bài tập vận dụng Nhập môn lập trình - Vòng lặp  Viết vòng lặp dùng lệnh while xuất ra màn hình: 1. Các số nguyên từ 1 đến 10 2. Các số nguyên từ 20 đến 11 3. Các số nguyên từ 1 đến n, với n > 0 nhập từ bàn phím 4. Các số nguyên có hai chữ số 5. Các số chẵn có ba chữ số 6. Các số lẻ từ a đến a+10, với a > 0 nhập từ bàn phím 7. Các số nguyên dương là bội của 3 và nhỏ hơn 100 8. Các số nguyên dương là bội của 3 và 5 9. Các cặp số nguyên dương có tổng là 10 161 Câu lệnh do..while Nhập môn lập trình - Vòng lặp162  Bước 1: Thực hiện lệnh – Statement(s)  Bước 2: Kiểm tra điều kiện – Condition  Nếu điều kiện đúng sang Bước 1  Nếu điều kiện sai sang Bước 3  Bước 3: Kết thúc vòng lặp Statement(s) True False Condition // Syntax of do..while do{ Statement(s); . . . }while (Condition); Ví dụ minh hoạ Nhập môn lập trình - Vòng lặp163 1. // Xuất các số từ 0 đến 5 2. i = 0; 3. do{ 4. printf("%d\n", i); 5. i++; 6. }while(i < 6); 7. // Lệnh for tương tự 8. for (i = 0; i < 6; i++) 9. { 10. printf("%d\n", i); 11.} Initialization Condition Statement Increment/Decrement Khác nhau? Do..while thực hiện Lệnh trước rồi kiểm tra sau. Condition – Điều kiện Nhập môn lập trình - Vòng lặp164  Phần điều kiện có thể là biến, biểu thức hoặc hằng số  0: false  #0: true 1. // Ví dụ: Nhập số nguyên dương 2. // Kiểm tra điều kiện nhập 3. do{ 4. printf("Nhap mot so nguyen duong: "); 5. scanf("%d", &i); 6. }while(i<=0); Nested loop – Vòng lặp lồng nhau Nhập môn lập trình - Vòng lặp165  Vòng lặp có thể được lồng trong vòng lặp 1. // Ví dụ: Bảng cửu chương 2. i = 1; 3. do{ 4. j = 1; 5. do{ 6. printf("%d x %d = %d\n", i, j, i*j); 7. j++; 8. }while(j <= 10); 9. printf("-----------\n"); 10. i++; 11.}while (i < 10); Lỗi thường gặp 1. // Thiếu chấm phẩy !? 2. do{ 3. i++; 4. }while (i < 10) 5. 6. // Lặp vô hạn !? 7. i = 0; 8. do{ 9. i++; 10.}while (i > 0); 11.// Thiếu điều kiện !? 12.do{i++;}while (); Nhập môn lập trình - Vòng lặp166 Bài tập vận dụng Nhập môn lập trình - Vòng lặp  Viết vòng lặp dùng lệnh do while xuất ra màn hình: 1. Các số nguyên từ 1 đến 10 2. Các số nguyên từ 20 đến 11 3. Các số nguyên từ 1 đến n, với n > 0 nhập từ bàn phím 4. Các số nguyên có hai chữ số 5. Các số chẵn có ba chữ số 6. Các số lẻ từ a đến a+10, với a > 0 nhập từ bàn phím 7. Các số nguyên dương là bội của 3 và nhỏ hơn 100 8. Các số nguyên dương là bội của 3 và 5 9. Các cặp số nguyên dương có tổng là 10 167 Bài tập 4.1 – Tính toán  Viết vòng lặp thực hiện: 1. 1 = 1 + 2 + 3 + + 2. 2 = 1 + 2 + 3 + + 3. 3 = 1 + + + + 4. 4 = + + + 5. 5 = 1 + + + + 6. 1 = 1 . 2 . 3 . . 7. 2 = 1 . . . . 8. 3 = . . . . 9. 4 = 1 . . . . 10. = 1 + . + .. + + .. Nhập môn lập trình - Vòng lặp168 Hướng dẫn 4.1 – Tính tổng Nhập môn lập trình - Vòng lặp169 1. tong = 0; 2. for(khởi đầu; điều kiện; bước nhảy) 3. tong = tong + ??; 4. // Ví dụ tính tong = 4+5+6+7 5. tong = 0; 6. for ( i = 4; i <= 7; i++) 7. { 8. tong = tong + i; 9. } Hướng dẫn 4.1 – Tính tích Nhập môn lập trình - Vòng lặp170 1. tich = 1; 2. for(khởi đầu; điều kiện; bước nhảy) 3. tich = tich * ??; 4. // Ví dụ tính tich = 2x3x4x6 5. tich = 1; 6. for ( i = 2; i <= 6; i++) 7. { 8. tich = tich * i; 9. } Hướng dẫn 4.1 – Tổng các thương số Nhập môn lập trình - Vòng lặp171 1. tong = 0; 2. for(khởi đầu; điều kiện; bước nhảy) 3. { 4. tuSo = ?? 5. mauSo = ?? 6. tong += (float)tuSo/mauSo; 7. } 8. // Ví dụ tính: tong = . . . . 9. tong = 0; 10.for(i = 1; i<=n; i++) 11.{ 12. tuSo = i; 13. mauSo = 2*i+1; 14. tong += (float)tuSo/mauSo; 15.} Bài tập 4.2 – Tính toán có điều kiện  Viết vòng lặp thực hiện, với n nguyên dương: 1. Liệt kê các số chẵn nhỏ hơn n 2. Tính tổng các số lẻ nhỏ hơn n 3. Đếm số các số lẻ nhỏ hơn n 4. Tính tích các số chẵn nhỏ hơn n 5. Tính trung bình cộng các số chẵn nhỏ hơn n 6. Liệt kê tất cả ước số của n 7. Tính tổng các ước số của n 8. Đếm số lượng ước số của n 9. Tính tích các ước số của n 10. Tính trung bình cộng các ước số của n Nhập môn lập trình - Vòng lặp172 Hướng dẫn 4.2 – Liệt kê có điều kiện Nhập môn lập trình - Vòng lặp173 1. for(khởi đầu; điều kiện; bước nhảy) 2. { 3. if (điều kiện) 4. printf(...); 5. } 6. // Ví dụ: Liệt kê các ước của n 7. for(i = 1; i<=n; i++) 8. { 9. if (n%i == 0) 10. printf("%d ", i); 11.} Hướng dẫn 4.2 – Đếm có điều kiện Nhập môn lập trình - Vòng lặp174 1. dem = 0; 2. for(khởi đầu; điều kiện; bước nhảy) 3. { 4. if (điều kiện) 5. dem++; 6. } 7. // Ví dụ: Đếm các ước số của n 8. dem = 0; 9. for(i = 1; i<=n; i++) 10.{ 11. if (n%i == 0) 12. dem++; 13.} Hướng dẫn 4.2 – Tính tổng có điều kiện Nhập môn lập trình - Vòng lặp175 1. tong = 0; 2. for(khởi đầu; điều kiện; bước nhảy) 3. { 4. if (điều kiện) 5. tong += ??; 6. } 7. // Ví dụ: Tổng các ước số của n 8. tong = 0; 9. for(i = 1; i<=n; i++) 10.{ 11. if (n%i == 0) 12. tong += i; 13.} Bài tập 4.3 – Kiểm tra số Nhập một số nguyên dương n (n > 0), hãy cho biết n a. Có phải là số đối xứng? Ví dụ: 121, 12321, Tìm số đảo ngược, kiểm tra số đảo và số gốc b. Có phải là số chính phương? Ví dụ: 4, 9, 16, Là số có căn bậc hai là số nguyên c. Có phải là số nguyên tố? Ví dụ: 2, 3, 5, 7, Là số có 2 ước số: Đếm số ước số, kiểm tra số ước số d. Có phải là số hoàn hảo? Ví dụ 6, 28, 496, 8128 Là số có tổng các ước số nhỏ hơn nó bằng chính nó e. Có phải là số thuộc dãy Fibonacci? Ví dụ: 1, 2, 3, 5, 8, 13 Số tiếp theo bằng tổng của hai số trước đó Nhập môn lập trình - Vòng lặp176 Hướng dẫn 4.3.a – Số đối xứng? Nhập môn lập trình - Vòng lặp 1. // Khai báo các biến... 2. printf("Nhap so nguyen duong: "); 3. scanf("%d", &n); 4. // Tính số đảo ngược 5. i = n; soDao = 0; 6. while (i > 0){ 7. donVi = i % 10; 8. soDao = soDao*10 + donVi; 9. i = i / 10; 10. } 11. // Kiểm tra số đối xứng 12. if (soDao == n) 13. printf("%d la so đoi xung", n); 14. else 15. printf("%d la so khong doi xung", n); 177 Hướng dẫn 4.3.b – Số chính phương? Nhập môn lập trình - Vòng lặp 17./*Số chính phương là số có căn bậc hai là số nguyên, ví dụ 9 = 3*3 */ 18. // Tìm căn bậc hai của n 19. i = 1; 20. while(i*i<n) 21. { 22. i++; 23. } 24. // Kiểm tra số chính phương 25. if (i*i == n) 26. printf("%d la so chinh phuong", n); 27. else 28. printf("%d khong la so chinh phuong", n); 178 Hướng dẫn 4.3.c – Số nguyên tố? Nhập môn lập trình - Vòng lặp 29./*Số nguyên tố là số có hai ước số là 1 và chính nó, ví dụ số 2, 3, 5, 7 */ 30. 31. // Đếm số ước số 32. soUoc = 0; 33. for (i = 1; i <= n; i++) 34. if (n % i == 0) 35. souoc++; 36. // Kiểm tra số nguyên tố 37. if (souoc == 2) 38. printf("%d la so nguyen to", n); 39. else 40. printf("%d khong la so nguyen to", n); 179 Hướng dẫn 4.3.d – Số hoàn hảo? Nhập môn lập trình - Vòng lặp 41./*Số hoàn hảo là số có tổng các ước số nhỏ hơn nó bằng chính nó, ví dụ số 6 = 1 + 2 + 3 */ 42. // Tính tổng các ước số nhỏ hơn n 43. tong = 0; 44. for (i = 1; i < n; i++) 45. if (n % i == 0) 46. tong += i; 47. // Kiểm tra số hoàn hảo 48. if (n == tong) 49. printf("%d la so hoan hao", n); 50. else 51. printf("%d khong la so hoan hao", n); 180 Hướng dẫn 4.3.e – Số thuộc dãy Fibonacci? Nhập môn lập trình - Vòng lặp 52./*Dãy số Fibonacci có tính chất số sau bằng tổng của hai số trước đó, ví dụ: 1, 1, 2, 3, 5, 8 */ 53. // Tìm số Fibonacci 54. f1 = 0; f2 = 1; 55. f3 = f2 + f1; 56. while (f3 < n){ 57. f1 = f2; 58. f2 = f3; 59. f3 = f2 + f1; 60. } 61. // Kiểm tra số Fibonacci 62. if (f3 == n) 63. printf("%d la so Fibonacci", n); 64. else 65. printf("%d khong la so Fibonacci", n); 181 Bài tập 4.4 – Kiểm tra và Tính tổng Nhập một số nguyên dương n. Tính: a) Tổng các số nguyên dương nhỏ hơn n chia hết cho 3 nhưng không chia hết cho 2. b) Tổng các số đối xứng nhỏ hơn n. c) Tổng các số chính phương nhỏ hơn n. d) Tổng các số nguyên tố nhỏ hơn n. e) Tổng các số hoàn hảo nhỏ hơn n. f) Tổng các số Fibonacci nhỏ hơn n. Nhập môn lập trình - Vòng lặp182 Hướng dẫn 4.4 – Kiểm tra và tính tổng Nhập môn lập trình - Vòng lặp 1. // Cho tổng ban đầu bằng 0 2. tong = 0; 3. // Duyệt các số nhỏ hơn n 4. for ( i = 1; i < n; i++) 5. { 6. // Kiểm tra i 7. 8. // Nếu i thoả mãn điều kiện thì cộng 9. if (i thoả điều kiện) 10. tong += i; 11. } 183 Bài tập 4.5 – Chữ số Nhập một số nguyên dương n, hãy cho biết: a) Chữ số lớn nhất và nhỏ nhất? Lần lượt tìm các chữ số, tìm max và min b) Các chữ số có tăng dần không? Kiểm tra thoả điều kiện chữ số trước luôn nhỏ hơn chữ số sau c) Tổng các chữ số? Lần lượt tìm các chữ số, tính tổng Nhập môn lập trình - Vòng lặp184 Hướng dẫn 4.5.a – Chữ số min max? Nhập môn lập trình - Vòng lặp 1. // Đặt giá trị ban đầu cho min, max 2. min = n % 10; 3. max = min; 4. i = n / 10; 5. // Tìm chữ số lớn nhất, nhỏ nhất 6. while (i>0) 7. { 8. donVi = i % 10; 9. i = i / 10; 10. if (donVi < min) min = donVi; 11. if (donVi > max) max = donVi; 12. } 13. printf("Chu so nho nhat %d\n", min); 14. printf("Chu so lon nhat %d\n", max); 185 Hướng dẫn 4.5.b – Chữ số tăng dần? Nhập môn lập trình - Vòng lặp 15. tangDan = 1; 16. donVi = n % 10; 17. i = n / 10; 18. while(i>0) 19. { 20. if(i%10 >= donVi) 21. tangDan = 0; 22. donVi = i % 10; 23. i /= 10; 24. } 25. if (tangDan) 26. printf("Cac chu so tang dan"); 27. else 28. printf("Cac chu so khong tan dan"); 186 Nhập môn lập trình Hàm – Chương trình con TS. Ngô Hữu Dũng TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH Nội dung Nhập môn lập trình - Hàm Main() Function1() Function2() Function3() Function4() FUNCTION Input Output 188 Đặt vấn đề  Viết chương trình tính S = a! + b! + c! với a, b, c là 3 số nguyên dương nhập từ bàn phím. Nhập môn lập trình - Hàm Chương trình chính Nhập a, b, c > 0 Tính S = a! + b! + c! Xuất kết quả S Nhập a > 0 Nhập b > 0 Nhập c > 0 Tính s1=a! Tính s2=b! Tính s3=c! 189 Đoạn lệnh trùng lặp  3 đoạn lệnh nhập a, b, c > 0 Nhập môn lập trình - Hàm 1. do { 2. printf("Nhap mot so nguyen duong: "); 3. scanf("%d", &a); 4. } while (a <= 0); 5. do { 6. printf("Nhap mot so nguyen duong: "); 7. scanf("%d", &b); 8. } while (b <= 0); 9. do { 10. printf("Nhap mot so nguyen duong: "); 11. scanf("%d", &c); 12.} while (c <= 0); 190 Các đoạn lệnh có tính nguyên tố  3 đoạn lệnh tính s1 = a!, s2 = b!, s3 = c! Nhập môn lập trình - Hàm 1. // Tính s1 = a! = 1 * 2 * * a 2. s1 = 1; 3. for (i = 2; i <= a ; i++) 4. s1 = s1 * i; 5. // Tính s2 = b! = 1 * 2 * * b 6. s2 = 1; 7. for (i = 2; i <= b ; i++) 8. s2 = s2 * i; 9. // Tính s3 = c! = 1 * 2 * * c 10.s3 = 1; 11.for (i = 2; i <= c ; i++) 12. s3 = s3 * i; 191 Tổng quát hoá  Giải pháp => Tổng quát hoá các đoạn lệnh trùng lặp và có tính nguyên tố thành đoạn lệnh tổng quát  Đoạn lệnh nhập tổng quát  Đoạn lệnh tính giai thừa tổng quát Nhập môn lập trình - Hàm 1. // Nhập số nguyên dương 2. do { 3. printf("Nhap mot so nguyen duong: "); 4. scanf("%d", &n); 5. } while (n <= 0); 1. // Tính s = n! = 1 * 2 * * n 2. s = 1; 3. for (i = 2; i <= n ; i++) 4. s = s * i; 192 Chương trình con Nhập môn lập trình - Hàm  Cài đặt hàm nhập số nguyên dương và hàm tính giai thừa 1. void nhap(int &n) 2. { 3. do { 4. printf("Nhap mot so nguyen duong: "); 5. scanf("%d", &n); 6. } while(n <= 0); 7. } 8. int giaiThua(int n) 9. { 10. int s = 1; 11. for (i = 2; i <= n ; i++) 12. s = s * i; 13. return s; 14.} 193 Sử dụng hàm Nhập môn lập trình - Hàm  Sử dụng các hàm trong chương trình chính: 1. int main() 2. { 3. int a, b, c, s1, s2, s3, s; 4. nhap(a); 5. nhap(b); 6. nhap(c); 7. s1 = giaiThua(a); 8. s2 = giaiThua(b); 9. s3 = giaiThua(c); 10. s = s1 + s2 + s3; 11. // s = giaiThua(a)+giaiThua(b)+giaiThua(c); 12. printf("Tong: %d\n", s); 13. return 0; 14.} 194 Cấu trúc Nhập môn lập trình - Hàm  Cấu trúc chương trình  Khai báo nguyên mẫu hàm  prototype  Chương trình chính  Định nghĩa các hàm 1. #include 2. void nhap(int &); 3. int giaiThua(int); 4. int main() 5. { 6. // Nội dung 7. } 8. void nhap(int &n) 9. { 10. // Nội dung 11.} 12.int giaiThua(int n) 13.{ 14. // Nội dung 15.} 195 Hàm  Khái niệm  Một đoạn chương trình có tên, đầu vào và đầu ra.  Có chức năng giải quyết một số vấn đề chuyên biệt cho chương trình chính.  Được gọi nhiều lần với các tham số khác nhau.  Được sử dụng khi có nhu cầu:  Tái sử dụng.  Sửa lỗi và cải tiến. Nhập môn lập trình - Hàm196 Hàm  Cú pháp  Trong đó  : kiểu bất kỳ của C (char, int, long, float,). Nếu không trả về thì là void.  : Như quy tắc đặt tên biến.  : tham số hình thức đầu vào giống khai báo biến, cách nhau bằng dấu ,  : trả về cho hàm qua lệnh return. Nhập môn lập trình - Hàm ([danh sách tham số]) { [return ;] } 197 Khai báo prototype Nhập môn lập trình - Hàm  Prototype: Khai báo các hàm dùng trong chương trình  Kiểu trả về  Tên hàm  Danh sách tham số (nếu có)  Dấu chấm phẩy ;  Đầu chương trình hoặc trong file header (*.h) 1. int cong(int x, int y) 2. { 3. return x + y; 4. } 5. float nhan(int x, int y) 6. { 7. return x * y; 8. } 9. void in(float x) 10. { 11. printf("%.2f", x); 12. } 1. int cong(int, int); 2. float nhan(int, int); 3. void in(char[]); 198 Kiểu trả về của hàm Nhập môn lập trình - Hàm  Hàm có thể trả về một giá trị  int  float  char   void: Không trả về giá trị  Khi kết thúc, hàm sẽ mang một giá trị, trừ trường hợp hàm mang kiểu void. 1. int cong(int x, int y) 2. { 3. return x + y; 4. } 5. float nhan(int x, int y) 6. { 7. return x * y; 8. } 9. void in(float x) 10. { 11. printf("%.2f", x); 12. } 199 Tên hàm và tham số Nhập môn lập trình - Hàm  Tên hàm do người lập trình đặt  Tương tự đặt tên biến  Tham số (đối số)  Một, nhiều hoặc không có tham số  Mỗi tham số đều có kiểu dữ liệu  Các tham số có thể được dùng như một biến cục bộ trong hàm. 1. int cong(int x, int y) 2. { 3. return x + y; 4. } 5. float nhan(int x, int y) 6. { 7. return x * y; 8. } 9. void in(float x) 10. { 11. printf("%.2f", x); 12. } 200 Giá trị trả về Nhập môn lập trình - Hàm  Hàm return  Trả về giá trị cho hàm  Kết thúc hàm  Cú pháp: return ;  Kiểu dữ liệu của phải trùng với kiểu trả về của hàm.  Hàm void không có giá trị trả về  Không dùng lệnh return (Ví dụ 3) 1. int cong(int x, int y) 2. { 3. return x + y; 4. } 5. float nhan(int x, int y) 6. { 7. return x * y; 8. } 9. void in(float x) 10. { 11. printf("%.2f", x); 12. } 201 Gọi hàm Nhập môn lập trình - Hàm  Lệnh gọi hàm  Tên hàm  Danh sách tham số (nếu có)  Theo thứ tự  Cùng kiểu dữ liệu  Hàm có thể trả về một giá trị có kiểu của kiểu trả về của hàm. 1. #include 2. int cong(int, int); 3. float nhan(int, int); 4. void in(float); 5. void main() 6. { 7. int a = 5, b; 8. float c; 9. b = cong(a, 3); 10. c = nhan(b, 5.4); 11. in(c); 12. } 13. // Định nghĩa các hàm 202 Tham số - Truyền Giá trị (Call by Value) Nhập môn lập trình - Hàm // Truyền giá trị của tham số x cho hàm (tham trị) // Hàm sử dụng giá trị nhận được để xử lý void truyenGiaTri(int x) { x++; } /* Khi gọi hàm, có thể dùng hằng, biến hoặc biểu thức để truyền giá trị */ truyenGiaTri(5); truyenGiaTri(a); truyenGiaTri(a+b*5); truyenGiaTri(); truyenGiaTri(5, 7); 203 Tham số - Truyền tham chiếu (Call by Reference) Nhập môn lập trình - Hàm /*- Truyền địa chỉ của biến cho hàm (tham biến) - Hàm sử dụng biến nhận được để xử lý - Giá trị của biến có thể thay đổi sau khi thực hiện hàm - C++ */ void truyenThamChieu(int &x) { x++; } // Khi gọi hàm, chỉ được dùng biến để truyền tham số truyenThamChieu(a); truyenThamChieu(b); truyenThamChieu(5); 204 Tham số - Truyền địa chỉ (Call by Address) Nhập môn lập trình - Hàm /* - Truyền địa chỉ của biến cho hàm (tham biến) - Hàm sử dụng biến nhận được để xử lý - Giá trị của biến có thể thay đổi sau khi thực hiện hàm - Thao tác kiểu con trỏ */ void truyenDiaChi(int *x) { *x++; } /* Khi gọi hàm, chỉ được dùng địa chỉ của biến để truyền tham số */ truyenDiaChi(&a); truyenDiaChi(&b); truyenDiaChi(a); truyenDiaChi(5); 205 Nhiều loại tham số Nhập môn lập trình - Hàm /* Các tham số có thể được truyền theo nhiều cách */ void honHop(int x, int &y, int *z) { x++; y++; *z++; } /* Khi gọi hàm cần truyền phù hợp với tham số tương ứng */ honHop(5, a, &b); hopHop(a + b, b, &a); hopHop(a, a + b, &a); hopHop(5, a, b); 206 Các cách nhận giá trị tính toán từ hàm Nhập môn lập trình - Hàm // Nhận giá trị trả về int tinhTong(int x, int y) { return x + y; } // Nhận tham chiếu void tinhTong(int x, int y, int &tong) { tong = x + y; } // Nhận tham biến hoặc tham chiếu void tinhTongHieu(int x, int y, int &tong, int *hieu) { tong = x + y; *hieu = x – y; } 207 Xây dựng hàm  Đầu vào - Input?  Đầu ra - Output?  Kiểu trả về?  Tham số?  Nguyên mẫu hàm?  Định nghĩa hàm?  Sử dụng hàm? Nhập môn lập trình - Hàm f(x)Input Output 208 Hàm không trả về  Ví dụ 1 – Xuất tổng  Tên hàm: xuatTong  Công việc: tính và xuất tổng 2 số nguyên  Đầu vào: hai số nguyên x và y  Đầu ra: không có Nhập môn lập trình - Hàm 1. void xuatTong(int x, int y) 2. { 3. int s; 4. s = x + y; 5. printf("%d cong %d bang %d", x, y, s); 6. } 209 Hàm trả về  Ví dụ 2 – Tính tổng  Tên hàm: tinhTong  Công việc: tính và trả về tổng 2 số nguyên  Đầu vào: hai số nguyên x và y  Đầu ra: một số nguyên có giá trị x + y Nhập môn lập trình - Hàm int tinhTong(int x, int y) { int s; s = x + y; return s; } 210 Chương trình con - Function  Ví dụ 3 – Nhập và xuất tổng  Tên hàm: nhapXuatTong  Công việc: nhập và xuất tổng 2 số nguyên  Đầu vào: không có  Đầu ra: không có Nhập môn lập trình - Hàm void nhapXuatTong() { int x, y; printf("Nhap 2 so nguyen: "); scanf("%d%d", &x, &y); printf("%d cong %d bang %d", x, y, x + y); } 211 Tầm vực  Khái niệm  Là phạm vi hiệu quả của biến và hàm.  Biến:  Toàn cục: khai báo trong ngoài tất cả các hàm (kể cả hàm main) và có tác dụng lên toàn bộ chương trình.  Cục bộ: khai báo trong hàm hoặc khối { } và chỉ có tác dụng trong bản thân hàm hoặc khối đó (kể cả khối con nó). Biến cục bộ sẽ bị xóa khỏi bộ nhớ khi kết thúc khối khai báo nó. Nhập môn lập trình - Hàm212 Tầm vực Nhập môn lập trình - Hàm int a; int Ham1() { int a1; } int Ham2() { int a2; { int a21; } } void main() { int a3; } 213 Ví dụ phạm vi của biến (1) 1. #include 2. void half(float); 3. float b = 9; // Biến toàn cục 4. void main() 5. { 6. float a = 15; // Biến cục bộ 7. half(a); // Gọi hàm half 8. printf("a = %f, b = %f\n", a, b); 9. } 10. void half(float a) 11. { 12. a = a / 2; // Biến cục bộ trong hàm half 13. b = b / 2; // Biến toàn cục 14. printf("a = %f, b = %f\n", a, b); 15. } Nhập môn lập trình - Hàm214 Ví dụ phạm vi của biến (2) 1. #include 2. void double(float); 3. float x = 5, y = 6; // Biến toàn cục 4. void main() 5. { 6. float y = 7; // Biến cục bộ 7. double(x); // Gọi hàm double 8. printf("x = %f, y = %f\n", x, y); 9. } 10. void double(float x) 11. { 12. x = x * 2; // Biến cục bộ 13. y = y * 2; // Biến toàn cục 14. printf("x = %f, y = %f\n", x, y); 15. } Nhập môn lập trình - Hàm215 Ví dụ phạm vi của biến (3) 1. #include 2. void main() 3. { 4. int x = 5; // Phạm vi hàm main 5. if (x) 6. { 7. int x = 10; // Phạm vi lệnh if 8. x++; 9. printf("x = %d\n",x); 10. } 11. x++; 12. printf("x = %d\n",x); 13. } Nhập môn lập trình - Hàm216 Bài tập vận dụng Nhập môn lập trình - Hàm  Viết các hàm sau 1. Hàm nhập một số nguyên dương 2. Hàm nhập một số nguyên dương nhỏ hơn 100 3. Hàm nhập một số nguyên có giá trị từ a đến b 4. Hàm tính trung bình cộng của hai số thực 5. Hàm tính giai thừa của số nguyên dương n 6. Hàm tính diện tích của tam giác, biết ba cạnh 7. Hàm kiểm tra ba số có phải là ba cạnh của tam giác 8. Hàm kiểm tra số nguyên tố 9. Hàm xuất ra màn hình các số từ 1 đến n 10. Hàm xuất ra màn hình các số nguyên tố nhỏ hơn n 217 Đệ quy  Khái niệm  Một chương trình con có thể gọi một chương trình con khác.  Nếu gọi chính nó thì được gọi là sự đệ quy.  Số lần gọi này phải có giới hạn (điểm dừng)  Ví dụ  Tính S(n) = n! = 1*2**(n-1)*n  Ta thấy S(n) = S(n-1)*n  Vậy thay vì tính S(n) ta sẽ đi tính S(n-1)  Tương tự tính S(n-2), , S(2), S(1), S(0) = 1 Nhập môn lập trình - Hàm218 Đệ quy  Ví dụ Nhập môn lập trình - Hàm int GiaiThua(int n) { if (n == 0) return 1; else return GiaiThua(n – 1) * n; } int GiaiThua(int n) { if (n > 0) return GiaiThua(n – 1) * n; else return 1; } 219 Bài tập 5.1 Viết các hàm sau a. Viết hàm đổi một ký tự hoa sang ký tự thường. b. Viết thủ tục giải phương trình bậc nhất. c. Viết thủ tục giải phương trình bậc hai. d. Viết hàm trả về giá trị nhỏ nhất của 4 số nguyên. e. Viết thủ tục hoán vị hai số nguyên. f. Viết thủ tục sắp xếp 4 số nguyên tăng dần. Nhập môn lập trình - Hàm220 Bài tập 5.2 Viết các hàm nhận vào một số nguyên dương và: a. Trả về số đảo của số đó. b. Có phải là số đối xứng (Trả về True/False) c. Có phải là số chính phương. d. Có phải là số nguyên tố. e. Tổng các chữ số lẻ. f. Tổng các chữ số nguyên tố. g. Tổng các chữ số chính phương. Nhập môn lập trình - Hàm221 Bài tập 5.3 Viết hàm nhận vào một số nguyên dương n và thực hiện: a. S = 1 + 2 + + n b. S = 12 + 22 + + n2 c. S = 1 + 1/2 + + 1/n d. S = 1 * 2 * * n e. S = 1! + 2! + + n! Nhập môn lập trình - Hàm222 Nhập môn lập trình Mảng một chiều, chuỗi TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH Đặt vấn đề  Cần lưu trữ 10, 100, 1000 số cùng kiểu dữ liệu?  Giải pháp  Kiểu dữ liệu mảng cho phép lưu trữ một dãy các số đồng dạng.  Ví dụ  int a[10];  Tạo ra một dãy số nguyên gồm 10 phần tử Nhập môn lập trình - Mảng, chuỗi 0 1 2 3 4 7 85 6 9 224 Dữ liệu kiểu mảng  Khái niệm  Kiểu dữ liệu có cấu trúc do người lập trình định nghĩa.  Biểu diễn một dãy các biến đồng dạng.  Cùng kiểu: dãy các số nguyên, dãy các số thực, dãy các ký tự  Cùng kích thước  Số lượng phần tử được xác định ngay khi khai báo.  Một khối nhớ liên tục được cấp phát cho một biến kiểu mảng.  Truy suất một phần tử: tên mảng[chỉ số]  Ví dụ mảng có n phần tử: a[0], a[1] a[n-1] Nhập môn lập trình - Mảng, chuỗi 0 1 2 3 4 7 85 6 9 a 225 Khai báo mảng  Cú pháp  Ví dụ  int mangSoNguyen[10];  float mangSoThuc[100];  char chuoiKyTu[1000];  Lưu ý  Phải xác định cụ thể (hằng) khi khai báo.  Bộ nhớ sử dụng = *sizeof()  Một dãy liên tục có chỉ số từ 0 đến -1 Nhập môn lập trình - Mảng, chuỗi []; 226 Ví dụ một số cách khai báo mảng Nhập môn lập trình - Mảng, chuỗi 1. #define MAX 100 2. int main() 3. { 4. int A[MAX]; // Số phần tử là hằng 5. int B[100]; // Số phần tử là số nguyên cụ thể 6. float C[MAX]; 7. float D[1000]; 8. char E[MAX]; 9. char F[10]; 10. 11. typedef int mangSoNguyen[MAX]; 12. typedef float mangSoThuc[100]; 13. mangSoNguyen G; 14. mangSoThuc H, I; 15. . . . 16. return 0; 17.} 227 Số phần tử của mảng  Phải xác định cụ thể số phần tử ngay lúc khai báo  Không được sử dụng biến hoặc hằng thường  Nên sử dụng chỉ thị tiền xử lý #define để định nghĩa số phần tử mảng Nhập môn lập trình - Mảng, chuỗi int n1 = 10; int a[n1]; const int n2 = 20; int b[n2]; #define n1 10 #define n2 20 int a[n1]; //  int a[10]; float b[n2]; //  float b[20]; 228 Khởi tạo giá trị cho mảng lúc khai báo  Gồm các cách sau  Khởi tạo giá trị cho mọi phần tử của mảng  Khởi tạo giá trị cho một số phần tử đầu mảng Nhập môn lập trình - Mảng, chuỗi int a[4] = {2912, 1706, 1506, 1904}; 2912 1706 1506 1904 0 1 2 3 a int b[4] = {2912, 1706}; 2912 1706 0 0 0 1 2 3 b 229 Khởi tạo giá trị cho mảng lúc khai báo  Gồm các cách sau  Khởi tạo giá trị 0 cho mọi phần tử của mảng  Tự động xác định số lượng phần tử Nhập môn lập trình - Mảng, chuỗi int a[4] = {0}; 0 0 0 0 0 1 2 3 a int a[] = {2912, 1706, 1506, 1904}; 2912 1706 1506 1904 0 1 2 3 a 230 Truy xuất đến một phần tử  Thông qua chỉ số  Ví dụ  Các truy xuất  Hợp lệ: a[0], a[1], a[2], a[3]  Không hợp lệ: a[-1], a[4], a[5], => Cho kết quả không như mong muốn! Nhập môn lập trình - Mảng, chuỗi [] int a[4]; a[0] = 8; a[1] = 3; a[2] = a[0] - 7; a[3] = a[1] + a[2]; 8 3 1 4 0 1 2 3 a 231 Gán dữ liệu kiểu mảng  Không được sử dụng phép gán thông thường mà phải gán trực tiếp giữa các phần tử tương ứng  Ví dụ Nhập môn lập trình - Mảng, chuỗi = ; //sai [] = ; 1. #define MAX 3 2. typedef int mangSo[MAX]; 3. mangSo a = {1, 2, 3}, b; 4. b = a; // Sai 5. for (int i = 0; i < 3; i++) 6. b[i] = a[i]; 232 Một số lỗi thường gặp  Khai báo không chỉ rõ số lượng phần tử  int a[]; => int a[100];  Số lượng phần tử liên quan đến biến hoặc hằng  int n1 = 10; int a[n1]; => int a[10];  const int n2 = 10; int a[n2]; => int a[10];  Khởi tạo cách biệt với khai báo  int a[4]; a = {2912, 1706, 1506, 1904}; => int a[4] = {2912, 1706, 1506, 1904};  Chỉ số mảng không hợp lệ  int a[4];  a[-1] = 1; a[10] = 0; Nhập môn lập trình - Mảng, chuỗi233 Truyền mảng cho hàm  Truyền mảng cho hàm  Tham số kiểu mảng truyền cho hàm chính là địa chỉ của phần tử đầu tiên của mảng  Bỏ số lượng phần tử hoặc sử dụng con trỏ.  Mảng có thể thay đổi nội dung sau khi thực hiện hàm. Nhập môn lập trình - Mảng, chuỗi void sapXepTang(int a[100]); void sapXepTang(int a[]); void sapXepTang(int *a); 234 Ví dụ truyền mảng cho hàm  Truyền mảng cho hàm  Gồm mảng và số lượng phần tử của mảng Nhập môn lập trình - Mảng, chuỗi 1. void soPhanTu(int &n); 2. void nhapMang(int a[], int n); 3. void xuatMang(int a[], int n); 4. int main() 5. { 6. int a[100], n; 7. soPhanTu(n); 8. nhapMang(a, n); 9. xuatMang(a, n); 10.} 11.//. . . 235 Một số quy ước  Số lượng phần tử tối đa  Các hàm  Hàm void HoanVi(int &x, int &y): hoán vị giá trị của hai số nguyên.  Hàm int LaSNT(int n): kiểm tra một số có phải là số nguyên tố. Trả về 1 nếu n là số nguyên tố, ngược lại trả về 0. Nhập môn lập trình - Mảng, chuỗi #define MAX 100 236 Thủ tục HoanVi & Hàm LaSNT Nhập môn lập trình - Mảng, chuỗi 1. void HoanVi(int &x, int &y){ 2. int tam = x; x = y; y = tam; 3. } 4. bool LaSNT(int n){ 5. int i=2; 6. while(i<n){ 7. if(n%i==0) 8. break; 9. else 10. i++; 11. } 12. if(i==n) 13. return true; 14. return false; 15.} 237 Một số bài toán cơ bản  Viết hàm thực hiện từng yêu cầu sau 1. Nhập số phần tử 2. Nhập mảng 3. Xuất mảng 4. Tìm kiếm một phần tử trong mảng 5. Trích xuất các phần tử trong mảng 6. Đếm/ tính tổng các phần tử trong mảng 7. Kiểm tra tính chất của mảng 8. Tách mảng / Gộp mảng 9. Sắp xếp mảng giảm dần/tăng dần 10. Thêm/Xóa/Sửa một phần tử vào mảng Nhập môn lập trình - Mảng, chuỗi238 Hàm Nhập số phần tử của mảng Nhập môn lập trình - Mảng, chuỗi 1. void soPhanTu(int &n) 2. { 3. do{ 4. printf(“Nhap so luong phan tu: ”); 5. scanf(“%d”, &n); 6. }while(!(n>0 && n<=MAX)); 7. }  Số phần tử của mảng nằm trong khoảng [1..MAX] 239 Hàm Nhập Mảng Nhập môn lập trình - Mảng, chuỗi 1. void nhapMang(int a[], int n) 2. { 3. int i; 4. for (i = 0; i < n; i++) 5. { 6. printf(“Nhap phan tu thu %d: ”, i); 7. scanf(“%d”, &a[i]); 8. } 9. }  Nhập từng phần tử cho mảng  Phần tử của mảng có chỉ số từ 0 đến n-1 240 Hàm nhập mảng kết hợp Nhập môn lập trình - Mảng, chuỗi 1. void nhapMang(int a[], int &n) 2. { 3. int i; 4. do{ 5. printf(“Nhap so luong phan tu: ”); 6. scanf(“%d”, &n); 7. }while(nMAX); 8. for (i = 0; i < n; i++) 9. { 10. printf(“Nhap phan tu thu %d: ”, i); 11. scanf(“%d”, &a[i]); 12. } 13.}  Kết hợp nhập số phần tử và nhập giá trị của từng phần tử 241 Hàm Xuất Mảng Nhập môn lập trình - Mảng, chuỗi 1. void xuatMang(int a[], int n) 2. { 3. printf(“Noi dung cua mang la: ”); 4. for (int i = 0; i < n; i++) 5. printf(“%d ”, a[i]); 6. printf(“\n”); 7. }  Xuất giá trị từng phần tử của mảng 242 Tìm kiếm một phần tử trong mảng  Yêu cầu  Tìm xem phần tử x có nằm trong mảng a kích thước n hay không? Nếu có thì nó nằm ở vị trí đầu tiên nào.  Ý tưởng  Xét từng phần của mảng a. Nếu phần tử đang xét bằng x thì trả về vị trí đó. Nếu không tìm được thì trả về -1. Nhập môn lập trình - Mảng, chuỗi x 0 1 2 MAX - 1n - 1 a x b x vị trí = 1 243 Hàm Tìm Kiếm Nhập môn lập trình - Mảng, chuỗi 1. int TimKiem(int a[], int n, int x) 2. { 3. int viTri; 4. for (viTri = 0; viTri < n; viTri++) 5. if (a[viTri] == x) 6. return viTri; 7. return -1; 8. } 244 Hàm Tìm Kiếm (dùng while) Nhập môn lập trình - Mảng, chuỗi 1. int TimKiem(int a[], int n, int x) 2. { 3. int vt = 0; 4. while (vt < n && a[vt] != x) 5. vt++; 6. 7. if (vt < n) 8. return vt; 9. else 10. return -1; 11.} 245 Tìm giá trị lớn nhất của mảng  Yêu cầu  Cho trước mảng a có n phần tử. Tìm giá trị lớn nhất trong a (gọi là max)  Ý tưởng  Giả sử giá trị max hiện tại là giá trị phần tử đầu tiên a[0]  Lần lượt kiểm tra các phần tử còn lại để cập nhật max. Nhập môn lập trình - Mảng, chuỗi ?max 78 0 1 2 MAX - 1n – 1 7 2 8 8 246 Hàm tìm Max Nhập môn lập trình - Mảng, chuỗi 1. int timMax(int a[], int n) 2. { 3. int max = a[0]; 4. for (int i = 1; i < n; i++) 5. if (a[i] > max) 6. max = a[i]; 7. return max; 8. } 247 Hàm tìm vị trí của phần tử lớn nhất Nhập môn lập trình - Mảng, chuỗi 1. int timVTMax(int a[], int n) 2. { 3. int vtMax = 0; 4. for (int i = 1; i < n; i++) 5. if (a[i] > a[vtMax]) 6. vtMax = i; 7. return vtMax; 8. } 248 Trích xuất Nhập môn lập trình - Mảng, chuỗi  Xuất ra màn hình các phần tử thỏa mãn điều kiện  Ví dụ: Xuất ra màn hình các phần tử là số nguyên tố  Ý tưởng  Lần lượt kiểm tra tất cả các phần tử,  Kiểm tra phần tử nào thỏa mãn điều kiện thì xuất ra màn hình. 1. void trichXuat(int a[], int n) 2. { 3. int i; 4. for (i = 0; i < n; i++) 5. if (laSNT(a[i])) 6. printf(“%d “, a[i]); 7. } 249 Đếm Nhập môn lập trình - Mảng, chuỗi  Đếm các phần tử thỏa mãn điều kiện  Ví dụ: Đếm các phần tử là số nguyên tố  Ý tưởng  Lần lượt kiểm tra tất cả các phần tử,  Kiểm tra phần tử nào thỏa mãn điều kiện thì tăng biến đếm. 1. int demPT(int a[], int n) 2. { 3. int i, dem = 0; 4. for (i = 0; i < n; i++) 5. if (laSNT(a[i])) 6. dem++; 7. return dem; 8. } 250 Tính toán Nhập môn lập trình - Mảng, chuỗi  Tính toán các phần tử thỏa mãn điều kiện  Ví dụ: Tính tổng các phần tử là số nguyên tố  Ý tưởng  Lần lượt kiểm tra tất cả các phần tử,  Kiểm tra phần tử nào thỏa mãn điều kiện thì cộng vào tổng. 1. int tinhTong(int a[], int n) 2. { 3. int i, tong = 0; 4. for (i = 0; i < n; i++) 5. if (laSNT(a[i])) 6. tong += a[i]; 7. return tong; 8. } 251 Kiểm tra tính chất của mảng  Yêu cầu  Cho trước mảng a, số lượng phần tử n. Mảng a có phải là mảng toàn các số nguyên tố hay không?  Ý tưởng  Cách 1: Đếm số lượng số ngtố của mảng. Nếu số lượng này bằng đúng n thì mảng toàn ngtố.  Cách 2: Đếm số lượng số không phải ngtố của mảng. Nếu số lượng này bằng 0 thì mảng toàn ngtố.  Cách 3: Tìm xem có phần tử nào không phải số ngtố không. Nếu có thì mảng không toàn số ngtố. Nhập môn lập trình - Mảng, chuỗi252 Hàm Kiểm Tra (Cách 1) Nhập môn lập trình - Mảng, chuỗi 1. int KiemTra_C1(int a[], int n) 2. { 3. int dem = 0; 4. for (int i = 0; i < n; i++) 5. if (LaSNT(a[i]) == 1) // có thể bỏ == 1 6. dem++; 7. if (dem == n) 8. return 1; 9. return 0; 10.} 253 Hàm Kiểm Tra (Cách 2) Nhập môn lập trình - Mảng, chuỗi 1. int KiemTra_C2(int a[], int n) 2. { 3. int dem = 0; 4. for (int i = 0; i < n; i++) 5. if (LaSNT(a[i]) == 0) // Có thể sử dụng ! 6. dem++; 7. if (dem == 0) 8. return 1; 9. return 0; 10.} 254 Hàm Kiểm Tra (Cách 3) Nhập môn lập trình - Mảng, chuỗi 1. int KiemTra_C3(int a[], int n) 2. { 3. for (int i = 0; i < n ; i++) 4. if (LaSNT(a[i]) == 0) 5. return 0; 6. return 1; 7. } 255 Tách các phần tử thỏa điều kiện  Yêu cầu  Cho trước mảng a, số lượng phần tử na. Tách các số nguyên tố có trong mảng a vào mảng b.  Ý tưởng  Duyệt từ phần tử của mảng a, nếu đó là số nguyên tố thì đưa vào mảng b. Nhập môn lập trình - Mảng, chuỗi256 Hàm Tách Số Nguyên Tố Nhập môn lập trình - Mảng, chuỗi 1. void TachSNT(int a[], int na, int b[], int &nb) 2. { 3. nb = 0; 4. 5. for (int i = 0; i < na; i++) 6. if (LaSNT(a[i]) == 1) 7. { 8. b[nb] = a[i]; 9. nb++; 10. } 11.} 257 Tách mảng thành 2 mảng con  Yêu cầu  Cho trước mảng a, số lượng phần tử na. Tách mảng a thành 2 mảng b (chứa số nguyên tố) và mảng c (các số còn lại).  Ý tưởng  Cách 1: viết 1 hàm tách các số nguyên tố từ mảng a sang mảng b và 1 hàm tách các số không phải nguyên tố từ mảng a sang mảng c.  Cách 2: Duyệt từ phần tử của mảng a, nếu đó là số nguyên tố thì đưa vào mảng b, ngược lại đưa vào mảng c. Nhập môn lập trình - Mảng, chuỗi258 Hàm Tách 2 Mảng Nhập môn lập trình - Mảng, chuỗi 1. void TachSNT2(int a[], int na, 2. int b[], int &nb, int c[], int &nc) 3. { 4. nb = 0; 5. nc = 0; 6. for (int i = 0; i < na; i++) 7. if (LaSNT(a[i]) == 1) 8. { 9. b[nb] = a[i]; nb++; 10. } 11. else 12. { 13. c[nc] = a[i]; nc++; 14. } 15.} 259 Gộp 2 mảng thành một mảng  Yêu cầu  Cho trước mảng a, số lượng phần tử na và mảng b số lượng phần tử nb. Gộp 2 mảng trên theo tứ tự đó thành mảng c, số lượng phần tử nc.  Ý tưởng  Chuyển các phần tử của mảng a sang mảng c => nc = na  Tiếp tục đưa các phần tử của mảng b sang mảng c => nc = nc + nb Nhập môn lập trình - Mảng, chuỗi260 Hàm Gộp Mảng Nhập môn lập trình - Mảng, chuỗi 1. void GopMang(int a[], int na, int b[], int nb, 2. int c[], int &nc) 3. { 4. nc = 0; 5. for (int i = 0; i < na; i++) 6. { 7. c[nc] = a[i]; nc++; // c[nc++] = a[i]; 8. } 9. for (int i = 0; i < nb; i++) 10. { 11. c[nc] = b[i]; nc++; // c[nc++] = b[i]; 12. } 13.} 261 Sắp xếp mảng thành tăng dần  Yêu cầu  Cho trước mảng a kích thước n. Hãy sắp xếp mảng a đó sao cho các phần tử có giá trị tăng dần.  Ý tưởng  Sử dụng 2 biến i và j để so sánh tất cả cặp phần tử với nhau và hoán vị các cặp nghịch thế (sai thứ tự). Nhập môn lập trình - Mảng, chuỗi 0 1 2 MAX - 1n – 1 5 1 8 6 tạm 5 i j 8 1 5 j j 6 8 j 262 Hàm Sắp Xếp Tăng Nhập môn lập trình - Mảng, chuỗi 1. void SapXepTang(int a[], int n) 2. { 3. int i, j; 4. 5. for (i = 0; i < n – 1; i++) 6. { 7. for (j = i + 1; j < n; j++) 8. { 9. if (a[i] > a[j]) 10. HoanVi(a[i], a[j]); 11. } 12. } 13.} 263 Thêm một phần tử vào mảng  Yêu cầu  Thêm phần tử x vào mảng a kích thước n tại vị trí vt.  Ý tưởng  “Đẩy” các phần tử bắt đầu tại vị trí vt sang phải 1 vị trí.  Đưa x vào vị trí vt trong mảng.  Tăng n lên 1 đơn vị. Nhập môn lập trình - Mảng, chuỗi c z 0 1 2 MAX - 1n – 1 a b x chèn? vt n3 264 Hàm Thêm Nhập môn lập trình - Mảng, chuỗi 1. void Them(int a[], int &n, int vt, int x) 2. { 3. if (vt >= 0 && vt <= n) 4. { 5. for (int i = n; i > vt; i--) 6. a[i] = a[i - 1]; 7. 8. a[vt] = x; 9. n++; 10. } 11.} 265 Xóa một phần tử trong mảng  Yêu cầu  Xóa một phần tử trong mảng a kích thước n tại vị trí vt  Ý tưởng  “Kéo” các phần tử bên phải vị trí vt sang trái 1 vị trí.  Giảm n xuống 1 đơn vị. Nhập môn lập trình - Mảng, chuỗi b 0 1 2 MAX - 1n – 1 a x z xóa? vt n - 1 266 Hàm Xóa Nhập môn lập trình - Mảng, chuỗi 1. void Xoa(int a[], int &n, int vt) 2. { 3. if (vt >= 0 && vt < n) 4. { 5. for (int i = vt; i < n – 1; i++) 6. a[i] = a[i + 1]; 7. 8. n--; 9. } 10.} 267 Bài tập 1. Các thao tác nhập xuất a. Nhập mảng b. Xuất mảng 2. Các thao tác kiểm tra a. Mảng có phải là mảng toàn chẵn b. Mảng có phải là mảng toàn số nguyên tố c. Mảng có phải là mảng tăng dần Nhập môn lập trình - Mảng, chuỗi268 Bài tập 3. Các thao tác tính toán a. Có bao nhiêu số chia hết cho 4 nhưng không chia hết cho 5 b. Tổng các số nguyên tố có trong mảng 4. Các thao tác tìm kiếm a. Vị trí cuối cùng của phần tử x trong mảng b. Vị trí số nguyên tố đầu tiên trong mảng nếu có c. Tìm số nhỏ nhất trong mảng d. Tìm số dương nhỏ nhất trong mảng Nhập môn lập trình - Mảng, chuỗi269 Bài tập 5. Các thao tác xử lý a. Tách các số nguyên tố có trong mảng a đưa vào mảng b. b. Tách mảng a thành 2 mảng b (chứa các số nguyên dương) và c (chứa các số còn lại) c. Sắp xếp mảng giảm dần d. Sắp xếp mảng sao cho các số dương đứng đầu mảng giảm dần, kế đến là các số âm tăng dần, cuối cùng là các số 0. Nhập môn lập trình - Mảng, chuỗi270 Bài tập 6. Các thao tác thêm/xóa/sửa a. Sửa các số nguyên tố có trong mảng thành số 0 b. Chèn số 0 đằng sau các số nguyên tố trong mảng c. Xóa tất cả số nguyên tố có trong mảng Nhập môn lập trình - Mảng, chuỗi271 Nhập môn lập trình Chuỗi ký tự Khái niệm Chuỗi Nhập môn lập trình - Mảng, chuỗi  Mảng kiểu ký tự  char word [] = {'H','e','l','l','o','!'};  Chuỗi ký tự  char word [] = {'H','e','l','l','o','!','\0'};  char word [] = "Hello!";  Chuỗi ký tự bao gồm một ký tự đặc biệt nằm cuối chuỗi  Báo hiệu kết thúc chuỗi  Được hiểu là ký tự NULL, có thể viết là '\0'  Một chuỗi, ví dụ "Hello!", đã bao hàm ký tự kết thúc, tức char[7]  Kiểu liệt kê, ví dụ {'H','e','l','l','o','!','\0'}, tức char[7] 273 Khai báo Nhập môn lập trình - Mảng, chuỗi  Cú pháp char [] = ;  Cần xác định kích cỡ của chuỗi  Khai báo  Khởi tạo một giá trị cho biến  cần đủ lớn để chứa  có thể lớn hơn chiều dài của  bao gồm các ký tự và ký tự NULL (\0)  Nếu không khai báo (để trống)  Cần khởi tạo chuỗi ban đầu cho biến  Kích cỡ của biến chính là chiều dài của chuỗi (gồm ký tự NULL)  khởi tạo hợp lệ?  nằm giữa dấu hai nháy “”  liệt kê {} các ký tự bao gồm ký tự NULL, ‘\0’, ở cuối cùng 274 Ví dụ khai báo Nhập môn lập trình - Mảng, chuỗi 1. char hello[] = "Hello

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

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