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

pdf 326 trang yennguyen 3040
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Nhập môn lập trình - Ngô Hữu Dũng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

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

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:

  • pdfbai_giang_nhap_mon_lap_trinh_ngo_huu_dung.pdf