Professional Documents
Culture Documents
THDC 3
THDC 3
1 2
3 4
1
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.1 Lịch sử phát triển của ngôn ngữ C 1.1 Lịch sử phát triển của ngôn ngữ C
5 6
7 8
2
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C 1.2 Các phần tử cơ bản của ngôn ngữ C
9 10
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C 1.2 Các phần tử cơ bản của ngôn ngữ C
– Đặt tên cho kiểu dữ liệu: goto if int interrupt long return
short signed sizeof static struct switch
• int, float, double…
typedef union unsigned void while
– Mô tả các lệnh, các cấu trúc lập trình
• if, else, while, case, for… Lưu ý:Tất cả từ khóa trong C đều viết bằng
chữ cái thường
11 12
11 12
3
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C 1.2 Các phần tử cơ bản của ngôn ngữ C
3. Định danh (Identifier) 3. Định danh→ Quy tắc đặt tên định danh trong C
• Định danh (Tên) là một dãy các kí tự dùng • Định danh được bắt đầu bởi chữ cái hoặc
để gọi tên các đối tượng trong chương dấu gạch dưới “_” (underscore)
trình. • Các kí tự tiếp theo chỉ có thể là: chữ cái,
– Các đối tượng trong chương trình chữ số hoặc dấu gạch dưới “_”
• Biến • Định danh do người lập trình đặt không
• Hằng số được trùng với các từ khóa của C
• Hàm
• Độ dài định danh tùy thuộc phiên bản C
• Kiểu dữ liệu
– Ví dụ: Turbo C++, không giới hạn độ dài tên,
• Định danh có thể được đặt bởi nhưng trình biên dịch chỉ sử dụng 32 ký tự đầu
– Ngôn ngữ lập trình → các từ khóa
Chú ý: C là ngôn ngữ có phân biệt chữ hoa
– Người lập trình và chữ thường
13 14
13 14
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C 1.2 Các phần tử cơ bản của ngôn ngữ C
• Định danh hợp lệ: • Định danh nên có tính gợi nhớ
i, x, y, a, b, _function,
• Nên sử dụng dấu gạch dưới để phân tách
các định danh gồm nhiều từ
_MY_CONSTANT, PI, gia_tri_1
– Có thể dùng cách viết hoa chữ cái đầu mỗi từ
• Định danh không hợp lệ -Ví dụ: sinh_vien, sinhVien, SinhVien
1_a, 3d, 55x (bắt đầu bằng chữ số) • Quy ước thường được sử dụng:
– Hằng số dùng chữ cái hoa
so luong, sin() (có kí tự không hợp lệ, dấu
• Ví dụ: PI, EPSILON,…
cách, dấu ngoặc..)
– Các biến, hàm, cấu trúc dùng chữ cái thường
int, char (trùng với từ khóa của C) • Biến điều khiển vòng lặp: i, j, k…
• Hàm: NhapDuLieu, TimKiem,…
• Cấu trúc: SinhVien, MatHang,…
15 16
15 16
4
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C 1.2 Các phần tử cơ bản của ngôn ngữ C
• Một kiểu dữ liệu là một tập hợp các giá trị Một số phép toán được định nghĩa trên kiểu
dữ liệu int của C
mà một dữ liệu thuộc kiểu dữ liệu đó có thể
nhận được. Tên phép toán Ký hiệu Ví dụ
– Ví dụ: Một đối tượng kiểu int của C sẽ là Đảo dấu -
• Một số nguyên (Số nguyên có dấu, 2 byte) Cộng;Trừ;Nhân +;-;*
• Giá trị thuộc khoảng: [-32,768 (-215) …32,767 (215-1)] Chia lấy nguyên / 17/3→5
• Trên một kiểu dữ liệu, xác định một số phép Chia lấy phần dư % 17%3→2
toán đối với các dữ liệu thuộc kiểu dữ liệu So sánh >, <, >=, <=, ==, !=
tương ứng. Logic bit: AND; OR; & ; | ; 3^17 →18
XOR;NOT, Shift,… ^ ; ~ ; <<; >> ~3 →-4
17 18
17 18
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C 1.2 Các phần tử cơ bản của ngôn ngữ C
• Hằng (constant) là đại lượng có giá trị • Trong C, hằng số nguyên có thể biểu diễn
không đổi trong chương trình. dưới các dạng
– Dạng thập phân
• Giá trị hằng do người lập trình xác định
– Dạng thập lục phân
• Các loại hằng – Dạng bát phân
– Hằng số nguyên
Giá trị Giá trị Giá trị
– Hằng số thực thập phân thập lục phân bát phân
– Hằng ký tự 2011 0x7DB 03733
– Hằng chuỗi/xâu kỹ tự
396 0x18C 0614
19 20
19 20
5
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C 1.2 Các phần tử cơ bản của ngôn ngữ C
21 22
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C 1.2 Các phần tử cơ bản của ngôn ngữ C
23 24
6
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C 1.2 Các phần tử cơ bản của ngôn ngữ C
25 26
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C 1.2 Các phần tử cơ bản của ngôn ngữ C
27 28
7
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.2 Các phần tử cơ bản của ngôn ngữ C 1.2 Các phần tử cơ bản của ngôn ngữ C
• Câu lệnh đơn: • Lời mô tả, giải thích vắn tắt cho một câu
– Những câu lệnh không chứa câu lệnh khác. lệnh, một đoạn chương trình hoặc cả
• Ví dụ: Phép gán, gọi hàm, vào/ra dữ liệu chương trình
• Các câu lệnh phức: – Giúp việc đọc hiểu chương trình dễ dàng hơn
– Những câu lệnh chứa câu lệnh khác. – Chú thích không phải là câu lệnh không ảnh
hưởng tới chương trình
• Ví dụ: Lệnh khối (Tập các lệnh đơn nhóm lại với
nhau và đặt trong cặp ngoặc nhọn « { } ») • Khi gặp chú thích, trình biên dịch sẽ bỏ qua
– Các lệnh điều khiển cấu trúc chương trình • Cách viết chú thích
• Ví dụ: Lệnh rẽ nhánh, lệnh lặp.. – Chú thích một dòng: sử dụng « // »
– Chú thích nhiều dòng: sử dụng « /* » và « */ »
29 30
29 30
31 32
8
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.3 Cấu trúc cơ bản của chương trình C 1.3 Cấu trúc cơ bản của chương trình C
1. Khai báo các tệp tiêu đề 2. Khai báo các đối tượng toàn cục
• Liệt kê danh sách thư viện sẽ được sử dụng
trong chương trình • Các đối tượng toàn cục có phạm vi sử dụng
– Các hàm của C đều thuộc một thư viện nào đó trong toàn bộ chương trình
– Không khai báo thư viện, trình biên dịch không – Các kiểu dữ liệu mới
hiểu được hàm (có thể báo lỗi)
– Các hằng, biến
• Cách thức (cú pháp) khai báo
1. #include<ThuVien.h> – Các nguyên hàm
• Thư viện phải nằm trong thư mục chứa các header file
• Thường được sử dụng • Tuân theo nguyên tắc khai báo đối tượng
• Ví dụ: #include<stdio.h>
2. #include “ThuVien.h”
• Tìm kiếm thư viện tại thư mục hiện tại
33 34
33 34
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.3 Cấu trúc cơ bản của chương trình C 1.3 Cấu trúc cơ bản của chương trình C
2. Khai báo các đối tượng toàn cục 2. Khai báo các đối tượng toàn cục (tiếp)
Định nghĩa kiểu dữ liệu Khai báo các hàm nguyên mẫu
Cú pháp: typedef <ĐịnhNghĩaKiểu> <Tên kiểu> • Khai báo thông tin về các hàm của người
Ví dụ: typedef unsigned char byte; dùng sẽ được sử dụng trong chương trình
typedef struct {float re, im;} complex; – Tên hàm
Khai báo hằng – Danh sách các kiểu tham số sẽ truyền vào
const float PI = 3.1415; – Kiểu dữ liệu trả về
#define Max 50 • Ví dụ
float DienTichTamGiac(float a, float b, float c);
Khai báo biến
int getMax(int Arr []);
int N; Có thể bỏ tên tham số
void swap(int * a, int * b);
float Delta, x1, x2; void swap(int *, int *);
35 36
35 36
9
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.3 Cấu trúc cơ bản của chương trình C 1.3 Cấu trúc cơ bản của chương trình C
3. Định nghĩa hàm main() 4. Định nghĩa các hàm đã khai báo
• Bắt buộc phải có • Định nghĩa các hàm đã khai báo ở phần 3
• Là hàm đặc biệt trong C, đánh dấu điểm bắt (Phần khai báo nguyên mẫu - prototype)
đầu của mọi chương trình C – Phần khai báo nguyên mẫu mới chỉ khai báo các
– Khi thực hiện một chương trình C, hệ thống sẽ thông tin cơ bản về hàm, chưa xác định rõ hàm
gọi tới hàm main đầu tiên, sau đó sẽ thực hiện hoạt động như thế nào
lần lượt các câu lệnh (bao gồm cả lời gọi tới các
hàm khác) nằm trong hàm main() • Ví dụ
• Cú pháp float DienTichTamGiac(float a, float b, float c){
void main(){….} float p = (a+b+c)/2;
void main(int argc, char * argv[ ]){….} return sqrt(p*(p-a)*(p-b)*(p-c));
int main(){….; return 0;} }
int main(int argc, char * argv[ ]){….; return 0;}
37 38
37 38
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.3 Cấu trúc cơ bản của chương trình C 1.3 Cấu trúc cơ bản của chương trình C
39 40
10
Chương 1: Tổng quan về ngôn ngữ C
Chương 1: Tổng quan về ngôn ngữ lập trình C
1.4 Biên dịch chương trình C
4. Biên dịch chương trình C Mã thực thi Liên kết Mã đối tượng Hợp dịch
Executable code Link Object code Asembler
Thư viện
Libraries
41 42
41 42
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.4 Biên dịch chương trình C 1.4 Biên dịch chương trình C
43 44
11
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.4 Biên dịch chương trình C 1.4 Biên dịch chương trình C
45 46
45 46
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.4 Biên dịch chương trình C 1.4 Biên dịch chương trình C
Màn hình giao diện DEV-C++ Cài đặt Turbo C++ 3.0
B1: Chuẩn bị bộ cài của Turbo C++ 3.0
• Bộ cài tải trên mạng, kích thước khoảng 4M
• Copy bộ cài này vào máy (giả sử C:\TC_Setup)
B2: Cài đặt Turbo C
• Tìm đến thư mục chứa bộ cài (C:\TC_Setup)
• Kích hoạt file INSTALL.EXE
• Chương trình sẽ yêu cầu chỉ ra ổ đĩa chứa bộ cài TC
• Enter the SOURCE drive to use
• Nhập tên ổ đĩa (ổ C nếu đặt bộ cài tại C:\TC_Setup).
• Enter the SOURCE Path: Nhập đường dẫn tới thư mục
chứa các file của bộ cài TC
• Thông thường chương trình sẽ tự động tìm ra chỉ cần ấn
Enter để chuyển sang bước tiếp theo.
47 48
47 48
12
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.4 Biên dịch chương trình C 1.4 Biên dịch chương trình C
Cài đặt Turbo C++ 3.0 Màn hình giao diện Turbo C++ 3.0
B3: Xác định thư mục cài đặt. Thư mục này sẽ chứa
các file của TC được sử dụng về sau.
49 50
Chương 1: Tổng quan về ngôn ngữ lập trình C Chương 1: Tổng quan về ngôn ngữ lập trình C
1.4 Biên dịch chương trình C 1.4 Biên dịch chương trình C
51 52
13
Chương 1: Tổng quan về ngôn ngữ C Phần 3: Lập trình C
Tóm tắt Nội dung chính
1. Lịch sử phát triển của ngôn ngữ C • Chương 1: Tổng quan về ngôn ngữ C
• Chương 2: Kiểu dữ liệu và biểu thức trong C
2. Các phần tử cơ bản của ngôn ngữ C
– 10 phần tử cơ bản • Chương 3: Vào ra dữ liệu
3. Cấu trúc cơ bản của chương trình C • Chương 4: Cấu trúc điều khiển
53 54
55 56
14
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.1 Các kiểu dữ liệu chuẩn trong C 2.1 Các kiểu dữ liệu chuẩn trong C
57 58
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.1 Các kiểu dữ liệu chuẩn trong C 2.1 Các kiểu dữ liệu chuẩn trong C
59 60
15
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.1 Các kiểu dữ liệu chuẩn trong C 2.1 Các kiểu dữ liệu chuẩn trong C
• Ví dụ: • Ví dụ:
#define MAX_SINH_VIEN 50 const int MAX_SINH_VIEN = 50;
#define CNTT “Cong nghe thong tin” const char CNTT[20] = “Cong nghe thong tin”;
61 62
61 62
Chú ý:
1. Các kiểu dữ liệu chuẩn trong C
• Giá trị của các hằng phải được xác định ngay
khi khai báo. 2. Biểu thức trong C
• Trong chương trình, KHÔNG thể thay đổi
được giá trị của hằng. 3. Các toán tử trong C
• #define là chỉ thị tiền xử lý
– Dễ đọc, dễ thay đổi 4. Một số toán tử đặc trưng
– Dễ chuyển đổi giữa các nền tảng phần cứng hơn
– Tốc độ nhanh hơn
63 64
63 64
16
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.2 Biểu thức trong C 2.2 Biểu thức trong C
65 66
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.2 Biểu thức trong C 2.2 Biểu thức trong C
67 68
17
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.2 Biểu thức trong C 2.2 Biểu thức trong C
69 70
5 * (12 > 6) →?
71 72
71 72
18
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.3 Các toán tử trong C 2.3 Các phép tử trong C
73 74
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.3 Các toán tử trong C 2.3 Các toán tử trong C
75 76
19
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.3 Các toán tử trong C 2.3 Các toán tử trong C
77 78
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.3 Các toán tử trong C 2.3 Các toán tử trong C
char r = Op1 & Op2; char r = Op1 | Op2; char r = Op1 >> Op;
01010011 01010011 01010011
11011010 11011010 r = 0 0 0 0 1 0 1 0 → (10)
r = 0 1 0 1 0 0 1 0 → (82) r = 1 1 0 1 1 0 1 1 → (-37) char r = Op2 >> Op; unsigned char Op =218;
11011010 unsigned char r =Op >> 3;
char r = Op1 ^ Op2; char r = ~ Op2; r =1 1 1 1 1 0 1 1 → (-5) 11011010
01010011 11011010 r =0 0 0 1 1 0 1 1 → (27)
11011010 r = 0 0 1 0 0 1 0 1 → (37)
r = 1 0 0 0 1 0 0 1 → (-119) char r = Op2 << 2;
r = 0 1 1 0 1 0 0 0 →(104)
unsigned char r = Op1 | Op2; r = 1 1 0 1 1 0 1 1 → 219
79
(unsigned) int r = Op2<<2 →? 80
79 80
20
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.3 Các toán tử trong C 2.3 Các toán tử trong C
81 82
83 84
21
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.4 Một số toán tử đặc trưng 2.4 Một số toán tử đặc trưng
85 86
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.4 Một số toán tử đặc trưng 2.4 Một số toán tử đặc trưng
Toán tử lấy địa chỉ Toán tử phỏng điều kiện (biểu thức điều kiện)
& Tên_biến exp1 ? exp 2 : exp3
Ký tự & là toán tử lấy địa chỉ biến expression: Biểu thức
• Biến thực chất là một vùng .
1
• Nếu exp1 ≠ 0 (giá trị đúng), biểu thức điều
nhớ của máy tính được đặt tên ..
.. kiện trả về giá trị của exp2
→ tên của biến . 157
87 88
22
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.4 Một số toán tử đặc trưng 2.4 Một số toán tử đặc trưng
89 90
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
2.4 Một số toán tử đặc trưng 2.4 Một số toán tử đặc trưng
91 92
23
Chương 2: Kiểu dữ liệu và biểu thức trong C
Chương 2: Kiểu dữ liệu và biểu thức trong C
2.4 Một số toán tử đặc trưng
93 94
Chương 2: Kiểu dữ liệu và biểu thức trong C Chương 2: Kiểu dữ liệu và biểu thức trong C
Ví dụ Tóm tắt
const int N=10; int a= 3, b=4, c; • Kiểu dữ liệu
float S= 0.0; c = a++ * ++b; – Nguyên : char, unsigned char, int, long,
int b; unsigned int, unsigned long
S = N/3 +1; – Thực : float, double, long double
a=4 b= 5 c=15
b=(S>4); • Giá trị logic
– Đúng/TRUE : 1 (Khác 0)
S= 4 b = 0 – Sai/FALSE : 0
• Toán tử
– Một ngôi : + -; ++ --; ~ !; &; ();
int k ,num=30; – Hai ngôi : + - * / %; == != < <= > >=; << >>;
k =num>5 ? (num <=10 ? 100 : 200): 500; &, ^, |, && ||; = *= +=…
k=200 – 3 ngôi :?:
95 96
95 96
24
Phần 3: Lập trình C Chương 3: Vào ra dữ liệu
Nội dung chính Nội dung chính
• Chương 1: Tổng quan về ngôn ngữ C 1. Các hàm vào ra cơ bản:
• Chương 2: Kiểu dữ liệu và biểu thức trong C – printf()
• Chương 3: Vào ra dữ liệu – scanf()
• Chương 4: Cấu trúc điều khiển
2. Các hàm vào ra khác
• Chương 5: Mảng, con trỏ và xâu ký tự
– gets()
• Chương 6: Cấu trúc
• Chương 7: Hàm
– puts()
• Chương 8: Tệp dữ liệu – getch()
97 98
97 98
99 100
99 100
25
Chương 3: Vào/Ra dữ liệu Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → printf() 3.1 Các hàm vào ra cơ bản → printf()
• Hiển thị ra màn hình các loại dữ liệu cơ bản printf(xau_dinh_dang [, DS_tham_so]);
– Số nguyên, số thực, kí tự, xâu kí tự • Xau_dinh_dang: Là một xâu qui định cách thức
hiển thị dữ liệu ra màn hình máy tính.
• Tạo một số hiệu ứng hiển thị đặc biệt – Bao gồm các nhóm kí tự định dạng
– Xuống dòng, sang trang,… – Nhóm kí tự định dạng thứ k xác định quy cách
hiển thị tham số thứ k trong DS_tham_số
Cú pháp
• Số lượng tham số trong DS_tham_số bằng số lượng
printf(xau_dinh_dang [, DS_tham_so]); nhóm các kí tự định dạng trong xâu_định_dạng.
• DS_tham_so: Danh sách các biến/biểu thức sẽ
được hiển thị giá trị lên màn hình theo cách thức
được qui định trong xau_dinh_dang.
101 102
101 102
103 104
26
Chương 3: Vào/Ra dữ liệu Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → printf() 3.1 Các hàm vào ra cơ bản → printf()
105 106
%lo long Số bát phân %e, %E float/double Số thực dấu phẩy động
(không có 0 đằng trước) %c int, char Kí tự đơn lẻ
%lx, %LX long Số hexa
(chữ thường/chữ hoa)
%s char [] Hiển thị xâu kí tự kết
thúc bởi ‘\0’
%lu unsigned long Số thập phân
%% Hiển thị kí tự %
Nhận xét:
Với kiểu long, thêm ký tự l ngay sau dấu %
107 108
107 108
27
Chương 3: Vào/Ra dữ liệu Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → printf() 3.1 Các hàm vào ra cơ bản → printf()
• Có dạng “%m”,
printf("\n%3d %15s %3c", 1, "nguyen van a", 'g');
– m là một giá trị nguyên, không âm.
printf("\n%3d %15s %3c", 2, "tran van b", 'k');
– m cho biết số chỗ trống dành cho hiển thị
biểu thức tương ứng
Ví dụ: 1 nguyen van a g
int a = 1234; 2 tran van b k
printf(“%5d”,a) → 1234
printf(“%5d”,34)→ 34
ký hiệu cho dấu trắng (space)
109 110
109 110
111 112
28
Chương 3: Vào/Ra dữ liệu Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → printf() 3.1 Các hàm vào ra cơ bản
%-
• Khi hiển thị dữ liệu có sử dụng tham số độ
rộng, để căn lề trái cần thêm dấu trừ - vào
ngay sau dấu %:
– Ngầm định, căn lề phải
scanf()
Ví dụ:
printf("%-3d%-10s%-5.2f%-3c",5,"Hello",7.5, 'g')
→5Hello7.50g
113 114
113 114
115 116
29
Chương 3: Vào/Ra dữ liệu Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf() 3.1 Các hàm vào ra cơ bản → scanf()
117 118
%c Đọc kí tự đơn lẻ %s Đọc xâu kí tự tới khi gặp dấu phân cách
119 120
119 120
30
Chương 3: Vào/Ra dữ liệu Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf() 3.1 Các hàm vào ra cơ bản → scanf()
Ví dụ Ví dụ
#include <conio.h> printf(“\nNhap vao mot xau ki tu:”);
#include <stdio.h> fflush(stdin); scanf(“%s”,str);
void main(){
// khai bao bien // Hien thi du lieu vua nhap vao
int a; float x; printf(“\nNhung du lieu vua nhap vao”);
char ch; char str[30]; printf(“\nSo nguyen : %d”,a);
// Nhap du lieu printf(“\nSo thuc : %5.2f”,x);
printf(“Nhap vao mot so nguyen:”); scanf(“%d”,&a); printf(“\nKy tu : %c”,ch);
printf(“\nNhap vao mot so thuc:”); scanf(“%f”,&x); printf(“\nXau ky tu : %s”,str);
printf(“\n Nhap vao mot ki tu:”); getch();
}
fflush(stdin); scanf(“%c”,&ch);
121 122
121 122
123 124
123 124
31
Chương 3: Vào/Ra dữ liệu Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf() 3.1 Các hàm vào ra cơ bản → scanf()
Các quy tắc cần lưu ý Ví dụ: Đọc 2 số nguyên, đưa ra tổng, hiệu, tích…
Khi đọc kí tự #include <stdio.h>
int main(){
Hàm scanf() cho rằng mọi kí tự có trong bộ đệm int A, B;
của thiết bị vào chuẩn đều là hợp lệ, kể cả các kí printf("Nhap vao 2 so nguyen : "); scanf("%d %d",&A,&B);
tự tab, xuống dòng hay dấu cách printf("\n");
Khi đọc xâu kí tự: printf("Tong %d + %d = %d \n", A, B, A + B);
printf("Hieu %d - %d = %d\n", A, B, A - B);
Hàm scanf() nếu gặp các kí tự dấu trắng, dấu tab
printf("Tich %d x %d = %d\n", A, B, A * B);
hay dấu xuống dòng thì nó sẽ hiểu là kết thúc
printf("Thuong %d / %d = %.3f\n", A, B, (float)A / B);
nhập dữ liệu cho một xâu kí tự. printf("Chia nguyen %d / %d = %d\n", A, B, A / B);
Ghi chú: printf("Chia du %d %% %d = %d\n", A, B, A % B);
Trước khi nhập dữ liệu kí tự hay xâu kí tự nên printf("\n");
dùng lệnh fflush(stdin) để xóa bộ đệm. return 0;
125 } 126
125 126
127 128
32
Chương 3: Vào/Ra dữ liệu Chương 3: Vào/Ra dữ liệu
3.1 Các hàm vào ra cơ bản → scanf() 3.1 Các hàm vào ra cơ bản → scanf()
Ví dụ: Đọc tọa độ 3 điểm A,B,C và đưa ra d/tích ABC Ví dụ: Đọc tọa độ 3 điểm A,B,C và đưa ra d/tích ABC
#include <stdio.h>
#include <math.h>
int main(){
float Ax,Ay, Bx, By, Cx, Cy, AB, BC, CA,p;
printf("Nhap vao toa do diem A : "); scanf("%f %f",&Ax,&Ay);
printf("Nhap vao toa do diem B : "); scanf("%f %f",&Bx,&By);
printf("Nhap vao toa do diem C : "); scanf("%f %f",&Cx,&Cy);
//Tinh do dai cac canh cua tam giac
AB = sqrt((Ax-Bx)*(Ax-Bx)+(Ay-By)*(Ay-By));
BC = sqrt((Bx-Cx)*(Bx-Cx)+(By-Cy)*(By-Cy));
CA = sqrt((Cx-Ax)*(Cx-Ax)+(Cy-Ay)*(Cy-Ay));
p = (AB +BC +CA)/2;
printf("Dien tich tam giac ABC la: %f",sqrt(p*(p-AB)*(p-BC)*(p-CA)));
printf("\n");
return 0;
} 129 130
129 130
131 132
33
Chương 3: Vào/Ra dữ liệu Chương 3: Vào/Ra dữ liệu
3.2 Các hàm vào ra khác 3.2 Các hàm vào ra khác
gets() puts()
• Mục đích: • Mục đích:
– Dùng để nhập vào từ bàn phím một xâu – Hiển thị ra màn hình nội dung xâu_kí_tự
kí tự bao gồm cả dấu cách, điều mà và sau đó đưa con trỏ xuống dòng mới
hàm scanf() không làm được.
• Cú pháp:
• Cú pháp : puts(xâu_kí_tự);
gets (xâu_kí_tự);
• Ví dụ:
• Ví dụ:
puts(“Nhap vao xau ki tu:”);
char str [40];
printf(“Nhap vao mot xau ki tu:”); Tương đương với lệnh:
fflush(stdin); printf(“%s\n”,“Nhap vao xau ki tu:“).
gets(str); 133 134
133 134
getch() Ví dụ
• Mục đích #include <conio.h>
#include <stdio.h>
– Đợi đọc một ký tự bàn phím
void main(){
– Thường dùng để chờ người sử dụng char ten[30], lop[10]; //Kieu chuoi, mang ky tu
ấn một phím bất kì trước khi kết thúc puts("Hay cho biet ten ban : ");
chương trình. fflush(stdin); gets(ten);
puts("Hay cho biet lop ban hoc : ");
• Cú pháp fflush(stdin); gets(lop);
getch(); printf("\nChao ban %s, sinh viên lop %s\n",ten,lop);
puts("Chuc ban thi qua mon Tin Hoc Dai Cuong");
getch();
135
} 136
135 136
34
Chương 3: Vào ra dữ liệu
Chương 3: Vào/Ra dữ liệu
3.2 Các hàm vào ra khác
137 138
139 140
35
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.1 Cấu trúc lệnh khối 4.1 Cấu trúc lệnh khối
141 142
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.1 Cấu trúc lệnh khối 4.1 Cấu trúc lệnh khối
143 144
36
Chương 4: Cấu trúc điều khiển
Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh
145 146
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
147 148
37
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
Ví dụ: So sánh 2 số thực được nhập vào Ví dụ: So sánh 2 số thực được nhập vào
#include <conio.h>
#include <stdio.h>
void main()
{
float a, b; float max; // khai bao bien
printf(“ Nhap gia tri a va b: “);
scanf(“%f %f”,&a,&b);
if(a < b)
max = b;
if(a < b)
else
max = a; max = b;
printf(“\nSo lon nhat trong 2 so %.4f va %.4f la %.4f “,a,b,max);
max = a > b ? a : b;
else
getch();
} //ket thuc ham main()
max = a;
149 150
149 150
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
151 152
38
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
Ví dụ: Nhập x và tính hàm Cấu trúc if / if… else lồng nhau
#include <stdio.h> x 2 + sin 4 2x + 1 khi x 3
#include <math.h>
Cấu trúc if.. và if …else có thể lồng nhau
f ( x) = 5 khi x = 3
void main() – Khi đó else sẽ tương ứng với if (phía trên,
{
x − 3 + log ( x 2
− 3) khi x3
10
chưa có else) gần nhất
float x, fx;
printf(“\nNhap x: “); scanf(“%f”,&x); if (đ/k_1)
if (đ/k_1)
if(x < 3)
fx = x*x+pow(sin(2*M_PI*x),4)+1; if (đ/k_2) { if (đ/k_2)
else
if (x==3) lệnh_1; lệnh_1;
fx = 5; }
else
else
fx = sqrt(x-3) +log10(x*x-3); lệnh_2; else
printf(“\n Ket quả: %.4f“,fx);
}
lệnh_2;
153 154
153 154
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
Cấu trúc if / if… else lồng nhau →Ví dụ Cấu trúc lựa chọn switch
int a, b, c = 10;
switch (bieu_thuc)
if (a==0) a ≠ 0, b=? → c = 10 {
if (b == 0)
c = 20; a=0, b=0 →c = 20 case gia_tri_1: lenh_1; [break];
else case gia_tri_2: lenh_2; [break];
c = 30; a=0, b ≠ 0 →c = 30
…
if (a==0){ a ≠ 0, b=? → c = 30 [default: lenh_n+1; [break];]
if (b == 0)
c = 20; a=0, b=0 →c = 20 }
}else Câu_lệnh_tiếp
c = 30; a=0, b ≠ 0 → c = 10
155 156
155 156
39
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
Cấu trúc lựa chọn switch Cấu trúc lựa chọn switch
Tính g/trị
Biểu thức Cơ chế hoạt động
Sai Sai Sai • Tính giá trị của biểu_thức,
g/trị b/t=G/trị 1 g/trị b/t=G/trị 2 default ?
Câu_lệnh_tiếp
157 158
157 158
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
Cấu trúc lựa chọn switch→cơ chế hoạt động Cấu trúc lựa chọn switch→cơ chế hoạt động
• Tồn tại giá_trị_i bằng giá trị biểu thức. • Không tồn tại giá_trị_i (i = 1, 2, …n) nào
• Thực hiện lệnh_i bằng giá trị biểu thức
• Nếu tồn tại lệnh break, • Nếu có nhãn default:
• Nhảy tới tiếp tục thực hiện Câu_lệnh_tiếp nằm
• Chương trình sẽ thực hiện lệnh_n+1
sau cấu trúc switch
• Thực hiện Câu_lệnh_tiếp nằm ngay sau cấu trúc
• Nếu không tồn tại lệnh break switch.
• Thực hiện các lệnh sau lệnh_i cho tới khi gặp
• Nếu không có nhãn default:
break hoặc tới khi thoát khỏi cấu trúc switch
• Chương trình chuyển sang thực hiện lệnh tiếp theo
• Thực hiện Câu_lệnh_tiếp
nằm ngay sau cấu trúc switch: Câu_Lệnh_tiếp
159 160
159 160
40
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
Cấu trúc lựa chọn switch→Ví dụ 1 Cấu trúc lựa chọn switch→Ví dụ 1
#include <stdio.h>
void main(){
Lập trình đọc từ bàn phím một số int N;
printf(“\nNhap mot gia tri so nguyen khong am: “); scanf(“%d”,&N);
nguyên 1N 10 và đưa ra từ tiếng switch(N) {
case 1: printf(“ %d -> One \n”,N); break;
Anh tương ứng case 2: printf(“%d -> Two \n”,N); break;
case 3: printf(“%d -> Three \n”,N); break;
case 4: printf(“%d -> Four \n”,N); break;
case 5: printf(“%d -> Five \n”,N); break;
case 6: printf(“%d -> Six \n”,N); break;
case 7: printf(“%d -> Seven \n”,N); break;
case 8: printf(“%d -> Eight \n”,N); break;
case 9: printf(“%d -> Nine \n”,N); break;
case 10: printf(“%d -> Ten \n”,N); break;
default : printf(“Khong thoa man dieu kien [1..10] \n”);
}
161 } 162
161 162
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
Cấu trúc lựa chọn switch→ Thực hiện Cấu trúc lựa chọn switch→Ví dụ 2
163 164
163 164
41
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
Cấu trúc lựa chọn switch→Ví dụ 2 Cấu trúc lựa chọn switch →Thực hiện
#include <conio.h>
#include <stdio.h>
void main(){
int a;
printf(“\nNhap mot gia tri so nguyen khong am: “); scanf(“%d”,&a);
switch(a % 7) {
case 0: printf(“ Chu nhat”); break;
case 1: printf(“ Thu Hai”); break;
case 2: printf(“ Thu Ba”); break;
case 3: printf(“ Thu Tu”); break;
case 4: printf(“ Thu Nam”); break;
case 5: printf(“ Thu Sau”); break;
case 6: printf(“ Thu Bay”); break;
}
getch();
}
165 166
165 166
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
Cấu trúc lựa chọn switch Cấu trúc lựa chọn switch→ Ví dụ
Có thể sử dụng đặc điểm Không có lệnh #include <conio.h>
#include <stdio.h>
break chương trình sẽ tự động chuyển void main () {
xuống thực hiên các câu lệnh tiếp sau để int thang; clrscr();
viết chung mã lệnh cho các trường hợp printf("\nNhap vao thang trong nam "); sanf("%d",&thang);
switch(thang) {
khác nhau nhưng được xử lý như nhau case 1:
case 3:
Ví dụ:Trong một năm các tháng có 30 ngày là 4, 6, case 5:
9, 11 còn các tháng có 31 ngày là 1, 3, 5, 7, 8, 10, case 7:
12. Riêng tháng hai có thể có 28 hoặc 29 ngày. case 8:
Hãy viết chương trình nhập vào 1 tháng, sau đó case 10:
case 12: printf("\n Thang %d co 31 ngay ",thang);
đưa ra kết luận tháng đó có bao nhiêu ngày
break;
167 168
167 168
42
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
Cấu trúc lựa chọn switch Cấu trúc lựa chọn switch→Lưu ý
case 4:
case 6:
• Giá trị của biểu thức trong cấu trúc
case 9: switch phải là số nguyên (kiểu đếm được)
case 11: printf("\n Thang %d co 30 ngay ",thang); – Phải có kiểu dữ liệu là char, int, long
break;
case 2: printf ("\ Thang 2 co 28 hoac 29 ngay"); • Các giá trị sau từ khóa case (gia_tri_1,
break; gia_tri_2,.. ) cũng phải là số nguyên
default : printf("\n Khong co thang %d", thang);
break;
} Điều kiện trong cấu trúc if / if..else cho phép
getch(); làm việc với các kiểu dữ liệu khác số
}
nguyên
169 170
169 170
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
171 172
43
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
173 174
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
175 176
44
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.2 Cấu trúc rẽ nhánh 4.2 Cấu trúc rẽ nhánh
177 178
179 180
45
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
for •
for([b.thuc_1];[b.thuc_2];[b.thuc_3]) Lệnh;
b.thuc_1: Khởi tạo giá trị ban đầu cho vòng lặp
• b.thuc_2: Điều kiện tiếp tục vòng lặp
• b.thuc_3: Thay đổi biến điều khiển của vòng lặp
• Lệnh: Có thể là lệnh đơn lệnh kép hoặc lệnh rỗng
181 182
181 182
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
Sơ đồ cú pháp Sử dụng
int i;
for(i = 0; i < 100; i++) Câu_lệnh;
int i;
for(i = 0; i < 100; i+=2)Câu_lệnh;
int i;
for(i = 100; i > 0; i--) Câu_lệnh;
183 184
46
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
Ví dụ 1 : Đưa ra các số nguyên lẻ nhỏ hơn 100 Ví dụ 2 : Đưa ra các số nguyên lẻ nhỏ hơn 100
1. #include <stdio.h> 1. #include <stdio.h>
2. #include <conio.h> 2. #include <conio.h>
3. void main(){ 3. void main(){
4. int i; 4. int i;
5. for(i = 1;i<100;i++) { 5. for(i = 99;i > 0;i-=2) {
6. if(i%2 == 1) printf(“%5d”,i); 6. printf(“%5d”,i);
7. if((i+1)%20 ==0) printf(“\n”); 7. if( (i-1) % 20 == 0) printf(“\n”);
8. } 8. }
9. getch(); 9. getch();
10. } 10. }
185 186
185 186
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
187 188
47
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
Ví dụ 5→ Tìm số 3 chữ số thỏa mãn abc=a3+b3+c3 Ví dụ 5→ Tìm số 3 chữ số thỏa mãn abc=a3+b3+c3
#include <stdio.h> #include <stdio.h>
#include <conio.h> #include <conio.h>
void main()
void main()
{int i, a, b, c;
for(i = 100;i<1000;i++){
{ int a, b, c;
a = i / 100; 153 for(a = 1;a<=9;a++)
b = i % 100 / 10; 370 for(b = 0;b<=9;b++)
c = i % 100 % 10; for(c = 0;c<=9;c++)
371
if(a*a*a+b*b*b+c*c*c == i) if(a*a*a+b*b*b+c*c*c==100*a+10*b+c)
printf(“%d \n”,i);
407
printf(“%d \n”,100*a+10*b+c);
}//for
getch();
getch();
} 189
} 190
189 190
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
Chú ý Chú ý
1. Biểu thức khởi tạo
Không nhất thiết phải có đầy đủ các Hello world
char c; int i=0;
thành phần trong vòng lặp for for( ; (c=getchar())! = '\n’ ; i++)
Hello world
So ky tu: 11
putchar(c);
printf(“\nSo ky tu: %d”,i);
int getchar(): đọc ký tự từ vùng đệm bàn 2. Biểu thức điều khiển
phím. Nếu vùng đệm rỗng, đợi người dùng for(i=0 ; ; c=getchar(), i++) Hello world
gõ dãy ký tự (cho tới khi ấn phím Enter), sẽ if(c==‘\n’) break;
So ky tu: 12
trả về ký tự đầu printf(“\nSo ky tu: %d”,i);
3. Thân vòng lặp
putchar(int c): đưa ký tự ra màn hình for(i=0 ; getchar() != ‘\n’, i++); Hello world
191
printf(“\nSo ky tu: %d”,i); So ky tu: 11
192
191 192
48
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
193 194
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
195 196
195 196
49
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
Tìm số nguyên lớn nhất thỏa mãn 3n5-317n <5 Cho biết kết quả thực hiện chương trình
#include <stdio.h> #include <stdio.h>
#include <conio.h>
#include <conio.h>
void main()
#include <math.h> {
void main() n = 10 clrscr();
{ while (3*pow(n,5)-317*n >= 5) int i=3;
clrscr(); n--; while (i > 1){
int n=0; if(i % 2==0) i = i / 2;
while (3* pow(n,5) - 317*n < 5) n++; else i = i * 3 + 1;
printf("%4d",i);
printf("%4d",n-1);
}
getch(); getch(); 10 5 16 8 4 2 1
} n= 3 }
197 198
197 198
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
199 200
50
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
201 202
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
203 204
51
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
Dùng vòng lặp while Dùng vòng lặp while → Kết quả
#include <stdio.h>
void main(){
float diem; clrscr();
printf(“Chuong trinh nhap diem sinh vien\n");
printf("Nhap diem (0<=diem<=10):"); scanf("%f",&diem);
while (diem < 0 || diem > 10) {
printf("\nBan nhap khong dung!\n");
printf("Ban hay nhap lai (0<=diem<=10):");
scanf("%f",&diem);
}
printf("\nDiem ban vua nhap la: %.2f“, diem);
}
205 206
205 206
207 208
52
Nhập số và phân tích số nguyên ra thừa số nguyên tố
1. #include <stdio.h>
2. #include <conio.h>
3. #include <ctype.h>
4. void main(){
5. int N, i;
6. do{ printf("\n\nNhap vao so nguyen duong "); scanf("%d",&N);
7. printf("%d = ",N);
8. i = 2;
9. while (i < N ){
10. if (N % i == 0){
11. printf("%d x ",i);
12. N = N/i;
13. } else i++;
14. }
15. printf("%d \n",N);
16. printf("Tiep tuc <C/K>?"); fflush(stdin);
17. }while(toupper(getche()) != 'K');
18. }
209 210
209 210
Ví dụ
Viết chương trình thực hiện công việc
- Nhập vào từ bàn phím 2 số nguyên
- Nhập vào từ bàn phím một ký tự bất kỳ;
▪ Nếu đây là một toán tử số học thì đưa ra
giá trị tương ứng với toán tử.
▪ Nếu không phải thì đưa ra thông báo sai
- Chương trình thực hiện cho tới khi ký tự
nhập vào là ‘q’ hoặc ‘Q’
211 212
211 212
53
#include <stdio.h> case '%': if (b==0) printf(" Chia cho 0\n");
#include <conio.h> else printf(" Co ket qua: %d\n",a%b);
void main() { break;
int a, b; case '/': if (b==0) printf(" Chia cho 0\n");
char ch; else printf(" Co ket qua: %d\n",a/b);
int Fin = 0; break;
clrscr(); case 'q':
printf("Nhap cac so a, b "); scanf("%d%d",&a,&b); case 'Q': Fin=1; break;
do{ default: printf(" khong co toan tu nay\n");
printf("\nToan tu (+ ; - ; * ; / ; %) "); ch=getche(); }
switch(ch){ }while(Fin==0);
case '+': printf(" Co ket qua: %d\n",a+b); break; printf("\nKet thuc, an mot phim...");
case '-': printf(" Co ket qua: %d\n",a-b); break; getch();
case '*': printf(" Co ket qua: %d\n",a*b); break; }
213 214
213 214
215 216
54
Chương 4: Cấu trúc điều khiển
Nhập chuỗi ký tự cho đến khi gặp ký tự ’*’ 4.4 Các lệnh thay đổi cấu trúc lập trình
Tính tần suất xuất hiện nguyên âm ‘a’ Ví dụ: Nhập một số nguyên, kiểm tra là số nguyên tố không?
1. #include <stdio.h> #includ <stdio.h>
2. #include <conio.h> #include <math.h>
3. #include <ctype.h> void main()
4. void main(){ { int N, i, OK = 1;
5. char c; int n, d; printf("\nNhap gia tri N : "); scanf("%d", &N);
6. do{ if (n<2) printf("\nSo %d khong phai so nguyen to",N);
7. printf("\n\n");
else {
8. d=0; n=0;
for
for (i=2;
(i=2; i < N;
i<=(int)sqrt(N); i++)i++)
9. while( (c=getche()) !='*'){
10. n++; if (N%i == 0) {
11. if (c=='a') d++; OK = 0;
12. } break; i <= (int)sqrt(N)
13. if(n==0) }
14. printf("\nChuoi ky tu rong\n"); if (OK) printf("\nSo %d la so nguyen to.", N);
15. else else printf("\nSo %d la hop so.", N);
16. printf("\ntan suat xuat hien ky tu 'a' la %5.2f%%\n",(float)100*d/n); } i= 2;
17. printf("Tiep tuc <C/K>?: "); getch(); while (N % i != 0) i++;
18. }while(toupper(getche()) != 'K');
} if (i == N) printf(« so ng to »)
19. } 217 218
217 218
219 220
55
Chương 4: Cấu trúc điều khiển
Chương 4: Cấu trúc điều khiển
4.4 Các lệnh thay đổi cấu trúc lập trình
221 222
221 222
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.4 Các lệnh thay đổi cấu trúc lập trình 4.4 Các lệnh thay đổi cấu trúc lập trình
Ví dụ 1 break
#include <stdio.h>
Thoát khỏi vòng lặp ngay cả khi biểu
#include <conio.h>
void main() thức điều kiện của vòng lặp vẫn còn
Tính tổng 100 số nguyên đầu tiên
{ ngoại trừ các số chia hết cho 5 được thỏa mãn.
int i;
int sum = 0;
Chú ý:
for(i = 1;i<=100;i++) • break dùng để thoát ra khỏi khối lặp
{ hiện tại
if(i % 5 == 0) for(i=1;i<=100;i++)
continue; if (i % 5 != 0) • break cũng dùng để thoát ra khỏi
sum += i; sum += i; lệnh rẽ nhánh switch
}
}
223 224
223 224
56
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.4 Các lệnh thay đổi cấu trúc lập trình 4.4 Các lệnh thay đổi cấu trúc lập trình
Ví dụ 2 Ví dụ 3
#include <stdio.h> #include <stdio.h>
#include <conio.h>
#include <conio.h>
void main() {
int n; void main()
do { {
printf(" \nEnter the number :"); scanf("%d", &n); int i;
if (n < 0) { for(i = 1;i<=10;i++)
break; {
}
if(i == 5) continue;
if (n >10) {
printf("Skip the value\n"); printf(“%5d”,i);
continue; if(i==7) break;
} }
printf("The number is: %d", n); getch();
} while (n!= 0); }
} 225 226
225 226
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.4 Các lệnh thay đổi cấu trúc lập trình 4.4 Các lệnh thay đổi cấu trúc lập trình
Ví dụ 4 Ví dụ tổng hợp
#include <stdio.h>
#include <conio.h> Viết chương trình thực hiện các công việc
void main() sau
{ int i,j;
clrscr(); • Nhập vào một dãy số cho tới khi
for(i = 0;i<10;i++) { – Tổng của dãy lớn hơn 1550 hoặc là
for (j=0; j < 10; j ++) { – Số phần tử trong dãy lớn hơn 100
if(j > i){
break; • Đưa ra số lượng phần tử nằm trong
}//if khoảng (35, 70)
}//for _ j
printf("i:%d j:%d\n",i,j); • Đưa ra trung bình cộng của các phần tử
}//for_i chia hết cho 7
getch();
}
227 228
227 228
57
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.4 Các lệnh thay đổi cấu trúc lập trình 4.4 Các lệnh thay đổi cấu trúc lập trình
Nhập một dãy số cho tới khi số phần tử trong dãy lớn hơn 100 Nhập một dãy số cho tới khi tổng của dãy lớn hơn 1550
Bắt đầu
#include <stdio.h> Bắt đầu #include <stdio.h>
void main(){ i0
void main(){
i0
int a, i; S0 int a, S;
Nhập số a i = 0; Nhập số a
S = 0;
do{ do{
i i+1
printf("Nhap vao so nguyen:"); S S+a printf("Nhap vao so nguyen:");
s i > 100
scanf("%d",&a); scanf("%d",&a);
s S > 1550
đ
i++; S+=a;
}while (i <= 100); đ }while (S <= 1550);
Kết thúc
Kết thúc
} }
229 230
229 230
231 232
58
Chương 4: Cấu trúc điều khiển
Đưa ra TBC của các phần tử chia hết cho 7(2) 4.4 Các lệnh thay đổi cấu trúc lập trình
đ
if(d7==0) if( (a>35) && (a < 70) ) d++; đ
printf(“Khong
TBC là: co
S7/d7so chia
s het cho
d7=0 7); báo: Không
đ Thông Thông bao: số p/tử trong khoảng (35,70) là d
}while ( (i <=100)&&(S <= 1550) );
có số chia hết cho 7
else printf(“So phanTBCtulà:trong
S7/d7
skhoang (35,70)
d7=0
đ Thông báo:laKhông
%d \n”,d);
có số chia hết cho 7
printf(“Ket qua la %.4f“,(float) S7/d7); if(d7==0) printf(“Khong co so chia het cho 7”);
} Kết thúc else printf(“TBC cac so chia het cho 7 %.4f“,(float) S7/d7);
Kết thúc
233 } 234
233 234
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
235 236
59
Chương 4: Cấu trúc điều khiển Chương 4: Cấu trúc điều khiển
4.3 Cấu trúc lặp 4.3 Cấu trúc lặp
Đọc dãy số tới khi gặp số 0, tìm và đếm số max Bài tập
1. #include <stdio.h>
2. #include <limits.h> Viết chương trình đọc x và n vào từ bàn phím rồi tính
3. void main(){
4. int a, d=0, max = INT_MIN; S = x + x + x + + x n dâ' u c ăn
5. do { x 2 x3 xn
6. printf("Nhap mot so : "); scanf("%d",&a); S = 1+ x + + ++
7. if( a > max){ 2 3 n
8. max = a; x 2 x3 xn
9. d = 1;
S = 1+ x + + ++
2! 3! n!
10. }else
x 2 x3 (−1) n x n
11. if (a == max) d++; S = 1− x + − ++
12. }while ( a < 0 || a%5 !=0); 2! 3! n!
13. printf(“Max: %d; Co %d gia tri",max,d);
14. }
237 238
237 238
239 240
60
Nhập x và và tính với độ chính xác nhỏ hơn Chương 4: Cấu trúc điều khiển
2
x x3
(−1) x
n n Tổng kết
S = 1− x + − ++ +
2! 3! n! 1. Câu lệnh khối
Đặt trong cặp ngoặc nhọn { }
2. Cấu trúc rẽ nhánh
– if (bieu_thuc), if (bieu_thuc) … else
– switch (bieu_thuc) {(case/break/default)}
3. Cấu trúc lặp
– for(bieu_thuc_1; bieu_thuc_2; bieu_thuc_3) CauLenh;
– while (bieu_thuc) CauLenh;
– do Cau_Lenh while (bieu_thuc);
4. Các lệnh thay đổi cấu trúc lập trình
– continue/ break
241 242
241 242
243 244
61
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
245 246
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
247 248
62
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
Cấp phát bộ nhớ cho mảng Truy nhập đến thành phần của mảng
• Các phần tử trong mảng được cấp phát các • Biến mảng lưu trữ địa chỉ ô nhớ đầu tiên
ô nhớ kế tiếp nhau trong bộ nhớ trong vùng nhớ được cấp phát
• Kích thước của mảng bằng kích thước một • Ngôn ngữ C đánh chỉ số các phần tử trong
phần tử nhân với số phần tử mảng bắt đầu từ 0
Ví dụ: • Các phần tử của mảng được truy nhập
int A[10];//Mảng A gồm 10 phần tử nguyên thông qua
– Tên mảng và
A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9]
– Chỉ số của phần tử của phần tử trong mảng
Kích thước của mảng A: 10 x 2 = 20 bytes
Tên_Mang[Chỉ_số_phần_tử];
249 250
249 250
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
251
A[5] B[2] C[-2] nếu c/cấp liên tiếp 252
251 252
63
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
253 254
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
255 256
64
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
Khởi tạo giá trị cho mảng → Chú ý Các thao tác thường gặp
• Số lượng giá trị khởi tạo không được lớn • Nhập/Xuất dữ liệu cho mảng
hơn số lượng phần tử trong mảng – Mảng 1 chiều, ma trận
– Nếu số lượng này nhỏ hơn, các phần tử còn lại • Bài toán đếm
được khởi tạo giá trị 0
– Đếm số phần tử
int A[3][4] = { {1}, {4,5} };
– Tính toán trên các phần tử..
int A[3][4] = { };Tất cả đều mang giá trị 0
• Tìm kiếm phần tử
• Có thể xác định kích thước mảng thông qua
số giá trị khởi tạo nếu để trống kích thước – Lớn nhất/nhỏ nhất/bất kỳ
mảng • Sắp xếp phần tử trong mảng
int A1 [8] = {2, 4, 6, 8, 10, 12, 14, 16}; – Theo thứ tự, theo nguyên tắc
int A2 [] = {2, 4, 6, 8, 10, 12, 14, 16}; • Chèn thêm phần tử, xóa phần tử
257 258
257 258
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
259 260
65
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
261 262
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
263 264
66
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
Xuất dữ liệu trong mảng→Ví dụ 1→Thực hiện Ví dụ 2: Nhập và đưa ra màn hình một ma trận
1. #include <stdio.h>
2. void main(){
3. int A[20][20], n, m, i,j;
4. printf("Nhap so hang : "); scanf("%d",&n);
5. printf("Nhap so cot : "); scanf("%d",&m);
6. printf("\n");
7. for ( i=0; i < n; i++ )
8. for(j=0; j < m; j++) {
9. printf("Nhap phan tu A[%d,%d]: ", i+1,j+1);
10. scanf("%d", &A[i][j] );
11. }
12. printf("\n\n MA TRAN DA NHAP \n\n");
13. for ( i=0; i < n; i++ ){
14. for(j=0; j < m; j++)
15. printf( "%4d" ,A[i][j]);
16. printf("\n");
17. }
265 18. } 266
265 266
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
Ví dụ 2→Kết quả thực hiện Đếm số phần tử thỏa mãn điều kiện
• Duyệt từng phần tử của dãy (dùng for )
• Nếu phần tử xét thỏa mãn điều kiện
– Ghi nhận
• Chuyển sang xem xét phần tử tiếp theo
Ví dụ: Đếm số tháng có lượng mưa lớn hơn 50mm
int dem = 0;
for(i = 0; i < MONTHS; i++)
if(rainfall[i] > 50)
dem++;
printf("\nThang mua nhieu hon 50mm: %d", dem);
267 268
267 268
67
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
Ví dụ: Nhập mảng, đưa ra TBC các số chia hết cho 7 Tìm kiếm phần tử
#include<stdio.h>
void main(){
Tìm phần tử lớn nhất (nhỏ nhất)
int A[100]; – Giả sử phần tử đó là phần tử đầu tiên
int n, i, d = 0, S=0;
– Lần lượt so sánh với các phần tử còn lại
printf(“\n So phan tu cua mang (<100) : “); scanf(“%d”,&n);
for(i = 0; i < n; i++){ • Nếu phần tử mới của dãy lớn hơn coi đây là phần
printf("A[%d] = ", i); scanf("%d",&A[i]); tử lớn nhất và tiếp tục so sánh với phần tử kế
} • Nếu không đúng, so sánh tiếp với phần tử kế
for(i = 0; i < n; i++)
Ví dụ: Tìm tháng có lượng mưa nhiều nhất trong năm
if(A[i] %7==0){
d++; max = rainfall[0];
S+= A[i]; for(i = 1; i < MONTHS; i++)
} if(rainfall[i] > max)
if(d > 0) printf(”TBC so chia het cho 7: %7.2f”,(float)S/d); max = rainfall[i];
else printf(”Trong day khong co so chia het cho 7”); printf("\n Luong mua nhieu nhat la: %d", max);
} 269 270
269 270
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
271 272
68
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
273 274
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
275 276
69
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
Bài toán sắp xếp tăng →Thuật toán lựa chọn Bài toán sắp xếp tăng →Thuật toán lựa chọn
Nguyên tắc
Tại lượt sắp thứ k, tìm phần tử nhỏ nhất trong số Dãy Lượt 1 Lượt 2 Lượt 3 Lượt 4
các phần tử chưa được sắp xếp ([k..last]) và đổi
chỗ cho phần tử thứ k (có chỉ số k-1) 3 3
2
1 1 1 1 1
– Khi k = 1, phần tử thứ nhất (chỉ số 0) đúng vị trí
– Khi k= 2, phần tử thứ hai (chỉ số 1) đúng vị trí… 5 5 3
2
5 2 2 2
2 2
3 5
3 5
3 3 3
6 6 6 6 6
5 5
1 1
2 3
2 3
5 5
6 6
277 278
277 278
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
279 280
70
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
Ví dụ Ví dụ
1. #include<stdio.h> 14. printf("Sap xep day theo thuat toan lua chon");
2. void main(){ 15. for(i=0; i < N-1; i++){
3. int A[100] ; 16. for(j=i+1; j < N; j++)
4. int N, i, j , t; 17. if(A[i] < A[j]) {
5. printf("So phan tu [< 100]: "); scanf("%d",&N); 18. t = A[i];
6. printf("Hay nhap day so...\n"); 19. A[i] = A[j];
7. for(i=0; i < N; i++){ 20. A[j] = t;
8. printf("A[%d] = ",i+1); scanf("%d",&A[i]); 21. }//if & for_j
9. } 22. printf("\nLuot %d : ",i+1);
10. printf("\nDay vua nhap...\n"); 23. for(j=0; j < N; j++)
11. for(i=0; i < N; i++) 24. printf("%4d", A[j]);
12. printf("%4d", A[i]); 25. }//for_i
13. printf("\n\n"); 26. }//main
281 282
281 282
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
283 284
71
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
285 286
285 286
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
Bài chữa Bài chữa → Sắp xếp số chẵn chia hết 3 lên đầu dãy..
#include<stdio.h> 1. { int d = 0, t;
void main(){ 2. for(i=0;i < N; i++)
int A[100];
3. if(A[i]%6==0){
int N, i;
//Nhập dữ liệu
4. t=A[i]; A[i]=A[d]; A[d] = t;
printf("So phan tu : "); scanf("%d",&N); 5. d++;
for(i=0; i < N; i ++){ 6. }
printf("A[%d] = ",i);scanf("%d",&A[i]); 7. for(i=d; i < N; i++)
} 8. if(A[i]%3 != 0){
//Các thao tác xử lý mảng: chèn, xóa, sắp xếp,…
9. t=A[i]; A[i]=A[d]; A[d] = t;
//Đưa Dữ liệu ra
for(i=0; i < N; i ++) 10. d++;
printf("%4d",A[i]); 11. }
} 12. }
287 288
287 288
72
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
Bài chữa → Sắp xếp tăng dần và chèn đúng vị trí Bài chữa → Xóa các phần tử chia hết cho 5..
1. { int k = 0,i, j, t;
2. for(i=0;i < N - 1; i++)//Sắp xếp lựa chọn
1. { // PP: Giữ lại các phần tử không chia hết cho 5
3. for(j=i+1;j < N ; j++) 2. int d = 0, i;
4. if(A[i] > A[j]){ 3. for(i=0;i < N; i++)
5. t = A[j]; A[j] = A[i]; A[i]=t;
6. } 4. if(A[i] % 5 != 0){
7. printf("Phan tu moi:"); scanf("%d",&k);//Nhập p/tử mới 5. A[d] = A[i];
8. i = N; //Chèn đúng vị trí 6. d++;
9. while( (i > 0) &&(A[i-1] > k) ){
10. A[i] = A[i-1]; 7. }
11. i--; 8. N = d;
12. }
13. A[i] = k;
9. }
14. N++;
15. }
289 290
289 290
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
Xóa các phần tử chia hết cho 5 →Kết quả Bài tập 3 : Ma trận
1. Viết chương trình nhập vào một ma trận vuông,
các phần tử nguyên, sau đó
• Đưa ra ma trận tam giác duới
• Đưa ra ma trận tam giác trên
2. Nhập M, N (M, N < 30) và một ma trận MxN.
Đưa ma trận ra màn hình
• Tìm hàng/cột có tổng các phần tử lớn nhất
• Tìm số lớn nhất/nhỏ nhất và vị trí trong ma trận
• Đưa ra ma trận S cùng kích thước thỏa mãn
1 nê'u ui , j 0
si , j = 0 nê'u ui , j = 0
− 1 nê'u ui , j 0
291 292
291 292
73
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.1 Mảng 5.1 Mảng
Nhập vào một ma trận vuông,.. Đưa ra ma trân tam giác trên, dưới
#include <stdio.h> printf("\n\n MA TRAN TAM GIAC TREN \n\n");
void main(){ for ( i=0; i < N; i++ ){
int A[20][20], N,i,j; for(j=0; j < N; j++)
printf("Nhap kich thuoc : "); scanf("%d",&N); if(j >= i)
printf("\n"); printf( "%4d" ,A[i][j]);
for ( i=0; i < N; i++ ) else
for(j=0; j < N; j++) { printf("%4c",32); //32 là mã ASCII của dấu cách
printf("Nhap phan tu [%d,%d]:", i+1,j+1); printf("\n");
scanf("%d", &A[i][j] ); }
} printf("\n\n MA TRAN TAM GIAC DUOI \n\n");
printf("\n\n MA TRAN DA NHAP \n\n"); for ( i=0; i < N; i++ ){
for ( i=0; i < N; i++ ){ for(j=0; j <= i; j++)
for(j=0; j < N; j++) printf( "%4d" ,A[i][j]);
printf( "%4d" ,A[i][j]); printf("\n");
printf("\n"); }
} 293 }//main 294
293 294
295 296
74
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ 5.2 Con trỏ
297 298
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ 5.2 Con trỏ
299 300
75
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ 5.2 Con trỏ
301 302
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ 5.2 Con trỏ
Toán tử nội dung (*) Gán giá trị cho con trỏ
• Ký hiệu: *
0000
• Con trỏ được gán địa chỉ của một biến
• Là toán tử một ngôi, trả về giá – Biến cùng kiểu với kiểu mà con trỏ trỏ tới
Biến N
trị (nội dung) của vùng nhớ mà ABCD
• Nếu không, cần phải ép kiểu
20
10
con trỏ đang trỏ tới • Con trỏ được gán giá trị của con trỏ khác
Ví dụ – Hai con trỏ sẽ trỏ tới cùng một biến(do cùng địa chỉ)
int N; – Hai con trỏ nên cùng kiểu trỏ đến
int * pi; • Nếu không, phải ép kiểu
pi = &N; N= 10; *pi = 10; ABCD EFCD • Con trỏ được gán giá trị NULL
N = 10;//Vùng nhớ mà pi trỏ tới
mang giá trị 10; Vậy *pi=10
Con trỏ pi Ví dụ: int *p; p = 0;
*pi = 20;// Vùng nhớ pi trỏ tới được FFFF • Gán nội dung vùng nhớ 2 con trỏ trỏ tới.
gán giá trị 20; Vậy N= 20 Bộ nhớ
Ví dụ: int *p1, *p2; *p1 = *p2;
303 304
303 304
76
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ 5.2 Con trỏ
Ví dụ Ví dụ→Trường hợp 1
#include <stdio.h> #include <stdio.h> 0000
1. #include <stdio.h>
void main(){ void main(){
2. void main(){
int N=5, M=10; int N=5, M=10; 10
5 ABCD
3. int N=5, M=10;
int *p1 = &N; int *p1 = &N; 10 ABCF
4. int *p1 = &N;
int *p2 = &M; int *p2 = &M;
5. int *p2 = &M;
p2 p1
*p1 = *p2; p1 = p2; ABCF
6. *p1 = *p2;
printf("%d %d",*p1,*p2); printf("%d %d",*p1,*p2); ABCD
7. printf("%d %d",*p1,*p2);
} }
8. }
10 10 10 10
FFFF
Bộ nhớ
305 306
305 306
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ 5.2 Con trỏ
6. p1 = p2; ABCF
– Kết quả: Một số nguyên
7. printf("%d %d",*p1,*p2); ABCD
ABCF
• Khoảng cách giữa 2 con trỏ được đo bằng số phần tử
8. } thuộc kiểu dữ liệu mà con trỏ trỏ tới
FFFF
Bộ nhớ
307 308
307 308
77
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ 5.2 Con trỏ
Các phép toán trên con trỏ→Ví dụ Mối quan hệ giữa con trỏ và mảng một chiều
309 310
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ 5.2 Con trỏ
311 312
78
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.2 Con trỏ 5.2 Con trỏ
#include<stdio.h> #include<stdio.h>
int main() 30 int main(){
{ int arr[2][2][2] = {10, 2, 3, 4, 5, 6, 7, 8};
int a=3, *p; int *p, *q;
p = &a; p = &arr[1][1][1];
q = (int *) arr;
printf("%d\n", a * *p * a + *p); 8, 5
printf("%d, %d\n", *p, *(q+4) );
return 0;
return 0;
}
}
313 314
313 314
315 316
79
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
317 318
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
Truy nhập phần tử của xâu Ví dụ: Nhập xâu và đếm số ký tự ‘*’
Giống như truy nhập tới một phần tử của #include <stdio.h> Tính chiều dài của xâu
mảng ký tự void main(){ d=0;
char Str[100]; while(Str[d] != '\0') d++;
tên_xâu [chỉ_số_của_kí_tự] int d=0, i=0;
Ví dụ: char Str[10] = “Tin hoc”; printf("Nhap xau ky tu: "); gets(Str);
while(Str[i] != '\0'){
T i n - h o 1 \0
c \0 ? ? if(Str[i]=='*')
d++;
Str[0] → ‘T’ Str[3] = ‘-’; i++;
Str[3] → ‘ ’ Str[7] = ‘ ’; }
Str[7] → ‘\0 ‘ Str[8] = ‘1 ‘ ; printf("Ket qua : %d",d);
Str[8] → ? Str[9] = ‘\0’; Str: Tin-hoc 1 }
319 320
319 320
80
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
321 322
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
Các hàm xử lý ký tự→Chuyển đổi chữ hoa/thường Các hàm xử lý ký tự →Kiểm tra chữ hoa/thường
• int toupper(char ch):
• int islower(char ch)
– Chuyển kí tự thường thành kí tự hoa
toupper(‘a’) => ‘A’ – Kiểm tra chữ thường:
• int tolower(char ch) • Hàm trả về giá trị khác 0 nếu ch là chữ
thường, ngược lại trả về 0
– Chuyển kí tự hoa thành kí tự thường
• Ví dụ: printf("%d ",islower('A')); 0
tolower(‘B’) => ‘b’
• int isupper(char ch):
Ví dụ
do{
– Kiểm tra chữ hoa:
………. • Hàm trả về giá trị khác 0 nếu ch là chữ hoa,
ngược lại trả về 0
printf(“Tiep tuc <C/K>? :”); fflush(stdin);
}while(toupper(getche()) !='K'); • Ví dụ: printf("%d ",isupper('A')); ≠ 0 (1 !?)
323 324
323 324
81
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
Các hàm xử lý ký tự →Kiểm tra chữ cái/chữ số Khái niệm xâu ký tự→Kiểm tra ký tự đặc biệt
• int isalpha(char ch): • int iscntrl(char ch)
– Kiểm tra kí tự trong tham số có phải chữ cái – Kiểm tra kí tự điều khiển (0-31).
không (‘a’…’z’,’A’,..’Z’). Hàm trả về khác 0 nếu – Hàm trả về khác 0 nếu đúng, ngược lại trả về
đúng, ngược lại trả về giá trị bằng 0 giá trị bằng 0
– Ví dụ: printf("%d ",isalpha('A')); ≠ 0 (1 !?)
• int isspace(char ch)
• int isdigit(char ch):
– Kiểm tra kí tự dấu cách (mã 32), xuống dòng
– Kiểm tra kí tự trong tham số có phải chữ số
(‘\n’ 10), đầu dòng (‘\r’ 13), tab ngang (‘\t’ 9), tab
(‘0‘,‘1‘,..‘9‘) không. Hàm trả về khác 0 nếu đúng,
dọc (‘\v’ 11).
ngược lại trả về giá trị bằng 0
– Ví dụ: printf("%d ",isdigit('A')); 0 – Hàm trả về khác 0 nếu đúng, ngược lại trả về
giá trị bằng 0
325 326
325 326
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
Ví dụ: Nhập xâu, chuyển thành xâu chữ hoa Ví dụ: Nhập xâu và đếm từ, phân cách bởi dấu trắng
1. #include <stdio.h> #include <stdio.h>
2. #include <ctype.h> #include <conio.h>
#include <ctype.h>
3. void main(){ int main(){
4. int i =0; char Str[100]; int d=0, i=0;
5. char S[50]; printf("Nhap xau ky tu: "); gets(Str);
if(Str[0] == '\0') printf(“ Xau rong ");
6. printf("Nhap mot xau: "); gets(S); else{
7. printf("\n\nXau ban dau : %s. ",S); if( ! isspace(Str[0]) ) d=1;
8. while(S[i] != '\0'){ i=1;
while(Str[i] != '\0'){
9. S[i] = toupper(S[i]);
if( isspace(Str[i-1] ) && (! isspace(Str[i])) ) d++;
10. i = i + 1; i++;
11. } }
printf("Ket qua : %d",d);
12. printf("Xau ket qua : %s",S);
}
13. } }
327 328
327 328
82
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
329 330
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
331 332
83
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
333 334
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
Các hàm xử lý xâu ký tự (tiếp) Ví dụ 1: Nhập 2 xâu cho biết số lần xuất hiện xâu 1 trong xâu 2
1. #include <stdio.h>
Tệp tiêu đề: stdlib.h 2. #include <string.h>
• int atoi(char * str): 3. void main(){
– Chuyển một xâu kí tự thành một số nguyên 4. int d =0;
tương ứng 5. char S1[50],S2[20], *p;
– Ví dụ: atoi(“1234”) →1234 6. printf("Nhap xau thu nhat: "); gets(S1);
• int atol(char * str): 7. printf("Nhap xau thu hai: "); gets(S2);
8. p = strstr(S1,S2);
– Chuyển xâu kí tự thành số long int
9. while(p !=NULL ){
• float atof(char * str): 10. d = d + 1;
– Chuyển xâu kí tự thành số thực 11. p = strstr(p+1,S2);//vi tri tim kiem ke tiep
– Ví dụ: atof(“123.456E-2”) →1.23456 12. }
13. printf("Xau \“ %s\" x/hien trong xau \"%s \“ %d lan",S2,S1,d);
• Thất bại cả 3 hàm: trả về 0 335 14. } 336
335 336
84
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
337 338
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
Ví dụ 4: Đếm số lần xuất hiện chữ cái trong xâu Mảng xâu ký tự
#include<stdio.h>
#include<ctype.h> • Xâu ký tự có thể là kiểu phần tử của mảng
#include<string.h> • Khai báo
main(){
char s[20]; char DS[100][30];
int dem[26] = {}; Mảng có tối đa 100 phần tử, các phần tử là
int i,n;
puts("Nhap vao xau ki tu:");gets(s); xâu có độ dài tối đa 30
n=strlen(s); • Sử dụng
for(i=0;i<n;i++)
if(isalpha(s[i])) – Như một mảng bình thường
dem[ tolower(s[i ]) - 'a‘ ]++; – Mỗi phần tử mảng được sử dụng như một xâu
for(i=0;i<26;i++) ký tự
if(dem[i]!=0)
printf("Ki tu %c xuat hien %d lan\n",'a'+i,dem[i]);
} 339 340
339 340
85
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
Ví dụ: Nhập vào DSSV cho tới khi gặp tên rỗng, in DS Ví dụ→Kết quả thực hiện
#include <stdio.h> for(n = 0; n <100; n++){
#include <string.h> printf("Ten sinh vien[%d]: ",n+1); gets(DS[n]);
void main(){ if(DS[n][0] ='\x0') break;
int i, n; //n++;
char DS[100][30]; }
printf("Nhap DSSV (<100), go Enter de thoat..\n");
n =0;
do{
printf("Ten sinh vien[%d]: ",n+1); gets(DS[n]);
if(DS[n][0] !='\x0') n++;
else break;
if(strcmp(DS[n],""))n++
if(n==100) break;
}while(1); if(strlen(DS[n])>0) n++
printf("\n\nDS sinh vien vua nhap \n");
for(i=0;i<n;i++) printf("%s\n",DS[i]);
341
} 341 342
341 342
Đưa ra màn hình xâu có độ dài lớn nhất Ví dụ: Nhập vào DS sinh viên, in ra DS đã sắp xếp
1. #include <stdio.h>
#include <stdio.h>
2. #include <string.h>
3. void main(){ #include <string.h>
4. int i, n = 0, d=0; void main(){
5. char DS[100][30], s[30]="";
6. do{
int i, j, N;
7. printf("Nhap xau thu [%d]: ",n+1); gets(DS[n]); char DS[100][30], str[30];
8. if( strcmp(DS[n],"***")) n= n + 1;//Không tính xâu “***” //Nhap DS sinh viên
9. else break;
10. }while(1); printf("So sinh vien : "); scanf("%d",&N);
11. for(i = 0; i < n; i++) fflush(stdin);
12. if(strlen(DS[i]) > d){
for(i=0;i < N;i++){
13. d = strlen(DS[i]);
14. strcpy(s,DS[i]); printf("Ten sinh vien[%d]: ",i);
15. } gets(DS[i]);
16. printf("\n\nXau dai nhat la: %s, co do dai :%d\n",s,d);
17. }
}
343 344
343 344
86
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
Ví dụ: Nhập vào DS sinh viên, in ra DS đã sắp xếp Ví dụ→Kết quả thực hiện
//So sánh theo Họ+đệm+tên
for(i = 0; i < N - 1; i ++)
for(j = i +1; j < N; j ++)
if(strcmp(DS[i],DS[j]) > 0){
strcpy(str,DS[i]);
strcpy(DS[i],DS[j]);
strcpy(DS[j],str);
}
//In danh sách đã sắp xếp
printf("\nDS sinh vien vua nhap \n");
for(i=0;i < N;i++)
printf("%s\n",DS[i]);
}//main
345 346
345 346
Chương 5: Mảng, con trỏ và xâu ký tự Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự 5.3 Xâu ký tự
347 348
87
Phần 3: Lập trình C
Chương 5: Mảng, con trỏ và xâu ký tự
5.3 Xâu ký tự
349 350
Nội dung chính Ví dụ → Bài toán quản lý thí sinh thi đại học
1. Khái niệm cấu trúc Để quản lý cần lưu trữ các thông tin
• Khái niệm • Số báo danh: Số nguyên không dấu
2. Khai báo cấu trúc • Họ tên sinh viên: Chuỗi ký tự không quá 30
• Khái báo kiểu cấu trúc • Khối thi: Ký tự (A,B,C..)
• Khai báo biến cấu trúc • Tổng điểm 3 môn thi: kiểu thực
• Định nghĩa kiểu dữ liệu với typedef Do vậy với mỗi sinh viên cần các biến
3. Xử lý dữ liệu cấu trúc unsigned SBD;
• Truy nhập các trường dữ liệu char Ten[30];
• Phép gán giữa các biến cấu trúc char KhoiThi;
float KetQua;
4. Một số ví dụ
351 352
351 352
88
Chương 6: Cấu trúc Chương 6: Cấu trúc
6.1 Khái niệm cấu trúc 6.1 Khái niệm cấu trúc
Ví dụ → Bài toán quản lý thí sinh thi đại học (tiếp) Ví dụ → Bài toán quản lý thí sinh thi đại học (tiếp)
DS_Ten Mảng ký tự
#define MAX 1000 Nguyễn Nguyễn Trần An
Văn An Hoàng Nghĩa
unsigned DS_SBD[MAX];
DS_KhoiThi
char DS_Ten[MAX][30]; A D A
char DS_KhoiThi[MAX];
DS_KetQua
float DS_KetQua[MAX]; 24.5 28.5 22.0
353 354
355 356
89
Chương 6: Cấu trúc
Chương 6: Cấu trúc
6.1 Khái niệm cấu trúc
357 358
Khai báo kiểu cấu trúc Khai báo kiểu cấu trúc → Ví dụ
struct Tên_kiểu_cấu_ trúc { Thẻ sinh viên struct SinhVien{
Số hiệu:…(Chuỗi ký tự)..
<Khai báo các trường dữ liệu> char SHSV[10];
Tên sinh viên: (Chuỗi ký tự) char Ten[30];
};
Năm sinh:…(Số nguyên)… int NS;
• struct: từ khóa, cho phép người dùng khai báo Khóa:……(Số nguyên)……. int Khoa;
kiểu dữ liệu mới: kiểu cấu trúc char Lop [10];
Lớp:…… :.(Chuỗi ký tự). …
• Tên_kiểu_cấu_truc: Tên của kiểu cấu trúc do };
người dùng tự định nghĩa
– Tuân theo nguyên tắc đặt tên đối tượng trong C Point2D
• Khai báo các trường dữ liệu: Danh sách các struct Point{
Hoành độ (x)…(Số thực)..
khai báo thành phần (trường:field) của cấu trúc float x, y;
– Giống khai báo biến Tung độ (y)…..(Số thực).. };
– Các trường có thể có kiểu bất kỳ 359 360
359 360
90
Chương 6: Cấu trúc Chương 6: Cấu trúc
6.2 Khai báo cấu trúc 6.2 Khai báo cấu trúc
Khai báo biến cấu trúc Khai báo biến cấu trúc → Cú pháp
Tồn tại định nghĩa kiểu cấu trúc
• Khai báo kiểu cấu trúc nhằm tạo định nghĩa
struct Kiểu_cấu_ trúc Tên_biến;
toàn thể cho các cấu trúc sẽ được dùng
Khai báo trực tiếp
sau này
struct {
– Không cung cấp không gian nhớ cho kiểu
<Khai báo các trường dữ liệu>
• Khai báo biến cấu trúc nhằm yêu cầu
}Tên_biến;
chương trình tạo vùng nhớ để lưu trữ các
dữ liệu cho biến cấu trúc Kết hợp với khai báo kiểu
– Chứa dữ liệu của các trường của cấu trúc struct Kiểu_cấu_ trúc {
<Khai báo các trường dữ liệu>
}Tên_biến;
361 362
361 362
Khai báo biến cấu trúc → Ví dụ Khai báo biến cấu trúc →Chú ý
Tồn tại định nghĩa kiểu cấu trúc
Các cấu trúc có thể được khai báo lồng nhau
struct SinhVien SV1, SV2, Thu khoa;
struct diem_thi {
Khai báo trực tiếp
float dToan, dLy, dHoa;
struct {
}
float x, y; //Tọa độ trên mặt phẳng
struct thi_sinh{
}A, B; //Khai báo 2 điểm A, B
char SBD[10];
Kết hợp với khai báo kiểu
char ho_va_ten[30];
struct Point_3D{
struct diem_thi ket_qua;
float x, y, z;// Tọa độ không gian
} thi_sinh_1, thi_sinh_2;
}A, B;
363 364
363 364
91
Chương 6: Cấu trúc Chương 6: Cấu trúc
6.2 Khai báo cấu trúc 6.2 Khai báo cấu trúc
Khai báo biến cấu trúc →Chú ý Khai báo biến cấu trúc →Chú ý
Có thể khai báo trực tiếp các trường dữ liệu Có thể gán giá trị khởi đầu cho một biến cấu
của một cấu trúc bên trong cấu trúc khác trúc, theo nguyên tắc như kiểu mảng
struct thi_sinh{ Ví dụ: struct SinhVien{
struct Date{ char Ten[20];
char SBD[10];
int day; struct Date{
char ho_va_ten[30]; int month; int day;
struct{ int year; int month;
}; int year;
float dToan, dLy, dHoa; } NS;
struct SinhVien{
} ket_qua; char Ten[30]; } SV = {“Tran Anh", 20,12,1990 };
} thi_sinh_1, thi_sinh_2; struct Date NS;
} SV = {“Tran Anh", 20, 12, 1990 };
365 366
365 366
Định nghĩa kiểu dữ liệu với typedef Định nghĩa kiểu dữ liệu với typedef
typedef <tên_cũ> <tên_mới>; Thường được kết hợp với kiểu cấu trúc để
Mục đích khai báo một bí danh cho một cấu trúc
– Giúp khai báo trở nên quen thuộc và ít bị sai hơn
• Đặt tên mới đồng nghĩa với tên của một kiểu
typedef struct { //Định nghĩa một cấu trúc
dữ liệu đã được định nghĩa
char SHSV[10];
– Thường được sử dụng cho kiểu cấu trúc
char Ten[30];
• Giúp cho khai báo trở nên quen thuộc và ít bị sai hơn
int NS;
Ví dụ int Khoa;
typedef char Str80[80] ;
char Lop [10];
typedef long mask;
} SinhVien; //Đặt tên cho cấu trúc là SinhVien
Str80 str="Bonjour tout le monde !";
mask a, b; SinhVien SV; //Tạo một biến cấu trúc
367 368
367 368
92
Chương 6: Cấu trúc Chương 6: Cấu trúc
6.2 Khai báo cấu trúc 6.2 Khai báo cấu trúc
Định nghĩa kiểu dữ liệu với typedef →Chú ý Định nghĩa kiểu dữ liệu với typedef →Chú ý
Cho phép đặt tên mới trùng với tên cũ typedef struct point_2D {
Ví dụ typedef struct { float x, y;
struct point_3D{ float x, y, z; }point_2D, diem_2_chieu, ten_bat_ki;
float x, y, z; }point_3D; point_2D X;
} point_3D M; diem_2_chieu Y;
struct point_3D M; point_3D N; ten_bat_ki Z;
typedef struct point_3D point_3D; Chú ý:
point_3D N; point_2D, diem_2_chieu, ten_bat_ki là
các tên cấu trúc, không phải tên biến
369 370
369 370
371 372
93
Chương 6: Cấu trúc Chương 6: Cấu trúc
6.3 Xử lý dữ liệu cấu trúc 6.3 Xử lý dữ liệu cấu trúc
Ví dụ Ví dụ
#include <stdio.h>
Bài toán: Xây dựng một cấu trúc biểu diễn
void main(){
struct{ điểm trong không gian 2 chiều.
char Ten[20]; – Nhập giá trị cho một biến kiểu cấu trúc này
struct Date{ – Hiển thị giá trị các trường dữ liệu của biến này
int day;
ra màn hình.
int month;
int year; Thực hiện:
} NS; – Cấu trúc gồm: tên điểm, tọa độ x, tọa độ y
} SV = {"Tran Anh", 20,12, 1990 };
– Nhập, hiển thị từng trường của biến cấu trúc
printf(" Sinh vien %s (%d/%d/%d)", như các biến dữ liệu khác
SV.Ten,SV.NS.day,SV.NS.month,SV.NS.year);
}
373 374
373 374
375 376
94
Chương 6: Cấu trúc Chương 6: Cấu trúc
6.3 Xử lý dữ liệu cấu trúc 6.3 Xử lý dữ liệu cấu trúc
Ví dụ Ví dụ
#include<stdio.h> b=a; //Gán biến cấu trúc
typedef struct{ strcpy(c.hoten,a.hoten); //Gán từng trường
char hoten[20]; c.diem=a.diem;
int diem; printf(“Bien a: ");
}sinhvien; printf("%-20s%3d\n",a.hoten,a.diem);
void main(){ printf(“Bien b: ");
sinhvien a,b,c; printf("%-20s%3d\n",b.hoten,b.diem);
printf("Nhap thong tin sinh vien\n"); printf(“Bien c: ");
printf("Ho ten: ");gets(a.hoten); printf("%-20s%3d\n",c.hoten,c.diem);
printf("Diem:");scanf("%d",&a.diem); }
377 378
377 378
379 380
95
Chương 6: Cấu trúc
6.4 Một số ví dụ Ví dụ 1
Một số ví dụ #include <stdio.h>
1. Nhập vào 2 số phức và đưa ra tổng và tích của chúng typedef struct {float re, im;} Complex;
void main(){
2. Nhập vào một danh sách (<100) sinh viên gồm họ tên, năm
Complex R, R1, R2;
sinh. Kết thúc nhập khi gặp SV có tên là rỗng
printf("Phan thuc & phan ao cho so thu nhat :");
• Đưa danh sách vừa nhập ra màn hình. scanf("%f%f",&R1.re,&R1.im);
• Đưa ra màn hình sinh viên lớn tuổi nhất printf("Phan thuc & phan ao cho so thu hai :");
3. Nhập danh sách có N (N < 100, nhập từ bàn phím) thí sinh scanf("%f%f",&R2.re,&R2.im);
gồm họ tên, số báo danh, khoa dự thi và điểm thi R.re = R1.re+R2.re; R.im = R1.im+R2.im; //phép cộng số ảo
• Đưa ra DSSV đã sắp xếp theo kết quả thi printf("(%.1f+%.1fi)+(%.1f+%.1fi)=(%.1f+%.1fi)\n",
R1.re,R1.im,R2.re,R2.im,R.re,R.im);
• Đưa ra danh sách sinh viên dự thi khoa CNTT có điểm
R.re = R1.re*R2.re - R1.im*R2.im; //nhân số ảo
thi từ 22.5 trở lên
R.im = R1.re*R2.im + R1.im*R2.re;
• Nhập vào một số báo danh và in ra họ tên, điểm thi và printf("(%.1f+%.1fi)*(%.1f+%.1fi)=(%.1f+%.1fi)\n",
khoa đăng ký của thí sinh nếu tìm thấy. Nếu không tìm R1.re,R1.im,R2.re,R2.im,R.re,R.im);
thấy thí sinh thì đưa ra thông báo « không tìm thấy »
}
381 382
381 382
Ví dụ 2 Ví dụ 2
1. #include <stdio.h> for(nfor(i =0;
=0;i<100;
n<100;i++){
n++){ 19. //In danh sach sinh vien
2. #include <string.h> printf("Nhap du lieu cho sinh vien %d: \n", n+1);
i+1);
20. printf("\n\n");
3. typedef struct{ printf("Ho ten : "); fflush(stdin); gets(SV[n].Ten);
gets(SV.Ten);
4. char Ten[30]; if (strlen(SV[n].Ten)
(strlen(SV.Ten) ==0) ==0)
break;
break; 21. printf(" HO & TEN NAM SINH\n");
5. int NS; printf("Nam sinh :");scanf("%d", &SV[n].NS);
&SV.NS); 22. for(i=0; i < n;i++)
6. }SinhVien; } DS[n] = SV; n = n + 1;
} 23. printf("%-3d%-30s %6d\n",i+1,DS[i].Ten,DS[i].NS);
7. void main(){
8. SinhVien DS[100], SV; 24. printf("\n\n");
9. int n=0,i; 25. //Tim sinh vien lon tuoi nhat
10. do{
11. fflush(stdin); 26. SV = DS[0];
12. printf("Nhap du lieu cho sinh vien %d: \n", n+1); 27. for(i=0; i < n;i++)
13. printf("Ho ten : "); gets(SV.Ten); 28. if(DS[i].NS < SV.NS)
14. if (strlen(SV.Ten) >0) {
15. printf("Nam sinh :");scanf("%d", &SV.NS);
29. SV = DS[i];
16. DS[n] = SV; n = n + 1; 30. printf("Sinh vien: %s sinh nam: %d lon tuoi nhat",SV.Ten,SV.NS);
17. } 31. }//main
18. } while (strlen(SV.Ten) > 0);
383 384
383 384
96
Ví dụ 2→Kết quả thực hiện Ví dụ 3 (1/5): Khai báo cần thiết
1. #include <stdio.h>
2. #include <string.h>
3. typedef struct{
4. int SBD;
5. char Ten[30];
6. char Khoa[10];
7. float Diem;
8. }ThiSinh;
9. void main(){
10. ThiSinh DS[100], SV;
11. int N, i, j, d=0, SBD;
12. char Ch; //Sử dụng trong thực hiện tìm kiếm nhiều lần
385 386
385 386
Ví dụ 3 (2/5): Nhập dữ liệu từ bàn phím Ví dụ 3 (3/5): Danh sách sắp xếp theo điểm thi
13. printf("Nhap so thi sinh : "); scanf("%d",&N); 26. for(i=0; i < N - 1; i ++) //Sắp xếp DS theo điểm thi
14. for ( i=0; i < N; i++ ){ 27. for(j=i+1; j < N; j ++)
15. printf("Nhap du lieu cho thi sinh %d: \n", i+1); 28. if(DS[i].Diem > DS[j].Diem) {
16. printf("So bao danh : "); scanf("%d",&DS[i].SBD); 29. SV=DS[i];
17. printf("Ho ten : "); 30. DS[i]=DS[j];
18. fflush(stdin); gets(DS[i].Ten); 31. DS[j]=SV;
19. printf("Khoa dang ky : "); 32. }
20. fflush(stdin); gets(DS[i].Khoa); 33. printf("\n\n KET QUA THI \n\n");
21. printf("Ket qua thi : ");scanf("%f", &DS[i].Diem); 34. for(i=0; i < N; i ++)
22. printf("\n"); C scanf: floating point format not linked
35. printf("%-3d BKA- %-6d %-24s %-6s %-6.1f\n",
23. }//for ++d, DS[i].SBD, DS[i].Ten, DS[i].Khoa, DS[i].Diem);
24. printf("\n\nNhan phim bat ky de xem ket qua thi..."); 36. printf("\n\nNhan phim bat ky de xem DSSV khoa CNTT");
25. fflush(stdin); getch(); 37. fflush(stdin); getch();
387 388
387 388
97
Ví dụ 3 (4/5): Danh sách trúng tuyển khoa CNTT Ví dụ 3 (5/5): Tìm kiếm sinh viên
//Dua ra danh sach du thi khoa CNTT 45. do{
38. d = 0; 46. printf("\nNhap so bao danh can tim : "); scanf("%d",&SBD);
47. for(i=0; i < N; i++)
39. printf("\n\nDanh sach thi sinh trung tuyen khoa CNTT\n\n");
48. if(DS[i].SBD == SBD){
40. for(i=0; i < N; i ++) 49. printf("So bao danh : %d \n",SBD);
41. if(strcmp(DS[i].Khoa,"CNTT")==0 && DS[i].Diem >=22.5) 50. printf("Ho ten : %s \n",DS[i].Ten);
42. printf("%-3d BKA%-6d %-24s %-f\n", 51. printf("Khoa du thi : %s \n", DS[i].Khoa);
52. printf("So bao danh : %.1f \n",DS[i].Diem);
++d,DS[i].SBD,DS[i].Ten,DS[i].Diem);
53. break;
43. printf("\n\nNhan phim bat ky de bat dau tim kiem theo so bao danh"); 54. }
55. if (i == N)
44. fflush(stdin); getch();
56. printf("So bao danh %d khong ton tai\n",SBD);
57. printf("\nCo tiep tuc tim kiem nua khong (C/K) :");
58. }while(toupper(getche())!='K');
59. }//main
389 390
389 390
391 392
391 392
98
Chương 6: Cấu trúc
Ví dụ 3→Kết quả thực hiện 6.4 Một số ví dụ
Bài tập
1. Lập trình đọc vào một danh sách không quá 100
sinh viên gồm: Họ tên, năm sinh
1. Đưa ra DS những sinh viên sinh năm 1990
2. Nhập tên sinh viên, cho biết năm sinh nếu tìm thấy
3. Đưa ra DSSV đã sắp xếp theo thứ tự ABC của họ và tên
2. Lập trình đọc vào DS thí sinh gồm Họ tên, điểm thi
3 môn Toán, Lý,Hóa, kết thúc nhập khi gặp sinh
viên có tên rỗng
1. Đọc tiếp vào một điểm chuẩn; đưa ra danh sách thí sinh
trúng tuyển (không có điểm liệt - 0)
2. Đưa ra thí sinh có kết quả thi cao nhất
3. Tìm điểm chuẩn, nếu chỉ lấy K SV, K nhập vào. Nếu có
393
nhiều người bằng điểm nhau; loại cả 394
393 394
395 396
99
Chương 6: Cấu trúc
Bài tập 1 (tiếp) 6.3 Xử lý dư liệu cấu trúc
397 398
397 398
399 400
100
Bài tập 2 (3/5) Bài tập 2 (4/5)
//In ra danh sách vừa nhập
//Tìm điểm của thủ khoa, bỏ qua tường hợp điểm liệt
printf("\n\n DANH SACH SINH VIEN\n\n");
TK = DS[0];
printf(" Ten SV Toan Ly Hoa Tong \n");
for(i = 1; i < N; i ++)
for(i = 0; i < N; i ++)
if(DS[i].DT.S > TK.DT.S)
printf("%-20s%5d%5d%5d%6d\n",DS[i].Ten,
DS[i].DT.T,DS[i].DT.L,DS[i].DT.H,DS[i].DT.S); TK = DS[i];
//Đưa ra danh sách thí sinh có điểm bằng điểm cao nhât
//In danh sách trúng tuyển theo điểm chuẩn
for(i = 0; i < N; i ++)
printf("\n\nDiem Chuan : ");scanf("%f",&C);
if(DS[i].DT.S == TK.DT.S)
printf("\n\n DANH SACH SINH VIEN TRUNG TUYEN \n\n");
for(i = 0; i < N; i ++) printf("\n\n THU KHOA: %s \n\n",TK.Ten);
if( (DS[i].DT.S >= C)&&(DS[i].DT.T*DS[i].DT.L*DS[i].DT.H>0))
printf("%s\n",DS[i].Ten);
401 402
401 402
403 404
101
Chương 6: Cấu trúc Chương 6: Cấu trúc
Bài tập Câu hỏi
405 406
407 408
102
Chương 7: Hàm
Chương 7: Hàm
7.1 Khái niệm hàm
409 410
Chương 7: Hàm
Chương 7: Hàm
7.1 Khái niệm hàm
411 412
103
Chương 7: Hàm Chương 7: Hàm
7.2 Khai báo và sử dụng hàm 7.2 Khai báo và sử dụng hàm
Thân hàm
} [<Các khai báo cục bộ>]
void main(){ [<Các câu lệnh>]
int i;
}
Gọi chương for (i=1; i< 20; i+=2)
trình con ra printf("%4d\n", bp(i));
thực hiên printf("\n");
}
413 414
413 414
415 416
104
Chương 7: Hàm Chương 7: Hàm
7.2 Khai báo và sử dụng hàm 7.2 Khai báo và sử dụng hàm
Dòng đầu hàm→Khai báo các tham số hình thức Dòng đầu hàm→Khai báo các tham số hình thức
• Khai báo các thông tin cần cho hoạt động • Các tham số cung cấp cho hàm trong quá
của hàm và các thông tin, kết quả tính toán trình thực hiện hàm là tham số thực sự
được hàm trả lại. – Kiểu dữ liệu của tham số thực phải giống kiểu dữ
– Tham số chứa dữ liệu vào cung cấp cho hàm liệu của tham số hình thức tương ứng với tham
– Tham số chứa dữ liệu ra mà hàm tính toán được. số thực sự đó,.
• Các tham số sử dụng trong khai báo hàm là • Một hàm có thể có một, nhiều hoặc không có
tham số hình thức. tham số nào cả
– Nguyên tắc khai báo tham số hình thức như – Nếu có nhiều tham số, phải được phân cách với
giống như khai báo một biến nhau bằng dấu phẩy.
kiểu_dữ_liệu_của_tham_số tên_của_tham_số – không có tham số vẫn phải có cặp dấu ngoặc
đơn sau tên hàm
417 418
417 418
Dòng đầu hàm→Kiểu dữ liệu trả về Dòng đầu hàm→Kiểu dữ liệu trả về
• Thông thường hàm sau khi được thực hiện • Trong C, kiểu dữ liệu trả về của hàm có thể
sẽ trả về một giá trị kết quả tính toán nào đó. là kiểu dữ liệu bất kì (kiểu dữ liệu có sẵn
• Để sử dụng được giá trị đó cần phải biết nó hoặc kiểu dữ liệu do người dùng tự định
thuộc kiểu dữ liệu gì. nghĩa) nhưng không được là kiểu dữ liệu
– Kiểu dữ liệu của đối tượng tính toán được hàm mảng.
trả về được gọi là kiểu dữ liệu trả về của hàm. • Nếu kiểu dữ liệu trả về là kiểu void thì hàm
không trả về giá trị nào cả.
• Nếu không khai báo kiểu dữ liệu trả về thì
chương trình dịch của C sẽ ngầm hiểu rằng
kiểu dữ liệu trả về của hàm là kiểu int.
419 420
419 420
105
Chương 7: Hàm Chương 7: Hàm
7.2 Khai báo và sử dụng hàm 7.2 Khai báo và sử dụng hàm
• Danh sách các câu lệnh Khi gặp lệnh return biểu_thức
• Thường có ít nhất một lệnh return • Tính toán giá trị của biểu_thức,
Họat động của hàm • Lấy kết quả tính toán được làm giá trị trả về cho
lời gọi hàm
• Thực hiện lần lượt các lệnh cho đến khi
– Thực hiện xong tất cả các câu lệnh có trong • Kết thúc việc thực hiện hàm, trở về chương trình
đã gọi nó.
thân hàm
– Gặp lệnh return Nếu return không có phần biểu_thức,
• Cú pháp chung – Kết thúc thực hiện hàm mà không trả về giá trị
return [biểu_thức]; nào cả.
• Dùng khi hàm được khai báo có kiểu trả về là void
421 422
421 422
Sử dụng hàm Ví dụ: Cho biết kết quả thực hiện chương trình
423 424
106
Chương 7: Hàm Chương 7: Hàm
7.2 Khai báo và sử dụng hàm 7.2 Khai báo và sử dụng hàm
Ví dụ: Cho biết kết quả thực hiện chương trình Ví dụ 1: Tính TBC f(a),f(b), f(c) nếu f(x) = f ( x) = x5 + 5 x
#include<stdio.h> fun(5) #include <stdio.h>
#include <math.h>
int fun(int n){
5 * fun(4) float f(float x){
if(n==0) return 1; if(x==0.0)
4 * fun(3) return 0;
else return n*fun(n-1);
else
} 3 * fun(2)
return pow(x,5)+x/fabs(x) * pow(fabs(x), 0.2);
}
int main(){ 2 * fun(1) void main(){
printf("%d\n", fun(5)); float a, b, c;
1 * fun(0) printf("So 3 so thuc : "); scanf("%f%f%f",&a,&b,&c);
return 0;
} 120 1
printf("Ket qua %f \n",(f(a)+f(b)+f(c))/3);
425 } 426
425 426
Ví dụ 2: Tìm ƯSCLN của dãy số Giải phương trình f(x)=0 trên đoạn [a,b]
1. # include <stdio.h>
2. int uscln(int a, int b) {
1. #include <stdio.h> Giải phương trình x3-x-1=0
3. while (a !=b){ 2. #include <math.h>
y
4. if(a > b) a = a- b; 3. float f(float x){
5. else b = b - a; 4. return x*x*x-x-1; 1 2
6. }
7. return a; 5. } x
8. } 6. void main(){
9. void main(){ 7. float a =1.0, b= 2.0, c, eps = 1.0e-6;
10. int A[100], N, i, r;
11. printf("So phan tu : "); scanf("%d",&N); 8. do{
12. for(i=0; i < N; i++){ 9. c =(a+b)/2;
13. printf("A[%d] = ",i+1); scanf("%d",&A[i]); 10. if( f(a) * f(c) < 0) b = c;
14. }
15. r = A[0]; 11. else a = c;
16. for(i = 1; i < N; i++) 12. }while(fabs(b-a) > eps);
17. r = uscln(r,A[i]); 13. printf("Nghiem la : %.6f",(b+a)/2);
18. printf("Ket qua %d \n",r);
19. } 427
14.} 428
427 428
107
Chương 7: Hàm Chương 7: Hàm
7.2 Khai báo và sử dụng hàm 7.2 Khai báo và sử dụng hàm
VD Đọc tọa độ 3 điểm A,B,C và đưa ra d/tích ABC… VD Đọc tọa độ 3 điểm A,B,C và đưa ra d/tích ABC…
429 430
431 432
108
Chương 7: Hàm
Bài tập 3 Nội dung chính
Cho hàm f(x) được định nghĩa như sau 1. Khái niệm hàm
3
4− 𝑥2 +1 Khi |x| < 2 • Khái niệm chương trình con
𝑓 𝑥 = 7 𝐾ℎ𝑖 |𝑥| = 2 • Phân loại: hàm và thủ tục
3 +1
𝑒𝑥 + log 5 𝑥 2 − 1 𝐾ℎ𝑖 |𝑥| > 2 2. Khai báo và sử dụng hàm
Hãy viết chương trình thực hiện các công việc sau • Khai báo và sử dụng
• Viết chương trình con tính hàm trên 3. Phạm vi của biến
• Nhập từ bàn phím N số thực và tìm và đưa ra màn hình giá
trị lớn nhất của hàm f(x) tại N số đã nhập. • Toàn cục và địa phương
• Nhập vào từ bàn phím một dãy các số thực cho tới khi nhập • Biến static, biến register
đủ 100 số hoặc cho tới khi gặp một giá trị x thỏa mãn f(x) lớn 4. Truyền tham số
hơn giá trị lớn nhất trong câu trên.
• Truyền theo giá trị, truyền theo địa chỉ
433 434
433 434
435 436
109
Chương 7: Hàm Chương 7: Hàm
7.3 Phạm vi của biến 7.3 Phạm vi của biến
437 438
Ví dụ Biến register
439 440
110
Chương 7: Hàm
Chương 7: Hàm
7.4 Truyền tham sô
441 442
Truyền theo giá trị và truyền theo biến Truyền theo biến
• Truyền theo trị • Thực chất là truyền theo địa chỉ của biến
– Dựa trên nguyên tắc truyền những bản sao của • Khi khai báo hàm [tham số có kiểu “địa chỉ”]:
biến được truyền
– Khai báo là một con trỏ, trỏ tới một đối tượng có
– Những câu lệnh thay đổi giá trị tham số hình
kiểu muốn truyền vào
thức sẽ không ảnh hưởng tới biến được truyền
– Ví dụ: void swap (int *pa, int *pb);
• Truyền theo biến
– Tham số được truyền sẽ thực sự là biến và các • Khi truyền tham số
thao tác sẽ thi hành trực tiếp với biến – Địa chỉ của biến được truyền
– Những câu lệnh thay đổi giá trị tham số hình Ví dụ: swap(&a,&b)
thức sẽ ảnh hưởng tới biến được truyền
– Có thể truyền tên của mảng
• Tên mảng là hằng địa chỉ
443 444
443 444
111
Chương 7: Hàm
7.4 Truyền tham sô Ví dụ 2: Nhập danh sách các xâu cho tới khi gặp xâu rỗng
Ví dụ 1: Truyền theo địa chỉ của biến Đưa ra xâu có tần xuất xuất hiện nguyên âm lớn nhất
# include <stdio.h>
# include <conio.h>
void swap(int * pa, int * pb) {
int x = *pa;
*pa = *pb;
*pb = x;
return;
}
void main(){
int a = 5, b = 100;
printf("Truoc: a=%d, b=%d \n\n",a,b);
swap(&a,&b);
printf("Sau : a=%d, b=%d\n\n",a,b);
return;
}
445 446
445 446
Câu hỏi 1: Kết quả đưa ra màn hình Câu hỏi 2: Kết quả đưa ra màn hình
#include<stdio.h> a 0210 #include<stdio.h> a 5, 2
void fun(int n){ b 0102 void fun(int *i, int *j){ b 2, 5
if(n > 0) { c 1120 *i = *i * *i; c 10, 4
fun(--n); *j = *j * *j;
d 0120 d 4, 25
printf("%d ", n); }
e 0201 e 25, 4
fun(--n);
int main(){
}
int i=5, j=2;
}
int main(){ fun(&i, &j);
fun(3); printf("%d, %d", i, j);
return 0; return 0;
} }
447 448
447 448
112
Phần 3: Lập trình C
Chương 6: Cấu trúc
6.3 Xử lý dư liệu cấu trúc
Câu hỏi 3: Kết quả đưa ra màn hình Nội dung chính
“”””””””””””””””””"
#include<stdio.h> a AB • Chương 1: Tổng quan về ngôn ngữ C
void fun(char*); b AC • Chương 2: Kiểu dữ liệu và biểu thức trong C
int main(){ c BC
char a[10]="ABCDEF"; • Chương 3: Vào ra dữ liệu
d BD
fun(&a[0]);
e CD • Chương 4: Cấu trúc điều khiển
return 0;
} • Chương 5: Mảng, con trỏ và xâu ký tự
void fun(char *a){
• Chương 6: Cấu trúc
printf("%c", *++a);
a++; • Chương 7: Hàm
printf("%c", *a); • Chương 8: Tệp dữ liệu
} 449 450
449 450
451 452
113
Chương 8: Tệp dữ liệu Chương 8: Tệp dữ liệu
8.1 Tệp và phân loại tệp 8.1 Tệp và phân loại tệp
453 454
455 456
114
Chương 8: Tệp dữ liệu Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp 8.2 Thao tác với tệp
• Đóng tệp
457 458
457 458
459 460
115
Chương 8: Tệp dữ liệu Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp 8.2 Thao tác với tệp
Truy nhập tệp văn bản Truy nhập tệp nhị phân
• Tương tự như với bàn phím/ màn hình Đọc dữ liệu
• Yêu cầu chỉ rõ nguồn/đích thông tin
int fread(void * Địa_Chỉ_Đích, int Kích_thước,
• Các thao tác
int số_phần_tử, FILE *fptr)
– Đọc dữ liệu từ tệp : fscanf() / fgets() /getc()
– Đọc từ file xác đinh bởi biến fptr một khối dữ liệu
– Ghi dữ liệu ra tệp : fprintf() / fputs() /putc()
kích thước Số_Phần_Tử x Kích_Thước vào
– Dịch chuyển con trỏ tệp : fseek() / rewind()
vùng nhớ xác định bởi Địa_Chỉ_Đích
– Kiểm tra kết thúc tệp : feof()
– Nếu đọc thành công: Trả về số phần tử đọc được
• Ví dụ:
– fprintf(FILE *fptr, Xâu_định dạng [,DS giá trị]) – Nếu không thành công: Trả về giá trị 0
– fgets(char * Xâu ký tự, int n, FILE *fptr) • Ví dụ: int Buf[100]; FILE * fptr =fopen(“so.dat”,”rb”)
fread( Buf, sizeof(int), 100, fptr);
461 462
461 462
Truy nhập tệp nhị phân Truy nhập tệp nhị phân
463 464
116
Chương 8: Tệp dữ liệu Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp 8.2 Thao tác với tệp
Ví dụ 1 Ví dụ 2
• Tạo file Songuyen.dat ghi 100 số lẻ đầu tiên. • Đọc file Songuyen.dat, đưa ra màn hình các
số lẻ từ vị trí số thứ 50 của file
#include <stdio.h> #include <stdio.h>
void main(){ void main(){
FILE * f = fopen(“SoNguyen.Dat”,”wb”); FILE * f = fopen("SoNguyen.Dat","rb");
int i, n; int n;
for(i = 0; i <100; i++){ fseek(f,50*sizeof(int),SEEK_SET);
n = 2*i+1; while(!feof(f)){
fwrite(&n, sizeof(int), 1, f); fread(&n,sizeof(int),1,f);
} printf("%4d",n);
fclose(f); }
} fclose(f);
465 } 466
465 466
Ví dụ 3 Ví dụ 4
• Nhập vào từ bàn phím 100 số thực và ghi file nhị phân • Nhập danh sách từ bàn phím các thí sinh dự thi, mỗi thí
SO_DUONG.DAT các số thực dương trong các số đã nhập sinh gồm họ tên, số báo danh, khoa dự thi và điểm thi. Dữ
• Đọc từ file SO_DUONG.DAT và đưa ra màn hình số thực liệu nhập được ghi vào file ThiSinh.dat. Kết thúc nhập khi
có giá trị lớn nhất gặp một thí sinh có tên là « *** »
• Đọc từ file ThiSinh.Dat, đưa ra màn hình danh sách các thí
sinh thi vào ngành CNTT có điểm thi lớn hớn 21 theo quy
cách
STT Số Báo Danh Ho Tên Điểm Thi
• Từ file ThiSinh.Dat, tạo file CNTT.Dat chỉ chứa danh sách
các thí inh thi vào khoa CNTT
• Nhập vào một số báo danh, tìm trong file ThiSinh.Dat và in
ra họ tên, điểm thi và khoa đăng ký của thí sinh nếu tìm
thấy. Nếu không tìm thấy thí sinh thì đưa ra thông báo
467 « không tìm thấy » 468
467 468
117
Chương 8: Tệp dữ liệu Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp 8.2 Thao tác với tệp
Ví dụ 4 Ví dụ 4
#include <stdio.h> //Nhap thong tin cho file ThiSinh.Dat
#include <string.h> f1 = fopen("ThiSinh.Dat","wb");
typedef struct{ i = 1;
char Ten[30]; do{
long SBD; printf("Thi sinh %d :\n", i);
char Khoa[10]; printf(" Ho Ten : "); fflush(stdin); gets(SV.Ten);
float Diem;
if(strcmp(SV.Ten,"***")==0)break;
}SinhVien;
printf(" So Bao Danh: "); scanf("%d",&SV.SBD);
void main(){ printf(" Khoa : "); fflush(stdin); gets(SV.Khoa);
FILE * f1,* f2; printf(" Diem : "); scanf("%f",&SV.Diem);
SinhVien SV;
fwrite(&SV,sizeof(SinhVien),1,f1);
int i, SBD;
//Nhap thong tin cho file ThiSinh.Dat i++;
//Tao file CNTT.Dat }while(1);
} 469 fclose(f1); 470
469 470
Ví dụ 4 Ví dụ 3
printf("\n\n DANH SACH BAN DAU \n"); printf("\n\n Tao file CNTT.Dat\n");
f1 = fopen("ThiSinh.Dat","rb"); i = 0;
i = 0; rewind(f1);
while(fread(&SV,sizeof(SinhVien),1,f1) > 0) f2 = fopen("CNTT.Dat","wb");
printf("%-3d %-5d %-20s %-20s %-5.1f\n", while(fread(&SV,sizeof(SinhVien),1,f1) > 0)
++i,SV.SBD, SV.Ten, SV.Khoa, SV.Diem); if(strcmp(SV.Khoa,"CNTT")==0 )
printf("\n\n Thi Sinh thi CNTT tren 21.0\n"); fwrite(&SV,sizeof(SinhVien),1,f2);
i = 0; fclose(f2);
rewind(f1); f2 = fopen("CNTT.Dat","rb"); //doc lai file
while(fread(&SV,sizeof(SinhVien),1,f1) > 0) while(fread(&SV,sizeof(SinhVien),1,f2) > 0)
if(strcmp(SV.Khoa,"CNTT")==0 && SV.Diem > 21.0) printf("%-3d %-5d %-20s %-5.1f\n",
printf("%-3d %-5d %-20s %-5.1f\n",++i,SV.SBD, ++i, SV.SBD, SV.Ten, SV.Diem);
SV.Ten, SV.Diem); fclose(f2);
471 472
471 472
118
Chương 8: Tệp dữ liệu
8.2 Thao tác với tệp
Ví dụ 3
printf("\n\nTim Sinh Vien\n");
printf(" So Bao Danh ");scanf("%d",&SBD);
rewind(f1);
while(fread(&SV,sizeof(SinhVien),1,f1))
if(SV.SBD==SBD){
printf("Tim thay sinh vien %s",SV.Ten);
break;
}
if(feof(f1)) printf("Khong thay ");
fclose(f1)
473
473
119