Bài giảng Nhập môn lập trình - Ngô Hữu Dũng
Các bước lập trình
10 Nhập môn lập trình - Tổng quan
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óaVí dụ về các bước lập trình
11 Nhập môn lập trình - Tổng quan
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
Tóm tắt nội dung tài liệu: Bài giảng 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 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 = sqr ... m trả về destination strcpy(hello, “Hi!”) trả về chuỗi “Hi!” và hello = “Hi!” char * destination: Hàm thay đổi giá trị của destination const char * source: Hàm không thay đổi giá trị của source 281 Thư viện string.h (2) Nhập môn lập trình - Mảng, chuỗi int strcmp( const char * str1, const char * str2 ) So sánh chuỗi str1 với chuỗi str2, so sánh từng ký tự từ đầu đến khi phát hiện điểm khác nhau hoặc đến cuối chuỗi (‘\0’) Giá trị trả về >0: str1 > str2 Giá trị trả về =0: str1 = str2 Giá trị trả về <0: str1 < str2 char * strcat( char * destination, const char * source ) Nối chuỗi source vào cuối chuỗi destination destination phải đủ chứa chuỗi kết quả (bao gồm ký tự NULL) char name[10]; strcpy(name, hello); strcat(name, hi); // name = “Hello!Hi!” 282 Chuyển đổi giữa chuỗi và số Nhập môn lập trình - Mảng, chuỗi Thư viện chứa các hàm chuyển đổi giữa chuỗi và số int atoi (const char * str) Chuyển chuỗi str sang số nguyên và trả về giá trị số nguyên atoi("34.5 53") = 34 double atof (const char* str) Chuyển đổi một chuỗi sang kiểu số thực và trả về số thực atof("34.5 53") = 34.5 long int atol ( const char * str ) Chuyển đổi chuỗi sang kiểu long int (4 bytes) long long int atoll ( const char * str ) Chuyển đổi chuỗi sang kiểu long long int (8 bytes) 283 Chiều dài của chuỗi Nhập môn lập trình - Mảng, chuỗi Chiều dài của chuỗi được xác định dựa vào ký tự NULL, kết thúc chuỗi Viết hàm tính chiều dài của chuỗi Hàm có kiểu nguyên, trả về chiều dài của chuỗi (output) Đối số của hàm là một chuỗi (input) Mã giả: Khai báo một biến đếm và khởi tạo giá trị 0 Duyệt và đếm các phần tử của chuỗi Dừng đếm khi gặp ký tự ‘\0’ Trả về chiều dài của chuỗi dựa vào giá trị của biến đếm Tương tự hàm strlen của thư viện string.h 284 Ví dụ tham khảo hàm tính chiều dài của chuỗi Nhập môn lập trình - Mảng, chuỗi 1. int stringLength(const char str[]) 2. { 3. int count = 0; 4. while (str[count] != '\0') 5. count++; 6. return count; 7. } 8. 9. int main() 10.{ 11. char hello[] = "Hello!"; printf("%d",stringLength(hello)); 12.} 285 Chép chuỗi Nhập môn lập trình - Mảng, chuỗi Viết hàm chép nội dung của một chuỗi nguồn vào một chuỗi đích Chuỗi đích sẽ mang giá trị của chuỗi nguồn (output) Đối số của hàm là hai chuỗi, nguồn và đích (input) Mã giả Khai báo một biến chạy và khởi gán giá trị ban đầu Duyệt từng phần tử của chuỗi nguồn Gán giá trị của từng phần tử ở chuỗi nguồn sang chuỗi đích Dừng sao chép khi gặp ký tự ‘\0’ Gán ký tự ‘\0’ vào cuối chuỗi đích Tương tự lệnh strcpy của thư viện string.h Hàm có kiểu trả về là void Bạn có thể trả về chuỗi đích cho hàm nếu biết dùng con trỏ, pointer (sẽ học sau) 286 Ví dụ tham khảo hàm chép chuỗi Nhập môn lập trình - Mảng, chuỗi 1. void stringCopy(char str1[], const char str2[]) 2. { 3. int i=-1; 4. do{ 5. i++; 6. str1[i]=str2[i]; 7. }while (str2[i]!='\0'); 8. } 9. int main() 10.{ 11. char hello[10]; 12. stringCopy(hello,"Hello!"); 13. printf("%s",hello); 14.} 287 Nối chuỗi Nhập môn lập trình - Mảng, chuỗi Viết hàm nối một chuỗi nguồn vào cuối một chuỗi đích Chuỗi đích sẽ mang giá trị là kết quả của việc nối hai chuỗi Đối số của hàm gồm hai chuỗi Mã giả Khai báo hai biến chạy và khởi gán giá trị ban đầu Biến chạy cho chuỗi nguồn, bắt đầu từ đầu chuỗi nguồn Biến chạy cho chuỗi đích, bắt đầu từ cuối chuỗi đích Duyệt từng phần tử của chuỗi nguồn Gán giá trị của các phần tử của chuỗi nguồn vào chuỗi đích Dừng sao chép khi gặp ký tự NULL của chuỗi nguồn Gán ký tự NULL vào chuỗi đích Hàm tương tự như hàm strcpy trong thư viện string.h 288 Ví dụ tham khảo hàm nối chuỗi Nhập môn lập trình - Mảng, chuỗi 1. void stringAppend(char dest[], const char src[]) 2. { 3. int i = stringLength(dest)-1, j = -1; 4. do{ 5. i++;j++; 6. dest[i]=src[j]; 7. }while(src[j]!='\0'); 8. } 9. int main() 10.{ 11. char thanks[20] = "Thank"; 12. stringAppend(thanks, " you!"); 13. printf("%s",thanks); 14.} 289 So sánh chuỗi Nhập môn lập trình - Mảng, chuỗi Viết hàm so sánh hai chuỗi ký tự str1 và str2 Hàm trả về giá trị < 0 nếu str1 < str2 = 0 nếu str1 = str2 > 0 nếu str1 > str2 Hàm có 2 đối số là hai chuỗi cần so sánh Mã giả Khai báo và khởi tạo cho một biến chạy Duyệt các phần tử cho đến khi Gặp phần tử khác nhau Hoặc kết thúc một trong hai chuỗi So sánh phần tử cuối cùng và trả về giá trị so sánh tương ứng 290 Ví dụ tham khảo về hàm so sánh chuỗi Nhập môn lập trình - Mảng, chuỗi 1. int stringCompare(const char str1[], const char str2[]) 2. { 3. int i = 0; 4. while(str1[i]==str2[i]&&str1[i]!='\0'&&str2[i]!='\0') 5. i++; 6. if(str1[i]>str2[i]) 7. return 1; 8. else if (str1[i]<str2[i]) 9. return -1; 10. else 11. return 0; 12. }; 291 Tìm kiếm Nhập môn lập trình - Mảng, chuỗi Viết hàm tìm kiếm vị trí của một chuỗi nguồn trong chuỗi đích Hàm trả về số nguyên là vị trí đầu tiên tìm thấy Hàm trả về số âm nếu không tìm thấy Đối số của hàm là hai chuỗi Mã giả? ? ? ? ? 292 Ví dụ tham khảo về tìm kiếm chuỗi Nhập môn lập trình - Mảng, chuỗi Hoạt động?? 1. int stringSearch(const char str1[], const char str2[]) 2. { 3. int i=0, j=0; 4. while(str1[i]!='\0' && str2[j]!='\0') 5. { 6. if(str1[i+j]!=str2[j]) 7. { 8. i++; j=0; 9. } 10. else 11. j++; 12. if (str2[j]=='\0') 13. return i; 14. } 15. return -1; 16. } 293 Hết Nhập môn lập trình - Mảng, chuỗi Khái niệm chuỗi Khai báo, khởi tạo Phần tử của chuỗi Thư viện string.h Thư viện stdlib.h Một vài bài toán về chuỗi Bài tập về nhà Nhập vào họ và tên, đếm số ký tự alphabet Ví dụ: Nhập “Tran Van An ”, xuất ra có 9 ký tự Nhập vào một chuỗi, đếm số chữ Ví dụ: Nhập “Day la mot chuoi ky tu”, xuất ra có 6 chữ Nhập vào họ và tên, xuất ra họ, chữ đệm và tên Ví dụ: Nhập “Tran Van An”, xuất ra họ Tran, chữ đệm Van, tên An Nhập vào một số, xuất ra chữ viết của số đó Ví dụ: Nhập 456, xuất ra: Bon tram nam muoi sau 294 Nhập môn lập trình Mảng đa chiều 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 - Mảng đa chiều Mảng hai chiều Vòng lặp lồng nhau 296 0 m-1 0 1 n-1 Am,n 0 n-1 An 0 n-1 Ma Trận Nhập môn lập trình - Mảng đa chiều 0 n-1 An 0 n-1 0 n-1 0 n-1 0 n-1 0 n-1 dòng = cột dòng > cột dòng < cột 0 n-1 An 0 n-1 0 n-1 0 n-1 0 n-1 0 n-1 dòng + cột = n-1 dòng + cột > n-1 dòng + cột < n-1 297 Khai báo kiểu mảng 2 chiều Cú pháp N1, N2: số lượng phần tử mỗi chiều Ví dụ Nhập môn lập trình - Mảng đa chiều typedef [][]; typedef int MaTran[3][4]; 0 1 2 0 1 2 3 Kiểu MaTran 298 Khai báo biến mảng 2 chiều Cú pháp Tường minh Không tường minh (thông qua kiểu) Nhập môn lập trình - Mảng đa chiều [][]; typedef [][]; ; , ; 299 Khai báo biến mảng 2 chiều Ví dụ Tường minh Không tường minh (thông qua kiểu) Nhập môn lập trình - Mảng đa chiều int a[10][20], b[10][20]; int c[5][10]; int d[10][20]; typedef int MaTran10x20[10][20]; typedef int MaTran5x10[5][10]; MaTran10x20 a, b; MaTran11x11 c; MaTran10x20 d; 300 Truy xuất đến một phần tử Thông qua chỉ số Ví dụ Cho mảng 2 chiều như sau Các truy xuất Hợp lệ: a[0][0], a[0][1], , a[2][2], a[2][3] Không hợp lệ: a[-1][0], a[2][4], a[3][3] Nhập môn lập trình - Mảng đa chiều [][] int a[3][4]; 0 1 2 0 1 2 3 301 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ử Ví dụ Nhập môn lập trình - Mảng đa chiều = ; //sai [][giá trị cs2] = ; int a[5][10], b[5][10]; b = a; // Sai int i, j; for (i = 0; i < 5; i++) for (j = 0; j < 10; j++) b[i][j] = a[i][j]; 302 Truyền mảng cho hàm Truyền mảng cho hàm Tham số kiểu mảng trong khai báo hàm giống như khai báo biến mảng 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 Có thể bỏ số lượng phần tử chiều thứ 2 hoặc 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 đa chiều void NhapMaTran(int a[][100]); void NhapMaTran(int a[][100]); void NhapMaTran(int (*a)[100]); 303 Truyền mảng cho hàm Truyền mảng cho hàm Số lượng phần tử thực sự truyền qua biến khác Lời gọi hàm Nhập môn lập trình - Mảng đa chiều void XuatMaTran(int a[50][100], int m, int n); void XuatMaTran(int a[][100], int m, int n); void XuatMaTran(int (*a)[100], int m, int n); void NhapMaTran(int a[][100], int &m, int &n); void XuatMaTran(int a[][100], int m, int n); void main() { int a[50][100], m, n; NhapMaTran(a, m, n); XuatMaTran(a, m, n); } 304 Một số bài toán cơ bản Viết chương trình con thực hiện các yêu cầu sau Nhập mảng Xuất mảng Tìm kiếm một phần tử trong mảng Kiểm tra tính chất của mảng Tính tổng các phần tử trên dòng/cột/toàn ma trận/đường chéo chính/nửa trên/nửa dưới Tìm giá trị nhỏ nhất/lớn nhất của mảng Nhập môn lập trình - Mảng đa chiều305 Một số quy ước Kiểu dữ liệu Các chương trình con 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 đa chiều #define MAXD 50 #define MAXC 100 306 Thủ tục HoanVi & Hàm LaSNT Nhập môn lập trình - Mảng đa chiều void HoanVi(int &x, int &y){ int tam = x; x = y; y = tam; } bool LaSNT(int n){ int i=2; while(i<n){ if(n%i==0) break; else i++; } if(i==n) return true; return false; } 307 Nhập Ma Trận Yêu cầu Cho phép nhập mảng a, m dòng, n cột Ý tưởng Cho trước một mảng 2 chiều có dòng tối đa là MAXD, số cột tối đa là MAXC. Nhập số lượng phần tử thực sự m, n của mỗi chiều. Nhập từng phần tử từ [0][0] đến [m-1][n-1]. Nhập môn lập trình - Mảng đa chiều308 Hàm Nhập Ma Trận Nhập môn lập trình - Mảng đa chiều 1. void NhapMaTran(int a[][MAXC], int &m, int &n) 2. { 3. printf(“Nhap so dong, so cot cua ma tran: ”); 4. scanf(“%d%d”, &m, &n); 5. int i, j; 6. for (i=0; i<m; i++) 7. for (j=0; j<n; j++) 8. { 9. printf(“Nhap a[%d][%d]: ”, i, j); 10. scanf(“%d”, &a[i][j]); 11. } 12.} 309 Xuất Ma Trận Yêu cầu Cho phép nhập mảng a, m dòng, n cột Ý tưởng Xuất giá trị từng phần tử của mảng 2 chiều từ dòng có 0 đến dòng m-1, mỗi dòng xuất giá giá trị của cột 0 đến cột n-1 trên dòng đó. Nhập môn lập trình - Mảng đa chiều310 Hàm Xuất Ma Trận Nhập môn lập trình - Mảng đa chiều 1. void XuatMaTran(int a[][MAXC], int m, int n) 2. { 3. int i, j; 4. for (i=0; i<m; i++) 5. { 6. for (j=0; j<n; j++) 7. printf(“%d ”, a[i][j]); 8. printf(“\n”); 9. } 10.} 311 Tìm kiếm một phần tử trong Ma Trận Yêu cầu Tìm xem phần tử x có nằm trong ma trận a kích thước mxn hay không? Ý tưởng Duyệt từng phần của ma trận a. Nếu phần tử đang xét bằng x thì trả về có (1), ngược lại trả về không có (0). Nhập môn lập trình - Mảng đa chiều312 Hàm Tìm Kiếm Nhập môn lập trình - Mảng đa chiều 1. int TimKiem(int a[][MAXC], int m, int n, int x) 2. { 3. int i, j; 4. for (i=0; i<m; i++) 5. for (j=0; j<n; j++) 6. if (a[i][j] == x) 7. return 1; 8. return 0; 9. } 313 Kiểm tra tính chất của mảng Yêu cầu Cho trước ma trận a kích thước mxn. Ma trận a có phải là ma trậntoàn các số nguyên tố hay không? Ý tưởng Cách 1: Đếm số lượng số ngtố của ma trận. Nếu số lượng này bằng đúng mxn thì ma trận toàn ngtố. Cách 2: Đếm số lượng số không phải ngtố của ma trận. Nếu số lượng này bằng 0 thì ma trận 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ì ma trận không toàn số ngtố. Nhập môn lập trình - Mảng đa chiều314 Hàm Kiểm Tra (Cách 1) Nhập môn lập trình - Mảng đa chiều 1. int KiemTra_C1(int a[][MAXC], int m, int n) 2. { 3. int i, j, dem = 0; 4. for (i=0; i<m; i++) 5. for (j=0; j<n; j++) 6. if (LaSNT(a[i][j]==1) 7. dem++; 8. if (dem == m*n) 9. return 1; 10. return 0; 11.} 315 Hàm Kiểm Tra (Cách 2) Nhập môn lập trình - Mảng đa chiều 1. int KiemTra_C2(int a[][MAXC], int m, int n) 2. { 3. int i, j, dem = 0; 4. for (i=0; i<m; i++) 5. for (j=0; j<n; j++) 6. if (LaSNT(a[i][j]==0) 7. dem++; 8. if (dem == 0) 9. return 1; 10. return 0; 11.} 316 Hàm Kiểm Tra (Cách 2) Nhập môn lập trình - Mảng đa chiều 1. int KiemTra_C3(int a[][MAXC], int m, int n) 2. { 3. int i, j, dem = 0; 4. for (i=0; i<m; i++) 5. for (j=0; j<n; j++) 6. if (LaSNT(a[i][j]==0) 7. return 0; 8. return 1; 9. } 317 Tính tổng các phần tử Yêu cầu Cho trước ma trận a, kích thước mxn. Tính tổng các phần tử trên: Dòng d, cột c Đường chéo chính, đường chéo phụ (ma trận vuông) Nửa trên/dưới đường chéo chính (ma trận vuông) Nửa trên/dưới đường chéo phụ (ma trận vuông) Ý tưởng Duyệt ma trận và cộng dồn các phần tử có tọa độ (dòng, cột) thỏa yêu cầu. Nhập môn lập trình - Mảng đa chiều318 Hàm tính tổng trên dòng Nhập môn lập trình - Mảng đa chiều 1. int TongDong(int a[][MAXC], int m, int n, int d) 2. { 3. int j, tong; 4. tong = 0; 5. for (j=0; j<n; j++) // Duyệt các cột 6. tong = tong + a[d][j]; 7. return tong; 8. } 319 Hàm tính tổng trên cột Nhập môn lập trình - Mảng đa chiều 1. int TongCot(int a[][MAXC], int m, int c) 2. { 3. int i, tong; 4. tong = 0; 5. for (i=0; i<m; i++) // Duyệt các dòng 6. tong = tong + a[i][c]; 7. return tong; 8. } 320 Hàm tính tổng đường chéo chính Nhập môn lập trình - Mảng đa chiều 1. int TongDCChinh(int a[][MAXC], int n) 2. { 3. int i, tong; 4. tong = 0; 5. for (i=0; i<n; i++) 6. tong = tong + a[i][i]; 7. return tong; 8. } 321 Hàm tính tổng trên đường chéo chính Nhập môn lập trình - Mảng đa chiều 1. int TongTrenDCChinh(int a[][MAXC], int n) 2. { 3. int i, j, tong; 4. tong = 0; 5. for (i=0; i<n; i++) 6. for (j=0; j<n; j++) 7. if (i < j) 8. tong = tong + a[i][j]; 9. return tong; 10.} 322 Hàm tính tổng dưới đường chéo chính Nhập môn lập trình - Mảng đa chiều 1. int TongTrenDCChinh(int a[][MAXC], int n) 2. { 3. int i, j, tong; 4. tong = 0; 5. for (i=0; i<n; i++) 6. for (j=0; j<n; j++) 7. if (i > j) 8. tong = tong + a[i][j]; 9. return tong; 10.} 323 Hàm tính tổng trên đường chéo phụ Nhập môn lập trình - Mảng đa chiều 1. int TongDCPhu(int a[][MAXC], int n) 2. { 3. int i, tong; 4. tong = 0; 5. for (i=0; i<n; i++) 6. tong = tong + a[i][n-i-1]; 7. return tong; 8. } 324 Tìm giá trị lớn nhất của Ma Trận Yêu cầu Cho trước ma trận a, kích thước mxn. Tìm giá trị lớn nhất trong ma trận 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][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 đa chiều325 Hàm tìm Max Nhập môn lập trình - Mảng đa chiều 1. int TimMax(int a[][MAXC], int m, int n) 2. { 3. int i, j, max; 4. max = a[0][0]; 5. for (i=0; i<m; i++) 6. for (j=0; j<n; j++) 7. if (a[i][j] > max) 8. max = a[i][j]; 9. return max; 10.} 326
File đính kèm:
- bai_giang_nhap_mon_lap_trinh_ngo_huu_dung.pdf