Khối thân hàm được xác định bằng cặp ký hiệu: { /* bắt đấu phần thân */ } /* kết thúc phần thân */ Một câu lệnh được viết trên 1 hay nhiều dòng nhưng phải kết thức bởi dấu ; Ví dụ
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC LẠC HỒNG
GIÁO TRÌNH
NGÔN NGỮ C/C++
Trang 22
CHƯƠNG 1: CÁC PHẦN TỬ CƠ BẢN CỦA NGÔN NGỮ C 8
1.1 MỘT SỐ CHƯƠNG TRÌNH ĐẦU TIÊN BẰNG C 8
1.2 CÁC TỪ KHÓA 10
1.3 TÊN VÀ CÁCH ĐẶT TÊN 10
1.4 CÁCH GHI LỜI GIẢI THÍCH 11
1.5 CÂU LỆNH VÀ DẤU CHẤM CÂU 11
1.6 CẤU TRÚC CHUNG CỦA CHƯƠNG TRÌNH 11
1.7 MỘT SỐ QUI TẮC VIẾT CHƯƠNG TRÌNH 12
CHƯƠNG 2: CÁC KIỂU DỮ LIỆU CƠ SỞ 13
2.1 KHÁI NIỆM VỀ KIỂU DỮ LIỆU 13
2.2 KIỂU SỐ NGUYÊN 14
2.3 KIỂU SỐ THỰC 15
2.4 KIỂU KÍ TỰ 15
2.5 KIỂU XÂU KÍ TỰ 16
2.6 KIỂU BOOLEAN 16
2.7 BIẾN VÀ HẰNG 16
2.7.1 Biến 16
2.7.2 Khai báo biến 16
2.7.3 Hằng 17
Bài tập tại lớp 18
CHƯƠNG 3: CÁC PHÉP TOÁN & HÀM CƠ BẢN 19
3.1 CÁC PHÉP TOÁN 19
3.1.1 Các phép toán số học 19
Bài tập tại lớp: (Sinh viên làm bài và sửa tại lớp) 22
3.1.2 Các toán tử quan hệ và logic 24
3.1.3 Phép toán ? 27
3.1.1 Phép toán phẩy 27
3.1.2 Phép toán Xử lý Bit: 27
3.1.3 Thứ tự ưu tiên của các toán tử: 28
Trang 33
Bài tập tại lớp 29
3.2 MỘT SỐ HÀM CƠ BẢN: 31
3.2.1 Hàm đại số: 31
3.2.2 Hàm lượng giác: 31
3.2.3 Hàm xử lý ký tự <CTYPE.H> 32
Câu hỏi trắc nghiệm 32
CHƯƠNG 4: LỆNH NHẬP XUẤT DỮ LIỆU CƠ BẢN 34
4.1 XUẤT DỮ LIỆU RA MÀN HÌNH: 34
4.1.1 Lệnh printf 34
4.1.2 Lệnh puts : 35
4.2 XUẤT KẾT QUẢ RA MÁY IN: 35
4.3 NHẬP GIÁ TRỊ CHO BIẾN: 35
4.3.1 Toán tử gán và biểu thức gán 35
4.3.2 Hàm scanf() 36
4.3.3 Hàm getchar() 37
4.3.4 Hàm getch() 37
4.3.5 Hàm gets() 37
4.4 TRÌNH BÀY MÀN HÌNH: 37
4.4.1 Lệnh gotoxy(int x, int y): 37
4.4.2 Lệnh clrscr() 37
4.4.3 Lệnh textcolor(màu chữ) 37
4.4.4 Textbackground(màu nền) 38
4.4.5 Window(int x1,int y1,int x2,int y2) 38
4.5 TẠO SỐ NGẪU NHIÊN 38
Câu hỏi trắc nghiệm 38
Bài tập tại lớp 39
Bài tập về nhà 40
CHƯƠNG 5: CÁC CẤU TRÚC ĐIỀU KIỆN 45
5.1 CẤU TRÚC CHỌN 45
5.1.1 Cấu trúc chọn với if: 45
5.1.2 Cấu trúc chọn với if/else: 47
5.2 CẤU TRÚC CHỌN VỚI SWITCH 49
Trang 44
Bài tập tại lớp(Sinh viên làm bài và sửa tại lớp) 51
Câu hỏi trắc nghiệm 52
CHƯƠNG 6: CẤU TRÚC LẶP 56
6.1 VÒNG LẶP XÁC ĐỊNH FOR 56
Bài tập tại lớp 58
6.2 VÒNG LẶP KHÔNG XÁC ĐỊNH 59
6.2.1 Vòng lặp không xác định While 59
6.2.2 Vòng lặp không xác định với điều kiện sau: do while 61
Bài tập tại lớp 62
6.3 CÁC CÂU LỆNH RẼ NHÁNH VÔ ĐIỀU KIỆN 63
6.3.1 Lệnh break 63
6.3.2 Lệnh continue 63
6.3.3 Lệnh goto 64
Câu hỏi trắc nghiệm 65
Bài tập tại lớp 65
Bài tập về nhà: 66
CHƯƠNG 7: CHƯƠNG TRÌNH CON – HÀM 70
7.1 TẠI SAO PHẢI DÙNG CHƯƠNG TRÌNH CON? 70
7.2 PHÂN LOẠI HÀM 71
7.3 KHAI BÁO MẪU HÀM 72
7.4 ĐỊNH NGHĨA HÀM 72
7.5 GỌI HÀM 73
7.6 THAM SỐ HÌNH THỨC – THAM SỐ THỰC SỰ 73
7.7 BIẾN TOÀN CỤC – BIẾN CỤC BỘ 73
7.7.1 Biến toàn cục 73
7.7.2 Biến cục bộ (biến địa phương) 73
7.8 KHAI BÁO HÀM VÀ CÁC VÍ DỤ: 73
Bài tập tại lớp 75
7.9 TRUYỀN THAM SỐ CHO HÀM 75
7.9.1 Truyền tham trị 76
7.9.2 Truyền tham chiếu 76
7.10 ĐỆ QUI: 76
Trang 55
Câu hỏi trắc nghiệm 78
Bài tập về nhà 79
CHƯƠNG 8: CHƯƠNG 8: KIỂU MẢNG (ARRAY) 81
8.1 KHÁI NIỆM: 81
8.2 MẢNG MỘT CHIỀU: 82
8.2.1 Khai Báo Biến Mảng 1 Chiều: 82
8.2.2 Khai Báo Kiểu Mảng: 83
8.2.3 Một Số Thao Tác Trên Mảng 1 Chiều: 83
8.2.4 Truyền tham số Mảng một chiều: 85
8.3 MẢNG HAI CHIỀU: 86
8.3.1 KHÁI NIỆM: 86
8.3.2 KHAI BÁO VÀ SỬ DỤNG MẢNG HAI CHIỀU: 87
8.3.3 THAO TÁC TRÊN MẢNG 2 CHIỀU: 87
8.3.4 TRUYỀN THAM SỐ TRÊN MẢNG 2 CHIỀU: 89
8.4 MẢNG NHIỀU CHIỀU: 89
8.4.1 Khái niệm: 89
8.4.2 Khai báo mảng: 89
8.4.3 Truy xuất phần tử mảng: 89
8.4.4 Thao tác trên mảng n chiều: 89
Câu hỏi trắc nghiệm 89
Bài tập tại lớp 90
Bài tập về nhà 91
CHƯƠNG 9: CHUỖI KÝ TỰ 94
9.1 KHÁI NIỆM: 94
9.2 KHAI BÁO BIẾN CHUỖI: 94
9.3 KHAI BÁO KIỂU CHUỖI: 95
9.4 CÁC THAO TÁC TRÊN KIỂU CHUỖI: 95
9.4.1 Nhập chuỗi ký tự: 95
9.4.2 Xuất chuỗi: 96
9.4.3 Truy xuất đến từng ký tự trong chuỗi: biếnchuỗi[chỉsố] 96
9.5 MẢNG CÁC CHUỖI: 97
9.6 CON TRỎ VÀ CHUỖI KÝ TỰ: 98
Trang 66
9.6.1 Khai báo con trỏ 98
9.6.2 Gán địa chỉ vùng nhớ của biến chuỗi cho biến con trỏ 98
9.6.3 Gán hằng chuỗi cho biến con trỏ 98
9.7 CẤP PHÁT ĐỘNG 1 VÙNG NHỚ CHỨA DỮ LIỆU VÀ GHI ĐịA CHỈ VÀO BIẾN CON TRỎ: 98
9.8 HÀM TỰ TẠO VÀ KIỂU CHUỖI: 99
9.9 Các hàm xử lý chuỗi strong STRING.H: 99
9.9.1 Xác định chiều dài thật sự của chuỗi: 99
9.9.2 Đổi chữ thường thành chữ hoa và ngược lại: 100
9.9.3 Nối 2 chuỗi: 100
9.9.4 Nối n ký tự của chuỗi nguồn vào sau chuỗi đích: 101
9.9.5 Sao chép chuỗi: 102
9.9.6 Sao chép n ký tự từ chuỗi nguồn sang chuỗi đích: 103
9.9.7 So sánh 2 chuỗi theo thứ tự từ điển: 103
9.9.8 Tìm kiếm: 105
9.9.9 Các hàm chuyển đổi kiểu stdlib.h 105
Câu hỏi trắc nghiệm 106
Bài tập tại lớp 107
Bài tập về nhà 107
CHƯƠNG 10: KIỂU CẤU TRÚC (STRUCTURE) 109
10.1 KHÁI NIỆM: 109
10.2 ĐỊNH NGHIÃ KIỂU CẤU TRÚC MỚI: 109
10.3 KHAI BÁO BIẾN KIỂU CẤU TRÚC: 110
10.4 CÁC THAO TÁC TRÊN BIẾN MẪU TIN: 110
10.4.1 Gán 2 biến cấu trúc có cùng kiểu cấu trúc 110
10.4.2 Truy xuất giá trị từng mục dữ liệu trong 1 biến kiểu cấu trúc: 111
10.4.3 Địa chỉ của biến cấu trúc và mục dữ liệu: 111
10.5 CON TRỎ CỦA KIỂU CẤU TRÚC: 111
10.5.1 Khai báo con trỏ kiểu cấu trúc: 111
10.5.2 Gán địa chỉ vùng nhớ của 1 biến cấu trúc cho biến con trỏ: 111
10.5.3 Truy xuất giá trị 1 thành phần của biến cấu trúc bằng biến con trỏ: 111
10.6 HÀM VÀ KIỂU CẤU TRÚC: 112
Trang 77
10.6.1 Đối số của hàm có thể là: 112
10.6.2 Hàm có thể trả về: 112
10.7 MẢNG CẤU TRÚC: 113
Câu hỏi trắc nghiệm 117
Bài tập tại lớp 117
Bài tập về nhà 117
TÀI LIỆU THAM KHẢO 120
Trang 8Bảng phân chia thời lượng:
1 Giới thiệu chương trình C 1/2
2 Cấu trúc chương trình C 1
3 Một số qui tắc viết chương trình 1/2
Trọng tâm bài giảng:
Nắm vững cấu trúc của một chương trình C
1.1 MỘT SỐ CHƯƠNG TRÌNH ĐẦU TIÊN BẰNG C
Ví dụ 1: In ra màn hình 2 dòng chữ:
DAY LA CHUONG TRINH C
CHAO CAC BAN
printf(“DAY LA CHUONG TRINH C”);
printf(“\nCHAO CAC BAN”);
getch();
}
Giải thích:
/* */ : dòng ghi chú sẽ không được biên dịch
Mỗi chương trình nên bắt đầu bằng một ghi chú nói rõ mục đích của nó
chương trình:
- File stdio.h: chứa các hàm nhập xuất trên dòng nhập xuất gián tiếp (printf )
Trang 99
- File conio.h: chứa các hàm nhập xuất trực tiếp từ bàn phím, màn hình (getch)
Khi sử dụng một hàm chuẩn cần biết nó nằm trong tập tin header nào và phải dùng
lệnh #include để nạp tập tin đó vào chương trình
#include <[path]filename> : mặc định sẽ tìm trong thư mục chỉ định trong
OptionsDirectoriesINCLUDE Directories
#include “[path]filename” : mặc định tìm ở thư mục hiện hành, nếu không tìm thấy
sẽ tìm trong thư mục INCLUDE
Thông báo lỗi nếu không tìm thấy: Unable to open include file ‘[path]filename’
Dòng main() : là bắt buộc đối với tất cả các chương trình C Dấu () sau từ khóa
main cho biết main là 1 khối chương trình gọi là hàm (function)
Khối thân hàm được xác định bằng cặp ký hiệu:
{ /* bắt đấu phần thân */
} /* kết thúc phần thân */
Một câu lệnh được viết trên 1 hay nhiều dòng nhưng phải kết thức bởi dấu ;
Ví dụ 2: Chương trình tính chu vi và diện tích hình tròn theo giá trị bán kính r nhập
Chú ý : Một chương trình C có thể chứa 1 hay nhiều hàm, trong đó, bắt buộc phải có 1 hàm
main và phải nằm trên tất cả những hàm khác (nếu có) hàm này được tự động thực
hiện đầu tiên khi chạy chương trình
Trang 10float cv, dt; /*Khai báo 2 biến cục bộ*/
printf(“\nChương trình tính diện tích và chu vi hình tròn\n”);
-Từ khóa không thể định nghĩa lại
-Không được đặt tên hằng, tên biến, tên hàm, tên chương trình trùng với từ khóa
-Một vài từ khóa thông dụng: conts, define, include, void, …
1.3 TÊN VÀ CÁCH ĐẶT TÊN ([3] trang 12)
-Tên chương trình, tên biến, tên hàm, tên hằng số,…đều phải được khai báo trước khi sử dụng
-Tên không được bắt đầu bằng số, không được chứa khoảng trắng và các kí tự đặc biệt như dấu chấm, dấu *,…
Trang 11Ví dụ cách đặt tên sai:
3PI: bắt đầu bằng số
PI$: chứa kí hiệu $
Bien 1 : chứa khảong trắng
Char: trùng từ khóa
“pi”: dùng dấu “
-Lưu y: C là ngôn ngữ phân biệt chữ hoa, chữ thường, do đó biến Ketqua khác với ketqua cũng như KETQUA
-Nên đặt tên sao cho gợi nhớ
1.4 CÁCH GHI LỜI GIẢI THÍCH([3] trang 12-13)
-Lời giải thích dùng để thuyết minh, giúp chương trình sáng sủa, dễ hiểu
-Lời giải thích không tạo ra mã chương trình
-Nếu lời giải thích nằm trên một dòng, sử dụng hai dấu gạch chéo:
Ví dụ: // day la phan giai thich
-Nếu lời giải thích nằm trên nhiều dòng, sử dụng cặp kí hiệu /* và */
Chú ý: Nếu viết các chú thích trong chương trình mà không sử dụng các dấu // hoặc /* hay
*/, trình dịch sẽ coi chúng như là các lệnh C++ và sẽ hiển thị các lỗi
1.5 CÂU LỆNH VÀ DẤU CHẤM CÂU
-Mỗi câu lệnh trong chương trình được kết thúc bằng dấu chấm phẩy
-Dấu chấm phẩy được dùng để ngăn cách các câu lệnh
-Một số trường hợp không dùng dấu chấm phẩy:
+Sau void main()
+Sau #include<…>
1.6 CẤU TRÖC CHUNG CỦA CHƯƠNG TRÌNH
Các #include: dùng nạp header file chứa các hàm thư viện sử dụng trong chương
trình:
Các #define: dùng tạo các macro thay thế
Khai báo các đối tượng dữ liệu ngoài (biến, mảng, cấu trúc, hợp )
Khai báo trước đặc trưng các hàm tự tạo (nếu có)
Hàm main
Phần định nghiã các hàm tự tạo
Chú ý: Hàm main có thể đặt sau hoặc xen vào giữa các hàm khác, nhưng được tự động gọi
thực hiện đầu tiên trong chương trình
#include<…> //khai báo thư viện
Trang 12#define
kiểu dữ liệu tên hàm (các tham số) //khai báo nguyên mẫu hàm
khai báo các biến toàn cục
//Các lệnh của hàm chính
getch(); //dừng chương trình xem kết quả
}
//Khai báo các hàm, có thể có hoặc không
kiểu dữ liệu tên hàm (các tham số)
{
//Các lệnh của hàm
return (); //trả lại giá trị cho hàm
}
1.7 MỘT SỐ QUI TẮC VIẾT CHƯƠNG TRÌNH
-Chương trình viết phải rõ ràng, thẩm mỹ
-Phải có các lời giải thích hợp lí mô tả về chương trình, cách sử dụng hoặc các biến quan trọng
-Cách bố trí câu lệnh hợp lí
+Mỗi câu lệnh chiếm 1 dòng
+Các lệnh cùng nhóm phải thẳng hàng
+Các câu lệnh viết theo phân cấp
-Chương trình nên đặt tên dễ hiểu, mang tính gợi nhớ
-Các biến đặt ngắn gọn, gọi nhớ chức năng
Trang 13CHƯƠNG 2: CÁC KIỂU DỮ LIỆU CƠ SỞ Yêu cầu:
Sau khi học xong bài này, sinh viên phải hiểu và vận dụng các kiến thức, kĩ năng cơ bản sau:
Các kiểu dữ liệu
Cách đặt tên và khai báo biến
Cách đặt tên và khai báo hàm
Phạm vi sử dụng biến
Cách sử dụng một số hàm cơ bản
Số tiết lên lớp: 2
Bảng phân chia thời lượng:
1 KiỂu dữ liệu sơ cấp 1
3 Bài tập thảo luận 1/2
Trọng tâm bài giảng:
Nắm vững các kiểu dữ liệu cơ bản của C
Cách khai báo biến và hằng
2.1 KHÁI NIỆM VỀ KIỂU DỮ LIỆU ([3] trang 20-22)
-Dữ liệu (DATA) là tất cả những gì được máy tính xử lí
-Kiểu dữ liệu (DATA TYPE) được định nghĩa với 2 điểm chính:
+Một tập hợp các giá trị mà một biến thuộc kiểu đó có thể nhận được
+Trên đó xác định một số phép toán
-Dữ liệu được chứa trong bộ nhớ máy tính với một số lượng ô nhớ nhất định tính theo đơn
vị byte
Trang 14Bảng 2.1 : Các kiểu dữ liệu khai báo cho biến số nguyên
Kiểu biến Từ khóa số byte dải giá trị
long integer long 4 -2 tỉ đến 2 tỉ
unsigned character unsigned char 1 0 đến 255
unsigned integer unsigned int 2 0 đến 65535
unsigned long integer unsigned long 4 0 đến 4 tỉ
Chú ý : Khi thực hiện phép tính số học đối với số nguyên, cần hết sức thận trọng xem các phép toán có cho kết quả vượt ra khỏi phạm vi biểu diễn của máy không, ta gọi là hiện
tượng tràn số
Ví dụ : 32000+800-2000=29200
Máy tính sẽ xử lí sai vì lúc làm phép cộng 32000 với 800 đã cho ra kết quả trung gian là
32800, vượt quá giới hạn 32767 của máy
Ví dụ 4: Khai báo biến số nguyên và tính tổng 2 số
DATA
TYPE
Kiểu vô hướng
Kiểu có cấu trúc
Kiểu con trỏ
Kiểu cơ sở
Kiểu vô hướng do người dùng định nghĩa Kiểu liệt kê
Kiểu mảng (array) Kiểu cấu trúc (struct) Kiểu tập tin (file)
Các kiểu số nguyên Các kiểu số thực Kiểu kí tự Kiểu logic Boolean
Hình 2.1: Tổng quan phân loại các kiểu dữ liệu
Trang 15//ví dụ về khai báo biến số nguyên và tính tổng của chúng
#include <stdio.h> //khai báo hàm thư viện
Bảng 2.2 : Các kiểu dữ liệu khai báo cho biến số thực
Kiểu biến Từ khóa số byte dải giá trị
số thực với độ chính xác đơn float 4 1.2E-38 đến 3.4E38
Kiểu kí tự được định nghĩa trong C bằng từ khóa char
Một hằng kí tự được biểu diễn bằng chữ viết đó nằm giữa hai dấu nháy đơn
„a‟, „A‟, „0‟,‟*‟,…
Mỗi hằng kí tự được lưu trữ đúng 1 byte ô nhớ
Trang 16Bộ mã kí tự được dùng phổ biến là bộ mã ASCII (American Standard Code for Information Interchange)
Biến là đại lượng có thể thay đổi được giá trị
Biến được lưu trữ trong bộ nhớ và được đặt tên để dễ sử dụng
Biến là 1 vùng nhớ Ram dùng lưu trữ dữ liệu tạm thời trong quá trình thực hiện chương trình Việc truy xuất đến giá trị được lưu trữ trong vùng nhớ được thực hiện thông qua tên biến
2.7.2 Khai báo biến
Muốn sử dụng biến, bắt buộc phải khai báo trước
Kiểudữliệu tênbiến1[= giátrị] , tênbiến2[=giátrị];
Tên (identifier): là 1 chuỗi tối đa 32 ký tự gồm chữ cái, số, dấu gạch dưới Trong đó
ký tự đầu tiên không phải là số C phân biệt chữ hoa và chữ thường Có thể chỉ
định chiều dài tối đa của tên bằng chức năng:
OptionsCompilerSourceIdentifier length
Biến phải gắn liền với 1 kiểu dữ liệu cụ thể
Ví dụ 5: Khai báo một số biến thuộc các kiểu đã học
int a; //khai báo 1 biến a thuộc kiểu integer
float dtb; //khai báo 1 biến dtb thuộc kiểu số thực
char lop; //khai báo 1 biến lop thuộc kiểu kí tự
unsigned int tuoi; //khai báo 1 biến tuổi thuộc kiểu số nguyên không dấu
2.7.2.1 Vị trí khai báo
Vị trí khai báo biến sẽ qui định phạm vi hoạt động của biến
Trang 17 Khai báo bên trong khối lệnh: (Biến cục bộ)
- Phải được khai báo sau dấu {, đầu khối và trước tất cả các câu lệnh khác trong khối
- Phạm vi hoạt động: Các biến này chỉ được sử dụng bên trong khối lệnh đó
- Thời gian tồn tại: Khi thực hiện xong khối lệnh, thì vùng nhớ cấp phát cho các
biến này sẽ xóa (ngoại trừ trường hợp có sử dụng từ khóa static)
- Giá trị ban đầu: Nếu không gán giá trị khởi đầu thì giá trị của các biến cục bộ chưa
được xác định Trường hợp có sử dụng từ khóa Static: thì các biến này có giá trị khởi đầu mặc định là 0 và chỉ được gán giá trị khởi đầu khi thực hiện lần đầu tiên, các lần sau sẽ sử dụng giá trị hiện đang lưu trử
- Tên các biến trong cùng 1 khối lệnh không được trùng nhau nhưng có thể trùng tên với biến nằm ngoài khối lệnh
Khai báo bên ngoài các hàm:(gọi là Biến ngoài)
- Phạm vi sử dụng của biến ngoài là từ vị trí khai báo của nó cho đến cuối chương trình Nó có thể sử dụng cho các chương trình khác nhờ khai báo extern viết trên các file này
- Giá trị ban đầu: Khi chưa được khởi đầu thì giá trị của biến ngoài = 0
- Thời gian tồn tại: cho đến khi kết thúc chương trình
2.7.2.2 Lấy địa chỉ của biến
Mỗi biến được cấp phát trong bộ nhớ gồm một hay nhiều byte liên tiếp tùy thuộc vào kiểu
dữ liệu Địa chỉ của byte đầu tiên là địa chỉ của biến
Phép toán: &tênbiến trả về địa chỉ của biến
Hằng là những giá trị cố định thuộc phạm vi của một kiểu dữ liệu, không bị thay đổi khi thực hiện chương trình
Trang 18Khai báo hằng
Muốn sử dụng hằng ta cũng phải khai báo trước với từ khóa const
Const Kiểu dữ liệu tên hằng=giá trị hằng
Ví dụ 7: Khai báo hằng
Const int tigia=16000;
const float pi=3.14;
Bài tập tại lớp
Câu 1 Chọn tương ứng cho cột A và B:
8 10.34 ABC abc
23 12112134.86868686886 _A1
$abc
„A‟
Tên định danh sai Hằng số nguyên Hằng ký tự Double
Số chấm động Tên định danh đúng
Hướng dẫn: Nhiều mục trên cột A có thể tương ứng tới một mục đơn tại cột B
Câu 2 Tính giá trị của các biến sau mỗi câu lệnh dưới đây:
Trang 19CHƯƠNG 3: CÁC PHÉP TOÁN & HÀM CƠ BẢN
Hiểu khái niệm ép kiểu
Hiểu độ ưu tiên của các toán tử
Số tiết lên lớp: 2
Bảng phân chia thời lượng:
1 Các phép toán cơ bản ½
2 Chuyển đổi kiểu dữ liệu ½
3 Các hàm cơ bản và cách sử dụng ½
Trọng tâm bài giảng:
Nắm vững các phép toán cơ bản, chuyển kiểu dữ liệu
Bảng 3.1: Bảng mô tả các phép toán 2 ngôi
Trang 20 Phép chia trên 2 số nguyên cho kết quả là 1 số nguyên, cắt bỏ phần thập phân không làm tròn số Ví dụ: 19 / 5 = 3 cắt bỏ 0.8
Phép chia lấy phần dư chỉ được dùng trên 2 toán hạng kiểu số nguyên (nếu không
sẽ sinh lỗi cú pháp) Ví dụ: 19 % 5 = 4
Thứ tự thực hiện các toán tử trong một biểu thức tương tự như trong Pascal
Ví dụ 8: Error! được viết (b*b - 4*a*c)/(2*d) hay (b*b - 4*a*c)/2/d
b) Hai toán tử 1 ngôi: Dùng tăng giảm các biến nguyên hay thực 1 đơn vị
Ví dụ 9: ++n; hay n++ <==> n = n+1;
Toán tử giảm ( ): biến; hay biến ;
Ví dụ 10: n; hay n ; <==> n = n -1;
Chú ý: Trường hợp sử dụng toán tử này trong một biểu thức thì việc đặt trước hay sau sẽ
ảnh hưởng đến kết quả bài toán:
Đặt trước: nếu muốn thay đổi giá trị cho n trước khi sử dụng n
Đặt sau: nếu muốn thay đổi giá trị cho n sau khi sử dụng n xong
printf(“%d “, x * y); printf(“%d”, x - y); printf(“%d “, x++ + ++y);
Cho kết quả: 120 -2 20
Ví dụ 15: Chương trình myProgram
1 Gọi trình soạn thảo để nhập những câu lệnh cho chương trình C
2 Tạo ra một tập tin mới
3 Nhập vào đoạn mã sau:
#include <stdio.h>
void main()
{
Trang 21int principal, period;
float rate, si;
Ðể thấy kết quả ở đầu ra, thực hiện tiếp các bước sau:
4 Lưu tập tin với tên myprogramI.C
5 Biên dịch tập tin myprogramI.C
6 Thực thi chương trình myprogramI.C
7 Trở về trình soạn thảo
Mẫu kết xuất cho chương trình trên như hình sau:
Hình 3.1:Kết quả của myprogramI.C
printf(“\nEnter any three numbers: ”);
scanf(“%d %d %d”, &a, &b, &c);
sum = a + b + c;
printf(“\n Sum = %d”, sum);
}
Trang 223 Lưu tập tin với tên myprogramII.C
4 Biên dịch tập tin myprogramII.C
5 Thực thi chương trình myprogramII.C
6 Trở về trình soạn thảo
Mẫu kết quả ở đầu ra của chương trình trên như hình sau:
Hình 3.2:Kết quả của myprogramII.C Bài tập tại lớp:
Câu 3 Viết một chương trình nhập vào một số và tính bình phương của số đó
Hướng dẫn: Thực hiện theo các bước sau:
a Nhập vào một số
b Nhân số đó với chính nó và hiển thị kết quả đó
Câu 4 Viết chương trình tính diện tích và chu vi của một vòng tròn
Hướng dẫn: Thực hiện theo các bước sau:
Hướng dẫn: Thực hiện theo các bước sau:
e Nhập vào 1 số thực (lương) và một số nguyên (tuổi)
f Dùng hàm in ra màn hình
3.1.1 Phép chuyển đổi kiểu dữ liệu
Việc chuyển đổi kiểu dữ liệu thường được diễn ra tự động trong 2 trường hợp:
- Kiểu thấp hơn sẽ được nâng thành kiểu cao hơn trước khi thực hiện phép
toán
- Giá trị thu được có kiểu cao hơn
Ví dụ 3.10 : 1.5 * (5/2) -> 1.5 * 2 = 3.00
1.5 * 5/2 -> 7.5 / 2 = 3.75
Trang 231.5 * (5/2F) -> 1.5 * 2.5= 3.75
chuyển sang kiểu của vế trái và đó là kiểu kết quả
Phép chuyển kiểu cho ra giá trị thuộc kiểu type chỉ định Bản thân của expression thì
không thay đổi kiểu
Ví dụ 18: Đổi số thực sang số nguyên có làm tròn số
int a; float x;
a = (int)( x + 0.5);
x = (float)a / 2; /*nếu a=5 ==> x = 2.5*/
Trong biểu thức thứ ba:
Nếu chúng ta di chuyển dấu chấm thập phân sang số 13 (40 / 17 * 13.0 / 3), kết quả vẫn sẽ
Trong biểu thức cuối:
nếu chúng ta di chuyển dấu chấm thập phân sang số 17 (40 / 17.0 * 13 / 3), kết quả bây giờ
sẽ là 10.196078 bởi vì:
1 17.0 ép kiểu của phép chia đầu thành kiểu double và 40.0 / 17.0 = 2.352941
Trang 242 2.352941 * 13.0 = 30.588233
3 và 30.588233 / 3.0 = 10.196078
1 Tạo một tập tin mới
2 Gõ đoạn mã sau vào „Edit window‟:
3 Lưu tập tin với tên type.c
4 Biên dịch tập tin type.c
5 Thực thi chương trình type.c
3.1.2 Các toán tử quan hệ và logic: (Ralational & logical operators)
Các phép toán quan hệ và logic cho kết quả là 1 (Đúng) | 0 (Sai) Được dùng tạo các biểu thức điều kiện cho việc chọn lựa công việc cần thực hiện
Trang 25bằng Khác != a != b Nhỏ hơn < a < b
Lớn hơn > a > b Nhỏ hơn hoặc
Phép toán so sánh có độ ƣu tiên thấp hơn so với các phép toán số học
Ví dụ 20: Độ ƣu tiên toán tử
Ðầu tiên, a+b sẽ đƣợc tính (toán tử số học có độ ƣu tiên cao hơn toán tử so sánh), kết quả là
11 Kế đến giá trị 11 đƣợc so sánh với c Kết quả là 1(true) bởi vì 11 > 7
1 Tạo một tập tin mới
2 Gõ đoạn mã sau vào „Edit window‟:
Trang 26printf("The value of a > b is \t%i\n\n", a > b);
printf("The value of b < c is \t%i\n\n", b < c);
printf("The value of a + b >= c is \t%i\n\n", a + b >= c); printf("The value of a - b <= b - c is \t%i\n\n", a-b <= b-c); printf("The value of b-a == b - c is \t%i\n\n", b - a == b - c); printf("The value of a*b != c * c is \t%i\n\n", a * b < c * c); printf(“Result of a>10 && b<5 = %d\n\n“, a>10 && b<5); printf(“Result of a > 100 || b < 50 = %d\n\n”, a>100 || b<50); }
3 Lưu tập tin với tên compare.c
4 Biên dịch tập tin compare.c
5 Thực thi chương trình compare.c
Trang 273.1.2 Phép toán ?
<điều kiện> ? <biểu thức 1> : <biểu thức 2> ;
Trả về giá trị của <biểu thức 1> nếu <điều kiện> đúng, ngƣợc lại trả về giá trị của <biểu thức 2>
(<biểu thức 1> , <biểu thức 2> , , <biểu thức n>)
Việc thực hiện đƣợc thực hiện từ trái sang phải Kết quả và kiểu dữ liệu của biểu thức phẩy
là của biểu thức ở bên phải <biểu thức n>
a ^ b Phép hoặc loại trừ (XOR)
~ a Lấy phần bù theo Bit
Trang 28(-256) << 2 = -1024; (-256) >> 2 = -64
Ví dụ 27: Để trích Byte thấp và byte cao của một số nguyên:
b_thap = a & 0xff
b_cao = a >> 8
3.1.5 Thứ tự ƣu tiên của các toán tử
Bảng 3.3: Thứ tự ưu tiên của các phép toán
1 ( ) [ ] -> Trái sang phải
2 ! ++ - (type) sizeof Phải sang trái
5 << >>
6 < <= > >= Trái sang phải
8 &
10 |
11 && Trái sang phải
13 ? :
14 = += -= *= /= %= Phải sang trái
Trang 291 Tạo một tập tin mới
2 Gõ đoạn mã sau vào cửa sổ soạn thảo:
3 Lưu tập tin với tên precede.c
4 Biên dịch tập tin precede.c
5 Thực thi chương trình precede.c
Trang 30Câu 8 Tính giá trị được gán (nằm phía bên trái) cho mỗi trường hợp sau:
Câu 9 Viết một chương trình nhập vào một số thực Ðơn vị tính cho số này là centimet (cm) Hãy in ra số tương đương tính bằng foot (số thực, có 1 số lẻ thập phân) và inch (số thực, có 1 số lẻ thập phân) Ðộ chính xác của foot và inch là một số lẻ thập phân
Hướng dẫn: 2.54 centimeters = 1 inch, và 12 inches = 1 foot
Nếu giá trị nhập vào là 333.3, kết quả là:
333.3 centimeters tương đương 10.9 feet
333.3 centimeters tương đương 131.2 inches
Câu 10 Tìm giá trị của iResult cho những câu lệnh sau:
Trang 313.2 MỘT SỐ HÀM CƠ BẢN
3.2.1 Hàm đại số
Tính trị tuyệt đối của số nguyên num: int abs(int num); (stdlib.h)
Tính trị tuyệt đối của số nguyên kiểu long int: long labs(long num); (stdlib.h)
/* Các hàm sau khai báo trong math.h */
Tính trị tuyệt đối của 1 số thực x: double fabs(double x); (math.h)
Tìm số nguyên lớn nhất x: double floor(double x);
Tìm số nguyên bé nhất x: double ceil(double x);
Tìm phần dƣ của y/x: double fmod(double y, double x);
Tính căn bặc 2 của x: double sqrt(double x);
Tính yx : double pow(double y, double x);
Tính ex : double exp(double x);
Tính ln(x): double log(double x);
Tính log10x: double log10(double x);
3.2.2 Hàm lƣợng giác
Tính sin(x): double sin(double x);
Tính cosine của x: double cos(double x);
Tính tangent của x: double tan(double x);
Tính arc cosine của (x): double acos(double x);
Trang 32 Tính arc sine của (x) double asin(double x);
Tính arc tangent của x: double atan(double x);
3.2.3 Hàm xử lý ký tự <CTYPE.H>
int tolower(int ch); Trả về chữ thường
int toupper(int ch); Trả về chữ in hoa
int islower(int ch); Là chữ thường
int isupper(int ch); Là chữ in hoa
int isdigit( int ch); Là số
int isalpha(int ch); Là mẫu tự
int isalnum(int ch); Là số hay mẫu tự
int isspace(int ch); Là dấu cách
Câu hỏi trắc nghiệm
Câu 11 là những công cụ thao tác dữ liệu
Câu 12 Một _ bao gồm sự kết hợp của các toán tử và các toán hạng
Câu 13 thiết lập sự phân cấp của một tập các toán tử so với tập các toán tử khác khi ước lượng một biểu thức
Câu 14 là một biểu thức có các toán hạng thuộc nhiều kiểu dữ liệu khác nhau
Câu 15 Một biểu thức được ép thành một kiểu nhất định bằng cách dùng
Câu 16 _ được dùng để kết hợp hay phủ định biểu thức chứa các toán tử quan hệ
A Những toán tử B Những toán hạng
C Những biểu thức D Không câu nào đúng
A Biểu thức B Hàm
C Con trỏ D Không câu nào đúng
A Những toán hạng B Độ ưu tiên
C Toán tử D Không câu nào đúng
A Biểu thức đơn B Biểu thức hỗn hợp
C Quyền ưu tiên D Không câu nào đúng
A Ép kiểu B Quyền ưu tiên
C Toán tử D Không câu nào đúng
A Những toán tử luận
lý
B Những toán tử luận lý nhị phân
C Những toán tử phức D Không câu nào đúng
Trang 33Câu 17 Những toán tử luận lý nhị phân là , _, và
Câu 18 Ðộ ưu tiên của các toán tử có thể được thay đổi bằng cách đặt các phần tử được yêu cầu của biểu thức trong _
Câu 19 Viết một chương trình nhập và cộng ba số
Câu 20 Viết một chương trình tính giá trị của biểu thức với các giá trị sau:
Câu 21 Viết một chương trình tính diện tích và chu vi của hình chữ nhật
Câu 22 Viết một chương trình tính thể tích của một hình trụ
Câu 23 Viết một chương trình tính lương thực lãnh của một nhân viên theo công thức dưới đây
A % , ^ , * and @ B &,|,~ and ^
C !,],& and * D Không câu nào đúng
A Dấu ngoặc xoắn ({ }) B Ký hiệu mũ ( ^)
C Những dấu ngoặc đơn (())
D Không câu nào đúng
TA : $120 Các mục khác : $450 Thuế :
PF :14% lương cơ bản và IT: 15% lương cơ bản Lương thực lãnh = Lương cơ bản + DA + HRA + TA + Các mục khác – (PF + IT)
Trang 34CHƯƠNG 4: LỆNH NHẬP XUẤT DỮ LIỆU CƠ BẢN
Yêu cầu:
Sau khi học xong bài này, sinh viên phải hiểu và vận dụng các kiến thức, kĩ năng cơ bản sau:
Hiểu các hàm nhập xuất có định dạng scanf() và printf()
Sử dụng các hàm nhập xuất ký tự getchar() và putchar()
Sử dụng khuôn dạng trong các hàm printf và scanf
Số tiết lên lớp: 2
Bảng phân chia thời lượng:
3 Sử dụng khuôn dạng ½
4 Bài tập thảo luận 1/2
Trọng tâm bài giảng:
Hàm printf
Hàm scanf
4.1 XUẤT DỮ LIỆU RA MÀN HÌNH
4.1.1 Lệnh printf
printf(“dòng điều khiển”, danh sách biểu thức)
- Các ký tự hiển thị
- Các ký tự điều khiển: ký tự \ dùng để bắt đầu một ký hiệu điều khiển
\n NewLine Dời con trỏ xuống dòng \\ Backslash In dấu \
\t Tab Dời con trỏ đến vị trí tab kế tiếp \” Dùng in dấu nháy kép “
\r Carriage return Dời con trỏ về đầu dòng \‟ Dùng in dấu nháy đơn „
\a Alert Phát tiếng beep ở loa
- Các mã đặc tả giá trị của biểu thức khi hiển thị Thứ tự các đặt tả phải phù hợp
với kiểu của biểu thức cần in
%d số nguyên hệ thập phân có dấu %e %E số thực dạng mũ 10 (1.23456e+2)
%u số nguyên không dấu %g Đọc 1 số dấu chấm động
Trang 35printf(“%6d”,-456) | -456| //thêm dấu cách bên trái
printf(“%-6d”,-456) |-456 | //Canh lề trái printf(“%2d”,-456) |-456|
puts(“Day la xau ki tu”);
fprintf(stdprn,“dòng điều khiển”, danh sách biểu thức)
* Tham số stdprn dùng chỉ định thiết bị xuất là máy in
4.3 NHẬP GIÁ TRỊ CHO BIẾN
4.3.1 Toán tử gán và biểu thức gán
Trong C có 2 kiểu gán giá trị nhƣ sau:
pt : +, -, *, /, %
Ví dụ 32: Toán tử gán
a = a + 2; <==> a += 2;
a = a*(b-c); <==> a *= b-c;
- Giá trị của biểu thức gán là giá trị của biểuthức vế phải
- Kiểu của biểu thức gán là kiểu của biến
Ví dụ 33: Biểu thức gán
Trang 36a = b = 5; <==> a = 5; b = 5;
x = (a = 2) * (b = 3); <==> a = 2; b = 3; x = a * b ; (x==6)
4.3.2 Hàm scanf
int scanf(“chuổi điều khiển”, danh sách địa chỉ các biến);
int scanf(const char *đk [,danh sách đối số]);
Dùng đọc dữ liệu trên dòng nhập stdin vào cho các biến Nếu dòng nhập stdin không có đủ
dữ liệu thì hàm sẽ chờ nhập tiếp dữ liệu cho dòng nhập từ bàn phím, khi ấn phím Enter, hàm tiếp tục đọc dữ liệu cho các biến còn lại
Dòng nhập stdin: là vùng nhớ chứa dãy ký tự nhập từ bàn phím, bao gồm cả các ký tự
trắng như dấu cách, tab, ký tự xuống dòng \n
Chuỗi điều khiển: chứa 3 loại : Các Mã đặc tả kiểu dữ liệu của biến; Ký tự trắng; Ký tự
khác ký tự trắng
Mã đặc tả: dùng xác định cách thức đọc ký tự trên dòng nhập và chuyển thành kiểu dữ
liệu đã đặc tả trước khi gán nó cho biến tương ứng
Mỗi đặt tả có dạng: %[*][w][.sốlẻ]kýtựchuyểndạng
Ký tự chuyển dạng gồm: d, ld, o, lo, x, lx, f hay e, lf hay le, c, s
[dãykýtự]: Đọc cho đến khi gặp 1 ký tự không thuộc dãy [^dãykýtự]: Đọc cho đến khi gặp 1 ký tự thuộc dãy
W : chỉ định chiều dài tối đa ký tự cần đọc
- Đọc theo từng trường: mỗi trường là một dãy ký tự được kết thúc bằng ký tự trắng Cách đọc theo trường phụ thuộc vào [W]
Ví dụ: scanf(“%f%5f%3d%d”,&x,&y,&a,&b)
Với dòng nhập là: 54.32e-1 25 1234567
Thì các biến sẽ nhận giá trị : x = 54.32e-1; y = 25; a = 123; b = 4567
Dấu * dùng đọc dữ liệu trên dòng nhập nhưng không lưu vào bộ nhớ Như vậy,
đặt tả chứa dấu * sẽ không có đối số tương ứng
Ví dụ 34: Các ký hiệu trong scanf
scanf(“%d %*c %d”,&x,&y); dữ liệu nhập: “10/20” > x=10; y=20
Trang 37Ký tự trắng: dùng bỏ qua 1 hay nhiều khoảng trống (như dấu cách, tab, ký hiệu xuống
dòng \n) trên dòng nhập cho đến khi gặp ký tự khác trống
Ví dụ 35: Dấu cách trong scanf
scanf(“%d %d “,&a,&b);
Dòng nhập phải có 3 trường: 25 12 5
Khi đó a=25, b=12 còn 5 vẫn còn trên stdin
Ký tự khác ký tự trắng: dùng đọc và bỏ qua ký tự phù hợp trên dòng nhập Hàm scanf sẽ
chấm dứt thao tác nếu không tìm thấy ký tự chỉ định
Ví dụ 36: Ký tự khác ký tự trắng trong scanf
scanf(“%d / %d”,&x,&y)
Nếu dữ liệu nhập là : 10/20 thì x =10; y = 20
Nếu dữ liệu nhập là : 10 20 <Enter> thì a=10 còn y thì không xác định Do hàm scanf
dò tìm ký tự / không thấy và số 20 „\n‟ (10) vẫn còn trên trường vào
nếu nhập: 25 123 <Enter> thì trôi qua lệnh scanf thứ 2 và a = 25, b = 123
4.3.3 Hàm getchar()
C=getchar() tương đượng scanf(“%c”,&c)
Kí tự đọc vào được hiện lên màn hình
4.3.4 Hàm getch()
Giống hàm getchar() nhưng không hiện kí tự gõ vào
Thường được dùng cuối chương trình để giữ nội dung màn hình xem kết quả
4.3.5 Hàm gets()
Đọc 1 dòng văn bản cho đến khi gõ Enter
Trình bày màn hình với màu sắc và vị trí theo y muốn của người dùng
Các lệnh trình bày màn hình nằm trong conio.h
4.4.1 Lệnh gotoxy(int x, int y)
Là hàm đặt con trỏ màn hình vào tọa độ x, y của màn hình Toạ độ x là tọa độ cột tính từ
1 đến 80, toạ độ y là tọa độ dòng tính từ 1 đến 25 vì màn hình được chia thành 25 dòng,
Trang 38-màu có thể là một số nguyên nằm trong khoảng từ 0 đến 15 tương ứng với 1 trong các màu
-nếu màu chữ cộng thêm 128 (BLINK) sẽ có chữ nhấp nháy
4.4.4 Textbackground(màu nền)
-chọn màu nền
-màu nền là một biểu thức nguyên có giá trị từ 0 đến 7
4.4.5 Window(int x1,int y1,int x2,int y2)
Là hàm tạo ra cửa sổ văn bản có tọa độ 2 góc: góc trên bên trái (x1,y1) và góc dưới bên phải (x2,y2) Sau đó mọi lệnh ghi ra văn bản trên màn hình sẽ nằm trong cửa sổ này
4.5 TẠO SỐ NGẪU NHIÊN
Được khai báo trong stdlib.h và kết hợp với Time.h
void randomize(void); Khởi động bộ tạo số ngẫu nhiên
int random(int n); Cho 1 giá trị ngẫu nhiên từ 0 đến n-1
void srand(unsigned seed); Khởi động bộ số tạo số ngẩu nhiên cho hàm rand()
Nhưng cho phép trả về cùng số ngẫu nhiên với cùng khởi điểm seed
int rand(void); Cho 1 giá trị ngẫu nhiên từ 0 đến 32767
Ví dụ 37: Hàm rand
#include <stdlib.h> #include <stdio.h> #include <time.h>
void main(void)
{ int i;
time_t t; //srand((unsigned) time(&t));
printf("Ten random numbers from 0 to 99\n\n");
for(i=0; i<10; i++) { srand(i%4);
Câu 25 Hàm scanf() dùng _ tới các biến chứ không dùng tên biến
Câu 26 _ xác định định dạng cho các giá trị của biến sẽ được nhập và in
A printf() và scanf() B getchar() và putchar()
C puts() và gets() D Không câu nào đúng
C Mảng D Không câu nào đúng
Trang 39Câu 27 _ được dùng bởi hàm printf() để xác định các đặc tả chuyển đổi
Câu 28 getchar() là một hàm không có bất cứ tham số nào (True/False)
Câu 29 Một _ là một nơi lưu trữ tạm trong bộ nhớ
Câu 30 Ðịnh dạng (Escape sequence) có thể được đặt bên ngoài chuỗi điều khiển của
printf()
(True/False)
Bài tập tại lớp
Câu 31 Hãy dùng câu lệnh printf() để :
Câu 32 Dùng câu lệnh scanf() và thực hiện:
Câu 33 Viết một chương trình xuất ra giá trị ASCII của các ký tự „A‟ và „b‟
Câu 34 Xét chương trình sau:
A Văn bản B Bộ định dạng
C Tham số D Không câu nào đúng
C * D Không câu nào đúng
A ROM (Bộ nhớ chỉ đọc) B Thanh ghi
C Vùng đệm D Không câu nào đúng
Xuất ra giá trị của biến số nguyên sum
Xuất ra chuỗi văn bản "Welcome", tiếp theo là một dòng mới
Xuất ra biến ký tự letter
Xuất ra biến số thực discount
Xuất ra biến số thực dump có 2 vị trí phần thập phân
a) Ðọc giá trị thập phân từ bàn phím vào biến số nguyên sum
b) Ðọc một giá trị số thực vào biến discount_rate
#include <stdio.h>
void main()
{
int breadth;
float length, height;
scanf(“%d%f%6.2f”, breadth, &length, height);
printf(“%d %f %e”, &breadth, length, height);
}
Sửa lỗi chương trình trên
Trang 40Câu 35 Viết một chương trình nhập vào name, basic, daper (phần trăm của D.A),
bonper (phần trăm lợi tức) và loandet (tiền vay bị khấu trừ) cho một nhân viên Tính
lương như sau:
salary = basic + basic * daper/100 + bonper * basic/100 - loandet
Câu 36 Viết một chương trình yêu cầu nhập vào tên, họ của bạn và sau đó xuất ra tên,
Câu 39 So sánh kết quả của bài 1 và 2 Cho nhận xét về câu lệnh clrscr()
Câu 40 Soạn thảo đoạn chương trình sau, chạy thử và cho biết kết quả hiện trên màn hình
Bảng dữ liệu:
Tính salary và xuất ra kết quả dưới các đầu đề sau (Lương được in ra gần dấu đôla ($)):
#include<stdio.h>
void main()
{
printf(" Chao ban !"); /* Co trong tap stdio.h */
printf("Moi ban lam quen voi Turbo C");
getch(); /* Dung man hinh de xem ket qua */
printf(" Chao ban !\n");
printf("Moi ban lam quen voi Turbo C");
getch();/* Co trong tap conio.h */
}