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...
326 trang |
Chia sẻ: quangot475 | Lượt xem: 961 | Lượt tải: 0
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:
- 0_nhap_mon_lap_trinh_full_9295_2021613.pdf